کاربر تایید شده
نویسنده آخرین فعالیت ٢ روز پیش

@tilkacoder

پارس کلیکی از ٢ سال پیش

تجربه

47300

  • ١ ماه پیش @tilkacoder به گفتگوی بهترین شیوه پرداخت داخل ایران جواب داد.

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

    به نظرم باز کردن یه حساب در ایران و استفاده از درگاه پرداخت ریالی خیلی معقول تر هست.

    @amir برای حل مشکل دریافت در انگلیس میتونی از ارز های دیجیتال استفاده کنی به عبارت ساده تر یه آدم مطمئن داخل ایران پیدا کنی و درگاه و حساب به اسم اون باشه و بعد طرف برات ارز دیجیتال بخره و بفرسته. اینکار هم برای کاربرا راحت تره هم اینکه شما راحتی.

    و در آخر قبل از انجام اینکار باید چند مسئله رو بهش دقت کنی :

    1. اگر مبلغ فعلی اشتراک رو بخوای تبدیل کنی داخل ایران این مبلغ ماهیانه با توجه به ارزش ریال، بالا هست.
    2. با توجه به تجربیات دوستان در زمینه فروش اشتراک باید بهت بگم توی ایران معمولا یک ماه اشتراک میخرن و کل اموزش رو دانلود میکنن و تمدید انجام نمیدن ( به جاش از راه حل فروش پکیج به جای اشتراک استفاده کردن )
    3. از نظر گستردگی آموزش ها بخش ویژه متناسب تنها برای توسعه دهندگان front end مناسب هست و به نظرم میتونه گسترده تر بشه.
  • سوالتون خیلی مبتدیانه هست و کسی براتون کد نمینویسه.

    جهت جلوگیری از اسپم قفل میشه.

  • علتش اینه شما input از نوع submit دارید

    به شکل زیر تغییر بدید :

    <input type="button" id="btnsubmit" value="send" name="send">

    درضمن شرط php که گذاشتید هم اشتباه هست چونکه اولین بار صفحه لود میشه msg خالی هست و در نتیجه المنت msg ایجاد نمیشه و بعد از ارسال درخواست توسط jquery شما چنین المنتی ندارید که پیغام رو داخلش قرار بدید

  • ٢ ماه پیش @tilkacoder به گفتگوی implode کردن جواب داد.

    @behzad برای اینکه به حالت اولیه برگردونی یعنی آرایه میتونی از explode استفاده کنی

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

  • ٢ ماه پیش @tilkacoder به گفتگوی implode کردن جواب داد.

    باید از implode استفاده کنید نه explode

    $all = [$one, $tow, $three];
    $data = implode('-', $all);
  • @mahdi_mahdi ببینید دوست عزیز هیچ روش یا متدی نیست.

    یک کد HTML هست با یک css خاص که قبل از بارگذاری پست نمایش داده میشه.

    زمانی که شما از jscroll استفاده میکنید اگر به قسمت مستندات این پروژه رجوع کنید زمان ساخت jscroll خصیصه ای وجود داره به نام loadingHtml که یک کد HTML ( یک قالب) رو میتونید بهش بدید که قبل از بارگذاری محتوا اون رو نمایش بده.

    برای مثال وبسایت ویرگول امده کد های زیر رو برای این مسئله قرار داده :

    <div class="jscroll-added"><div class="jscroll-loading" id="jscroll-loading">
        <div class="listItemPlaceholder">
             <div class="listItemPlaceholder-header">
                <div class="avatarPlaceholder"></div>
                <div class="floatRightPlaceholder">
                <div class="linePlaceholder"></div>
                <div class="linePlaceholder"></div>
                </div>
             </div>
             <div class="listItemPlaceholder-body">
                <div class="linePlaceholder"></div>
                <div class="linePlaceholder"></div>
                <div class="linePlaceholder"></div>
             </div>
           </div>
           <a style="display: block;text-align: center;" href="https://heapanalytics.com/?utm_source=badge" rel="nofollow"><img style="width:108px;height:41px" src="//heapanalytics.com/img/badgeLight.png" alt="Heap | Mobile and Web Analytics"></a>
        </div>
    </div>

    که اگر این محتوا رو به خصیصه loadingHtml بدید، زمانی که شما به انتهای صفحه مراجه میکنید این کد رو نمایش میده ( البته باید همرا با css هایی که ویرگول برای این بلاک ساخته استفاده بشه)

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

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

  • ۵ ماه پیش @tilkacoder به گفتگوی تغییر url بدون لود شدن صفحه وب جواب داد.

    این کار امکان پذیر نیست ( زیرا پا گذاشتن حریم شخصی امکان پذیر نیست)

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

  • @mahdi_mahdi بنده خیال کردم متد مد نظر شماست ، بله پلاگین های زیادی وجود داره

    اکثر سایت ها از قبیل ویرگول از ‍jscroll-loading استفاده میکنند

    لینک بعضی از این پلاگین ها :

    jscroll-loading

    lazyload

    Infinite Scroll

  • این مسئله بستگی به طراحی تون داره ، ساده ترین روش، روش زیر هست :

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

    برای مثال شما با استفاده از php در درخواست اول کاربر تنها میاید یه تعداد تصویر با یک مبدا (source) به کاربر تحویل میدید loading که این مسئله سرعت اولیه رو بالا میبره همچنین پردازش در یک درخواست کاهش پیدا میکنه

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

    یکی از مسائل مهم افزایش سرعت کوچیک کردن درخواست هاست.

    به نظرم بد نیست به این لینک ها یه نگاهی بندازی :

    Ways To Reduce Content Shifting On Page Load

    Dynamic Page / Replacing Content

  • ۶ ماه پیش @tilkacoder به گفتگوی تغییر url بدون لود شدن صفحه وب جواب داد.

    اینجور که من متوجه شدم شما میخواید آدرس site.com رو به site2.com تغییر بدید ولی بدون لود شدن صفحه مورد نظر ولی با محتوا شما !!!

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

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

  • ۶ ماه پیش @tilkacoder به گفتگوی آپدیت آنلاین پروژه های لاراول جواب داد.

    @shahryarjb اگر از آخرین ورژن ioncube استفاده کنید میبینید که نه تنها حجم افزایش پیدا نمیکنه بلکه کاهش پیدا میکنه.

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

    در رابطه با تجاری بودن و قیمت ارز کاملا درست میگی برای ما گرون هست اگر الان بخوای اخرین نسخه رو بگیری چیزی حدود ۸ تا ۱۶ میلیون باید هزینه کنی.

    ولی اگر سورس کد مهمی دارید و پروژه بزرگه ارزش داره.

    آخرین نسخه در حال حاضر قابل برگردوندن نیست ولی با استفاده از c++ شما میتونی یک کد میانی (در قالب extension ) بنویسی که هر سورس کد شده ای رو بدست بیاری ولی به این راحتی نیست و در واقع میشه گفت کسی که این همه دانش داشته باشه به دنبال کد های ما نیست.

  • ۶ ماه پیش @tilkacoder به گفتگوی آپدیت آنلاین پروژه های لاراول جواب داد.

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

    برای حفاظت از کد هم راه های زیادی وجود داره که بسته به محیط و اپلیکیشن انتخاب میشه.

    ساده ترین راه برای شما این هست که مشتری از یک سیستم بروز رسانی جدا استفاده کنه و روی اون سیستم کد های خودتون رو به صورت encode قرار بدید

    برای encode و decode کردن کدهاتون سیستم های مختلفی وجود داره که معروف ترین اون ioncube هست.

  • ۷ ماه پیش نویسنده @tilkacoder یک مقاله تازه به اسم اصول Solid در php نوشت.

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

    Solid شامل موارد زیر میباشد :

    1. Single Responsibility Principle (SRP) : یکی از مهم ترین قواعد Solid که بیان میکند تنها یک مسئولیت (وظیفه) واحد توسط هر کلاس ارائه میشود.
    2. Open-Close Principle :‌ این اصل بیان میکند که کلاس باید گسترش پذیر باشد اما برای اصلاح بسته باشد.
    3. Liskov Substitution : کلاس های مشتق شده میتوانند در مکان هایی که کلاس پایه استفاده شده است جایگزین شوند.
    4. Interface Segregation :‌ ما باید interface های خود را بهinterface های کوچک تری تبدیل کنیم تا در هر بخش تنها همان نیاز کاربر را بر طرف کنیم.
    5. Dependency Inversion : این اصل به عبارتی ساده بیان میکند که کلاس های سطح بالا نباید به کلاس سطح پایین وابستگی داشته باشن بلکه هردوی آنها باید به abstractions وابسته باشند.

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

    Single Responsibility

    در یک کلاس شما تنها یک هدف دارید و تمامی متدها برای یک وظیفه واحد اجرا میشوند. اگر کلاسی دارید که چندین هدف یا وظیفه دارد باید به چند کلاس تبدیل شود.

    برای نمونه ما کد زیر را داریم :

    class Setting{
      public function setSettings()
      {
        // set settings
      }
      public function getSettings()
      {
        // get settings
      }
      public function showSettings()
      {
        // show output
      }
    }

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

    class Setting{
      public function setSettings()
      {
        // set settings
      }
      public function getSettings()
      {
        // get settings
      }
    }
    class Output
    {
      public function show($data)
      {
        // show output
      }
    }

    خوب تغییرات بالا باعث شد تا هر کلاس یک هدف خاص رو دنبال کنه و همچنین در آینده اگر نیاز به تغییر یا توسعه باشه با تغییرات اعمال شده اینکار برای ما راحت تر هست.

    Open-Close

    برنامه باید به صورتی نوشته شود که توسعه پذیر باشید اما قابل تغییر نباشد به این صورت که بدون هیچگونه تغییر در ساختار کلاس اصلی بتوانیم کلاس را توسعه دهیم.

    برای مثال ما کد زیر برای ورود اطلاعات به ۲ نوع پایگاه داده رو داریم :

    class DB
    {
      public function insert($connection, $into, $cell, $data)
      {
        if (is_a($connection, 'mysqli')) {
          // connect and insert into mysql and return id 
        } elseif (is_a($connection, 'mongodb')) {
          // connect and insert into mongodb and return id
        }
          throw new DatabaseInvalidConnection;
      }
    }

    خوب این کد توسعه پذیر نیست و برای هر پایگاه داده ما باید بدنه کلاس رو تغییر بدیم، با توجه به اصل بیان شده کد به شکل زیر تغییر میکنه :

    interface Database{
      public function insert($into, $cell, $data);
      public function connect();
    }
    class Mysql implements Database
    {
      public function connect()
      {
        // connect to  mysql database
      }
      public function insert($into, $cell, $data)
      {
        // insert into mysql and return id
      }
    }
    class NoSql implements Database
    {
      public function connect()
      {
        // connect to  mongodb database
      }
      public function insert($into, $cell, $data)
      {
        // insert into mongodb and return id
      }
    }
    class DB
    {
      public function insert($connection, $into, $cell, $data)
      {
        $connection->connect();
        $connection->insert($into, $cell, $data);
      }
    }

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

    Liskov Substitution

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

    برای مثال ما کد زیر را داریم :

    interface OutputInterface{
      public function show($data);
    }
    class Output implements OutputInterface{
      public function show($data)
      {
        // show data
      }
    }
    
    class Formatter extends Output
    {
      public function jsonFormat($data)
      {
        // return json data
      }
      public function show($data)
      {
        $data = $this->jsonFormat($data);
        // show Data
      }
    }

    در این کد اصول Solid رعایت نشده است یا به عبارت بهتر Liskov substitution به درستی اعمال نشده است. کلاس Formatter فرزند کلاس Output میباشد و باید تمامی فعالیت های کلاس والد را بتواند انجام دهد. اگر قسمتی از کد که از کلاس Output استفاده شده است را تغییر دهیم به صورتی که از کلاس Formatter استفاده کند خروجی مد نظر ما داده نمیشود زیرا در این کلاس متد show را ما مجددا بازنویسی کردیم و خروجی به صورت json نمایش داده میشود.

    Interface Segregation

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

    کد زیر را در نظر بگیرید:

    interface ImagesInterface
    {
      public function setWatermark($src);
      public function saveFile($file, $path);
    }
    
    class Image implements ImagesInterface
    {
      public function setWatermark($src)
      {
        // set watermark
      }
      public function saveFile($file, $path)
      {
        // save file
      }
    }

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

    interface ImagesInterface
    {
      public function setWatermark($src);
    }
    interface FileInterface
    {
      public function saveFile($file, $path);
    }
    class Image implements ImagesInterface,FileInterface
    {
      public function setWatermark($src)
      {
        // set watermark
      }
      public function saveFile($file, $path)
      {
        // save file
      }
    }

    Dependency Inversion

    یکی اصل مهم از Solid میباشد که بیان میکند که یک ماژول سطح بالا نباید به یک ماژول سطح پایین وابسته باشد بلکه هر دوی آنها باید به abstractions وابسته باشند. abstractions نباید به جزئیات وابسته باشد بلکه جزیئات باید به abstractions وابسته باشد.

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

    class Crawler
    {
      public function crawlPage()
      {
        // crawl Page with DOMDocument
      }
    }
    class Engines
    {
      public function indexing(Crawler $crawler)
      {
        $crawler->crawlPage();
      }
    }

    اگر در قطع کد بالا ما در بدنه کلاس Crawler تغییر ایجاد کنیم ، کلاس Engines هم تحت تاثیر قرار میگرد. برای حل این مسئله کد را به شکل زیر تغییر میدهیم:

    interface CrawlerInterface
    {
      public function crawlPage();
    }
    
    class Crawler implements CrawlerInterface
    {
      public function crawlPage()
      {
        // crawl Page with DOMDocument
      }
    }
    class Engines
    {
      public function indexing(CrawlerInterface $crawler)
      {
        $crawler->crawlPage();
      }
    }

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

  • ۷ ماه پیش @tilkacoder به گفتگوی پیدا کردن حفره امنیتی جواب داد.

    این در واقع لیست مواردی هست که باید برای شروع یادبگیری :‌

    1. جمع آوری اطلاعات
    2. بررسی تنطیمات، شناسه و تست اعتبار سنجی Authentication
    3. یادگیری باگ های مختلف مانند :تزریق Injection , XXE, XSS و ...
    4. بررسی ساختار داده ها، نحوه انتقال و پردازش داده
    5. استفاده از اکسپلویت ها و ابزارهای مختلف

    این موارد رو یادگرفتن زمان بر هست ولی باید حتما با این مفاهیم آشنا باشید.

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

  • ۷ ماه پیش @tilkacoder به گفتگوی پیدا کردن حفره امنیتی جواب داد.

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

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

    1. درک مفاهیم پایه ای شبکه : فرض کنید میخواهید امنیت یک وبسایت را بررسی کنید، باید بدونید روی چه سروری قرار داره، سرور از چه پروتکل هایی استفاده میکنه و ... .زمانی که بدونید از ssh در یک پورت خاص استفاده میشود میتوانید تست های مربوطه را انجام دهید (البته این یک مثال ساده و کوچیک هست)

    2. به یکی از زبان های اسکریپت نویسی مسلط باشید که python پیشنهاد میشه : اول از همه به شما کمک میکنه تا منطق برنامه نویسی هم داشته باشید و همچنین فرآیندها را خودکار کنید. علت پیشنهاد python این هست که اسکریپت های زیادی در این زمینه با استفاده از این زبان نوشته شده و یادگیری و برنامه نوشتن نسبتا ساده است.

    3. در رابطه با Open Web Application Security Project (OWASP) تحقیق کنید و ۱۰ مورد برتر سال را یادبگیرید.

    4. فراگیری مهندسی معکوس و ابزار های مرتبط و متد های مطرح در این زمینه

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

  • ۸ ماه پیش @tilkacoder به گفتگوی آپلود عکس در CKEditor جواب داد.

    بر اساس این مستندات گفته شده :

    تنظیمات config.uploadUrl شامل اسکریپتی است که قراره آپلود را مدیریت کنه

    باید تنظیمات را بررسی کنید.

    پیشنهاد من این هست در لاراول از پکیج laravel-filemanager استفاده کنید .

  • ۹ ماه پیش نویسنده @tilkacoder یک مقاله تازه به اسم آنچه که یک برنامه نویس وب در ۲۰۱۸ باید بداند - بخش دوم نوشت.

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

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

    آنچه که یک برنامه نویس وب در ۲۰۱۸ باید بداند

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

    ۱.ساختار زبان برنامه نویسی

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

    ۲. مسلط به یک چهارچوب نرم افزاری Framework

    با توجه به زبانی که مسلط هستید برترین فریم ورک را انتخاب کنید و شروع به یادگیری کنید. مسلط بودن به یک فریم ورک خوب در قدم اول باعث میشود که بتوانید به راحتی شغل مورد نظر خود را پیدا کنید و در قدم دوم شما برنامه های خود را به طور معمول ( نه همیشه) به صورت تمیز و منطقی تر بنویسید. همچنین تسهیلات مانند سرعت انجام کار، برنامه نویسی کمتر ( نه همه موارد)، نظم بیشتر و …. در اختیار ما قرار میدهد. حتما در نظر داشتید باشید که ابتدا باید ساختار زبان برنامه نویسی را بلد باشید و سپس به سراغ یادگیری یک چهارچوب برید.

    ۳. امنیت

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

    ۴. تجربه برتر Best practice

    Best practice کمک میکند تا شما برنامه نویسی بهتری باشید. مزایایی که Best practice برای شما دارند :

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

    ۵.Optimization بهینه سازی

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

    • افزایش بارگذاری سرعت صفحات
    • مدیریت درخواست ها به صورت سیستم ها و برنامه های تکثیر شده
    • بهینه کردن فرآیند های بزرگ سیستم
    • و … .

    مواردی مانند متدولوژی توسعه نرم افزار، نحوه بارگذاری داده ها روی حافظه ( در سیستم های بزرگ و داده های زیاد بسیار مهم میباشد)، مدیریت پیش نیاز های برنامه ، نرم افزار مدیریت بسته و ... میباشد ولی در این بخش سعی کردیم تنها موارد کلیدی را بیان کنیم.

  • ١١ ماه پیش نویسنده @tilkacoder یک مقاله تازه به اسم آنچه که یک برنامه نویس وب در ۲۰۱۸ باید بداند - بخش اول نوشت.

    زمانی که در رشته کامپیوتر در حال تحصیل هستید ( یا علاقمند به برنامه نویسی و کامپیوتر) شاید براتون سوال پیش بیاد که برای ورود به بازار کار چه چیز هایی نیاز هست که بلد باشیم. بر اساس هر زمینه ای که میخواهید فعالیت کنید باید تحقیقاتی صورت بگیره ، در چند مقاله تمامی سعی بر این شده است تا چیز هایی که یک برنامه نویس وب در سال ۲۰۱۸ باید بداند را تشریح کنیم.

    در بخش اول بیشتر مواردی که نیاز اکثر برنامه نویسان وب بدانند را تشریح میکنیم سپس در مقالات بعدی وارد جزئیات میشویم.

    گیت - ورژن کنترل

    یک از مهم ترین مسائل آشنایی با یکی از ورژن کنترل ها است. در حال حاضر یکی از محبوب ترین و پر کاربرد ترین ورژن کنترل ها git هست. آموزش های زیادی برای یادگیری این ورژن کنترل هست که میتونید از این لینک یکی از بهترین هارو مشاهده کنید.

    SQL - NOSQL

    باید مفاهیم پایه ای SQLو NOSQL رو بدانید. در اینجا منظور ما یادگیری یک سامانه پایگاه داده مثل mysql یا MongoDB نیست بله مفاهیم و ساختار پایگاه داده SQL و NOSQL است. در رابطه با NOSQL مقداری مفاهیم پایه ای گسترده تر بوده ولی با توجه به اهمیت و رشد بالا سامانه های پایگاه داده NOSQL و همچنین کاربرد بالا توصیه میشه. منظور ما مفاهیمی مانند:

    ‍۱. SQL :

    • معماری پایگاه داده
    • مفاهیم بنیادی
    • جامعیت
    • تراکنش
    • و … .

    ۲. NOSQL :

    • انواع ساختار ها
    • نحوه پردازش دستور
    • Schemaless
    • و … .

    پس از یادگیری مفاهیم پیشنهاد میشود یکی از سامانه های پایگاه داده sql و nosql را یاد بگیرید مانند :

    کش

    فرقی نمیکنه برنامه نویسی frontendباشید یا backend باید به به مفاهیم Caching مسلط باشید. یک برنامه نویس باید به یکی از ابزار ها Web cache مسلط باشد ، Varnish و nginx یک گزینه خوب برای یادگیری میباشد. در وبسایت های امروزی این مسئله بسیار مهم بوده و زمانی که شما به عنوان برنامه نویس شروع به کد نویسی میکنید باید بدونید هرچه درخواست های کمتر و بارگذاری از سرور اصلی شما کمتر باشه ( به صورت اصولی) هزینه کمتری دارید البته باید در نظر داشته باشید که برنامه شما چه کاری انجام خواهد داد. برای برنامه های بی درنگ یا RealTime ساختار فرق داشته و منظور ما نیست.

    تست و دیباگ

    برنامه هاتون رو به شکلی بنویسید که اگر به دیگران نشون دادید آنها هم بتوانند کد شما رو به بخونن مزیت اینکار این هست که اگر بعد از مدت ها کدتون به مشکلی خورد یا نیاز به اپدیت داشتید به راحتی بتونید کد خودتون رو بخونید. تا جایی که امکان داره سعی کنید برای برنامه هاتون در صورتی که امکانش وجود داره تست های مناسب و خودکار بنویسید(‍TDD و BDD). قبل از اینکه یک بخش مهم از برنامتون رو بنویسید ابتدا به شکل شبه کد در قالب کامنت بنویسید سپس بین شبه کد ها شروع کنید کد های اصلی را نوشتن. در یک مفهوم خلاصه باید نحوه تست نویسی و همچنین نوشتن داکیومنت های مناسب دیباگ و توسعه را بلد باشید. پیشنهاد میکنم این پادکست رو گوش بدید در این زمینه میتونه کمکتون کنه .

    در مقاله بعدی به تشریح مواردی که یک برنامه نویس Backend باید بداند میپردازیم.

  • ١٢ ماه پیش @tilkacoder به گفتگوی سوال در مورد چند متدد جواب داد.

    بله چرا نشه با استفاده از دستور زیر یک مدل میسازید به اسم ‍‍‍Post :

    php artisan make:model Post

    سپس در مسیر پروژه داخل دایرکتوری app فایل Post.php را باز کنید و یک متد در کلاس به شکل زیر اضافه کنید:

    public static function foo()
    {
            //...
    }
  • ١٢ ماه پیش @tilkacoder به گفتگوی سوال در مورد چند متدد جواب داد.

    در خط اول :

    User::has('posts')->get();

    تمامی کاربرانی که حداقل یک پست دارند بازیابی میشوند.

    در خط بعدی ‍eager loading صورت میگیره که در واقع یعنی با توجه به ارتباط کاربران با پست ها تمامی کاربران به همراه پست هاشون رو بازیابی میکنه ( به صورت عادی این اتفاق نمیوفته و در Eloquent با استفاده از eager loading اینکار رو انجام میدیم )

    زمانی که ما نیاز داریم در در متد has ( تمامی کاربرانی که حداقل یک پست دارند) شرط هایی اعمال کنیم از whereHas استفاده میکنیم که در اینجا تمامی پست هایی که تاریخ ساخت آنها بزرگتر از مقدار q هست ( البته این مقدار به نظرم اشتباه است و باید درست مقدار دهی بشه) نمایش داده میشه.

    تابع toarray هم مجموعه ای از داده ها که به آنها collection میگیم رو به صورت آرایه php در میاره (به طور مثال مقدار های بازیابی شده با استفاده از Eloquent رو در صورتی که به صورت collection باشه با استفاده از toArray به آرایه تبدیل میکنیم)

    در رابطه با متدto فکر میکنم یک متد تعریف شده توسط کاربر باشه.

  • ١٢ ماه پیش @tilkacoder به گفتگوی تفاوت zend server با apache server جواب داد.

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

    apache به صورت کلی برای سیستم های بزرگ طراحی نشده (نمیگم نمیشه استفاده کرد ولی گزینه های خیلی بهتری هست که خدمات بهتری ارائه میکنند همچنین اگر به پروژه های بزرگ نگاه کنیم متوجه این حرف میشیم)

    اگر یه نگاه کلی به این مسئله کنیم میتونی تصمیم بهتری بگیری :

    1. جامعه ای که از apache استفاده میکنن بسیار زیادتر از ‍zend هست البته منظور من از نظر ابزار مدیریتی هست( در نتیجه منابع بیشتر + متخصص بیشتر )
    2. همانطور که خودت گفتی zend ابزار ها و قابلیت ها خیلی زیاد و کاربردی داره همچنین گواهی های zend در هر زمینه ای که خدمات ارائه میکنه معتبر هست و توسط شرکت های بزرگ پذیرفته میشه ( البته منظور خارج از ایران هست)
  • تمامی جواب های شما توی پاسخ اولیه ام وجود داره ولی اینکه کدوم یکی مناسب شما هست در ادامه بهش اشاره میکنم.

    البته راه های زیاد دیگه ای هم وجود داره.

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

    روش api شاید برای شما مناسب نباشه (وجود ۲ وب سرور سبب اشغال شدن منابع میشه که با توجه به محیط عملیاتی شما بهتره اینکار انجام نشه)

    این اطلاعات توسط چه برنامه و یا افرادی مورد استفاده قرار میگیره.

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

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

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

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

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

  • sqlite از این عملیات پشتیبانی نمیکنه همچنین سطح دسترسی لازم برای اینکار به صورت ریموت به این شکل وجود نداره.

    راه های زیادی برای اینکه اینکار رو انجام بدی وجود داره :

    1. در صورت وجود شبکه فایل بین سیستم ها اشتراک گذاشته بشه.
    2. ساخت یک api برای انجام عملیات های دیتابیس روی سروری که فایل قرار داره.
    3. زمانی که نیاز به کار با دیتابیس هست فایل دریافت بشه و پس از اتمام کار مجددا روی سرور بارگذاری کنید.
    4. و ...

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

  • خدمت شما دوست عزیز :

    عکس از خطا

    عکس از خطا

    با انجام دادن کارهایی که در بالا توضیح دادم میتونید این خطا را برطرف کنید.

    فکر میکنم شما از postman به نحو صحیح استفاده نمیکنید برای همین هست در دیباگ به مشکل میخورید

    همانطور که در بالا توضیح دادم شما متد را در Route نوشته شده به صورت POST قرار دادید و امکان مشاهده در مرورگر به صورت GET نمیباشد ( برای این درخواست)

  • ١٢ ماه پیش @tilkacoder به گفتگوی هایلات کردن کلمات سرچ شده جواب داد.

    برای پیاده سازی سیستم سرچ نیازمند ابزار های زیادی هستید که دوست خوبم امیر تعدادی از آنها را نام برد.

    در رابطه با سوالی که پرسیدی باید بگم راهکار های زیاد و پبچیده ای برای اینکار وجود داره (پلاگین ها، کدهای نمونه و ...)

    یکی از ساده ترین روش ها این هست که کلمه مورد نظر را در اطلاعات بدست آمده ( با استفاده از ajax) جستجو کنید و بین ۲ تگ با یک کلاس خاص قرارش بدید

    نمونه کد

  • اگر خطایی براتون پیش نمیاد پس علت پرسش چیه ؟

    علت این FatalErrorException هم همانطور که نوشته شده این هست که نباید هیچگونه فاصله ای بین شروع تگ php و namespace باشه.

    در واقع کدتون از شکل زیر :

    <?php
    
    namespace App\Http\Middleware

    باید به شکل زیر تغییر پیدا کنه :

    <?php 
    namespace App\Http\Middleware
  • لطفا بخش شرایط و مقررات و همچنین بخش پرسش و پاسخ رو بخونید.

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

    در رابطه با MethodNotAllowedHttpException باید بگم به احتمال زیاد شما صفحه را در مرورگر چک میکنید و یا با متد GET داده ها را ارسال میکنید.( من با پست ارسال کردم و مشکلی نبود)

    درضمن این قسمت از کد باید اصلاح بشه :

    if(! auth()->attempt($valiDate)){
                return response([
                    'data'=>'صحیح نیست',
                    'status'=>'error'
                ],403);
            }

    باید علامت بخش if (!auth()→attempt($valiDate)) { به if (!auth()->attempt($valiDate)) { تبدیل بشه.

    در واقع مشکل شما استفاده از نماد → به جای <- هست ( برای متوجه شدن مشکل از مارک دان استفاده نکردم)

    اطلاعات نمونه (ایمیل و پسورد جهت تست) قرار بدید هم بهتره.

  • ١٢ ماه پیش @tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.

    بله حتما

    همچنین باید encode صفحه و اطلاعات ارسال روی utf8 باشه.

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

  • ١٢ ماه پیش @tilkacoder به گفتگوی اختیاری کردن لینک جواب داد.

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

    Route::post('/api_token/{city?}/', '[email protected]');

    بعد باید متد به شکل زیر تعریف بشه :

    public function foo($city = null)

    برای اینکه در متد POST csrf token مشکل ایجاد نکنه داخل فایل VerifyCsrfToken در فیلد except باید مقدارش به شکل زیر تغییر پیدا کنه :

    [
        '/api_token/*ٔ'
    ]
  • ١٢ ماه پیش @tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.

    شما میتونید برای پایگاه داده چندین کاربر تعریف کنید که هر کاربر سطح دسترسی های مخصوص به خودش رو داره.

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

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

    باید مرحله به مرحله به همراه تکه کد بررسی بشه.

  • ١٢ ماه پیش @tilkacoder به گفتگوی نحوه اتصال به دیتابیس سایت جواب داد.

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

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

    به طور معمول این خطا به ۲ دلیل رخ میده :

    1. کاربر پایگاه داده روی سرور وجود نداره
    2. کاربر دسترسی های لازم بهش داده نشده

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

    برای استفاده از cli در mysql هم از دستور زیر میتونید استفاده کنید:

    ساخت کاربر:

    CREATE USER 'zahediha_pop'@'localhost' IDENTIFIED BY '123456789';
    

    اعطا دسترسی های لازم :

    GRANT ALL PRIVILEGES ON *.* TO 'zahediha_pop'@'localhost'
    WITH GRANT OPTION;
  • باید موارد مختلفی چک بشه.

    یک گام دیگه این هست که به مسیر bootstrap/cache بری و اگر فایل config.php وجود داشت به هر نامی که میخوای تغییر بدی

  • بعضی از سرویس دهندگان به دلایل امنیتی open_basedir را بر روی تنظیمات php فعال میکنند. ( به طور معمول اینکار را برای دسترسی هر کاربر تنها به فایل های خودش انجام میدهند)

    با ارسال تیکت میتونی بگی این مشکل را برات برطرف کنند ولی معمولا میتونید داخل پنل هاست در بخش PHP Settings مقدار open_basedir را برابر none قرار دهید .( اگر تنظیمات وجود نداشت یا براتون سخت بود تیکت بزنید براتون انجام میدن) قبل از بارگذاری بهتره از دستور زیر هم استفاده کنید :

    php artisan cache:clear

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

  • HTML5 Geolocation در صورتی که gps وجود نداشته باشه بر اساس IP کار میکنه

    علت این اختلاف هم همین هست.

    اولین خروجی که پکت رو خارج میکنه اطلاعات رو اضافه میکنه در نتیجه موقعیت اون ثبت میشه.

    برای پیدا کردن موقعیت جغرافیایی با استفاده از IP در php از این افزونه میتونی استفاده کنی ولی این هم همون مشکل رو داره و موقعیت دقیق نمیده

  • اگر دستور مورد نظر به درستی فایل هارو دریافت کرده باشه میتونی با تغییر فایل webpack.mix.js اینکار را انجام بدی.(دیگه از bootstrap نباید استفاده نکنی)

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

    mix.js('resources/assets/js/app.js', 'public/js')
        .sass('resources/assets/sass/app.scss', 'public/css')
        .copy('node_modules/mdbootstrap/js', 'public/mdbootstrap/js')
        .copy('node_modules/mdbootstrap/css', 'public/mdbootstrap/css');

    برای استفاده ازش به صورت لوکال هم باید کد زیر را در layout اصلی خودت قرار بدی :

    <link href="{{'{{'}} mix('mdbootstrap/css/bootstrap.css') }}" rel="stylesheet">
    <link href="{{'{{'}} mix('mdbootstrap/css/mdb.css') }}" rel="stylesheet">

    و کد زیر را قبل از بسته شدن تگ body قرار بده :

    <script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/jquery-3.3.1.min.js') }}"></script>
    <script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/popper.min.js') }}"></script>
    <script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/bootstrap.js') }}"></script>
    <script type="text/javascript" src="{{'{{'}} mix('mdbootstrap/js/mdb.js') }}"></script>

    بعد هم دستور

    npm run watch
  • ١ سال پیش @tilkacoder به گفتگوی اپلیکیشن جواب داد.

    بله چرا که نه ولی شما باید دانش اولیه رو داشته باشی و بتونی سناریو مورد نظرت رو بنویسی و پیاده سازی کنی.

  • ١ سال پیش @tilkacoder به گفتگوی اپلیکیشن جواب داد.

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

    به طور مثال ممکنه شما بخواید زمانی که کاربر روی نسخه موبایل دکمه ثبت را زد این عملیات انجام بشه در نتیجه شما با توجه به سیستم عامل موبایل کاربر باید برنامه رو بنویسید ( به طور مثال برای اندروید با جاوا میتونی همچین کاری رو انجام بدی )

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

    برای اینکه متوجه حرفم بشی یه مثال میزنم :

    من توی یه برنامه تحت وب زمانی که قرار بود از Receipt Printer استفاده کنم با استفاده از js خیلی راحت میتونستم اینکار رو انجام بدم ولی بخاطر مشکلات و مسائلی که وجود داشت مجبور شدم از طریق php این کار رو انجام بدم. برای php با استفاده از کتابخانه escpos-php اینکار رو خیلی راحت انجام دادم.

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

  • ١ سال پیش @tilkacoder به گفتگوی انتخاب یک فریمورک css ، بر اساس vuejs جواب داد.

    در حال حاضر از Bootstrap استفاده میکنم و راضی هم هستم. لینک راهنما

    علت انتخاب هم که دیگه مشخصه و نیازی به توضیح نیست :

    1. فریم ورک با سابقه ای هست و نسخه جدید فوق العاده است ( همین موضوع باعث میشه تا vue هم ساپورتش کنه).
    2. یکی از برترین هاست
    3. زبان فارسی ساپورت میکنه