• Как не терять интерес к изучению программирования?

    @abcd0x00
    Суть в том, что каждый раз, когда начинаю читать какую-нибудь книгу по программированию или смотреть курсы, прохожу какую-то часть и дальше интерес пропадает.

    Надо структурировать информацию об обучении для долгих отрезков времени. Это очень важная составляющая, если собрался чем-то заниматься серьёзно. Чтение книги - не такой уж быстрый процесс. Написание программы - это не только долгий, но и запутанный процесс. А написание нескольких программ и чтение нескольких книг - это всё вместе. Ты никак не обойдёшься без органайзера. Поэтому потрать время на организацию долгих процессов. Изучи, чем и как ты будешь это делать. Что значит "чем" - это средство, программа или несколько программ, потому что разные вещи делаются разными программами. Что значит "как" - это то, как ты будешь пользоваться средствами, потому что использовать их тоже можно как эффективно, так и неэффективно.

    Твоя задача: ты записывал информацию на протяжении года, потом был перерыв и через пять лет ты открыл эти данные и ты должен всё понять и вспомнить только по этой информации.

    Вот у меня, допустим, книга появляется. Я решил, что я должен её прочитать и пройти всю, потому что мне это даст то-то и то-то. Я готов на это потратить год или два. Я создаю для неё её индивидуальную среду - как бы проект по изучению этой книги. Дальше в нём распределяю, где я буду хранить закладки прохождения книги, заметки по главам, примеры кодов из самой книги по главам, тренировочные коды для экспериментов по главам. Важно бэкапить этот проект, чтобы в один прекрасный день не потерять информацию, копившуюся полгода - настраиваешь бэкап, находя под него место, делая скрипты автоматического бэкапа, чтобы быстро всё было (скрипты готовы с прошлых книг). Вот у тебя получается такая заготовка для изучения книги. И после этого ты начинаешь, например, переносить все пункты в отдельный файл пройденных пунктов. Прочитал первый пункт первой главы - сохранил по нему важные моменты в отдельный файл с конспектом первой главы. Отмечаешь в файле пройденных пунктов, что пункт прочитал. Заметки по этому пункту пишешь в отдельный файл с заметками для первой главы. В общем, первая глава превращается в такую папку с данными только для неё, вторая глава превращается во вторую папку с данными только для неё. Не надо ничего мешать в кучу. Лучше максимально раскидать по индивидуальным папкам и файлам, а потом создать шапку-центр, который это всё объединяет воедино где-нибудь наверху. Это как html-файл со ссылками на главы, где каждая ссылка ведёт на html-файл со ссылками на пункты. Всегда надо знать (видеть), что ты прошёл и что ты не прошёл, чтобы ты мог посмотреть на пройденное и сказать "пройдя вот это всё, из нового я узнал вот это, это и это". Если нужно что-то перечитать, не бросайся на это сразу, запиши себе заметку в файл с заметками, прямо так и пиши себе на будущее "перечитай такой-то пункт, чтобы узнать про ту вещь поподробнее". Когда пишешь себе заметки, не оставляй моментов, где надо вспоминать или догадываться о деталях, помни, что когда ты это будешь читать, ты не сможешь ничего вспомнить из того, что сейчас кажется очевидным, так что пиши себе заметки, как незнакомому человеку писал бы. Если задание выполнил из заметки, запиши себе дату и "я задание выполнил". Всё, после этого ты можешь читать книгу как угодно, вся регистрация по её прохождению идёт и даёт полную картину.

    С программами потяжелее всё, так как надо ещё подробнее всё писать там и оно может меняться по сто раз. Это наука не простая, нужно много изучать и про версионирование, и про системы по слежению за багами. Может пройти какое-то время и старая система может показаться безграмотной, надо будет всё переделывать. Где-то ты работал по водопаду, потом оказалось, что есть скрам. Где-то ты работал напрямую, потом оказалось, что есть юнит-тесты до кода. Потом ты начинаешь тесты писать, а вся программа останавливается. А потом идеи, которые были, уже не подходят, потому что ты решил всё переделать, так как для тестов будет лучше определённым образом всё писать. Если же ты этого не делаешь, то надо программу продолжать писать безграмотно и результат получается совсем неприятный (программа идёт в тупик шаг за шагом и потом её только заново написать остаётся, чтобы хотя бы продолжать её развивать). Так что лучший совет здесь - всегда смотри за другими проектами, смотри, как ими управляют, если даже сложно это всё, изучай это сложное управление. Имея все эти знания, вырабатывай свой стиль управления проектом, потому что модные стили тоже не являются гарантией эффективности, и фуфло может быть модным и признаваться с умным видом на конференциях, но потом все скрупулёзно всё равно ищут что-нибудь получше (сами сделать не могут же ничего обычно ;-) только разговоры разговаривать).

    Очень много книг надо прочитать очень медленно и очень много программ надо написать не самых простых. Надеюсь, всё это ты не собрался держать в голове.
    Ответ написан
    Комментировать
  • Как настроить ESLint, чтобы он искал объявления глобальных переменных в любом месте проекта?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Скрипты предполагают, что вы используете общее пространство имен, а система модулей (файлов) для которой предназначен линтер -- каждый файл является закрытым пространством имен. Поэтому либо делать комментарий

    /* global SuperClass */

    Либо писать на Typescript.
    Ответ написан
    Комментировать
  • Как погрузиться в начала/фундамент программирования?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как построенн язык программирования, например: Как понять, как устроенны ключевые слова; Препроцессорные процессы: define, include и др.; - Я правильно понимаю, нужно опустится на ещё более низкий уровень до ассемблера? - Ассемлер является той фундаментальной сущностью в программировании (не считая машинный код, который и так человек не должен понимать)?

    Лет 50 назад так было. Программист был физик-математик. И он обязан был знать как работает транзистор. Этот был "тот" уровень понимания требований к профессии. Сегодня знания ассемблера уже не являются обязательными. Можно прожить бурную и интересную жизнь будучи синьором-помидором разработчиком но так и не написать ни строчки на асмах. Профессия разделилась на узкие специализации и знать весь стек уже стало настолько трудно что это перестало быть необходимым.

    По второму пункту - я не понял что хотел автор. Хотел достичь какого-то дзена?

    Ну и вообщем, какие-то фундаментальные знания - на чём базуется/построенна програмированние и IT, тоже не помешало. Например рекомендуют SICP почитать, правильно ли я тогда пойду или это не то. Если да, можете ещё набросать ваши варианты? Буду признателен.

    Кажется один из авторов SICP сказал примерно следующее. Что современный инженер - это уже не создатель алгоритмов. Он - интегратор. Просто сама индустрия подталкивает к тому чтобы популярным стал язык Go а не Scheme. Хотя c моей кочки зрения Scheme интереснее и умнее, но увы. Прагматизм все решает. Для меня Scheme останется в разделе забавных мозговых экспериментов вроде брейн-фака. Ты решаешь задачу и получаешь от этого эндорфин. Как codewars. Вот такого эндорфина от Go нету. Хотя в резюме такое вписывать бесполезно наверное. Кому нужен Lisp-овед или Schem-щик?

    Кстати кто знает какие курсы в MIT сейчас читают? Поделитесь.
    Ответ написан
    4 комментария
  • Гуглтаблица сводная как узнать цвет заливки ячейки?

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

    Как сказал Григорий Боев, пока вы не разукрасите в свой цвет, будет считаться, что там белый.
    Ответ написан
    Комментировать
  • Как правильно написать формулу для рассчитываемого поля в сводной таблице?

    @tim8ska
    Руководитель IT проектов в крупнейшей автокомпании
    Добрый день,

    Не совсем понятна ваша задача и нет исходного файла. Попробовал воспроизвести ваш файл.
    По задаче, так как не понятно что вы хотите, то изложу свои решения вопросов, а вы уже решите что вам более подходит:
    1. Формулу можно написать вне сводной таблицы, как вы привели пример на первом скрине, тогда в ней ошибки не будет. Эти данные потом можно будет выводить на соседнюю вкладку так, как вам это нужно.
    2. Формулу можно написать в вашей исходной таблице, которая будет рассчитывать процент от текущей категории, потом просто выведите это значение в Столбец. Моя формула =C4/ СУММ(FILTER($C$2:$C$18;$A$2:$A$18=A4))
      61f43425b92b9832830934.jpeg
      Результат:
      61f434dff1be4753912391.jpeg

    3. Третий и самый простой вариант: в сводной таблице вы можете добавить ещё один, тот же дублирующий столбец (у меня основной столбец "Значение", поэтому второй раз добавляю "Значение"), но "Показывать как" его уже в % от необходимого вам параметра столбец или строка. Вот пример что у меня получилось:
      61f4355f5ca9b389129719.jpeg
    Ответ написан
    Комментировать
  • Как скачать все компании с битркс24 по api, имея crest, запросом через batch, если их больше 2500?

    ILX
    @ILX Автор вопроса
    Соединяю дорожки, и умы людей немножко.
    В продолжении темы...
    Универсальная функция которая вернёт все компании сколько их бы не было, не кидайтесь помидорами за говнокод...
    function call_all_company ()//функция которая вернет все комапнии из bitrix24
    		{
    			$total = CRest::call('crm.company.list')["total"];
    		
    			$list_N=(int)($total/50)+1; //Количество необходимых листов +1 тк от нуля
    			for($i=0; $i < $list_N; $i++)
    			{
    				$cmd_arr_cach[(int)($i/49)]["list_".$i] = 'crm.company.list?start='.($i*50);
    			}
    			foreach ($cmd_arr_cach as $key => $cmd_arr)
    			{
    				sleep(1);//Щадяший режим лучше ставить 2 секунды
    				
    				$local = CRest::call('batch',
    										array(
    												'halt' => 0,
    												'cmd'=> $cmd_arr
    											)
    										);
    										
    				$result[]= call_user_func_array('array_merge', $local['result']['result']);
    			}
    			return $result[0];
    		}
    		 print_r (call_all_company ());
    Ответ написан
    2 комментария
  • Возможно ли заработать на играх?

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    Если вы задаете такой вопрос, то нельзя.

    Разработка игры - это технический процесс.
    Заработок на разработке игры - бизнес процесс. Если вы задаете такие вопросы, то скорее всего вы не сможете заработать на разработке игры своими силами.
    Ответ написан
    4 комментария
  • Как правильно собрать batch-запрос на получение товаров сразу нескольких сделок, количество которых изначально неизвестно?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как указать в запросе, что этот индекс должен изменяться просто динамически?


    Такой возможности в Битрикс24 нет.

    Дело кроется в несколько ином видении проблематики. Когда вы выполняете запрос на получения количества он возвращает вам не более 50 элементов с постраничной, но батч это всего 50 запросов, то есть если бы такой механизм имел место, то батч был бы резиновым, так как по факту должен выполнить 51 запрос (1 на получение списка и еще 50 на получение каждого элемента). Каким образом должен был бы себя вести батч-запрос когда вы указали 3 запроса? Например получение списка сделок, получение конкретных сделок и получение какого-нибудь справочника? Выполнить 52 запроса? Нет, это фантастика.

    Какой хак можно использовать?
    Можно самому генерировать запросы на основании хака.
    Так как в батче результат запроса выдается порядковым номером (если не указано иное), то они всегда будут в диапазоне от 0 до 49.
    Для примера мы хотим получить 10 сделок из постранички одним запросом, тогда можно отправить следующий батч-запрос:

    'halt' => 0,
    'cmd'  => [
    	'deals' => 'crm.deal.list?filter[STAGE_ID]=PREPAYMENT_INVOICE&filter[>ID]=0&limit=10',
    	'products_0' => 'crm.deal.productrows.get?id=$result[deals][0][ID]',
    	'products_1' => 'crm.deal.productrows.get?id=$result[deals][1][ID]',
    	...
    	'products_8' => 'crm.deal.productrows.get?id=$result[deals][8][ID]',
    	'products_9' => 'crm.deal.productrows.get?id=$result[deals][9][ID]',
    ]


    Когда мы проитерируем "products_*", мы получим последний обработанный ID (для примера это будет 123456) и сможем выполнить следующий батч-запрос:
    'halt' => 0,
    'cmd'  => [
    	'deals' => 'crm.deal.list?filter[STAGE_ID]=PREPAYMENT_INVOICE&filter[>ID]=123456&limit=10',
    	'products_0' => 'crm.deal.productrows.get?id=$result[deals][0][ID]',
    	'products_1' => 'crm.deal.productrows.get?id=$result[deals][1][ID]',
    	...
    	'products_8' => 'crm.deal.productrows.get?id=$result[deals][8][ID]',
    	'products_9' => 'crm.deal.productrows.get?id=$result[deals][9][ID]',
    ]


    Но вы в любом случае должны понимать что чем больше данных будет возвращать ваш батч-запрос тем он мендленнее будет выполняться, поэтому в crm.deal.list рекомендую так же ограничить список получаемых полей.
    Ответ написан
    1 комментарий
  • [PHP] Ставить ли скобки в условии if, если в блоке всего 1 действие?

    @xAockd
    Что бы не затупить не было втф
    if пишу так
    if($smth) return $smth;
    И тогда мне кажется явно видно что if однострочник. Ну, а если надо расширить, то тогда скобки
    Ответ написан
    Комментировать
  • Как добавить фото в бот Telegram, если пишет ошибку "Please send me the picture as a 'Photo', not as a 'File'."?

    jerwright
    @jerwright
    while True: coding()
    При загрузке фотографий нажмите на кнопку возле надписи «Сжать изображение».
    Ответ написан
    3 комментария
  • Протягивание формулы draggDownFormulas скриптом App Script в гугл таблице?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    К сожалению, вам придется указывать каждый раз новые формулы для "протягивания"

    function run() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const base = sheet.getRange('I3:I');
      const colFormula = sheet.getRange('J3');
      draggDownFormulas_(base, colFormula);
      const colFormula2 = sheet.getRange('K3');
      draggDownFormulas_(base, colFormula2);
    }


    Ну, или более продвинутый вариант

    function runBulk() {
      const formulasCells = ['J3', 'K3', 'M3'];
      const sheet = SpreadsheetApp.getActiveSheet();
      const base = sheet.getRange('I3:I');
      formulasCells.forEach((cell) => {
        const colFormula = sheet.getRange(cell);
        draggDownFormulas_(base, colFormula);
      });
    }


    Уверен, что при хорошем рефакторинге можно будет "решить" некоторые особенности "протягивания".
    Ответ написан
    2 комментария
  • Гуглтаблицы Как ускорить создание гиперрссылок в диапазоне?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вероятно

    /**
     * @param {globalThis.SpreadsheetApp.Range} range
     */
    function cell_Link_Activate_(range) {
    
      const values = range.getValues();
      const rtvsOld = range.getRichTextValues();
      const rtvs = values.map((row, x) => row.map((cell, y) => {
        if (cell !== '') {
          const rtv = SpreadsheetApp.newRichTextValue()
            .setText(cell)
            .setLinkUrl(cell)
            .build();
          return rtv;
        }
        return rtvsOld[x][y];
      }));
      range.setRichTextValues(rtvs);
    }


    Пример в Таблице
    Ответ написан
    Комментировать
  • PhpStorm 2 окна как в subime3?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    Правый клик по вкладке - Разделить окно по вертикали (или горизонтали)

    616434b5b3b94856580461.png
    Ответ написан
    1 комментарий
  • Как удалить чат в Битрикс24 коробка?

    DA_vot
    @DA_vot
    Битрикс по наитию и для души
    Поддержка Б24 мне на такой вопрос ответила: Удалить чат нельзя, можно только скрыть.
    Максимум, что я смог сделать выгнать всех из чата и почистить файлы через Диск:
    Очистка места, Экспертный режим, Хранилище для Веб-мессенджера
    Найти чат и через вызов меню удалить содержимое папки (удаляться только файлы).
    Ответ написан
    Комментировать
  • Как можно выводить изменения ячейки в гугл таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Нужно отслеживать событие onEdit(event) и писать лог в нужный лист.
    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;	//Указываем на каких листах должен работать скрипт
      //Можно при желании ещё фильтровать по строке/столбцу (row/col), или по старому/новому значению (oldValue/newValue)
      
      var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Архив");
    
      archive.getRange(archive.getLastRow()+1, 1).setValue(
        formatDateTime(new Date())+" " + "[" + ss.getName() + "!" + address + "] '" + (oldValue==undefined?"":oldValue) + "' >> '" + (newValue==undefined?"":newValue) +"'"
      );
    };
    
    function formatDateTime(date) {
    
      var dd = date.getDate();
      if (dd < 10) dd = '0' + dd;
      var mm = date.getMonth() + 1;
      if (mm < 10) mm = '0' + mm;
      var yy = date.getFullYear() % 100;
      if (yy < 10) yy = '0' + yy;
      
      var hh = date.getHours();
      if (hh < 10) hh = '0' + hh;
      var MM = date.getMinutes();
      if (MM < 10) MM = '0' + MM;
      var ss = date.getSeconds();
      if (ss < 10) ss = '0' + ss;
      
      return dd + '.' + mm + '.' + yy + ' ' + hh + ':'+ MM + ':'+ ss;
    }

    Вот ссылка на демо
    Ответ написан
    4 комментария
  • Как проверить google script есть ли с таким же именем лист в таблице как и активный?

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

    Пример

    const sheetName = 'Sheet1';
    const sheet = book.getSheetByName(sheetName);
    if(sheet){
      cnsole.log(`Лист с именем ${sheetName} есть`);
    }


    Или, что чаще используется, создание листа, если его нет

    const sheetName = 'Sheet1';
    const sheet = book.getSheetByName(sheetName) || book.insertSheet(sheetName);
    Ответ написан
    Комментировать
  • Как в Битрикс24 собирать лиды из почты?

    promconsulting
    @promconsulting
    Настройка и обучение Битрикс24
    Если портал не "рабочий" то почта работает с опозданием.
    Как только начнете работать все приходит вовремя.
    Если вообще письма не приходят, то значит неверные настройки.
    Пришлите запрос с админ доступом на почту: promconsulting@yandex.ru
    Могу посмотреть, бесплатно
    Ответ написан
    Комментировать
  • Как найти в многомерном ассоциативном массиве значение и вывести массив данных по ключам php?

    @Allarion Автор вопроса
    Решение
    function findArray ($ar, $findValue, $executeKeys){
      $result = array();
    
      foreach ($ar as $k => $v) {
        if (is_array($ar[$k])) {
          $second_result = findArray ($ar[$k], $findValue, $executeKeys);
          $result = array_merge($result, $second_result);
          continue;
        }
        if ($v === $findValue) {
          foreach ($executeKeys as $val){
            $result[] = $ar[$val];
          }
          
        }
      }
      return $result;
    }
    Ответ написан
    Комментировать