افزایش حافظه Swap (ارتقا رم) در اوبونتو ۱۸

خیلی وقت بود با مشکل کمبود رم مواجه شده بودم و با اینکه رم سیستمم ۸گیگ بود بازم کم میومد! هنوز نمیدونم چرا! ۲گیگ هم سواپ Swap بود اما فایده ای نداشت. تصمیم بر این گرفتم این حافظه رو ارتقا بدم. اول از همه آیا میدونین Swap چی هست؟

حافظه Swap چیست و چه کاربردی دارد؟

حافظه swap به فایلی تو سیستم اطلاق میشه که کاری مشابه رم سیستم میکنه. به عبارتی خیلی ساده وقتی سیستم عامل حافظه رم کافی نداره، میاد و چیزهایی که نیازه در حافظه موقت و پر سرعت RAM ذخیره بشن رو بر روی هارد دیسک ذخیره میکنه و بعبارتی از فضای هارد بجای رم استفاده میکنه. این کار مزایا و معایبی داره. وقتی رم سیستم کم میاد برنامه ها رو هوا نمیمونن و هنگ نمیکنن یا خطا نمیدن، از طرفی به شدت سرعت سیستم پایین میاد چون در مقابل حافظه های پرسرعت رم، هارد ها مثل فلاپی میمونن. البته هارهای قدیم یعنی HDD و با اومد هارد های SSD کمی این اوضاع بهتر شد و ارزش اینو داره بتونین بیشتر از این فضا استفاده کنین. هاردهای SSD خشک، بدون قطعه متحرک و پرسرعتن. سرعت هارد های معمولی به حدود ۴۰۰ مگابایت بر ثانیه میرسه و هارد های SSD NVMe M.2 به سرعت وحشتناک ۲ گیگابایت بر ثانیه میرسن!

در اوبونتو Swap یه فایله که اطلاعاتی که قرار بود تو رم ذخیره و اجرا بشه، داخل اون ریخته میشه.

چطور حافظه Swap رو در اوبونتو ارتقا بدیم؟

دستورات رو مرحله به مرحله دنبال کنین تا بهتون توضیح بدم:

۱. سواپ Swap رو خاموش کنین، این دستور چیزایی که تو سواپ هست رو به حافظه اصلی همون Ram منتقل میکنه. ممکنه براتون کمی طول بشه (بسته به سرعت هاردتون)

sudo swapoff -a

۲. یک فایل خالی برای swap ایجاد کنید، در اینجا با این دستور ۸ رم ۱گیگابایتی به سیستم اضافه میکنه. عدد جلوی count باید از نوع صحیح باشه.

sudo dd if=/dev/zero of=/swapfile bs=1G count=8

۳.فایل swap رو به سیستم عامل معرفی کنین و بشناسونیدش.

sudo mkswap /swapfile

۴. حالا سواپ رو روشن کنین.

sudo swapon /swapfile

با دستور top یا htop (اگر نصبش کرده باشین) میتونین ببینین چقدر حافظه ایجاد کردین. یا دستور زیر رو استفاده کنین که راحتتره

grep Swap /proc/meminfo

موفق باشید

در ۵ دقیقه پکیج خودتون رو در فریمورک لاراول بسازید (Laravel 5.8)

سلام، بعد مدتها تصمیم گرفتم سعی کنم این عادت نوشتن رو تمرین کنم و چیزهایی که یاد میگیرم رو به وبلاگم اضافه کنم. اخیرا چند روزی درگیر ایجاد و ساختن پکیج تو لاراول بودم. با اینکه خیلی سادست، چند روز واقعا ذهنمو درگیر کرد، همه ریفرنس ها رو خوندم فارسی و انگلیسی، چیزی از قلم افتاده بود اما نمیدونستم چی، حتی نمیدونستم چی رو سرچ کنم! برای حل مشکل تا میتونستم خواستمو ساده کردم همه چیو حذف کردم تا رسیدم به اینکه فقط یک route داشته باشم و نه بیشتر! حتی اسم وندور رو هم که با دش جدا بود تک کلمه ای کردم. مواردی هم بودن که باعث گمراهی من شدن، جلوتر همه رو میگم. بریم که شروع کنیم.

ایجاد پروژه

اول از همه از کد زیر استفاده کنین و یه پروژه جدید ایجاد کنین، من اینجا از لاراول ۵.۸ استفاده کردم (یا پروژه فعلی خودتون رو انتخاب کنین)

composer create-project --prefer-dist laravel/laravel blog "5.8.*"

۲. ساختار فایل ها

مثل تصویر زیر فولدر هایی رو بصورت تو درتو برای پروژه ایجاد کنین. ساختار به این صورت باید باشه که داخل فولدر پروژه فولدر packages ایجاد میکنیم که همه پکیج های ما داخل این فولدر قرار میگیره. حالا داخل فولدر packages فولدری دیگه که وندور ما هستُ vendor میتونه اسم خودتون، نام کاربریتون در گیت هاب باشه. و در آخر هم فولدری با نام پکیجتون ایجاد کنین. در اینجا من نام پکیجم رو easy-comment گذاشتم و داخل این فولدر هم یک فولدر با نام src که محل قرار گیری همه کد های ماست ایجاد کنید. پس تا اینجا ساختار فولدر های من به این صورته:

larave-blog/packages/hamidreza-mozhdeh/easy-comment/src

ساختار فولدر ها برای ایجاد پکیج در لاراول

۳. راه اندازی کومپوزر

از طریق ترمینال وارد فولدر پکیجتون به آدرس packages/hamidreza-mozhdeh/easy-comment   بشین و دستور composer init   بزنین تا یک فایل کامپوزر جدید ایجاد کنیم. کومپوزر از شما سوالاتی میپرسه که اگر خواستین وارد کنین و اگر نه فقط اینتر بزنین تا آخر. بعدا هم میتونین اطلاعات رو ویرایش و تکمیل کنین. در آخر فایل ما به آدرس زیر ایجاد شده:

سوالاتی که بعد composer init پرسیده میشه

packages/hamidreza-mozhdeh/easy-comment/composer.json

داخل فایل کومپوزر من خیلی سادس و بعدا میخوام تغییرش بدم ولی فعلا به این شکله:

{
    "name": "hamidreza-mozhdeh/easy-comment",
    "authors": [
        {
            "name": "Hamidreza Mozhdeh",
            "email": "hamidreza87m@gmail.com"
        }
    ],
    "require": {}
}

حالا برای اینکه مسیر فولدر منبع (که همه کدهامون داخل اونه) رو به کومپوزر معرفی کنیم کد زیر رو واردش میکنیم

{
    "name": "hamidreza-mozhdeh/easy-comment",
    "authors": [
        {
            "name": "Hamidreza Mozhdeh",
            "email": "hamidreza87m@gmail.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "HamidrezaMozhdeh\\EasyComment\\": "src/"
        }
    },
    "require": {}
}

دقت کنین که بعد نام وندور دابل بک اسلش داریم // و همینطور بعد نام پکیجمون هم دابل بک اسلش داریم // شاید متوجه شده باشین نام فولدر وندورم با نام وندوری که اینجا وارد کردم فرق داره! خب من میخواستم نام فولدرم زیبا باشه و با دش از هم جدا کردم. اما چیزی که اینجا وارد میشه namespace پکیج ما هست و نمیتونیم از دش استفاده کنیم. برای اینکار من کمل کبس نوشتم (و استانداری که رعایت میکنند هم همینه). و باز هم دقت کنین که ما هنوز فایل این namespace رو نساختیم و جلوتر میسازیمش. و در نهایت بعد فولدر src هم انتهاش یک فوروادر اسلش اضافه کنین.

ما تا اینجا composer.json پکیجمون رو ویرایش کردیم حالا نیازه composer.json خود لاراول رو ویرایش کنیم قسمت autoload و psr-4 رو داخل اون پیدا کنین و پکیج خودتون رو معرفی کنین، شبیه این:

  "autoload": {
    "classmap": [
      "database/seeds",
      "database/factories"
    ],
    "psr-4": {
      "App\\": "app/",
      "HamidrezaMozhdeh\\EasyComment\\": "packages/hamidreza-mozhdeh/easy-comment/src/"
    }
  },

 

این قسمت خیلی شبیه composer پکیج بود با این تفاوت که آدرس رو کاملتر دادیم اینجا.

۴. ایجاد سرویس پروایدر Service Provider

حالا ما نیاز داریم یک سرویس پروایدر بسازیم که متد ها کلاس ها و فایل ها و… رو از طریق اون فراخونی کنیم. در اینجا ما فقط میخوایم یک روت تعریف کنیم که آیا پکیجمون کار میکنه یانه. برای ایجاد پرواید به دو صورت دستی یا php artisan میشه کار کرد که من دومی رو ترجیح میدم. پس تو ترمینال بزنین:

php artisan make:provider EasyCommentServiceProvider

حالا فایل رو از app/providers   به packages/hamidreza-mozhdeh/easy-comment/src   منتقل کنین. دقت کنین که باید namespace اون رو هم عوض کنین به چیزی که قبلا تعریف کردیم تو کومپوزر تغییر بدیم، من داخل متند boot این فایل روت جدیدی رو لود کردم. برای لود بقیه چیزها اینجا رو نگاه کنین.

<?php

namespace HamidrezaMozhdeh\EasyComment;

use Illuminate\Support\ServiceProvider;

class EasyCommentServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        $this->loadRoutesFrom(__DIR__.'/routes.php');
    }
}

کتار همین فایل EasyCommentServiceProvider یک فایل دیگه با نام routes.php ایجاد کنید و یک روت مثل web.php داخلش تعریف میکنیم که میشه به آدرس packages/hamidreza-mozhdeh/easy-comment/src/routes.php

<?php

Route::get('testing-new-package', function () {
    return '<h1>Hello world</h1>';
});

آخرین کار باقی مونده اینه که داخل فایل config/app.php داخل آرایه providers پروایدر خودمونو تعریف کنیم.

HamidrezaMozhdeh\EasyComment\EasyCommentServiceProvider::class,
۵. آخرین مرحله و پایان

در نهایت دستور composer dump-autoload  رو بزنین تا فایل های جدید لود بشن. اگر تا اینجا اومدین و کارهارو انجام دادین پکیجتون ایجاد شده ولی الان فقط تست مونده که خیالمون راحت بشه.

چیزی که من شخصا خیلی سرش گیر کردم و جایی اشاره ای بهش نکرده بود که یادتون باشه در این مرحله حتما php artisan config:clear  هم بزنین.

php artisan serve رو بزنین و روت http://127.0.0.1:8000/testing-new-package  رو باز کنین. اگر تا اینجا همه چیز رو درست انجام داده باشین نتیجه رو میبینین.

سعی کردم تا اینجا ساده ترین و ابتدایی ترین راه برای شروع رو توضیح بدم، بازهم سعی میکنم این مقاله رو با پچ های جدید بروز رسانی کنم و ارتقاش بدم. تا همینجا اصل کار انجام شده و شما میتونین خیلی راحت و سریع توسعش بدین. کافیه یه فولدر بزنین مایگریشن و https://laravel.com/docs/5.8/packages#migrations  رو به پروایدر اضافه کنین یا فولدر ویو های خودتونو بسازین و اینو به پروایدر اضافه کنین (همونجایی که روت هست) https://laravel.com/docs/5.8/packages#views

یا اینکه با کد زیر میتونین امکان رو به کاربر بدین کدو پابلیش بزنه و بیاره تو هسته خودش که بتونه ادیت بزنه:

    $this->publishes([
        __DIR__.'/path/to/views' => resource_path('views/vendor/courier'),
    ]);

 

موفق باشید

منابع:

Laravel 5.8 Package Development

ساخت پکیج‌‌ها در فریم‌ورک لاراول

Build Your Own Laravel Package in 10 Minutes Using Composer

۲ ترفند در محیط ترمینال اوبونتو

باز کردن فایل منیجیر اوبونتو از ترمینال

همیشه برامون پیش میاد در ترمینال داخل فولدر خاصی هستیم و میخوایم همون فولدر رو با فایل منیجیر اوبونتو باز کنیم. حالت عادیش اینه که فایل منیجیر اوبونتو که اسمش Nautilus هست رو باز کنیم و به مسیر فولدرمون بریم. اما گاهی این سخت میشه! وقتایی که تعداد فولدر ها زیاده یا ما عجله داریم. یه نگاه به مسیر زیر بندازین:

/home/hamidreza/projects-tmp/hello/platforms/android/app/build/outputs/apk/debug

خب این خیلی سخته که بخوایم با فایل منیجیر همه این مسیرو رو بریم. اصطلاحا کی میاد این همه راهو! مخصوصا وقتی با کوردوا کار میکنین و خروجی اپ میگیرین خیلی سخته میشه همه این مسیر رو طی کنین چون کوردوا اپ خودشو در این مسیر طولانی قرار میده. راه ساده ش چی میتونه باشه که سریع این مسیر رو در فایل منیجیر باز کنیم؟ بله، جتسجو در گوگل. وقتی منم به این مسئله بر خوردم که زیاد هم اتفاق میافتاد ترجیح دادم گوگل کنم.

عبارت زیر رو در هر مسیری هستین تایپ کنین تا اون آدرس باز بشه:

nautilus .

باز کردن فایل منیجیر اوبونتو از ترمینال

چطور در اوبونتو/لینونکس در محیط ترمینال از میانبر های کپی پیست استفاده کنیم؟

همونطور که میدونین در اوبونتو/لینوکس در محیط های ترمینال نمیتونیم از دکمه و میانبر های Ctrl+C برای کپی و Ctrl+V برای پیست استفاده کنیم چون دستور Ctrl+C میانبریه برای لغو فعالیت جاری و اصطلاحا کنسل کردن پردازش فعلی. اما چطور میتونیم در این محیط راحت کپی پیست کنیم؟

اگر با نرم افزار مایکروسافت ورد کار کرده باشین احتمالا به دکمه Shift+Ctrl+C و Shitf+Ctrl+V آشنایی دارین و میدونین که استایل هارو در اون محیط کپی پیست میکنه. و اینجا در محیط ترمینال لینوکس هم همین اتفاق میافته. ما میتونیم بجای میانبر های عادی از میانبر های ثانویه کمک بگیریم

برای کپی یا رونوشت در محیط ترمینال میانبر Shift+Ctrl+C رو بزنین

برای پیست یا جا گذاری کردن متن در محیط ترمینال میانبر Shift+Ctrl+V رو بزنین

رفع خطای محدودیت حافظه (memory_limit) در کومپوزر

امروز اومدم یه پکیج به لارول اضافه کنم و با خطای زیر روبرو شدم:

PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.

تو نگاه اول به نظر میرسه این خطا مربوط به memory_limit در php هست ولی گویا به تنهایی php نیست و لازمه composer هم مقدار دهی بشه. اول از همه بریم سرغ php

برای اینکه ببینیم memory_limit در php چی ست شده از دستور زیر استفاده کنین (اگر مقدار برابر -۱ بود یعنی محدودیتی براش نذاشتین):

php -r "echo ini_get('memory_limit').PHP_EOL;"

حالا برای اینکه memory_limit  رو در php.ini تغییر بدیم، بسته به اینکه با چه برنامه ای و در چه سیستم عاملی php رو نصب کردین محل نصب php.ini متفاوته. یه راه حل ساده میتونه این باشه در داخل ترمینال دستور زیر رو تایپ کنین:

For linux
php -i | grep php.ini

For windows:
php -i | findstr php.ini

خب این گزینه بهتون میگه php.ini که مربوط به php اجرا شده هست کجا قرار داره (ممکنه رو سیستمتون چند تا php داشته باشن) این دستور php که بصورت global نصب شده رو جارا میکنه.

پیدا کردن فایل php.iniهمونطور که میبنین مسیر فایل php.ini من اینه: /opt/lampp/etc/php.ini  با دستور زیر این فایل رو ویرایش کنین و دنبال memory_limit بگردین:

sudo nano /opt/lampp/etc/php.ini

برای اینکه داخل این فایل جستجو کنین از میانبر Ctrl + W استفاده کنین و بعد عبارت memory_limit رو تایپ کنین. حالا مقدارش رو به ۱.۵جی عوض کنین. مقدار رم پیشنهادی برای php و کومپوزر حداقل ۱.۵گیگ هست. البته نیازی نیست و شما با ۱۲۸ هم کارتون راه میافته ولی حداقل ۵۱۲ بذارین دیگه! در آخر برای خروچ Ctrl + X بزنین ذخیره کنین و خارج بشین.

حالا میمونه مقدار COMPOSER_MEMORY_LIMIT که یک متغیر محیطی هست و در فایل composer.phar هم میتونین پیداش کنین. در داخل لینوکس / اوبونتو دستور زیر رو تایپ کنین تا مقدار فعلی رو ببینین:

printenv COMPOSER_MEMORY_LIMIT

اگر مقداری نمایش داده نشد، به این خاطره که تا بحال این متغیر ست نشده. حالا ۱نکته: جستجویی که من انجام دادم متوجه شدم محدودیتی وجود داره که اگر این متغیر ست بشه مقدارش رو از memory_limit در php میگیره و در جای دیگه راه حل هایی که ارائه شده بود مقدارش رو وارد میکردن (اینجا و اینجا و اینجا رو ببینین).

با دستور which composer  پیدا کنین کومپوزر کجا نصب شده یا فعاله. برای من بجای composer.phar آدرس /usr/bin/composer  وجود داشت. حالا دستور زیر رو بزین تا آپدیت بشه

php -d memory_limit=1.5G /usr/bin/composer update

راه حل های دیگه ای هم مثل ست کردن متغیر COMPOSER_MEMORY_LIMIT ولی من از این روش نتیجه ثابتی نگرفتم.

در آخر هم یه نکته رو دوباره بگم که برای COMPOSER_MEMORY_LIMIT و memory_limit اگر مقدار رو برابر -۱ بذارین دیگه لازم نیست هرزگاهی سر بزنین و منابع رو افزایش بدین و بصورت unlimited در نظر میگیره.

بروز رسانی: روش بالا بعد رستارت کردن از بین میره ظاهرا! فعلا از این روش سریع و موقتی برای حل مسئله استفده میکنم. داخل ترمینالتون کد زیر رو ببزنین. (البته میشه این متغیر رو بصورت ثابت و محیطی هم تعریف کرد)

export COMPOSER_MEMORY_LIMIT=-1

 

انتقال همه فایل های یک فولدر به فولدر دیگر در اوبونتو

چطور در اوبونتو فایل های یک دایرکتوری رو به دایرکتوری دیگه منتقل کنیم حتی فایل های مخفی و هیدن (Hidden)

همونطور که میدونیم با دستور mv میشه به راحتی این عمل رو انجام داد اما این دستور شامل فایل های مخفی در لینوکس که در ابتدای نام اونها دات (نقطه) داره نمیشه. کد زیر رو ببینین:

mv folder-a/* folder-b/

همونطور که گفتم دستور بالا شایمل فایل های مخفی نمیشه و عملا همه فایل ها انتقال پیدا نمیکنن! برای حل این مسئله از دستور زیر استفاده کنین:

shopt -s dotglob nullglob
mv folder-a/* folder-b/

منبع: How do you move all files (including hidden) from one directory to another?

نوشتن سایت چند زبانه با لاراول

لاراول  برای ما شرایطی بوجود آورده که داشتن سایت چند زبانه به سادگی امکان پذیره. یا برای منی که دارم طراحی میکنم میخوام که ابتدا با زبان انگلیسی کار کنم و در آخر سایتت رو فارسی ترجمه کنم. اینکار تو لاراول خیلی راحت و سریعه بطوری که یک راه هم نداریم و چندین راه وجود داره. در ادامه با من همراه باشین تا خیلی خلاصه و سریع در این مورد بهتون آموزش بدم:

ساختار فایل های ترجمه لاراول در روش اول به این صورته:

/resources
    /lang
        /en
            contact.php
        /fa
            contact.php

در فولدر resource فولدر lang یک فولدر با مخفف زبان فارسی fa ایجاد کنید. و داخل اول فایل های ترجمه رو به صورت دسته بندی شده داخل هر فایل قرار میدیم. برای مثال سایت من قسمتی داره با نام  contact و ترجمه های داخل اون متفاوت از سایر قسمت های سایته. برای همین داخل فولدر fa یک فایل با نام contact.php ایجاد میکنم و داخل اون رو به صورت زیر با کلید -> مقدار پر میکنم

<?php

return [
    'title' => 'تماس با ما'
];

همونطور که توجه میکنین فایل فقط یک آرایه از توع associative رو برگشت میزنه که هر کلید یک مقدار ترجمه رو برمیگرونه.

برای استفاده از ترجمه داخل فایل های بلید مثل زیر عمل میکنیم:

{{ __('contact.title') }}

@lang('contact.title')

همونطور که متوجه شدین این روش خیلی با نظم و دقیقه و مناسب سایت های بزرگ با ترجمه های زیاده. در این روش بهتره حتما از fallback_locale با ترجمه انگلیسی استفاده کرده باشین (اگر نمیدونین جلوتر توضیح میدم)

روش دوم که ساده و خلاصه هست، روش stringمحور که با JSON انجام میشه و برای سایت های کوچیک با ترجمه های کم مناسبه. به این صورت که در مسیر resource/lang یک فایل json با نام مخفف زبان خودمون درست میکنیم برای مثال resource/lang/fa.json که همه ترجمه ها داخل اون قرار میگیره.

{
    "I love programming.": "من عاشق برنامه نویسیم"
}

که نمایش اون هم در کد خیلی راحتتره. درون بلید به این صورت استفاده میکنیم:

{{ __('I love programming.') }}

@lang('I love programming.')

برای ترجمه حرفه ای تر منبع رو بخونین. اما بریم سراغ راه اندازیش:

فایل در مسیر config/app.php حاوی تنظیمات ترجمه هست که شما با تنظیم اون میتونین زبان سایت خودتون رو تغییر بدین.

اول از همه fallback_locale زبانیه که اگر ترجمه ای پیدا نشد بصورت جایگزین درنظر گرفته میشه. بهتره مقدارش همون en بمونه.

locale متغیری هست که زبان فعلیه برنامست. من اینو منتقل کردم به فایل .env برای اینکار کدتون رو بصورت زیر تغییر بدین:

'locale' => ,en

'locale' => env('APP_LOCALE', 'en'),

حالا در فایل .env متغیر زیر رو تعریف کنین

APP_LOCALE=fa

یادتون باشه حتما در آخر از دستور زیر برای دوباره تنظیم کردن کش کانفیگ استفاده کنین

php artisan cache:clear

در آخر چند تا از امکاناتی که لاراول بهمون میده رو بگم: میتونیم متغیر وسط متن ترجمه فراخونی کنیم. میشه بصورت داینامیک زبان رو تغییر داد و نیازی نیست داخل کانفیگ تعریف کنین و برای مثال از url پارامتر بگیرین. میتونین بصورت شرطی برای جمع و فرد ترجمه بنویسین و…

منبع :Localization

دلیل باز نشدن برنامه Visual Studio Code یا WhatsDesk در اوبونتو

امروز اومدم با VS Code کار کنم ولی هرچی میزدم برنامه باز نمیشد از دیروز هم whatsdesk اجرا نمیشد! خب این از چالش های Ubuntu هستش و وقتی میخوای اخت بگیری با یک سیستم عامل بهتره همه قلق هاشو یاد بگیری.

مدتی بود VS Code  بهم خطای  “System limit for number of file watchers reached” رو میداد و برطرفش نکردم. تا اینکه امروز کلا Visual Studio Code اجرا نشد نشد و فراموش کردم خطایی که نمایش میداد چی بود! اول فکر میکردم بخاطر فولدر vendor نوتیف میداد اما با سرچ vs code is not runnig ubuntu از اینجا Cannot open Visual Studio Code این نتیجه رسیدم که برای مشاهده لاگ اجرای VS Code از دستور زیر میشه استفاده کرد:

code --verbose

که با اجرای اون به خطای زیر رسیدم:
Error: ENOSPC: System limit for number of file watchers reached, watch '/snap/code'با جستجوی متن خطا “System limit for number of file watchers reached” به صفحه React Native Error: ENOSPC: System limit for number of file watchers reached رسیدم. گویا این خطا ربطی به vs code نداره و بخاطر inotify watch هست. اول بیاین خطا رو درست کنیم بعد بقیه رو توضیح میدم. برای اینکه ببینید تنظیم فعلی سیستمتون برای دنبال کردن فایل ها چقدر هست این دستور رو بزنین:

cat /proc/sys/fs/inotify/max_user_watches

احتمالا عددی حدود ۸ هزار میده. خب وقتی شروع به نصب برنامه ها مثل whatsdesk (نسخه غیر رسمی whatsapp) یا vscode در اوبونتو میکنین این برنامه نیاز دارن بعضی فایل ها رو دنبال کنن اصطلاحا ترک کنن. اینکار توسط watch انجام میشه و محدودیت هایی براش وجود داره. برای رفع خطا کد زیر رو بزنین

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

این کد به انتهای فایل /etc/sysctl.conf مقدار fs.inotify.max_user_watches=524288 رو اضافه میکنه.

رفع مشکل باز نشدن برنامه ها در لینوکس اوبونتو

همین! الان برنامه هایی که باز نمیشدن راحت باز میشن!

حالا بریم سراغ اینکه inotify watch چی هست؟
اول از همه باید بدونیم خود inotify چی هست. inotify از ترکیب inode notify تشکیل شده و یک زیر سیستم (subsystem) هسته لینوکسه که تغییرات فایل های سیستم رو مشاهده میکنه و از طریق api اونها رو به برنامه های سطح بالاتر اطلاع میده. watch هم این وسط فایل ها رو برای تغییرات دنبال میکنه و هر تغییری رو ارسال میکنه به inotify.

کد جاواسکریپت کپی متن در کلیپ بورد حافظه

برای اینکه متنی رو توی حافظه کپی کنین کافیه متنشتون رو به تابع زیر ارسال کنین:

function myFunction() {
  /* Get the text field */
  var copyText = document.getElementById("myInput");

  /* Select the text field */
  copyText.select();
  copyText.setSelectionRange(0, 99999); /*For mobile devices*/

  /* Copy the text inside the text field */
  document.execCommand("copy");

  /* Alert the copied text */
  alert("Copied the text: " + copyText.value);
}

تابع بالا از فیلد input استفاده میکنه که ممکنه واسه همه جالب نباشه و بکارمون نیاد. من خودم بعد کمی تست و گشتن به این نتیجه رسیدم که از clipboardjs (این کتابخونه هم خوبه: https://clipboardjs.com)  استفاده کنم. متاسفانه کد من با این کتابخونه تداخل داشته و ناچارا رفتم سراغ جستجو و کد زیر رو پیدا کردم که بسیار هم عالی بود.

function copyLink(containerid) {
    var elm = document.getElementById(containerid);
    // for Internet Explorer
    if (document.body.createTextRange) {
        var range = document.body.createTextRange();
        range.moveToElementText(elm);
        range.select();
        document.execCommand("Copy");
        alert("Copied div content to clipboard");
    }
    else if (window.getSelection) {
        // other browsers
        var selection = window.getSelection();
        var range = document.createRange();
        range.selectNodeContents(elm);
        selection.removeAllRanges();
        selection.addRange(range);
        document.execCommand("Copy");
        alert("Copied div content to clipboard");
    }
}

 

منبع:
How TO – Copy Text to Clipboard
How to copy the div content to Clipboard

ذخیره اسکرین شات در کلیپ بورد و کپی مستقیم اون

در اوبونتو وقتی print screen یا prtsc رو روی کیبورد میزنیم مثل ویندوز از صفحه عکس نمیگیره که تو کلیپبورد ذخیره کنه و بتونیم اونو تو شبکه های اجتماعی مثل تلگرام کپی پیست کنیم! البته که عکس رو مستقیم ذخیره میکنه ولی برای سرعت کار ترجه میدم عکس رو بعد اسکرین شات بتونم تو تلگرام کپی کنم.

وارد Settings بشین و بعد Keyboard و بعد تایپ کنین کپی، نوع اسکرین شاتی که میخواین رو انتخاب کنین. در حالت کلی از Ctrl + PrtSc استفاده کنین

تنظیم اسکرینشات در اوبونتو

منبع: Ubuntu 18.04 Desktop – How to printscreen direct to clipboard

ریفرش کردن دسکتاپ قفل شده در گنوم اوبونتو ۱۸

چندین بار برام پیش اومده که دستکتاپم قفل / هنگ کرده و چیزی رو اجرا نمیکنه اما همچنان ترمینال کار میکنه. در این مواقع کد زیر رو ران کنین:

DISPLAY=:0 gnome-shell -r &