<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مصطفی کاظمی</title>
        <link>https://virgool.io/feed/@mkay1375</link>
        <description>توسعه‌دهنده جاوا و اندکی جاوا اسکریپت | در تپسی</description>
        <language>fa</language>
        <pubDate>2026-06-16 12:25:15</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/7849/avatar/tioGhm.png?height=120&amp;width=120</url>
            <title>مصطفی کاظمی</title>
            <link>https://virgool.io/@mkay1375</link>
        </image>

                    <item>
                <title>نصب Redis و RedisInsight با Docker</title>
                <link>https://virgool.io/@mkay1375/install-redis-and-redisinsight-using-docker-uu4xlb44i5rc</link>
                <description>یکی از دیتا استورهای معروف و محبوبِ خانواده‌ی NoSQLها، Redis (مخفف Remote Dictionary Server) هستش که دیتا رو داخل رم نگه می‌داره؛ از ردیس میشه به عنوان دیتابیس، کش و message broker استفاده کرد؛ ردیس ساختمان داده‌های مختلفی مثل رشته، هش، لیست، set و ... رو پشتیانی می‌کنه (برای توضیحات بیشتر در مورد ساختمان داده‌های ردیس می‌تونید به این لینک مراجعه کنید) و داخل خودش قابلیت replication، ذخیره بر روی دیسک، تراکنش و تامین high availability رو داره.ما توی این مقاله قصد داریم یه ردیس به همراه RedisInsight که ابزار تحت وب برای مانیتورینگ و دسترسی به ردیس هست رو بیاریم بالا.اگه با ردیس آشنا نیستید و دوست دارید بیشتر باهاش آشنا بشید، توی این مقاله یه توییتر ساده رو با استفاده از PHP و ردیس پیاده می‌کنه؛ مقاله انقد خوب نوشته شده که لازم نیست PHP بلد باشید و بیشتر در مورد ردیس و تفکر توی ردیس صحبت می‌کنه.نصب Redis و RedisInsight با استفاده از داکرپیش‌نیازهافرض بر اینه که می‌خوایم Redis و RedisInsight رو روی اوبونتو سرور بریزیم و دایره لغتمون یه مقدار لینوکسی خواهد بود.از اونجایی که می‌خوایم Redis و RedisInsight رو با داکر نصب کنیم لازمه روی سیستممون داکر و داکر کامپوز نصب باشه؛ توی این مقاله گفتم چجوری میشه داکر و داکر کامپوز رو روی اوبونتو نصب کرد.همچنین چون می‌خوایم ایمیج‌ها رو از DockerHub دانلود کنیم لازمه از تحریم‌شکن استفاده کنیم که توی این مقاله فعالسازی شکن توی اوبونتو رو توضیح دادم.برای منابع سخت‌افزاری هم، چون ردیس به صورت single-thread کار می‌کنه نیاز به coreهای زیاد CPU نداریم؛ رم هم لازم نیست سرعت خیلی زیادی داشته و حجمش هم بر اساس نیازتون و میزان داده‌ای که می‌خواید داخلش نگه دارید تعیین میشه؛ فقط نکته مهم اینه که نباید از swap استفاده کنید.در کل ردیس خودش خیلی سبکه و بیشترین چیزی که می‌تونه روی پرفورمنسش اثر بذاره سرعت شبکه هستش؛ برای اطلاعات بیشتر در مورد سرعت و نکات پرفورمنسی می‌تونید به این مقاله یه نگاه بندازید.ایجاد فایل کانفیگ Redisاول از همه برا اینکه خیلی درگیر sudo و دسترسی و اینا نشیم این دستور رو بزنید تا دسترسی root‌ بگیریم:sudo suیه پوشه برای ردیسمون بسازیم:mkdir -p /opt/redis/config

cd /opt/redisحالا داخل پوشه config یه فایل کانفیگ با نام redis.conf بسازیم:vim config/redis.conf و محتویاتشو این قرار بدیم:port 6379
requirepass my-redis-pass
maxmemory 1gb
maxmemory-policy allkeys-lru
save &amp;quot&amp;quotبا این کانفیگ، ردیس به عنوان کش روی پورت ۶۳۷۹ می‌تونه با پسورد ناامن my-redis-pass حداکثر از ۱ گیگ رم استفاده کنه و وقتی ۱ گیگ حافظه پر میشه با استفاده از الگوریتم LRU، اطلاعاتی که کمتر از بقیه استفاده شدن رو پاک کنه. اینجا خیلی مفصل‌تر توضیح داده.از اونجایی که ردیس خیلی سریعه یه کاربر می‌تونه تا ۱ میلیون پسورد در ثانیه رو امتحان کنه؛ پس برای جلوگیری از حمله brute force از رمز عبور طولانی و غیرقابل حدس استفاده کنید. برای اطلاعات بیشتر در مورد امنیت ردیس به قسمت Security فایل کانفیگ مراجعه کنید.در صورتی که می‌خواید از ردیس به عنوان دیتابیس استفاده کنید (ینی اطلاعات روی دیسک ذخیره بشه) می‌تونید از این کانفیگ استفاده کنید:port 6379
requirepass my-redis-pass
maxmemory 4gb
maxmemory-policy noeviction
save 3600 1
save 300 100
save 60 10000
# appendonly yes
dir /data/توی کانفیگ بالا:میزان maxmemory رو برابر حداکثر مقدار دیتایی که می‌خواید نگه دارید (و البته میزان رم سیستمتون) قرار بدید (اینجا میزان مصرف رم رو تا حدودی گفته).سه خط saveای که نوشتیم به ترتیب به این معنیه که اطلاعاتو ذخیره کن رو دیسک اگه: بعد از ۳۶۰۰ ثانیه ۱ کلید تغییر کنه یا بعد از ۳۰۰ ثانیه ۱۰۰ کلید تغییر کنه یا بعد از ۶۰ ثانیه ۱۰۰۰۰ کلید تغییر کنه؛ بر اساس نیازتون می‌تونید تغییرشون بدید.با سیاستی که برای ذخیره روی دیسک نوشتیم، فرض کنید ظرف ۳۰ ثانیه ۵۰۰۰ کلید تغییر کنه و ردیس به صورت ناگهانی استاپ بشه (مثلا برق بره)؛ ۵۰۰۰تا تغییرمون هم از بین میره! اگر براتون قابل قبول نیست اون خط appendonly رو از کامنت دربیارید (اینکار البته یه سری معایب دیگه داره که می‌تونید اینجا ببینید).برای توضیحات بیشتر و عمیق‌تر میشه یه نگاهی به این صفحه بندازید.ایجاد پوشه و تنظیم دسترسی برای RedisInsightبا فرض اینکه هنوز داخل پوشه opt/redis هستیم، یه پوشه برای RedisInsight می‌سازیم و دسترسیشو میزون می‌کنیم:mkdir -p insight/data
chown -R 1001 insight/dataایجاد فایل docker-compose.yamlیه فایل docker-compose.yaml ایجاد کنیم:vim docker-compose.yamlو محتویاتشو این قرار بدیم:version: &amp;quot3.9&amp;quot
services:
  redis:
    container_name: redis
    image: redis:6.2
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: unless-stopped
    volumes:
      - /opt/redis/data:/data
      - /opt/redis/config:/usr/local/etc/redis
    ports:
      - &amp;quot6379:6379&amp;quot

  redisinsight:
    container_name: redisinsight
    image: redislabs/redisinsight:1.11.1
    restart: unless-stopped
    volumes:
      - /opt/redis/insight/data:/db
    ports:
      - &amp;quot8001:8001&amp;quotاجرای کانتینرهابرای اجرای کانتینرهام کافیه این دستور رو بزنیم:docker compose up -dکه داکر شروع می‌کنه ایمیج‌ها رو دانلود می‌کنه و بعد از دانلود، کانتینرها رو اجرا می‌کنه و بعد از چند ثانیه اون‌ها قابل استفاده خواهند بود.الان ردیس روی پورت ۶۳۷۹ با پسورد my-redis-pass قابل استفاده خواهد بود؛ در ادامه یه مقدار در مورد تنظیم و استفاده از RedisInight صحبت می‌کنیم.تنظیم RedisInsightبعد از اینکه که کانتینرها رو اجرا کردید، اگه مشکل خاصی وجود نداشته باشه باید روی پورت ۸۰۰۱ سرورتون صفحه RedisInsight رو ببینید:http://IP_OR_DOMAIN:8001در زمان نوشتن این مقاله نسخه ۲ RedisInsight هنوز به صورت پایدار عرضه نشده؛‌ در صورت عرضه، سعی می‌کنم مقاله رو آپدیت کنم.حالا روی &quot;I already have a database&quot; کلیک کنید و بعد هم گزینه &quot;Connect to a Redis Database Using hostname and port&quot; رو انتخاب کنید.مشخصات ردیس رو به این شکل وارد کنید:Host: redis
Port: 6379
Name: my-redis
Username: default
Password: my-redis-passحالا ردیسمون که اسمشو گذاشتیم my-redis به لیست دیتابیس‌ها اضافه میشه و با کلیک روی اون بهش وصل میشیم و می‌تونیم از مانیتورینگ و سایر امکانات RedisInsight استفاده کنیم:ردیسمونتمام!برای اطلاعات بیشتر در مورد RedisInsight می‌تونید به صفحه خودش مراجعه کنید.در صورتی که سوالی داشتید در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Tue, 29 Mar 2022 08:47:36 +0430</pubDate>
            </item>
                    <item>
                <title>راه‌اندازی سرور نقشه آفلاین با OpenStreetMap</title>
                <link>https://virgool.io/@mkay1375/install-openstreetmap-with-docker-lgzcu8tgptdu</link>
                <description>اگر بخواید داخل نرم‌افزاری که دارید توسعه می‌دید از نقشه استفاده کنید، سایتای زیادی هستن که این امکان رو بهتون می‌دن؛ اما اگه به هر دلیلی نخواید از اون‌ها استفاده کنید (مثلا نرم‌افزارتون توی شبکه داخلی باشه و دسترسی به اینترنت نداشته) مجبورید که خودتون یه نقشه بالا بیارید.برای بالا آوردن نقشه روی سیستم یا سرور خودتون، ابزارها و نرم‌افزارهای مختلفی مثل ThinkGeo ،MapTiler ،Mapbox Atlas و ... وجود دارن؛ اما ما تو این مقاله قصد داریم در مورد OpenStreetMap صحبت کنیم؛ چرا که:اوپن‌سورسه و خودش و نقشه‌هاش کاملا رایگانن :)نقشه‌هاش توسط یه جای خاص آپدیت نمیشه و با جمع‌سپاری توسط یه جماعت بزرگ آپدیت میشه.هم میشه نقشه یک کشور یا یک قاره رو استفاده کرد و هم میشه نقشه کل دنیا رو گرفت.ایمیج داکرش موجود هست (غیر رسمیه ولی اوکیه) و راه‌اندازیش خیلی دردسر نداره.خیلی پرطرفداره و کتابخونه‌های خوبی (مثل Leaflet) برای استفاده ازش وجود داره.توی تجربه شخصی‌مون، OpenStreetMap کاملا پاسخگوی نیازهامون بوده و احساس نیاز نکردیم تا به سولوشن‌های دیگه فک کنیم.با این اوصاف بریم سراغ نصب و راه‌اندازیش.نصب و راه‌اندازی OpenStreetMap با استفاده از داکرپیش‌نیازهافرض بر اینه که می‌خوایم OpenStreetMap رو روی اوبونتو سرور بریزیم و دایره لغتمون یه مقدار لینوکسی خواهد بود.از اونجایی که می‌خوایم OpenStreetMap رو با داکر نصب کنیم لازمه روی سیستممون داکر نصب باشه؛ توی این مقاله گفتم چجوری میشه داکر و داکر کامپوز رو روی اوبونتو نصب کرد.همچنین چون می‌خوایم ایمیجش رو از DockerHub دانلود کنیم لازمه از تحریم‌شکن استفاده کنیم که توی این مقاله فعالسازی شکن توی اوبونتو رو توضیح دادم.آماده‌سازی محیطبرا اینکه خیلی درگیر sudo و دسترسی و اینا نشیم با زدن دستور پایین دسترسی root بگیریم:sudo suحالا پوشه‌های مورد نیازمون رو بسازیم و دسترسیشونو میزون کنیم:mkdir -p /opt/osm/data
mkdir -p /opt/osm/tiles
mkdir -p /opt/osm/nodes

chmod 777 /opt/osm/tiles
chmod 777 /opt/osm/nodesدانلود دیتای نقشه (فایل PBF)فایل PBF حاوی دیتای نقشه (اماکن، خیابونا، مرزها و ...) هستش؛ برای دانلود:دیتای تمام کشورها به این لینک مراجعه کنید (در زمان نوشتن این متن حجمش ۶۱ گیگ هست که برای importش به حداقل ۱ ترابایت فضا احتیاج دارید).دیتای یه ناحیه خاص (قاره یا کشور خاص) به این لینک مراجعه کنید.دیتای کشور ایران به این لینک مراجعه کنید.فایل PBF مورد نظرتون رو که دانلود کردید داخل مسیر opt/osm با اسم data.osm.pbf بریزید؛ البته با این دستورم می‌تونیم مستقیم فایل مربوط به کشور ایران رو داخل خود سرور دانلود کنیم:wget https://download.geofabrik.de/asia/iran-latest.osm.pbf -O /opt/osm/data.osm.pbfوارد کردن (import) فایل PBFاول ایمیج OpenStreetMap رو دانلود کنیم:docker pull overv/openstreetmap-tile-server:v1.6.0اگه بخوایم نقشه یه منطقه کوچیک (مثلا یه کشور) رو import کنیم می‌تونیم از این دستور استفاده کنیم:docker run \
    --rm \
    --name osm-pbf-importer \
    -e THREADS=$(nproc) \
    -v /opt/osm/data.osm.pbf:/data.osm.pbf \
    -v /opt/osm/data:/var/lib/postgresql/12/main \
    overv/openstreetmap-tile-server:v1.6.0 \
    importاما اگه بخوایم نقشه یه منطقه بزرگ یا کل دنیا رو import کنیم بهتره از این دستور استفاده کنیم:docker run \
    --rm \
    -d \
    --name osm-pbf-importer \
    -e THREADS=$(nproc) \
    -e &amp;quotOSM2PGSQL_EXTRA_ARGS=--flat-nodes /nodes/flat_nodes.bin -C 65536&amp;quot \
    -v /opt/osm/data.osm.pbf:/data.osm.pbf \
    -v /opt/osm/nodes:/nodes \
    -v /opt/osm/data:/var/lib/postgresql/12/main \
    overv/openstreetmap-tile-server:v1.6.0 \
    importچندتا نکته در مورد دستور بالا:مقدار THREADS برابر با تعداد هسته‌های موجود (به همراه هسته‌های مجازی) تنظیم شده؛ می‌تونید تعداد کمتری اختصاص بدید.عددی که بعد از C- وجود داره میزان استفاده از رم برای کش (به مگابایت) هستش؛ این رو هم پیشنهاد میشه حداقل دو سوم میزان رم سرورتون قرار بدید (اینجا هم میزان رم سرورمون ۹۶ گیگ فرض شده)؛ اگر مقدار رم سیستمتون کمتر از ۳۲ گیگ هست این مقدار رو حداکثر نصف بذارید.پروسه import نقشه کل دنیا بسته به سیستمتون از چند ساعت تا چند روز ممکنه طول بکشه؛ اینجا می‌تونید چند تا benchmark ببینید.برای دیدن وضعیت import می‌تونید از این دستور استفاده کنید:docker logs osm-pbf-importerبعد از اینکه import تموم شد می‌تونید پوشه nodes رو پاک کنید:rm -rf /opt/osm/nodesاجرای OpenStreetMapبرای اجرای OpenStreetMap هم کافیه این دستور رو اجرا کنیم:docker run \
    --name openstreetmap \
    --restart unless-stopped \
    -p 8080:80 \
    -e THREADS=$(nproc) \
    -e &amp;quotOSM2PGSQL_EXTRA_ARGS=-C 65536&amp;quot \
    -e ALLOW_CORS=enabled \
    -v /opt/osm/data:/var/lib/postgresql/12/main \
    -v /opt/osm/tiles:/var/lib/mod_tile \
    -d overv/openstreetmap-tile-server:v1.6.0 \
    runمقدار THREADS و کش (C-) رو همونطور که بالا گفته شد تغییر بدید.چند لحظه بعد از اجرا، سرور نقشه روی پورت ۸۰۸۰ قابل استفاده خواهد بود:http://IP_OR_DOMAIN:8080برای اطلاعات بیشتر می‌تونید به این صفحه مراجعه کنید؛ من هم در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Sun, 19 Dec 2021 20:29:36 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Elasticsearch و Kibana با Docker</title>
                <link>https://virgool.io/@mkay1375/install-elasticsearch-and-kibana-using-docker-p9enq7t89oyb</link>
                <description>خیلی از نرم‌افزارهایی که امروز باهاشون کار می‌کنیم یا توسعه‌شون می‌دیم به نوعی قابلیت جستجو دارن؛ حالا هر کدوم، این قابلیت رو با روش‌های مختلفی پیاده کردن؛ بعضیا با یه کوئری SQL ساده سرچ رو انجام میدن، بعضیام (مثل گوگل)‌ از یه دنیا ابزار و نرم‌افرار پیچیده استفاده می‌کنن؛ خیلیام برای پیاده‌کردن این قابلیت از  Elasticsearch استفاده می‌کنن؛ Elasticsearch یه موتور جستجوئه که بر مبنای Lucene طراحی شده و امکانات خیلی خوبی برای انجام جستجوی پیشرفته روی حجم زیادی از متن رو به ما میده.اگه بخوایم خیلی ساده روش کار با Elasticsearch رو بگیم به این شکل هستش که ما متن‌هامون رو با استفاده از REST API می‌فرستیم سمت Elasticsearch، اون ایندکسشون می‌کنه و بعد دوباره با فرستادن کوئری، جستجو رو انجام میده و نتایج رو بر می‌گردونه؛ البته برای زبان‌های مختلف، Clientش به صورت Library پیاده شده و لازم نیست مستقیم REST بزنیم!رابط کاربری Elasticsearch گرافیکی نیست و فقط با استفاده از REST APIهاش میشه باهاش کار کرد؛ بنابراین اگر بخوایم اطلاعات رو به صورت گرافیکی (مثلا با نمودار یا جدول) نمایش بدیم، یا باید خودمون نرم‌افزاری طراحی کنیم که اطلاعات رو از Elasticsearch بگیره و نمایش بده یا از Kibana استفاده کنیم.به تعریف خود سایت الستیک، Kibana ابزار گرافیکی برای چرخیدن توی اطلاعات، نمایش دادن اون‌ها و کشف داده‌های جدید از اطلاعات موجوده.Kibanaترکیب Elasticsearch و Kibana (و ابزارهای کمکی مثل Logstash و Beatها که اینجا در موردشون صحبت نمی‌کنیم) باعث شده تا Elasticsearch صرفا یه ابزار جستجو نباشه و توی دنیای DevOpsها، به ابزاری برای جمع‌آوری و تجمیع Logها و رویدادها و مانیتورینگ اونها تبدیل بشه.با این مقدمه بریم سراغ نصبشون.نصب Elasticsearch و Kibana با استفاده از داکرپیش‌نیازهافرض بر اینه که می‌خوایم Elasticsearch و Kibana رو روی اوبونتو سرور بریزیم و دایره لغتمون یه مقدار لینوکسی خواهد بود.از اونجایی که می‌خوایم Elasticsearch و Kibana رو با داکر نصب کنیم لازمه روی سیستممون داکر و داکر کامپوز نصب باشه؛ توی این مقاله گفتم چجوری میشه داکر و داکر کامپوز رو روی اوبونتو نصب کرد.همچنین چون می‌خوایم ایمیج‌ها رو از DockerHub دانلود کنیم لازمه از تحریم‌شکن استفاده کنیم که توی این مقاله فعالسازی شکن توی اوبونتو رو توضیح دادم.نصب Elasticsearch و Kibanaخب اول از همه برا اینکه خیلی درگیر sudo و دسترسی و اینا نشیم با زدن دستور پایین دسترسی root بگیریم:sudo suحالا لازمه مقدار vm.max_map_count رو افزایش بدیم؛ برای اینکه مقدار گفته شده به طور دائم تغییر کنه فایل پایین رو باز می‌کنیم:vim /etc/sysctl.confو این مقدار رو بهش اضافه می‌کنیم (یا اگه وجود داشت تغییرش میدیم):vm.max_map_count=262144برای اینکه مقدار بالا تنظیم بشه باید سیستم ریبوت بشه ولی با دستور پایین می‌تونیم بدون ریبوت مقدار رو تنظیم کنیم:sysctl -w vm.max_map_count=262144حالا بریم پوشه‌‌ی مورد نیازمون رو که قراره دیتا داخل اون قرار بگیره بسازیم و دسترسیش رو میزون کنیم:mkdir -p /opt/elk/elasticsearch/data
chmod g+rwx /opt/elk/elasticsearch/data
chgrp 0 /opt/elk/elasticsearch/data

cd /opt/elkبعد یه فایل docker-compose.yaml بسازیم و محتویاتشو این قرار بدیم:version: &amp;quot3.9&amp;quot
services:
  elasticsearch:
    container_name: elasticsearch
    image: elasticsearch:7.14.1
    restart: unless-stopped
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - &amp;quotES_JAVA_OPTS=-Xms512m -Xmx512m&amp;quot
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - /opt/elk/elasticsearch/data:/usr/share/elasticsearch/data
    ports:
      - &amp;quot9200:9200&amp;quot

  kibana:
    container_name: kibana
    image: kibana:7.14.1
    restart: unless-stopped
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
      ELASTICSEARCH_HOSTS: &#039;[&amp;quothttp://elasticsearch:9200&amp;quot]&#039;
    ports:
      - &amp;quot5601:5601&amp;quotبعد هم دستور پایین رو می‌زنیم تا اجرا بشن:docker compose up -dکه بار اول شروع می‌کنه ایمیج‌ها رو دانلود کنه:بعد از اینکه دانلودشون کرد، بعد از چند ثانیه (تا یکی دو دقیقه) قاعدتا هر دو کانتینر قابل استفاده هستن:که می‌تونیم با رفتن به آدرس سرورمون (مثلا http://192.168.230.128:5601) صفحه Kibana رو ببینیم:http://IP_OR_DOMAIN:5601تمام!چندتا نکته در مورد docker-compose.yaml بالاایمیج‌ها یه مقدار قدیمی هستن (توی زمان نوشتن این متن، آخرین نسخه ۷.۱۵.۲ هستش)؛ برای اینکه بخواید از آخرین نسخه استفاده کنید باید از رجیستری خود سایت elastic استفاده کنید (به جای elasticsearch:7.14.1 بذارید docker.elastic.co/elasticsearch/elasticsearch:7.15.2 و به جای kibana:7.14.1 بذارید docker.elastic.co/kibana/kibana:7.15.2)؛ توی تجربه شخصی رجیستری elastic خیلی اذیت کرد (با شکن و راه‌های دیگه تست کردم؛ یا دانلود نمی‌شد یا خیلی کند بود) برای همین اینجا ایمیجایی که روی DockerHub موجود هستن رو گذاشتم.بهتره که مقدار رم (ES_JAVA_OPTS) رو به شکل نوشته شده تعیین نکنیم؛ یا اصلا محدودیت نذاریم (خودش بر اساس میزان رم موجود بهترین میزان رو اختصاص میده) یا با روشی که اینجا گفته شده انجامش بدیم.برای توضیحات بیشتر می‌تونید به این صفحه و این صفحه مراجعه کنید؛ من هم در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Tue, 07 Dec 2021 13:12:43 +0330</pubDate>
            </item>
                    <item>
                <title>نصب GitLab با Docker</title>
                <link>https://virgool.io/@mkay1375/%D9%86%D8%B5%D8%A8-gitlab-%D8%A8%D8%A7-docker-cuhrag7zsfif</link>
                <description>به عنوان یه توسعه‌دهنده به احتمال زیاد با Git کار کردید و احتمالا کدتون رو، روی یکی از پلتفرم‌های مشهور مثل GitHub یا GitLab یا Bitbucket قرار دادید؛ حالا ممکنه به دلایلی نخواید کدتونو توی اینترنت و روی این پلتفرم‌ها قرار بدید؛ مثلا ممکنه حجم repositoryتون زیاد باشه یا تحریم اذیتتون کنه یا ...خوبی چندتا از این پلتفرم‌ها (مثل GitLab و Bitbucket) اینه که اینا رو میشه به صورت محلی روی سیستم یا سرورهای خودتون (اصطلاحا on-premise) نصب کرد؛ توی تجربه‌ی شخصیم، Bitbucket خیلی امکاناتش کامل هستش اما نیاز به لایسنس داره و پیدا کردن راه دور زدن لایسنسش توی نسخه‌های جدیدش یه خورده سخت شده؛ در مقابل GitLab با امکانات تقریبا کافی به صورت رایگان قابل استفاده هستش؛ البته اون هم یه سری امکانات پولی داره که اگه لایسنسشو تهیه کنید می‌تونید از اون امکانات استفاده کنید؛ برای مقایسه نسخه‌های GitLab می‌تونید به این لینک یه سری بزنید.نسخه رایگان GitLab معمولا، اکثر نیازهامون رو بر طرف می‌کنه؛ بنابراین تصمیم گرفتیم تو این مقاله در مورد نصب GitLab صحبت کنیم.نصب GitLab با استفاده از داکرپیش‌نیازهافرض بر اینه که می‌خوایم GitLab رو روی اوبونتو سرور بریزیم و دایره لغتمون یه مقدار لینوکسی خواهد بود؛ البته روی سیستم‌عامل‌های دیگه به جز مسیرها و بعضی از دستورها فرق دیگه‌ای وجود نداره.از اونجایی که می‌خوایم GitLab رو با داکر نصب کنیم لازمه روی سیستممون داکر و داکر کامپوز نصب باشه؛ توی این مقاله گفتم چجوری میشه داکر و داکر کامپوز رو روی اوبونتو نصب کرد.همچنین چون می‌خوایم ایمیج‌های GitLab رو از dockerhub دانلود کنیم لازمه از تحریم‌شکن استفاده کنیم که توی این مقاله فعالسازی شکن توی اوبونتو رو توضیح دادم.راستی حداقل رم مورد نیاز ۴ گیگ هستش؛ دیسک هم بعد از نصب روی اوبونتو سرور خام حدود ۱۰ گیگ پر میشه.نصب GitLabخب اول از همه برا اینکه خیلی درگیر sudo و دسترسی و اینا نشیم با زدن دستور پایین دسترسی root بگیریم:sudo suحالا داخل پوشه opt یه پوشه برا GitLab بسازیم:cd /opt
mkdir -p gitlab/app
cd gitlabبعد یه فایل docker-compose.yaml بسازیم و محتویاتشو این قرار بدیم:version: &amp;quot3.9&amp;quot
services:
  gitlab:
    container_name: &#039;gitlab&#039;
    image: &#039;gitlab/gitlab-ee:latest&#039;
    restart: unless-stopped
    hostname: &#039;gitlab.local&#039;
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url &#039;https://gitlab.local:8443&#039;
        gitlab_rails[&#039;gitlab_shell_ssh_port&#039;] = 2224
        gitlab_rails[&#039;lfs_check&#039;] = false
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - &#039;8443:8443&#039;
      - &#039;2224:22&#039;
    volumes:
      - &#039;/opt/gitlab/app/config:/etc/gitlab&#039;
      - &#039;/opt/gitlab/app/logs:/var/log/gitlab&#039;
      - &#039;/opt/gitlab/app/data:/var/opt/gitlab&#039;
    logging:
      driver: &amp;quotjson-file&amp;quot
      options:
        max-size: &amp;quot1g&amp;quotبعد هم دستور پایین رو بزنیم تا GitLab اجرا بشه:docker compose up -dاگه همه چی میزون باشه برای بار اول ایمیج GitLab دانلود میشه:بعد با زدن این دستور می‌تونیم وضعیت کانتینتر gitlab رو ببینیم:watch docker psکه بعد از دانلود تو وضعیت starting قرار می‌گیره:ممکنه بعد از چند دقیقه یه بار کانتینر ریست بشه؛ طبیعیه... تا healthy شدنش صبر کنید.بعد از healthy شدن کانتینر می‌تونیم با وارد کردن آدرس سرورمون (مثلا https://192.168.230.128:8443) صفحه GitLab رو ببینیم (توجه کنید که GitLab رو روی پورت 8443 بالا آوردیم):https://IP_OR_DOMAIN:8443یورز پیش‌فرض root هستش؛ پسوردشم با این دستور می‌تونیم ببینیم:cat /opt/gitlab/app/config/initial_root_passwordخب خسته نباشید؛ GitLabمون نصب شد.چندتا نکته در مورد docker-compose.yaml بالاایمیج رو gitlab-ee انتخاب کردیم تا اگه بعدا خواستیم لایسنس بگیریم خیلی راحت بتونیم نسخه رایگانمونو به نسخه پولی تغییر بدیم.هاست‌نیم (hostname) و external_url توی قسمت environment رو باید دامنه سرور قرار بدیم؛ اینجا فرض بر اینه که دامنه سرور gitlab.local هستش.پورت وب و ssh رو به ترتیب تغییر دادیم به 8443 و 2224؛ خواستید با پورت مورد نظرتون replaceشون کنید.توی repositoryهای بزرگ که خیلی سنگین از LFS استفاده می‌کنن ممکنه فیچر lfs_check اذیت بکنه که غیرفعالش کردیم.از اونجایی که GitLab وحشتناک لاگ میندازه (جایی در عرض چند روز حدود ۲۰۰ گیگ لاگ تولید کرده بود) حجم لاگ رو در قسمت logging محدود به ۱ گیگ کردیم.برای توضیحات بیشتر می‌تونید به صفحه GitLab (اینجا) مراجعه کنید؛ من هم در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Mon, 29 Nov 2021 20:43:04 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Docker بر روی Ubuntu</title>
                <link>https://virgool.io/@mkay1375/installing-docker-on-ubuntu-pympj2mir9uy</link>
                <description>تو این مقاله قصد داریم تا با هم، داکر و داکر کامپوز (docker compose) رو روی اوبونتو نصب کنیم؛ البته اول یه مختصر در مورد داکر صحبت می‌کنیم تا اگه یه وقت در موردش اطلاع ندارید باهاش یه کمی آشنا بشید و بعدم نصبش کنیم؛ در آخر هم تمام دستورات نصب رو به صورت یکجا می‌ذاریم.آپدیت: توی نسخه‌های جدید داکر، داکر کامپوز در کنار داکر نصب می‌شه و نیاز به انجام مراحل قسمت نصب داکر کامپوز نیست.داکر چیست؟!داکر مجموعه ابزارهایی هستش که این امکان رو میده نرم‌افزارها رو به همراه نیازمندی‌هاشون (dependencies) پکیج کنیم و اون‌ها رو به صورت ایزوله، روی یک (و یا چند) سیستم عامل اجرا کنیم؛ منظور از ایزوله یعنی اینکه بر اساس سیاست‌هایی که تعریف می‌کنیم، دسترسی‌شون به دیسک، رم، سی‌پی‌یو و شبکه می‌تونه محدود باشه تا اگر یه نرم‌افزاری خراب شد یا قصد خراب‌کاری داشت، بقیه رو نابود نکنه.اگه با مجازی‌سازی و ماشین مجازی آشنا هستید، داکر رو می‌تونیم یه جورایی هم‌ارز VMWare Workstation یا ESXi یا VirtualBox یا OpenStack در نظر بگیریم و کانتینرها (container) رو هم یه جورایی هم‌ارز ماشین مجازی (virtual machine)؛ با این تفاوت که داکر حتما روی یک سیستم عامل نصب میشه (بر خلاف ESXi که نیاز به سیستم عامل نداره) و کانتینرها می‌تونن علاوه بر منابع سخت‌افزاری، از کرنل و تعدادی از سرویس‌های نرم‌افزاری سیستم عامل میزبان به صورت مشترک استفاده کنن؛ در نتیجه حجم کانتینرها به شدت از حجم ماشین‌مجازی می‌تونه کمتر باشه؛ همچنین سرعت بالا اومدشون معمولا خیلی بیشتر از ماشین مجازی هست چون معطل بالا اومدن سیستم عامل نیستن.مقایسه ماشین مجازی و کانتینربحث داکر مفصله و تا همین مقدار بسنده می‌کنیم؛ اگه نیاز دارید بیشتر در مورد داکر بدونید منابع خوب زیادی توی اینترنت موجوده؛ خود سایت داکر هم بد نیست می‌تونید یه نگاهی بهش بندازید.شاید این مقاله هم بد نباشه یه نگاه بهش بندازید:داکر برای توسعه‌دهندگان؛ واقعا به چه دردی میخوره؟!خب بریم سراغ نصب داکر و داکر کامپوز!نصب داکرخب؛ برای نصب داکر، اول از همه چیز، از اونجایی که داکر ما رو تحریم کرده و نمی‌تونیم از سروراش چیزی دانلود کنیم، باید یه فکری به حال تحریم بکنیم؛ توی این مقاله توضیح دادم چجوری شکن رو روی اوبونتو فعال کنید؛ هرچند می‌تونید از بقیه روش‌هایی که آی‌پی‌تونو تغییر میده هم استفاده کنید.نصب داکر روش‌های مختلفی داره؛ روشی که خودم معمولا ازش استفاده می‌کنم و مشکل خاصی باهاش نداشتم روش نصب با استفاده از repository هستش؛ اینجا هم همین روش رو با هم می‌ریم جلو.آپدیت: برای نصب داکر یه روش خیلی راحت وجود داره که البته برای محیط‌های عملیاتی توصیه نمی‌شه:curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.shتمام!تنظیم repositoryاول apt رو آپدیت کنیم و پکیج‌هایی که برا اضافه کردن repository روی HTTPS هست رو نصب کنیم:sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-releaseبعد کلیدای GPG داکر رو اضافه کنیم:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgدر آخرم repository رو اضافه می‌کنیم:echo \
  &amp;quotdeb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&amp;quot | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/nullنصب خود داکردیگه نصب داکر مثل نصب یه پکیج معمولیه:sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.ioبا این دستورم می‌تونیم مطمئن بشیم داکر نصب شده:sudo docker run hello-worldبرا اینکه بتونیم دستور داکر رو بدون sudo اجرا کنیم این دو تا دستورم می‌زنیم:sudo usermod -aG docker $USER

newgrp dockerالان قاعدتا بدون sudo می‌تونیم دستور داکر رو اجرا کنیم ولی اگه یه وخ نشد ترمینال رو یه بار باید ببندیم و دوباره بازش کنیم.نصب داکر کامپوزیه کوچولو در مورد داکر کامپوز:داکر کامپوز ابرازی برای تعریف و اجرای اپلیکیشنای چند کانتینره‌س؛ وقتی ما یه نرم‌افزار طراحی می‌کنیم، احتمالا نرم‌افزارمون به نرم‌افزارای دیگه (مثل دیتابیس و ...) احتیاج داره؛ به وسیله داکر کامپوز و ایجاد یه فایل YAML می‌تونیم نرم‌افزار خودمون و سایر نرم‌افزارایی که بهش احتیاج داریم رو توصیف کنیم و داکر کامپوز بر اساس اون فایل، کانتینرها رو ایجاد کنه. برای توضیحات بیشتر می‌تونید یه سری به صفحه خودش بزنید.برای نصب داکر کامپوز کافیه این دستورات رو اجرا کنیم:sudo mkdir -p /usr/local/lib/docker/cli-plugins

sudo curl -SL https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose

sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-composeبا این دستورم می‌تونیم مطمئن بشیم داکر کامپوز اوکیه: docker compose version
# خروجیش اینه:
# Docker Compose version v2.0.1دستورات نصب داکر و داکر کامپوز به صورت یکجا# Adding Docker Repository

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  &amp;quotdeb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&amp;quot | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

# Installing Docker Engine

sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

sudo usermod -aG docker $USER

newgrp docker

# Installing Docker Compose

sudo mkdir -p /usr/local/lib/docker/cli-plugins

sudo curl -SL https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose

sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-composeدر صورتی که سوالی داشتید در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Mon, 22 Nov 2021 21:14:51 +0330</pubDate>
            </item>
                    <item>
                <title>فعالسازی شکن در Ubuntu Server 18.04 به بالا</title>
                <link>https://virgool.io/@mkay1375/setting-shecan-dns-servers-in-ubuntu-server-tbenjz75b97m</link>
                <description>همونطور که می‌دونید خیلی از سایتا و ارائه‌دهنده‌های خدمات، کشورمون رو تحریم کردن و نمی‌تونیم وارد سایتشون بشیم یا چیزی ازشون دانلود کنیم؛ یکی از راه‌هایی که میشه این تحریم‌ها رو دور زد استفاده از شکن هستش؛ توی این مقاله، فعالسازی شکن توی Ubuntu Server رو با هم انجام می‌دیم؛ در انتها هم یه سری موارد و مشکلات احتمالی رو بررسی می‌کنیم.فعالسازی شکنبرای فعال کردن شکن کافیه DNS رو به آی‌پی‌های شکن تغییر بدیم؛ برای تغییر DNS، باید فایل YAML داخل پوشه/etc/netplanرو تغییر بدیم.من بعد از اینکه اوبونتو رو نصب کردم داخل این پوشه، فایل00-installer-config.yamlبرام وجود داشت؛ فایل رو با vim یا nano باز می‌کنیم:$ sudo vim /etc/netplan/00-installer-config.yaml فایل باید به صورت زیر باشه:network:
  ethernets:
    ens33:
      dhcp4: true
  version: 2این دو خط رو زیر dhcp4 اضافه می‌کنیم:      nameservers:
        addresses: [185.51.200.2,178.22.122.100]توجه کنیم که فایل YAML به فاصله‌ی پشت هر خط حساسه و nameservers باید به میزان برابر با dhcp4 پشتش فاصله باشه؛ در نهایت فایلمون شبیه این باید باشه:network:
  ethernets:
    ens33:
      dhcp4: true
      nameservers:
        addresses: [185.51.200.2,178.22.122.100]
  version: 2بعد از اینکه فایل رو ذخیره کردیم دستور پایین رو می‌زنیم:$ sudo netplan applyاگه مشکل خاصی نباشه چیزی نمی‌گه و DNS تنظیم میشه. تمام!موارد و مشکلاتچندتا interface شبکه دارماین دستور رو اجرا کنید بهتون اسم interfaceای که روش اینترنت دارید رو میگه:$ route | grep &#039;^default&#039; | grep -o &#039;[^ ]*$&#039;اگه دستور route رو پیدا نکرد با این دستورا نصبش کنید:$ sudo apt update &amp;&amp; sudo apt install -y net-toolsفایل YAML توش interfaceای وجود ندارهاول با دستوری که بالا گفته شد اسم interfaceای که روش اینترنت دارید رو در بیارید بعد محتواش رو این شکلی کنید:network:
  ethernets:
    YOUR_INTERFACE_NAME:
      dhcp4: true
      nameservers:
        addresses: [185.51.200.2,178.22.122.100]
  version: 2فایل YAML اصن وجود ندارهیه خورده مشکوک به نظر میاد! داخل پوشه /etc/netplanفایل50-config.yamlرو ایجاد کنید و محتواش رو به شکلی که بالا گفته شد پر کنید. دستور$ sudo netplan applyرو بزنید اگه خطا نده به نظر اوکیه.در صورتی که سوالی داشتید در قسمت نظرات یا ایمیل mkay1375@gmail.com در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Mon, 22 Nov 2021 21:04:29 +0330</pubDate>
            </item>
                    <item>
                <title>بدون احساسات، نمیشه عاقلانه تصمیم گرفت؟</title>
                <link>https://virgool.io/@mkay1375/%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D8%AD%D8%B3%D8%A7%D8%B3%D8%A7%D8%AA-%D9%86%D9%85%DB%8C%D8%B4%D9%87-%D8%B9%D8%A7%D9%82%D9%84%D8%A7%D9%86%D9%87-%D8%AA%D8%B5%D9%85%DB%8C%D9%85-%DA%AF%D8%B1%D9%81%D8%AA-dv7zsqfciuib</link>
                <description>با یه سردرد شروع شد.تقابل عقل و قلب؟«الیوت» (Elliot) مدیر یه شرکت موفق بود؛ خودشم آدم موفقی بود. همکاراش و همسایه‌هاش دوسش داشتن. طناز و بامزه بود. یه همسر،‌ یه پدر و یه رفیق.فقط اینکه سردرد داشت؛‌ سردردای منظم و نه از اون سردرد الکیا که هممون گه‌گداری داریم. سردردایی که مغزو می‌پاچوند و کله رو مثل دریل سوراخ می‌کرد؛ جوری که چشما از حدقه می‌خواست بزنه بیرون.الیوت دارو می‌خورد؛‌ چرت می‌زد؛ سعی می‌کرد استرسشو کم کنه؛ شل کنه؛ تحمل کنه اما سردردا کماکان ادامه داشت. ادامه داشتنش هیچی، هی داشت بدترم می‌شد. بعد چند وقت، انقد سردردا ناجور شده بود که دیگه نمی‌تونست شبا بخوابه یا روزا کار کنه.آخرش رفت پیش یه دکتر. دکترم کارایی که دکترا می‌کننو کرد و آزمایشارو گرفت و بعد از دیدن نتایج خبر بدو به الیوت داد: «یه تومور مغزی، قشنگ روی لوب پیشونی (frontal lobe). قشنگ اونجا؛ می‌بینی؟ اون لکه‌ی خاکستری، اون جلو». لامصب بزرگم بود.جراح، تومور رو در آورد و الیوت رفت خونش. برگشت سرکار؛‌ برگشت پیش خونواده و رفقاش. همه چی خوب و عادی به نظر میومد.بعدش همه چی به شکل افتضاحی ریخت به هم.کیفیت کارش به شدت افت کرد. انجام کارایی که براش مثه آب خوردن بودن، نیاز به کوهی از تمرکز و تلاش داشتن. یه انتخاب ساده بین اینکه از خودکار آبی استفاده کنه یا خودکار سیاه، چند ساعت ازش وقت می‌برد. خطاهای ضایعی می‌کرد و هفته‌ها بیخیالی طی می‌کرد. زمان‌بندیاش کابوس شده بود. جلسه و ددلاین براش معنی نداشت.اولاش، همکاراش براش ناراحت بودن و ضایع‌کاریاشو می‌پوشوندن؛ هیچی نباشه، بنده خدا، یه تومور به اندازه‌ی یه هندونه از کله‌ش بیرون آورده بودن. اما این لاپوشونیا خیلی براشون زیاد شده بود؛ الیوتم عذرای احمقانه‌ای می‌آورد؛ جلسه با سرمایه‌گذار رو به خاطر خریدن یه منگنه ول می‌کنی میری؟ الیوت؟ واقعا؟ چی با خودت فک می‌کنی؟بعد چند ماه افتضاح بالا آوردن تو جلسه‌ها و باقی گندکاریا، حقیقت غیر قابل انکار بود: الیوت، توی جراحی، چیزی بیشتر از تومور از کله‌ش خارج شده بود؛ از نگاه همکارا، اون چیز، یه مقدار زیادی از پول شرکت بود.خب الیوت اخراج شد.اوضاع خونه‌شم خیلی میزون نبود. بازیای لیگ کوچیک پسرش رو نمی‌رفت؛ جلسه اولیا مربیانو به خاطر دیدن فیلم James Bond توی تلویزیون می‌پیچوند؛ یادش رفته بود که همسرش عموماً ترجیح میده تو هفته بیشتر از یه بار با هم صحبت کنن.ازدواجش به جنگ و دعوا کشیده شد؛ البته، یه وقتی به دعوا میگن دعوا که دو طرف یه چیزی براشون مهم باشه که سرش دعوا کنن. زنش ازش داشت آتیش می‌بارید اما الیوت داشت با خودش می‌گفت این چی داره میگه. به جای اینکه دنبال تغییر یا میزون کردن اوضاع باشه و نشون بده که عاشق خونواده‌شه و بهشون اهمیت میده، بی‌تفاوت و منزوی می‌موند. انگار که روی یه سیاره دیگه داشت زندگی می‌کرد.آخرش، همسرش دیگه نتونست تحمل کنه. داد میزد که الیوت همراه با تومور، قلب لعنتی‌شو هم از دست داده. ازش طلاق گرفت و دست بچه‌ها رو گرفت و رفت و الیوت تنها موند.گیج و سرافکنده، الیوت شروع کرد به دنبال راهی که کار و بارشو دوباره میزون کنه. توی چندتا سرمایه‌گذاری بد، گند زد. یه هنرمند کلاهبردار مقدار زیادی از پولشو بالا کشید. یه زن شیادم، متقاعدش کرد که با هم فرار کنن و ازدواج کنن و یه سال بعدم ازش طلاق گرفت و نصف پولشو از چنگش درآورد. تو شهر می‌چرخید و هی توی آپارتمان‌های ارزون‌تر و داغون‌تر زندگی‌شو می‌گذروند تا اینکه بعد چند سال بی‌خانمان شد. برادرش آوردش خونه و زیر پر و بالش گرفتش. دوستاش و خونواده‌ش متحیرانه به مردی نگاه می‌کردن که چند سال پیش تحسینش می‌کردن اما الان همه زندگی‌شو ریخته بود سطل آشغال. هیچ‌کس واقعا نمی‌تونست درک کنه که چرا اینطوری شد. غیرقابل انکار بود که یه چیزی تو الیوت تغییر کرده بود. که اون سردردای شدید، آسیبی بیشتر از درد خالی بود.سوال این بود؛ چی تغییر کرده بود؟برادر الیوت، اونو از این دکتر می‌برد به اون دکتر. داداشش می‌گفت:‌ «اون خودش نیست؛ اون یه مشکلی داره. به نظر خوب میاد اما خوب نیست. باور کنید.»دکترا، آزمایش‌هاشون رو انجام می‌دادن و متاسفانه می‌گفتن الیوت شرایطش کاملاً عادیه. حتی بعضاً بهتر از عادیه. عکس‌های اشعه ایکس (CAN Scan) که ازش گرفته می‌شد همه‌چیز توشون خوب به نظر میومد؛ هوشش کماکان بالا بود، استدلالش درست بود؛ حافظه‌ش عالی بود؛ می‌تونست مدت‌ها در مورد پیامدا و نتایج تصمیمای بدش صحبت کنه؛ می‌تونست در مورد موضوعات مختلف، شیرین و بامزه گفت‌و‌گو کنه. روانپزشکش می‌گفت افسردگی نداره که هیچ، خودباوری بالایی داره و هیچ اثری از اضطراب و استرس مزمن نداره - اصن در مقابل طوفان کم‌کاریاش یه آرامش عجیبی داشت.برادرش نمی‌تونست قبول کنه. یه گیری وجود داشت. یه چیزی رو از دست داده بود.آخر، خیلی مستاصل، الیوت به یه عصب‌شناس مشهور به نام آنتونیو داماسیو معرفی شد.آنتونیو، اول، مثل بقیه دکترا، کارایی که اونا می‌کنن رو انجام داد: یه سری تستای شناختی به الیوت داد. حافظه، بازتاب (عکس‌العمل)، هوش، شخصیت، روابط مکانی، استدلال اخلاقی؛ همه‌چیز چک شد. الیوت هم همه رو خیلی قوی پاس کرد.بعد، داماسیو، یه کاری کرد که بقیه دکترا نمی‌کردن: باهاش حرف زد. ینی قشنگ مفصل باهاش حرف زد. اون می‌خواست که همه چیو درباره‌ش بدونه: همه‌ی اشتباه‌هاشو، همه‌ی خطاهاشو، همه‌ی پشیمونی‌هاشو، اینکه چجوری شغلشو، خانواده‌شو، خونه‌شو و سرمایه‌شو از دست داد. «از تک تک تصمیم‌گیریات برام بگو، پروسه فکریتو برام شرح بده (یا در این مورد، عدم وجود پروسه فکری رو)».الیوت، خیلی مفصل، می‌تونست تشریح کنه که چه تصمیمایی گرفته، اما نمی‌تونست توضیح بده چرا اون تصمیمارو گرفته. اون می‌تونست وقایع و ترتیب اتفاقات رو خیلی سلیس و تعجب برانگیز بیان کنه اما وقتی ازش خواسته می‌شد تصمیماشو تحلیل کنه – که مثلاً چرا تصمیم گرفت که خریدن یه منگنه از دیدن یه سرمایه‌گذار مهم‌تره یا چرا James Bond از بچه‌هاش جالب‌تره – نمی‌تونست چیزی بگه. هیچ جوابی نداشت. جوابی نداشت و ناراحت هم نبود که جوابی نداره. در حقیقت، اصلاً براش مهم نبود.این مردی بود که همه چی‌شو به خاطر تصمیمای بدش و اشتباهاتش از دست داده بود، خود کنترلی نداشت، کامل از فاجعه‌ای که توی زندگیش اتفاق افتاد بود مطلع بود اما همچنان هیچ اثری از پشیمونی، خودخوری و حتی ذره‌ای شرمساری تو وجودش حس نمی‌شد.خیلی از آدما، واسه چیزای خیلی کمتری که الیوت کشیده بود، خودکشی می‌کردن؛ اما اون، با بدبختیاش خیلی راحت بود؛ اصلاً عین خیالش نبود.این شد که داماسیو به یه چیز خفن پی برد: تستای روانشناسی که الیوت اونا رو پشت سر گذاشته بود، برای اندازه‌گیری قدرت فکر کردنش بود؛ اما هیچ کدوم از تستا برای اندازه‌گیری قدرت حس کردن طراحی نشده بودن.تمام دکترا، انقد درگیر توانایی‌های استدلالی الیوت شده بودن که هیچ کدوم به این دقت نکرده بودن که ظرفیت الیوت برای احساس کردن دچار آسیب شده؛ اگرم می‌فهمیدن، هیچ راه استانداردی برای اندازه‌گیری اون آسیب وجود نداشت.یه روز، یکی از همکارای داماسیو یه سری عکسای آزاردهنده و حال به هم زن چاپ کرد؛ عکسایی از قربانیای سوخته، صحنه‌های ناجور قتل، شهرای ویرون شده از جنگ و بچه‌هایی که از گشنگی از بین رفته بودن. بعد عکسا رو یکی یکی نشون الیوت داد.الیوت کاملاً بی تفاوت بود. هیچی حس نمی‌کرد. در واقع انقد بی تفاوت بود که مجبور بود به شکل کلامی بیان کنه که آره اینا واقعاً ناجورن.اعتراف می‌کرد که مطمئناً اگه این عکسا رو قدیم نشونش می‌دادن ناراحت می‌شد و قلبش ‌از ترس و ناراحتی می‌خواست از جا کنده بشه، حالش به هم بخوره؛ اما الان؟ همونطور که نشسته بود اونجا و به تاریک‌ترین جنایتای بشر نگاه می‌کرد،‌ هیچی حس نمی‌کرد.و داماسیو فهمید که مشکل اینه: همچنان که دانش و استدلال الیوت دست نخورده باقی مونده بود، تومور و عمل جراحی، توانایی حس کردن و همدردی کردنشو ضعیف کرده بود. دنیای درونی‌ش دیگه تاریکی و روشنی نداشت؛ فقط یه ابر بزرگ خاکستری بود. رفتن به مراسم تک‌نوازی پیانوی دخترش به اندازه‌ی خریدن یه جفت جوراب، اون حس پر شور و مسرت‌بخش غرور پدرانه رو توش ایجاد می‌کرد؛ از دست دادن یک میلیون دلار، دقیقاً حسی مشابه پر کردن باک بنزین ماشین یا شستن روتختی‌هاش یا دیدن برنامه Family Feud رو داشت. تبدیل شده بود به یه ربات سخنگوی متحرک بی‌تفاوت. ناتوان توی قضاوت ارزش‌ها، توی تشخیص بهتر از بدتر، حالا هر چقد باهوش، الیوت خود کنترلی‌شو از دست داده بود.اما این داستان، یه سوال خیلی گنده رو به وجود میاره: اگه توانایی‌های شناختی الیوت (هوشش، حافظه‌ش، توجه‌ش) توی بهترین شکل بودن، چرا نمی‌تونست تصمیمای درست بگیره؟این سوال داماسیو و همکاراشو آچمز کرد. هممون وقتایی بوده که آرزو می‌کردیم که احساس نداشتیم،‌ چون احساساتمون باعث انجام کارای احمقانه‌ای می‌شد که بعداً مث چی ازشون پشیمون می‌شدیم. قرن‌ها، روان‌شناس‌ها و فلاسفه فکر می‌کردن که آروم کردن یا سرکوب احساساتمون، راه حل تمام مشکلات توی زندگیمونه. اما، اینجا مردی رو داشتیم که از تمام احساسات و همدردیاش به طور کامل کنده شده بود؛ هیچی جز هوش و استدلال نداشت؛ ولی زندگیش خیلی سریع به گند کشیده شده بود. داستان زندگیش علیه تمام دانش موجود درباره‌ی تصمیم‌گیری منطقی و خود کنترلی بود.اما یه لحظه صبر کنید، یه سوال گیج‌کننده‌ی مشابه دیگه هم هست: اگه الیوت هنوز اونقد باهوش بود و می‌تونست برای حل مشکلات تدبیر کنه، چرا توی شغلش با مغز زمین خورد؟ چرا بهره‌وریش تبدیل به یه سطل آشغال آتیش گرفته شد؟ چرا خونواده‌شو ول کرد با وجود اینکه از عواقب داغونش به خوبی با خبر بود؟ اگه کار یا خونواده پشیزی برات مهم نیست، حداقل قدرت استدلالت باید بهت بگه که نگه داشتنشون مهمه،‌ نه؟ ینی، این چیزیه که جامعه‌ستیزام می‌فهمن؛ خب چرا الیوت نمی‌تونست بفهمه؟ واقعاً چقد سخته که هر از چند گاهی خودتو تو بازیای لیگ کوچیک پسرت نشون بدی؟ یه جورایی، با از دست دادن قدرت احساس کردن، الیوت توانایی تصمیم‌گیری‌شو هم از دست داده بود. اون توانایی کنترل زندگیشو از دست داده بود.همه‌ی ما تجربه اینو داشتیم که کاری رو، باید انجام می‌دادیم، اما انجامش ندادیم. هممون کارای مهمو کنار گذاشتیم، به آدمایی که برامون مهمن بی‌اعتنایی کردیم و توی کارایی که نفعی برامون داشتن گند زدیم؛ بعد، فک می‌کنیم به خاطر این بوده که ما نتونستیم به اندازه کافی احساساتمونو کنترل کنیم، ما بیش از حد بی‌نظمیم یا دانش نداریم. با این وجود، داستان الیوت همه اینا رو برد زیر سوال. داستان الیوت ایده‌ی خود کنترلی رو برد زیر سوال. ایده‌ای که میگه ما به وسیله منطقمون می‌تونیم خودمونو وادار به انجام کارایی بکنیم که برامون خوبن؛ با وجود مخالفتای امیال و احساساتمون.برای ایجاد امید توی زندگیمون، ما باید اول احساس کنیم که می‌تونیم زندگیمونو کنترل کنیم. ما باید حس کنیم که به دنبال چیزایی هستیم که می‌دونیم خوب و درست هستن، که دنبال «یه چیز بهتر» هستیم. با این وجود خیلی از ما، با خودمون درگیریم که چرا نمی‌تونیم خودمونو کنترل کنیم. داستان الیوت یه پیشرفت بزرگ توی فهم اینه که چرا همچین چیزی اتفاق میفته. این مرد فقیر، تنها و منزوی، این مردی که خیره‌ به عکسای بدنای خرد شده و تیکه‌های باقی مونده از زلزله که به زندگی خودش طعنه می‌زنن زل زده، مردی که همه چیزشو – تک‌تک داشته‌هاشو - از دست داده، اما هنوز با یه لبخند ملیح در موردشون صحبت می‌کنه، این مرد می‌تونه کلیدی برای انقلاب توی دانسته‌هامون در مورد ذهن انسان باشه؛ اینکه چطوری می‌تونیم تصمیم بگیریم و اینکه واقعاً چقدر خود کنترلی داریم.این نوشته ترجمه‌ای آزاد از بخشی از کتاب Everything Is F*cked: A Book About Hope اثر مارک مانسون بود؛ امیدوارم که لذت برده باشید.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Sat, 01 Feb 2020 14:38:17 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Elasticsearch و Kibana نسخه ۷ به صورت سرویس بر روی ویندوز</title>
                <link>https://virgool.io/@mkay1375/%D9%86%D8%B5%D8%A8-elasticsearch-%D9%88-kibana-%D9%86%D8%B3%D8%AE%D9%87-%DB%B7-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-e5xeqzmummlc</link>
                <description>همونطور که می‌دونید Elasticsearch یه موتور جستجوی توزیع‌شده‌س که با استفاده از کتابخونه‌ی Lucene توسعه داده شده و رابط کاربریش، APIهای REST هستن که روی پروتکل HTTP و (HTTPS) کار می‌کنن. اطلاعات هم به صورت JSON میره و میاد!کار کردن با APIهای REST ساده‌ست اما وجود یه UI تر و تمیز خالی از لطف نیست! Kibana همون UI تر و تمیزی هستش که زندگی رو به شدت راحت‌تر میکنه.با Kibana علاوه بر اینکه راحت‌تر می‌تونیم با Elasticsearch کار کنیم، می‌تونیم اطلاعات رو خیلی خوشگل visualize و monitor کنیم؛ Kibana خیلی کارا می‌کنه؛ بد نیست به صفحه‌ش یه نگاهی بندازید.تصویری از محیط Kibanaدر ادامه می‌خوایم Elasticsearch رو به صورت single-node و در قالب یک سرویس نصب کنیم که با بالا اومدن ویندوز اجرا بشه؛ بعد از اون هم، Kibana رو به صورت سرویس نصب می‌کنیم.نصب Elasticsearchقبل از هر چیز، لازمه جاوا، نسخه ۸ به بالا، روی سیستمون نصب باشه؛ جاوا رو می‌تونید از سایت رسمی (با تحریم‌شکن وارد شوید!) یا از اینجا دانلود کنید.ظاهراً سیاست جدید اوراکل اینه که فقط آخرین نسخه رو می‌شه رایگان و بدون نیاز به اکانت دانلود کرد؛ پس اگر از سایت رسمی می‌خواید دانلود کنید، آخرین نسخه (که در زمان نوشتن این مطلب ۱۲ هست) رو دانلود کنید.بعد از دانلود و نصب جاوا، JAVA_HOME رو در Environment Variables حتما به صورت System Variable تعریف کنید؛ JAVA_HOME، مسیری هست که جاوا اونجا نصب شده.مسیر نمونه:‌ C:\Program Files\Java\jdk-11.0.2حالا Elasticsearch رو از اینجا دانلود کنید؛ توجه داشته باشید این صفحه با آی‌پی ایران باز می‌شه اما لینک دانلود نه! از روش‌های متداول استفاده کنید.بعد از دانلود و اکسترکت کردن، وارد پوشه config بشید و به انتهای فایل elasticsearch.yml این تنظیمات رو اضافه کنید:node.name: master
node.master: true
network.host: 0.0.0.0 # باعث میشه از بیرون ماشین بتونیم بهش دسترسی داشته باشیم
cluster.initial_master_nodes: [&quot;master&quot;]
xpack.license.self_generated.type: basicتمامی تنظیمات (به جز خط آخر) در فایل به صورت کامنت شده وجود داره؛ اگه می‌خواید فایلتون تمیز بمونه، پیداشون کنید و از کامنت در بیارید و مقدارشون رو به شکل بالا تنظیم کنید.حالا وارد پوشه bin بشید و کنسول رو در همین مسیر اجرا کنید.برای اجرای کنسول توی مسیر جاری، با نگه داشتن شیفت، راست کلیک کنید؛ گزینه‌ی Open PowerShell/Command Prompt window here نمایان می‌شه:منوی شیفت + راست کلیکبعد این دستور رو اجرا کنید:.\elasticsearch-service.bat installاگر این عبارتو دیدید، سرویس با موفقیت نصب شده:The service &#039;elasticsearch-service-x64&#039; has been installed.بعد از دستور بالا، دستور زیر رو اجرا کنید:.\elasticsearch-service.bat managerداخل پنجره‌ی باز شده، وارد تب Java بشید و مطمئن بشین java.io.tmpdir مقدار داره:صفحه مدیریت سرویس Elasticsearchدر صورتی که این مقدار به طور کلی وجود نداشت یا جلوش خالی بود، با مسیر دلخواه ایجادش کنید؛ برای مثال:-Djava.io.tmpdir=C:\elstempبعد Services رو باز کنید (با دستور services.msc توی Run می‌شه اجراش کرد)؛ سرویس Elasticsearch به صورت زیر باید موجود باشه:سرویس Elasticsearch در Servicesالان می‌تونید سرویس رو اجرا کنید و Startup Type اون رو هم روی Automatic تنظیم کنید.بعد اینکه Elasticsearch بالا اومد، روی آدرس http://localhost:9200 صفحه زیر رو می‌تونید ببینید:اطلاعات Elasticsearchخب، خداقوت؛ Elasticsearch نصب شد!نصب Kibanaبرای دانلود Kibana می‌تونید به این صفحه مراجعه کنید؛ مشابه Elasticsearch، این صفحه با آی‌پی ایران باز می‌شه اما فایل دانلود نمی‌شه!بعد از دانلود و اکسترکت اون، وارد پوشه config بشید و خط زیر رو به فایل kibana.yml اضافه کنید:server.host: &quot;0.0.0.0&quot;این کار باعث می‌شه خارج از ماشین، بتونیم به Kibana دسترسی داشته باشیم.در صورتی که Kibana رو، روی ماشین دیگه‌ای دارید نصب می‌کنید عبارت elasticsearch.hosts رو داخل همون فایل تنظیمات پیدا کنید و آدرس پیش‌فرض رو به آدرس سرور Elasticsearch تغییر بدید.برای نصب Kibana به عنوان سرویس، لازمه از ابراز NSSM استفاده کنیم (که می‌تونید از اینجا دانلود کنید).بعد از دانلود و اکسترکت NSSM، وارد پوشه‌ای که داخلش فایل nssm.exe وجود داره بشید و به روش گفته شده در بالا، PowerShell یا Command Prompt رو اجرا کنید؛ بعد، این دستور رو وارد کنید:.\nssm install kibanaبعد از وارد کردن دستور بالا این پنجره رو می‌بینید:پنجره NSSMداخل قسمت Path، مسیر فایل kibana.bin (که توی پوشه bin در جایی که Kibana رو اکسترکت کردید قرار داره) رو بدید.مسیر نمونه: D:\Programs\ElasticStack7\kibana-7.0.0-windows-x86_64\bin\kibana.batبعد وارد تب Dependencies بشید و elasticsearch-service-x64 رو به عنوان سرویس وابسته تایپ کنید (بد نیست برای اینکه از اسم سرویس Elasticsearch مطمئن بشید به Services برید و از قسمت Properties اسم سرویس رو دربیارید):اضافه کردن Elasticsearch به عنوان سرویس وابستهاین کار باعث می‌شه تا زمانی که Elasticsearch بالا نیومده، Kibana اجرا نشه و اگر Elasticsearch متوقف بشه Kibana هم متوقف بشه.بعد وارد تب I/O بشید و آدرس فایل‌های لاگ رو به مسیر دلخواه بدید:فایل‌های لاگدر آخر هم، روی دکمه Install service کلیک کنید.اگر همه چی خوب باشه، سرویس kibana رو باید بتونیم توی Services ببینیم:بعد از اجرای اون و گذشت چند ثانیه (تا چند دقیقه، بسته به سیستم)، روی آدرس http://localhost:5601  Kibana رو می‌بینیم:صفحه Kibanaاین هم نصب شد :)نسخه ۷ و ۷/۲ رو، روی ویندوز ۱۰ و ویندوز سرور ۲۰۱۶ تست کردم و مشکل خاصی نبوده؛ اگر مشکل یا نکته‌ای بود در خدمت هستم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Thu, 08 Aug 2019 00:57:11 +0430</pubDate>
            </item>
                    <item>
                <title>حل مشکل ارقام فارسی در جاوای ۹+ در ویندوز</title>
                <link>https://virgool.io/@mkay1375/%D8%AD%D9%84-%D9%85%D8%B4%DA%A9%D9%84-%D8%A7%D8%B1%D9%82%D8%A7%D9%85-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7%DB%8C-%DB%B9-%D8%AF%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-odw8zvmlwcx9</link>
                <description>وقتی از جاوای ۸ به جاوای ۱۰ مهاجرت کردم، زمانی که می‌خواستم پروژه رو اجرا کنم با خطای عجیب NumberFormatException روبرو می‌شدم؛ دقت که کردم دیدم تاریخ لاگ‌ها توی کنسول با ارقام فارسی نوشته می‌شه (توی cmd که علامت سوال می‌افتاد).ارقام فارسی تو کنسول!سری اول که یه چرخی توی گوگل زدم هیچ سرنخی نتونستم پیدا کنم و دوباره برگشتم به جاوای ۸؛ راستش اون موقع خیلیم انگیزه نداشتم برم روی جاوای جدیدتر! بعدتر که جاوای ۱۱ اومد و پایدار شد (و کلیدواژه‌ی دوست داشتنی var اضافه شد)، گفتم لابد این مشکل حل شده و تصمیم گرفتم پروژه‌های جدید رو با جاوای ۱۱ بزنم.اما کماکان مشکل وجود داشت :(این سری که با جدیت بیشتری تو گوگل چرخ زدم فهمیدم که توی جاوای ۹ به بعد، Locale Provider های جاوا، تغییر کرده و به صورت پیش‌فرض از فرمت تعریف شده توی سیستم عامل استفاده می‌کنه و از اونجایی که فرمت ویندوز من روی فارسی تنظیم شده بود این مشکل به وجود می‌اومد.توی ویندوز فرمت رو می‌شه داخل Region در Control Panel تغییر داد.راه حل اول: تغییر فرمت ویندوزخب با تغییر فرمت به انگلیسی مشکل حل میشه اما راه حل مطلوبی نیست!راه حل دوم: تغییر Locale Providerبه سه روش می‌شه Locale Provider رو تغییر داد:۱)‌ تغییر Locale Provider با ارسال آرگومان JVMتوی این روش کافیه وقتی از دستور java استفاده می‌کنید، بلافاصله بعدش این رو اضافه کنید:-Djava.locale.providers=COMPATبه عنوان مثال:java -Djava.locale.providers=COMPAT -jar file.jarاگر از IntelliJ استفاده می‌کنید می‌تونید آرگومان گفته شده رو در قسمت زیر اضافه کنید:Run --&gt; Edit Configurations --&gt; VM Optionsپنجره Run/Debug Configurations در IntelliJ۲) تغییر Locale Provider در کدخودم روش قبلی رو وقتی از Maven استفاده کردم نتونستم اعمال کنم؛ اما با اضافه کردن دستور پایین به تابع main، جواب گرفتم:System.setProperty(&amp;quotjava.locale.providers&amp;quot, &amp;quotCOMPAT&amp;quot);اینم کل تابع main :)۳) تغییر Locale Provider در سطح سیستمبا اجرای این دستور در CMD &#40;به صورت admin&#41;، یه متغیر در System Environment Variables تنظیم میشه و تمامی نرم‌افزارهایی که با جاوا اجرا میشن Locale Providerشون تغییر می‌کنه.setx _JAVA_OPTIONS &amp;quot-Djava.locale.providers=COMPAT&amp;quot /Mامیدوارم روش‌های گفته شده به کارتون بیاد؛ باز اگه راه بهتری سراغ داشتید بگید ممنون می‌شم. ✋</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Sat, 27 Jul 2019 23:42:05 +0430</pubDate>
            </item>
                    <item>
                <title>اندرخم HATEOAS، آخرین سطح استاندارد REST</title>
                <link>https://virgool.io/@mkay1375/hateoas-the-last-level-of-rest-otgaryx5ro3x</link>
                <description>اخیراً چند پروژه‌ی وب‌سرویسی برام پیش اومد که خب با توجه به ترند بودن REST و البته کارا بودنش، از REST استفاده کردم؛ REST توسط آقای فیلدینگ مطرح شد و بعدها مدل تکامل اون، توسط آقای ریچاردسون ارائه شد؛ مدل تکامل REST، در واقع مسیر رسیدن به REST رو از هیچی ترسیم می‌کنه؛ یعنی ما فقط یه شبکه داریم و یه تعداد اپلیکیشن (سرور و کلاینت) که می‌خوان با هم اطلاعات رد و بدل کنن.اگر بخوام خیلی مختصر بهش بپردازم، توی سطح صفر، صرفاً قرارداد می‌کنیم که از پروتکل HTTP برای صحبت کردن با هم استفاده کنیم؛ در سطح یک، قرارداد می‌کنیم که URLها به جای اینکه چیزی شبیه به اسم تابع باشن، مثل: /updateDepartment  ☒ به ریسورس‌ها اختصاص پیدا کنن:/departments  ☑ در سطح دوم، از متد‌های HTTP (مثل GET, POST, PUT و DELETE) برای انجام عملیات‌های مختلف روی ریسورس‌ها استفاده می‌کنیم؛ مثلاً اگر کلاینت بخواد اطلاعات اداره‌ای با آی‌دی ۵ رو آپدیت کنه یک ریکوئست HTTP با متد PUT به همراه اطلاعات جدید، به آدرس:/departments/5می‌فرسته.برای توضیحات بیشتر در مورد REST می‌تونید به مقاله‌ی خوب دوست خوبم مهدی، اصول طراحی RESTful API / بهترین راهکارها، یه سر بزنید!مدل تکامل برای رسیدن به REST واقعیچیزی که اطلاعات دقیقی ازش نداشتم و همیشه ناراحت بودم که REST واقعی رو نتونستم پیاده کنم، کلمه بدطور HATEOAS، همون سطح سه‌ی مدل تکامل بود. تلفظ HATEOAS ظاهراً متفاوته؛ بعضیا می‌خونن heyties بعضیا heyt oas.وقتی شما وارد یک سایت میشید، فقط آدرس اصلی اون سایت رو میدونید (مثلا virgool.io)؛ بعد با لینک‌هایی که داخل هر صفحه وجود داره، وارد قسمت‌های مختلف سایت میشید و از امکاناتش استفاده می‌کنید؛ HATEOAS هم، همین امکان رو به کلاینت میده که فقط با داشتن یک آدرس شروع، بتونه به قسمت‌های مختلف API دسترسی پیدا کنه و ازشون استفاده کنه.برای مثال، وقتی کلاینت برای دریافت اطلاعات اداره‌ی ۵ به آدرس:/departments/5 ریکوئست می‌فرسته این جواب رو میگیره:توی این جواب علاوه بر دریافت اطلاعات اداره، لینک کارکنان اون اداره، مدیرش و آدرسش رو هم می‌گیره؛ عملاً با داشتن یک لینک، به تمام قسمتایی که باهاشون کار داشته دسترسی پیدا می‌کنه.خوشحالی توسعه‌دهنده‌ها برای HATEOAS، سال ۲۰۰۷این ویژگی امکانات خوبی رو بوجود میاره؛ باعث میشه سرور و کلاینت مستقل از هم توسعه پیدا کنن؛ سرور خیلی راحت می‌تونه آدرس ریسورس‌ها رو تغییر بده چون کلاینت پیش خودش آدرسی نگه نمی‌داره. نکته‌ی مثبت دیگه اینکه کلاینت می‌تونه توی APIها گشت و گذار کنه و بخش‌های مختلف رو پیدا کنه؛ یعنی نیاز به مستندسازی کاهش پیدا می‌کنه‌. همچنین سرور می‌تونه قسمت‌های جدید رو که به تازگی اضافه کرده در قسمت لینک‌ها در پاسخ بیاره.در مقابل، پیاده کردن HATEOAS سخته! چه از لحاظ فنی و چه از لحاظ معماری! خصوصاً اینکه ابهامات زیادی وجود داره؛ هیچ قرارداد مشترکی روی اینکه این لینک‌ها از چه طریقی به دست کلاینت برسه وجود نداره؛ هم می‌تونید لینک‌ها رو به شکلی که گفته شد، توی بدنه پاسخ بیارید، هم توی header اون. ابهام دیگه‌ای که بهش برخورد کردم این بود که بعضی جاها لینک‌ها، مشابه بالا، فقط href و rel داشتن، بعضی جاها علاوه بر اونها، type (که مشخص کننده متد http بود) رو هم آورده بودن.از ابهامات صرف نظر کنیم، ابراز مناسب برای پیاده‌سازیش هم محدوده؛ البته که پروژه‌هایی مثل Spring HATEOAS وجود دارن اما باز هم وقتی به نمونه‌کدها نگاه کنید پیاده‌سازی اون کار ساده‌ای نیست. از همه بدتر، کلاینت‌هایی که از HATEOAS استفاده کنن هم، خیلی وجود ندارن (توی تجربه‌ی محدود شخصیم که اصلاً وجود نداشت)؛ یعنی در نهایت مجبوریم، هم مستندات کاملی طراحی کنیم، هم یه فکری برای تکامل API، مثل ورژن دادن (v1/) بکنیم که البته آقای فیلدینگ از این موضوع خیلی شاکی هستن:«دلیل ساخت REST API واقعی، بدست آوردن ویژگی تکامله؛ یک &quot;v1&quot;، یک فحش بد به کاربران API شماست که بجای REST همون RPC/HTTP ساختم!» نقل به مضمون از توییت فیلدینگبا تمام این اوصاف، به نظر نمیاد صرف این حجم از زمان و انرژی برای پیاده کردن HATEOAS که در آخر احتمالاً با استقبال خیلی کمی از کلاینت‌ها روبرو میشه معقول باشه؛ جایی می‌خوندم که به ساختن APIهای REST خودتون بدون HATEOAS ادامه بدید و اصرار داشته باشید که API خودتون رو REST صدا بزنید!نظر شما چیه؟ خصوصا اینکه دیگه REST تنها راهکار برای ارائه وب‌سرویس نیست؛ راهکارهای جالب دیگه‌ای مثل graphQL و gRPC هم هستن!برای نوشتن این پست، مطالبی از اینجا و اینجا و اینجا و اینجا استخراج شد.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Sun, 25 Nov 2018 14:21:25 +0330</pubDate>
            </item>
                    <item>
                <title>داکر برای توسعه‌دهندگان؛ واقعا به چه دردی میخوره؟!</title>
                <link>https://virgool.io/@mkay1375/docker-for-developers-x3kbzxizbna7</link>
                <description>به عنوان توسعه‌دهنده، شاید دوست نداشته باشید بدونید چطوری MongoDB نصب و کانفیگ میشه، اما برای توسعه نرم‌افزارتون بهش نیاز دارید؛ یا میدونید چجوری نصب میشه اما الان روی سیستمتون نصب نیست و حوصله نصبشم ندارید؛ یا حتی شاید نصبم هست اما برای تست، نسخه خاصی (مثلا نسخه قدیمی‌تر) رو لازم دارید... اینجاس که داکر ما رو نجات میده :)داکر این امکان رو میده تا عزیزانی، نرم‌افزارها و ابزارهایی که خیلی پرکاربرد هستن رو، نصب و کانفیگ کنن و تنها کاری که شما باید انجام بدید دانلود و بلافاصله بعدش اجرای اونهاس.اجازه بدید از اینکه چجوری اون عزیزان کارشون رو انجام میدن عبور کنیم و مستقیم بریم ببینیم زحمات اونها چطور به کار ما میاد؛ همون مثال MongoDB خودمون رو در نظر بگیرید؛ با این دستور (با فرض اینکه داکر روی سیستمتون نصبه):docker run -p 27017:27017 mongoداکر یه سری فایل رو (فقط بار اول) دانلود میکنه و در عرض چند ثانیه میتونید از MongoDB روی پورت ۲۷۰۱۷ استفاده کنید.توی سایت dockerhub میتونید تقریبا هر آنچه که نیاز دارید رو پیدا کنید؛ مثل Nginx, Redis, Postgres, MySQL, Memcached و ...البته سایت dockerhub متاسفانه ما رو تحریم کرده که میتونید از شکن یا راه‌های دیگه‌ای که خودتون میدونید استفاده کنید.کاربرد داکر به اینجا ختم نمیشه؛ ممکنه بخواید از نرم‌افزاری (بهتره بگم ابزاری) استفاده کنید که از سیستم‌عامل شما پشتیبانی نمیکنه؛ برای داکر سیستم‌عامل شما (اونقد که به نظر میاد) مهم نیست! اجراشون میکنه :)داکر همچنین برای دیپلوی (deploy) اپلیکیشن‌ها خصوصاً توی دنیای مایکروسرویس کاربرد داره؛ که البته از بحث تا حدودی خارجه و منم تخصصی ندارم.اما حالا یکم بپردازیم به خود داکر:داکر چیست؟!مقایسه ماشین مجازی و کانتینرتعریف‌های خیلی کامل‌تر و سنگین‌تری برای داکر وجود داره اما چیزی که خودم فهمیدم و احساس میکنم درکش ساده‌تر باشه رو خدمتتون میگم. فکر میکنم قبل از تعریف داکر، خوب باشه اول ببینیم داستان کانتینرها چیه.در زمان‌های نه چندان قدیم وقتی میخواستن چندتا نرم‌افزار رو، روی یک سخت‌افزار واحد اجرا کنن، به طوری که مزاحمتی برای همدیگه نداشته باشن - در واقع رم، سی‌پی‌یو و ... اختصاصی برای خودشون داشته باشن - مجبور بودن از ماشین‌های مجازی استفاده کنن.ماشین‌های مجازی خیلی خوب بودن و هستن اما هر کدومشون به یه سیستم‌عامل نیاز دارن و هر سیستم‌عامل مقدار نسبتاً زیادی منابع (خصوصاً هارد و رم) استفاده میکنه.برای رفع این مشکل‌، کانتینرها اومدن به میدون؛ اونها هم مثل ماشین‌های مجازی منابع اختصاصی خودشون رو دارن اما دیگه نیازی به سیستم‌عامل جداگانه ندارن؛ یعنی نیازشون به سیستم‌عامل، تا جای ممکن از طریق خود سیستم‌عامل میزبان، برطرف میشه. عملاً علاوه بر اینکه سخت‌افزار به اشتراک گذاشته میشه، سیستم‌عاملِ روی اون هم به اشتراک گذاشته میشه.حالا با این اوصاف، داکر رو (خیلی خیلی ساده) شاید بشه اینجوری تعریف کرد:داکر،‌ ابزار ایجاد و مدیریت کانتینرهاست؛ شبیه VMware و VirtualBox اما توی دنیای کانتینرها.البته این تعریف کاملا درستی از داکر نیست؛ چون داکر خودش به چند بخش تقسیم میشه و تعریف بالا، تعریف یکی از اون بخش‌هاست؛ ولی به چیزی که داکر در نگاه اول به نظر میاد نزدیک‌تره.همیشه برای من، مواجهه با یه ابزار جدید خیلی خوش‌آیند نبوده؛ چون بیشتر از اینکه توی معرفی خودشون، کاربردشون رو معرفی کنن، خودِ خودشون رو معرفی میکنن. انگیزه من هم برای نوشتن این مطلب این بود که قبل از اینکه با خودِ داکر آشنا بشید، اول ببینید به کارتون میاد یا نه که امیدوارم این کار رو تونسته باشم انجام بدم.ان‌شاءالله در آینده بتونم جزئیات بیشتری از روش نصب داکر و استفاده از اون رو خدمتتون بگم.</description>
                <category>مصطفی کاظمی</category>
                <author>مصطفی کاظمی</author>
                <pubDate>Thu, 04 Oct 2018 21:39:09 +0330</pubDate>
            </item>
            </channel>
</rss>