• Функция в качестве параметра?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция в JS – это тоже объект. Её можно назначить переменной, передать аргументом в другую функцию, вернуть как результат работы другой функции.

    // исходное определение:
    const flip(f) => (a, b) => f(b, a);
    
    // можно развернуть:
    function flip(sourceFunction) {
      return function(a, b) {
        return sourceFunction(b, a);
      }
    }
    Функция flip() принимает аргументом функцию. И возвращает новую функцию.

    Создаваемая-возвращаемая функция вызывает исходную с аргументами наоборот.

    можно разжевать
    function flip(f) {
      // ура, нам дали какую-то исходную функцию!
      var sourceFunction = f; // для красоты запишем её в свою переменную
      // можно и вызвать её при желании:  sourceFunction(4, 5)
      // но пока не будем. Рано. Ждём.
    
      // сделаем новую, хакерскую функцию
      var hackerFunc = function(a, b) {
        // тут пусть всю работу делает старая функция
        var result = sourceFunction(a, b);
    
        // стоп. Не то. Надо же аргументы местами поменять
        var result = sourceFunction(b, a);
    
        // хакерский результат
        return result;
      } // конец определения хакер-функции
      
      // вернём теперь хакер-функцию:
      return hackerFunc;
    }
    Вот как flip(f) возващает новую хитрую хакерскую функцию.

    Ответ написан
  • Как подключиться по ssh к контейнеру Docker?

    Папку .ssh с ключами из домашней директории подключили в контейнер?

    docker run \
      -v "$HOME/.ssh":/root/.ssh:ro
      ...
    Ответ написан
  • Какие есть способы по кадрам рисовать видео в canvas?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    А вот пример работы с видео в canvas – там налету меняют фон.

    Т.е. из AfterEffects выводите как обычное mp4 / h264 видео.
    Ответ написан
  • Программное решение для генерации видео из песни + картинки с эффектом эквализации?

    Несколько вариантов визуализаций с помощью ffmpeg и их превью:
    https://hhsprings.bitbucket.io/docs/programming/ex...
    Ответ написан
    Комментировать
  • Зачем писать tooltipElem = null;?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    document.onmouseout = function(e) {
      if (tooltipElem) {
        tooltipElem.remove();
        tooltipElem = null;
      }
    };


    Чтобы при следующем событии mouseout условие if (tooltipElem) не проходило и не выполнялся лишний раз tooltipElem.remove()
    Ответ написан
    Комментировать
  • Как создать такую паутинку на канвасе?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот пример на D3js – интерактивный, реагирует на мышку. Реализация на SVG, но можно переписать и на canvas, если это так важно.

    index.html
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/ >
    		<title>Smoothed Radar Chart</title>
    
    		<!-- Google fonts -->
    		<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,300" rel='stylesheet' type='text/css'>
    		<link href='https://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
    
    		<!-- D3.js -->
    		<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
    		<script src="https://d3js.org/d3-path.v1.min.js" charset="utf-8"></script>
    		<script src="radarChart.js" charset="utf-8"></script>
    		<style>
    			body {
    				font-family: 'Open Sans', sans-serif;
    				font-size: 11px;
    				font-weight: 300;
    				fill: #242424;
    				text-align: center;
    				text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
    				cursor: default;
    			}
    
    			.legend {
    				font-family: 'Raleway', sans-serif;
    				fill: #333333;
    			}
    		</style>
    	</head>
    	<body>
    		<div class="radarChart" style="display: inline-flex;"></div>
    		<div class="radarChart2" style="display: inline-flex;"></div>
    		<script>
    			//////////////////////////////////////////////////////////////
    			//////////////////////// Set-Up //////////////////////////////
    			//////////////////////////////////////////////////////////////
    
    			var margin = { top: 50, right: 80, bottom: 50, left: 80 },
    				width = Math.min(700, window.innerWidth / 4) - margin.left - margin.right,
    				height = Math.min(width, window.innerHeight - margin.top - margin.bottom);
    
    			//////////////////////////////////////////////////////////////
    			////////////////////////// Data //////////////////////////////
    			//////////////////////////////////////////////////////////////
    
    			var data = [
    				{ name: 'Allocated budget',
    					axes: [
    						{axis: 'Sales', value: 42},
    						{axis: 'Marketing', value: 20},
    						{axis: 'Development', value: 60},
    						{axis: 'Customer Support', value: 26},
    						{axis: 'Information Technology', value: 35},
    						{axis: 'Administration', value: 20}
    					]
    				},
    				{ name: 'Actual Spending',
    					axes: [
    						{axis: 'Sales', value: 50},
    						{axis: 'Marketing', value: 45},
    						{axis: 'Development', value: 20},
    						{axis: 'Customer Support', value: 20},
    						{axis: 'Information Technology', value: 25},
    						{axis: 'Administration', value: 23}
    					]
    				}
    			];
    
    			//////////////////////////////////////////////////////////////
    			////// First example /////////////////////////////////////////
          ///// (not so much options) //////////////////////////////////
    			//////////////////////////////////////////////////////////////
    			var radarChartOptions = {
    			  w: 290,
    			  h: 350,
    			  margin: margin,
    			  levels: 5,
    			  roundStrokes: true,
    				color: d3.scaleOrdinal().range(["#26AF32", "#762712"]),
    				format: '.0f'
    			};
    
    			// Draw the chart, get a reference the created svg element :
    			let svg_radar1 = RadarChart(".radarChart", data, radarChartOptions);
    
    			//////////////////////////////////////////////////////////////
    			///// Second example /////////////////////////////////////////
    			///// Chart legend, custom color, custom unit, etc. //////////
    			//////////////////////////////////////////////////////////////
    			var radarChartOptions2 = {
    			  w: 290,
    			  h: 350,
    			  margin: margin,
    			  maxValue: 60,
    			  levels: 6,
    			  roundStrokes: false,
    			  color: d3.scaleOrdinal().range(["#AFC52F", "#ff6600"]),
    				format: '.0f',
    				legend: { title: 'Organization XYZ', translateX: 100, translateY: 40 },
    				unit: '$'
    			};
    
    			// Draw the chart, get a reference the created svg element :
    			let svg_radar2 = RadarChart(".radarChart2", data, radarChartOptions2);
    		</script>
    	</body>
    </html>


    radarChart.js
    Ответ написан
  • Как и где можно получить правильное название музыкального трека?

    Насколько я знаю, до сих пор нет какой-то единой Базы Данных всех музыкальных произведений. Есть множество отдельных. Например, РАО, Discogs (есть api), AllMusic.

    Поиск в них может помочь найти наиболее похожие названия. Ошибки исключить нельзя.
    Ответ написан
    Комментировать
  • Какие разделы математики нужны для машинного обучения?

    Скорее всего, осваивать машоб вы будете с каким-то (видео-)курсом. В описании курса обычно указывают, какие знания необходимо освежить, чтобы заниматься.

    Есть курсы с высокими требованиями к линейной алгебре, матану, мат. статистике. Есть курсы с минимум математики, где стараются объяснить проще и показывают, как пользоваться. Почти наверняка курс будет на английском языке.

    DeepLearning.ai, Udacity, Coursera, Яндекс

    Так что просто подберите наиболее подходящий вам курс, и вперёд!

    p.s. поздравляю с работой!
    Ответ написан
  • Как делать регулярные выражения javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const re = /jsInterface.event\("user=(\d+);level/;
    let playerId;
    const scripts = document.querySelectorAll('script');
    for (let i = 0; i < scripts.length; i++) {
      const match = scripts[i].innerText.match(re);
      if (match) {
        playerId = +match[1];
        break;
      }
    }
    
    console.log(playerId)  // 4180878
    Ответ написан
    Комментировать
  • Задачка с нахождением анаграмм в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    как можно улучшить данный код

    Избежать лишних действий.

    Например, незачем на каждом шаге снова разбивать и сортировать исходное слово – достаточно сделать это один раз:
    function anagrams(word, words) {
        const sample = word.split('').sort().join('');
        return words.filter(function (e) {
            return e.split('').sort().join('') === sample;
        })
    }


    Нет смысла проверять неподходящие по длине слова.
    function anagrams(word, words) {
        const length = word.length;
        const sample = word.split('').sort().join('');
        return words.filter(w => w.length === length)
            .filter(function (e) {
                return e.split('').sort().join('') === sample;
            })
    }


    P.S. я вот такое решение отправил. Сравнить длину. Привести к lowercase. Запоминать позиции, в которых найден очередной символ и дальше искать после этой позиции (если будут повторы этого же символа). Как только какой-то символ не найден – всё, не совпали.
    Код
    // write the function isAnagram
    var isAnagram = function(test, original) {
      const length = original.length;
    
      if (length !== test.length) return false;
    
      const A = test.toLowerCase();
      const B = original.toLowerCase();
      const dict = {};
    
      for (let i=0, char, pos; i < length; i++) {
        char = A[i];
        pos = B.indexOf(char, +dict[char]);
        if (!~pos) return false;
        dict[char] = pos + 1;
      }
    
      return true;
    };
    Ответ написан
    Комментировать
  • Можно ли в интерфейсе указать что класс наследует другой класс?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Интерфейс может extends (расширять) родительский интерфейс:
    <?php
    interface a
    {
        public function foo();
    }
    
    interface b extends a
    {
        public function baz(Baz $baz);
    }


    Напишите интерфейс ModelInterface, который бы класс Model воплощал.
    Создайте новый интерфейс ArticleInterface, наследующий ModelInterface:
    interface ArticleInterface extends ModelInterface
    {
      // доп. методы
    }
    
    class Article implements ArticleInterface
    {
    
    }


    Итого объявление класса Article будет примерно таким:
    class Article extends Model implements ArticleInterface


    рабочий код
    <?php
    
    interface ModelInterface
    {
      public function get();
      public function all();
    }
    
    interface ArticleInterface extends ModelInterface
    {
      public function publish();
    }
    
    
    class Model implements ModelInterface
    {
      public function get()
      {
        return "get";
      }
    
      public function all()
      {
        return "all";
      }
    }
    
    class Article extends Model implements ArticleInterface 
    {
      public function publish() {
        return "published!";
      }
    }
    
    
    $article = new Article();
    echo $article->get();
    echo $article->publish();
    Ответ написан
    8 комментариев
  • Как к бинарному значению прибавить 0?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно, вам нужен был битовый сдвиг вправо?
    $nRight = $nRight << 1;

    Например:
    $nRight = 55;
    echo decbin($nRight); // 110111
    
    $nRight = $nRight << 1;
    echo decbin($nRight); // 1101110
    echo $nRight; // 110 в десятичной ( это 55 * 2 )


    Upd. выяснилось, что требуется к бинарной строке длиной 6 байт дописать ещё 1 байт с нулями. $all = $nRight . pack('C', 0);
    Ответ написан
  • Как грамотно и с минимальными затратами опросить нужную мне аудиторию?

    1. Посмотреть, установлены ли на том сайте Google Analytics или Яндекс.Метрика.
    2. Создать опрос на сервисе опросов (Google Forms, SurveyMonkey) или лендинг с опросом.
    3. Таргетить рекламное объявление со ссылкой на опрос только на аудиторию того сайта.
    Ответ написан
    7 комментариев
  • Можно ли сделать сетеры для методов массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Может, переопределить метод на экземпляре?
    var a = [];
    a.push = function() {
      Array.prototype.push.apply(this, arguments);
      // todo
      console.log("QnA.habr");
    }
    
    a.push(5); // QnA.habr
    a.toString() // Array [ 5 ]
    Ответ написан
    Комментировать
  • Как проверить, что переданный параметр это функция?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    typeof будет равен "function" и для Object, String, Date, например — что не входит в ваши планы.

    С другой стороны, если весь код ваш, то достаточно проверять на не-пустоту
    callback && callback();

    Библиотека UnderscoreJS так определяет, функция ли аргумент:
    Object.prototype.toString.call(callback) === '[object Function]'
    и для вас можно так:
    callback  &&  Object.prototype.toString.call(callback) === '[object Function]'  &&  callback();
    Ответ написан
  • Как в одном контейнере (php) вызвать другой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Думаю, стоит поднять отдельный Docker-контейнер с нужной версией PHP, и обращаться к нему.

    По протоколу HTTP – в родительском PHP скрипте обычным curl или школьным file_get_contents() дергать некий локальный URL.

    Это может быть RoadRunner или дергать уже существующий в другом контейнере NGINX, который обращения на определённый URL передаст не в основной PHP-FPM, а в тот, с другой версией.
    Ответ написан
    Комментировать
  • Кто может пояснить код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вызов inBetween(3, 6) возвращает не строку, не число, а функкцию.

    Можно длиннее записать:
    var daFunc = inBetween(3, 6); // daFunc это функция
    
    arr.filter(daFunc);

    Почти1 то же, что:
    var daFunc = function() {
      console.log(arguments);
    }
    
    arr.filter(daFunc);
    1«Почти» — потому, что контекст тут другой будет. Всякие a и b не будут определены.

    Или:
    function daFunc() { console.log(arguments); }
    
    arr.filter(daFunc);

    Или:
    arr.filter( function() { console.log(arguments); });


    В общем, arguments там никакой не внешний / родительский / фильтрованный, а свой собственный.
    С чем вызвали — то и получили. Вызвали в фильтре – аргументы фильтровские и получили.
    Ответ написан
    Комментировать
  • Как выделить жирным несовпадающие части?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    посмотрите на задачу иначе: выделить в каждом результате – поисковую строку. А остальное сделать жирным )

    Поможет простая замена str_replace(), или, если возможно многократное вхождение поискового куска в строке, preg_replace().

    Заменять искомую строку на неё же в обёртке, например, в тегах <span>поисковая строка</span>. Жирноту/нежирноту сделать стилями.
    Ответ написан
    Комментировать
  • Самый лучший по точности бесплатный сервис предоставляющий API для определения местоположения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Может, Google Geolocation API посмотреть?

    Сам не пробовал. Уточните, в каких масштабах можно бесплатно пользоваться.
    Ответ написан
    Комментировать
  • Как парсить элемент из другого сайта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Незачем что-то парсить. ipinfo.io предоставляет API, есть бесплатный план (до 50 тыс. запросов в месяц)

    Например, с помощью jQuery, без авторизации можно получить IP, страну:
    $.get("https://ipinfo.io", function(response) {
      console.log(response.ip, response.country);
    }, "jsonp")


    Response содержит больше полей:
    {
      "ip": "134.209.xxx.xxx",
      "city": "Clifton",
      "region": "New Jersey",
      "country": "US",
      "loc": "40.8344,-74.1377",
      "org": "AS14061 DigitalOcean, LLC",
      "postal": "07014",
      "timezone": "America/New_York",
      "readme": "https://ipinfo.io/missingauth"
    }
    Ответ написан
    9 комментариев