• Найти точки окружности?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Несколько дней назад был аналогичный вопрос. Посмотрите мой ответ, есть и формулы и объяснение как это работает
    Ответ написан
    2 комментария
  • Автоматическое создание ссылки при вводе в ячейку ключевого слова?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    Если по-простому - выделите отдельный столбец под надписи и ссылки. В столбце ссылок делайте так:
    =ГИПЕРССЫЛКА("https://example.com/cases/"&A1)
    ,где A1 - ссылка на "case-xxxx"
    Если столбца жалко, или так неудобно - сделать макрос с примерно таким алгоритмом:
    1) Отследить факт изменения ячейки. Для VBA/Excel это будет Worksheet_Change(ByVal e As Range), для Google Spreadsheets - onEdit(e)
    2) Проверить внутри функции какой столбец меняется, если нужный - продолжить, иначе выход
    3) Взять значение и заменить на формулу, которую я писал выше
    Ответ написан
    1 комментарий
  • Как заставить плату работать без включателя?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    1) Проверить включится ли прибор при постоянно нажатой кнопке, если да - то просто замкнуть кнопку перемычкой.
    2) Если первый вариант не сработает - поставить RC цепочку - резистор и конденсатор последовательно(возможно, что подтягивающий резистор там уже есть и хватит одного конденсатора). Подключить это всё параллельно кнопке. Если не сработает - поменять местами резистор и конденсатор. Номинал конденсатора - порядка тысячи микрофарад и напряжением большим чем напряжение питания в 1,5 раза. Номинал резистора - порядка 1 килоома. Произведение R*C - время задержки включения, будет порядка миллисекунды.
    Ответ написан
    1 комментарий
  • Как правильно питать STM32 от аккумулятора 18650?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Попробуйте использовать инструмент от TI, можно подобрать по параметрам. В данном случае питание от 3 до 5 Вольт, ток пару ампер и упор на высокоэффективные преобразователи.
    Сейчас попробовал - выдал 21 вариант, в каждом есть схема, BOM и возможность скачать pdf с подробностями
    Ответ написан
    Комментировать
  • Как построить график функции на excel?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    A1:A31 заполняются числами от -2 до 1 с шагом 0,1
    B1:
    =если(a1<=0;(1+a1^2)/(корень(1+a1^4));1*a1+((sin(a1))^2)/(2+a1))

    По сути x в формуле заменяется на A1, главное скобок не жалеть, тогда меньше вероятность ошибиться.
    И распространить B1 на 30 ячеек вниз.
    Потом выделить оба столбца и вставить диаграмму точечную.

    Больше точек - красивее график. Желательно в значения x вписать пару точек в окрестности нуля, т.к. там прыжок. Например -0,00001 и 0,00001
    Ответ написан
    2 комментария
  • Как разложить кол-во точек по окружности?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Если нужно именно точки по окружности размещать, то проще всего делать это в полярной системе координат. Формулы для пересчёта такие:
    x = R*cos(phi) + x0
    y = R*sin(phi) + y0

    ,где R - радиус окружности, phi - угол поворота от оси x против часовой стрелки, центр окружности находится в точке M(x0, y0). Соответственно если нужно N точек, то
    phi = (0,1,2...N-1)*(2*pi/N)
    Ответ написан
    2 комментария
  • Возможно использовать значение ячейки как ссылку на другую ячейку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если нужно скопировать значение из C4, то
    =C4
    Если нужно скопировать значение по адресу, который лежит в A1, т.е. из "С4", то
    =ДВССЫЛ(A1)
    или
    =INDIRECT(A1)
    Ответ написан
    1 комментарий
  • Как конвертировать BASE62 в BINARY?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Большого выигрыша не получить. 62 и 256 - это соответственно 6 и 8 бит, т.е. экономия максимум 25%.
    Как преобразовать, есть несколько вариантов:
    1) преобразовать каждый символ в строке в бинарный код по 6 бит, дополнить общую результирующую строку до длины кратной 8, преобразовать 8ки бит в символы.
    2) Составить таблицу по 4 символа base62, которым будет однозначно соответствовать 3 символа base256. Дополнять строку до длины кратной 4 символам, брать по 4 символа и из таблицы им будет соответствовать 3 символа base256
    Это классическая задачка по информатике на изменение системы счисления с 8 на 16 или 8 в 2, например, без другой промежуточной.
    Общее правило, которое я ещё в школе придумал для себя: если a,b - системы счисления и если a^N = b^M, то каждые N символов в системе a заменяется на M символов в системе b.
    Например:
    перевести 10101010101010101010101 из двоичной в 8ричную систему: [2^3 = 8^1]
    (0)10 101 010 101 010 101 010 101 (_2) = 25252525 (_8)
    перевести 102301023001230 из 4й в 8ричную систему: [4^3 = 8^2]
    102 301 023 001 230 (_4) = 22 61 13 01 54 (_8)
    Ответ написан
  • Посчитать сумму в ячейках, если в каждой ячейке несколько значений?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    В Google Spreadsheets это можно решить так:
    =СУММ(SPLIT(A1;"+"))
    Возможно что в Office 365 есть такие же функции.
    Как вариант, использовать пользовательскую функцию. Для Excel/VBA это будет обёртка вокруг Application.Evaluate()
    Ответ написан
    Комментировать
  • Зачем в этой функции сдвиг?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    1) ([1e7]+-1e3+-4e3+-8e3+-1e11) - формируется строка "10000000-1000-4000-8000-100000000000"
    2) .replace(/[018]/g,c= - пробегаемся по символам, и с каждым 0, 1 и 8 делаем что-то
    3) 15 >> c/4 - 0,1,8 => 15,15,3
    4) crypto.getRandomValues(new Uint8Array(1))[0] - случайное число 0..255
    5) crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - побитовое И сужает 0..255 до 0..15 или 0..3 (если с=8)
    6) c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - 0 или 1 или 8 XORятся с 5)
    7) Что получилось - переводится в HEX и возвращается вместо символа

    Сдвиг и XOR ( 3) и 6) ) вероятно нужны для большей энтропии, хотя работает и без этого.
    Ответ написан
    1 комментарий
  • Как полностью копировать ячейку с одного листа на другой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Я бы сделал так:
    /**
     * Копирует значения и форматирование из fromRange в toRange
     *
     * @param {"A1:B10"} fromRange Исходный массив
     * @param {"D1:E10"} toRange Конечный массив
     * @return 0 если выполнилось без ошибок, или описание ошибки
     * @customfunction
     */
    function copyRange(fromRange, toRange){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      try{
        var source = ss.getRange(fromRange);
        var dest   = ss.getRange(toRange);
        
        dest.setValues(source.getValues());
        dest.setBackgrounds(source.getBackgrounds());
        // и т.д. Есть много чего из форматирования, получается по get... ставится по set...
        
        return 0;//Завершение без ошибок
      }catch(err){
        Logger.log(Utilities.formatString((arguments.callee.toString().match(/function ([^(]*)\(/)[1]) + "(%s) - %s", Array.from(arguments).join(", "), err.message)); //Ошибку в лог
        return err.message;//Завершение с ошибкой
      };
    };

    Использовать так:
    function syncRanges(){
      copyRange("b7:b11", "c7:c11"); // b7:b11 >> c7:c11
      copyRange("f1:f20", "g1:g20"); // f1:f20 >> g1:g20
      //и т.п. можно вызывать несколько раз для разных диапазонов
    };

    И настроить для функции syncRanges() триггер "на изменение таблицы" или "по времени".
    Ответ написан
    Комментировать
  • Как правильно составить план изучения микроконтроллеров для новичка?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Из всех ресурсов, которые мне попадались, могу 100% посоветовать два:
    1) easyelectronics.ru закроет многие вопросы по электронике и микроконтроллерам. Есть сообщество we.easyelectronics.ru в котором попадаются годные статьи
    2) Narod Stream на Youtube и есть отдельный сайт. Мужик снимает очень годные видео по программированию микроконтроллеров. На Си, на ассемблере. PIC, AVR, STM32, ESP и т.п.
    Ответ написан
    Комментировать
  • Как использовать один проект Apps Script для 2х и более Таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Вместо обычного
    var ss = SpreadsheetApp.getActiveSpreadsheet();  //Текущая таблица

    используйте один из вариантов
    var ss = SpreadsheetApp.openById(id); //открытие сторонней таблицы по id
    //или
    var ss = SpreadsheetApp.openByUrl(url);//открытие сторонней таблицы по url

    И потом работайте с ss как с обычной таблицей
    Ответ написан
    1 комментарий
  • Как настроить градиент для графика сна в Google Sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    1) Выделить ячейки
    2) Формат - Условное форматирование
    3) Выбрать "Своя формула"
    4)=И(ДВССЫЛ("RC";0)<>"";ДВССЫЛ("RC";0)>=(0/24);ДВССЫЛ("RC";0)<(5/24))
    5) Установить форматирование для этого диапазона (0-5 часов)
    6) Повторить 2) - 5) для остальных диапазонов
    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Как сделать автозаполнение скриптом?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Многое можно сделать чисто формулами. Вот пример - если что-то есть в столбце A, то получается сумма (A + B). Запишите это в C1 и добавьте в A и B значения.
    =arrayFormula(
      еслиошибка(
         если(a:a<>""; a:a+b:b; "")
      )
    )


    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Google Sheets Как ограничить триггер onEdit?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    В параметре e много полезного. Как раз по нему можно ограничить действие скрипта на какие-то листы или отдельные ячейки или по более сложным условиям.
    function onEdit(event) {
    	//Возникает при изменении ячейки
    	var ss = event.source.getActiveSheet();//Текущий лист
      	var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
    	var row = event.range.getRow();							//Номер строки
    	var col = event.range.getColumn();						//Номер столбца
    	var newValue = event.value;								//Новое значение
    	var oldValue = event.oldValue;							//Старое значение
    	
      if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
    	
    	//Что-то делаем...
      };
    Ответ написан
    Комментировать
  • Как в Гугл таблицах разбить текст по жирности?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Нужно использовать скрипт, в нём смотреть getRichTextValue()

    /**
     * Аналог функции split. Разбивает по наличию жирности у текста
     * [ ProgrammerForever (c) 2020 ]
     * @param {"A1"} rangeName Имя ячейки
     * @return Возвращает массив строк с чередующейся жирностью
     * @customfunction
     */
    function splitByBold(rangeName) { 
      if (!rangeName) {
        throw "Параметр rangeName не задан. Должен быть адресом ячейки"
      };
      
      var rtv = SpreadsheetApp.getActiveSheet().getRange(rangeName).getRichTextValue();
      
      if (rtv) {
        rtv=rtv.getRuns()
      }else{
        return SpreadsheetApp.getActiveRange().getValue();
      };  
      
      var outData = [rtv[0].getText()];
      var isBold = rtv[0].getTextStyle().isBold();
      var k=0;
      for (var i = 1; i < rtv.length; i++){
        if (rtv[i].getTextStyle().isBold() === isBold){
          outData[k]+= rtv[i].getText();
        }else{
          k+=1;
          outData[k]= rtv[i].getText();
          isBold = rtv[i].getTextStyle().isBold();
        };
      };
      return outData;
    }

    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Нет изображения на мониторе, в чем проблема?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Верно написали - промывать спиртом и сушить. Когда покажется что всё просохло - посушить ещё пару дней. Что греется можно попробовать перепаять. Там скорее всего будет безсвинцовый припой, поэтому нужно разбавлять его обычным ПОС-61 перед пайкой.
    Ответ написан
    Комментировать
  • Google таблицы, заполнение одного листа инфой из другого?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Всё просто. Берем столбец с клиентами
    A:A
    Берем столбец со статусами
    B:B
    Заменяем клиентов на пустые значения, если договора нет, используем "массовую" формулу ArrayFormula()
    ArrayFormula(ЕСЛИ(B:B="Заключен";A:A;""))
    Что получилось - разворачиваем на 90 градусов функцией ТРАНСП()
    =ТРАНСП(ArrayFormula(ЕСЛИ(B:B="Заключен";A:A;"")))
    Можно изначально отфильтровать пустые строки, тогда получится так:
    Таблица демонстрационная
    Финт с превращением в пустые значения нужен чтобы данные не съехали, если изменится статус у клиентов.
    Ответ написан
    Комментировать
  • Как поле переходит в ток?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Видимо, речь идёт о самоиндукции. Если провести аналогию с водой, то можно представить так: вода движется по трубе с большой скоростью (это ток). При этом давления в трубе нет или оно минимальное (это напряжение). Если резко закрыть путь воде (разорвать цепь), то разогнанной воде некуда деваться и она "утрамбовывается", создавая давление (поднимает напряжение).

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

    Всё происходит по принципу Ле Шателье - система выведенная из равновесия стремится к своему прежнему состоянию.
    Ответ написан