• Как редактировать запись в txt файле?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Текстовый файл – очень неудобное хранилище для данных. Чтобы вставить что-то в середине файла, придётся создавать новый файл с обновлённым содержанием, и заменить старый новым. Нет возможность дописать что-то в середине: хвост «автомагически» не отодвинется.

    spoiler
    function appendValue($key, $value) {
      $filepath = "./config.txt"; // путь к файлу
      if (!file_exists($filepath)) throw "File not found";
      
      $divider = PHP_EOL; // разделитель строк
      
      $rows = explode($divider, file_get_contents($filepath));
      $tmpfname = tempnam(sys_get_temp_dir(), 'Toster');  
      $fh = fopen($tmpfname, 'w');
      
      $replaced = 0;
      foreach($rows as $row) {
        $data = explode(':', $row);
        if (0 === count($data)) continue;
        if ($data[0] == $key) {
          array_push($data, $value);
          $row = implode(':', $data);
          $replaced++;
        }
        
        fputs($fh, $row . $divider);
      }
      
      fclose($fh);
      
      // поменять файлы местами
      unlink($filepath);
      rename($tmpfname, $filepath);
      
      return $replaced; // кол-во обновлённых строк. Вдруг, неуникален индекс?
    }
    
    
    appendValue(2, 33);
    Ответ написан
  • Как удалить элементы, не имеющие вложенных элементов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    document.querySelectorAll('div.color').forEach( el => {
      if (el.children.length === 0) el.parentNode.removeChild(el);
    });


    Ответ написан
    6 комментариев
  • Выдает undefined. В чем ошибка?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без return возможно, имели в виду стрелочную функцию:
    const truncate = (str, maxlength) => ( str.length <= maxlength ) ? str : str.slice(0, maxlength) + "..."; 
    
    alert(truncate("Отведай ка", 10));
    Ответ написан
    Комментировать
  • Когда лучше применять синхронность, а когда асинхронность?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Синхронность применяйте когда результат операции получается сразу. JavaScript выполняется в один поток, поэтому пока что-то синхронное происходит, всё остальное ждёт в сторонке. В том числе события интерфейса.

    Асинхронность используйте везде, где нужно ждать. Чтобы не ждать:
    • Отправили запрос на сервер. Ответ будет неизвестно, когда – то ли сеть медленная, то ли сервер призадумается. В это время JS может заняться чем-то ещё. Дайте ему такую возможность.
    • События интерфейса - неизвестно, когда нажмут на кнопку или введут значение в форму. Даже длинная цепочка действий: отправили пользователя авторизоваться через третий сайт.
    • Длинные сложные вычисления. Их можно вынести в web worker, отправлять в него задачу и асинхронно ждать результата. В это время бодро реагировать на кнопки и прочее.


    p.s. Ждать, не важно, сколько: всего несколько миллисекунд или полчаса.

    p.p.s. для желающих упороться подробностями: Concurrency model and Event Loop
    Ответ написан
    1 комментарий
  • Почему объект списка не совпадает с его индексом?

    Индекс считается от нуля:
    ["e", "u", "i", "o", "y", "a"]
      0    1    2    3    4    5


    Вроде бы всё как и должно быть. Что вас смущает?
    Ответ написан
    Комментировать
  • Как применяется импликация в программировании?

    wiki смотрели?

    В языках программирования импликация используется, как правило, неявно. Например, конструкция, предполагающая истинность условия B в данном участке программы:

    if ( выражение A ) {
        if ( выражение B ) {
           сделать_что-то_полезное
        }
           else {
           <font color=Red>сбой</font>
        };
     }

    будет успешно выполняться тогда и только тогда, когда верна импликация A→B. В то же время эти условия можно спокойно написать в одной строке, объединив их оператором конъюнкции.

    if ( выражение A ) and ( выражение B ) {
        сделать_что-то_полезное
     }


    При стандартных опциях компилятора (Delphi, C++ Builder) проверка идет до тех пор, пока результат не станет очевидным, и если А ложно, то (А и В) ложно вне зависимости от В, и не нужно ставить еще один условный оператор.

    //выражение A - ложно
     if ( выражение A ) {
        //Дальше проверка не идет
        ... if ( выражение B ) {
           сделать_что-то_полезное
        } ...
     }


    В функциональных языках импликация может быть не только правилом вычислений, но и видом отношения между данными, то есть обрабатываться (в том числе и выполняться) и создаваться по ходу выполнения программы.
    Ответ написан
    8 комментариев
  • Как разместить пост на стену Вконтакте с помощью Vkontakte OpenAPI методом POST?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Через OpenApi, который https://vk.com/js/api/openapi.js?159 — никак. GET метод там прописан и не конфигурируется. При кросс-доменных запросах ответ подгружается через JSONP включением скрипта в тело докумета, где все параметры запроса идут в его адресе теми же GET параметрами. См. исходник вышеозначенного скрипта, 554 строка метод makeRequest() и 605 строка метод attachScript()

    С сервера (Node.js?) не должно составить проблем выполнить POST запрос на
    https://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN&v=V
    как это описано в документации. Правда, при вызове wall.post() же открывается окно подтверждения и всё расчитано на браузер пользователя. Как вы раньше выполняли запросы и не сталкивались с требованием капчи или окна подтверждения?
    Ответ написан
    Комментировать
  • Как ускорить работу скрипта?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    В начале у ребят только деньги. В конце 1 пустая бутылка и весь выпитый напиток без посуды.
    Начальное кол-во денег минус P делится без остатка на (F - P)

    Работающее решение на JavaScript
    function f(F, P) {
      const D = F - P; // стоимость напитка без посуды
    
      // сколько останется денег если 1 раз купить, выпить и сдать?
      function drink(m) {
        const n = Math.floor(m / F);
        if (n <= 0) throw "Nope";
        return m - n * D;
      }
      
      for( let M = P + D * Math.ceil((F + 1) / D); M <= D * Math.floor(2 * 109 / D); M += D) {
        try {
          if (F === drink(drink(drink(drink(M))))) return M;
        } catch(e) {
          continue;
        }
      }
    }
    
    f(7, 3) // 83
    spoiler
    import math
    
    F,P = map(int, input("Введите два целых через пробел:").split())
    
    
    def bruteforce(F, P):
        D = F - P
        
        def drink(m):
            n = math.floor(m / F)
            if 0 == n:
                raise Exception()
            return m - n * D
    	
    
        for M in range(P, int(1e9), D):
            try:
                rem = drink(drink(drink(drink(M))))
                if (F == rem):
                    return M
            except Exception as E:
                pass
                
        return "Нет решения"
    
    print(bruteforce(F, P))
    Ответ написан
    9 комментариев
  • Как грамотно подойти к решению этой простой, но интересной задачи для начинающих?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Поскольку тут нет множества вариантов форм слов, «дешевле» обойтись без регулярных выражений.

    1. Разбить на массив слов по пробелу.
    2. Пройтись по каждому слову и если оно != "Test" И != "Deploy", сделать ему toLowerCase()
    3. Первое слово != "Test" И != "Deploy" ? вставить "Тестировать" в начале массива.


    Проверки в п.2 и 3. идентичны, поэтому можно оптимизировать их в одну.
    Примерно так
    Ответ написан
    1 комментарий
  • Как разбить объект с массивом внутри на объекты с каждым элементом из массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • map() это многомного
    • reduce() это многоодин
    В вашей задаче надо из массива values получить массив объектов с полями родителя (это map()).
    А потом последовательно склеить несколько массивов в один (это можно через reduce()).

    let result = segments
      .map(e => e.value.map(
        v => ({
          value: v,
          text : { hi: e.text.hi},
          diff : e.diff
        })
      ))
      .reduce((prev, curr) => prev.concat(curr), [])
    ;
    Ответ написан
    Комментировать
  • Где найти сооснователя для проекта?

    Митапы фаундеров, митапы по технологиям, стартап акселераторы, коворкинги.

    /* что-то одни иностранные слова.. */
    Ответ написан
  • Какую видеокамеру выбрать без SMS и переплат?

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Из HTML элементов понадобится кнопка и место, куда выводить значение. Например, тег <p>
    Для счётчика завести переменную. Её значение будет обновляться.
    На кнопке слушать событие "click", по нему должна срабатывать функция, которая увеличит значение переменной на 1 и выведет его в HTML элемент.

    Как вы начнете выполнять этот план и что именно из этого плана не понятно?
    Ответ написан
  • Лексическое окружение, контекст вызова. Почему это разные понятия?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Лекс. окружение – это переменные, которые определены и "видны" функции.
    Контекст – это this.
    function outer() {
      var a = 1; // переменная в лексическом окружении ф-ии inner()
                 // внутри inner() можно использовать значение a
      return function inner() {
        console.log("a == ", a, "this == ", this);
      }
    }
    
    var f1 = outer(); // f1 - функция
    f1(); // a == 1, this == window или self
    
    var f2 = f1.bind({title: "Ololo"}); // f2 - новая функция
    f2(); // a == 1, this.title == "Ololo"
    Ответ написан
    1 комментарий
  • Как найти "стабильность/колебание" последовательности?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    «Стабильностью» считаем точное попадание данных в одну из предопределённых функций - линейную, периодическую? Могут ли быть другие варианты «стабильности» ?

    Можно проверять каждую из гипотез [ a*x + b, a*sin(b*x) + c] на данных, подбирая коэффициенты, минимизируя отклонения. Посчитать сумму квадратов отклонений данных от теории, сделать вывод, попадает идеально или нет.

    См. Регрессионный анализ
    Ответ написан
    Комментировать
  • Как скачать переписку вконтакте?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    ВК недавно выкатили раздел «Защита данных», где пишут, в том числе, что пользователь может запросить у них копию всех своих данных тут: vk.cc/transparency Не пробовал, но, может, там и все переписки?

    Другой способ – написать JS приложение. Cоздать в ВК Standalone приложение, авторизоваться в нём с правами messages и вызывать метод messages.getHistory() с указанием id нужной беседы.
    Ответ написан
    Комментировать
  • Небольшой вопрос по javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    textareaContent и coursorPosition задаются однажды при выполнении скрипта. На тот момент, наверное, textarea пуста, курсор в ней не находится.
    Ответ написан
  • Почему [] < {} сравниваются как строки? А [] < 1 как числа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Во втором случае потому, что один из аргументов имеет примитивный тип Number, объект приводится к нему же.

    В первом сравниваются два объекта. При попытке привести их к числу сначала вызывается метод valueOf(), который для обоих возвращает не примитив (тогда бы сравнивали эти примитивы) а this, себя же, объект. Поэтому во вторую очередь вызывается метод toString(), который возвращает примитивы: пустую строку для массива и "[object Object]" для объекта.

    Upd. вот статья, раскрывающая глубины: Преобразование типов в JavaScript

    отрывок
    В общих чертах алгоритм выглядит следующим образом:
    • Если входящее значение уже является примитивом, ничего не делать и просто вернуть его.
    • Вызвать input.toString(), если результат примитив — вернуть его.
    • Вызвать input.valueOf(), если результат примитив — вернуть его.
    • Если ни один из методов не вернул примитив — бросить ошибку TypeError.

    При численном преобразовании сначала вызывается метод valueOf(), а уже затем toString(). При строковом преобразовании наоборот — сначала происходит вызов toString(), а уже потом valueOf().

    Большинство встроенных типов не имеют метода valueOf или же имеют valueOf, который возвращает свой собственный объект this, который игнорируется, так как this не является примитивом. Вот почему численное и строковое преобразование в большинстве случаев работает одинаково — оба в конечном итоге вызывают метод toString().

     
    Мало инфы в MDN
    См. правила преобразования типов:
    Когда происходит преобразование типов (т.е в случаях использования нестрогого сравнения), JavaScript преобразует типы String, Number, Boolean и Object, следующим образом:

    • При сравнении числа (Number) и строки (String), JavaScript пытается преобразовать числовой литерал строки в число. Затем полученное число округляется до ближайшего возможного значения типа Number.
    • Если один из операндов является логическим (Boolean), то он преобразуется в значение типа (Number). Если значение логического операнда равняется истине (true), то значение этого операнда преобразуется в 1. Иначе - в 0 (ложь / false).
    • Если объект сравнивается с числом или строкой, JavaScript пытается получить значение по умолчанию для данного объекта. Полученное значение преобразуется в примитив, посредством методов valueOf() и toString(). Если преобразовать объект не удается, генерируется ошибка времени выполнения.
    • Обратите внимание на то, что объект преобразуется в примитив, если, и только если, второй операнд является примитивом. В ином случае, операнды сравниваются как объекты, соответственно, операция сравнения вернет истину в том случае, если внутренние ссылки обоих объектов ссылаются на один и тот же объект в памяти.



    Там же рассматривают особобый случай объекта строки new String('foo'); по сравнению с простой строкой.
    Ответ написан
    2 комментария
  • Как сделать чтоб при клик на кнопку, должен открывать свой блок(должно работать без id и тк)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Лучше без отрыва от разметки прямо в html записать, какая кнопка чем рулит. Например, в data-атрибутах:


    Не рекомендуется использовать атрибут hidden для скрытия/отображения табов. Лучше для этого задействовать класс, который временно прячет элемент. Например, Bootstrap'овский .d-none
    Ответ написан
    Комментировать