<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Sajjad</title>
        <link>https://virgool.io/feed/@SajjadSajjad</link>
        <description>Programmer</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:59:32</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/35282/avatar/sn1H7C.png?height=120&amp;width=120</url>
            <title>Sajjad</title>
            <link>https://virgool.io/@SajjadSajjad</link>
        </image>

                    <item>
                <title>آموزش رمزنگاری و ارسال پیام ها و فایل ها در بستر نا امن</title>
                <link>https://virgool.io/@SajjadSajjad/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B1%D9%85%D8%B2%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D9%BE%DB%8C%D8%A7%D9%85-%D9%87%D8%A7-%D9%88-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B4%D8%B1%D8%A7%DB%8C%D8%B7%DB%8C-%D9%86%D8%A7-%D8%A7%D9%85%D9%86-l3vfm9pe04yp</link>
                <description>تو حالتی که میخوایم روی یک بستر نا امن با مخاطبمون پیامی رد و بدل کنیم، میتونیم از این طریق، ارتباط رو امن کنیم:برای این کار به openssl نیاز داریم که روی ترمینالتون بهش دسترسی داشته باشین.ابتدا یک private key ایجاد میکنیم که این رو نباید به کسی داد، و فقط برای decrypt کردن پیش خودمون میمونه:openssl genrsa -out private_key.pem 4096و با این دستور زیر public key ایجاد میکنیم که میدیم به طرفی که میخواد فایلمون رو رمزنگاری کنه، و این پابلیکه و لو رفتنش هیچ اشکالی نداره و باهاش میشه صرفا رمزنگاری انجام داد، رمزنگاری ای که فقط با همون private keyای که ما داریم، رمزگشایی میشه:openssl rsa -in private_key.pem -pubout &gt; public_key.pemحالا طرف مقابل ما میتونه با در دست داشتن اون public key، با دستور زیر، فایلو رمزنگاری کنه و برای ما بفرسته:openssl pkeyutl -encrypt -in myfile.txt -out encrypted_file.txt -pubin -inkey ./public_key.pemتو دستور بالا myfile.txt، همون اسم فایلتون باید باشه و encrypted_file.txt هم یه اسم دلخواه، برای فایل رمزنگاری شده‌تون هست.و وقتی فایل به دستمون رسید، با private key ای که داریم، از طریق دستور زیر، رمزگشاییش میکنیم:openssl pkeyutl -decrypt -in encrypted_file.txt -out decrypted_file.txt -inkey ./private_key.pemکه encrypted_file.txt میشه اسم فایلی که رمزنگاری شده و decrypted_file.txt هم میشه، یه اسم دلخواه برای خروجی این رمزگشایی.اما نکاتی که با این موارد باید در نظر داشته باشیم، اینه که کلا RSA جزو روش های کاملا ایمن نیست و با کامپیوترهای کوانتمی قابل شکستن هست و یه سری موارد دیگه، اما خب برای امور دم دستی خوبه و برای کسی که بخواد محتوای فایلارو بفهمه، کلی دردسر درست میکنه.</description>
                <category>Sajjad</category>
                <author>Sajjad</author>
                <pubDate>Fri, 20 Jun 2025 23:42:29 +0330</pubDate>
            </item>
                    <item>
                <title>راهنما و تجربه سفر به گرجستان</title>
                <link>https://virgool.io/Travelogues/georgia-trip-iodhyyzxz8r9</link>
                <description>سلام و درودخیلی خلاصه میخوام یه راهنمایی از روی تجربه‌ای که توی سفرمون داشتم بنویسماول اینکه چک لیست پیش از سفری که باید داشته باشید عبارت است از:۱- پاسپورت۲- پرینت بیمه نامه سفر۳- پرداخت عوارض خروج از کشور۴- به همراه داشتن دلار به میزان حداقل ۱۰۰ دلار به ازای هر روز اقامتتون۵- پرینت بلیط رفت۶- پرینت بلیط برگشت۷- ووچر هتل یا پرینت رزرو اقامتگاهبرای بیمه از همین سایت های بیمه آنلاین سفارش دادمعوارض خروج از کشور رو هم از طریق وب سایت https://sadadpsp.ir/tollpayment/ انجام دادمدلار هم به ازای هر نفر ۵۰۰ دلار میشه از طریق اپلیکیشن بله ثبت نام کنید، و مثل من اشتباه نکنید که این کار رو از طریق اپلیکیشن بام انجام بدید، چون هم پولم رفت، و هم درخواستم ثبت نشد و هم دیگه اجازه نمیداد که از طریق بله ثبت نام کنم و با کلی دردسر درستش کردمهر چند واحد پول اونها لاری هست که علامتش رو Gel مینویسن و هر لاری ۱۰۰ تتری میشهشما از ۳ روز پیش از تاریخ پرواز میتونید برای ارز مسافرتی از طریق اپلیکیشن بله اقدام کنیدبلیط رو هم از اسنپ تریپ خریدم و برای اینکه ارزون بیفته، بلیط های رفت رو جداگانه و بلیط برگشت رو هم جداگانه خریدم که بتونم انتخاب آزادی داشته باشمبرای رزرو اقامتگاه هم از طریق وب سایت https://www.booking.com/ اقدام کردم که ثبت نام رو تو وبسایت انجام دادم و مشخصات را از روی پاسپورت ثبت کردم و اقامتگاه های گرجستان که نیاز به پیش پرداخت و پرداخت آنلاین ندارند رو فیلتر کردم و انتخاب کردم و نکته‌ای که وجود داره در مورد انتخاب اقامتگاه، حتما به ورودی ساختمان و حیاطش هم توجه داشته باشیدبعد از همه این ها وقتی که در فرودگاه تفلیس فرود آمدید، میتونید دلار هاتون رو به لاری تبدیل کنید که حتما به تابلو های نرخ ها دقت کنید و اونی که عدد روبروی USDش بیشتر هست رو برای تبدیل انتخاب کنید، بعضی ها نرخشون واقعا پایینه اما اون هایی که نرخشون بالاترین نرخ فرودگاه هست، تفاوتش با داخل شهر، خیلی ناچیزه اما خب به هر حال حداقل به اندازه‌ی هزینه‌ی اقامتگاه و سیم کارت تبدیل کنیدهر لاری در این تاریخ تقریبا معادل ۲۲ هزار تومن بودهزینه‌ی سیم کارتی که من گرفتم شد ۲۰ لاری، که از cellFie گرفتم و به نظرم آنتن دهی بهتری نسبت به GeoCell داشتهمونجا که سیم کارت رو میگرید برنامه Bolt رو نصب کنید و وارد اکانت با همون شماره گرجی که خریدید بشید که اگر یه وقتی شماره‌ای که رو قاب سیمکارت نوشته بود درست نبود، بتونید همونجا شماره‌ی صحیح رو بگیریدبرنامه Bolt هم اپلیکیشن تاکسی اینترنتیه مثل همین اسنپ و تپسی که دیگه شمارو از هر گونه تاکسی های بی رحم نجات میدهبعد برید به سراغ یه بادجه ای هست به نام Bank of gerogia که میتونید ازش کارت بلیط حمل و نقل عمومی تهیه کنید که اینم عکس اون بادجه هست که محیط و ایناش نارنجیه:بادجه Bank of georgiaبه ازای هر نفر باید یک کارت بلیط بگیرید که هزینه‌ی هر کارت ۲ لاری هست، بعد از اینکه کارت بلیط رو گرفتید برید اونطرف یک سری دستگاه خودپرداز مانند هست که میتونید با اون دستگاه ها این کارت هایی که خریدید رو شارژ کنید که در اون زمان هزینه‌ش به ازای ۲۴ ساعت ۳ لاری بود، توصیه میکنم بیشتر از یک روزه هم شارژش نکنید و هر جا که نیاز بشه، از این دستگاه ها پیدا میشه که بخواید شارژ کنید؛ این هم عکس دستگاه:خودپردازای bank of Georgiaحالا نکته‌ای که وجود داره اینه که این دستگاه ها میتونن پول نقد رو از اون قسمته دریافت کنن و میتونید ۳ تا سکه‌ی ۱ لاری بندازید تا بشه ۳ لاری و شارژ رو انجام بده، حتما اول گزینه هارو بزنید تا وقتی که به مرحله‌ی پرداخت رسید سکه هارو بندازید.و با یک اشتراک یک روزه هر مقدار که بخواید میتونید مترو یا brt یا اتوبوس یا ون یا تلکابین رو سوار بشیدبعد برای اینکه بدونید چطور از حمل و نقل عمومی استفاده کنید هم کافیه که اپلیکیشن Google maps یا همون نقشه ی گوگل رو تو گوشیتون باز کنید و مقصدی که میخواید برید رو انتخاب کنید و گزینه‌ی public transport یا حمل و نقل عمومی رو بزنید که انواع مسیر ها و شماره اتوبوس یا مترو یا ون هایی که لازمه سوار بشید رو براتون بیاره و کاملا هم این شماره ها روی حمل و نقل های عمومیشون مشخصه و لازم نیست زبونشون رو بلد باشیدو اینکه باز اگر سوالی داشتید میتونید تو کامنت ها بپرسید اگر بلد بودم میگم خدمتتون</description>
                <category>Sajjad</category>
                <author>Sajjad</author>
                <pubDate>Mon, 28 Oct 2024 14:38:31 +0330</pubDate>
            </item>
                    <item>
                <title>دیباگر PHP، با Ubuntu + xDebug + VsCode</title>
                <link>https://virgool.io/@SajjadSajjad/phpdebug-llzhcei7gh52</link>
                <description>X debugابتدا php رو کانفیگ کنید به این صورت که اینا باید تو/etc/php/7.4/cli/php.iniنوشته شده باشن و کامنت نباشنhtml_errors = On
display_errors = On
display_startup_errors = On
error_reporting = E_ALLسپس xDebug رو نصب کنید:sudo apt install php-xdebug
sudo systemctl restart apache2.serviceاگر از ورژنی غیر از آخرین ورژن پکیج منیجرتون استفاده میکنید، ورژن رو ذکر کنید به این صورت:sudo apt install php7.4-xdebugحالا محتوای این فایل رو:/etc/php/7.4/mods-available/xdebug.iniاگه از ورژن ۲ xdebug استفاده می‌کنید به این صورت تغییر بدید:zend_extension=xdebug.so
xdebug.show_error_trace = 1
xdebug.remote_enable = 1
xdebug.remote_autostart = 1و اگر هم از ورژن ۳ استفاده می‌کنید به این صورت:zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yesحالا افزونه‌ی PHP Debug رو هم رو vs code نصب کنید، این لینکه و وقتی هم از همون بخش افزونه های vs code هم که سرچش کنید، اول میاد و بیشتر از سه و نیم میلیون بار هم دانلود شده، همونو نصب کنیدبعد از اینکه نصبش کردید تو پوشه‌ی روت پروژه یه پوشه‌ی با نام زیر بسازید:.vscodeداخلش یه فایل به نام launch.json بسازید و داخل اون هم اینارو بنویسید و فایلو ذخیره کنید:{
    &amp;quotversion&amp;quot: &amp;quot0.2.0&amp;quot,
    &amp;quotconfigurations&amp;quot: [
        {
            &amp;quotname&amp;quot: &amp;quotListen for XDebug&amp;quot,
            &amp;quottype&amp;quot: &amp;quotphp&amp;quot,
            &amp;quotrequest&amp;quot: &amp;quotlaunch&amp;quot,
            &amp;quotport&amp;quot: 9000
        },
        {
            &amp;quotname&amp;quot: &amp;quotLaunch currently open script&amp;quot,
            &amp;quottype&amp;quot: &amp;quotphp&amp;quot,
            &amp;quotrequest&amp;quot: &amp;quotlaunch&amp;quot,
            &amp;quotprogram&amp;quot: &amp;quot${file}&amp;quot,
            &amp;quotcwd&amp;quot: &amp;quot${fileDirname}&amp;quot,
            &amp;quotport&amp;quot: 9000
        }
    ]
}بعد که برید تو بخش دیباگ vsCode که در تصویر زیر مشخص شده، با زدن همون دکمه‌ای که مشخص شده میتونید دیباگر vsCode رو فعال کنید و break point بذارید و اینجور کارارو انجام بدید.vs code debuggerتو این لینک هم یه دست کامل توضیح هست ولی خب برا من با همین مراحل بالا انجام شد.با تشکر از مطالعه‌ و وقتی که گذاشتید، کم و کسری اگه هست بگید لطفا!</description>
                <category>Sajjad</category>
                <author>Sajjad</author>
                <pubDate>Wed, 16 Sep 2020 14:12:47 +0430</pubDate>
            </item>
                    <item>
                <title>کار با View های اندروید در غیر Main Thread یا همون Ui Thread</title>
                <link>https://virgool.io/@SajjadSajjad/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-view-%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%AF%D8%B1-%D8%BA%DB%8C%D8%B1-main-thread-%DB%8C%D8%A7-%D9%87%D9%85%D9%88%D9%86-ui-thread-kmyheoqc8rtv</link>
                <description>همه میدونیم که اپ های اندروید با یه threadی میان بالا که بهش میگیم Main Thread یا Ui Thread و هر کاری هم با ویو ها داشته باشیم باید روی این ترد انجام بدیممثل setText برای TextView یا setVisibility برای هر Viewیی، که اگه ما روی یه ترد دیگه انجامشون بدیم، برنامه کرش میکنهحالا فرض میکنیم که بنا به هر دلیلی نیاز داریم که یه سری از کارهای View رو یه ترد دیگه هندل کنه، اما چطور؟ اصلا مگه میشه؟خبر خوب اینجاس که بعله که میشه ?بدین صورت:ابتدا یه ترد واسه این Viewمون میسازیم و استارت میکنیمش:Kotlin:thread { 
 }Java:new Thread(() -&gt; { 
 }).start();سپس ویویی که میخوایم رو میسازیم، یا مثلا از یه xml میتونیم inflateش کنیم:Kotlin:val myImageView = ImageView(this).apply {
    setImageResource(R.mipmap.ic_launcher)
}Java:new Thread(() -&gt; {
    ImageView myImageView = new ImageView(this);
    myImageView.setImageResource(R.mipmap.ic_launcher);
}).start();حالا Window manager رو از سیستم میگیریم:Kotlin:val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManagerJava:WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);و به این Window manager میگیم که این ویوی مارو نمایش بده:پارامتر اولش اون Viewمون هست و پارامتر دوم هم LayoutParam هست که میشه باهاش پارامتر های یه Window رو ست کرد که ما اینجا فقط یه Object ازش میسازیم و چیزیشو تغییر نمیدیمKotlin:windowManager.addView(myImageView, WindowManager.LayoutParams())Java:windowManager.addView(myImageView, new WindowManager.LayoutParams());اما نکته‌ای که اینجا باهاش مواجهیم اینه که این تابع addView برا این که این view رو نمایش بده باید اول رو همین ترد Looper.prepare رو صدا بزنیم و در انتهای تابع هم Looper.loop رو که در نهایت کد ما اینشکلی میشه:Kotlin:import android.content.Context
import android.os.Bundle
import android.os.Looper
import android.view.WindowManager
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        thread {
            Looper.prepare()
            val myImageView = ImageView(this).apply {
                setImageResource(R.mipmap.ic_launcher)
            }
            
            val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
            windowManager.addView(myImageView, WindowManager.LayoutParams())
            Looper.loop()
        }
    }
}Java:import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
import android.view.WindowManager;
import android.widget.ImageView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

class ActivityMain extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(() -&gt; {
            Looper.prepare();
            ImageView myImageView = new ImageView(this);
            myImageView.setImageResource(R.mipmap.ic_launcher);

            WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
            windowManager.addView(myImageView, new WindowManager.LayoutParams());
            Looper.loop();
        }).start();
    }
}اما اینکه چرا اصن لوپر باید باشه و اینا یه بحث دیگسحالا چه کاریه خب؟ چرا باید اصن هیچوقت همچین کاری کنیم؟یه نمونه‌ی بارزش GlSurfaceه که Rendererی که بهش میدیم تا Frame هارو draw کنه، رو یه ترد مستقل میاد بالا و کار میکنه چون این view یه ماهیت مستقل داره و از سمت native داره ترسیم ها انجام میشه مثل بخش map خود waze، که به خاطر performance واقعا میطلبه این رویه همچین use case هایی هستن که باعث میشن این کارو کنیمبا تشکر از دوست عزیزمون که زحمت تحقیق این مطالب رو کشیدن: https://gist.github.com/DHosseinyاز نظرات و پیشنهاداتون هم استقبال میکنیم، با تشکر از این که وقت گذاشتید و مطالعه کردید!</description>
                <category>Sajjad</category>
                <author>Sajjad</author>
                <pubDate>Thu, 10 Sep 2020 01:11:42 +0430</pubDate>
            </item>
                    <item>
                <title>ELF چیست؟</title>
                <link>https://virgool.io/@SajjadSajjad/elf-%DA%86%DB%8C%D8%B3%D8%AA-pgyqnklwsiwo</link>
                <description>قالب ELF چیست؟وقتی یه کدی رو به طور مثال با C مینویسیم، کامپایلر اول کدهامونو به Object file تبدیل میکنه و بعد Linker از اون ها یه فایل قابل اجرا میسازه.فرمت ELF، مخفف Executable and linking format قالبیه برای همین فایل های باینری قابل اجرا، حالا ممکنه این فایل قابل اجرا یه فایل executable باشه یا یه لایبرری.این فرمت در سیستم های Unixی و شبه Unixی به عنوان استاندارد فایل های باینری انتخاب شده؛ حالا بسته به هر سیستم عاملی که توش قراره یه فایل با فرمت elf ساخته شه و بسته به این که اون فایل لایبرریه یا چیز دیگه، ممکنه پسوند فایل bin یا so یا o یا elf باشه.حالا خود این قالب چه جور ساختاریه؟فایل های ELFی به طور کلی از دو بخش (سرتیتر)Header و (محتوای فایل)File data تشکیل میشهسرتیتر یا Headerاین بخش یه long سی و دو بایتیه که اولش برای مشخص کردن فرمت فایله که با چهار تا Byteی که این زیر می‌بینید شروع میشه، ابتدا 7f به معنای .، سپس 45 به معنای E، سپس 4c به معنای L و 46 به معنای F$ hd /usr/bin/touch | head -5
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|و ما بقیش هم اطلاعاتی از قبیل این که آیا برای فرمت ۶۴ بیته یا ۳۲ بیت و یا این که برا چه سیستم عاملی کامپایل شده.تو توزیع Debian GNU/Linux یه دستور readelf -h هست که میتونید باهاش هدر فایل ELFی رو به طور Human friendly ببینیدمحتوای فایل یا File dataProgram header or Segments:محتوای فایل در ابتدا از یه Program Header یا به عبارتی Segments تشکیل میشه که حاوی اطلاعاتیه برای Runtime؛ این بخش برای این که linker اجازه ی اجرا شدن رو بده استفاده میشه.همچنین Kernel از این اطلاعات به همراه ساختار اطلاعاتی زیربنایی که تو فایل وجود داره، برای تشکیل یک پردازش استفاده میکننهSection header or Sections:سپس محتوای فایل از یک بخش به نام Section Header یا Sections تشکیل میشه که برای linking و relocating استفاده میشهتک تک بخش های فایل باینری توش لیست شده و بیانگر اینه که این بخش ها سایزشون چقدره، نوعشون چیه، آدرسشون کجاست و memory offsetشون چقدرهبیشتر بخوانید:https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/https://linuxhint.com/understanding_elf_file_format/</description>
                <category>Sajjad</category>
                <author>Sajjad</author>
                <pubDate>Fri, 01 May 2020 11:33:31 +0430</pubDate>
            </item>
            </channel>
</rss>