• Как разделить динамический вывод элементов на группы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    • array_chunk() бьёт массив на группы по N элеметов.
    • array_map() применяет функцию к каждому из элементов.
    $cities = array('London', 'NY', 'LE', 'Rome');
    
    function wrapRow( $row) { return '<div>' . join(", ", $row) . '</div>'; }
    
    $rows = array_chunk( $cities, 3);
    $html = join( array_map("wrapRow", $rows));
    
    var_dump($html); // "<div>London, NY, LE</div><div>Rome</div>"
    Ответ написан
    Комментировать
  • Как лучше выводить строки с несколькими переменными?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    // 3-й вариант
    printf( "Format: %s. Config: %s. System (OS): %s.\n\n", 
      $format,
      $config->path,
      $os
    );


    А воообще, «вам шашечки, или ехать?!» и «работает – не трожь!»

    Пишите код, как вам лично кажется лучше, пока работает и пока не получили аргументированных возражений от коллег по коду.
    Ответ написан
    2 комментария
  • Вечный оффлайн (невидимка) ВКонтакте неработает?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    В оф. сообществе ВК LIVE пишут 2-го мая 2017:

    С прошлой недели статус Online стал работать точнее: теперь он отключается уже через пять минут после выхода пользователя из аккаунта вместо прежних пятнадцати. Из-за этих изменений перестал работать так называемый режим “невидимки” — баг, который позволял сидеть ВКонтакте, оставаясь как бы не в сети.

    Некоторые пользователи оказались этим очень недовольны. Однако нужно понимать, что этот режим сам по себе противоречит духу ВКонтакте. Социальные сети предназначены в первую очередь для общения, а для этого нужно знать, когда ваш собеседник в сети, а когда — нет. Конечно, бывают ситуации, когда действительно нужно скрыть своё пребывание на сайте. Но чаще всего люди пользовались этой возможностью, просто потому что могли — без какой-либо объективной причины.
    Ответ написан
    Комментировать
  • Как анимировать SVG-маску?

    Изменение формы (morphing) возможен только когда число точек в начальной и конечной фигурах одинаково. См. урок How SVG Shape Morphing Works и примеры на CodePen
    Ответ написан
    Комментировать
  • Как отправить картинку по ссылке POST методом?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    скачивать изображения всё-таки придётся – хотя бы по одному, во временную папку, чтобы загрузить в ВК и удалить у себя по окончании загрузки.

    Что касается непосредственно загрузки, можно использовать cURL и его CURLFile, или, удобнее, Guzzle. Например:
    $client = new \GuzzleHttp\Client;
    		$resource = fopen( $tmpfile, 'r');
    		$response = $client->request(
    			'POST',
    			$upload_url,
    			[
    				'multipart' => [
    					[
    						'name'	 => 'file',
    						'contents' => $resource
    					]
    				]
    			]
    		);
    		
    		$uploadResult = json_decode( $response->getBody());
    Ответ написан
    Комментировать
  • Можно ли в node.js создать условие зависящее от изменений в MySQL?

    Вы хотите реализовать паттерн pub-sub на MySQL – где такой возможности нет.
    Может, найти разумную альтернативу?
    • при вставке данных дёргать функцию, оповещающую node;
    • задействовать другое хранилище данных – например, Redis, где pub-sub прекрасно реализован;

    Ну, или остаётся так-себе вариант – polling – раз в N ms делать запросы к MySQL, проверяя, не появились ли новые записи.
    Ответ написан
    Комментировать
  • А SSL-сертификат можно и для IP без домена?

    Верно. Например.
    Ответ написан
    Комментировать
  • Конвертировать строку в объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    JSON.parse() возвращает объект или бросает исключение SyntaxError, если не парсится.

    Попробуйте примерно так:

    var lastGood = this.currentClient.jsondata, candidate, counter = 0, found = false;
    while ( ++counter < 100) {
      try {
        candidate = JSON.parse(boo);
      } catch(e) {
        this.currentClient.jsondata = lastGood;
        found = true;
      }
      if( found) break;
      lastGood = candidate;
    }


    Не сразу назначать полученное значение, а исползовать промежуточную переменную candidate. Ограничить максимальное число итераций счётчиком. Ловить исключение.
    Ответ написан
    Комментировать
  • Стоит ли удалять все символы из $_GET['submit']?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно использовать функцию filter_input() и очищающие фильтры.
    <?php
    $search = filter_input( INPUT_GET, "search", FILTER_SANITIZE_STRING);
    if( !empty($search)) {
      echo $search;
      echo "Yes";
    } else {
      echo "No";
    }
    Ответ написан
    1 комментарий
  • Как решить эту задачу?

    У меня дискретной математики не было, но решал бы так. Есть утверждения:
    Л: Пс Бд
    П: Лс Бд
    Б: Лс Пе

    Найдём пару утверждений из которых один оба раза сорвал, другой оба раза сказал правду. Поскольку утверждения Л-П связаны через Бд, а П-Б через Лс, остаётся пара Л-Б – кто-то из них оба раза правда, другой оба раза ложь.

    Ложное утверждение обозначу с воскл. знаком (логическое НЕ) – например, !Лс.

    Итак, один раз соврал и один сказал правду, выходит, Пончик: П: !Лс Бд

    Чтобы Лс было ложным, надо так же сделать ложными утверждения Б. Значит, Б оба раза соврал, а Л оба раза сказал правду:
    Л: Пс Бд
    П: !Лс Бд
    Б: !Лс !Пе

    Итого, точно знаем: Пс и Бд. Остаётся Ле.
    Ленчик – ель; Пончик – сосна; Батончик – дуб.

    upd. Таблица истинности так составляется?
    Л П Б  Пс Бд  Лс Бд  Лс Пе
    0 1 2  0  0   1  1   0  1  конфликт Бд и Лс
    0 2 1  0  0   0  1   1  1  конфликт Бд и Лс  
    1 0 2  1  1   0  0   0  1  конфликт Бд
    2 0 1  0  1   0  0   1  1  конфликт Бд и Лс
    1 2 0  1  1   0  1   0  0  ОК
    2 1 0  0  1   1  1   0  0  конфликт Лс

    Переменные три: истинность утверждений каждого персонажа. Три возможных состояния: 0 – оба раза соврал, 1 – оба раза правда, 2 – соврал-правда. Дальше раскрываем их значение по каждому из утверждений (0 ложь, 1 истина). Во всех вариантах, кроме одного возникают логические конфликты.
    Ответ написан
    Комментировать
  • Как аутентифицировать пользователя используя HMAC?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Пример использования – ВКонтакте и его iFrame приложения. Когда пользователь запускает приложение, нажав ссылку в ВК, открывается iframe сервера разработчика. ВК отправляет туда пользователя с некоторыми параметрами – среди них id пользователя ВКонтакте и прочие. И подпись (параметр auth_key), вычисляемый как md5 хэш от параметров, которые важно защитить от подделки пользователем, и «секрета» приложения.

    Т.е. схема приемлема, когда есть три стороны: сервер ВК, сервер приложения и «ненадёжный» юзер, который, возможно, захочет подделать передаваемые от ВК приложению параметры. «Секрет» известен только серверу ВК и серверу приложения. Вычисляемый на его основе хэш гарантирует целостность и неподдельность данных.

    В вашем случае HMAC имел бы смысл в схеме, например, аутентификации пользователя на одном сервере для работы на другом. Секретный ключ раскрывать пользователю, разумеется, не нужно.
    Ответ написан
    Комментировать
  • Как устранить ошибку "no access_token passed"?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Возможно, вы дёргаете методы API, доступ к которым с апреля стал требовать сервисного ключа доступа.
    Ответ написан
    Комментировать
  • По какому уравнению конвертировать время в проценты?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Парабола подойдёт? y = 100 - 100 * sqrt( x / N) (N – время, когда результат становится нулём)
    80e67e9beec44172b96322f4d832ea83.png
    Примерно в ваши точки ложится парабола с такими параметрами:
    y = 100 - 100 * sqrt( x / 176000)
    be47111e76a34a82b135672a3ee25914.png
    (здесь проценты в 1000 раз больше для пропорционального графика)

    Или, чтобы не так резко падало значение в первые моменты, можно взять смещённую логарифмическую кривую y = 100 - 30 ln( 1 + x / 10000)
    ab5f3ddc2f2d43eca10a1b7867704089.png
    Ответ написан
    2 комментария
  • Как сделать такой эффект на canvas?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Просто круги: jsFiddle
    var canvas = document.getElementById("myCanvas")
      , ctx = canvas.getContext("2d")
    	, r
    ;
    ctx.translate( 500/2, 500/2); // передвинуться на центр листа
    
    ctx.font = "14px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline="middle"; 
    
    ctx.fillStyle = "#999";
    for(r=100;r<=500;r+=20) circle(r);
    
    function circle(r) {
      var dist = 16
    		, n = Math.round( 2 * Math.PI * r / dist)
    		, i
    	;
    
    	for(i=0;i<n;i++) {
    		ctx.rotate( 2 * Math.PI / n); // повернуть лист
    		ctx.fillText( Math.round(100*Math.random())%2?0:1,0,-r);
    	}
    }


    35d5640debf1414581e8d3d14d596d7d.png

    Для меняющегося плавными областями цвета цифр можно задействовать шум Перлина – берутся координаты (x,y) в которые попадает очередная цифра, и через шум Перлина получается её яркость – так получаются не хаотичные, а плавными областями, как облака, яркости. Напр. реализация шума Перлина на JS.
    Ответ написан
    Комментировать
  • Как записать такой скринкаст?

    • сценарий
    • запись видео
    • запись голоса
    • точная подгонка видео под голос, используя time remapping в After Effects или аналогичную функцию в других видеоредакторах.
    • p.s. плавающий экран задаётся expression (скриптом) в AfterEffects, который плавно псевдослучайно двигает камеру и слой со скринкастом. Указывается точка "внимания", которая должна оставаться видимой, не выезжая за кадр, ближе к середине итогового кадра.
    Ответ написан
    Комментировать
  • Как сделать, чтобы меньшие числа давали больше очков?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Буквально ваши правила реализуются подобным JavaScript кодом – с условиями:
    function getPostScore(time) {
      var diff = Math.floor((new Date()).getTime()/1000) - time;
      if( diff <= 3600) return 50000;
      else if( diff <= 7200) return 25000;
      else if( diff <= 10800) return 10000;
      else return 0;
    }
    
    getPostScore(1493487180); // 10000


    Но ступенчатость значений, наверное, не вполне оправдана и лучше будет какой-то гладкой функцией. Например, вида y = k / x
    af5c49df83bb430f9f7ba91b2c6bc147.png
    С коэффициентом k = 50000 * 3600 она удачно захватывает и вторую точку. Но плоха тем, что ближе к нулю зашкаливает в +бесконечность.

    Наверное, для вашей задачи уместнее S-образная кривая – сигмоида, задаваемая формулой вида y = 1 / (1 + e-x) Примерно подобрал коэффициенты:
    ecd0f96a15224fe2ac9fb125e7305b8f.png
    function getPostSigma(time){
      var diff = Math.floor((new Date()).getTime()/1000) - time;
      return Math.round( 10000 + 40000 / (1 + Math.exp((diff-6800)/700)));
    }
    
    getPostSigma(1493531780); // 49998
    getPostSigma(1493522780); // 11545
    Ответ написан
    Комментировать
  • Добавление элементов из json и последующее удаление?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Известно, сколько максимум блоков видно одновременно. Блоки держать в массиве. Вставлять и вынимать их из DOM – в странице присутствуют в любой момент только те 2 блока, что видны.

    Можно сделать на JS, но анимация дергается.

    Но лучше вариант с CSS анимацией. Тут используется две анимации – въезд в кадр, и выезд. По окончании каждой анимации вызывается событие transitionend. По завершении въезда – пора запускать выезд себя и въезд следующего.
    Ответ написан
  • SSL-сертификат на DNS от Яндекс?

    Войти на pdd.yandex.ru – «редактор DNS» под аккаунтом того, кто добавил домен на Яндекс, и добавить TXT запись.

    «если делегировать домен на DNS-сервера хостера» и там прописать все те же IP адреса сайта, то ничего не упадёт. DNS сервера – просто стрелочники, которые указывают на какой IP обращаться, если есть имя сайта. Вы к нему с вопросом «хочу www site ru» – а он в ответ «стучитесь по адресу 12.34.56.78». Этой задачей могут заниматься как DNS сервера Яндекса, так и хостера, так и любые другие.
    Ответ написан
    Комментировать
  • Как работает именованный аргумент функции в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    options, которым даёте значение в начале, и options внутри функции – это две разные штуки. Разберитесь с «областью видимости» переменных в JavaScript. Внутри функции как бы объявляется собственная версия переменной options, значение которой передаётся в функцию при её вызове.

    Для читаемости назовите аргумент функции иначе, например, opts – и всё встанет на свои места:

    options = {
        width: 10,
        height: 20,
        contents: 'some text'
    };
    
    function show(opts) {
        var width = opts.width || "";
        var height = opts.height || "";
        var contents = opts.contents || "Предупреждение";
        return width + height + contents;
    }
    
    console.log(show( options)); // 30some text
    options.contents = 'Другой текст';
    console.log(show( options)); // 30Другой текст


    p.s. почему "30", а не "1020"? Берётся число 10, к нему прибавляется число 20, результат – число. Потом к числу прибавляется строка, тут уже действует сложение строк (конкатенация). Чтобы с самого начала складывались строки начните с пустой строки: '' + width + height + contents
    Ответ написан