Под Android использую приложение Keepass2Android, но, как правило, пользуюсь копи-пастом вместо интегрированных функций автозаполнения. Также много лет таскаю от смартфона к смарфону безопасную клавиатуру для паролей (вводишь на русском, пишет латиницей) без рекламы и вообще без выхода в Интернет. Она очень эргономичная. Этой клавиатуры давно нет в PlayMarket, к сожалению. Где-то на 4pda встречал её, но не вспомню.
Работаю на двух монитоах в режиме расширения рабочего стола, использую также виртуальные рабочие столы. Думаю ставить третий монитор. Это настолько удобно и продуктивно, что вернуться на один монитор не представляю возможным.
Мне на порядок удобнее работать на двух мониторах 17-22'', чем на одном 42''. Сечас мониторы расположены вертикально один над другим.
В довесок, что касается Веб, оценил удобство родного расширения Mozilla Firefox Multi-Account Containers.
Специализация разнопрофильная, ИТ, многозадачность (программирование, веб-дизайн, мониторинг и пр.).
Можно ещё выносить повторяющиеся части скрипта и подключать их при необходимости. Например, если вынести setup_colors() и msg() в ~/.my_bash_lib/bash_setup_colors.sh, код будет выглядеть намного лаконичнее.
Добавляем необходимый функционал из библиотеки при необходимости:
. ~/.my_bash_lib/bash_setup_colors.sh
или
source ~/.my_bash_lib/bash_setup_colors.sh
и использовать
msg "This is a ${RED}very important${NOFORMAT} message, but not a script output value!"
Преимущества и недостатки очевидны:
+ лаконичные скрипты, DRY
+ внёс изменения в библиотеку - применилось везде
+ очень удобно обслуживать (коллекционировать наработки, распространять и синхронизировать на платформах тем же git)
- такие скрипты сами по себе не будут автономны, требуется библиотека
Не недостаток легко компенсируется... скриптом :) Легко реализовать механизм, позволяющий сделать скрипт автономным:
А чем это не язык программирования?
Я даже название ему придумал: AnyTZCompiler.
Его ещё просто не реализовали. А после реализации? Может это и есть та самая вершина "идеальной цепи развития"?
1С всегда был нишевым продуктом. И нишевым умрёт. Может 1С и идеальна, исключителтно в определённой области, но тут по-моему вопрос вообще некорректный. Вроде как "какой должна быть идеальная цепь развития у ручных инструментов (плотника, сварщика, электрика)?". На поставленный вопрос нет однозначного ответа и скорее всего никогда не будет. Вопрос на пофилософствовать разве что.
Ух, каюсь, виноват. Стоило бы сразу подумать о предметной области.
Но в любом случае тогда формула будет ещё проще! Если есть желание, поиграйтесь, логика та же :)
Тему ИМХО стоило бы переименовать в "Формула подсчёта дней в периоде, которые выпадают на высокосный год".
Раньше понятие «высокосный день» нигде не встречал, поэтому, возможно, я неверно понял задачу.
«Посчитать количество високосных дней» я понял так: посчитать сколько раз встречается дата 29 февраля в интервале.
В периоде 01.01.20-01.01.21 это 29.02.20, 29.02.04, 29.02.08, 29.02.2012 29.02.16. Т.е. 5 дней, а не 6, действительно, есть ошибка:
п. 1 вместо =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365 правильно =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1);1;1)-(ГОД(A2)-ГОД(A1)-1)*365 (добавлен лишний день).
Конечный результат: =ЕСЛИ(ГОД(A2)-ГОД(A1)>1; ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1);1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365;0)+ЕСЛИ(ГОД(A2)<>ГОД(A1); ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)+ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0);0)+ЕСЛИ(И(ГОД(A2)=ГОД(A1); МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2; И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29)));1;0)
Теперь должно быть всё правильно, извиняюсь, делал быстро.
Напротив, VBA является «нечитаемой» для подавляющего большинства пользователей. Более того, нужно ещё уметь внедрять код в книги/шаблоны. Также не следует забывать о макросах и политике безопасности (в некоторых компаниях использование макросов и вовсе может быть запрещено). VBA действительно очень полезна (и даже нужна) в некоторых случаях. В статье поднят вопрос скорости работы как приоритетный. Не думаю, что здесь важна скорость. Разве что если нужно часто использовать расчёт на больших таблицах с периодами.
Постом просто описал другое решение и свою точку зрения. Т.е. именно в этом случае я бы VBA не использовал.
Описанный мною пример тоже возвращает количество выскокосных дней в периоде.
Насчёт п. 2 и п. 3, на примере периода 15.02.18-15.04.21.
П. 1 считает высокосные дни в периоде 01.01.19-31.12.20.
П. 2 считает высокосные дни в периоде с 15.02.18-31.12.18 и 01.01.21-15.04.21.
П. 3 считает высокосные дни в случае, когда период находится в пределах одного года, например, 15.02.18-15.04.18.
И все это объединяется в одной формуле. Которая, кстати, не такая уж и запутанная, ожидал что будет сложнее. По скорости работы не проверял. Но, повторюсь, именно здесь выбор между формулой и VBA по критерию «скорость работы» сомнителен.
Я бы здесь обошёлся без VBA по многим причинам, задача вполне решается и без этого.
Ниже пример как можно посчитать количество високосных дней в периоде, включая даты начала и окончания.
Допустим в ячейках A1 и A2 — даты начала и окончания периода соответственно.
Разбиваем расчёт на две части:
1) считаем високосные годы в полных годах интервала (если они есть);
2) считаем високосные годы на границах интервала, даты в пределах разных лет.
3) считаем високосный год, когда даты в пределах одного года.
1. Високосные годы в полных годах интервала (если они есть).
Условие расчёта: =ГОД(A2)-ГОД(A1)>1
Расчёт количества високосных лет: =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365, где
ДАТА(ГОД(A1)+1;1;1) и ДАТА(ГОД(A2)-1;12;31) — интервал, содержащий полные годы
(ГОД(A2)-ГОД(A1)-1)*365 — количество дней в интервале, пересчитанное без високосных лет
Принцип расчёта: посчитать в интервале количество дней с учётом високосных и вычесть количество дней без учёта високосных.
Результат: =ЕСЛИ(ГОД(A2)-ГОД(A1)>1; ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365;0)
2. Високосные годы на границах интервала, даты в пределах разных лет.
Первый год — високосный: =МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2
Дата начала захватывает 29 февраля: =A1<=ДАТА(ГОД(A1);2;29)
Второй год — високосный: =МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2
Дата окончания захватывает 29 февраля: =A2<=ДАТА(ГОД(A2);2;29)
Условие для границы интервала слева: =И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29))
Условие для границы интервала справа: И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29))
Результат для интервала слева: =ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)
Результат для интервала справа: =ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0)
Результат: =ЕСЛИ(ГОД(A2)<>ГОД(A1); ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)+ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0);0)
3. Даты в пределах одного года.
Условие: =ГОД(A2)=ГОД(A1)
Год — високосный: =МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2
29 февраля находится в интервале: =И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29))
Результат: =ЕСЛИ(И(ГОД(A2)=ГОД(A1); МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2; И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29)));1;0)
Под Android использую приложение Keepass2Android, но, как правило, пользуюсь копи-пастом вместо интегрированных функций автозаполнения. Также много лет таскаю от смартфона к смарфону безопасную клавиатуру для паролей (вводишь на русском, пишет латиницей) без рекламы и вообще без выхода в Интернет. Она очень эргономичная. Этой клавиатуры давно нет в PlayMarket, к сожалению. Где-то на 4pda встречал её, но не вспомню.
Работаю на двух монитоах в режиме расширения рабочего стола, использую также виртуальные рабочие столы. Думаю ставить третий монитор. Это настолько удобно и продуктивно, что вернуться на один монитор не представляю возможным.
Мне на порядок удобнее работать на двух мониторах 17-22'', чем на одном 42''. Сечас мониторы расположены вертикально один над другим.
В довесок, что касается Веб, оценил удобство родного расширения Mozilla Firefox Multi-Account Containers.
Специализация разнопрофильная, ИТ, многозадачность (программирование, веб-дизайн, мониторинг и пр.).
Можно ещё выносить повторяющиеся части скрипта и подключать их при необходимости. Например, если вынести setup_colors() и msg() в ~/.my_bash_lib/bash_setup_colors.sh, код будет выглядеть намного лаконичнее.
Добавляем необходимый функционал из библиотеки при необходимости:
или
и использовать
Преимущества и недостатки очевидны:
+ лаконичные скрипты, DRY
+ внёс изменения в библиотеку - применилось везде
+ очень удобно обслуживать (коллекционировать наработки, распространять и синхронизировать на платформах тем же git)
- такие скрипты сами по себе не будут автономны, требуется библиотека
Не недостаток легко компенсируется... скриптом :) Легко реализовать механизм, позволяющий сделать скрипт автономным:
А чем это не язык программирования?
Я даже название ему придумал: AnyTZCompiler.
Его ещё просто не реализовали. А после реализации? Может это и есть та самая вершина "идеальной цепи развития"?
1С всегда был нишевым продуктом. И нишевым умрёт. Может 1С и идеальна, исключителтно в определённой области, но тут по-моему вопрос вообще некорректный. Вроде как "какой должна быть идеальная цепь развития у ручных инструментов (плотника, сварщика, электрика)?". На поставленный вопрос нет однозначного ответа и скорее всего никогда не будет. Вопрос на пофилософствовать разве что.
ЗЫ. И подойдёт ли здесь такое решение в принципе, нужно подумать. Тогда на VBA лучше уж сразу результат по процентам считать.
Ух, каюсь, виноват. Стоило бы сразу подумать о предметной области.
Но в любом случае тогда формула будет ещё проще! Если есть желание, поиграйтесь, логика та же :)
Тему ИМХО стоило бы переименовать в "Формула подсчёта дней в периоде, которые выпадают на высокосный год".
Удачи! :)
«Посчитать количество високосных дней» я понял так: посчитать сколько раз встречается дата 29 февраля в интервале.
В периоде 01.01.20-01.01.21 это 29.02.20, 29.02.04, 29.02.08, 29.02.2012 29.02.16. Т.е. 5 дней, а не 6, действительно, есть ошибка:
п. 1 вместо =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365 правильно =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1);1;1)-(ГОД(A2)-ГОД(A1)-1)*365 (добавлен лишний день).
Конечный результат:
=ЕСЛИ(ГОД(A2)-ГОД(A1)>1; ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1);1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365;0)+ЕСЛИ(ГОД(A2)<>ГОД(A1); ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)+ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0);0)+ЕСЛИ(И(ГОД(A2)=ГОД(A1); МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2; И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29)));1;0)
Теперь должно быть всё правильно, извиняюсь, делал быстро.
Или я вообще неправильно понял задачу?
Потому что в формуле увидели слово «ГОД», но не нашли «РАСЧЕТ_ВЫСОКОСНЫХ_ДНЕЙ»? :)
Ваше решение не оспариваю ни в коем случае.
Постом просто описал другое решение и свою точку зрения. Т.е. именно в этом случае я бы VBA не использовал.
Описанный мною пример тоже возвращает количество выскокосных дней в периоде.
Насчёт п. 2 и п. 3, на примере периода 15.02.18-15.04.21.
П. 1 считает высокосные дни в периоде 01.01.19-31.12.20.
П. 2 считает высокосные дни в периоде с 15.02.18-31.12.18 и 01.01.21-15.04.21.
П. 3 считает высокосные дни в случае, когда период находится в пределах одного года, например, 15.02.18-15.04.18.
И все это объединяется в одной формуле. Которая, кстати, не такая уж и запутанная, ожидал что будет сложнее. По скорости работы не проверял. Но, повторюсь, именно здесь выбор между формулой и VBA по критерию «скорость работы» сомнителен.
Ниже пример как можно посчитать количество високосных дней в периоде, включая даты начала и окончания.
Допустим в ячейках A1 и A2 — даты начала и окончания периода соответственно.
Разбиваем расчёт на две части:
1) считаем високосные годы в полных годах интервала (если они есть);
2) считаем високосные годы на границах интервала, даты в пределах разных лет.
3) считаем високосный год, когда даты в пределах одного года.
1. Високосные годы в полных годах интервала (если они есть).
Условие расчёта: =ГОД(A2)-ГОД(A1)>1
Расчёт количества високосных лет: =ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365, где
Принцип расчёта: посчитать в интервале количество дней с учётом високосных и вычесть количество дней без учёта високосных.
Результат: =ЕСЛИ(ГОД(A2)-ГОД(A1)>1; ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365;0)
2. Високосные годы на границах интервала, даты в пределах разных лет.
Первый год — високосный: =МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2
Дата начала захватывает 29 февраля: =A1<=ДАТА(ГОД(A1);2;29)
Второй год — високосный: =МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2
Дата окончания захватывает 29 февраля: =A2<=ДАТА(ГОД(A2);2;29)
Условие для границы интервала слева: =И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29))
Условие для границы интервала справа: И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29))
Результат для интервала слева: =ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)
Результат для интервала справа: =ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0)
Результат:
=ЕСЛИ(ГОД(A2)<>ГОД(A1); ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)+ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0);0)
3. Даты в пределах одного года.
Условие: =ГОД(A2)=ГОД(A1)
Год — високосный: =МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2
29 февраля находится в интервале: =И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29))
Результат: =ЕСЛИ(И(ГОД(A2)=ГОД(A1); МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2; И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29)));1;0)
Конечный результат:
=ЕСЛИ(ГОД(A2)-ГОД(A1)>1; ДАТА(ГОД(A2)-1;12;31)-ДАТА(ГОД(A1)+1;1;1)+1-(ГОД(A2)-ГОД(A1)-1)*365;0)+ЕСЛИ(ГОД(A2)<>ГОД(A1); ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2;A1<=ДАТА(ГОД(A1);2;29));1;0)+ЕСЛИ(И(МЕСЯЦ(ДАТА(ГОД(A2);2;29))=2;A2>=ДАТА(ГОД(A2);2;29));1;0);0)+ЕСЛИ(И(ГОД(A2)=ГОД(A1); МЕСЯЦ(ДАТА(ГОД(A1);2;29))=2; И(A1<=ДАТА(ГОД(A1);2;29);A2>=ДАТА(ГОД(A2);2;29)));1;0)