نویسنده: حمید حق دوست

  • اجرای کارها با صف در لاراول

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

    صف ها در برنامه نویسی به چه دردی میخورن؟

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

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

    توی لاراول میتونید با سیستم های مدیریت صف معروف مثل ردیس کار کنید و کافیه فقط یه کانکشن به ردیس بزنید و بقیه خیلی ساده هست ولی برای مدیریت صف های ساده و سبک میتونید از همون صف دیتابیس استفاده کنید.

    استفاده از صف دیتابیس در لاراول

    اولین کاری که باید بکنید اینه که جدول هاتون رو ایجاد کنید. برای اینکار توی محیط ترمینال لاراول و توی روت پروژه این دستورها رو ران کنید:

    php artisan queue:table
    php artisan queue:failed-table
    php artisan migrate

    با دستور اول یه مایگریشن ایجاد میشه برای ذخیره جاب های صف ها. با دستور دوم یه مایگریشن ایجاد میشه برای جابهایی که به خطا خوردن و با دستور سوم…

    خب حالا بذارید یه جاب خیلی ساده بنویسیم. با دستور زیر میتونید یک جاب جدید درست کنید. جابها توی فولدر app/Jobs قرار میگیرن که اگه دستور زیر رو ران کنید فولدر خودش ساخته میشه.

    php artisan make:job MyFirstJob

    الان اگه فایل MyFirstJob.php رو باز کنید یچی مثل این میبینید:

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class MyFristJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            //
        }
    }
    

    داخل متد handle این رو بنویسید:

    $seconds = rand(0, 15);
    sleep($seconds);
    Log::info('job ran ' . Carbon::now()->toDateTimeString());

    توی این قسمت گفتم که یک عدد تصادفی بین ۰ تا ۱۵ تولید کن و بعد به اندازه اون عدده ثانیه صبر کن و یه خروجی رو توی فایل لاگ بنویس و فرض کنید اون اسلیپ شدنه یه جاب سنگین مثل پردازش ویدیو و… هست. و یادتون نره که Carbon و Log رو use کنید.

    گذاشتن جاب در صف

    برای گذاشتن جاب توی صف در لاراول کافیه متد dispatch از اون جاب رو صدا بزنیم. برای مثال توی فایل routes/web.php قطعه کد زیر رو اضافه کنید:

    Route::get('put', function () {
       \App\Jobs\MyFristJob::dispatch();
    });

    گفتم هر بار روت /put با متد get فراخوانی شد یدونه از این جاب رو بذار توی صف. پس کافیه روت /put رو get کنید. بعد از این کار باید توی جدول jobs یه رکورد ایجاد شده باشه. فیلد هایی که جدول jobs داره خیلی پیچیده نیستن و با یه نگاه میتونید ببینید که داره چه اتفاقی میفته.

    صف های ایجاد شده در دیتابیس لاراول

    تنظیمات درایور صف در لاراول

    خب حالا نوبت این رسیده که صف رو توی پروژه ران کنیم. ولی قبلش یه سر به فایل config/queue.php بزنیم. اولین چیزی که احتمالا میبینید خط زیر هست:

    'default' => env('QUEUE_CONNECTION', 'sync'),

    این خط میگه که کانکشن پیشفرض من برای اجرای صف ها چی باشه که بصورت پیشفرض روی درایور sync تنظیم شده. درایور sync که یکم پایینتر هم اینجا و هم توی فایل کانفیگ میبینیدش میگه هر جابی که دیسپچ شد همون لحظه شروع بشه به ران شدن. در واقع اصلا صف حساب نمیشه.

    'sync' => [
        'driver' => 'sync',
    ],

    یسری کانشکن هم پایین تر از اون و اینسری فقط توی فایل کانفیگ میبینید 🙂 اونها کانکشن های مختلف به سیستم های مدیریت صف مختلف هستن. ما توی اینجا کانکشن پیشفرض رو تنظیمش میکنیم روی database و پایین تر در قسمت failed میتونید مشخص کنید که جابهایی که با خطا مواجه میشن کجا ذخیره بشن.

    اجرای یک صف در لاراول

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

    php artisan queue:work

    این دستور شروع میکنه دونه دونه جابهایی که توی جدول jobs هستند رو اجرا میکنه. و بعد از تموم شدن جابهای صف، بازم منتظر میمونه که جاب جدید dispatch شه.

    اجرای صف ها در لاراول

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

    خوشحال میشم اگه نکته ای هست کامنت کنید. موفق باشید.

  • نصب MongoDB و استفاده در لاراول

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

    توجه: همه کارایی که من میگم روی Ubuntu 18.04.3 تست شده و بقیه جاها رو نمیدونم.

    بعد از اینکه لاراول رو نصب کردید خیلی راحت با دستور زیر مانگو رو هم نصب کنید (البته برای این بخش بهتره از طریق داکیومنت مانگو دی بی پیش برید).

    sudo apt-get install -y mongodb-org 

    معروف ترین پکیجی که لاراولی ها برای کار با مانگو باهاش کار میکنن jenssegers/laravel-mongodb هست که میتونید نصبش کنید ولی قبلش باید یکار دیگه هم بکنید و اون هم اینه که درایور PHP برای مانگو رو نصب کنید. من چند تا راه رو رفتم و این پست از داکیومنت PHP واسم جواب داد. در واقع اگه PECL داشته باشید خیلی راحت با این کامند کارتون راه میفته:

    sudo pecl install mongodb

    حالا پکیج jenssegers رو نصب کنید و کارایی که گفته رو انجام بدید. حالا قانونا باید همه چی اوکی باشه ولی بازم واسه من اوکی نبود. اولین کاری که میکنید یبار سرویس مانگو رو استارت کنید.

    sudo service mongod start

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

    use test

    دستور بالا اگه دیتابیس رو داشته باشید سلکتش میکنه اگه نداشته باشید میسازه. چقد کامند خوبیه 🙂 برای اینکه دیتابیس ها رو ببینید هم میتونید از دستور زیر استفاده کنید.

    show dbs

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

    db.getUsers()

    توجه کنید که db نباید اسم دیتابیستون باشه و همین db باید باشه. اگه یوزری ندارید باید بسازیدش. برای این کار این شکلی میتونید عمل کنید:

    db.createUser({user:'admin', pwd:'Aa123', roles: [{role:"readWrite", db:"test"}]})

    و حالا برید کانکشن دیتابیس رو توی فایل database.php بسازید. و بعدش دیفالت کانکشن رو هم تغییر بدید.

    'mongodb' => [
        'driver'   => 'mongodb',
        'host'     => env('DB_HOST', 'localhost'),
        'port'     => env('DB_PORT', 27017),
        'database' => 'test',
        'options'  => [
            'database' => 'admin' 
        ]
    ],
    'default' => env('DB_CONNECTION', 'mongodb'),

    من یوزر و پسورد رو هم اینجا گذاشتم و اررور داد. شما اون یکی دو تا رو توی فایل .env بذارید.

    DB_CONNECTION=mongodb
    DB_HOST=localhost
    DB_PORT=27017
    DB_DATABASE=test
    DB_USERNAME=admin
    DB_PASSWORD=Aa123

    و حالا php artisan migrate کنید. ایشالا که همه چی اوکی باشه.

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

    mongorestore --db test ./orgdictionary

    استفاده از Eloquent در لاراول با MongoDB

    اگه میخواید از Eloquent توی لاراول استفاده کنید باید مدل هاتون رو از Eloquent پکیج اسکتند کنید. بعنوان مثال برای مدل Post بصورت زیر عمل کنید:

    use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
    class Post extends Eloquent
    {

    }

    حالا میتونید توی کنترلرتون از App\Post::all() و… استفاده کنید. البته برای جدول یوزر باید یه حرکت بیشتر هم بکنید و اون اینه:

    use Illuminate\Contracts\Auth\Authenticatable;
    use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
    
    use Illuminate\Auth\Authenticatable as AuthenticableTrait;
    class User extends Eloquent implements Authenticatable
    {
         use Notifiable;
         use AuthenticableTrait;
    {

    این باعث میشه که توی مرحله Auth هم به اررور نخورید و مثل حالت معمولی با Auth::attempt لاگین کنید.

  • خطای لاراول ۶ بعد از نصب

    اگه لاراول ۶ رو میخواید نصب کنید و وقتی php artisan serve کردید اررور زیر رو گرفتید:

    No application encryption key has been specified.

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

    php artisan key:generate 
    php artisan config:cache
  • نصب پکیج لاراول بدون ssh

    البته عنوان خیلی سکسی شد چون مجبور بودم کوتاه باشه ولی منظورم اینه که اگه مثلا دسترسی ssh نداریم ولی دسترسی آپلود داریم بتونیم پکیج رو نصب کنیم.

    آپلود پوشه‌ی ریپازیتوری

    من خودم یک سایت داشتم روی هاست اشتراکی و لازم داشتم که یک پکیج که تازه نصب کردم رو آپلود کنم. برای این کار خیلی راحت اول رفتم توی فولدر vendor و پوشه‌ی ریپازیتوری رو آپلود کردم. مثلا من پکیج barryvdh/cors رو نصب کرده بودم و رفتم پیداش کردم از روتی که داره.

    آپدیت کردن فایل autoload

    همونطور که میدونید ما بعد از نصب یک پکیج یه dump-autoload میکنیم که فایل های autoload رو آپدیت کنه کامپوزر. ولی چون دسترسی نداریم میریم و فایل vendor/composer/autoload_psr4.php رو پیدا میکنیم و خط هایی که توی فایل لوکالمون هستن رو بهش اضافه میکنیم. برای مثال توی پکیج cors که من نصب کردم خط های زیر بهش ربط داشتن و من آپدیت کردم.

    'Barryvdh\Cors\' => array($vendorDir . '/barryvdh/laravel-cors/src'),
    'Asm89\Stack\' => array($vendorDir . '/asm89/stack-cors/src/Asm89/Stack'),

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

  • خطای لاراول: Prepared statement needs to be re-prepared

    من هر چند وقت یبار میبینم سایت بالا نمیاد و لاگ رو چک میکنم میبینم یچی مثل خط زیر رو پروژه ی لاراول لاگ داده:

    SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL:...

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

    'options'   => [
        \PDO::ATTR_EMULATE_PREPARES => true
    ]

    یعنی الان کانکشنتون باید یچی مثل این بشه:

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    	'options'   => [
    		\PDO::ATTR_EMULATE_PREPARES => true
    	]
    ],

    من کلی گشتم تا پیدا کردم گفتم دیگه شما نگردید 🙂

  • چطور به برنامه نویس اعتماد کنم؟

    این سوالیه که خیلی وقتا کارفرما ها از من حتی خیلی میپرسن. سوال منطقی ای هم هست. برنامه نویس هایی که بصورت فریلنس کار میکنن معمولا بعد از نهایی شدن صحبت هاتون از شما پیش پرداخت میخوان و باید بدون اینکه کدی تحویل بگیرید بهشون اعتماد کنید و درصدی از مبلغ کار رو بهشون همون اول بدید که این درصد ممکنه تا ۳۰ درصد از مبلغ توافق شده باشه.

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

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

    اصلا این برنامه نویس از پس کار بر میاد؟

    اکثر بد قولی هایی که توی کارهای این مدلی پیش میاد بخاطر همین موضوعه… باید ببینید شخص مقابل چقد بلده؟ خیلی راه وجود داره که بدونید طرف چقد بلده که تا جایی که یادم بیاد رو اینجا میارم:

    نمونه کار های برنامه نویس رو بررسی کنید.

    اولین و ساده ترین کار اینه که از برنامه نویس بخواید نمونه کارهای نزدیک به کار شما رو که انجام داده رو براتون بفرسته، ازش سوال کنید که همه کار رو خودش انجام داده یا از پلاگین یا کد های آماده هم استفاده کرده؟ ببینید کارهایی که انجام داده چقد سنگین بوده و چقد نزدیک به کار شما بوده. خیلی توی زیبایی ظاهری سایت غرق نشید و یکم به پیچیدگی و ظرافت پشت کد هم نیگا کنید. مثلا لودهای ایجکس یا فیلتر هایی که توی بخش های مختلف اسکریپت استفاده کرده رو میشه ظریف کاری حساب کرد.

    پروژه شما چقد بزرگه؟

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

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

    بخش های مختلف کار رو که توضیح دادید از برنامه نویس سوال بپرسید ببینید که ایده ی جدیدی مثلا داره؟ میدونه اصلا قضیه چیه؟

    هزینه اجرای پروژه خیلی مهمه

    همونطور که مبلغ خیلی بالا رو دوست ندارید حواستون باشه که همیشه مبلغ پایین نمیتونه خوب باشه، احتمالا این یکی دو تومنی که میدید به برنامه نویس انقد کم باشه که برنامه نویس وسط کار حجم بالای کار رو بذاره کنار مبلغ پایین پروژه و دلسرد بشه و اون پیش پرداختی که دادید هم اون وسط خورده بشه 🙂 در واقع بجای اینکه ۱۰ بار هزینه کنید و کلی از تایمتون هم هدر بره یک بار خوب پول بدید و کار خوب تحویل بگیرید. این روزا اینترنت پره از کدها و کارفرماهایی که دارن میگردن دنبال برنامه نویس دوم که کدشون رو تکمیل کنه که هزینه تکمیل کد ناقص از هزینه اجرای از صفر اون کد میتونه بیشتر باشه خیلی موقه ها.

    سایت های فریلنسری منصف!

    میتونید پروژه رو توی سایت های فریلنسری ایجاد کنید که مبالغی که ایجاد میکنید اونجا دست سایت باشه که بعد از تحویل پروژه آزاد بشن. این وسط یه ۵ تا ۱۰ درصد هم کارمزد باید به سایت بدید که اینش یکم بده و مورد دوم اینه که در صورت بروز اختلاف خیلی منصفانه به قضیه نگاه نمیشه. مورد بعدی رو اگه حواستون باشه حتما اختلاف به نفع شما داوری خواهد شد.

    توضیحات دقیق پروژه (خیلی مهم)

    آقا دقیقا بنویسید چی میخواید. ممکنه یه ماه وقتتونو بگیره ولی روزی که پروژه رو تحویل میگیرید خیالتون راحته که چی میخواید و اگه مشکلی بود راحت میتونید ارجاع بدید به اون نوشته ها برنامه نویس رو. توی یه فایل ورد یا توی یه برد ترلو یا هر جای دیگه لیست کاملی از امکانات و جزییات هر صفحه رو بنویسید. هیچ موقع نگید مشابه سایته فلان. چون ممکنه اون سایت اصلا وقتی پروژه رو تحویل میگیرید داون شده باشه یا ورژن جدیدش اومده باشه. اگه هم اینکارو میکنید یه عکس از اون صفحه ی سایت بگیرید و به داکیومنت اتچ کنید که همه چی یجا باشه. یک بار برای همیشه توضیحات رو کامل بنویسید و حالا دیگه این توضیحات رو میتونید به ۱۰۰ تا برنامه نویس بدید و لازم نیس واسه هر کدوم یه ساعت توضیح بدید و آخرشم کلی چیز جا مونده باشه…

    اگه چیز دیگه ای به ذهنم رسید آپدیت میکنم این پست رو. شما هم اگه موردی بود توی کامنت ها بگید… مرسی

  • برنامه نویس حرفه ای لاراول!

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

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

    از ویژگی های لاراول میتونم به همراه بودن بستر هایی نظیر تست، صف ها در لاراول، برودکست و کانتینر قدرتمندش اشاره کنم که کنار هم بودن اینهمه فیچر میتونه باعث بشه هر دولوپری به سیستم دیگه ترجیهش بده.

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

  • ریست کردن پسورد MySQL در لینوکس

    با سلام – اگه یادتون رفته که رمز یوزر rootتون چی بود، خیلی راحت میتونید رمز رو با سوپر ادمین ریست کنید و رمز جدید رو ست کنید.

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

    sudo -i

    رمز لینوکس رو وارد میکنید و حالا شروع میکنیم به کار، در مرحله بعد دستور زیر رو بزنید که بدون وارد کردن رمز بتونید وارد محیط خط فرمان مای اس کیو ال بشید:

    mysql

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

    use mysql;

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

    update user set authentication_string=PASSWORD("my_password") where User='root';

    کارایی که کردیم رو با دستور زیر ذخیره کنید:

    flush privileges;
    exit;

    و نهایتا سرویس MySQL رو ریستارت کنید با دستور های زیر:

    sudo /etc/init.d/mysql stop
    sudo /etc/init.d/mysql start

    حالا exit کنید و با دستور زیر وارد محیط تحت کامند مای اس کیو ال بشید:

    sudo mysql -u root -p

    و لذت ببرید 🙂

  • کرک phpstorm در لینوکس و ویندوز و مک

    سلام دوستان، کرک چیز خوبی نیست ولی به شرط اینکه پول شما بی ارزش ترین پول دنیا نباشه و برنامه نویسی توی کشور شما شغل حساب بشه و ارزش داشته باشه 🙂

    یه راه خیلی ساده برای کرک نرم افزار phpstorm هست که همیشگی هست و لازم نیست شما هر چند روز یک بار بگردید دنبال آدرس لایسنس سرور برای اینکه وارد phpstorm تون بشید.

    روی ویندوز یا لینوکس یه فایلی وجود داره به نام hosts که مسیر رو توی هر دو سیستم عامل در زیر میذارم که بدونید:

    /etc/hosts در لینوکس و C:\Windows\System32\drivers\etc\hosts در ویندوز

    دوستانی که مک دارن هم باید یه فایل به همین نام داشته باشن ولی خب اونا چون پولدارن بهتره که بخرن لایسنس رو 🙂

    توی این فایل باید یه خط جدید اضافه کنید بصورت زیر:

     ۰٫۰٫۰٫۰ account.jetbrains.com
    تصویر کرک پی اچ پی استورم

    این میگه که اگه نرم افزاری خواست به آدرس account.jetbrains.com دسترسی پیدا کنه تو بفرستش به لوکال هاسته خودم 🙂 ینی یه کاره کثیف :)))

    بعد از این حالا توی صفحه ی کرک نرم افزار که ازتون میخاد کد فعال سازی بزنید، کد زیر رو وارد کنید:

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


    https://gist.github.com/tuytoosh/7ad4f252f6e7abf20726f734d5d9e831


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

    راه حل نهایی – مهاجرت به vscode

    اگه هر روز درگیر اینید که مشکل کرک پی اچ پی استورم رو حل کنید، یک بار برای همیشه مهاجرت کنید به vscode. اوایل سخته چون اونجا خیلی تنبل شدید ولی کم کم پلاگین های خوب پیدا میکنید و تقریبا راحتی اونور رو اینجا هم پیدا میکنید. من توی یه پست جداگانه در مورد پلاگین های خودم برای vscode نوشتم که میتونید ببینید و نصب کنید.

  • آشنایی با ماژول ها در انگولار

    برنامه های انگولار ماژولار هستند و انگولار سیستم ماژولاریتی خودش رو داره که اسمش هست NgModules. ماژول ها کانتینرهایی هستند که بخش هایی که یکار مرتبط و نزدیک به هم میکنن رو بهم میچسبونن. ماژول ها میتونن شامل کامپوننت ها و سرویس ها و حتی ماژول های دیگه باشن و هر ماژول میتونه توسط یه ماژول دیگه اکسپورت بشه حتی.

    هر برنامه انگولار حداقل یدونه ماژول داره که بای دیفالت اسمش هست AppModule و توی فایل app.module.ts تعریف شده. یه برنامه کوچک ممکنه همین یدونه ماژول رو داشته باشه ولی برنامه های بزرگ ماژول های متنوعی دارن که هر کدوم کار خودشون رو میکنن.

    یه ماژول رو با یه دکوریتور @NgModule() برای کلاس تعریف می کنیم که یه آبجکت رو بعنوان ورودی میگیره.

    import { NgModule } from '@angular/core';
    import { BrowserModule } from '@angular/platform-browser';
    @NgModule({
    	imports:      [ BrowserModule ],
    	providers:    [ Logger ],
    	declarations: [ AppComponent ],
    	exports:      [ AppComponent ],
    	bootstrap:    [ AppComponent ]
    })
    export class AppModule { }