<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی کلهر</title>
        <link>https://virgool.io/feed/@mkal1375</link>
        <description>علاقه‌مند نرم افزار</description>
        <language>fa</language>
        <pubDate>2026-06-07 10:38:00</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/501/avatar/Muk9f8.png?height=120&amp;width=120</url>
            <title>مهدی کلهر</title>
            <link>https://virgool.io/@mkal1375</link>
        </image>

                    <item>
                <title>بخواب، بدون مشکل. یا چطور خواب نامنظم به ما آسیب می‌زند؟</title>
                <link>https://virgool.io/@mkal1375/%D8%A8%D8%AE%D9%88%D8%A7%D8%A8-%D8%A8%D8%AF%D9%88%D9%86-%D9%85%D8%B4%DA%A9%D9%84-%DB%8C%D8%A7-%DA%86%D8%B7%D9%88%D8%B1-%D8%AE%D9%88%D8%A7%D8%A8-%D9%86%D8%A7%D9%85%D9%86%D8%B8%D9%85-%D8%A8%D9%87-%D9%85%D8%A7-%D8%A2%D8%B3%DB%8C%D8%A8-%D9%85%DB%8C-%D8%B2%D9%86%D8%AF-b39y8ysvj6vh</link>
                <description>Photo by Hutomo Abrianto on Unsplashسحرخیز باشید یا جغد شب بیدار، بدن شما ریتم روزانه‌ای را انجام می‌دهد. هورمون‌ها، فشار خون، سطح آگاهی و چندین و چند تابع زیستی دیگر را طی یک الگو تکرار شونده کنترل می‌کند. تقریبا همانند همه گیاهان و حیوانات دیگر این فعالیت در دوره‌های ۲۴ ساعت انجام می‌شود. اختلال در این &quot;ساعت زیستی&quot; می‌تواند منجر به بیماری های قلبی عروقی و دیابتی شود. والدین محروم از خواب و کارگران شیفت شب می‌توانند به این موضوع اقرار کنند که به هم خوردن ساعت زیستی می‌تواند حس و حال شما را کاملا بد کند.سوال اینجاست که چطور این اتفاق رخ می‌دهد؟ روانشناس و عصب شناس، دکتر دیوید ولش از دانشگاه کالیفرنیا در حال کار کردن بر روی این موضوع است.ولش و تیمش می‌خواهند بدانند مغز موش های افسرده و ناامید می‌تواند ساعت زیستی بدن را به درستی مدیریت کند؟! موش‌ مورد آزمایش با دریافت شوک های رندم و غیرقابل پیش بینی به نوعی «درماندگی آموخته‌شده» دچار می‌شود. حیوانات دچار این عارضه در برابر شوک های ناگهانی عکس العملی درستی نشان نمی‌دهد چون قبلا توان مقابله با آن را نداشته‌اند. سپس مغز موش را مورد بررسی قرار دادند و متوجه شدند که اگر موش دچار «درماندگی آموخته‌شده» باشد ساعت زیستی مغزش نامنظم می‌شود.تحقیقات ولش نشان داد افسردگی  می‌تواند عملکرد ساعت زیستی را مختل کند، اما او و تیمش می‌خواستند بداند که اختلال در ساعت زیستی می‌تواند منجر به افسردگی شود؟!برای این کار آن‌ها موش‌هایی را مورد مطالعه قرار دادند که توانایی تولید پروتئین مورد نیاز برای ساعت زیستی را نداشتند. ولش می‌گوید: «این موش ها افسرده تر بنظر می‌رسیدند» حتی این موش ها مانند انسان های افسرده اضافه وزن هم پیدا کرده بودند.تحقیقات ولش به ما کمک می‌کند که نهایتا بتوانیم اختلالات خلق و خوی را در انسان ها را درمان کنیم و از آنها جلوگیری کنیم.  ولش می‌گوید افرادی که ساعت زیستی ضعیف‌تری دارند احتمال دچار شدنشان به اختلالات شبانه روزی بیشتر است، حالا اگر همین افراد دچار جت‌لگ یا شیفت کاری شب شوند احتمال بروز مشکلات افزایش پیدا می‌کند.می‌دانیم که ضربات روحی می‌تواند منجر به تاثیرات زیادی زیستی زیادی در حیوانات شود و عملکرد نامناسب ساعت زیستی می‌تواند در افرادی با این مشکلات منجر به بیماری های ذهنی و فیزیکی شود.یاسمین سیسه محقق دانشگاه اوهایو چیزی عجیب تر را مشاهده کرده است: فردی با ساعت زیستی نامنظم می‌تواند مشکلات سلامتی‌اش را به فرزندان خود نیز منتقل کند.سیسه همستر‌ها سیبری را مورد مطالعه قرار داد و شب‌ها آن‌ها را در معرض نور کمی قرار داد. همسترها شب‌زی هستند پس نور مزاحمتی برای خواب آن‌ها ایجاد نمی‌کرد، اما ساعت زیستی آن‌ها را دچار مشکل کرد. بعد از ۸ هفته انجام آزمایش، سیسه آن‌ها را با جنس مخالفشان جفت کرد و برای تولید مثل آماده کرد. در یک ‌سوم موارد هر دو والد در معرض آزمایش بودند، در یک‌ سوم یکی از آنها و در یک سوم پایانی هیچکدامشان در معرض آزمایش ۸ هفته‌ای قرار نگرفته بودند. همسترها تولید مثل کردند و فرزندانشان بزرگ شدند.نتایج حیرت‌آور بود. فرزندان مادرانی که تحت آزمایش بودند تعداد بیشتری دچار علائم مانند افسردگی می‌شدند. فرزندانی که مادر یا پدرشان در معرض این آزمایش بودند سیستم ایمنی ضعیف‌تری در قیاس با بقیه داشتند.مقدار نور آزمایش شده بسیار کم بود. سیسه می‌گوید: «ما نوری شبیه به وقتی یک چراغ در یک متری صورتتان باشد را مورد استفاده قرار دادیم.» اما بنظر می‌رسد همین مقدار کم هم عواقب بزرگی برای همستر‌ها و فرزندانشان داشت. این یافته ها می‌تواند برای کسانی که شب‌ها به صفحه های نورانی موبایل های خود خیره می‌شود مشکل ساز باشد!سیسه می‌گوید: « مردم فکر می‌کنند که مشکلات ساعت زیستی فقط رو آنها تاثیر گذار است، این مشکلات فقط سلامت آنها را به مخاطره نمی‌اندازد بلکه می‌تواند پیامد هایی برای فرزندانشان نیز داشته باشد. ما نمی‌توانیم موبایل‌هایمان را بعد از غروب آفتاب خاموش کنیم اما یک راهکار این‌ است که بهداشت و نظم ساعت زیستی‌ را مراعات کنیم. وقتی خوابیدید و همه چیز را خاموش کردید بگذارید آن‌ها خاموش بمانند!»این یادداشت ترجمه آزادی بود از: http://www.brainfacts.org/Thinking-Sensing-and-Behaving/Sleep/2018/Sleep-Uninterrupted-072518 </description>
                <category>مهدی کلهر</category>
                <author>مهدی کلهر</author>
                <pubDate>Thu, 28 Jan 2021 20:11:43 +0330</pubDate>
            </item>
                    <item>
                <title>۴ راهکار عملی برای اینکه توسعه‌دهنده بهتری شویم.</title>
                <link>https://virgool.io/@mkal1375/%DB%B4-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D8%B9%D9%85%D9%84%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%DB%8C%D9%86%DA%A9%D9%87-%D8%AA%D9%88%D8%B3%D8%B9%D9%87%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%B4%D9%88%DB%8C%D9%85-pnap1ak7y0qg</link>
                <description>تفاوت میان سطوح مختلف توسعه‌دهنده نرم‌افزار ناملموس است. از هر خبره ای در زمینه نرم‌افزار بپرسید «تفاوت یک تازه‌کار، جونیور و سینیور در چیست؟» جواب های بسیار متفاوتی خواهید گرفت.وقتی این حجم از تفاوت عقیده وجود دارد، صرف وقت برای پیداکردن مسیر رستگاری و روش رسیدن به سطح سنیور کار بیهوده ایست و نتیجه درستی نخواهد داشت!بجای این بگذارید چند کار که تاثیر زیاد در پیشرفت شما به عنوان یک توسعه دهنده دارد را بررسی کنیم:۱. یک پروژه خفن بسازید.ماشین حساب با ری‌اکت؟ تمرین جالبی است اما یک پروژه واقعی نیست! برنامه Todo؟ جذاب و کاربردی است ولی یک پروژه واقعی نیست. همه بلدند طی یک دوره آموزشی مقداری کپی/پیست کنند... ما درباره چیز دیگری صحبت می‌کنیم.چیزی که view ها، endpoint ها و functionality بسیار بیشتری داشته باشد، این چیزی است که تفاوت و خلاقیت توسعه دهنده های مختلف را نشان می‌دهد.حتما می‌پرسید پس یک پروژه واقعی و مهم (خفن) چیست؟تیندر برای سگ هایک شبکه اجتماعی عروسک های مینیاتوری برای عشاق پوکمون هایک ساختار توسعه (framework) بک‌اند یا فرانت‌اند که برای بقیه قابل استفاده باشد.( نه برای اینکه با فریم‌ورک های دیگر رقابت کنید برای اینکه یاد بگیرید آنها چطور کار می‌کنند و چطور نوشته می‌شوند.)یک پکیج برای زبانی که از آن استفاده می‌کنید. (پکیجی که در پروژه های مختلف خودتان از آن استفاده می‌کنید.)این‌ها چند مثال باحال بودند اما نکته این است، پروژه بزرگی درباره چیزی که خیلی نسبت به آن شوق و ذوق دارید بسازید یا چیزی بسازید که کاملا سطح دانش شما را افزایش دهد. به هر حال هر کدام از آنها سطح شما را بالاتر می‌برند چون شما در حال درک مفاهیم مهم و جدید هستید.۲. در جامعه متن‌باز مشارکت کنید.پروژه یا پکیج متن‌باز خود را بسازید یا در مخازن موجود مشارکت کنید.پکیج خود را بسازید.اگر می‌خواهید پکیج خود را توسعه دهید، مطمئن شوید که از روی یک دوره آموزشی اینکار را نمی‌کنید و از طرفی چیزی بسازید که بدرد دیگر توسعه دهنده های بخورد.حتما فرآیند خود را مستند کنید، خیلی خوب است اگر یک پست بلاگ یا یک مجموعه ویدیو درباره اینکه چرا / چگونه این پکیج را توسعه دادید بسازید.این کار نه‌ تنها اجازه می‌دهد از قصه خوبی برای محصول خود بسازید و دیدگاه های جدیدی بدست آورید، بلکه یک نمایش از توانایی شماست و راهنمای خوبی برای هزاران نفری است که مانند شما می‌خواهند این مسیر را طی کنند.در مخازن افراد دیگربه احتمال زیاد پکیچ های مورد علاقه شما (در هر زبانی که استفاده می‌کنید) روی گیت‌هاب موجود است، و به احتمال بسیار بالا تعداد زیادی issue روی هر کدام پیدا خواهید کرد.خط‌مشی مشارکت در مخزن را بررسی کنید و به درک درستی از آن برسید بعد به دنبال حل یکی از issue ها بروید. حتی بهتر است که ویژگی های جدید که بنظرتان مفید است اضافه کنید.این‌ کار نتایج خوبی را در پی دارد:نشان می‌دهد شما می‌توانید از خط‌مشی ها کد زنی را پیروی کنید. (من یک کارمند خوب‌ام?)مدرکی از مشارکت شما در جامعه متن‌باز است و نام شما در مخزنی به عنوان مشارکت کننده وجود دارد.شما در مورد forking، pull requests و commit ها بصورت عمیق‌تر و عملی یاد می‌گیرید.می‌بینید که یک مخزن در جامعه برنامه نویسی چطور طراحی و توسعه پیدا می‌کند و راهکار های کدنویسی بهتر را یاد می‌گیرید.۳. کد حرفه ای ها را بررسی کنید.این یکی از سریع‌ترین راهکار های پیشرفت به عنوان یک توسعه‌دهنده است. چون از ابتدا کدی را مورد بررسی قرار می‌دهید که از سطح فنی شما بالاتر است.سعی کنید درکش کنید، آنرا با کد های خود مقایسه کنید و الگو هایی که برای بهبود در کد های خود بیابید؛ از روش هایی که بنظر برای استفاده از پروژه های خودتان بدرد می‌خورد یادداشت بردارید.اگر در یک شرکت کار نمی‌کنید شاید اینکار سخت بنظر بیاید اما همیشه دسترسی به پروژه های متن‌باز در جامعه توسعه‌دهندگان موردعلاقه خود خواهید داشت.اگر توسعه دهنده ای که کدش را می‌خوانید برای پاسخ به پرسش های شما راغب باشد که عالیست. به آنها بگویید «می‌خواهم بدانم حرفه ای ها چطور کد می‌زنند!؟» و درخواست کنید که چند سوال از چیزهایی که برایتان مبهم هستند بپرسید. خیلی از توسعه دهندگان از این خوشحال هم می‌شوند.۴. برای درک بهتر الگو های طراحی و بهترین راهکار ها وقت بگذارید*.(*) ـ design pattern ، best practises و principles را جستجو کنید.ـ SOLID, KISS,YAGNI,MVC را بررسی کنید، لیست بلند بالایی از این مخفف های عجیب موجود هستند که می‌توانید نگاهی به هر کدام بیاندازید (لیست مذکور) مفاهیم هر کدام را بخوانید و برای مثال هایش گوگل کنید، مثال ها را جدی بگیرید با خواندن آنها متوجه می‌شوید که چطور پیاده سازی می‌شوند این کمک می‌کند که بهتر متوجه الگو شوید. سعی کنید درک کنید که هر الگو برای حل چه مشکلی پا به میدان گذاشته است و موارد استفاده هر کدام چیست. در این حوزه کتاب های معروفی هستند مانند «گنگ‌آف‌فور»شاید ابتدای کار کمی عجیب و غریب بنظر بیاییند ولی نگران نباشید حرفه ای ها هم همه الگو ها را از بر نیستند. در آینده با مراجعه مجدد و مرور سریع آنها می‌توانید خاستگاهشان را درک کنید و مورد استفاده قرار دهید.شما چطور فکر می‌کنید؟لطفا راهکار هایی که استفاده کردید را در کامنت ها به اشتراک بگذارید تا همه از آن بهره مند شوند. قطعا افرادی هایی هستند که راهکار های دیگری استفاده کردند و احتمال دارد راه خیلی خوبی برای بقیه باشد.دلیل اصلی این پست وبلاگ برای پیدا کردن این راهکار های جدید و کمک به یکدیگر در مسیر پیشرفت است.اگر این پست را برای دیگران مفید می‌دانید از اشتراک گذاری آن دریغ نکنید :)این یادداشت ترجمه آزادی بود از: https://dev.to/skill_pathway/4-ways-you-can-level-up-as-a-developer-17ol </description>
                <category>مهدی کلهر</category>
                <author>مهدی کلهر</author>
                <pubDate>Tue, 30 Jul 2019 13:13:48 +0430</pubDate>
            </item>
                    <item>
                <title>چطور در دیزاین بد نباشیم، یک راهنمای ۵ دقیقه ای برای غیرطراحان</title>
                <link>https://virgool.io/mediumPersian/%DA%86%D8%B7%D9%88%D8%B1-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D8%A8%D8%AF-%D9%86%D8%A8%D8%A7%D8%B4%DB%8C%D9%85-%DB%8C%DA%A9-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%DB%B5-%D8%AF%D9%82%DB%8C%D9%82%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%BA%DB%8C%D8%B1%D8%B7%D8%B1%D8%A7%D8%AD%D8%A7%D9%86-y5612wdf14dk</link>
                <description>هر کسی می‌تواند اصول طراحیِ خوب را یاد بگیرد. این راهنمای به شما دانش پایه ای در طراحی عملیاتی خواهد داد که از امروز می‌توانید آنرا اجرایی کنید.(یا در طرح های دوستانتان تغییری ایجاد کنید.)اگر احساس می‌کنید نمی‌توانید طراحی را یاد بگیرید، نظر شما را به سخنی از Dave Grohl کارگردان و موسیقی‌دان مشهور آمریکایی در باب یادگیری چیز های جدید جلب می‌کنم: من هیچوقت برای درام زدن و گیتار زدن دوره ای نگذراندم، بلکه به نحوی خودم آنرا یاد گرفتم. فکر می‌کنم با مشتاق بودن نسبت به یک موضوع با تمرکز و حرکت در مسیر آن، هر کاری که باشد از پس آن بر می‌آیید.خب پس خودتون رو آماده کنید که این ۱۰ نکته کاربردی در طراحی رو به خاطر بسپارید:۱. از کنتراست زیاد استفاده کنیدرنگ پس زمینه و فونت باید به اندازه کافی متفاوت باشند تا موجب خستگی چشم نشوند. معمولا نوشته های سیاه روی پس زمینه سفید بهتر خوانده می‌شود. از خاکستری کمرنگ، مایه رنگی زرد و سبز استفاده نکنید. به هر حال اگر برای خواندن به زحمت افتادید احتمالا مشکلی با رنگ ها دارید!از: https://developer.apple.com/design/tips/۲. خاکستری تیره از مشکی خالص بهتر خوانده می‌شوداگر امکانش را داشتید برای متون از رنگ 333333# (51, 51 , 51) RBG بجای مشکی خالص استفاده کنید.مشکی خالص روی پس زمینه سفید چشم را اذیت می‌کند و تمرکز روی حروف را سخت می‌کند.۳. محتوای مهم را اول بیاورید برای کاربری بهتر در رابطه با استفاده اصلی محصول خود محتوای اصلی را ابتدا قرار دهید تا به وضوح قابل مشاهده و استفاده باشد. محتوای مهم باید بدون زوم کردن، اسکرول کردن و یا کلیک(تپ) کردن قابل مشاهده باشد.از: https://developer.apple.com/design/tips/بگذارید برای جا افتادن موضوع چند نمونه خوب از ترتیب بصری خوب در واقعیت را مثال بزنیم:اینستاگرام تمرکز اصلی را روی پست های ارسالی کاربران قرار داده است.پینترست با قراردادن سرچ باکس در بالا و  شبکه بندی موضوعات در ادامه آن یک ترتیب بصری ساخته است. پینترست به قرار گیری سرچ باکس در این نقطه تاکید خاصی دارد. جستجو عملکرد اصلی اپلیکیشن است، افراد برای جستجو و مرور تصاویر بر اساس موضوعات به این اپلیکیشن می‌آیند و نیاز اصلی آنها جستجو است.راست پینترست / چپ اینستاگراماسپاتیفای ت آرت ورک آلبوم یا ترک را ابتدا و سپس آیکون های کنترلی را می‌آورد؛ حتی در بین آیکون ها اجرا و توقف اندازه بزرگتری نسبت به بقیه دارند.فیسبوک همانند اینستاگرام وزنه اصلی را روی پستی که دوست شما ارسال کرده قرار می‌دهد.راست فیسبوک / چپ اسپاتیفای۴. همه چیز را تراز کنیداولین کار برای اینکه یک طراحی بد و فاجعه را درست کنید این است که مطمئن شوید همه چیز را درست تراز کرده باشید. وقتی طراح ها اصرار به استفاده از شبکه بندی دارند برای جلوگیری از عدم ترازبندی صحیح بین المان هاست.درست کردن ترازبندی یکی از راحت ترین بهبود هایی است که می‌توان طراحی هر اپ یا وبسایتی را یکباره ۱۰ برابر بهتر کرد.From: https://developer.apple.com/design/tips/یک نمونه آموزشی این‌بار از مدیوم:این یک اسکرین شات از سایت مدیوم است. بنظر شما ظاهر آن چگونه است؟ چه حسی نسبت به آن دارید؟در سمت چپ فواصل سفید موجود باعث به هم خوردن ترازبندی صحیح شده است؛ در سمت راست من آنها را با یکسان کردن فواصل سر و سامان دادم!ترازبندی بد سمت چپ و ترازبندی صحیح سمت راست۵. اندازه متون و فاصله خطوطما برای مورچه ها طراحی نمی‌کنیم!افزودن فونت خواندن محتوا را آسان تر خواهد کرد و خواندن خطوط وقتی با فاصله های مناسب از هم قرار گرفته اند راحت تر است. https://developer.apple.com/design/tips/ : از https://developer.apple.com/design/tips/ :از  ۶. برای نمایش نتایج از لیست استفاده کنید(اگر ترتیب آنها اهمیت دارد)اغلب اپ های وب و موبایل به نحوی عملکرد جستجو دارند. اگر ترتیب نمایش اهمیت دارد نمایش لیستی معمولا مناسب است. ولی وقتی ترتیب تفاوتی ندارد و می‌خواهید افراد به گشت و گذار در بخش های مختلف سوق دهید ساختار شبکه ای مفید است (مثل پینترست)از: http://usabilitynews.org/how-do-users-view-search-results-presented-in-a-grid-layout/۷. اول سیاه سفید طراحی کنید و بعد رنگ ها را بیافزاییدطراحی سیاه سفید تمام تمرکز شما را روی طراحی تجربه اصلی اپ شما متمرکز می‌کند. رنگ ها احساسات ما را تحت تاثیر قرار می‌دهند و اغلب باعث از بین رفتن تمرکز از مشکلات اصلی طراحی می‌شوند.۸. طرحی با کاربری راحت داشته باشیدکشیدگی دست یک مشکل واقعی است، تصویر را که از مقاله عالی طراحی واکنش‌گرا: بهینه سازی برای دسترسی سراسری در دیوایش لمسی را در نظر بگیرید:این مقاله بر اساس آسانی دسترسی صفحه را بخش بندی می‌کند. بسیاری از اپلیکیشن های خوب منو های ناوبری (navigation) را در پایین صفحه و بخش مشخص شده در نظر می‌گیرند.۹. از پالت رنگ آماده استفاده کنیدرنگ شناسی یک جور هنر سخت و تخصصی است. من به شدت به شما توصیه می‌کنم که به دریبل بروید و به دنبال &quot;color palettes&quot; ها بگردید یا از پالت ساز مثل Coolors یا Color Claim استفاده کنید.وقت خود را برای بحث های بی‌پایان و حدس زدن رنگ مناسب هدر ندهید!۱۰. از قرارداد های طراحی گوگل و اپل استفاده کنیداپل و گوگل منابع بی نظیری برای هر کسی که برنامه های ios یا android می‌سازد فرآهم کرده اند.برای مثال the Google Material spec اصول، منابع، رنگ ها، آیکون ها و کامپوننت هایی برای شروع سریع طراحی اپ شما تهیه کرده است.و اپل در Apple has the HIG — their Human Interface Guidelines, تمام چیزی که برای طراحی یک اپ ios نیاز دارید را جمع آوری کرده است.به یاد داشته باشید: طراحی نیاز به تمرین دارد!عادت کردن چشم برای تشخیص یک ایراد در طراحی نیاز به تمرین و زمان دارد، اما شما با استفاده از نکات بالا می‌توانید هر چه تا به امروز طراحی کرده اید را کمی بهبود بدهید. پس نمونه های مختلف را ببنید به اصول رعایت شده در آنها دقت کنید و با تکرار و تکرار به بهتر شدن مهارت خود کمک کنید.نظر شما چیست؟ شما چه نکاتی را در این زمینه کشف کردید؟ با اشتراک گذاری نظرات خود در کامنت ها به یکدیگر کمک می‌کنیم  :)این یادداشت ترجمه آزادی بود از: https://medium.com/startup-grind/how-to-not-suck-at-design-a-5-minute-guide-for-the-non-designer-291efac43037 </description>
                <category>مهدی کلهر</category>
                <author>مهدی کلهر</author>
                <pubDate>Fri, 28 Sep 2018 02:04:32 +0330</pubDate>
            </item>
                    <item>
                <title>اصول طراحی RESTful API / بهترین راهکار ها</title>
                <link>https://virgool.io/mediumPersian/%D8%A7%D8%B5%D9%88%D9%84-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-restful-api-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D9%87%D8%A7-w0bomkq1fipt</link>
                <description>فیسبوک، گوگل، گیتهاب، نتفلیکس و چندین غول دیگر تکنولوژی ،‌ شانس استفاده از اطلاعاتشان را از طریق API ها به دولوپرها و برنامه های شخص ثالث داده اند.حتی اگر شما برای بقیه دولوپر ها و نرم افزار ها API ارائه نمی‌دهید، برای برنامه شما خیلی مفیدتر است که API تمیز و زیبایی طراحی کنید.نحوه درست طراحی یک API یک جر و بحث قدیمی در فضای وب است، و یکی از بزرگترین آنهاست، چون هیچ دستورالعمل رسمی ای برای آن وجود ندارد.ـ API رابطی است که دولوپر های زیادی از طریق آن به تبادل داده ها میپردازند. یک API خوب همیشه کاربری ساده ای دارد و زندگی دولوپر ها را راحت‌تر می‌کند. API یک محیط گرافیکی (GUI) برای دولوپر هاست،‌ اگر گیج کننده باشد آنها دنبال یک جایگزین برای  آن خواهند گشت و دیگر از آن استفاده نمی‌کند. تجربه دولوپری (Developers’ experience) یکی از مهمترین معیار ها برای اندازه گیری کیفیت طراحی API شماست.ـ API مثل یک اجرا روی استیجه و کاربران API حضار تو سالنن.۱. ترمینولوژیاینها از مهمترین اصطلاح (term) های حوزه REST API هستند:ـ Resource یک شی یا نمایش از چیزیست (مدل) که به دیتاهای دیگر مرتبط است و شامل متد هایی است که روی آن کار هایی انجام میدهند. مثلا حیوانات، مدارس و کارمندان resource هستند و حذف، افزودن و ویرایش کردن افعالی که میتواند روی آنها انجام شود.ـ Collection ها مجموعه ای از resource ها هستند: کمپانی مجموعی از منابع کمپانی است (مثل کارمندان، مشاوران و ... )ـ URL یا Uniform Resource Locator مسیری هستند که میتوانند مکان Resource ها را تعیین کنند و بعضی افعال را روی آنها پیاده کنند.۲. ـ API endpointبگذارید برای درک بهتر موضوع چند API برای یک کمپانی با کارمندانش بنویسیم:برای دریافت لیست همه کارمندان getAllEmployee/ و برای بعضی از کار های معمول دیگر هم لیست زیر را‌ پیاده سازی کرده‌ایم: /addNewEmployee/updateEmployee /deleteEmployee/deleteAllEmployees/promoteEmployee/promoteAllEmployeesو تعداد زیادی endpoint دیگر برای انجام کار های مختلف باید پیاده کنیم، که همه آنها شامل ویژگی های منحصر بفرد زیادی هستند. از این رو نگهداری و تعمیر وقتی تعداد  پایانه ها (endpoint) افزایش پیدا می‌کند بسیار سخت خواهد بود.مشکل کجاست؟url طبق تعریف (Uniform Resource Locator /  مشخص کننده مکان منبع) باید فقط مشخص کننده مکان یک Resource باشد نه انجام فعلی روی آن. پس وجود  و getAll . . . در URL اشتباه است.پس روش درست چیست؟آدرس companies/ مثال مناسبی از روش صحیح است که هیچ فعلی را مستقیم ذکر نکرده است.اما چگونه باید افعال را به سرور بفهمانیم؟ مثلا اینکه می‌خواهیم لیست کارمندان را دریافت کنیم؟ این کار به عهده‌  HTTP متد هاست (GET, POST, DELETE, PUT) که به آنها verb هم می‌گوییم.اسم Resource ها همواره باید بصورت جمع بکار برده شوند؛ و اگر خواستیم به یکی از آنها دسترسی داشته باشیم میتوانیم id مورد نظرمان را در URL ارسال کنیم.متد GET برای آدرس companies/ باید لیست همه کمپانی ها را بگیرد.متد GET برای آدرس 34/companies/ باید اطلاعات کمپانی با آی دی ۳۴  را بگیرد.متد DELETE برای آدرس 34/companies/ باید کمپانی با آی دی ۳۴ را حذف کند.مثال های زیر با فرض این که کارمندان زیر مجموعه ای از کمپانی ها هستند:ـ GET /companies/3/employees برای دریافت لیست همه کارکنان کمپانی ۳ـ GET /companies/3/employees/45 برای دریافت اطلاعات کارمند ۴۵ متعلق به شرکت ۳ـ DELETE /companies/3/employees/45 برای حذف کارمند ۴۵ متعلق به شرکت ۳ـ POST /companiesبرای ساخت یک کمپانی جدید و دریافت اطلاعات کمپانی ساخته شدهحالا API ما تمیز و درست حسابی شد!?نتیجه این که: آدرس ها باید شامل اسم های جمع Resource ها باشند، و HTTP متد ها فعل انجام شده روی Resource را مشخص کنند.۳. متد های HTTP ـ HTTP تعدادی متد تعریف شده دارد که مشخص می‌کنند چه فعلی روی Resource مورد نظر اعمال میشود.ـ URL یک جمله است؛ Resource ها اسم های آن و HTTP متد ها فعل های آن هستند.متد های پر استفاده تر HTTP به قرار زیر اند:متد GET اطلاعات را از Resource مورد نظر دریافت میکند. مثلا companies/3/employees/ اطلاعات مربوط به کارمندان کمپانی ۳ را برمی‌گرداند. ( این عمل نباید هیچ تاثیر جانبی دیگری بر سیستم داشته باشد.)متد POST  برای ساخت یک Resource در دیتابیس بکار میرود.(معمولا وقتی یک فرم ارسال میشود.) برای مثال companies/3/employees/ یک کارمند جدید از کمپانی ۳ ایجاد می‌کند.نکته : این متد non-idempotent است یعنی با تکرار درخواست یک Resource جدید ایجاد می‌کند.متد PUT درخواستی است که Resource را ویرایش می‌کند و در صورت عدم وجود آنرا می‌سازد. برای مثال companies/3/employees/john/ ـ john را در زیر مجموعه کارکنان کمپانی ۳ ویرایش می‌کند و در صورت عدم وجود آنرا میسازد.نکته:  این متد idempotent است یعنی با تکرار درخواست همان Resource قبلی ویرایش می‌شود.متد DELETE برای حذف Resource ای که باید از دیتابیس حذف شود بکار می‌رود. برای مثال /companies/3/employees/john/ باعث حذف  john از لیست کارمندان کمپانی ۳ می‌شود.برای اطلاع از متد های دیگر HTTP از ویکی پدیا استفاده کنید.۴۰۴ :(۴. کد های وضعیت HTTP Responseوقتی که کلاینت درخواستی از سرور می‌کند باید بتواند به راحتی از وضعیت درخواستش مطلع شود، که درخواستش موفق ،ناموفق و یا غلط بوده است. کد های وضعیت HTTP سریال هایی برای سناریو های مختلفی است که ممکن است روی دهد. سرور همیشه باید کد وضعیت درست را به کلاینت برگرداند. در ادامه به معرفی دسته های مختلف کد های وضعیت  HTTP می‌پردازیم:حالت موفق - 2XXاین دسته کد های وضعیت به معنای دریافت درخواست توسط سرور و موفقیت پردازش مورد نظر است:ـ 200 OK: کد استاندارد HTTP برای نمایش موفقیت عملیات های GET,POST ,PUTـ 201 Created: این کد وضعیت باید بعد از ایجاد شدن یک Resource بازگردانده شود. برای مثال هنگام ساخت با POSTـ 204 No Content: درخواست موفق بوده است ولی هیچ محتوایی برای پاسخ وجود نداشته است. معمولا درخواست DELETE با این کد برمی‌گردد. وقتی درخواست DELETE ارسال میشود ما به صراحت به سرور گفته ایم که یک نمونه را حذف کن و نیازی به بازگشت اطلاعات خاصی نداریم. اگر نمونه مورد نظر وجود نداشته باشد ارور کلاینت رخ داده که در حوزه 4XX قرار میگیرد.حالت ریدایرکت  - 3XXـ 304 Not Modified: نشان می‌دهد که کلاینت پاسخ را در کش خود دارد و نیازی به ارسال مجدد داده ها به کلاینت نیست.حالت کلاینت ارور - 4XXاین حالت هنگامی رخ می‌دهد که درخواستی معیوب از سمت کاربر ارسال شود:ـ 400 Bad Request: درخواست توسط سرور انجام نشده است. سرور معنای درخواست کلاینت را متوجه نمی‌شود.ـ 401 Unauthorized: کلاینت اجازه دسترسی به این Resource را ندارد و برای دسترسی باید با اعتبار مشخصی اقدام کند.ـ 403 Forbidden: درخواست درست ارسال شده و کلاینت تایید اعتبار شده است اما به دلیلی به او اجازه دسترسی به Resource داده نمی‌شود. برای مثال کاربران عضو یک وبسایت به فایل های دایرکتوری دسترسی ندارند.ـ 404 Not Found: نشان میدهد در حال حاضر منبعی برای این درخواست موجود نیست.ـ 410 Gone:  نشان میدهد مکان Resource مورد نظر جا به جا شده است.حالت سرور ارور - 5XXـ 500 Internal Server Error: درخواست درست است ولی سرور در ارائه خواسته کلاینت مشکل دارد. یعنی اروری در حین آماده سازی پاسخ در سرور ایجاد شده است.ـ 503 Service Unavailable: سرور غیر فعال است یا نمی‌تواند درخواست ها را دریافت و پردازش کند. عموما به معنای این است که سرور در حال تعمیر است.۵. قوانین نام گذاریشما می‌توانید از هر قاعده نام گذاری (naming convention) ای که می‌خواهید پیروی کنید.اما حتما این قاعده را در تمام سطح API رعایت کنید. اگر از JSON برای بدنه درخواست یا پاسخ استفاده می‌کنید سعی کنید که از Camel Case استفاده کنید. pagination۶. جستجو، مرتب سازی، فیلتر کردن و صفحه بندیهمه این کار ها با کوئری زدن روی دیتاست ها انجام پذیر اند؛ و نیازی به طراحی API مجزا ندارند. کافیست پارامتر هایی به URL خود اضافه کنیم و توسط همان متد GET آنرا درخواست دهیم. بگذارید با چند مثال قضیه را روشن تر کنیم:مرتب سازی: کلاینت می‌خواهد درخواستی برای دریافت لیست مرتب کمپانی ها ارسال کند. پایانهGET /companies باید بتواند پارامتر های مختلفی را قبول کند مثل :GET /companies?sort=rank_asc که لیست کمپانی ها را بر اساس رنکینگ بصورت صعودی برمی‌گرداند.فیلتر کردن: برای فیلتر کردن دیتاست ها میتوانیم مانند مرتب سازس عمل کنیم مثلا:GET /companies?category=banking&amp;location=india بانک هایی که در هند مستقر هستند را برمی‌گرداند.جستجو: مثلا برای جستجو بر اساس نام یک کمپانی :GET /companies?search=Digital Mckinsey که اطلاعات کمپانی دیجیتال مکنزی را برمی‌گرداند.صفحه‌بندی: وقتی دیتاست خیلی بزرگ است، آنرا به بخش های کوچک تر تبدیل میکنیم تا بازده سیستم بالاتر رود و پاسخ سریعتر ارسال شود . برای مثال: GET /companies?page=23 کمپانی های بخش ۲۳ را برمی‌گرداند.نکته: وقتی تعداد پارامتر های ارسالی بالارود و طول URL بیش از حد شود، ممکن است سرور کد 414 URI Too Long بدهد. در این موارد می‌توانید دیتای مورد نظر را در بدنه درخواست POST قرار دهید.۷. نسخه بندی (versioning)وقتی API شما در حال استفاده است، بهبود دادن آن و تغییر ساختار آن ممکن است در عملکرد نرم افزار هایی که از API شما استفاده می‌کنند مشکل ایجاد کند. این URL یک نمونه مناسب از API است: http://api.yourservice.com/v1/companies/34/employees که عدد ورژن به صراحت در URL ذکر شده است. اگر تغییر اساسی در API شما انجام شد باید ورژن جدیدی از API منتشر کنید. برای مثال  از v2 یا v1.x.x استفاده کنید.پایاناین یادداشت ترجمه آزادی بود از: https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9 در صورتی که آن را دوست داشتید از لایک و اشتراک گذاری دریغ نکنید.</description>
                <category>مهدی کلهر</category>
                <author>مهدی کلهر</author>
                <pubDate>Wed, 02 May 2018 10:35:39 +0430</pubDate>
            </item>
                    <item>
                <title>دانلود در پایتون به زبان ساده !</title>
                <link>https://virgool.io/coderlife/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%88-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%DB%8C-requests-kt6x7pmetr3h</link>
                <description>یک والپیپیر زیباسلام. مهدی ام دانشجوی مهندسی نرم افزار. در این پست میخوام به زبان ساده در مورد دانلود فایل ها از طریق پایتون بنویسم.برای اینکار راه های زیادی وجود داره. برای دانلود از طریق HTTP میتونید از دو تا کتابخونه مختلف استفاده کنید، یکی requests و اون یکی urllib. در این مقاله در مورد requests میگم و بعد روش دانلود باهاش رو باهم یاد می گیریم.پیشنیاز ها : پایتون در حد مبتدی . کار با فایل ها  / سطح آموزش : مبتدیاگه هنوز کار با فایل ها رو خوب بلد نیستید ، میتونید از این لینک استفاده کنید. کار کردن با REQUESTSریکوئست یک کتابخونه بسیار پر استفاده از پایتون و اگه با پایتون آشنا باشید احتمالا با ریکوئست هم کار کردید. از طریق این کتابخونه میتونید درخواست های HTTP1.1 ارسال کنید. برای نصب از طریق pip به روش زیر اقدام میکنیم:pip install requestsخب حالا که نصب کردیم بیاید یکم باهاش کار کنیم : اولین کار import کردن کتابخونه!import requestsکتابخونه requests میتونه درخواست های get , post , put, delete , ... رو ارسال کنه . برای دانلود ما از درخواست get استفاده میکنیم . که به شکل زیر انجام میشه:import requests 
page = requests.get(&quot;http://www.google.com&quot;)حالا درون متغیر page چیه بنظرتون؟ با تکه کد زیر  معلوم میشه که شی ای از نوع Response است.print(type(page))
 &lt;class &#039;requests.models.Response&#039;&gt;خب این شی تعدادی متد و ویژگی داره من چندتاشو می‌گم  بقیشو خودتون کشف کنید:اولی کدِ وضعیتِ درخواستِ انجام شده رو میده دومی انکدینگ صفحه ای که درخواست کردید رو بهتون میدهسومی متن محتوای پاسخ رو بر میگردونه که اینجا متن html صفحه استچهارمی هم عین سومی هست .page.status_code
// 200
page.encoding 
// &#039;ISO-8859-1&#039;
page.text
// u&#039;&lt;!doctype html&gt;&lt;html itemscope=&quot;&quot; itemtype=&quot;http://schema.org/WebPage&quot; lang=&quot;en&quot;&gt;&lt;head&gt;&lt;meta content=&quot;Search the world\&#039;s information, including webpages, images , ...
page.content
// &#039;&lt;!doctype html&gt;&lt;html itemscope=&quot;&quot; itemtype=&quot;http://schema.org/WebPage&quot; lang=&quot;en&quot;&gt;&lt;head&gt;&lt;meta content=&quot;Search the world\&#039;s information, including webpages, images,فرق مورد سوم و چهارم در نوع (type) اونهاست . text بصورت unicode و content بصورت str محتوا میده ولی بهتره (در پایتون ۳) از content استفاده کنید .برای کسب اطلاعات بهتر و کاملتر به مستندات این کتابخونه مراجعه کنید. بریم سراغ اصل بحث!خب حالا حاضریم برای دانلود فایل ، تو مثال زیر یه عکس (عکس اصلی پست ) رو با کتابخونه requests دانلود میکنیم  :import requests
url = &quot;https://files.virgool.io/upload/users/501/posts/kt6x7pmetr3h/ntsy0szydk5z.jpeg&quot;
data = requests.get(url).content
with open(&quot;file.jpeg&quot;,&quot;wb&quot;) as f:
    f.write(data)در توضیح کد بالا باید بگم که :برای عدم مشکل در انواع کاراکتر ها (اگه فایلتون متنی باشه ) حتما از content استفاده کنید و از text استفاده نکنید. با استفاده از ساختار with و open میتونیم فایل رو به نحوی باز کنیم که بعد از اتمام کار فایل بسته بشه و نیاز به بستن دستی نداشته باشه.مُد استفاده شده &quot; wb &quot; به معنی اینه که فایل رو برای نوشتن به صورت باینری باز کردیم.برای دانلود هر نوع فایلی (pdf , mp3,mp4, ...) کافیه هنگام باز کردن فایل ، فایل با پسوند مناسب باز کنید.ممنون از اینکه خوندی . اگه با من کار داشتید از این لینک یا ایمیل من اقدام کنید .</description>
                <category>مهدی کلهر</category>
                <author>مهدی کلهر</author>
                <pubDate>Wed, 17 Jan 2018 18:54:50 +0330</pubDate>
            </item>
            </channel>
</rss>