<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های احسان</title>
        <link>https://virgool.io/feed/@ehsaan_me</link>
        <description>توسعه‌دهنده وب • https://ehsaan.me</description>
        <language>fa</language>
        <pubDate>2026-06-07 10:43:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/9526/avatar/7LgnOD.png?height=120&amp;width=120</url>
            <title>احسان</title>
            <link>https://virgool.io/@ehsaan_me</link>
        </image>

                    <item>
                <title>دور‌زدن تحریم‌های گیت‌لب روی سرور</title>
                <link>https://virgool.io/@ehsaan_me/%D8%AF%D9%88%D8%B1%D8%B2%D8%AF%D9%86-%D8%AA%D8%AD%D8%B1%DB%8C%D9%85%D9%87%D8%A7%DB%8C-%DA%AF%DB%8C%D8%AA%D9%84%D8%A8-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-jntpns3uvist</link>
                <description>گیت‌لب چند وقت پیش اعلام کرد که از Microsoft Azure به Google Cloud Platform برای «بهبود تجربه‌ی کاربران» مهاجرت کرد. از اون‌جایی که ایرانی جزو جمعیت جهان محسوب نمی‌شه و تجربه‌ی کاربران ایرانی گیت‌لب هم برای کسی اهمیت نداره، چاره‌ای نداشتیم که در توییتر به فحش به گوگل بسنده کنیم.در این نوشته خیلی کوتاه توضیح می‌دهم که چه‌جوری می‌تونید این تحریم رو دور بزنید. راه اولی که به ذهن شما هم الان رسیده روی سرورهای ایران جواب نمی‌ده، چون فیلترشکن‌ها یا نیاز به GUI دارند یا از یه نوع Transparent Proxy استفاده می‌کنند (مثل OpenConnect) که منجر به قطع همزمان ارتباط شما به سرور (معمولاً SSH) می‌شه.راه بعدی و منطقی‌تر، استفاده از http proxy در خود گیت است؛ کم‌هزینه و بدون درد!قبل از شروع این رو بگم که نوشته رو با فرض این که شما از یه توزیع Debian Based مثل دبیان یا اوبونتو روی سرورتون استفاده می‌کنید نوشتم.یک. سرور پراکسیمتأسفانه همین اول کار باید دست توی جیب مبارکتون بکنید و یه VPS در یکی از کشورهای خارجی به جز کشورهای موردتحریم آمریکا مثل ایران، عراق، سوریه و ... تهیه کنید. می‌تونید از یکی از دوستانتون قرض کنید یا ... .حالا باید بسته‌ی squid رو نصب کنید. squid یه برنامه برای راه‌اندازی http proxy و ftp proxy هست که با کاربردهای متفاوتی مثل پراکسی کش بین سرورهای مختلف به کار میره؛ توی ایران برای دور‌زدن تحریم (و کارهای دیگه).sudo apt install squidحالا فایل etc/squid/squid.conf/ رو با ادیتور دلخواهتون باز کنید، دنبال عبارت http_access deny all بگردید و با عبارت http_access allow all جایگزینش کنید. فایل رو ذخیره کنید و سرویس رو restart کنید.sudo systemctl reload squid
sudo systemctl restart squid? پورت پیش‌فرض squid برای http proxy برابر با 3128 هست. اگه روی سرور فایروال فعال هست، حتماً این پورت رو باز کنید؛ مثلاً برای فایروال ufw می‌تونید از این راهنما کمک بگیرید.دو. سرور ایران!وقتشه که سروری که بدون هیچ گناهی در ایران واقع شده رو به سرور خارجی معرفی کنیم. ما نمی‌خواهیم که کل سرور از پراکسی استفاده کنه، فقط می‌خواهیم که برنامه‌ی git وقتی به gitlab.com وصل می‌شه ازش استفاده کنه.فایل gitconfig./~ رو با ادیتور دلخواهتون باز کنید و متن زیر رو داخلش قرار بدهید.[http &quot;https://gitlab.com&quot;]
proxy = [IP]:3128
sslVerify = false
proxyAuthMethod = basicبدیهی است که به جای [IP] باید آی‌پی سرور خارجی‌تون رو وارد کنید ((:فایل رو ذخیره کنید و حالا امتحان کنید!git clone https://gitlab.com/...چندتا نکتهحتماً حتماً سرویس squid رو در مواقعی که لازمش ندارید متوقف کنید یا برایش نام‌کاربری و رمز‌عبور تعریف کنید. اگه نام‌ کاربری یا رمزعبور داشتید، موقع تنظیم گیت در سرور ایران باید این‌طوری تعریف کنید:proxy = [username]:[password]@[ip]:[port]اگه در سرور پراکسی به مشکل می‌خورید، احتمالاً باید حالت Masquerading رو در بخش NAT فعال کنید. آموزش‌های مختلف درمورد فایروال‌های متفاوت وجود داره، مثلاً برای ufw می‌تونید از این راهنما کمک بگیرید.در آخر، آرزو می‌کنم همه‌ی ما یه روزی بتونیم از این‌جا فرار کنیم ?</description>
                <category>احسان</category>
                <author>احسان</author>
                <pubDate>Sun, 19 Aug 2018 20:24:20 +0430</pubDate>
            </item>
                    <item>
                <title>چندتا توصیه برای کنکوری‌های ریاضی</title>
                <link>https://virgool.io/@ehsaan_me/concours-dtdv0k1qusyy</link>
                <description>بالأخره دیروز منم کنکور ریاضی رو دادم! در این نوشته می‌خوام چیزایی رو بنویسم که با خودم می‌گفتم: «کاش یه نفر بود اینا رو به من می‌گفت». البته کنکور سال دیگه، با نظام تحصیلی جدید (۶-۶) برگزار می‌شه و احتمالا یه سری فرایند‌ها، از فرایندهایی که من و هم‌نسل‌هام طی کردیم متفاوته. اما در کل، کنکور همون کنکوره ((:یک. گول برندها رو نخوریدبر همگان واضح و مبرهن است که مشاغل و بیزینس‌های مربوط به کنکور، از سود‌ده‌ترین بیزینس‌های ایران هستند. دلیلش هم واضحه: پدر و مادرها میخوان که بچه‌هاشون یه دانشگاه خوب و یه رشته خوب قبول شن تا موفق بشن. به همین دلیل و از اون‌جایی که بیشتر بچه‌ها، از طرف پدر و یا مادرشون ساپورت مالی میشن، مؤسسه‌ها، دبیرها و منتشرها می‌تونن هر چقدر دلشون خواست بگیرن و هیچ‌کس براش مهم نیست!گول مؤسسه‌ها، بعضی از دبیرها و منتشرها رو نخورید!خرید درست کتابچون مؤسسه‌ی X الان ۲ هفته‌است با تبلیغات صدا و سیمایی خودش داره یه ملت ۸۰ میلیونی رو آسفالت می‌کنه، واقعا دلیل خوبی نمی‌شه که پس کتاب‌های همون مؤسسه عالی باشن! البته من هم نمی‌گم کتاب‌های اون مؤسسه خوب نیستند. اما به جای این که ببینید دوستانتون، تلویزیون و علی‌الخصوص دبیرها (چه دبیرهای مدرسه و چه دبیرهای کنکور) چی میگن، برید داخل کتاب‌فروشی. از فروشنده بخواید کتاب‌های درس موردنظرتون رو بهتون نشون بده. با خیال راحت کتاب‌ها رو بردارید و ورق بزنید و ببینید می‌تونید با کتاب ارتباط برقرار کنید یا نه؟ خصوصاً اگه کتاب تست می‌خرید، پاسخ‌نامه رو حتماً نگاه کنید.در واقع، شما قرار نیست کتاب‌ها رو برای خوش‌آمد کسی بخرید. اگر دبیر درسِ A، کتاب X رو پیشنهاد کرده، دلیل نمی‌شه که کتاب X بهترین کتاب موجود در بازار باشه.دقت کنید که: مؤسسات و ناشرها، به دبیرهای مطرح هر استان یا شهر بزرگ (حتی دبیرهای آموزش و پرورش) به رایگان کتاب‌های خودشون رو می‌فرستند تا دبیرها بررسی کنند و اگر اشکالی داره، گزارش کنند. معمولاً دبیرها خودشون وقت مراجعه به بازار و بررسی همه‌ی کتاب‌ها رو ندارند؛ بنابراین اکثراًِ همون کتابی رو پیشنهاد می‌کنند که براشون ارسال شده.کلاس‌های کنکورگول‌زننده‌ترین قسمت ماجرا، کلاس‌های کنکور هستند. دبیرهای کنکور با ادعاهای رنگارنگی مثل «دبیر پروازی»، «فارغ‌التحصیل دانشگاه شریف»، «دبیر نمونه‌ی استان در سال ۱۳۰۱» و غیره. تجربه‌ای که من داشتم اینه که سواد و مهارت این دبیرها با ادعاها و تبلیغ‌های رنگارنگشون رابطه‌ی عکس داره. اواسط تابستان با فردی که خودش رو دکتر، دارای دوتا مدرک دکتری و Research Fellow در دانشگاه‌های آمریکا معرفی می‌کرد، کلاس کنکور شیمی گرفتیم. علاوه بر شعور و ادب بسیار ضعیف ایشون، درس‌دادن ایشون هم در حد شهریه‌ای که دریافت کردند نبود. و جالب‌تر این‌که ادعاهای بسیار رنگینی داشتند: تست‌های کنکور رو در ۱۰ ثانیه می‌تونید حل کنید، اگر مرتب سر کلاس‌های من بیاید! و بدتر از همه، کتاب پر‌از‌غلط خودشون رو با شیادی هرچه‌تمام‌تر با قیمت گزافی به ما فروختند. در یک تریبون مناسب‌تر، اسم این دکتر شیاد رو مطرح خواهم کرد.سر کلاسی برید که می‌دونید در اون درس به مشکل می‌خورید. اگر از خودتون اطمینان دارید که درس A رو خودتون می‌تونید مطالعه کنید، هیچ لزومی نداره که سر کلاس برید و الکی پول خودتون رو دور بریزید. چیزی به اسم نکته‌ی کنکوری وجود نداره که بخواید نگران اون باشید، چون وقتی موقع کنکور شد، تقریباً همه‌ی این نکات یادتون میره، البته اگر اصلاً سؤالی هم مربوط به اون نکته بیاد. نهایتاً اگر در درسی به سؤالی برخوردید، می‌تونید از دبیرهای مدرسه یا حتی انجمن‌های آنلاین کمک بگیرید. ولی وقت خودتون رو سر کلاس‌ها تلف نکنید. گول اسم دبیرها رو نخورید.دو. هدفتون رو «درست» مشخص کنیدوقتی از بیش‌تر هم‌کلاسی‌ها می‌پرسیدم که «خب، حالا هدفت چیه؟»، جواب می‌گرفتم: «دانشگاه X»، وقتی می‌پرسیدم «خب چه رشته‌ای؟»، جواب می‌گرفتم «نمی‌دونم، هر چی شد.» فکر می‌کنم این «هر چی شد»، همون عاملی هست که بیش‌تر جمعیت جوون‌های تحصیل‌کرده بیکار هستند. چون معولاً رشته‌ای رو خونده‌اند که خودشون هم نمیدونن برای چی خوندند. به صرف یه لیسانس یا فوق‌لیسانس، در یه شرکت دولتی/خصوصی با حقوق پایه استخدام می‌شن، ازدواج می‌کنند و زندگی‌ای ۱۰۰۰ برابر روتین‌تر از والدینشون رو پیش میگیرن.شما نهایتاً ۴ سال رو در دانشگاه خودتون می‌گذرونید، اما تا آخر عمرتون باید با رشته‌‌تون زندگی کنید. اگر به رشته‌ی هنری علاقه دارید، از همین الان فکر کنکور هنر باشید. شجاع باشید و اگه لازمه جلوی خانواده‌تون بایستید، این زندگی شما و حق شماست، نه زندگی والدینتون. شما قراره آرزوهای خودتون رو زندگی کنید، نه آرزو‌های والدینتون رو. مطمئن باشید اگه علاقه‌ی خودتون رو پیش بگیرید و در اون زمینه موفق بشید، پدر و مادرتون بیشتر خوشحال میشن.متأسفانه برادر‌های خودم، گرفتار همین وضعیت شدند. یکی عاشق ادبیات و فلسفه و دیگری عاشق هنر بود. الان هر دو زندگی روتین نه‌چندان‌مناسبی رو به خاطر تصمیم اشتباهشون در تحصیل رشته ریاضی فیزیک می‌گذرونند و الان رو هم برای تحصیل رشته‌های مورد‌علاقه‌شون، خیلی دیر میدونن.سه. سخت نگیریداین نه شعار تنبل‌هاست، نه شعار علاف‌ها. «سخت نگیرید». هر چقدر موقع آزمون کمتر سخت بگیرید، بهتره. موقع آزمون باید حداکثر آرامش و اعصاب خودتون رو حفظ کنید و تا می‌تونید سوژه‌ی خنده پیدا کنید ((: مثلاً توی ذهن خودتون به لباس مراقب گیر بدید و بخندید.شما قراره کنکور بدید تا زندگی‌تون شروع شه، قرار نیست تمومش کنید. توی این مدت زندگی کنید، بگردید، کشف کنید و ببینید بعد از کنکور چه زندگی‌ای در پیش‌روی خودتونه، در کنارش درس‌تون رو بخونید و مطالعه‌تون رو داشته باشید.فعلاً این سه مورد، نکاتی بود که به نظرم مهم‌تر از همه بودند. البته با چندتا بچه‌های تجربی، انسانی و هنر هم تصمیم گرفتیم که این نوشته رو برای رشته‌های دیگه بسط بدیم و از همین ویرگول منتشر می‌کنیم.شاد باشید (:</description>
                <category>احسان</category>
                <author>احسان</author>
                <pubDate>Fri, 29 Jun 2018 12:13:13 +0430</pubDate>
            </item>
                    <item>
                <title>Rewrite Mapping</title>
                <link>https://virgool.io/Software/rewrite-mapping-oy2c0mvihuhe</link>
                <description>عکس تزئینی است!رفع ادعا: این نوشته را برای اولین بار در وبلاگ خودم به زبان انگلیسی منتشر کردم.یکی از مسائلی که از مدت‌ها پیش علاقه داشتم که حلش کنم، مشکل ارائه‌ی فایل‌های بزرگ به کلاینت‌های محرز‌شده بود. بیش‌تر راه‌حل‌های این مسئله، از کوکی‌ها یا اسکریپت‌های CGI (مثل PHP) استفاده می‌کردند، اما تصمیم گرفتم تا راه‌حل دیگری برای این مسئله پیدا کنم.راه‌حلی که یافتم و تصمیم گرفتم این‌جا آن را شرح دهم، تکنیکی به نام «Rewrite Mapping» که وب‌سرور apache2 آن را ارائه می‌دهد. از این تکنیک برای Rewriteکردن مسیر‌ها به صورت پویا استفاده می‌شود که Schemeهای تابع‌وار را در اختیار RewriteRule می‌گذارد.یک مسئله‌ی ساده‌ترشاید طرح یک مسئله‌ی ساده‌تر برای فهم بهتر این تکنیک بهتر باشد. تصور کنید که ما یک فروشگاه اینترنتی داریم که محصولات متعددی را می‌فروشیم. برای کمک به SEO فروشگاه، به‌جای استفاده شماره‌ی محصولات، از Slug یا نامک آن‌ها می‌خواهیم استفاده کنیم. رابطه‌ی بین شماره‌ی محصولات و نامک آن‌ها را در قالب یک فایل txt به این‌صورت در اختیار داریم:television 993
stereo 198
fishingrod 043
basketball 418
telephone 328حالا، می‌خواهیم هر کاربری که به آدرس product/stereo مراجعه کرد، صفحه‌ی product.php?id=198 برای او نمایش داده شود، همین‌طور درمورد آدرس‌های product/telephone و غیره.ابتدا یک Scope در محدوده‌ی فراتر از Directory انتخاب می‌کنیم، یعنی فایل‌های .htaccess و کانفیگ‌هایی که در تگ &lt;Directory&gt; انجام می‌شوند موردقبول نیستند، من در تگ VirtualHost این کار را انجام دادم.برای این که بتوانیم به صورت پویا از فایل txt که بالاتر اشاره کردم استفاده کنیم، نحوه‌ی Map‌کردن را برای وب‌سرور تعریف می‌کنیم:RewriteMap product2id &quot;txt:/etc/apache2/productmap.txt&quot;این خط به وب‌سرور دستور می‌دهد که فایل productmap.txt (همان فایل txt بالاتر) را بخواند و اطلاعات آن را به صورت یک Scheme تابع‌وار به نام product2id درآورد. این Scheme، مقدار اول را به مقدار دوم هر سطر مربوط می‌کند. حالا از product2id در RewriteRule استفاده می‌کنیم:RewriteRule &quot;^/product/(.*)&quot; &quot;/product.php?id=${product2id:$1|NOTFOUND}&quot; [PT]این خط، در صورت دریافت درخواستی مانند product/stereo از طریق product2id عدد مربوطه رابه دست می‌آورد و به صفحه‌ی صحیح Rewrite می‌کند. اگر شماره‌ی محصول یافت نشد، مقدار NOTFOUND را به جای شماره به فایل product.php می‌فرستد.مسئله‌ی اصلیبه مسئله‌ی اصلی که در ابتدا اشاره کردم برمی‌گردیم. تعامل با پایگاه‌های داده MySQL و ... به طور مستقیم از apache2 می‌تواند مسئله‌ی وقت‌گیر باشد که در نهایت نتیجه‌ی مطلوب هم به‌دست نیاید. راه‌حل بهتر، متصل‌کردن یک برنامه‌ی خارجی (مثلاً یک اسکریپت پایتون) به apache2 است تا بتوانیم مسیرها را به طور پویاتر، Rewrite کنیم.خوش‌بختانه، apache2 از پرتکلی برای Mapping به برنامه‌های خارجی پشتیبانی می‌کند. این پرتکل prg نام دارد و مستندات آن به طور کامل موجود است.فرض کنید که یک فروشگاه محصولات دیجیتال داریم که در ازای دریافت پول، به کاربران اجازه‌ی دانلود فایل‌های بزرگ (مثلاً در حدود ۲ گیگابایت) می‌دهد. ما می‌خواهیم اطمینان حاصل کنیم که خریداران، فایل‌ها را صحیح و سالم دریافت می‌کنند و هم‌چنین امکان توقف/ادامه آن‌ها وجود دارد، بدون این‌که آسیبی به فایل برسد.معمولاً استفاده از PHP در این‌مورد، منجر به کاهش سرعت دریافت، کاهش احتمال دریافت فایل سالم و هم‌چنین عدم امکان توقف/ادامه آن می‌شود. بنابراین به راه‌حل Rewrite Mapping برمی‌گردیم. به‌جای استفاده از کوکی‌ها و CGI، از Token برای احراز‌هویت کاربر استفاده می‌کنیم.فرض می‌کنیم که هر مشتری پس از خریداری فایل، یک URL به صورت https://content.our-site.sh/files/bigFile.zip?token={TOKEN} دریافت می‌کند. می‌خواهیم از طریق Rewrite mapping مطمئن شویم که این {TOKEN} صحیح است و اگر صحیح بود، فایل را به کاربر تحویل دهیم و اگر نه، یک فایل دیگر (مثلاً یک فایل HTML) به آن تحویل دهد.ابتدا Ruleهای مربوط به Mapping را در یک Scope صحیح تعریف می‌کنیم:RewriteEngine on
RewriteCond %{REQUEST_URI} ^/files # make sure the rule only works for files directory
RewriteMap controller &quot;prg:/home/user/public_html/files/controller.py&quot; www-data:www-data
RewriteRule ^(.*)\.zip$ &quot;${controller:%{REQUEST_URI}?%{QUERY_STRING}}&quot; # rewrite all zip filesخط دوم تعیین می‌کند که این دستورات فقط برای فایل‌های دایرکتوری files صادق هستند، خط سوم به مسیر فایل controller.py که همان برنامه خارجی است و هم‌چنین کاربر و گروه مالک آن اشاره می‌کند. خط سوم، یک Rule برای فایل‌های zip داخل دایرکتوری تعریف می‌کند که یک مقدار مشخص و بر اساس متغیرهای درخواست را به برنامه بفرستد. در این‌جا از دو متغیر خاص REQUEST_URI و QUERY_STRING استفاده کردیم که هر دو مختص به درخواست هستند. هم‌چنین مقدار آن‌ها را با یک علامت‌سؤال جدا کردیم تا توسط کتاب‌خانه‌ی urlparse قابل‌شناسایی باشد، بنابراین ورودی‌ای که برنامه می‌گیرید چیزی شبیه به این خواهد بود:/files/bigFile.zip?token={TOKEN}در نهایت، برنامه باید بتواند ورودی را به درستی دریافت و خروجی را چاپ کند. در این مورد، ابتدا مطمئن می‌شویم که TOKEN صحیح است. اگر بود، Query String را از ورودی حذف و باقی‌مانده را چاپ می‌کنیم، در غیر‌این‌صورت به فایل 403 در همان دایرکتوری اشاره می‌کنیم. اسکریپت پایتون ما به این شکل خواهد بود:#!/usr/bin/env python 
import sys
from urlparse import urlparse

while sys.stdin:
	try:
		strLine = sys.stdin.readline().strip()   ## It is very important to use strip!
		uriComponents = urlparse( strLine )
		if uriComponents.query == &quot;token=correct&quot;:
			print uriComponents.path
		else:
			print &quot;/files/403.html&quot;
		sys.stdout.flush()
	except:
		print &quot;NULL&quot;
		sys.stdout.flush()فراموش نکنید که SHEBANG بسیار مهم است! هم‌چنین اسکریپت باید اجازه‌ی execute را داشته باشد و مالک آن، www-data:www-data باشد.اگر همه‌چیز را درست انجام داده باشید، فایل‌های zip در دایرکتوری files تنها درصورتی  به کاربر تحویل داده می‌شوند که token=correct در Query String درخواست باشد، در غیراین‌صورت فایل 403.html به کاربر فرستاده می‌شود. شما می‌توانید این اسکریپت را به یک پایگاه‌داده یا API خارجی متصل کنید. این دیگر بستگی به خلاقیت شما و محدودیت‌های پایتون دارد.و در آخرارسال فایل‌های بزرگ به کلاینت‌ها همیشه می‌تواند چالش‌بر‌انگیز باشد. در این نوشته با هم این مسئله را با Rewrite Mapping حل کردیم که علاوه بر سرعت بالاتر و انعطاف‌پذیری بیش‌تر، اجازه‌ی استفاده از بقیه‌ی قابلیت‌ها و گزینه‌های apache2 را می‌دهد.</description>
                <category>احسان</category>
                <author>احسان</author>
                <pubDate>Thu, 24 May 2018 14:38:01 +0430</pubDate>
            </item>
            </channel>
</rss>