Сниппеты:
Подраздел:
Языки:

Иван Бармашов
  • Репутация: 60
  • Сниппеты: 6
  • Ревизии: 0

Результат: 0dc7ec0c59a544528cde1e8d76d0c3ce.png

Не знал о такой манипуляции с элементами. Если вы до сих добавляете ксс-классы через if-ы, подумайте об использовании этого подхода.

.members .item:nth-child(n+3):nth-child(-n+5) {
    background: #9b59b6;
    color: #fff;
}
dfatt
  • Репутация: 196
  • Сниппеты: 40
  • Ревизии: 6

Иногда бывает так, что по ошибке вы можете сделать коммит с незаконченным кодом, или файл с настройками для реального сервера был по ошибке добавлен.

Для того чтобы отменить коммит, достаточно в консоли ввести команду:

git reset --soft HEAD~

0X0pVCN.png

Gravatar image
Nepster
  • Репутация: 146
  • Сниппеты: 18
  • Ревизии: 0

GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор.

function guid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
  	s4() + '-' + s4() + s4() + s4();
}

Результат: 9e24e277-8524-812a-9c3f-4930444d74de

Kosuha606
  • Репутация: 9
  • Сниппеты: 7
  • Ревизии: 0

Простой класс, который будет определять принадлежит ли свойство у которого есть определенная форма написания определенному контракту (интерфейсу/классу).

Для надежности можно нужное свойство, у которого должен быть определенный контракт можно закрыть модификатором доступа protected, хотя врядли вы станете обращаться к такому монстро-свойству.

Для проверки контрактов всех свойств нужно вызвать метод check, может быть было бы и не плохо реализовать метод проверки одного конкретного свойства.

Код:

<?php
class Foo extends ContractsChecker {
    protected $separator = 'Contracted';
    protected $FooContractContractedProperty;
}

Продолжение

Kosuha606
  • Репутация: 9
  • Сниппеты: 7
  • Ревизии: 0

К сожалению не нашел в списке языков elisp, поэтому пришлось поставить clojure. В последнее время увлекаюсь lisp и решил на реальной задаче попробовать свои силы, получилось вот это.

Эти функции в совокупности автоматически подставляют префиксы вендоров в весь файл CSS при этом вы можете сами задать какие свойства нужно заменять, сейчас идет поиск только свойства border-radius, соответственно все свойства вроде -moz-border-radius не будут затронуты этим генератором, только оригинальное.

Я понимаю, что у вендоров есть специфичные реализации свойств тот же border-radius если использовать top-left и т.п. может иметь разный синтаксис, но эта проблема может быть решена с помощью хэш таблиц для выполнения подстановки вместо обычного списка в функции resolve-css-name.

Тестировал на файле в 5000 строк и вся подстановка прошла быстро, не больше 1 секунды, но выравнивание всего файла заняло тоже около 1 секунды.

(defun auto-prefixy (p)
  "p - Точка на которой произошел запуск функции.
Функция для автоматического подставления
Префиксов на весь файл стилей"
  (interactive "p")
  (save-excursion
	(let ((string (buffer-substring-no-properties (point-min) (point-max)))
		  (list-strings)
		  (value)
		  (result-string))
	  (setq list-strings (split-string string "\n"))
	  (dolist (element list-strings value)
		(setq element (trim-string element))
		(if (resolve-css-name element)
			(setq result-string (concat result-string (add-prefixies element) "\n"))
		  (setq result-string (concat result-string element "\n"))))
	  (delete-region (point-min) (point-max))
	  (insert result-string)
	  (indent-region (point-min) (point-max)))))     

Продолжение

IStranger
  • Репутация: 10
  • Сниппеты: 8
  • Ревизии: 0

Высокопроизводительная функция проверяет массив на предмет содержания целочисленных значений (либо целочисленных строк):


/**
 * Checks whether all elements of an array are integers (integer value or string with integer value).
 * Note: this is very efficient method can be used for array with 10000+ items.
 *
 * @param int[]|string[] $array One dimensional array to check
 *
 * @return bool
 */ 
function hasOnlyIntEntries(array $array)
{
    return ctype_digit(join('', $array));
}

Продолжение

IStranger
  • Репутация: 10
  • Сниппеты: 8
  • Ревизии: 0

Часто бывает необходимо удалить классы, начинающиеся с определенной строки. Например: has-state-active, has-state-pending, has-state-disabled. Простейший и очевидный способ - это использовать символы подставноки: has-state-*.

Продолжение

IStranger
  • Репутация: 10
  • Сниппеты: 8
  • Ревизии: 0

"Золотые" правила оптимизации фронтэнда часто рекомендуют подключать все JS скрипты в конце страницы. Однако обычно нам строго необходимо подлючать <script src="//jquery.js"> в <head> страницы, и мы не можем его оттуда удалить, поскольку контент страницы может содержать onReady-обработчики, например $(function(){ ... }). Такие обработчики обычно вставляются автоматически сторонними виджетами, CMS, фреймворками.

Этот короткий скрипт позволяет переместить подключение jquery.js из <head> в конец <body> без изменения имеющихся onReady-обработчиков на странице.

Продолжение

IStranger
  • Репутация: 10
  • Сниппеты: 8
  • Ревизии: 0

Когда мы работаем с каким либо API интерфейсом, очень часто они имеют ограничения на количество выполняемых запросов в единицу времени. Данный хелпер призван помочь решить данную проблемы наиболее эффективным способом.

Код хелпера:


/**
 * Helper for work with some API.
 */
class ApiHelper
{

    /**
     * Wraps specified callback function and retries of execution in the case when callback throws specified exception.
     * Used Exponential BackOff algorithm for evaluating of timeouts between retries of callback execution.
     *
     * Example:
     * <code>
     *  $sendHttpRequest = function ($pageNum) use ($httpClient){
     *      $httpClient->sendGet('http://example.com?pageNum=' . $pageNum);
     *  };
     *
     *  $wrappedFn = ApiHelper::wrapUsingExponentialBackOff($sendHttpRequest, 5000, '\TooManyRequestsHttpException');
     *
     *  // We perform 100 requests. But remote server has RateLimit.
     *  for ($i = 1; $i <= 100; $i++) {
     *      // $sendHttpRequest($i);     // request without wrapper
     *      $wrappedFn($i);              // request with wrapper
     *      // this wrapper retry callback execution in the case of \TooManyRequestsHttpException exception.
     *  }
     * </code>
     *
     * @param \Closure $callbackFn                  Callback function.
     * @param int      $maxSleepMs                  Max value of timeout between callback execution.
     * @param string   $rateLimitExceptionClassName Exception that should throw callback on rate limit.
     * @param int      $maxRetries                  Max number of retries.
     * @param \Closure $onTooManyRequest            Callback function that performed on each RateLimit exception.
     *
     * @return \Closure
     */
    public static function wrapUsingExponentialBackOff(\Closure $callbackFn, $maxSleepMs, $rateLimitExceptionClassName, $maxRetries = 10, \Closure $onTooManyRequest = null)
    {
        $wrapFn = function () use ($callbackFn, $maxSleepMs, $rateLimitExceptionClassName, $maxRetries, $onTooManyRequest) {

            $currentTry    = 0;
            $retriesRemain = $maxRetries;

            while ($retriesRemain-- > 0) {

                try {
                    $currentTry++;
                    return call_user_func_array($callbackFn, func_get_args());

                } catch (\Exception $exception) {

                    // retries only throttling errors
                    if ($exception instanceof $rateLimitExceptionClassName) {
                        $backOffDuration = static::_getSleepDuration($currentTry, 10, $maxSleepMs);

                        if ($onTooManyRequest) {
                            $onTooManyRequest($exception, $backOffDuration, $retriesRemain, $currentTry);
                        }

                        usleep($backOffDuration * 1000);
                    } else {
                        throw $exception;
                    }

                }

            }

            throw new \Exception('ExponentialBackOff: Too many retries of function call [maxRetries=' . $maxRetries . ']');
        };

        return $wrapFn;
    }

    protected static function _getSleepDuration($currentTry, $minSleepMs, $maxSleepMs)
    {
        $currentSleepMs = (int)($minSleepMs * pow(2, $currentTry));

        return min($currentSleepMs, $maxSleepMs);
    }
}

Продолжение

Kosuha606
  • Репутация: 9
  • Сниппеты: 7
  • Ревизии: 0

Этот класс можно использовать в случаях, когда необходимо заставить барузеры клиентов обновить ресурсы ( css, js ) при их изменении в git. Требует доступного на выполнение git.

Этот пример оптимизирован по совету пользователя matweew. Улучшенную версию смотрите ниже после этой.

Первая версия:

<?php

class HashedAsset
{
    public $hash;
    
    public function init()
    {
        exec('git describe --always',$version_hash);
        if (isset($version_hash[0])) {
            $this->hash = md5($version_hash[0]);    
        }
    }
}

Продолжение