• Как правильно использовать LockService в Google Apps Script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Метод waitLock вызывает исключение, обрабатывайте его.

    var lock = LockService.getPublicLock();
    try {
      lock.waitLock(30000);
      return success();
    } catch (err) {
      Logger.log('Could not obtain lock after 30 seconds.');
      return failure();
    }


    Для неразрывности функции используйте tryLock. Этот метод заворачивает результат блокировки в булево значение:
    var lock = LockService.getPublicLock();
    var success = lock.tryLock(30000);
    if (!success) {
      Logger.log('Could not obtain lock after 30 seconds.');
    }
    Ответ написан
    Комментировать
  • Как быстро проверить, является ли некоторое огромное число (от 100 знаков) квадратом целого числа?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Можно попробовать вычислить корень быстрым алгоритмом. Но там сложно. Гуглите Karatsuba square root. Есть открытые реализации. Есть еще какой-то адский метод через быстрое преобразование Фурье, попробуйте погуглить и его.

    Более простой в реализации, но менее быстрый метод вычисления корня - бинарный поиск. Храните l, r, l^2, r^2 и lr. По этим числам можно вычислить m=(l+r)/2, m^2, m*l, m*r без длинных умножений, а только складывая длинные числа и деля на 2. Вам надо поддерживать, чтобы l^2 <= n <= r^2. Изначально можно сделать l=1, r=10^51 (или больше - половина длины входного числа + немного, чтобы точно квадрат был больше n), потом делить отрезок пополам и отбрасывать ненужную половину.

    Еще есть вероятностный метод через символ Лежандра/Якоби. Это будет самым быстрым методом.

    Это как смотреть на последнюю цифру. Квадраты могут давать там 0, 1, 4, 9, 6, 5. Но нет ни одного квадрата, который оканчивался бы на 2. Т.е. если число заканчивается на 2, то можно сразу говорить, что это не квадрат. Это мы взяли остаток от деления на 10 (последняя цифра) и посмотрели, какие из них хорошие. Вот символ Лежандра - это такая проверка для модуля по любому простому числу (а не 10).

    Если брать некоторое простое число p, то n может быть квадратом, только если символ Лежандра (n/p) - равен 1 или 0 (По научному: n - должно быть квадратичным вычетом).

    Если брать небольшие (<64-битные) простые числа, то можно за линию считать n%p и потом вычислять символ Лежандра (n%p/p) по алгоритму через символ Якоби за O(log(p)^2). Когда подсчитали символ Лежандра и если он -1, то n - точно не корень.

    Тут проблема в том, что это необходимый, но недостаточный критерий - если для какого-то p вы получили -1 - то это точно не квадрат. Но возможно можно подобрать такое число, что все ваши тесты дадут 1, а оно не квадрат. Поэтому надо брать много простых чисел. Скажем, 20. Желательно еще числа брать достаточно большими. Но их не надо искать каждый раз, можно захардкодить. Грубая прикидка говорит, что вероятность ошибки такого алгоритма 2^(-количество простых чисел).

    Т.е. берете много простых чисел. Считаете для каждого n%p выполняя деление большого числа на короткое (один проход по массиву цифр). Потом считаете символ Лежандра. Если получили где-то -1 - то точно не квадрат. Иначе - скорее всего квадрат.

    Можно совместить вероятностный тест и вычисление корня. Сначала проверьте парочку простых чисел на символ Лежандра для отсечения точно не квадратов. Еще проверку последней цифры можно сделать, это очень дешево. Если не отсеклись, то считайте корень. Так будет всегда работать правильно но будет быстрее работать в некоторых случаях.
    Ответ написан
    Комментировать
  • Найдена опасная уязвимость в очень популярном мобильном приложении. Что делать?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    и учечка данных пользователей может обойтись сервису 100.......000$-ми убытками

    Может. Но (тебе) лучше, чтобы об этом сообщил кто-нибудь другой. Потому что скорее всего, тебя же и обвинят во взломе и хищении.
    Обращаться стоит только в том случае, если у сервиса есть программа по исправлению ошибок ("bugs bounty"), если же нет, а аппликуха популярная - лучше перестать пользоваться, застраховаться и не лезть, ну или сообщить с левого одноразового мейла.
    А что до вознаграждения - вот что пишет классик, Иван наш Андреевич Крылов
    Ответ написан
    Комментировать
  • Куда движется индустрия?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    1) Индустрия электроники огромна. Сказать, что вот прямо сразу весь мир прыгнул на 32 битные армы - это солгать. Более правильно сказать, что популярные блоггеры с производительностью пулемета штампуют статьи об stm32, при этом уровня "мигаем ледом".

    2) С точки зрения разработчика, микроконтроллер - это инструмент. Каждый инструмент должен соответствовать задаче и быть до конца понятен тому, кто его использует. Я никому не пожелаю начинать обучения с STM32 - путанная документация и библиотека, которая состоит из макросов, вызывающих макросы, кроме укачивания при многочасовом скроллинге в попытках докопаться до истины, никаких эмоций не вызывает.

    2.a) 32битный монстр с линуксом в стиралке - (и управление стиралкой, написанное на питоне, в тренде времени) - это сумасшествие. Потому что вместе с линуксом и питоном он притащит за собой кучу багов на всех уровнях, необходимость обновлений и прочее админство. Если на телефоне это еще покатит (семь бед - один резет, а через пару лет аппарат в помойку), то в стиралке, один неверно записанный бит может устроить потоп или даже легкий дестрой. Следовательно, когда речь идет об управлении какими-то технологическими процессорами (и о материальной ответственности), индустрия будет консервативна.

    Основные принципы электроники сейчас - максимально запихивание перифирии в один чип. Этот тренд можно проследить с 1970х - начинали с огромных плат, где процессор - отдельно, память - отдельно, АЦП - снова отдельно, куча корпусов для развязки устройств на шине и так далее. Постепенно все эти запчасти стали помещаться в один корпус. Например - ESP8266 - это процессор, память, wi-fi и куча другой периферии, засунутые в один корпус.

    Это дает снижение энергопотребления, повышение производительности, удешевляет платы.
    Ответ написан
    8 комментариев
  • Как вставить картинку непосредственно в ячейку Таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Решение на данный момент

    function insertImageToCell() {
      const image = SpreadsheetApp
        .newCellImage()
        .setSourceUrl('https://upload.wikimedia.org/wikipedia/commons/5/50/Smile_Image.png')
        .build();
      SpreadsheetApp.getActiveRange()
        .setValue(image);
    }

    Предыдущий ответ

    Сам процесс вставки картинки довольно специфический и может потребовать определенных навыков. Поэтому я приведу уже готовый пример, основанный на публичном коде. Все это работает не очень быстро, поэтому вам необходимо задуматься о заранее подготовленных картинках и куда вы их будете вставлять. Порции функции такие: на один лист массив из картинок с координатами. Т.е. на один лист можно сразу добавить несколько картинок. Это будет самым оптимальным способом именно из-за специфики вставки.

    Функция вставки
    /**
     * Insert a single image to the cell. A1 is default
     *
     * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
     * @param {GoogleAppsScript.Base.Blob} blob
     * @param {number} row
     * @param {number} column
     */
    function insertImageBlobToCell_(sheet, blob, row = 1, column = 1) {
      const sheetName = sheet.getName();
      const parentId = sheet.getParent().getId();
      return DocsServiceApp.openBySpreadsheetId(parentId)
        .getSheetByName(sheetName)
        .insertImage([{ blob, range: { row, column } }]);
    }


    Пример вызова
    /**
     * Insert an image blob to the cell
     */
    function userActionRun() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const blob = UrlFetchApp.fetch(
        'https://contributor.pw/img/post/sheets/sheets_mmult-some-uses-cases_01.png'
      ).getBlob();
      insertImageBlobToCell_(sheet, blob);
    }


    Результат
    601a1d24dca43655873570.png

    Не забудьте добавить библиотеку
    108j6x_ZX544wEhGkgddFYM6Ie09edDqXaFwnW3RVFQCLHw_mEueqUHTW
    в свой проект. Пример манифеста в сниппете
    Ответ написан
    4 комментария
  • Почему некорректно работает doGet, если логиниться под другим доменом?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это приложение должен разрешить администратор системы. Ну, или наоборот, администратор системы запретил устанавливать какие-либо приложения, кроме тех, которые разрешил.

    Обратитесь к администратору Google Workspace, с доменом которого возникли проблемы.
    Ответ написан
    5 комментариев
  • Как сделать так, чтобы Google таблица открывалась в нужном месте?

    shebanits
    @shebanits
    function onEdit(e){
      let row = e.range.getRow();
      let column = e.range.getColumn();
    
      let cache = CacheService.getScriptCache();
      cache.putAll({
        "row": `${row}`,
        "column": `${column}`
      });
    }
    
    function onOpen() {
      let cache = CacheService.getScriptCache();
      let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      let row = cache.get("row");
      let column = cache.get("column");
      sheet.getRange(+row, +column).activate();
      SpreadsheetApp.flush();
    
    }
    Ответ написан
    Комментировать
  • Существуют ли нормально замкнутые полевики при отсутствии питания?

    Ocelot
    @Ocelot
    Существуют. Называются транзисторы со встроенным каналом (depletion mode MOSFETs), но силовых среди них почти нет. У IXYS есть несколько моделей, которые подойдут вам по параметрам:
    https://www.digikey.com/en/products/filter/transis...

    Гораздо проще сделать схему, которая будет открывать транзистор, используя напряжение, которое тот должен коммутировать. А если вообще никакого питания нет, то какая разница, открыт транзистор или закрыт?
    Ответ написан
    1 комментарий
  • Не подкинете тему для курсовой работы с использованием PIC?

    @Avsmirn0ov
    Блок питания с цифровым управлением, самое напрашивающееся. Скажем, регулировка выхода дискретно 3.3, 5 и 12 вольт, и плавно от 2 до 20 с ограничением в 3 ампера. И выводом на дисплейчик того, что на выходе. Код не самый сложный, только по сути ШИМ и обработка команд, и немного аналоговых деталюх. Сложность может вызвать только трансформатор купить/намотать и защиту сделать на операционнике. Схем в интернете полно
    Ответ написан
    Комментировать
  • Какие курсы тестировщика выбрать?

    @mkone112
    Начинающий питонист.
    Чем чаще я вижу такие вопросы - тем больше убеждаюсь - курсы благое дело по передаче финансов к более заслуживающим их людям, от людей, которые все-равно не смогут разумно ими распорядиться. Выбирайте любой, например
    гекбрайнс
    или
    софтваре тестинг
    , так или иначе - мир станет лучше.
    Ответ написан
    1 комментарий
  • Можно ли запитать устройство 5v 3a от повербанка через USB Type-C без PD триггера?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    Все зависит от доброты китайца, проектировавшего банк. Если китаец злой и следует стандартам, больше 500mA он вам без умного контроллера не отдаст.

    Кстати, кроме PD есть еще QC разных модификаций, и там для того чтобы сработал триггер, достаточно насобирать правильную конфигурацию резисторов на пинах разъема.

    Далее, хвосты USB-C -> barell jack 5, 9, 12, 20V торгуются на том же Али буквально по цене борща в столовке - нет никаких помех, чтобы на устройстве поставить стандартную дырку под barell jack и обзавестись таким проводом с али - микросхема у него внутри разъема сидит - к вам придут 2 провода сразу с нужным напряжением.
    AMCVS200621kRcF8.jpg

    По второму вопросу (распайка) - все опять же зависит от доброты китайца. По стандарту, без комбинации резисторов на пинах (то есть, вы распаяли просто + и просто -), он вам больше 500mA 5V не отдаст.

    Чтобы не изучать всю гору спецификаций в питании (это реально несколько толстенных PDF), просто возьмите хвост с али за сто рублей на нужное напряжение.

    Да и пайка разъема usb-c на плату или на кабель - то еще удовольствие - без хорошего инструмента и прямых рук - вы будете портить платы и детали до приобретения инструмента и навыка пайки.
    Ответ написан
    3 комментария
  • Каков путь в робототехнику?

    @lonelymyp
    Хочу вылезти из минуса по карме.
    В первую очередь стоит определиться с целью.
    Нельзя научиться "делать роботов" т.к. это крайне широкое понятие.

    Для 11 класса вполне посильной задачей будет например сделать робот пылесос.
    Узнаешь как организовывать питание робота, как управлять моторами, как работать с датчиками, можно прокачать скилл программирования если сделаешь построение карты и навигацию робота.
    Начать можно с простого, 2 мотора на колёса + 1 мотор на турбину + пара датчиков столкновения, драйвер моторов, ардуина, батарейки 18650 и bms. Корпус вырезать ножиком из листов вспенённого ПВХ.
    Это сделать быстро/просто поэтому желание продолжать не пропадёт.
    Дальше можно добавить гироскоп, lidar, камеру глубины intel real sense, познакомиться с RTOS.
    На простом устройстве ознакомишься с базовыми вещами и дальше уже сможешь делать что угодно.
    Ответ написан
    Комментировать
  • Почему перегорают галогеновые лампы?

    NeiroNx
    @NeiroNx
    Программист
    "Цвета побежалости" на контактах свидетельствуют о перегреве в патроне из-за плохого контакта - менять патрон надо. Во вторых патрон должен соответствовать мощности лампы вполне вероятно вы в 35W патрон воткнули 60W лампу и он не может обеспечить эффективное теплоотведение от контактов лампы. У 60W патрона для таких ламп будет другая конструкция контактной системы исключающая перегрев в контактной группе за счет площади контактов и дополнительной площади для отведения излишнего тепла.
    Ответ написан
    2 комментария
  • Как прописать свою формулу для условного форматирования?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    5fe979517035d395854168.png

    Возможно, достаточно настроить условное форматирование:
    1. указать диапазон заливки
    2. выбрать пользовательские функции
    3. ввести функцию со знаком $. Это заставит "заливаться" всю строку
    Ответ написан
    Комментировать
  • Из научного сотрудника института математики в программисты или какую другую востребованную профессию реально можно освоить?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Математиком-теоретиком больше быть не хочу.
    может тогда математиком практиком?
    Алгоритмистика, скажем, скорее часть математики. Большинство действующих, квалицированных программистов не придумывают алгоритмов(а многие даже и не знают). Серьезные вычислительные задачи, например в нефтянке, требуют глубокого анализа перед рутинным кодированием. Data science, big data, artificial neural network - это же все больше про математику чем про программирование. Криптография опять же - мало кто из кодеров представляет отчетливо что же такое умножение на эллиптических кривых. Биржевые стратегии, оптимизация инвестиционного портфеля.
    Ответ написан
    2 комментария
  • Могу ли я в чистом javascript в асинхронной функции подождать возникновения события?

    lazalu68
    @lazalu68
    Salmon
    Конечно можете. После await у вас должен идти промис, который будет ресолвиться из обработчика события. Если речь о событиях DOM, то как-то так:

    HTMLElement.prototype.waitFor = function(event_name) {
        if (event_name) {
            return new Promise((res, rej) => {
            	const listener = function() {
            		res()
            		this.removeEventListener(event_name, listener)
            	};
    
            	this.addEventListener(event_name, listener);
            })
        } else {
            throw 'No event passed to waitFor method!';
        }
    }
    
    async function foo() {
    	const start = new Date();
    	await document.querySelector('body').waitFor('click');
    	console.log('uspeshno dojdalis clicka, jdali celih ' + ((new Date().getTime() - start.getTime())/1000) + ' sekund');
    }
    
    foo();
    Ответ написан
    7 комментариев
  • В чем закономерность?

    @kandrash
    Кратко о себе
    Чётное
    Нечётное
    Однозначное
    Двузначное
    Нечётное
    Ну это то что первое в голову пришло, я пока до второго не доучился, программу подготовки к первому осваиваю)
    Ответ написан
    8 комментариев
  • Как ежедневно автоматически сохранять значение ячейки в Google Таблицах?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Самое простое - это создать скрипт и подключить триггер времени.

    Добавьте код в проект к Таблице

    /**
     *
     */
    function createTrigger() {
      ScriptApp.getProjectTriggers().forEach(
        (trigger) =>
          trigger.getHandlerFunction() === 'saveData' &&
          trigger.getEventType() === ScriptApp.EventType.CLOCK &&
          (ScriptApp.deleteTrigger(trigger) ||
            console.info(`Tirgger ${trigger.getUniqueId()} was deleted`))
      );
      // every minutes for testing
      // ScriptApp.newTrigger('saveData').timeBased().everyMinutes(1).create();
      // at 9 o'clock every days
      ScriptApp.newTrigger('saveData').timeBased().atHour(9).everyDays(1).create();
    }
    
    /**
     *
     */
    function saveData() {
      const book = SpreadsheetApp.openById(
        '1FUSSiDQoXyvKXfzYydoUUfcCGYq_TskpRiwfb28_1Z0'
      );
      const sheet = book.getSheetByName('Лист1');
      const value = sheet.getRange('A1').getValue();
      book.getSheetByName('Лист2').appendRow([new Date(), value]);
      console.info(`saveData was called successful`);
    }


    Не забудьте поменять ID Таблицы 1FUSSiDQoXyvKXfzYydoUUfcCGYq_TskpRiwfb28_1Z0 на ваш.

    Таблица должна содержать два листа: "Лист1" и "Лист2". Программа с 9 до 10 утра один раз читает значение из ячейки Лист1!A1 и добавляет новую строку на Лист2.

    Вызовите из редактора функцию createTrigger один раз.

    Пример Таблицы с кодом https://docs.google.com/spreadsheets/d/1FUSSiDQoXy...

    На картинке красным пометил то, что нужно нажимать. Синим - нужно изменить перед первым запуском.
    5fe4bd91d80c7094551103.png
    Ответ написан