Volond Apps
221 subscribers
216 photos
28 videos
22 files
994 links
Программирование для души и от лени
Добро пожаловать! У нас есть отличное сообщество любителей Excel и VBA, Google Sheet и Google Apps Script, а также всех тех, кто готов работать с этим программным обеспечением. Присоединяйтесь к нам, чтобы задавать и от
Download Telegram
Зачем знать, как вещи работают внутри?
Многие разработчики считают, что им не нужно понимать, как вещи работают внутри, а достаточно просто знать API. Я считаю, что с таким подходом есть проблема.

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

Не зная внутренностей, вы не понимаете свойств систем и следовательно не можете грамотно проектировать. Да, можно опираться на маркетинговый материал, но это очень наивный подход.

Примеров масса:
Если вы знаете, как устроены бызы данных, то вы можете выбрать подходящую. Понимание индексов позволяет предсказать, что произойдет с выборками, если объем данных увеличиться в несколько раз. Или почему добавление индексов может снизить производительность вашего приложения.
Если вы знаете, как работает Docker, то можете оценить риски изоляции и возможно начать использовать виртуалки.
Если вы знаете, как работает HTTPS, то без проблем найдете проблему, когда корпоративный прокси заказчика делает man-in-the-middle и выкусывает CORS заголовки.
Если вы знаете, что xslx файлы на самом деле zip с xml внутри, то вы можете предсказать, что конвертация в CSV может помочь решить проблему с со скоростью парсинга.
Если вы понимаете, как работает JWT, то вы будете знать, что клиент и без "секрета" извлечь все данные с токена.
Если вы понимаете, как внутри устроена файловая система, то поймете, почему лучше не хранить большое количество файлов в одной директории в ext2.
Я встречал сениор разработчиков, которые, к примеру, думали, что React Native компилируется в нативных код и в результате не могли понять, когда стоит использовать RN, а когда нативные приложения.
etc

Что думаете?
Наткнулся на интересный репозиторий - 30 second of code

Более сотни коротких кусочков кода. Залипнуть можно на долго, многое может пригодиться для решения ваших задач.
Рекомендую 👍

#js
Вытягиваем из текста ссылки на Google Документы
regexp101

/https:\/\/docs.google.com\/(.*)\/d\/(.*)\/.*sharing/
Forwarded from DidacticСardsBot
JSON-minify

Источник:



Порт JSON-minifyутилиты на язык JavaScript.


Обзор


JSON-minifyпреобразует блоки JSON-подобного содержимого в допустимый JSON, удаляя все пробелы и комментарии в стиле JS (однострочные //и многострочные /* .. */).

С помощью JSON-minifyвы можете поддерживать удобные для разработчиков документы JSON, но минимизировать их перед синтаксическим анализом или передачей по сети.
••••••••••
Обсудить:
Forwarded from DidacticСardsBot
Распределение ролей в проекте (скрипт Google Apps для таблиц)

Источник:



Создайте сводную таблицу распределения ролей в проекте на основе имен проектов, пользователей и их ролей.

••••••••••
Обсудить:
Forwarded from DidacticСardsBot
Объединить две таблицы Google (скрипт Google Apps для таблиц)

Источник:



Объединяет информацию из двух Google Таблиц. Например, сценарий можно использовать для объединения информации о людях, экспортированной из системы LDAP, со списком назначений проекта.


Первая строка таблицы src / dst должна содержать метки для каждого столбца. Самая левая метка на листе dst считается keyLabel, а значения в этом столбце считаются ключами . Эти ключи используются для сопоставления строк между листами src и dst.

••••••••••
Обсудить:
FAQ: Что нужно знать создателям голосовых чатов

Чтобы запустить голосовой чат, нужно обновить Telegram до последней версии, зайти в информацию о канале и нажать на «Начать голосовой чат».

Для голосового чата можно задать имя. Отразите в названии голосового чата главную суть вашей встречи со слушателями: укажите название, которое соответствует теме разговора.

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

— Заранее анонсируйте войсчат: у ваших подписчиков будет время узнать про него, а у вас — выстроить план разговора. В анонсе используйте слова "Голосовой чат" — так нам будет проще найти ваш анонс и рассказать о голосовом чате нашим подписчикам.

— Ссылка на голосовые чаты не меняется: если вы хотите пригласить слушателей, просто добавьте к адресу собственного канала ?voicechat. Полная ссылка будет выглядеть так: t.me/voiceinfo?voicechat.

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

— Найдите модератора для голосового чата. Чтобы ведущему не заниматься техническими вопросами, попросите проконтролировать эфир одного из ваших администраторов. Он сможет регулировать уровень звука всех спикеров для всех слушателей, и активировать определённым гостям микрофон.

— Голосовой чат можно записать, чтобы в дальнейшем разговор могли послушать и другие читатели вашего канала: просто нажмите на кнопку записи голосового чата в начале трансляции. О том, что беседа записывается, можно понять по мигающей красной точке сверху, возле наименования чата. Запись голосового чата после его окончания появится у вас в «Избранном».

— Если хотите подключить ваших слушателей к разговору — объясните им, как это сделать. Следует нажать кнопку «Поднять руку», а после того, как его назначат спикером, активировать микрофон. Также советуйте спикерам, которые не участвуют в разговоре в текущий момент отключать микрофон, чтобы те не "засоряли" эфир посторонними звуками. Точно так же выключайте и свой микрофон, чтобы не было эха при вещании спикеров.

#FAQ
image_2021-04-06_10-09-39.png
72.3 KB
Develop Google Sheets solutions
Forwarded from volond
/**
* Первая буква в столбце В верхний регистр
* @param {SpreadsheetApp.Range} range
* @customfunction
*/
var mapToUpperCase=(range)=>{
range=Array.isArray(range)?range:[range]
return range.map(el=>{
var str=el[0]
var [a,...rest]=[...str]
return [[a.toUpperCase(),rest.join("")].join("")]
})
}
Forwarded from volond
/**
* JOIN с
* @customfunction
*/
var progressiveJoin=(range)=>{
return range.flat().map((el,i,arr)=>!i?[el]:[arr.slice(!i?1:0,i+1).join()])


}
=if(ISEMAIL(G2);"Это почта";"Это телефон")
Forwarded from volond
Взаимодействие между web-приложениями через Web Intents

Источник:



В Android OS эта проблема решается при помощи Intents[1] — архитектуры, позволяющей взаимодействовать компонентам одного или нескольких различных приложений. По этой схеме, клиенсткое приложение создает запрос (к примеру, разослать что-нибудь) и задает параметры, которые будут переданы другому приложению-сервису. После этого пользователю предоставляется список приложений, которые регистрировали свою возможность обрабатывать данный тип intent-запроса. Затем выбранное пользователем приложение запускается в новом контексте, и ему передаются параметры, переданные клиентом в некоем, заранее определенном для конкретного типа intent, формате.


Мы считаем своей основной и важнейшей задачей разработку простого и удобного в использовании API. При помощи Web Intents, вы можете подключить web-приложение к необходимому сервису используя всего лишь две строки кода! Chome сделает все остальное за вас.

••••••••••
Обсудить:
Forwarded from volond
/**
* Количество строк в активной книге
* @customfunction
*/
function rowsCount(){
return SpreadsheetApp
.getActiveSpreadsheet()
.getSheets()
.reduce((acc,sh)=>acc+=sh.getLastRow(),0)}
function test(){
console.log(rowsCount())
}
#snippet #GAS #JS
Forwarded from volond
var blankArr=(arr)=>arr.filter((row)=>row.filter((cell)=>!!cell.toString()).length)
var values=(sh)=>{
let name=sh.getName()
let dataRange=sh.getDataRange()
let values=sh.getDataRange().getValues()
let count =blankArr(values).length
let a1Not=dataRange.getA1Notation()
return [name,count,a1Not]
}
/**
* Информация о количестве непустых строк
* в листах активной книги
* @customfunction
*/
function rowsCountNoBlank(){
return SpreadsheetApp
.getActiveSpreadsheet()
.getSheets()
.map(values)
}
function test(){
console.log(rowsCountNoBlank())
}