<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر حسین مکرمی فر</title>
        <link>https://virgool.io/feed/@amupxm</link>
        <description>تلاش های یه برنامه نویس برای اجتماعی بودن.</description>
        <language>fa</language>
        <pubDate>2026-04-15 01:35:27</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/129729/avatar/avatar.png?height=120&amp;width=120</url>
            <title>امیر حسین مکرمی فر</title>
            <link>https://virgool.io/@amupxm</link>
        </image>

                    <item>
                <title>۶ کار که در اولین لحظه اتصال به سرور جدید لینوکسی انجام میدم.</title>
                <link>https://virgool.io/CodeLovers/%DB%B6-%DA%A9%D8%A7%D8%B1-%DA%A9%D9%87-%D8%AF%D8%B1-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D9%84%D8%AD%D8%B8%D9%87-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-%D8%AC%D8%AF%DB%8C%D8%AF-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3%DB%8C-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D9%85%DB%8C%D8%AF%D9%85-i6mwjxmyas3a</link>
                <description>یکی از کار هایی که هر برنامه نویسی باهاش خیلی سروکار داره اتصال به سرور های گوناگون تیم ، شرکت و یا مشتری هاست.ولی یه سری تست ها و نکات وجود داره که هر شخصی قبل از استفاده از و  نصب هر سرویسی روی سرور باید رعایت کنه. توی این مقابه با لیست کار های پیشنهادی آقای Gaurav Kamathe از سایت openSource.com اشنا میشیم.اولین بازخوردتوی اولین لحظه باید چک کنین با چه سیستم عاملی طرف هستین ، چه ساختار سخت افزاری داره و چند مدت هست که روشن بوده.برای این کار اول چک کنیم ببینیم با چه موجودی طرف هستیم:لیست فایل های دارای کلمه ریلیز داخل etc  توی ایم مثال ما با یه  centOS طرف هستیم . بعد میتونیم با دیدن فایل centos-release از جزیات بیشتری با خبر بشیم:نسخه CentOsبعد نوبت کرنل و آپ تایم رو چک کردنه:نسخه کرنل و آپتایممطمعن بشیم تنها هستیمیکی از مهم ترین کار ها اینه چک کنین که روی این سرور تنها هستیم. این کار هم امنیت شما رو تظمین میکنه و هم جلوگیری میکنه از به وجود اومدن تداخل های احتمالی .برای این کار از دستورات زیر استفاده میکنیم:تنها خودمم روش :|دستگاه فیزیکی یا مجازیتوی این مرحله باید چک کنیم ببینیم دتسگاهی که ما بهش متصل هستیم یه دستگاه مجازی هست یا خیر.اگر دستگاه مجازی باشه کلماتی مثل KVM ,VirtualBox ,VM  و ... رو قراره ببینید و در غیر این صورت عبارت هایی شامل اسم شرکت تولید کننده.در دو مثال زیر هر دو سرور به صورت مجازی (یکی با VmWare و اونیکی با QEMU شبیه سازی شده ) هستن.سرور QEMUسرور VMWareبرای چک کردن از دستورات :lshw  -c system | grep product | head -1
cat /sys/class/dmi/id/product_name
dmidecode -s system-manufacturerاستفاده کنین.سخت افزار !یکی از مهم ترین استپ هایی که باید چک بشه اینه که بفهمیم سوار چه سخت افزاری هستیم. این چک میتونه خیلی از تصمیمات کلیدی آینده رو تحت تاثیر بزاره ( مثلا گیت لبو نمیشه رو رم ۲ گیگ نصب کرد)برای این کار از cpu  شروع میکنیم و از ram  به شبکه میرسیم.cpumemو دستور ifconfig برای شکبه ( عکس نمیزارم)لیست ریپو ها و برنامه هابرای اینکه بتونین معماری خوبی رو پیاده سازی کنین باید ریپو های جامعی رو قبل از شروع به کار جمع کنین و لیستی از برنامه های موجود روی سیستم داشته باشید.برای انجام این کار روی یه سیستم عامل redHatBased  میتونین از دستورات زیر استفاده کنین:rpm -qa
yum repolist
ls -l /etc/yum.repos.d/yum repolistپروسس ها و سرویس های در حال اجراقدم بعدی و خیلی طبیعی بعد از چک کردن نرم افزار های نصب شده روی سیستم اینه که پروسس های باز ،daemon ها و .. رو چک کنیم.systemctl
ps -ef
ps auxfتوی مثال زیر nginx + یه کانتینر داکر + یه پروسس nodeJs در حال اجرا هستن که میتونه بیشتر منابع رو مصرف کنه و اجرای بقیه برنامه هارو دچار اختلال و کندی کنه ( یه پروسس نود جی اسی وقتی MaxEventListner هاش رو رد بکنه توی یه کانتینر داکری میتونه کاری کنه سیستک حتی ریسارت هم نشه و timeOut بده)در قدم های بعدی بهتره استاتوس SELinux  ، لاگ های موجود ، مشخصات اتصالات دقیق تر شبکه (با setstat  یا ss)رو پیدا کنین و بر اسا اونا تصمیم گیری های آینده خودتون رو انجام بدین.</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Thu, 14 Jan 2021 00:53:34 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از mongodb در deno.js</title>
                <link>https://virgool.io/@amupxm/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-mongodb-%D8%AF%D8%B1-denojs-vta3km6mrrud</link>
                <description>یکی از بخش هایی که NodeJs رو متمایز میکرد استفاده از دیتا بیس فوق العاده قوی MongoDB هست. گتوی این پست خیلی مفید و مختصر استفاده از MongoDb  رو در deno توضیح میدم. در گام اول باید از متصل و نصب بودن MongoDB مطمعن بشبد و آدرس اون رو پیدا کنید . پیشفرض پورت ۲۷۰۱۷ هست . پس توی آدرس localhost:27017 قابل دست رسیه.تو گام دوم با اضافه کردن درایور mongodb شروع میکنیم :import { MongoClient } from &amp;quothttps://deno.land/x/mongo@v0.8.0/mod.ts&quot;

const client = new MongoClient();
client.connectWithUri(&amp;quotmongodb://localhost:27017&amp;quot);طبق معمول اول باید اینتر فیس schema رو مشخص کنیم:interface UserSchema {
  _id: { $oid: string };
  username: string;
  password: string;
};و بعد شروع به اتصال به پایگاه داده میکنیم:const db = client.database(&amp;quotvirgool&amp;quot);const users = db.collection&lt;UserSchema&gt;(&amp;quotusers&amp;quot);بعد برای تست بیاین یه مقدار تستی رو وارد دیتا بیس کنیم:const insertId = await users.insertOne({
  username: &amp;quotuser1&amp;quot,
  password: &amp;quotpass1&amp;quot,
});و بعد اون رو جستجو کنیمconst user1 = await users.findOne({ _id: insertId });توجه داشته باشید که باید از flag --unstable استفاده کنید. پس با دستور زیر میشه کد بالا رو ران کرد:deno run --allow-net --allow-write --allow-read --allow-plugin --unstable virgooly.tsتمامی دستورات insertOne , insertMany , deleteOne , deleteMany, count , findOne, find,aggregate  قابل استفاده هستن ( مثل خود نود)  </description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Mon, 06 Jul 2020 14:24:29 +0430</pubDate>
            </item>
                    <item>
                <title>ابزار مشابه nodemon در deno</title>
                <link>https://virgool.io/justforfun/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-nodemon-%D8%AF%D8%B1-deno-xig1ezhfoiu3</link>
                <description>هر بار راه اندازی مجدد سرور deno برای هر تغییر کوچکی میتونه دیونه کننده باشه! مخصوصا اگه جایی مشکلی چیزی داشته باشید. توی node.js ابزاری به اسم nodemon وجود داشت hotReload بود. به صورتی که شما با هر بار ذخیره مجدد فایل های خودتون سرور خودش رو restart میکرد و جای خالی این ابزار توی deno به شدت قابل لمس کردن بود .فرض کنید قطعه کد زیر سرور شماست و اون رو با نام app.ts ذخیره کردیم .import { serve } from &amp;quothttps://deno.land/std@0.52.0/http/server.ts&quot;
const s = serve({ port: 8000 });
console.log(&amp;quothttp://localhost:8000/&amp;quot);
for await (const req of s) {
req.respond({ body: &amp;quotsimple response for testing hot reload\nby : amupxm&amp;quot });
}بعد برای شروع بهتره دنو رو آپدیت کنیم :$ deno upgradeو چون Denon (همون ابزاری که تلاش برای نصبش داریم) از ویژگی های unstable stdlib استفاده میکنه باید از پرچم (flag) غیر پایدار (--unstable ) استفاده کنیم.$ deno install --allow-read --allow-run --allow-write -f --unstable https://deno.land/x/denon/denon.tsو با کد زیر سرور رو اجرا کنیم:denon run -allow-env -allow-net app.ts:) ولی به نظر من دنو خیلی خوبه ولی خیلی کار داره تا به node برسه !(از نظر package های موجود )</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sun, 05 Jul 2020 14:33:54 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش استفاده از express در deno</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-express-%D8%AF%D8%B1-deno-a2w103k2in1x</link>
                <description>سلام . توی این پست خیلی کوتاه میخایم یه سروریس deno برای api  بسازیم و توش از express استفاده کنیم.(پیشنهاد میشه اول آموزش نصب deno  رو مطالعه کنید).با توجه به ساختار جدید دنو ما نیازی به پکیج منیجر نداریم و این باعث شده کمی افراد در استفاده از این سرویس جدید دچار سردرگمی بشن. من با توجه به عادتی که در استفاده از express  در node.js داشتم خیلی دوست داشتم که بتونم با express توی deno  هم وب سرویس بسازم.برای این کار کافیه از دستور زیر برای import کردن expressiv یا همون express برای deno استفاده کنید:import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotدر گام بعدی به شمابه عملکردی که توی express  داشتیم میتونیم بریم جلو:import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotconst port = 3000;const app = new expressive.App();const server = await app.listen(port);بعد ما فرضا لازم داریم api بسازیم تا اطلاعاتی زمان الان رو نمایش بده:let req_number= 0;app.get(&amp;quot/now&amp;quot,async (req,res)=&gt;{let d= new Date();await res.json([{date : [d.getFullYear() ,d.getMonth() ,d.getDate() ].join(&amp;quot/&amp;quot),request_number : req_number++}]);});بعد با توجه به کد بالا خروجی زیر رو میده که شامل شماره request و تاریخ الانه :بعد بهتره که برای صفحاتی که وجود ندارند اررور 404 بفرستیم که میتونیم مثل ورژن های قدیمی express از کد زیر استفاده کنیم:app.use(async (req,res)=&gt;{res.status= 404;res.json([{error:404 }]);});همون جوری که قابل ملاحظه هست کد ۴۰۴ رو به عنوان header  ارسال کرده .کد کامل :import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotconst port = 3000;const app = new expressive.App();let req_number= 0;app.get(&amp;quot/now&amp;quot,async (req,res)=&gt;{let d= new Date();await res.json([{date : [d.getFullYear() ,d.getMonth() ,d.getDate() ].join(&amp;quot/&amp;quot),request_number : req_number++}]);});app.use(async (req,res)=&gt;{res.status= 404;res.json([{error:404 }]);});const server = await app.listen(port);</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sat, 04 Jul 2020 19:44:07 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش نصب Deno در UBUNTU 20 (+ راهنمای ZSH)</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-deno-%D8%AF%D8%B1-ubuntu-20-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-zsh-wwj3fj0niokh</link>
                <description>برای من تقریبا نیم ساعت زمان بردتا بتونم دنو رو توی سیستم خودم نصب کنم( به دلیل استفاده از zsh ) و دوست دارم این راه ( راحت ترین راه ممکن) رو با شما به اشتراک بزارم.طبق آموزش خود سایت Deno شما برای نصب توی لینوکس و مک از دستور زیر استفاده کنید:curl -fsSL https://deno.land/x/install/install.sh | shدر گام بعدی لازمه که Path  دنو رو برای سیستم خودتون مشخص کنید تا با هر بار تایپ کردن deno توی ترمینال اجرا بشه:cd ~ &amp;&amp; cp .bashrc .bashrc-copy &amp;&amp; echo &#039;export DENO_INSTALL=&amp;quot/home/$USER/.deno&amp;quotexport PATH=&amp;quot$PATH:$DENO_INSTALL/bin&amp;quot&#039; &gt;&gt; .bashrc البته توجه کنید در صورتی که از zsh استفاده میکنید بجای .bashrc از  .zshrc استفاده کنید تو قطعه کد بالایی.و بعد توی گام آخر سورس فایل رو مشخص میکنیم://age az Zsh estefade kardin:
 source ~/.zshrc
// dar qeir in soorat
 source ~/.bashrc</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sat, 04 Jul 2020 16:04:35 +0430</pubDate>
            </item>
                    <item>
                <title>حالت dark/light در vue js</title>
                <link>https://virgool.io/vue-developers/%D8%AD%D8%A7%D9%84%D8%AA-darklight-%D8%AF%D8%B1-vue-js-kczeh0tmkohp</link>
                <description>یکی از ترند های جدید طراحی اضافه کردن حالت Dark/light به وبسایت ها و برنامه ها هست. توی این پست راحت ترین . جامع ترین روش رو مورد بحث قرار میدیم.در اصل به یه دکمه برای تغییر حالت نیاز دارین . پس اول دکمه رو که یه ورودی چک باکس استفاده میکنیم :&lt;a class&gt;
&lt;input type=&amp;quotcheckbox&amp;quot id=&amp;quottheme-switch&amp;quot class=&amp;quottheme-switch&amp;quot v-model=&amp;quotdarkMode&amp;quot /&gt;
&lt;label for=&amp;quottheme-switch&amp;quot&gt;
&lt;span&gt;
&lt;svg viewBox=&amp;quot0 0 285.919 285.919&amp;quot class=&amp;quottheme-switch&amp;quot&gt;
&lt;pathd=&amp;quotM142.959 0C64.131 0 0 64.132 0 142.96s64.131 142.959 142.959 142.959 142.96-64.131 142.96-142.959S221.787 0 142.959 0zm0 260.919V25c65.043 0 117.96 52.917 117.96 117.96 0 65.043-52.917 117.959-117.96 117.959z&amp;quot/&gt;
&lt;/svg&gt;
&lt;/span&gt;
&lt;/label&gt;
&lt;/a&gt;
در کد بالا از یه svg برای نمایش یه شکل گرافیکی استفاده شده که با توجه به نیاز خودتون میتونین اون رو تغییر بدین و مقدار darkmode رو برای مدل اینپوت خودمون ست میکنیم.در ادامه با توجه به ظاهر خیلی ابتدای از کد sass زیر رو برای اسکریپت خودتون اضافه کنید :input.theme-switch {
display: none;
}
input.theme-switch+label {
cursor: pointer;
}
input.theme-switch:not(:checked)+label:hover {
cursor: pointer;
}
input.theme-switch+label:active,
input.theme-switch:checked+label {
cursor: pointer;
}
svg.theme-switch {
fill: var(--dnicon);
width: 0.8em;
}توی کد sass بالا مقداری به اسم var(--dnicon) رو میبینین. در اصل این مقدار برابر یک متغیر رنگی هست که شما میتونین اون رو ست کنید. مثل عکس زیر :و الان وقتشه که قابلیت تغییر تم رو به دکمه ای که ساختیم اضافه کنیم:export default {
name: &amp;quotdarkMode&amp;quot,
data() {
return {
darkMode: true,
darkIconColor: &amp;quot#4B4E64&amp;quot
};
},
mounted() {
localStorage.setItem(&amp;quottheme&amp;quot, &amp;quotdark&amp;quot);
let bodyElement = document.body;
bodyElement.classList.add(&amp;quotapp-background&amp;quot);
let htmlElement = document.documentElement;
let theme = localStorage.getItem(&amp;quottheme&amp;quot);
if (theme === &amp;quotdark&amp;quot) {
htmlElement.setAttribute(&amp;quottheme&amp;quot, &amp;quotdark&amp;quot);
this.darkMode = true;
} else {
htmlElement.setAttribute(&amp;quottheme&amp;quot, &amp;quotlight&amp;quot);
this.darkMode = false;
}
},
watch: {
darkMode: function() {
let htmlElement = document.documentElement;
if (this.darkMode) {
localStorage.setItem(&amp;quottheme&amp;quot, &amp;quotdark&amp;quot);
htmlElement.setAttribute(&amp;quottheme&amp;quot, &amp;quotdark&amp;quot);
} else {
localStorage.setItem(&amp;quottheme&amp;quot, &amp;quotlight&amp;quot);
htmlElement.setAttribute(&amp;quottheme&amp;quot, &amp;quotlight&amp;quot);
}
}
}
};و تمام! شما یک تم خیلی زیبا دارید.(سعی دارم برای این که کامپوننت بسازم . اگه شد میزارم توی npm و این پست رو ادیت میزنم)</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Tue, 26 May 2020 16:14:22 +0430</pubDate>
            </item>
                    <item>
                <title>نصب کامل Lampp در UBUNTU 20.04</title>
                <link>https://virgool.io/@amupxm/ubuntu20lampp-txtuszchgeve</link>
                <description> من نتوستم منبع فارسی خوبی برای این کار پیدا کنم پس برای اولین بار شروع کردن به نوشتن . امیدوارم بدون اشتباه تایپی و املایی باشه و بتونه مشکلتون رو حل بکنه.گام اول :نصباول از آپاچی فرندز آخرین نسخه lampp رو دانلود کنید ( از این لینک استفاده کنید ) . با توجه به نسخه ی دانلود شده ی شما اسم فایل دانلود شده یه چیزی شبیه به این قراره باشه [xampp-linux-x64-7.4.5-0-installer.run] . بعد با باز کردن ترمینال [CTRL  + ALT + T] میریم توی دایرکتوری دانلود ها :cd ~/Downloadsبعد باید فایل دانلود شده ی خودمون رو تبدیل به فایل قابل اجرا بکنیم . برای این کار از دستور زیر استفده میکنیم : sudo chmod 755 xampp-linux-*.runو باید بعدش دسترسی اجرا شدن فایل رو تایید کنیم:ls -l xampp-linux-x64-*.runالان با دستور زیر روابط کاربری گرافیکی بخش نصب xampp رو بالا میاریم و با چند کلیک ساده (همون next next زدن ) عملیات نصب رو انجام میدیم .sudo ./xampp-linux-*.runفقط توجه داشته باشید که تیک بخش XAMPP developer files رو برندارین. در ادامه با یه صحنه ی لودینگ  نسبتا طولانی مواجه میشیم و آخرش میرسه به اسکرینی که میپرسه داداش لازم داری لانچ گرافیکی کنم ؟ و یه  دکمه ی finish نامی هم پایینش قراره دیده بشه که اونو بزنید .الان نصب شما تموم شده و میتونین با دستور زیر اجرا کنید : sudo /opt/lampp/lampp startو قابل مشاهده هست که توی دایرکتوری /opt/lampp نصب شده و طبیعتا پوشه ی htdocs که همون پوشه ی شیر شده هستند توی /opt/lampp/htdocs هست .گام دوم : اشکال یابی ‍‍‍۱. اگه اجرای apache فیل (fail ) بشه :این به ما این معنی رو میرسونه که یه سرویس دیگه آپاچی داره اجرا میشه و ما باید اون رو ببندیم که به سادگی با این خط دستوری آپاچی رو میبندیم و با خط دومی سرویس لمپ رو ریستارت میزنیم تا آپاچی سرورش که اجرا نشده بود به درستی اجرا بشه :sudo /etc/init.d/apache2 stop  
sudo /opt/lampp/lampp restart۲.مشکل دسترسی sql :که حوضه ی بزرگی از ایرادات رو به وجود میاره این مشکل و توی localhost/phpmyadmin دیده میشه و چون گستردگی این باگ زیاده یه راه حل نسبتا جامع رو برای اون مطرح میکنم.      بخش اول :باید کانفیگ رو به این صورت تغییر بدین (config.inc.php ) که اول اون رو با خط فرمان زیر اجرا میکنیم‌:sudo nano /opt/lampp/phpmyadmin/config.inc.php  و مقادیر رو به صورت زیر تغییر میدیم .که فقط جاهایی که نوشتم //*HERE*// رو لازمه تغییر بدین و به جای ROOT_PASSWORD_HERE پسورد خودتون رو اضافه کنید و لمپ رو ریستارت بزنید :sudo /opt/lampp/lampp restart      بخش دوم :این بخش رو زمانی به کار ببرین که روش بالا برای شما کارساز نبود و ارور های زیر رو مشاهده کردین :ERROR 1698 (28000): Access denied for user &#039;root&#039;@&#039;localhost&#039;
mysqli::real_connect(): (HY000/1045): Access denied for user &#039;root&#039;@&#039;localhost&#039; (using password: yes)
mysqli::real_connect(): (HY000/2002): No such file or directory ubuntu اکثرا فکر میکنن که علت این باگ متفاوت بودن owner با root هست ولی مشکل اینجاست که به علت مشکلات قبلی تیبل های sql شما ساخته نشده ! و اون رو باید دستی اضافه کردقدم اول : ورود به پنل sql با دستور زیر و دسترسی روت :sudo mysql -p -u rootساخت یه su جدید برای PHP my admin ما باید یوزر root رو با پسورد روت خودتون بسازی پس  ROOT_PASSWORD_HERE رو با پسورد خودتون تغییر بدین و در خط کد بعدی ما دسترسی کامل رو به یوزر جدید خودمون میدیم :)CREATE USER &#039;root&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;ROOT_PASSWORD_HERE&#039;;GRANT ALL PRIVILEGES ON *.* TO &#039;root&#039;@&#039;localhost&#039; WITH GRANT OPTION;و بعد طبق معمول میایم و لمپ رو ریستارت میزنیم .این آموزش رو وقتی سر کلاس مجازی بودم نوشتم و ممکنه اشتباه املایی و نگارشی زیادی داشته باشه ( استاد یه ریز حرف زد :|‌استاد تروخدا این پست رو نبین )</description>
                <category>امیر حسین مکرمی فر</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Wed, 13 May 2020 17:05:09 +0430</pubDate>
            </item>
            </channel>
</rss>