<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سعید حسنی (برزادران)</title>
        <link>https://virgool.io/feed/@hasanisaeed</link>
        <description>یه برنامه نویس خوشحال ツ
و ارشد هوش مصنوعی</description>
        <language>fa</language>
        <pubDate>2026-06-10 18:27:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/235568/avatar/LueWqn.png?height=120&amp;width=120</url>
            <title>سعید حسنی (برزادران)</title>
            <link>https://virgool.io/@hasanisaeed</link>
        </image>

                    <item>
                <title>چرا گاهی باید از قله‌ای که فتح کردی پایین بیای؟</title>
                <link>https://virgool.io/@hasanisaeed/%DA%86%D8%B1%D8%A7-%DA%AF%D8%A7%D9%87%DB%8C-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B2-%D9%82%D9%84%D9%87-%D8%A7%DB%8C-%DA%A9%D9%87-%D9%81%D8%AA%D8%AD-%DA%A9%D8%B1%D8%AF%DB%8C-%D9%BE%D8%A7%DB%8C%DB%8C%D9%86-%D8%A8%DB%8C%D8%A7%DB%8C-cxxidbifityq</link>
                <description>همه‌ی ما تو مسیر زندگی، دنبال رشد و موفقیتیم. مثل کوهنوردانی که در دل مه به سوی قله‌های ناشناخته حرکت می‌کنن. اما آیا همیشه قله‌ای که فتح می‌کنیم، بالاترین قله است؟الگوریتم تپه‌نوردی، [مرجع عکس: geeksforgeeks.org]الگوریتم تپه‌نوردی یا Hill Climbing چیه؟توضیح ساده و مختصر از الگوریتم Hill Climbing در هوش مصنوعی:الگوریتمی که تلاش می‌کنه در هر قدم، بهترین حرکت کوچک رو انتخاب کنه. هدف رسیدن به بالاترین نقطه‌ی ممکن. اما مشکل کجاست؟ گاهی در یک قله‌ی کوتاه گیر می‌کنه، بدون اینکه بدونه قله‌ای بلندتر در دوردست وجود داره.ماکزیمم محلی در زندگی واقعی:مثال های واقعی توی زندگی مون مثلا، شغل خوب اما بدون پیشرفت، روابطی که دیگه رشد ندارن، مهارت‌هایی که دیگه چالشی ایجاد نمی‌کنن.اصطلاحات جالب Shoulder و Flat الگوریتم:گاهی در مسیر پیشرفت به شونه‌های کوه می‌رسی (shoulder)، جایی که باید صبوری کنی تا دوباره شیب رو پیدا کنی. گاهی در سطح صاف (flat) هستی و اصلاً پیشرفتی نیست که اینجا باید جسارت تغییر داشته باشی.چطوری به Global Maximum برسم؟گاهی باید جرئت &quot;حرکت به عقب&quot; رو داشت.شاید نیاز باشه مهارت جدید یاد بگیری.گاهی تغییر محیط یا موقعیت شغلی در زمان مناسب، انتخاب خوبی هست.گاهی باید ریسک کنی و &quot;از قله‌ی فعلی پایین بیایی&quot; تا قله‌ی بزرگتر رو ببینی.همیشه قله‌ای بلندتر وجود داره. شجاعت واقعی یعنی بدونی کی باید مسیرت رو عوض کنی، حتی وقتی بالای یک قله ایستادی. رشد واقعی زمانی آغاز می‌شه که از ترک کردن قله‌های کوچک نترسیم.یا حق ❤️</description>
                <category>سعید حسنی (برزادران)</category>
                <author>سعید حسنی (برزادران)</author>
                <pubDate>Fri, 25 Apr 2025 18:15:26 +0330</pubDate>
            </item>
                    <item>
                <title>چجوری  یه پکیج برا جنگو بنویسم (گام به گام)</title>
                <link>https://virgool.io/@hasanisaeed/pip-install-t4kkdevybmep</link>
                <description>خروجی کار: پکیج مون رو با pip دریافت کنین :)مقدمه:ممکنه شما یه برنامه نوشتین که خیلی باحاله و قصد دارین با همه به اشتراک بذارین?یا اینکه اصلا نخواین به کسی بدین و برا خودتون نگهش دارین?. به هر حال به نظرم باید اونها رو به یه بسته جدا تبدیل کنین و تو پروژه ها تونDon&#x27;t Repeat YourselfیاهمونDRYرو رعایت کنین و کدهای تکراری ننویسین.تو این نوشته میخوایم یه پروژه ساده جنگو بیاریم بالا و باهاش یه کم بازی کنیم و آخر تبدیل به یه پکیج کنیم.اینجا یاد میگیریم که:- چجوری یه پروژه جنگو بیارین بالا- مدلها رو تو جنگو تعریف کنین و تو پنل ادمین جنگو رجیسترشون کنیم.- باfixturesآشنا میشین.- وunittestانجام بدین.- چجوری یک اپ رو از پروژه جدا کنین و برا اتصال دوباره اش چجوری کانفیگش کنین.- چجوری باpipاپی که جدا کردین رو به صورت محلی نصب کنین.- باtoxآشنا میشین تا اپ رو بر روی محیطهای مختلف تست بگیرین.- در نهایتم که باtwineاپ رو بذارین تویPyPiتا همه ازش استفاده کنن. بزن بریم پس✌️.- سورس کد برنامه رو میتونین از اینجا دریافت کنین.- تصاویری که داخل شون کد هست، من هایپرلینک کردم(رنگ آبی) به گیت هاب تا بتونین کد رو هم ببینین. - سعی کردم آموزش فقط یاد دادن ساخت یه پکیج نباشه و یه سری توصیه ها برای بهتر کد نویسی هم داشته باشه.قسمت اول (ایجاد یه پروژه ساده جنگو)ایجاد پروژه:میخوایم یه پروژه خیلی ساده جنگو رو بالا بیاریم. پس دستورات زیر رو اجرا بگیرین تا پروژه ایجاد بشه:python -m pip install Djangodjango-admin startproject my_app_projectحالا یک اپ رو ایجاد کنین که قراره بعدا به عنوان پکیج مون باشه:python manage.py startapp my_appساختن مدل های دیتابیس:در ادامه دو تا مدل پیاده سازی میکنیم. مدل ها در جنگو محتویات دیتابیس مون رو میسازن. مدل مدرسه و دانش آموز که با همدیگه رابطه یک به چند دارن و هر مدرسه میتونه چندین دانش آموز داشته باشه و هر دانش آموز متعلق به یک مدرسه است. برا دانش آموزا نام و معدل شون رو نگه میداریم و هدف این هست که بعدا در قسمتveiwsیه کوئری به دیتابیس بزنیم و میانگین معدل هر مدرسه به همراه معدل و نام بچه ها رو برگردونیم.فایل models.py که مدل هامون رو داره نگه میدارهساختنview:حالا یهviewآماده کنیم که اطلاعات تمام بچه های مدرسه رو برامون تو خروجی برگردونه:فایل veiws.py که به درخواست هامون پاسخ میدهرجیستر کردن مدل ها در پنل ادمین جنگو:میتونیم مدل ها رو توی پنل ادمین جنگو رجیستر کنیم.فایل admin.py که کارش رجیستر کردن مدل در پنل ادمین هست.ایجادurlهای برنامه:حالا میتونیم از طریق urls به veiwکه طراحی کردیم، دست پیدا کنیم.فایل urls.py در پوشه my_appبرای اینکه بتونیم از طریق وبسایت مون به اینurlها دسترسی داشته باشیم نیازه که اونها رو بهurlهای پروژه معرفی کنیم.فایل urls.py تو پوشه djangoProjectبریم دیتابیس رو بسازیم و قبلش یادتون نره که my_appرو به INSTALLED_APPSهامون توی فایل settings.pyاضافه کنیم.INSTALLED_APPS = [
 ... 
 &#039;my_app&#039;,
]ساختmigrationsها و ایجاد دیتابیس:python manage.py makemigrations my_apppython manage.py migrateمقدار دهی اولیه دیتابیس با استفاده از fixtures یه سری دیتای فیک با استفاده ازfixtures من تولید کردم که لینک هم اینجا تو گیت هاب گذاشتم. بعد با دستور زیر این دیتاها رو که تو فایلmy_app/fixtures/fake.jsonهست، به دیتابیس اضافه میکنیم.python manage.py loaddata my_app/fixtures/fake.jsonمشاهده خروجی بر روی مرورگراگه سرور رو با دستورpython manage.py runserverاجرا بگیریم، با رفتن به آدرسschool/info اطلاعات مدرسه ها رو میتونیم ببینم.http://127.0.0.1:8000/school/info/تست برنامه با unittestقبل از اینکه پکیج مون رو بسازیم نیاز داریم که یه سری تست هامون رو انجام بدیم، تا اون چیزی که از برنامه انتظار دارم رو برآورده کنه. برای همین از کتابخونهunittestیه تست ساده مینویسیم که مثلاidمدرسه اول مون رو برگردونیم و با توجه به اینکه میدونیم میانگین معدل بچه ها در اون کلاس 19.24 هست، بررسی میکنیم که آیا واقعا این میانگین بدست میاد یا نه؟تست معدل کلاس یک با unittestبرای اجرای تست از دستورpython manage.py testکمک میگیریم و خروجی نشون میده که این تست  موفق بوده:Creating test database for alias &#x27;default&#x27;...System check identified no issues (0 silenced)..----------------------------------------------------------------------Ran 1 test in 0.023sOKDestroying test database for alias &#x27;default&#x27;...پیشنهاد: توصیه میکنم برای تست ها ازpytestاستفاده کنین. برای شروع هم به نظرم این لینک خیلی خوبه.قسمت دوم (جداسازی اپ از پروژه)تا اینجا اومدیم اپ مون (my_app) رو  ساختیم و دیگه وقتش رسیده که روی پای خودش وایسته. پس باید از پروژه که تا حالا ازش نگهداری میکرده!، جداش کنیم? و بتونه با کل دنیا حرف بزنه [خیلی غم انگیزه ولی برا خودش خوبه].بالاخره باید یه جایی خودش رو نشون بده، نمیشه که همش وابسته باباش باشه!?.اول بیانmy_appرو روی سیستم خودمون از پروژه جدا کنیم و یه سری تست ها روش انجام بدیم. برا همین من  ساختار پوشه بندی رو به صورت زیر تغییر میدم. اومدم پوشهmy_appرو در کنارmy_app_projectقرار دادم(قبلا داخلش بود).پسر رو از پدرش (پروژه) جدا کردیم پس یه فایل به اسم boot_my_app.pyرو تو پوشه اصلی مون که الان شده (school_info) ایجاد میکنیم. در واقع به جنگو میخوایم بگیم که چجوریmy_appرو پیدا کنه. بنابراین اینطوری براش کد بنویسین:boot_my_app.py برای اتصال اپ با پروژهتوابع settings.configure وdjango.setupبرای اینکه بتونیم یه اپ رو خارج از پروژه به پروژه مون متصل کنیم، طراحی شدند. میتونین برین این لینک و بیشتر در موردشون بدونین.هر مقداری که تو تابعsettings.configureهست، دقیقا همون چیزی هست که ما تویsettings.pyپروژه داشتیم. یعنی اینکه اپ شما وقتی به یه پروژه اضافه شد، چه تنظیماتی داشته باشه رو، اینجا مشخص میکنین.افزودنmigrationهای اپلیکشینگام بعدی اینکه که از طریق management command پایتون،migrationهای درون پوشهmy_appرو بسازیم. من فایلmakemigrations_my_app.pyرو اینطوری تنظیم میکنم:makemigrations_my_app.pyاول اومدیم تابع boot_my_appکه توی فایل قبلی طراحیش کردیم، صدا زدیم و اپ رو به پروژه اضافه کردیم و تو خط بعدی، commandای که استفاده کردم دقیقا معادل دستورpython manage.py makemigratins my_appهست.تست اپخب حالا بیان تست کنیم که آیا تست ها هم با موفقیتpassمیشن و مشکلی نباشه. پس یه فایل دیگه به اسم check_my_test.pyایجاد میکنم و داخلش همه تست های درونmy_appرو اجرا میگیرم. این فایل دقیقا معادلpython manage.py testهست.check_my_test.py فایل   برای اینکه این فایل رو اجرا بگیریم، کافیه که تو پوشه این فایل دستورpython check_my_test.pyرو بزنین وmainصدا زده میشه و تابعget_suiteفراخونی میشه.قسمت سوم (آماده سازی جهت انتشار بر روی PyPi)میخوایمmy_appرو بذاریم رویPyPiتا به صورت پکیج قابل استفاده برای همه باشه. برا این کار  یه فایل setup.cfgو یه فایلsetup.pyتوی یه پوشه یکسان و در کنار پوشهmy_appایجاد کنیم.ساختار پوشه ها و فایل ها تا الانمقادیری که تو فایلsetup.cfgوارد میکنین تو سایتPyPiبرا همه قابل نمایش هستن، مثلا اسم پکیج چیه؟ و عنوانش چیه؟ یا یه سری توضیحات در موردش بدین یا اینکه آدرس سورس کدش مثلا کجاست، یه سری توضیحات در موردش میدین، برای چه ورژنهای پایتونی مناسب هست و ... برای اینکه توضیحات در مورد پروژه بدین، یه فایلREADME.rstبسازین و هر توضیحی در مورد پکیج میخواین بدین، مثلا چی هست، و چجوری نصب میشه و ... (ازmarkdownهم میتونین کم و بیش استفاده کنین).من فایلsetup.cfgرو به صورت زیر پیاده سازی کردم و همونطور که قبلا اشاره شد، در واقع میاد پکیج مون رو درPyPiتوصیف میکنه.فایل setup.cfgمن اسم پکیج روmpkg_school_infoگذاشتم. مقدارinstall_requires داره میگه مثلا وقتی باpipداریم پکیج رو نصب میکنیم، ورژن پکیجهایی که استفاده کردیم، چی باشن وtest_suiteهم میگه برو تست ها رو از فایلcheck_my_test.pyکه قبلا نوشتم بخون.- اسمی که انتخاب میکنین نباید قبلا استفاده شده باشه. پس قطعا شما نمیتونین اسمی که من انتخاب کردم رو بزنین. یه اسم به دلخواه خودتون بهش بدین.- یه پارامتر دیگه (البته بهشون میگنentry) به نامtest_requiresداریم که مشخص میکنین تو تست ها از چه ورژن هایی از یه پکیج ها استاده کردین.حالا بریم فایلsetup.pyرو هم مقدار دهی کنیم که خودش اتوماتیک میکه اطلاعاتsetup.cfgرو میخونه و استفاده شون میکنه.فایل setup.pyتست لوکال با pipپکیج مون آماده ست. فقط بیان که به صورت لوکال یه تست بگیریم که مطمین بشیم همه چی اوکی هست و میتوینم اون رو بر رویPyPiقرار بدیم.برای اینکه تو پوشهschool_info/my_app_projectیه فایل به اسمrequirements.txtدرست کنین و برین تو پوشه که این فایل هست و دستورpip install -r requirements.txtپکیج رو نصب کنیم.# school_info/my_app_project/requirements.txt

-e ../../school_infoتو این فایل-eدر واقع داره بهpipمیگه که این یه نصب لوکال هست.محل قرار گرفتن requirements.txtوقتیpip install -r requirements.txtرو زدین خروجی زیر براتون میاد و یعنی همه چی خوبه?:Obtaining file:///C:/Users/RAYCA.CO/Project/school_info(from -r requirements.txt (line 3))Requirement already satisfied: Django&gt;=2.0 in c:\python39\lib\site-packages (from school-info==1.0.0-&gt;-r requirements.txt (line 3)) (2.1.5)...Installing collected packages: school-infoRunning setup.py develop for school-infoSuccessfully installed school-infoاستفاده ازtox جهت تست بر روی محیط های مختلفقبل از اینکه پکیج رو برای همه دنیا به اشتراک بذاریم و بدیمش دست این و اون تا ازش کار بکشه?، نیاز هست که روی محیط های مختلف تست بشه. از همه مهمتر اینکه ما دوست نداریم هر دفعه که تست بخوایم بگیرم هی باید دستورpython check_my_test.pyرو بزنیم. پس بذاریم اینا خودش اتوماتیک انجام بشه و یهCI/CDکوچیک برا خودمون داشته باشیم. برای همین ما ازtox(و این لینک) استفاده میکنیم. برای این کار لازمه که یه فایل به نامtox.iniدر کنار فایلsetup.cfgایجاد کنیم و محیط هایی که پکیج مون رو میخوایم داخلش تست کنیم، مشخص میکنیم.محتویات فایل tox.iniمثلا من اینجا چهار تا محیط تست آماده کردم. محیط پایتون 3.6 و محیط پایتون 3.7 با جنگو 3 و محیط پایتون 3.8 و 3.9 با جنگو 2.1.5) . تو قسمتcommandsمشخص میکنیم که تست ها رو از فایلsetup.pyاجرا کنه. و همچنین تو فایلsetup.cfgمشخص میکنم که تست ها حالا اتوماتیک انجام بشه و نیازی به نوشتنpython check_my_test.pyنباشه:اضافه شدن test_suite به فایل setup.cfgتو نسخه جدیدsetup.cfgمستقیما اومدیم تابعget_suiteرو از فایلcheck_my_test.pyفراخونی کردیم.انتشار بر رویPyPi(دیگه وقتشه)? اول از همه برین تو سایت PyPi و ثبت نام تون رو تموم کنین. خیلی ساده ست و کمتر از یک دقیقه. یهusernameوpassword ازتون میخواد و یه ایمیل معتبر بهش بدین.استفاده ازTwineبرای آپلودحالا وقتش رسیده که پکیج مون رو بذاریم تویPyPi. ابزارهای مختلفی  برای  آپلود وجود داره، من از ابزار Twine استفاده میکنم. با چهار خط کد زیر:python -m pip install -U wheel twine setuptoolspython setup.py sdistpython setup.py bdist_wheeltwine upload dist/*وقتی دستور twineرو بزنین ازتون usernameو password تون رو میخواد و دیگه تموم شد. تبریک میگم بهتون. شما دیگه یه خیرخواه جهانی شدین(منظورم خَیِّر هست)?.حالا وقتی یکی اون سر دنیا یه برنامه پایتون باز کنه، میتونه پکیج منو با دستور pip install mpkg-school-infoدریافت کنه و هر چقدر دلش بخواد میتونه ازش کار بکشه?:Collecting mp-school-info  Downloading mp_school_info-1.0.0-py3-none-any.whl (2.4 kB)...Installing collected packages: mp-school-infoSuccessfully installed mp-school-info-1.0.0جمع بندی:اومدیم پروژه جنگومون رو بالا آوردیم. یه اپ داخلش ساختیم به اسمmy_app. برنامه رو اجرا گرفتیم و دیدیم همه چی اوکی هست. بعد اپ رو از پروژه جدا کردیم و برای اینکه دوباره به همدیگه وصلشون کنیم، یه سری کافیگ ها انجام دادیم باboot_my_appوsetup. در نهایت هم باtwineفرستادیمش براPyPi.هدف فقط این بود که اگه کسی یه پکیج عالی داره و فک میکنه میتونه مفید باشه برا جامعه برنامه نویسی، از این امر غافل نشه.بهترین باشیدبا❤️نوشته شده برای شما.</description>
                <category>سعید حسنی (برزادران)</category>
                <author>سعید حسنی (برزادران)</author>
                <pubDate>Sun, 07 Feb 2021 15:32:02 +0330</pubDate>
            </item>
                    <item>
                <title>تولید فایل APK بدون اندروید استودیو و هیچ IDE دیگه ای!</title>
                <link>https://virgool.io/@hasanisaeed/%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-apk-%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88-%D9%88-%D9%87%DB%8C%DA%86-ide-%D8%AF%DB%8C%DA%AF%D9%87-%D8%A7%DB%8C-jwldcgcd81jx</link>
                <description>توسعه اندروید وقتی دستت خالیه!سلام سلام سلامامروز داشتم برا یکی از دوستام یه برنامه اندروید اجرا میگرفتم. متاسفانه به اندروید استودیو دسترسی نداشتیم. بیابون بود! تصمیم گرفتم بصورت خط فرمان (command line) خروجی APK رو براش تولید کنم. بعد بهم پیشنهاد داد این آموزش رو منتشر کنم.فعلا به صورت  ساده توضیح میدم ولی در ویرایش بعدی(فرصتش بیاد) جزئیات و کلی چیزای باحال بهش اضافه میکنم.خب بسم الله.چند تا گام باید پیش بریم:من از Ubuntu 18.04 برا این آموزش استفاده میکنم.اول از همه اطمینان حاصل کنین که جاوا روی سیستم تون نصب هست و SDK روی سیستم قرار داره. مسیر SDK من توی پوش /home/saeed/Android هست.خب در ادامه میخوام یه پروژه ساده رو بالا بیارم تا در نهایت فایل APK اون رو به عنوان خروجی نشون بدیم. یه پروژه ساده که وقتی روی دستگاه اندرویدی تون نصب میشه، عبارت سلام ویرگول!  رو نشون میده.من یه پوشه به اسم HelloVirgool تو صفحه دستکتاپم درست میکنم و بعد ساختار پوشه بندی اندروید (اندروید یه ساختار پوشه بندی مشخص داره) رو بهش اضافه میکنم. با دستورات زیر این ساختار رو ایجاد میکنم:mkdir -p src/com/example/hellovirgool
mkdir obj
mkdir bin
mkdir -p res/layout
mkdir -p res/values
mkdir -p res/drawableحالا بریم تو پوشه src/com/example/hellovirgool یه فایل جاوا به اسم MainActivity.java بسازیم. من این محتویات رو داخلش میریزم.package com.example.hellovirgool; 
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}تو پوشه res/layout هم فایل layout رو با مقدار زیر قرار بدیم (من برا سادگی کار ازینا استفاده کردم. شما تغییرات دلخواه تون رو انجام بدین).&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;RelativeLayout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot
    tools:context=&amp;quot.MainActivity&amp;quot&gt;
    &lt;TextView
        android:layout_width=&amp;quotwrap_content&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:layout_centerInParent=&amp;quottrue&amp;quot
        android:text=&amp;quotسلام ویرگول!&amp;quot
        android:textSize=&amp;quot40sp&amp;quot /&gt;
&lt;/RelativeLayout&gt;خب همه مون میدونیم فایل AndroidManifest.xml از واجبات هست چرا که باید اکتیویتی هامون رو اینجا تعریف کنیم. کدهای زیر رو براش کپی کنین. ضمن اینکه من تو پوشه drawable یه آیکون برای برنامه ذخیره کردم که در این فایل و در تگ application میتونین ببینین.&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;manifest xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    package=&amp;quotcom.example.hellovirgool&amp;quot&gt;
    &lt;uses-sdk android:minSdkVersion=&amp;quot14&amp;quot /&gt;
    &lt;application
        android:allowBackup=&amp;quottrue&amp;quot
        android:icon=&amp;quot@drawable/ic_launcher&amp;quot
        android:label=&amp;quotHello Virgool&amp;quot
        android:roundIcon=&amp;quot@drawable/ic_launcher&amp;quot
        android:supportsRtl=&amp;quottrue&amp;quot&gt;
        &lt;activity android:name=&amp;quot.MainActivity&amp;quot&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&amp;quotandroid.intent.action.MAIN&amp;quot /&gt;
                &lt;category android:name=&amp;quotandroid.intent.category.LAUNCHER&amp;quot /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;
&lt;/manifest&gt;الان کدهامون آماده ست. بریم کدهامون رو Build کنیم.فقط برای اینکه از طولانی شدن دستورات جلوگیری کنم، اجازه بدین مسیر پروژه و مسیر SDK رو با دستورات زیر داخل دو متغیر ذخیره کنم:export PRJ=/home/saeed/Desktop/HelloVirgool
export SDK=/home/saeed/Android/Sdkاول از همه نیاز هست که فایل R.java رو تولید کنیم. من این فایل رو به صورت زیر تولید میکنم. اول میرم به پوشه build-tools/29.0.2:cd $SDK/build-tools/29.0.2/بعد دستور زیر رو اجرا میگیرم:./aapt package -f -m -J $PRJ/src -M $PRJ/AndroidManifest.xml -S $PRJ/res -I $SDK/platforms/android-29/android.jarخب حالا وقتشه که فایلهای جاوا مون رو کامپایل کنیم. برای اینکار بریم تو پوشه root پروژه (HelloVirgool) و دستور زیر رو اجرا بگیریم:javac -source 1.7 -target 1.7 -d obj -classpath src -sourcepath $SDK/platforms/android-29/android.jar src/com/example/hellovirgool/*.javaمن از جاوا  1.7 استفاده کردم. شما اگه به مشکل برخوردین جاوا 1.8 یا یه نسخه دیگه رو امتحان کنین.اگه دستور javac براتون پیدا نشد، دستور زیر رو تو ترمینال بزنین تا نصب بشه (فک کنم حدود ۲۰۰ مگ باید حجم داشته باشه):sudo apt-get install default-jdkتا اینجا یه سری فایل با پسوند class برامون تولید میشه که در پوشه obj قرار داره (یه نگاه بهش بندازین). اما اما اندروید نمیتونه اونا رو بخونه. باید اونها رو به classes.dex تبدیل کنیم تا قابل خوندن برای اندروید باشه. پس بریم این دستور رو یه تست بگیریم ببینیم چی میشه:اول بریم به پوشه build-tools/29.0.2 با دستور زیر:cd $SDK/build-tools/29.0.2/حالا دستور زیر رو اجرا بگیریم:./dx --dex --output=$PRJ/bin/classes.dex $PRJ/objدیگه وقتشه که فایل APK مون رو تولید کنیم:./aapt package -f -m -F $PRJ/bin/hello.apk -M $PRJ/AndroidManifest.xml -S $PRJ/res -I $SDK/platforms/android-29/android.jarcp $PRJ/bin/classes.dex ../aapt add $PRJ/bin/hellovirgool.apk classes.dexیه مشکل کوچیک هست فقط. باید برنامه رو امضا کنیم تا روی دستگاه نصب بشه. اگه یه امضا دارین که میتونین با دستور زیر نسخه نهایی APK رو استخراج کنین../apksigner sign --ks mykey.keystore $PRJ/bin/hellovirgool.apkاگه امضا برای برنامه ندارین، به روش زیر یه امضا تولید کنین و برگردین دستور بالا رو تایپ کنین.خیلی ساده ست. برای اینکه یه امضا تولید کنیم (فایل keystore) کافیه از دستور keytool به صورت زیر استفاده کنیم:keytool -genkeypair -validity 365 -keystore mykey.keystore -keyalg RSA -keysize 2048به سوالایی که میاد جواب بدین. سوال اول: یه رمز برا خودت انتخاب کنسوال دوم: رمزی که انتخاب کردی رو دوباره وارد کنسوال سوم: نام و نام خانوادگی تو وارد کن، به انگلیسی :(سوال چهارم: مثلا بنویس Unitسوال پنج: مثلا بنویس Virgoolسوال ششم: اسم شهرت رو وارد کن، مثلا من مینویسم Birjandسوال هفتم: نام استانت رو وارد کن. مثلا من مینویسم South-Khorasanسوال هشتم: تایپ کن IRدر آخر تایپ کن yes و کلید Enter رو بزن.به راحتی فایل به نام mykey.keystore تولید میشه.بهترین باشین ❤️</description>
                <category>سعید حسنی (برزادران)</category>
                <author>سعید حسنی (برزادران)</author>
                <pubDate>Fri, 16 Oct 2020 02:27:58 +0330</pubDate>
            </item>
            </channel>
</rss>