Абсолютно ничего удобного в этом нет. Чтобы сесть в машину с "обычной" дверью ее можно приоткрыть на 45 градусов перенести вес на одну ногу и аккуратно плюхнуть пятую точку на кресло. Эту дверь вы будете открыть почти на 90 градусов и корячиться крутиться каждый раз. Потому что посадка выполняться лицом к багажнику а нужно развернуться к нему опять же той самой пятой точкой, чтобы приземлить ее на сидение. Про выход то же самое.
Такое ощущение что этот Атом специально делают как сборище всех возможных антипаттернов комфорта и удобства.
"Автоматические распашные" это вообще жуткий трэш на придомовых парковках, где все жмутся и в машину по утрам нужно просачиваться чтобы не поцарапать соседа.
Наверно там где микроядро это про KasperskyOS а там где говорится про десятки репозиториев и 15 ГБ это то что потребуется выкачать для сборки Flutter-а.
А Гамлета между прочим писали без лэп- деск- серв- и вообще без всякой цифро-. Просто в вашем окружении больше причастных к ИТ технологиям и Вам кажется что это прям весь мир. На самом деле мир он куда больше и технологии далеко не решающее в нем. Политики слишком далекие от технологий обходятся без всяких гаджетов и прочего легко играя Вашей и моей жизнью. Рушат страны, сливают экономики, перемещают миллионы людей и все это без больших мониторов и удобных клавиатур. Так что наличие каких то специфичных знаний, в данном случае знание заклятий цифровых приборов, не говорит ни о какой исключительности из "миллиарда обезъянок", это всего лишь знания какой-то конкретной области ни больше ни меньше. Любая из "обезъянок" может быть гораздо гениальней в какой-то другой области или просто гораздо умнее в целом.
Немного непонятна стратегия с клипами. Вот на десктопе им самое место, но нету. Хотя в браузерной версии пожалуйста. А на мобилках с малюсеньким экранчиком они есть, но как то совсем неуместны.
3D навигаторы не удобная штука. Есть наглядный пример - Navitel с их 3D картой.
Абсолютно неудобно, не видно маршрута за поворотом, если на углу стоит здание, Да и в целом слишком замусоренная картинка, боковым зрением совершенно нечитаема..
Раньше в настройках было включать музыку в отдельном приложении или внутри навигатора/карт. Сейчас музыка включается только внутри навигатора. Есть миниплеер с лайками, есть большой раздел с почти всем что есть в я.музыке.
Алиса изначально встроена как в навигатор так и в карты. Но работает в них по разному. Функции Алисы мигрируют в обе стороны кстати. К примеру поддержка адресной книги - команда "позвони ИмяИзАдреснойКниги" сначала появилась в картах а пару месяцев спустя заработала и в навигаторе.
Открою секрет - там еще и Я.Музыка в оба приложения встроена, опять же интегрированная с Алисой. Можете при открытом навигаторе/картах попросить поставить волну/плейлист/что-хотите и они включатся внутри приложения а не в отдельной я.музыке.
К примеру в навигаторе есть голосовые команды для Алисы: "Включи звук навигатора", "Выключи звук навигатора", "Выключи все звуки навигатора". По которым соответственно переключается уровень голосовых подсказок - все, только важные (камеры, скорость и т.д.), без звука. А в картах такого нет.
Еще в навигаторе как-то явно по другому параметры перестроения маршрутов заданы. Он гораздо быстрее перестраивает маршруты в зависимости от пробок. Может это банальный таймаут, может какие-то свои оффлайновые пересчеты. Но совершенно точно если выезжаешь в начале часа-пик навигатор будет очень быстро перестраивать маршруты в зависимости от пробок.
И еще очень много нюансов. В том числе и визуальных. В навигаторе информационные баннеры (полоса перед перекрестками, дистанция до следующего поворота и т.д.) компактнее и меньше закрывает маршрут.
В общем один движок это совсем не то же что и "копия". Куча игр на одном unity но ведь не скажешь что они одно и тоже.
Почему? Режим FreeForm есть кажется с пятой версии андроида. Только не сильно популятрно. Маленькие окошечки на и без того маленьких экранчиках очень мало пригодны.
Если дискуссия ушла далеко от темы и вроде Вы не против ответов на вопросы о личных предпочтениях можно почти личный вопрос :)
Я писал конечно об этом и в поддержку и в том самом Доставили вопрос задавал. Почему нельзя дать возможность выключить подсказки о полосе в автонавигаторе. Да понимаю важная штука когда что-то ищешь в незнакомом месте. Наверняка это было очень непросто сделать, скорей всего кто-то заслуженно этим может гордиться. Но как всегда есть присловутое Но. К примеру я и мой круг знакомых процентов 90 времени пользуемся машиной по одним и тем же маршрутам. Работа - Дом - Дача - Что-то еще. Факт в том что дорога известна до каждой ямки. Ну может раз в месяц максимум нужно поехать в какое-то новое место. Все нужно это только сведения о пробках. И вот для таких пользователей эти черные баннеры на карте вылазят в виде этих черных ... ну вообщем у меня очень плохая ассоциация :) И ладно я уже почти смерился но тут раз и добавили они стали вылазить уже как две ... :)
Ну разве так сложно добавить маленький свитчер - не показывать ... на карте :)
Я не говорю хорошая это или плохая вещь. Это каждый решает сам для себя. Я лишь говорю о том что постоянный геотрекинг из фоновой службы это очень и очень подходит под определение "угрозы". И трекинг этот явно не обезличенный, как то ведь идентифицируется пользователи, тем более их можно выбрать прям по своим контактам, т.е. по номеру телефона.
Но 2ГИС будет ими пользоваться. Они ведь случайно в карты встроили постоянный фоновый геотрекер и назвали это Друзья на карте. И это не скрывается они подробно описывают в своем блоге "Доставили" подробности что этот трекер работает всегда как фоновая служба.
Заметьте ругается только на вашу последнюю предновогоднюю версию. Если удалить и поставить версию помладше претензий нет. А что у вас появилось перед новым годом - друзья на карте. Со всеми другими правами сберовские приложения живут спокойно, sms получают (бизнис клиент), обновления ставят.
И знаете... Именно из-за вашей этой новики, которую никак нельзя отключить, только якобы "сказать кому можно меня видеть", лично я согласился с гуглом и таки удалил приложения. Хотя честно скажу оно мне нравилось больше конкурентов.
Это может быть полезно только для достаточно узкого класса задач вроде вычисления доли строки относительно итога.
Долю очень просто вычислить прямо на сервере:
, sum(count(*)) over () / (100 * sum(count(*)) over (partition by dt)) as [ПроцентДняОтПериода]
, sum(count(*)) over () / (100 * sum(count(*)) over (partition by dt, dh)) as [ПроцентЧасаОтПериода]
, sum(count(*)) over (partition by dе) / (100 * sum(count(*)) over (partition by dt, dh)) as [ПроцентЧасаОтДня]
И это будет очень дешево. Потому что каждая из оконных функций кэширует результат от параметров. Т.е. сколько бы вы не написали расчетов sum(count(*)) over () - расчет будет один раз, а sum(count(*)) over (partition by dt) выполнится по одному разу для каждого дня.
То есть подобные "преимущества" никак не оправдывают ни лишней работы СУБД, ни раздувания объема resultset, ни избыточных затрат на его разбор на стороне БЛ.
Технически для задач из статьи вообще не нужна общая сумма, ее всегда можно получить в конце обхода результат суммируя к один из агрегатов.
Но и в добавлении колонки я не вижу страшного. С одной стороны мы получили новую колонку в 4 байта (тип int) => 720 строк * 4 = 2.8 Кб. С другой стороны исчезли строки группировки (50 штук). Обходов стало поменьше.
Потому что нет никакого смысла счетчик не передавать. Вы получаете некий resultSet в котором так же строго типизированные колонки и на счетчик отведено ровно столько байт сколько нужно для хранения типа. И даже если в колонке null представление этого null-а уложится в то-же самое поле, а остаток дополнится нулями. Но позже в слое представления не нужно делать лишнее действие в виде чтения первой строки и извлечения из него значения счетчитка в локальную переменную. Достаточно просто идти вперед и счетчик всегда под рукой. Но самый большой профит в том что даже не меняя запрос слой предствления может взять ваш результат и без проблем пересортировать его к примеру по время - дата. И опять спокойно пройти один раз имея все данные для отражения в перевернутом виде.
Основная идея в принципе работы оконных функций. Обратите внимание - самые тяжелые операции вашего оптимального плана CTE +UNION ALL и варианта с оконными функциями технически одинаковые. Но возможно пока вы делали тесты ваш сервер решил кэшировать вашу таблицу. Потому на самом деле с вариантом холодного сервера время запросов практически будет одинаковое. Но главное в самих оконных функциях - они очень легко разносятся по разным процессорам. Не могу сказать как сделает PostgreSQL, но MSSQL однозначно раскидает каждое окно по разным процессорам. Ведь тут не нужно беспокоиться о блокировке или изменении данных.
По поводу дублирования счетчиков. Конечно это не относится к статье, но считаю нужно упомянуть. Это не дублирование. Это очень дешевое выполнение той работы которую позже нужно было бы сделать слою представления. Фактически это ничего не стоит, так как окна не считаются для каждой строки, если у вас есть sum(..) over () - она посчитается один раз и будет возвращать кэшированный результат для каждой строки. Но позже построителю предствления нужно будет совершить один единственный прямой обход запроса и на каждом шаге у него будут все необходимые данные для расчета цвета, итога строки или итога колонки.
Нет. Вам не нужно ничего кроме ваше первого запроса с группировкой!
Оконные функции прекрасно работают с агрегаторами группировок. Не очень красивый синтаксис, поэтому я предпочитаю сами группировки выносить в CTE, но оптимизаторы достаточно умные чтобы развернуть CTE в один запрос. В ваш первый запрос с группировкой просто нужно добавить колонки, опять же в диалекте T-SQL:
...
, sum(count(*)) over () as [ОбщийИтог]
, sum(count(*)) over (partition by dt) as [ИтогДня]
, sum(count(*)) over (partition by dt, hr) as [ИтогЧаса]
, sum(count(*)) over (partition by hr) as [ИтогЧасов]
Абсолютно ничего удобного в этом нет. Чтобы сесть в машину с "обычной" дверью ее можно приоткрыть на 45 градусов перенести вес на одну ногу и аккуратно плюхнуть пятую точку на кресло. Эту дверь вы будете открыть почти на 90 градусов и корячиться крутиться каждый раз. Потому что посадка выполняться лицом к багажнику а нужно развернуться к нему опять же той самой пятой точкой, чтобы приземлить ее на сидение. Про выход то же самое.
Такое ощущение что этот Атом специально делают как сборище всех возможных антипаттернов комфорта и удобства.
"Автоматические распашные" это вообще жуткий трэш на придомовых парковках, где все жмутся и в машину по утрам нужно просачиваться чтобы не поцарапать соседа.
Наверно там где микроядро это про KasperskyOS а там где говорится про десятки репозиториев и 15 ГБ это то что потребуется выкачать для сборки Flutter-а.
А Гамлета между прочим писали без лэп- деск- серв- и вообще без всякой цифро-. Просто в вашем окружении больше причастных к ИТ технологиям и Вам кажется что это прям весь мир. На самом деле мир он куда больше и технологии далеко не решающее в нем. Политики слишком далекие от технологий обходятся без всяких гаджетов и прочего легко играя Вашей и моей жизнью. Рушат страны, сливают экономики, перемещают миллионы людей и все это без больших мониторов и удобных клавиатур. Так что наличие каких то специфичных знаний, в данном случае знание заклятий цифровых приборов, не говорит ни о какой исключительности из "миллиарда обезъянок", это всего лишь знания какой-то конкретной области ни больше ни меньше. Любая из "обезъянок" может быть гораздо гениальней в какой-то другой области или просто гораздо умнее в целом.
Как долго они говорили гордое "Фи...". И вот пожалуйста - мутировали в 1С-ников :)
Немного непонятна стратегия с клипами. Вот на десктопе им самое место, но нету. Хотя в браузерной версии пожалуйста. А на мобилках с малюсеньким экранчиком они есть, но как то совсем неуместны.
3D навигаторы не удобная штука. Есть наглядный пример - Navitel с их 3D картой.
Абсолютно неудобно, не видно маршрута за поворотом, если на углу стоит здание, Да и в целом слишком замусоренная картинка, боковым зрением совершенно нечитаема..
Раньше в настройках было включать музыку в отдельном приложении или внутри навигатора/карт. Сейчас музыка включается только внутри навигатора. Есть миниплеер с лайками, есть большой раздел с почти всем что есть в я.музыке.
Конечно не правильно.
Алиса изначально встроена как в навигатор так и в карты. Но работает в них по разному. Функции Алисы мигрируют в обе стороны кстати. К примеру поддержка адресной книги - команда "позвони ИмяИзАдреснойКниги" сначала появилась в картах а пару месяцев спустя заработала и в навигаторе.
Открою секрет - там еще и Я.Музыка в оба приложения встроена, опять же интегрированная с Алисой. Можете при открытом навигаторе/картах попросить поставить волну/плейлист/что-хотите и они включатся внутри приложения а не в отдельной я.музыке.
Потому что они не абсолютно одинаковые.
К примеру в навигаторе есть голосовые команды для Алисы: "Включи звук навигатора", "Выключи звук навигатора", "Выключи все звуки навигатора". По которым соответственно переключается уровень голосовых подсказок - все, только важные (камеры, скорость и т.д.), без звука. А в картах такого нет.
Еще в навигаторе как-то явно по другому параметры перестроения маршрутов заданы. Он гораздо быстрее перестраивает маршруты в зависимости от пробок. Может это банальный таймаут, может какие-то свои оффлайновые пересчеты. Но совершенно точно если выезжаешь в начале часа-пик навигатор будет очень быстро перестраивать маршруты в зависимости от пробок.
И еще очень много нюансов. В том числе и визуальных. В навигаторе информационные баннеры (полоса перед перекрестками, дистанция до следующего поворота и т.д.) компактнее и меньше закрывает маршрут.
В общем один движок это совсем не то же что и "копия". Куча игр на одном unity но ведь не скажешь что они одно и тоже.
Если действительно интересно результат двух команд в терминале, без открытия редактора:
flutter create . --org ru.sserjirk --project-name testnative --platforms windows
flutter build windows
Можете взять тут: https://disk.yandex.ru/d/eDCdcl-P4UTIHw
Если говорить о Flutter то разница с первых строк:
"... . В памяти занимает на Win 11 200 Мб. Кто-то считает, что это много. Покажите меньше. .."
У Flutter вместе с движком демка собирается в 23Мб, в памяти занимает 30Мб.
Старая добрая JavaFX (OpenJFX) собранная через GraalVM в нативный exe получается 25 Мб, в памяти 28.
Добавить видео в обе эти вещи легко довесив 10-15 МБ обвязок над облегченным FFmpeg.
Почему? Режим FreeForm есть кажется с пятой версии андроида. Только не сильно популятрно. Маленькие окошечки на и без того маленьких экранчиках очень мало пригодны.
Если дискуссия ушла далеко от темы и вроде Вы не против ответов на вопросы о личных предпочтениях можно почти личный вопрос :)
Я писал конечно об этом и в поддержку и в том самом Доставили вопрос задавал. Почему нельзя дать возможность выключить подсказки о полосе в автонавигаторе. Да понимаю важная штука когда что-то ищешь в незнакомом месте. Наверняка это было очень непросто сделать, скорей всего кто-то заслуженно этим может гордиться. Но как всегда есть присловутое Но. К примеру я и мой круг знакомых процентов 90 времени пользуемся машиной по одним и тем же маршрутам. Работа - Дом - Дача - Что-то еще. Факт в том что дорога известна до каждой ямки. Ну может раз в месяц максимум нужно поехать в какое-то новое место. Все нужно это только сведения о пробках. И вот для таких пользователей эти черные баннеры на карте вылазят в виде этих черных ... ну вообщем у меня очень плохая ассоциация :) И ладно я уже почти смерился но тут раз и добавили они стали вылазить уже как две ... :)
Ну разве так сложно добавить маленький свитчер - не показывать ... на карте :)
Я не говорю хорошая это или плохая вещь. Это каждый решает сам для себя. Я лишь говорю о том что постоянный геотрекинг из фоновой службы это очень и очень подходит под определение "угрозы". И трекинг этот явно не обезличенный, как то ведь идентифицируется пользователи, тем более их можно выбрать прям по своим контактам, т.е. по номеру телефона.
Но 2ГИС будет ими пользоваться. Они ведь случайно в карты встроили постоянный фоновый геотрекер и назвали это Друзья на карте. И это не скрывается они подробно описывают в своем блоге "Доставили" подробности что этот трекер работает всегда как фоновая служба.
Заметьте ругается только на вашу последнюю предновогоднюю версию. Если удалить и поставить версию помладше претензий нет. А что у вас появилось перед новым годом - друзья на карте. Со всеми другими правами сберовские приложения живут спокойно, sms получают (бизнис клиент), обновления ставят.
И знаете... Именно из-за вашей этой новики, которую никак нельзя отключить, только якобы "сказать кому можно меня видеть", лично я согласился с гуглом и таки удалил приложения. Хотя честно скажу оно мне нравилось больше конкурентов.
Долю очень просто вычислить прямо на сервере:
, sum(count(*)) over () / (100 * sum(count(*)) over (partition by dt)) as [ПроцентДняОтПериода]
, sum(count(*)) over () / (100 * sum(count(*)) over (partition by dt, dh)) as [ПроцентЧасаОтПериода]
, sum(count(*)) over (partition by dе) / (100 * sum(count(*)) over (partition by dt, dh)) as [ПроцентЧасаОтДня]
И это будет очень дешево. Потому что каждая из оконных функций кэширует результат от параметров. Т.е. сколько бы вы не написали расчетов sum(count(*)) over () - расчет будет один раз, а sum(count(*)) over (partition by dt) выполнится по одному разу для каждого дня.
Технически для задач из статьи вообще не нужна общая сумма, ее всегда можно получить в конце обхода результат суммируя к один из агрегатов.
Но и в добавлении колонки я не вижу страшного. С одной стороны мы получили новую колонку в 4 байта (тип int) => 720 строк * 4 = 2.8 Кб. С другой стороны исчезли строки группировки (50 штук). Обходов стало поменьше.
Потому что нет никакого смысла счетчик не передавать. Вы получаете некий resultSet в котором так же строго типизированные колонки и на счетчик отведено ровно столько байт сколько нужно для хранения типа. И даже если в колонке null представление этого null-а уложится в то-же самое поле, а остаток дополнится нулями. Но позже в слое представления не нужно делать лишнее действие в виде чтения первой строки и извлечения из него значения счетчитка в локальную переменную. Достаточно просто идти вперед и счетчик всегда под рукой. Но самый большой профит в том что даже не меняя запрос слой предствления может взять ваш результат и без проблем пересортировать его к примеру по время - дата. И опять спокойно пройти один раз имея все данные для отражения в перевернутом виде.
Основная идея в принципе работы оконных функций. Обратите внимание - самые тяжелые операции вашего оптимального плана CTE +
UNION ALL
и варианта с оконными функциями технически одинаковые. Но возможно пока вы делали тесты ваш сервер решил кэшировать вашу таблицу. Потому на самом деле с вариантом холодного сервера время запросов практически будет одинаковое. Но главное в самих оконных функциях - они очень легко разносятся по разным процессорам. Не могу сказать как сделает PostgreSQL, но MSSQL однозначно раскидает каждое окно по разным процессорам. Ведь тут не нужно беспокоиться о блокировке или изменении данных.По поводу дублирования счетчиков. Конечно это не относится к статье, но считаю нужно упомянуть. Это не дублирование. Это очень дешевое выполнение той работы которую позже нужно было бы сделать слою представления. Фактически это ничего не стоит, так как окна не считаются для каждой строки, если у вас есть sum(..) over () - она посчитается один раз и будет возвращать кэшированный результат для каждой строки. Но позже построителю предствления нужно будет совершить один единственный прямой обход запроса и на каждом шаге у него будут все необходимые данные для расчета цвета, итога строки или итога колонки.
Нет. Вам не нужно ничего кроме ваше первого запроса с группировкой!
Оконные функции прекрасно работают с агрегаторами группировок. Не очень красивый синтаксис, поэтому я предпочитаю сами группировки выносить в CTE, но оптимизаторы достаточно умные чтобы развернуть CTE в один запрос. В ваш первый запрос с группировкой просто нужно добавить колонки, опять же в диалекте T-SQL:
...
, sum(count(*)) over () as [ОбщийИтог]
, sum(count(*)) over (partition by dt) as [ИтогДня]
, sum(count(*)) over (partition by dt, hr) as [ИтогЧаса]
, sum(count(*)) over (partition by hr) as [ИтогЧасов]
from ...