Pull to refresh
1
0
Send message

Под 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)

  • - такие скрипты сами по себе не будут автономны, требуется библиотека

Не недостаток легко компенсируется... скриптом :) Легко реализовать механизм, позволяющий сделать скрипт автономным:

~/.my_bash_lib/bash_make_script_standalone script_using_my_lib.sh new_standalone_script.sh

А чем это не язык программирования?
Я даже название ему придумал: 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 является «нечитаемой» для подавляющего большинства пользователей. Более того, нужно ещё уметь внедрять код в книги/шаблоны. Также не следует забывать о макросах и политике безопасности (в некоторых компаниях использование макросов и вовсе может быть запрещено). 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)

Конечный результат:
=ЕСЛИ(ГОД(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)

Information

Rating
Does not participate
Registered
Activity