<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mosihere</title>
        <link>https://virgool.io/feed/@mostafakhoshhal</link>
        <description>برنامه نویس، علاقه مند به اوپن سورس، شبکه و مفاهیم مشابه :)</description>
        <language>fa</language>
        <pubDate>2026-06-16 09:28:04</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/113493/avatar/G1g8pI.png?height=120&amp;width=120</url>
            <title>Mosihere</title>
            <link>https://virgool.io/@mostafakhoshhal</link>
        </image>

                    <item>
                <title>Django Tutorial جنگو</title>
                <link>https://virgool.io/@mostafakhoshhal/django-tutorial-szrvrsdglhti</link>
                <description>سلام بچه ها امیدوارم خوب باشین.تصمیم گرفتم راجع به جنگو یه آموزش tutorial گونه داشته باشیم بعدش بریم سراغ Django Rest Framework یا همون به اختصار DRF تا مبحث API رو ادامه بدیم و در واقع Restful رو آموزش بدیم.اما اینجا فعلا با جنگو آشنا میشیم بعدشم تو یه مطلب دیگه میریم سراغ ORM جنگو.Frame Work vs Libraryدرواقع تفاوتی که Frame Work با Library داره اینه:لایبرری ها معمولا خیلی کوچیکتر از فریم ورک هستن مثل requests, selenium, pandas و ...لایبرری معمولا برای این بوجود اومده که بتونیم باهاش یه مشکل خاص رو حل کنیماز اونطرف Frame Work یه ابزاری هست برای توسعه سیستم ها و برنامه ها و حتی ممکنه در یک فرم ورک چندین کتابخونه وجود داشته باشهWhat is Djangoجنگو یه Frame Work پایتونی هستش که میشه ازش به عنوان back-end پروژه که فرضا یه وبسایت هستش، استفاده کرد.گرچه جنگو میتونه درون خودش front-end هم جا بده ولی معمولا اینروزا اینکارو نمیکنن و بیشتر به عنوان API از DRF استفاده میکنند.خب حالا اصلا چرا از Frame Work ای مثل Django استفاده میکنیم ؟!خودمون نمیتونیم با پایتون انجامش بدیم ؟خب قطعا این سوال بجایی هست و از قضا شدنی هم هست! ولی مسئله اینه، چرا باید دوباره چرخ رو اختراع کنیم ؟Don&#x27;t Reinvent the Wheel!بعد هم اینکه یچیزی مثل Django تمام کارهای مورد نیاز مارو از قبل تو خودش داره فقط ما ازش استفاده میکنیم :)و خب مشخصا خیلی حرفه ای تر، ایمن تر از چیزی هست که ما بخوایم از صفر بنویسیم و بسازیم.فرضا برای مبحث وب، اینکه Request چجوری میاد، Response چجوری میره و هندل کردن اینا به ما مستقیما مربوط نیست، چون خود جنگو اینکار هارو میکنهحتی بصورت پیشفرض وب سرور لوکال هم داره و پنل ادمینتک تک اینا میتونه مسائل وقت گیر و پر دردسری باشه برامون اگه بخوایم از صفر بنویسیم :)نکته مهم اینه جنگو کلا با مفهوم OOP زیاد سر و کار داره و باید با شئی گرایی آشنا باشیدInstallation and creation django projectاول باید با pip که پکیج منیجر پایتون هستش، django رو نصب کنیدpython -m pip install djangoبعدش باید یک پروژه بسازیم با جنگو :)django-admin startproject movie_site .یه دایرکتوری به اسم movie_site براتون ساخته شده الان جایی که هستیدو همینطور یک فایل به اسم manage.pyمن بعد هرکاری که میتونستیم با  کامند django-admin بکنیم رو با python manage.py انجام میدیممثل اجرا کردن سرور(runserver)، ساخت فایل تغییرات دیتابیس (makemigrations)، اعمال تغییرات روی دیتابیس(migrate)، ساخت سوپریوزر(createsuperuse) و ...محتویات دایرکتوری movie_site هم بدین شکل هست:movie_site (directory)__init__.pyasgi.pywsgi.pyurls.pysettings.pyماژول اول برای اینه که پایتون بفهمه این دایرکتوری یک Package هستدو ماژول بعدی یعنی wsgi و asgi برای deployment هست که فعلا بهش کاری نداریمماژول چهارم یعنی urls.py برای مشخص کردن url های پروژه ما هستو آخریش settings.py  برای تنظیمات پروژه هستش.Django Architectureمعماری جنگو MVT هستش مثل همون MVC معروف، منتهی با مقداری تغییراتM --&gt; ModelV --&gt; ViewT --&gt; TemplateModelمدل تو جنگو در واقع برای ساخت table های دیتابیس و مشخص کردن field ها و ویژگی هاشون هست!یعنی همون دیتا بیس sql ای جنگو :)فرضا میخوایم یک table ای داشته باشیم که اسمش movie یعنی فیلم هست و توش یکسری اطلاعات راجع به فیلم ها ذخیره کنیمتو جنگو برای اینکار باید تو models.py این رو به عنوان یک entity یا object یا همون class تعریف کنیم.خیلی خلاصه و مفید:برای سیو کردن و خوانش دیتا هستViewاین ماژولم برای هندل کردن http request ها هستشدرخواست هایی که به وب سرور ما فرستاده میشه از طریق urlاینکه چه متدی داره http request و بر اساس اون چه فانکشنی رو اجرا کنه و ...پ.ن: اگر با http/ http methods آشنا نیستید میتونید اینجا درباره ش مطالعه کنیدTemplateاین بخش در واقع نحوه نمایش اطلاعات به کاربر هستش.یعنی فایل html توش استفاده میشه و با django web template engine که jinja هستش میتونیم با یه سینتکس خاصی بهش data رو بدیم به صورت dynamic به کاربر بده.خب این توضیحات ابتدایی بود برای شناخت بهتر معماری پروژه های جنگوCreating First Appحالا باید به این اشاره کنیم که ما یه پروژه ساختیم ولی همه کد رو توی اون نباید بنویسیمبر اساس نیاز و شناخت یکسری موارد که تو این پست نمیگنجه، باید برای هر بخش از برنامه، یک app بسازیممثلا اینجا ما نیاز داریم یه app به اسم movies بسازیم.اینشکلی:python manage.py startapp moviesالان یه دایرکتوری جدید داریم به اسم moviesاگه یه نگاهی بهش بنداریم میبینیم که شامل این ماژول ها هستش:movies (directory)__init__.pyapps.pymodels.pyviews.pyadmin.pytests.pyو یک دایرکتوری به اسم migrationsاین مایگریشن برای اینه که ما هروقت تغییراتی توی مدل هامون میدیم، یه کامندی بعدش میزنیم که این هست:python manage.py makemigrationsو این باعث میشه یک اصطلاحا snap shot از تغییرات دیتابیسیمون به زبان پایتونی ساخته بشه و برای هر app ای داخل migrations ذخیره بشه که بعدا وقتی میخوایم تغییرات رو واضحا روی دیتابیس اعمال کنیم، تغییرات و یا تعاریف جدید، ساخت table, field ازینجا خونده و اعمال میشه‌ (در اصل به کد sql ای تبدیل میشه)راجع به اولی __init__ که قبلا گفتیم، دومی یعنی apps برای کانفیگ کردن هر app جنگو استفاده میشه و هر app ای که بسازیم دقیقا همه این ماژول هارو داره.با models و views هم که آشنا شدیماما admin چیه ؟ برای اینه که کنترل کنیم دیتا و اطلاعات با چه ظاهری و چجوری تو پنل ادمین نمایان بشه.و آخری هم یعنی tests برای نوشتن تست های برنامه ما هستش.Lets do itخب اولین کاری باید بعد ساختن هر app جنگو بکنیم، این هستش که بریم توی settings.py پروژه و اسم app خودمون رو داخل INSTALLED_APPS اضافه کنیم.این باعث میشه جنگو بفهمه این app ساخته شده و باید ازش استفاده کنه :)installed_appsحالا یه دید کلی داشته باشیم که اصلا میخوایم چیکار کنیم و روند کار چجوریه !۱- یوزر به یک url ای میره۲- یک http request از طرف یوزر به url فرستاده میشه۳- این url باید به یک view function ای متصل شده باشه تا بتونه این request رو پاس بده به اون فانکشن خاص۴- اون فانکشن خاص حالا request رو گرفته و میتونه ببینه چی هست اصلا۵- معمولا اینجا view function ما باید یک صحبتی با database داشته باشه یعنی مدل هامیاد یه کوئری میزنه به دیتابیس که مثلا لیست تمامی فیلم هارو بده به من۶- در آخر هم با render کردن یک فایل html ای اطلاعات رو به کاربر نشون میدهHow Django Worksخب پس الان ما نیاز داریم یک چیزی داشته باشیم که بتونیم فیلم هارو توش ذخیره کنیم، ازش بخونیم و ...بریم یه مدل بسازیم به اسم Moviewe just keep it simple :)Creating Modelتو ماژول models.py این کد رو مینویسیم:movie modelیه entity ساختیم که در واقع تبدیل میشه به یک table توی دیتابیس نهایتا و سه تا field داره به اسمnameکه اسم فیلم هست، ۲۵۵ کاراکتر نهایتا میتونه باشهpublish_yearسال ساخت فیلم هست که میتونه ۴ رقم باشه نهایتا (۲۰۲۰)has_watchedیه مقدار بولین میگیره که بصورت پیشفرض false هست که یعنی فیلم دیده نشده.حالا باید یه مایگرشین بسازیم از تغییرات دیتابیسیمونpython manage.py makemigrationsحالا باید تغییرات رو اعمال کنیم تا واقعا این table توی دیتا بیس ساخته بشه + کلی table دیگه که خود جنگو اتوماتیک میسازه مثل table برای users و ...python manage.py migrateخب الان دیگه این تیبل ساخته شده تو دیتابیسمون :)حالا نیاز داریم چندتا فیلم داشته باشیم که باهاش بتونیم کار کنیم، دیلیت کنیم یا ادیت کنیم یا اصلا نشونش بدیم و ...تو ترمینال باید این کامند رو بزنیم تا به شل جنگو بریمpython manage.py shellیه instance از Movie میسازیم و attribute هاش رو پر میکنیم به این شکل:خودتونم مثل همین ۲-۳ تا دیگه آبجکت فیلم بسازید :) Create Moviesاگه دقت کرده باشید وقتی میخوایم Object جدیدمون که firstmovie هست رو ببینیم فقط میگه Movie Object و یک عدد که ID اون آبجکت هستبرای اینکه بتونیم اسم فیلم رو ببینیم باید متد __str__ کلاس Movie رو override کنیمoverride __str__ methodخب دوباره باید پایتون شل ران کنیم تا ببینیم درست شده ؟Get movieدرست شده :)حالا نیاز داریم یه url ای داشته باشیم که وقتی یورز میره اونجا یه view فانکشنی trigger بشه و همه فیلم هارو از دیتابیس بگیره و آماده کنه.اول بیاید view رو بنویسیم :)Creating View Functionviewتوضیحات:یه فانکشن تعریف کردیم به اسم movie_listیه متغیر داریم به اسم queryset که با جنگو ORM تمامی آبجکت های فیلم هارو گرفتیممتغیری از جنس dictionary داریم به اسم context که مشخص کردیم movies کلیدی هست که value اون همون آبجکت فیلم ها هستش. ( ازین توی template استفاده میکنیم که جلوتر میبینیم)نهایتا هم ریترن کردیم render رو با سه  آرگومان یکیش request هست دومی فایل html ای که جلوتر میسازیمشسومی هم همون دیکشنری ما که شامل فیلم ها هست تا بتونیم تو فایل html نشونشون بدیم.حالا نیاز داریم url رو مشحص کنیم :)creating urlsاول از همه یک فایل به اسم urls.py باید بسازیم توی app جدیدمون یعنی moviesبعدش این کد بهش اضافه میشه:movie_urlsتوضیحات:اسم اپ رو مشخص کردیم که عادت خوبیه ولی اجباری نیست!متغیر urlpatterns در واقع برای خود جنگو هست و دقیقا ما طبق الگویی که باید ازش استفاده میکنیمهر آیتم ازین لیست شامل یه فانکشن path هست با ۳ آرگوماناولی route یا مسیر هستدومی reference فانکشن view ما هست و آخری اسمی براشحالا باید بریم تو urls.py پروژه اصلی یعنی movie_siteو بهش بگیم که هرکی به url ما رفت و به مسیر movies رسید، باید بقیه ش رو از urls.py  اپ movies بپرسه ببینه باید چیکار کنه :)include movie_urlsاینجا فقط خط ۲۲ رو اضافه کردیم و include هم تو خط ۱۸ import کردیم :)حالا باید template رو بسازیمتو فولدر moviesیک فولدر جدید میسازیم به اسم templatesحالا توی فولدر templates یه فولدر جدید میسازیم به اسم app خودمون که اینجا movies هست و بعد توی این یه فایل میسازیم به اسم index.htmlپس شد اینشکلی:movies        templates                  movies                        index.htmlفایل index.html باید اینجوری باشه:index.htmlتوضیحات: کار خاصی نکردیم همه ش تگ html ای هستفقط با jinja که template engine دیفالت جنگو هست، یه لوپ زدیم و iterate کردیم روی آبجکت های فیلم که تو view فانکشن با متغیر context داده بودیمش به template و الان داریم تو اینجا ازش استفاده میکنیم :)حالا بریم تست کنیم ببینیم درست کار میکنه یا چی :)تو ترمینال باید اول وب سرور رو اجرا کنیمpython manage.py runserverبصورت دیفالت وب سرور روی پورت ۸۰۰۰ اجرا میشهولی اگه میخواید عوضش کنید python manage.py runserver 8001حالا وب سرور بالا اومدهمرورگرتون رو باز کنید و برید به این آدرسhttp://127.0.0.1:8000/movies/باید این رو ببینید:خب تبریک میگم الان اولین پروژه جنگویی خودتون رو نوشتید :)بعدا میریم سراغ ORM جنگوسوالی داشتید یا پیشنهادی، ممنون میشم کامنت کنید.موفق باشید :)</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Tue, 13 Feb 2024 00:01:06 +0330</pubDate>
            </item>
                    <item>
                <title>gRPC یا Google Remote Procedure Call</title>
                <link>https://virgool.io/@mostafakhoshhal/grpc-%DB%8C%D8%A7-google-remote-procedure-call-ioepimkocl1j</link>
                <description>سلام دوستان، امیدوارم حالتون خوب باشه، گرچه با این شرایط اقتصادی، اجتماعی و ... سخته :)بگذریم؛ طبق قولی که داده بودم، میخوایم راجع به API و ترکیبش با gRPC صحبت کنیم و یکم کد بزنیم :)اول از همه اگر با مفهوم API آشنا نیستید، پیشنهاد میکنم مطلب قبلی خودم که اینجاست رو بخونید یا حداقل گوگل کنید.The Question is, What the hell is RPC ! :))خب RPC یا Remote Procedure Call یه پروتکل ارتباطی نرم افزار هست، اجازه میده یک برنامه، به صورت ریموت و اصطلاحا از راه دور، یک سرویسی رو که برای یک برنامه دیگه س، ران و اجرا کنه، بدون اینکه از جزئیات شبکه و کارکردش و ... چیزی بدونه یا اصلا نیاز باشه که بدونه.الان شاید حس کنید پیچیده شد‌، ولی ساده میشه :)اینطوری فکر کنید که یه Process رو که اصلا رو سیستم فیزیکی ما نیست، Run میکنیم از راه دور، انگار که لوکال هاست خودمونه :))به Procedure Call، چیز های دیگه هم میگن، مثل Subroutine Call یا Function Call.این پروتکل (RPC) از مدل Clinet-Server استفاده میکنه.برنامه ای که درخواست (Request) رو میده، Client هست، و برنامه ای که Service-Providing میکنه یعنی سرویس ارائه میده، سرور هستش.آر پی سی کلا بصورت دیفالت، بصورت Synchronous عمل میکنه، یعنی صبر میکنه تمام Response ها بیاد، بعدش یکجا جواب رو بده. گرچه میتونیم از Thread ها استفاده کنیم برای Asynchronous کردنش.حالا اصلا gRPC چیکار میکنه ؟همون RPC هستش فقط گوگل اینو نوشته :) جی آر پی سی language independent هست؛ یعنی میتونیم از چند زبان استفاده کنیم و مشکلی پیش نمیادفرضا ما این بخش رو با پایتون مینویسیم که جلوتر میبینید، بعدا کسی میتونه از همین میکرو سرویس، تو پروژه لاراولی (laravel) خودش استفاده کنه.قضیه اینطوریه که ما یک stub داریم، که کلا client میتونه از طریق اون، درخواست های خودش رو به server منتقل کنه. این درخواست ها میتونه شامل: درخواست اتصال، ارسال و دریافت steaming و Call کردن یه فانکشن و کنسل کردنش و ... باشه.وقتی یک RPC اتفاق میوفته، environment ای که درخواست اولیه رو داده، suspend میشه (به حالت تعلیق در میاد)، پارامتر هایی که خواسته از طریق network به environment ای میره که باید درخواست اونجا اجرا و پردازش بشه و در نهایت response برمیگرده به محیطی که درخواست اولیه رو داده بود. انگار که اصلا یه فانکشن رو خودتون تو برنامه خودتون run کردید، درحالیکه الان میدونیم اینطور نبوده!کل روند کار به این صورت هست:۱- کاربر (Client) از رابط کاربری ای که براش تعبیه شده استفاده میکنه که stub هست، ران میکنه و خب همه چیز لوکال داره اتفاق میوفته تا اینجا.۲- کلاینت استاب (Client-Stub)، درخواست رو با پارامتر هایی که بهش دادیم، Pack میکنه در قالب یک مسیجی که به این عمل میگن Marshalling.۳-حالا اطلاعات از سیستم Client به سرور ارسال میشه، جایی که باید پردازش انجام بشه و جوابی برگردونده بشه.۴- سیستم ای که نقش سرور رو داره، مسیج رو میده به Server-Stub خودش.۵- سرور استاب، اینجا مسیجی رو unpack میکنه که اصطلاحا بهش میگن unmarshalling۶- وقتی کار سرور تموم شد، باز مسیج رو برمیگردونه به استاب خودش (Server-Stub) که بازم عمل Marshalling انجام میشه و اطلاعات رو از Server-Stub میده به Transport-Layer.۷- نهایتا میرسه به Client-Stub که اونجا باز هم UnMarshalling اتفاق میوفته و پاسخ میرسه به دست کلاینی که درخواست اولیه رو داده بود.پروتوباف یا Protobuf چیست؟همونطور که میدونید، اطلاعات تو بستر وب و اینترنت به طرق مختلفی باید Serialize بشه و بعد فرستاده بشه.یه نمونه مرسوم هم JSON هست (Java Script Object Notation).ولی gRPC یه فرمت خاصی داره که ترجیح بر اینه که از همون استفاده بشه، چرا که سرعت چندین برابر از JSON و خب از بقیه فرمت ها سازگار تر هستش.اینجا میاد و چیزی به اسم Protobuf یا کامل ش Protocol Buffer رو معرفی میکنه.کاری که تو این فایل میکنیم به این صورت هست که:ساختار داده یا Data Structure ای رو مشخص میکنیم که قراره اطلاعات داشته باشند.مثلا من میخوام یک (API-KEY) از کلاینت بگیرم و در جوابش، ۲۵۰ فیلم برتر IMDB رو بهش برگردونم.اینجا که میرسیم، باید بریم و از وبسایتش چیزی که داریم روش کار میکنیم، اطلاعات جمع کنیم.مثل اینکه وقتی میخوایم پست بذاریم یا لایک کنیم، چه Endpoint ای با چه پارامتر هایی Call میشه.چه ریسپانسی برمیگرده؛ معمولا به صورت JSON برمیگرده، ولی باید ساختار JSON اش رو بشناسیم، و ببینیم چه اطلاعاتی میخوایم برگردونیم به مخاطب.بیاید این مثال رو ببینیم:الان میخوایم ۲۵۰ فیلم برتر IMDB رو بگیریم از سایت رسمی خودش.قبل از هرچیزی، برید و API-KEY خودتون رو از سایت رسمی IMDB بگیرید.ریسپانسی که برمیگرده به این شکل هست:{&quot;items&quot;:[{&quot;id&quot;:&quot;tt0111161&quot;,&quot;rank&quot;:&quot;1&quot;,&quot;title&quot;:&quot;The Shawshank Redemption&quot;,&quot;fullTitle&quot;:&quot;The Shawshank Redemption (1994)&quot;,&quot;year&quot;:&quot;1994&quot;,&quot;image&quot;:&quot;https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UX128_CR0,3,128,176_AL_.jpg&quot;,&quot;crew&quot;:&quot;Frank Darabont (dir.), Tim Robbins, Morgan Freeman&quot;,&quot;imDbRating&quot;:&quot;9.2&quot;,&quot;imDbRatingCount&quot;:&quot;2604033&quot;} .....خب الان قابل حدس هستش که برای ریسپانسی که به مخاطب باید بدیم، چه فیلد هایی باید تعریف کنیم تو فایل Proto.1- id --&gt; string2- rank --&gt; string3- title --&gt; string4- fullTitle --&gt; string5- year --&gt; string6- image --&gt; string 7- crew --&gt; string8- imDbRating --&gt; string9- imDbRatingCount --&gt; stringخب حالا نیاز داریم به کامپایلر بگیم که برای زبانی که استفاده میکنیم، یکسری کد generate کنه تا بتونیم ازش استفاده کنیم برای برنامه ای که میخوایم بنویسیم.ما از زبان Python استفاده میکنیم.اول ترجیحا یک Virtual environment بسازید، به این شکل:python3 -m venv .venvحالا اکتیوش کنید:source .venv/bin/activateیک فایل Proto بسازید:touch movie_service.protoحالا تو فایل پروتو اینارو بنویسید:syntax = &quot;proto3&quot;service TopMovies{        rpc GetTop250Movies(MovieRequest) returns (MovieArray) {}}message MovieRequest{        string api_key = 1;}message Movie{    string id  = 1;    string rank = 2;    sting title = 3;    sting fullTtitle = 4;    string year = 5;    string image = 6;    string crew = 7;    string imDbRating = 8;    string imDbRatingCount = 9;}message MovieArray{    repeated Movie movies = 1;}یک فایل به اسم main.py و یک فایل هم به اسم api.py بسازید.کل فایل ها به این شکل باید باشه الان:ProgramFolder    ├── api.py    ├── main.py    ├──  movie_service.proto  کامندی که باید بزنیم تا کد مورد نیاز generate بشه، به این صورت هست:python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. movie_service.protoخب الان اگه دقت کنید، دوتا فایل جدید پایتونی اصافه شده:ProgramFolder    ├── api.py    ├── main.py    ├── movie_service.proto    ├── movie_service_pb2_grpc.py    ├── movie_service_pb2.pyتو فایل main.py این کد هارو بنویسید:                                                                             main.py import grpcfrom api import get_top_250_moviesimport movie_service_pb2import movie_service_pb2_grpcfrom concurrent import futuresclass MovieService(movie_service_pb2_grpc.TopMoviesServicer):    def GetTop250Movies(self, request, context):        api_key = request.api_key        movies = get_top_250_movies(api_key)        return movie_service_pb2.MovieArray(movies=movies)def serve():    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))    movie_service_pb2_grpc.add_TopMoviesServicer_to_server( MovieService(), server)    server.add_insecure_port(&quot;127.0.0.1:50051&quot;)    server.start()    server.wait_for_termination()def main():    if __name__ == &quot;__main__&quot;:        print(&quot;server is up and running on port 50051:\n&quot;)        serve()main() و تو فایل api.py این کد هارو بنویسید:                                                                           api.pyimport requestsURL = &quot;https://imdb-api.com/en/API/Top250Movies/&quot;def _get(url, api_key):    response = requests.get(f&#x27;{url}{api_key}&#x27;)    response.raise_for_status()    return response.json()def get_top_250_movies(api_key):        for movie in _get(URL, api_key)[&#x27;items&#x27;]:            movie_info = {                &#x27;id&#x27; : movie.get(&#x27;id&#x27;),                &#x27;rank&#x27;: movie.get(&#x27;rank&#x27;),                &#x27;title&#x27;: movie.get(&#x27;title&#x27;),                &#x27;fullTitle&#x27;: movie.get(&#x27;fullTitle&#x27;),                &#x27;year&#x27;: movie.get(&#x27;year&#x27;),                &#x27;image&#x27;: movie.get(&#x27;image&#x27;),                &#x27;crew&#x27;: movie.get(&#x27;crew&#x27;),                &#x27;imDbRating&#x27;: movie.get(&#x27;imDbRating&#x27;),                &#x27;imDbRatingCount&#x27;: movie.get(&#x27;imDbRatingCount&#x27;),                }            data.append(movie_info)    return dataخب حالا یه توضیحی بدم راجع به این کدهایی که داریم:اول اینکه مستقیما  کاری با دوتا فایلی که خود compiler برامون generate کرده، نداریم.تو فایل api.py:صرفا داریم با ماژول Requests پایتون، یه درخواست با متد GET به سرور IMDB میفرستیم و این درخواست در اصل دقیقا به ENDPOINT ای میره که وظیفه اش، ارسال پاسخی هست که شامل ۲۵۰ فیلم برتر IMDB میشه.بعد یه فانکشن داریم به اسم get_top_250_movies:که خب یه لوپ زدیم روی request ای که میفرستیم و فیلدهایی که میخوایم رو با key-value تو یک دیکشنری در هر iterate ذخیره میکنیم و آخر هر لوپ، به یک لیست append میکنیم :)تو فایل main.py یک کلاس داریم به اسم MovieService که از کلاسی به اسم MovieServicer که همین کامپایلر برامون generate کرده، ارث بری میکنه.اگه یادتون باشه، تو فایل proto یه سرویس تعریف کردیم به اسم TopMoviesکه توش یک rpc داریم، که میاد میگه: متد GetTop250Movies با این پارامتر ران بشه و فلان چیز رو return کنه:service TopMovies{    rpc GetTop250Movies(MovieRequest) returns (MovieArray) {}}اینجا MovieRequest و MovieArray دوتا مسیجی هستن که تو فایل proto تعریف کرده بودیمو GetTop250Movies یک متدی هست که به سرویس MovieService اضافه کردیم تو فایل main.pyفانکشن serve هم دقیقا حکم سرور رو داره که کلاینت به چه IP ای و رو چه PORT ای بتونه درخواست بده و جواب رو بگیره.که برای ما رو لوکال هاست  پورت ۵۰۰۵۱ هستش. 127.0.0.1:50051خب حالا نیاز داریم که بتونیم درخواست رو بفرستیم به عنوان کلاینت، به سرور خودمون.بهتره برنامه bloomRPC رو دانلود کنید و از اون استفاده کنید.همینطور که میبینید، اول باید IP:port رو مشخص کنید.بعدش علامت + سبز رنگ بالای صفحه سمت چپ رو بزنید و فایل --&gt; movie_service.proto رو پیدا و انتخاب کنید.در فیلد api_key: ای پی آی رو که از سایت IMDB گرفتین رو بذارید.حالا میتونید bloomRPC رو run کنید.سورس کد این بخش هم میتونید تو GitHub من پیدا کنید :)امیدوارم مفید واقع بشه و اگر مشکلی، ایرادی تو کار و توضیحات دیدید، ممنون میشم باهام در میون بذارید.</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Fri, 01 Jul 2022 20:17:54 +0430</pubDate>
            </item>
                    <item>
                <title>رابط برنامه نویسی کاربردی یا  API (Application Programming Interface)</title>
                <link>https://virgool.io/CE-SHAHED-publication/%D8%B1%D8%A7%D8%A8%D8%B7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%DB%8C%D8%A7-api-application-programming-interface-po4jorrbtqp6</link>
                <description>درود دوستان امیدوارم حال دلتون خوب باشه.یه مدتی نبودم ولی با دست پر برگشتم :)یه مسئله ای که برای من سخت جا افتاد، همین API بود. گفتم شاید بتونم برای شما تفهیمش کنم که کار شما آسون بشه :)Application Programming Interfaceاول از همه سوال پیش میاد API چی هست اصلا!! جوابش رو با سوال میدم؛ شما فرض کن یه برنامه نوشتی که میخوای قیمت لحظه ای ارز یا بیتکوین رو در اختیار مخاطبین خودت بذاری. خودت میری یه برنامه مینویسی براش؟منطقا نه! خب پس میری از یه سایتی که کار اصلیش اینه و دارای API هست، اطلاعات مد نظر رو میگیری و میاری تو برنامه یا سایت خودت.خب پس تا الان تعریف API شد اینکه شما با برنامه ای که نوشتی، در اصل داری با برنامه شخص دیگری هم ارتباط میگیری(مثل همین ای پی آی بیتکوین یا ارز ها)یعنی دقیقا User میاد تو سایت شما و درخواست میده که بگید الان قیمت بیتکوین چه مقداره و شما مستقیما میری پیش اون سایت که این اطلاعات رو داره و ازش میپرسید، قیمت بیتکوین چنده‌؟جواب رو به شما میده و نهایتا شما اطلاعات رو میدید به کاربر؛ ساده ش این شد که نقش میانجی(واسطه) رو دارید.بخوایم فنی تر بگیم اتفاقی که میوفته اینه:Client:Send a &quot;GET&quot; HTTP RequestServer:&quot;Process&quot; HTTP RequestSend a Responseیعنی چی حالا! خب وقتی Client مرورگر رو بازمیکنه وارد سایت شما میشه در اصل داره یک درخواست HTTP با متد GET میفرسته به سرور شما.مثلا میگه صفحه محصولات رو میخوام، سرور(Server) این درخواست رو چک میکنه و اگر اوکی باشه در جواب چیزی که میخواد رو به عنوان پاسخ (Response) میده به مرورگر که در این مثال میشه همون صفحه محصولات.خب ولی در این شرایط ما گفتیم خودمون یه سایت داریم که میره اطلاعات مد نظر رو از یه سایت دومی میگیرهدر این صورت پیچیدگی یه مرحله بیشتره! یعنی علاوه بر درخواستی که مخاطب شما به سرور داد، شما هم باید یه درخواست بدید به سایت اصلی و اطلاعات رو بگیرید و نهایتا اطلاعات رو بدید به کاربر نهایی خودتون.بازم ساده تر بگیم:اصلا چرا از API استفاده کنیم؟الان گرسنه شدیم! میتونیم بریم از مغازه هر خرت و پرتی نیاز داریم، بخریم بیاریم خونه و شروع کنیم غذا درست کنیم! خب کار سختیه دیگه مگه نه ؟یا میتونیم بریم رستوران، که یه آشپز حرفه ای داره و هر مواد اولیه ای که نیاز هست بخریم هم، خودش داره!ولی آشپز نمیذاره بریم تو آشپزخونه و  به همه چیزش دسترسی داشته باشیم(حالا به دلایل امنیتی یا هرچیزی) مثل باب اسفنجی و آقای خرچنگ که نمیذارن دستور پخت همبرگر خرچنگی لو بره :)))اینجاست که گارسون یا پیشخدمت (Waiter/Waitress) به دادمون میرسه.بیایید فرض کنیم رفتیم یک رستوران؛ نشستیم منتظر گارسون تا بیاد و سفارش ما رو بگیرهاینجا ما مشتری هستیم یعنی دقیقا همون Client/User و مصرف کنندهآشپز دقیقا نقش سرور رو داره، درخواستی از طرف مشتری براش میاد از طریق گارسون هم به دستش میرسهگارسون API هست! چرا‌؟ چون دقیقا نقش واسطه و میانجی رو داره بین مشتری و آشپزیعنی میاد سفارش رو از ما میگیره، تحویل میده به آشپز! آشپز هم طبق درخواست مشتری، غذایی که درخواست کرده رو درست میکنه و میده به گارسون، گارسون هم میاره تحویل مشتری میده.فکر کنم ساده تر از این نمیشه گفت :)))یه مثال ملموس از ای پی آي هم اینه که تو سایت ها میخوای ثبت نام کنی، میتونی از طریق Facebook- Gmail و ... سریعا ثبت نام کنی.HTTP Request Methodبرای اینکه بتونید درک بهتری داشته باشید، نیازه که یه مقداری با پروتوکل های وب آشنا بشیدمهم ترینش همین HTTP هست! همونطور که بالاتر توضیح دادم هر کاری که میکنید به عنوان یک کسی که داره تو وب میگرده، دائما دارید درخواست های HTTP میفرستید به سایت ها.اچ تی تی پی (HTTP) چندین متد داره، پرکاربرد هاشو میگم براتون:GETPOSTPUTPATCHDELETEمتد GETخب اولی GET هست. درخواست برای گرفتن چیزی هست از اسمش هم مشخصهیعنی شما اومدی سایت ویرگول و رو این پست من کلیک کردید ( یک ریکوئست HTTP با متد  GET به سرور سایت ویرگول فرستادید )متد POSTبعدی POST هست. اینم اسمش روش هست‌؛ وقتی که شما یک پست مینویسید و انتشار میدید یا وقتی در سایتی فرمی رو پر میکنید، وقتی که گزینه ارسال، ثبت یا هرچیز مشابه رو میزنید، با متد POST درخواستی به سرور میفرستید! ولی ایندفعه اطلاعاتی از سرور نمیخواید بلکه اطلاعاتی بهش دادید تا ثبت بشه.اطلاعات اگر با متد GET ارسال بشه، در اصل تو بخش URL سایت به صورت Query-String فرستاده میشه که میتونیم واضح ببینیمش.یعنی میگیم:https://www.google.com/search?q=apiبخش بالا از علامت سوال به بعد یک کوئری استرینگ هست که با متد گت فرستاده شدهالان گفتیم گوگل جان برو بخش سرچ کردن و API رو پیدا کن برامونبرا همین وقتی اطلاعات مهمی داریم میدیم نباید از متد GET  استفاده کنیم! بجاش از POST استفاده میکنیم و اطلاعات دیگه تو URL رد و بدل نمیشه، بجاش تو بدنه HTTP Request ذخیره میشه که امن هست.متد PUTدر اصل همون POST هست، اما برای موقعی که اطلاعات وجود داره و میخواد از اول کاملا ویرایش بشهفرض کنید یک اطلاعاتی وارد کردیم در یک سایتی، حالا میخوایم عوضشون کنیممتد PATCHاین هم مثل PUT اما فرق اصلیش در اینه که برای Partial-Update استفاده میشه!یعنی دیگه نیاز نیست تمام اطلاعات وارد شده از قبل رو آپدیت کنیم، فقط میخوایم یه بخشی از اطلاعات قبلی رو عوض کنیم.متد DELETEاز اسم این مشخصه صرفا درخواستی هست برای حذف کردن اطلاعاتی که قبلا وجود داشته.انواع APIرابط های برنامه نویسی کاربردی مدل های مختلفی هم دارن مثل:SOAPRESTRPC --&gt; gRPCهرکدوم اینا میتونن یه پست مجزا باشن، پس واقعا از حوصله این بخش کارمون خارجهاحتمالا بعدتر برای هرکدوم یه پست بذارم :)ولی الان در این حد بدونید که SOAP و RPC  پروتوکل هستند ولی REST یک معماری.هرکدوم اینها روشی برای نوشتن و ساختن API هستند! قطعا هرکدوم مزیت ها و کاستی هایی دارن!وقتی با API اطلاعاتی رد و بدل میشه بین مخاطب و سرور، در یک قالب اطلاعاتی باید داده قرار بگیره دیگهاگه با JSON یا XML و  ... آشنا باشید کارمون آسون تره!معمولا SOAP برای کارهایی که امنیت حیاتیه زیاد استفاده میشه، مثل کار ها بانکیو سازگار ترین قالب جا به جایی اطلاعاتش هم (Data Interchange) ایکس ام ال (XML) هست.اصولا معماری REST پرکاربرد ترینه تو وب برای API ها. سازگار ترین (Data Interchange) هم براش JSON هست که یک دیتا استراکچر هست که از زبان برنامه نویسی جاوا اسکریپت بوجود اومده.بعدی gRPC یعنی (Google Remote Procedure Call) هست که برای ساختن API استفاده میشه و سازگارترین قالب جا به جایی اطلاعاتش (Data Interchange) براش چیزیه به اسم Protobuff یا اسم کاملش Protocol buffer.خب همینجا مبحث رو تموم میکنیمامیدوارم مفید واقع بشه براتون؛ خوشحال میشم اگه پیشنهادی داشتید بگید و سوالاتتون رو بپرسیدسعی میکنم تو پست های آتی این مباحث انواع API رو مطرح کنم و با پایتون روش عملی کار کنیم :)</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Sun, 03 Apr 2022 05:21:52 +0430</pubDate>
            </item>
                    <item>
                <title>برای هکر شدن چه باید کرد ؟</title>
                <link>https://virgool.io/@mostafakhoshhal/%D8%A8%D8%B1%D8%A7%DB%8C-%D9%87%DA%A9%D8%B1-%D8%B4%D8%AF%D9%86-%DA%86%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%DA%A9%D8%B1%D8%AF-ty8pme18wq4c</link>
                <description>سلام دوستان، تو این اوضاع امیدوارم حداقل حالتون خوب باشه ...تو یکی دو ماه اخیر درگیر یک دوره (CEH(Certified Ethical Hacker بودم، دوره جالبی بود.خیلی وسیعه و سنگین و پر از پیش نیاز ها و مطالب جدید برای یادگرفتن...دوره ای که من تمومش کردم، دوره هکر قانونمند جادی بود. خب برا این موضوع اول بریم یه تعریف خلاصه ای از هکر کنیم و تفاوتش با جوجه کرکرها(Cracker) رو نمایان کنیم :))لغت هکر‌ همونطور که میدونید خیلی قدمتش از دوره کامپیوتر بیشتره، برای مثال تو دانشگاه MIT (اگر اشتباه نکنم) اگر کسی میتونست چتر یا چیز های دیگه ای را روی سقف ورودی دانشگاه بندازه و برای مثال چتر صاف بمونه اون بالا، من بعد اون بابا هکر خطاب میشد :)تو این گیر و دار یه عده باهوش بودن و اصطلاحا گیک(Geek) رفتن کلی آزمون و خطا کردن، چیز یاد گرفتن، حوصله کردن وقت گذاشتن و شدن هکر به معنی واقعی...هکر به کسی میگن که با اطلاعات زیادش میتونه یک کار هایی بکنه که شخص دیگری نمیتونه :))خیلی ساده بود این تعریف!بهترش میشه این --&gt; شخصی که به واسطه خیلی چیز ها میتونه دسترسی پیدا کنه به دیتا و اطلاعات شما حالا به هر منظوری :) و قطعا کلی مطالب هست تو این مسیر که باید یاد گرفته بشه ...تقریبا هیچ فرمولی نیست که یک دوره ببینی و فکر کنی که: ایول هکر شدم دیگه :))نه اصلا اینطوری نیست، صرفا تو یک دوره میتونی با چهارتا ابزار آشنا بشی و شروع کنی به یادگیری خودجوش به صورت پیاپی ...خب حالا چی باید یاد بگیریم ؟سوال قشنگیه، در جوابش باید بگم همه چی :))مثال میزنم: قطعا بهتره با سیستم عاملی مثل لینوکس آشنا باشیدصد در صد باید از شبکه و مفاهیم شبکه اعم از IP , Routing, MAC و صدها مطالب دیگه سر در بیاریدباید باهوش باشید، باید بصورت مداوم یاد بگیرید و خسته نشید.دلیلش هم واضحه دیگه ! چون اینجوری نیست که شما یه مطلب بخونی تا آخرش به اون سیستم حمله کنی با همون طرفند :))یه چرخه س دیگه این ماجرا، باگ پیدا میشه هک میشه بعد امنیت اون ارگان،شرکت و ... شروع به دیباگ و ارائه راه حل و در نهایت منجر به انتشار آپدیت میشه ...خب پس اونی که باید باگ پیدا کنه یا سوراخی برای نفوذ، خود شما هستید نه کسی دیگر :)حتی جالبه بدونید هکر ها درگیر مقوله ای میشن به نام مهندسی اجتماعی ( Social Engineering )مهندسی اجتماعی چیست !اگر سریال آقای ربات ( Mr. Robot ) رو دیده باشید، باهاش آشنایید :)مهندسی اجتماعی به مجموعه کنش های شخص هکر برای دسترسی به اطلاعات شخص مورد نظر گفته میشود.ساده تر بگیم --&gt; مثلا فرد هکر میره سراغ یه سوژه و بهش یه USB هدیه میده!این USB میتونه حامل بدافزار باشه (Malware) و به همین سادگی اون شخص هکر بدون کارای عجیب غریب هالیوودی، دسترسی پیدا میکنه به سیستم قربانی...کلا شامل مباحث تکنیکال و ... نمیشه دیگه ! شخص از هوش خودش استفاده میکنه بالاخره با یک طرفندی شخص مورد نظر رو اقناع میکنه یا نه اصلا زنگ میزنه به شرکت میگه: الو، من مدیر فلان بخش هستم. یک موقعیت اضطراری پیش اومده پسوورد ایمیل من رو ریست کنید :)مسخره بود این مثال، ولی مهندسی اجتماعی کلا حول محور همین موضوعات میچرخه.Mr. Robotپ.ن:  Mr.Robot رو ببینید باحاله :)انواع هکرها:خب سه تا مدل مرسوم داریم که یه توضیح مختصری درباره شون میدم.هکر کلاه سفید ( White Hat ) --&gt; این افراد کلا خوبن :)) یعنی سواد هکری دارن و از این توانایی در جبهه مثبت استفاده میکنن! به این شکل که باگ بانتی ( Bug Bounty ) از علایقشون هست :) . فرضا با شرکتی قرار داد میبندن و باگ های اون رو پیدا و گزارش میکنن و نهایتا یه پولی میگیرن و تمام... یا اگر اتفاقی یک حفره امنیتی پیدا کنن به اون شرکت خبر میدن و اگه شرکت شعور داشته باشه، قدردانی میکنه و یه پاداشی بهش میده، اگر نداشته باشه که میگه به چه حقی ما رو تست کردی و از هکر شکایت میکنه :))هکر کلاه خاکستری ( Gray Hat ) --&gt; اینا کلا فازشون اینه که ما خیلی ابنورمالیم ( Abnormal ) و شاید خوب باشیم شاید بد باشیم :))هکر کلاه سیاه ( Black Hat ) --&gt; اینا کلا سواد هکری خودشون رو در راه بد استفاده میکنن، یعنی حمله میکنن به سایت ها یا حتی کارایی مثل خالی کردن حساب مردم، فیشینگ ( Phishing ) و ضعیفاشون هم عشق دیفیس کردن‌ ( Deface ) وب سایت هارو دارن :))Defaced Websiteپ.ن: میدونم چندتا کلاه دیگه هم هست مثل قرمز :)) ولی مسخره س و اگر دوست داشتین خودتون اینجا درباره ش بیشتر مطالعه کنید. خب نهایتا کرکر ها رو بگم ( Cracker ) این دوستان اصولا هیج سواد عمیقی از مفاهیمی مثل شبکه، برنامه نویسی و ... ندارند! تنها کاری که میکنن استفاده از ابزاری هست که اشخاصی با سواد( هکر واقعی ) نوشته ن ...خب پس قطعا چهارتا کامند(Command) حفظ کردن و از اسکریپت کسی دیگر استفاده میکنن :))نمونه بارز این میتونه بروت فورس ها باشه‌ ( Brute Force ) --&gt; حمله های زورکی :)) یعنی ۱۰۰۰ تا پسوورد رو روی یک آیدی امتحان میکنن ( البته بصورت برنامه نویسی شده و اتوماتیک )و در آخر برای شروع میتونید از چیزهایی مثل سیستم عامل کالی لینوکس ( Kali Linux ) استفاده کنید !دلیلش هم منطقی هست چون بصورت پیشفرض ابزار های تست نفوذ زیادی درونش تعبیه شده :)برای حمله ها بهتره از ماشین های مجازی ( Virtual Machine ) استفاده کنید که به کسی آسیب هم نزنید :)یعنی لابراتور( Laboratory ) خودتون رو درست کنید.برای حمله میتونید از ابزار های از پیش تعیین شده استفاده کنید مثل ( OWASPBWA ) و ( MetaSploitable )اینا ابزار هایی هستن برای حمله شدن بهشون :) یعنی مثلا توی OWASPBWA که BWA  آخرش یعنی:Broken Web Applicationنسخه های چیز های مختلف حاوی باگ هست که البته واقعی بوده !مثلا نسخه فلان وردپرس ( Word Press ) این باگ رو داشته و شما میتونید بهش حمله کنید :)باز تاکید میکنم این مسیر خیلی طولانی و وسیعه و شما با یک دوره هکر نمیشید، پس مداوم یاد بگیرید و از یادگیری نترسید :)امیدوارم مفید واقع بشه و اگر اشتباهی اعم از تکنیکال،تایپی و ... مشاهده کردید، خوشحال میشم باهام در میون بذارید...</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Tue, 22 Sep 2020 15:09:34 +0330</pubDate>
            </item>
                    <item>
                <title>لینوکس-گیت</title>
                <link>https://virgool.io/@mostafakhoshhal/%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%DA%AF%DB%8C%D8%AA-k5mbbseptuzp</link>
                <description>سلام امیدوارم حالتون خوب باشه :)خب، امروز میخوام در راستای زحماتم بنویسم :))طبعا یه عده ای دنبال یادگیری حرفه ای تر لینوکس هستند ...اگر نمیدونید قضیه چیه و لینوکس چیه، شما را به این مطلب ارجاع میدم. خب‌ بریم سر بحث اصلی‌ خودمون ! من دوره LPIC-1 رو گذروندم، اول توضیح بدم که سه تا دوره Lpic داریم !اولیش که من گذروندم بهش میگن Junior-Level که یعنی سطح جوان-مبتدی و...LPIC-1دومین دوره Lpic-2 هست که اسمش هم Linux-Engineer هست یعنی مهندس لینوکسLPIC-2 سومین دوره هم Lpic-3 هست که اسمش Enterprise-professional هست به معنی حرفه ای این کار و حرفه LPIC-3حالا بحث میرسه به این که چجوری شروع کنیم ؟اول از همه این سوال پیش میاد، خوب نهایتا چی‌میشه؟جوابش واضحه ! شما تبدیل میشید به یک سیستم ادمین خوب که از قضا موقعیت شغلی خوبی‌ هم هست ...من به شخصه این مبحث رو از جادی آموختم :))مثل پایتون و خیلی چیز های دیگه ..دوره هاش هم کاملا رایگان هست برای عمومدوره LPIC-1 از جادی رو میتونید اینجا ببینید.پ.ن: فیلتر شکن رو روشن کنید چون یوتیوب هست.در کنار این قضیه من خودم بصورت خودجوش همراه با دیدن این ویدئو ها و تمرین، یک فایل تکست با محتوای زیادی نوشتم که میتونه کاملا کاربردی و مفید واقع بشه :)متاسفانه یا خوشبختانه این فایل در گیتهاب من هست و برای استفاده ازش(منظورم Save کردنش هست) باید بلد باشید با گیت کار کنید :)اگر برنامه نویسید که احتمال زیاد بلدید، اگرم میخواید لینوکس یاد بگیرید، ترس نداره همینجا با گیت آشنا بشید :)گیت یک سیستم کنترل ورژن(Version Control) هست برای برنامه نویس ها ساخته شده توسط لینوس توروالدز(خالق لینوکس)کاربردشم‌ به زبان عامیانه اینجوری هست که شما با یه تیم دارید روی یک پروژه کار میکنید و از قضا هرکسی میخواد رو یه بخش خاصی متمرکز بشه و قطعا توجه خودش رو روی قطعه خاصی از کد معطوف کنه !یا حتی برای تسهیل در به اشتراک گذاشتن کد(Share) استفاده میشهکاربرد های دیگه هم داره مثل اینکه نشون میده چه کاربری با چه ایمیلی چه موقعی در کجای پروژه تغییر ایجاد کردهو اگر خطایی پیش بیاد میتونید برگردید به یک مرحله قبل که کد هنوز درست بوده :)پیشنهاد میکنم راجع بش اینجا بیشتر مطالعه کنیدخب من صرفا الان نصب و نحوه دانلود این فایل متنی حاوی کد ها و نکاتLpic-1 خودم رو میگم بقیه ش رو خودتون دنبال کنید و جویای علم باشید :))اگر لینوکس دارید که کار آسونه ! اگر Debian-Based هستید مثل Ubuntu و ...دستور زیر را وارد کنید.توجه: Dollar-Sign علامت دلار بخشی از دستور نیست ...$ sudo apt install gitاگر Fedora یا CentOs و در کل red hat ای هستید، دستور زیر را وارد کنید.$ sudo dnf install gitو بعد که گیت دانلود شددستور زیر را وارد کنید.$ git clone https://github.com/mosihere/LPIC-1بعد یک دایرکتوری (Directory) درون هوم (Home) شما با همین نام پدیدار میشه که اگر فایل shell_tips.txt رو باز کنید به مطالب دست پیدا میکنید :)برای خسته تر ها هم بگم که میتونید تو ترمینال به کامند زدن ادامه بدید و فایل رو از ترمینال باز کنید، بدین صورت:$ cd LPIC-1$ xdg-open README.mdو نهایتا فایل براتون باز میشه :)اینجا هم ریپازیتوری(Repository) خود گیت هاب رو میدم که شاید بکارتون بیاد.روی این لینک کلیک کنید تا به صفحه گیت هاب حاوی محتوای متنی هدایت شویدامیدوارم براتون مفید واقع بشه :)اگرم اشتباه تایپی، تکنیکال و... دیدید، خوشحال میشم باهام در میون بذارید.راستی تو فایل متنی قطعا اشتباه تایپی و حتی دستوری مشاهده میکنید که بذارین به حساب کم سوادی من :)موفق‌باشید .</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Wed, 22 Jul 2020 04:32:51 +0430</pubDate>
            </item>
                    <item>
                <title>Python Programming Language</title>
                <link>https://virgool.io/coderlife/python-programming-language-pc8gxz52bxho</link>
                <description>درود :)امروز میخوایم راجع به زبان برنامه نویسی پایتون(Python) صحبت کنیم.قاعدتا برای درک بهتر این مطلب بهتره که با برنامه نویسی آشنا باشید.خب بریم سر موضوع اصلی خودمون :)پایتون یک زبان برنامه نویسی سطح بالا (High-Level) و مفسری هست !سطح بالا هم به این معنی که به زبان انسان(انگلیسی) نزدیک تر هستش.حتما میدونید که زبان های برنامه نویسی، کامپایلری هستند یا مفسری.کامپایلری شامل زبان هایی مثل سی(C)، سی پلاس پلاس(++C) و سی شارپ(#C)اما پایتون بر خلاف زبان های بالا، مفسری داره که خط به خط کد رو اجرا میکنه(Interpreter)، پایتون یک زبان اسکریپتی(Script)، قدرتمند و آسون هستش :)یک چیز دیگه که خیلی دوسش دارم راجع به پایتون این هست که کلا Semicolon ( ; )  نمیخواد.We don&#x27;t Do that here :))اگر برنامه نویسی کرده باشید میدونید چی میگم :))برای مثال میخوایم یک متغیر(Variable) تعریف کنیم از نوع عددی(Integer) و در نهایت همان را در خروجی به نمایش بذاریم...مثال ذیل برای زبان C  میباشد!#include&lt;stdio.h&gt;int main()  {int number = 12;printf(&quot;%d&quot;, number);return 0;} حالا بیایید همین مثال رو با پایتون بنویسیم :)number = 12print(number)خب تموم شد :))حالا بریم سراغ  اینکه پایتون کجا کاربرد داره!تقریبا همه جا، از بازی سازی تا برنامه نویسی تحت وب و ...تمام قدرتمندی پایتون هم بر میگرده به ماژولار بودنش و داشتن کتابخانه های کاربردی و کثیر!ماژول ها(Modules) و کتابخانه ها(Libraries)، در واقع همون فانکشن ها و کدهایی است که شخص دیگری نوشته و بصورت یک کتاب خانه عرضه شده :)یعنی بجای اینکه برای یک کار خاصی خودتون بشینید یک ساعت کد بزنید، به راحتی یک ماژول را ایمپورت(Import) میکنید و ازش به سادگی استفاده میکنید...بد نیست بدونید دو نوع ماژول داریم!دسته اول ماژول های استاندارد خود پایتون هست که به صورت دیفالت(Default) نصب هست و بدون نیاز به نصب میتونید ازش بهره مند بشید؛ مثل ماژول Osدسته دوم ماژول های شخص ثالث (Third-Party Module) هستش که یک فرد آن را نوشته و منتشر کرده.برای نصب اینگونه ماژول ها باید از پیپ استفاده کنید :))اگه لینوکسی(Debian-Based) هستید، که تو ترمینال مینویسید:sudo apt install python3-pipحالا میتونید ماژول های مختلف رو با Pip نصب کنید :)مثلا ماژول Requests که برای فرستادن درخواست به وب سایت ها برای خواندن دیتا، استفاده میشه، بدین صورت نصب میشه:pip3 install requestsحالا که تا اینجا اومدیم، یه ابزار قدرتمند پایتون هم معرفی کنیم به اسم Ipythonکه تو لینوکس(Debian-Based) میتونید به این شکل دانلود و نصبش کنید:sudo apt install ipython3خب در نهایت اگه دوست دارید به این عرصه پا بذارید، پیشنهاد میکنم از یوتیوب شدیدا یاری بجویید :))و زبان انگلیسی خودتون رو تقویت کنید!راستش رو بخواید Course های فارسی زیادی وجود نداره که ارزشمند باشه در زمینه برنامه نویسی ...ولی اگر به خود پایتون علاقه مند هستید، جادی رو فراموش نکنید :)) از برنامه های آموزش برنامه نویسی کمک بگیرید!sololearn --  codeCademyاین دوتا برنامه واقعا کاربردی و خوبن...مخصوصا Solo Learnsolo learnو حتی سایت های خوبی هستند که میتونید ازشون استفاده کنید برای شروع و یا تقویت برنامه نویسی، مثل:w3schools -- geeksForGeeksخب w3schools هم از سایت های خوب هست!W3schools.comامیدوارم این مطالب مفید واقع بشه.نظری، انتقادی و  پیشنهادی اگر دارید با من در میون بذارید :)موفق باشید.</description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Tue, 14 Jul 2020 14:20:50 +0430</pubDate>
            </item>
                    <item>
                <title>Gnu-Linux - Open Source</title>
                <link>https://virgool.io/@mostafakhoshhal/gnu-linux-open-source-t8xrmqsshz2n</link>
                <description>سلام دوستان امروز میخوام یک راهنما مختصری از لینوکس برای افرادی که نمیشناسنش بزارم.خب اول از همه باید بدونیم که لینوکس یک سیستم عامل هست مثل ویندوز !ولی ویندوز نیست، چون خیلی اشخاص به سیستم عامل میگن ویندوز :)خب تفاوت سیستم عامل(Operating System) ویندوز با لینوکس چیه ؟اول اینو مطرح کنم که نگاه افراطی به هرکدومشون اشتباهه ... بر حسب شرایط و نیاز مشخص میشه که برای چه کاربری کدومشون بهتره !خب حالا به این میرسیم که لینوکس چه فوایدی داره ! لینوکس متن باز(open source) هستش یعنی شما میتونی بری کد کرنل لینوکس هم دانلود کنی ببینی :)) لینوکس کاملا رایگان هستش. برای کاربر های علاقه مند به یادگیری فوق العاده س. یه زمانی کاربر پسند(User-Friendly) نبود اما الان هست. توزیع های زیاد و مختلفی داره( Linux-Distributions) شخصی سازی لینوکس خیلی بیشتر از ویندوز هست، برای مثال تو ویندوز نهایتا بتونید یه بک گراند و کرسر موس رو عوض کنید :)) ولی لینوکس اینجوری نیست! برای برنامه نویس ها عالیه‌! یعنی میشه گفت بایدی هستش برای Developers-Programmers آپدیت کردن و آپگرید کردنش آسونه ! تو ویندوز اگر بخواید درایور هاتون رو آپدیت کنید باید دونه دونه برید دانلود کنید و نصب کنید و هزار مکافات دیگه ... ولی تو لینوکس با یه خط کامند(Command) همه درایور هاتون آپدیت میشه :) استفاده از ترمینال -&gt; تو ویندوز احتمالا یک چیزی شبیه به ترمینال لینوکس دیدید به اسم (CMD) یه صفحه سیاه که توش فقط میشه تایپ کرد و ... حالا قدرت همون رو چندین برابر کنید، میشه ترمینال. یعنی رسما همه کار میشه داخلش کرد ولی فاقد محیط گرافیکی(GUI) هستش... بطور کلی لینوکس کمتر از سخت افزار کار میکشه و سبک تر هست و طبعا سریعتر ! یعنی توزیع هایی برای لینوکس هست که حجمش کمتر از ۱۰۰ مگابایت هست ! ( درسته ۱۰۰ مگابایت) --&gt; مثل  پاپی لینوکس(Puppy-Linux) که میتونید اینجا ببینیدیه نمونه دیگه ش تاینی کور لینوکس هست(Tiny-Core-Linux) که از ۱۱ مگابایت هست تا ۱۰۶ مگابایت :))تاینی هم میتونید اینجا ببینید.ولی خب مشهورترین توزیع ها شامل Fedora-Debian-Ubuntu-Arch-Manjaro و چند مورد دیگه میشه.که البته  اصلی ترین تفاوت این توزیع ها این هست که صرفا پکیج منیجر های متفاوتی دارن برای دانلود و نصب بسته های مورد نیاز شما...مثلا اوبونتو(Ubuntu) که یک توزیع زیر شاخه از Debian هست از همون پکیج منیجر(Package-Manager) دبیان استفاده میکنه و وقتی شما میخواید چیزی را نصب کنید، اول Ctrl+Alt+T رو میزنید که یک Short Cut برای باز کردن ترمینال هست، بعدش این کامند را تایپ میکنیدsudo apt install PackageNameبجای Package Name اسم برنامه مورد نظر را میذاریدبرای مثال --&gt; sudo apt install steam این کامند استیم رو براتون دانلود و نصب میکنه :)برای حذف پکیج هم همینطور --&gt; sudo apt uninstall PackageNameبیایید یه عکس هم از محیط لینوکس(Ubuntu-20.04) ببینید :))دسکتاپ اوبونتو ۲۰.۰۴خب حالا یکم از بدی هاش بگیم ! تقریبا برای بازی خوب نیست(ولی بازی های استیم رو ساپورت میکنه) بعضی از توزیع های لینوکس با سخت افزار ها به خوبی هماهنگ نمیشه اگر دیزاینر هستید یا میخواید بشید و در کل با Photo Shop و ... سر و کار دارید، لینوکس زیاد مفید واقع نمیشه(گرچه ابزار جایگزین مثل GIMP داره و حتی میتونید با نصب Wine حتی خود فتوشاپ هم نصب کنید برای لینوکس)اگر از تکنولوژی میترسید بازم سمتش نیایید :))تقریبا برای هرکسی خوب نیست، چرا که باید تلاش کنید تا به یک کاربر نسبتا حرفه ای تبدیل بشید و چیزای جدید یاد بگیرید و با ترمینال دوست شید بتونید از کامند لاین (Command-Line) استفاده کنید و ...خب اگه مشتاق شدید امتحان یا نصبش کنید، چندتا راه دارید‌‌! نصب کردن لینوکس در ماشین مجازی مثل ( Oracle VirtualBox ) نصب کردن لینوکس بجای ویندوز نصب کردن لینوکس در کنار ویندوز(Dual-Boot)امتحان کردن لینوکس بدون نصب( این گزینه کم خطر تر و بهتر هست)خب اول از همه باید یک USB داشته باشید که پیشهاد میشه حداقل ۴ گیگ باشه و بعدش با استفاده از Rufus اون USB رو باید بوتیبل کنید (BootAble) یعنی بتونید سیستم عامل رو از روی USB بجای سی دی و دی وی دی، بوت کنید.خب پس لازم میشه که Rufus رو از اینجا دانلود کنید.بعدش بر حسب خواسته شما توزیع مورد نظر لینوکس رو دانلود کنید از سایت رسمی خودش، رایگان هم هست. ( باید فایل ایزو رو دانلود کنید برای مثال  &#x27;ubuntu.iso&#x27; )لینک دانلود اوبونتو ۲۰.۰۴بعد با کمک برنامه Rufus مینونید USB رو بوتیبل کنید، اگر نیاز به کمک داشتید میتونید از تو این سایت آموزشش رو ببینیدحالا که فلش بوتیبل شده حاوی فایل iso لینوکس مورد نظر رو دارید، فلش رو به کامپیوتر وصل کنید و سیستم رو خاموش کنید. روشن که کردید قبل اینکه سیستم بیاد بالا باید سیستم رو بیارید رو  بایوس(BIOS)که هر سیستمی فرق میکنه ولی اصولا این کلید ها جواب میده--&gt; ESC- F1- F2- DELETE - F12اگر نمیدونید برای سیستم شما کدومه، چندتا رو باهم بزنید بهتره :))حالا تو تنظیمات بایوس برید به قسمت(Tab) بوت (Boot) و معمولا ۲ یا ۳ تا اولویت داره برای بوت شدن کامپیوتر، اولیش رو بذارید اسم فلشتون یا اگه نیست، External Device رو انتخاب کنید.حالا تو تب های بالا باید گزینه Save And Exit باشه، سیو کنید و ری استارت کنید، حالا سیستم بالا میاد روی لینوکس شما و دوتا گزینه میادInstall -  Try without Installاگر گزینه Try Without Install رو بزنید میتونید بدون نصب از لینوکس استفاده کنیدو اگر مشتاق بودید، نصبش کنید :)امیدوارم مفید واقع بشه این مطلب برای دوستان تازه واردو اگر اشتباهی(اعم از تایپی یا تکنیکال وجود داشت) خوشحال میشم اصلاحش کنید :)توزیع پیشنهادی من هم برای شروع Ubuntu هستش که لینک دانلودش هم گذاشتم بالا تر :) </description>
                <category>Mosihere</category>
                <author>Mosihere</author>
                <pubDate>Mon, 13 Jul 2020 18:09:57 +0430</pubDate>
            </item>
            </channel>
</rss>