Задать вопрос
  • Как зашифровать строку методом "Железнодорожной изгороди"?

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

    Обозначу число строк переменной rows. Период этой «пилы» от верхнего пика до следующего верхнего пика составляет 2 * (rows - 1). Остаток от деления на этот период будет означать позицию внутри одного «зуба»:
    остаток: 0 1 2 3 4 5
     строка: 0 1 2 3 2 1 – это хочется в итоге как-то получать


    Чтобы просчитать «отражение» – когда шли вниз и потом стали идти вверх – надо подогнать этот момент и сделать пересечением оси y = 0 и тогда отражение легко сделать, взяв абсолютное значение Math.abs():
    y  : 3  2  1  0 -1 -2
    abs: 3  2  1  0  1  2


    Остаток от деления будет всегда положительным и растущим: 0 1 2 3 4 5, а нужно получить из него 3 2 1 0 -1 -2. Умножить на -1 и добавить 3: Math.abs(rows - 1 - ost)

    Итого примерно такой код даст правильные номера строк, куда вставлять символ, получая на вход i – индекс буквы в исходной строке:
    var i, ost, row, rows=4, period = 2 * (rows - 1); //   0 0 0   |    6 0 0
    for(i = 0; i < 10; i++) {                         //   1 1 1   |    7 1 1
      ost = i % period;                               //   2 2 2   |    8 2 2
      row = rows - 1 - Math.abs(rows - 1 - ost);      //   3 3 3   |    9 3 3
      console.log( i, ost, row);                      //   4 4 2   |   10 4 2
    }                                                 //   5 5 1   |   11 5 1


    В сборе будет выглядеть примерно так:
    function encrypt( text, n) {
      var i, ost, period = 2 * (n-1), r, row, out = [];
      text = text.replace(/\s/g,""); // убрать пробелы
      for(r = 0; r < period; r++) out[r] = ""; // пустые строки
      for(i = 0; i<text.length; i++) {
        ost = i % period;
        row = n - 1 - Math.abs(n - 1 - ost)
        out[row] += text.substr(i,1);
      }
      return out.join("");
    }
    
    function test( text, rows) {
    	var pre = document.createElement("pre");
    	pre.innerHTML = encrypt(text, rows);
    	document.body.appendChild(pre);
    }
    
    test("этот текст зашифрован", 4); // экинтесшфаоттарвтзо

    jsFiddle

    Upd. чуть переписал это дело. Шифровка и расшифровка осуществляются на основе одной и той же «карты», которая зависит только от числа букв в тексте и числа строк. Поэтому сделал одну ф-ю, создающую эту карту. И слегка отличающиеся короткие функции шифровки и дешифровки. Фиддл с формой. Код шифровки/дешифровки такой:
    function makeMap( len, n) {
      var i, pip, period = 2 * ( n - 1);
      var rows = Array.apply( null, Array( n)).map( function(){ return []});
      for( i = 0; i < len; i++) {
        pip = i % period;
        r = pip < ( n - 1) ? pip : period - pip; 
        rows[ r].push( i);
      }
      return Array.concat.apply( null, rows);
    }
    
    function decrypt( text, n) {
      var map = makeMap( text.length, n);
      return text.split('').reduce(function(p,c,i,a){ return p + a[map.indexOf(i)]},'');
    }
    
    function encrypt( text, n) {
      var map = makeMap( text.length, n);
      return text.split('').reduce(function(p,c,i,a){ return p + a[map[i]]},'');
    }
    Ответ написан
    4 комментария
  • Как сохранить клиента себе не в убыток?

    Согласитесь, с условием:

    1. оплата вперёд, 100%
    2. срок ровно полгода – фиксируйте дату последнего дня;
    3. вы будете считать время, потраченное на поддержку. Прозрачно, таймером как на upwork. Если оно превысит 80 часов вы прекращаете работу до получения ещё $100, которые покроют дополнительные 20 часов работы (цифры сами точно расчитайте)
    4. Дополнительное время, оплаченное дополнительно – это только дополнительные часы. Как только полгода истекут – вся работа прекращается до продления контракта.


    Т.е. фактически сведите договор к почасовой оплате, сохранив внешнюю форму предложения индуса.
    Ответ написан
    5 комментариев
  • Как скопировать с сервера 30 гб картинок в jpeg'e?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    только rsync, только хардкор:

    rsync -avz lsd_user@oldLinuxServer:///var/www/pornosite/images /home/happynewadmin/funnyPics


    Ключи:
    • a – рекурсия в подпаки и попытается передать и атрибуты прав файлов и линки сохранить. Наверное, тоже необязательно – можно вместо него r – только рекурсия в подпапки.
    • v – будет подробно лить в консоль путь каждого скопированного файла. Наверное лучше убрать и вместо него q – вывод только ошибок/предупреждений;
    • z – будет пытаться жать файлы для передачи меньшего объёма. С jpeg'ами малоэффективно. Можно забить.
    Ответ написан
    3 комментария
  • Что делают значения в функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Прочитайте, пожалуйста, https://learn.javascript.ru/function-basics – обратите внимание на «локальные переменные».

    Попробую разложить по полочкам.

    var a = 1, b = 2; // эти a, b – «глобальные», выше всех, «видны» везде
    function calculate(x, y, z) {
      // здесь определены локальные переменные x, y, z
      // и видны все переменные из уровней выше
      // напр. a и b
      // ждём, что x – это будет функция
      return x( y+a, z+b); // можно использовать и локальные и глобальные
    }
    
    function sum( a, b){ // а вот тут a,b – переопределены локально
      // и к тем, глобальным a и b не имеют никакого отношения!
      return a+b; // складывает те a и b, что передали при очередном вызове sum()
    }
    
    calculate( sum, 5, 6); // вызывает calculate, и там будет x = sum, y=5, z=6
    sum( 7, 8);  // вызывает напрямую sum, внутри которого будет a=7 и b=8
    // при этом глобальные a и b никак не пострадают.
    Ответ написан
    Комментировать
  • Как сделать простановку пробелов с конца в моей регулярке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регуляркой:
    var n = 12345678;
    n = n.toString(10).replace(/(\d)(?=(\d{3})+$)/g, '$1 '); // 12 345 678


    Можно и без регулярок. Строку разбить в массив, развернуть, к каждому третьему символу приделать пробел (идём с конца, получается), собрать в строку:

    var n = 123456789;
    
    var a = n
      .toString(10)
      .split('').reverse()
      .map(function(e,i){ return (i%3 ? e : ""+e+" ")})
      .reverse()
      .join('')
      .trim()
    ;
    // a = "123 456 789"


    Disclaimer: некорректно может обработать знак минус!
    Ответ написан
    2 комментария
  • Как в середине функции узнать какой метод был вызван?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Предположу, что в примере вызова у вас опечатка, и вы хотели вызывать test.on() – со скобками.

    Обернуть в Proxy, но это не будет работать в старых браузерах и IE и вообще сомнительно, что именно это вам требуется. Может, пересмотреть весь код?
    var test=function(){  
      console.log("method:", arguments[0]);
    };
    
    var handler = {
      get: function( target, name) {
        var _method;
        if(name in target) {
          return target[name];
        } else {
          return target.bind( null, name); // если не определено свойство, передаем его 1-м аргументом
        }
      }
    };
    
    test = new Proxy( test, handler);
    
    test.on(); // method: on
    test.blabla(); // method: blabla
    test(); // method: undefined
    Ответ написан
    Комментировать
  • Возможно-ли удаление приложения VK через API?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Методов API для удаления/отключения ранее установленного приложения среди apps.*, account.* и Client API, вроде бы, нет.

    Подделать POST-запрос на https://vk.com/al_apps.php, который выполняется при удалении приложения в интерфейсе ВК тоже сложно – помимо act=quit,al=1,id=111111 там передаётся некий вычисляемый параметр hash.

    Можно предлагать пользователю самому перейти на страницу настроек приложений vk.com/settings?act=apps и там нажать крестик напротив вашего приложения.
    Ответ написан
    2 комментария
  • Где и Как познать четвертое измерение?

    Смотрели клип «Imagining the 10th dimension»? Там предлагают представить 4-е через движение трёхмерного пространства во времени, оставляя «след». Т.е. человек – это длинная колбаса в 4D, начинающаяся зародышем и заканчивая стариком. Но поскольку мы живём и воспринимаем лишь 3 измерения, то «видим» лишь какой-то текущий срез этой колбасы – себя сегодня.
    Ответ написан
    2 комментария
  • Что полезного вы бы соорудили из рамы 2х2х4м? Гигантский 3D Принтер?

    1. 3D сканер для людей в полный рост с изготовлением потом их фигурок маленького размера;
    2. камера для выращивания всякой растительности (шутка)
    Ответ написан
    4 комментария
  • Загрузка audio message vk api. Не проигрывает на моб версии?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Дело оказалось в формате аудио-файла, который отправляется как audio_message: он должен быть монофоническим, чтобы нормально воспроизводиться на мобильных клиентах.
    Ответ написан
    Комментировать
  • Как делается текст из частиц (particles)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно такой текст отрисовать в SVG и дать атрибут stroke-dasharray, чтобы по периметру букв получился пунктир точками. Размножить слой и разнести по оси Z, чтобы получился небольшой объём.

    Более экспериментальный вариант, плохо поддерживаемый браузерами, CSS3 свойство text-stroke (-webkit-text-stroke). Смысл тот же – сделать обводку букв пунктиром и наделать копий слоя со смещением по Z.

    И, наконец, можно всё это отрисовать в canvas.
    Ответ написан
    Комментировать
  • Как из пути до файла получить имя файла без расширения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    без регулярных выражений встроенной в PHP функцией pathinfo():
    $info = pathinfo('/doc2/Тестовый документ.pdf');
    echo $info['filename']; // Тестовый документ
    Ответ написан
    4 комментария
  • Почему цикл не повторяется?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем коде цикл while не содержит в «теле» ничего – после скобок сразу закрывается точка-с-запятой.

    Вот так вы, наверное, имели в виду:
    var answer;
    do {
      answer = prompt("Скажи 'стоп'", "");
      document.write("Ты сказал '" + answer + "'.");
    } while (answer !== "стоп");


    Есть два варианта while-цикла:
    1. while( условие) { действия }
    2. do{ действия } while( условие )
    В этой задаче точно нужен второй: сначала надо выполнить действия (попросить сказать «стоп»), а потом уже проверить условие (что ввел пользователь?).
    Ответ написан
    3 комментария
  • Как имитировать двойной клик?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дабл-клик делается так: создать событие и отправить его через dispatchEvent():
    var event = new MouseEvent('dblclick', {
        'view': window,
        'bubbles': true,
        'cancelable': true
      });
    document.getElementById('button').dispatchEvent(event);

    Полагаю, в вопросе опечатка и вы имели в виду «имеется id #button».
    Ответ написан
    Комментировать
  • Как работать с методом groups.getMembers вконтакте с помощью JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Посмотрите мой открытый проект по сбору списка всех Участников сообщества. Только JavaScript. Демо.

    Реализация с web worker'ом и учётом времени выполнения запросов, чтобы не вылезти за лимит трёх запросов в секунду.
    Ответ написан
    Комментировать
  • Можно ли подключить бота к вк, чтобы он обрабатывал заявки от пользоватлей?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Создать бота, который сумеет общаться по четкому сценарию, и собеседник не будет испытывать иллюзий, что общается с живым человеком – можно.
    Ответ написан
    Комментировать
  • Как настроить функцию для передачи различных значений?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Внутри возвращаемой функции запоминайте значение:
    function nds( cost) {
      return function() {
        var _cost = cost;
        var result = _cost * 1.13;
        console.log( result.toFixed(2));
      }
    }


    Так возвращаемый экземпляр функции будет содержать в себе переданное значение.

    var a = nds(53);
    var b = nds(12);
    a(); // 59.89
    b(); // 13.56


    Upd. для общего счётчика придётся завести переменную, видимую из всех функций:
    var total = 0;
    
    function nds( cost) {
      return function() {
        var _cost = cost; // запомнили внутри цену
        var result = _cost * 1.13; // добавили НДС
        total += result; // добавили к общей сумме
        console.log( "result:", result.toFixed(2), "total:", total.toFixed(2));
      }
    }
    
    var a = nds(53);
    var b = nds(12);
    
    a(); // result: 59.89 total: 59.89
    b(); // result: 13.56 total: 73.45
    a(); // result: 59.89 total: 133.34
    a(); // result: 59.89 total: 193.23
    Ответ написан
    2 комментария
  • Как правильней будет фильтрация периода?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Это следует из бизнес-логики: что нужнее пользователю? Не уверены, спросите пользователей.

    Вопрос относится не только к неделям – ко всем периодам. Вариант 1 с привязкой к календарной сетке будет давать пилообразно нарастающие показатели, в зависимости от времени, когда запрошены данные. Вариант 2 будет давать среднее значение (running average) за выбранный период.

    И будьте тогда уж постоянны. «За сутки» – с 00 до 23:59 по часовому поясу пользователя, или за последние 24 часа с текущего момента. «За месяц» – за текущий месяц, обнуляя в начале каждого и нарастая к концу, или среднее значение за последние 31 день | календарный месяц до такого же числа предыдущего месяца? «За год» – за этот год (1-го января минимум, в декабре максимум) или до такой же даты прошлого года.

    Скажем, для оценки пользователем скорости расходования средств на счёте могут быть полезны оба варианта. Средний расход за последние 7 дней удобно сравнивать с расходом за пред-предыдущие 7 дней. А привязка к календарному месяцу поможет спрогнозировать сумму счёта к оплате на конец месяца, если списывание происходит 1-го числа.
    Ответ написан
    1 комментарий
  • Как Вы защищаете свои сайты на nginx?

    Мнение: пускайте траффик через CloudFlare – они умеют фильтровать часть угроз.

    Прочие угрозы и дыры в безопасности существуют на уровне PHP и движков и веб-сервером почти не фильтруются. Можно анализировать логи на типичные паттерны скажем, fail2ban'ом.
    Ответ написан
    Комментировать