Pull to refresh
23
0
Dmitry @jonie

User

Send message

Первый вариант – да, это то, что я предлагаю. Только в рамках модели MVVM получается, что UI-логика утекает из ViewModel во View.

потому что так делать не надо и вы заблуждаетесь.

Второй вариант – тогда ViewModel начинает подозрительно напоминать Presenter из MVP.

ничуть. в MVP у вас будет код вида "loginBtn.Enabled = false; if(dlgMan.Ask()) {....}" - т.е. "P" будет взывать методы непосредственно экземпляров "V" (в данном случае - по ссылке loginBtn), тогда как в MVVM в VM будет код: "this.loginBtnEnabled = false; if(dlgMan.Ask()) {....}" - т.е. VM лишь ставит своё собственное свойство (loginBtnEnabled), а уже "V" должно быть подписано на изменение этого свойства (свойство при этом в общем случае должно уметь "сообщать" подписчикам "VM" о том что изменения были, например код на C# обычно выглядит примерно так (setter) : "set { if(this._loginBtnEnabled != value) { this._loginBtnEnabled = value; this.RaisePropertyChanged("loginBtnEnabled") }".

ну все методы типа "dlgMan.ShowConfirmation()" не блокирующие (не зря завезли async-await).

а что касается "View получает информацию isDialogVisible и рендерит диалог", то обыкновенно диалоги (а точнее место под их размещение в разметке если угодно), блокирующие весь "ввод" (модалка), заранее существуют в корневом view по-типу "портала, где этот диалог отрисовывается", собственно с этим и взаимодействует dlgMan - он-то знает как сделать так, чтобы диалог "отобразился".

Диалоги они в целом не самый хороший пример и всегда с "хаками" делались (например на angular - там нужно указать portal где будет жить динамическая разметка диалогов). А если без хаков, и сам диалог надо рисовать в том же вью - то, конечно, там вью менять надо - ибо откуда б взяться "разметке".

да нет изменений в view когда вы хотите вместо "по нажатию кнопки сделать навигацию" сделать "по нажатию отобразить диалог и если юзер согласен сделать навигацию и погасить сессию". Нету этих изменений. Притом неважно сколько там этих "кнопок" на вью было (а их может быть чуток побольше чем одна)...

Что делать при нажатии на кнопку – заканчивать сессию сразу или показать диалог – это логика UI, не так ли?

не так.

Если мы договариваемся, что вся логика UI содержится во ViewModel, то, меняя эту логику, нам надо изменить ViewModel.

не придётся. (далее код условен): MVVM пришёл (ну или точнее "популарялизивался") с C# (WPF) в общем случае в vm передаётся некий IDialogManager (dlgMan), у которого vm в callback (ICommand если речь про WPF) делается: 1) ставится проперти "IsLogoutButtonEnabled=false" 2) делается if(dlgMan.ShowConfirmation()) { sessionMan.DoBlabla(); navigationMan.DoBlabla() ... }

Да не было там никаких усилий. Две переговорки и три дня организации - вот и и все усилия. По-деньгам я вам ответил сколько это будет стоит сейчас +/- с прогнозируемым результатом и бюджетом. Воспроизводить-то зачем? Задача разовая.

"Настоящий программист на UNIX это тот, кто два дня пишет скрипт, что делает работу, которую можно было сделать руками за 3 часа всего лишь за 1 секунду".

конечно - всех загоняют на территорию режимную - обычно не проблема же обеспечить 20 мест рабочих на территории работодателя временных. И конфиденциальность там точно такая же как и в целом в учреждении.

400к документов и такие приседания для одноразовой работы? Я в своё время решал похожую задачу (только документов было побольше) - так просто нарисовал мини-приложение что представила UI для оператора вида "обработка такой-то персоны - справа картинка документа и пара кнопок "паспорт-заявление-анкета.." и, наняв 20 человек на месяц (студенты) просто классифицировал все документы "человеческими руками" (+еще и кросс-проверку организовали). Итоговый бюджет по текущим меркам выйдёт на ваши 400к документов ну, тысяч этак в 600 (руб)/месяц (а-то и дешевле). А ваши текущие приседания уже стоили больше, а результата "всё нет"...

т.е. вы по-сути изобрели BPMN (ну или иной общеизвестный) язык описания процессов?

И наверное любое взаимодействие систем можно описать в терминах конечных автоматов.

А как реализуются требованания законодательства определённых стран касательно обозначения всяких иноагентов/террористов/блокирования контента и т.п.? Например: я смотрю через прокси (притом проксирую только этот сайт) какую-то картинку с злобным буратиной* (*запрещён на территории РФ), мой браузер находится физически в РФ, и "можно взять исходную картинку, отправить в оригинальном виде из Браузера к нам на сервер" - т.о. картинка окажется в РФ и будет переведена и отдана уже российской компанией и по территории страны со всемы вытекающими ? А-то сесть знаете ли из-за кеша браузера / кеша яндекс-сервера не хочется сильно-то...

да бросьте - были же уже прецеденты типа добавления капчи на ГАС "Выборы" или "ждите 15 минут прежде чем войти в госуслуги".

на самом деле не "можно", а "нужно" ИМХО, т.к. это в разы быстрее чем качать весь файл если он не менялся и не создаёт паразитной долго играющей нагрузки. Я б попросил вас доработать ваш скрипт - сейчас понабегут какие-нибудь настоящие программисты, накопипастят и выгрузку вовсе прикроют каким-нибудь 2FA

нет, не HEAD. Добавьте -v к curl-у и убедитесь сами

    new_version=$(curl -sIL -XGET "${DB_FILE_URL}" | tac | grep -im 1 'http/' -B 100 | grep -ie "etag" -e "last-modified" -e "content-length" | tr -d '\r' | tr '\n' '|')

Как-то так можно не выкачивая всё получить заголовки (правда у меня были баги вида файл менялся, а last-modified нет, посему используется сочетание разных заголовков.

На данный момент Smartcat не поддерживает plurals из po файлов, что крайне грусто. Также грусто там работается с плейсхолдерами — нет возможности видеть «исходный текст» (без радактора что закрывает плейсхолдеры красивыми квадратами)…
нет никакой нужды «качать csv (и хранить локально)» чтобы его потом парсить (каждый раз при запуске). Вы можете получить поток gz, «на лету» получить поток csv из него, из него получить поток значений и получить на выходе engine-а «базу данных» в том формате, что понимает ваш engine + сохранить (например рядом) файл «db.hash» (для загрузчика) с хешем от ETag поля (которое вы просмотрели) и (если нет), то от last-modified (притом не забыть про то, что нужен результат после всех редиректов). Кроме того, я бы не стал HEAD использовать — малоли как на него будет реагировать сервер «завтра» — одного GET достаточно (с логикой расчёта хеша после заголовков и, если надо, прочитывания данных «далее»). Притом закачку можно вести в «рядом лежащий» файл, и по-успеху уведомлять движок о смене файла-базы, после чего удалять устаревшую копию…

Короче тут ещё много «всего» оптимизировать.

На с++ это выглядит как-то так (выброшен мусор типа проверок на ошибкИ):
//input  - stream байт из HTTP ответа
        std::ifstream file(input, std::ios_base::in | std::ios_base::binary);
        boost::iostreams::filtering_streambuf<boost::iostreams::input> inZ;
        inZ.push(boost::iostreams::bzip2_decompressor());
        inZ.push(file);
        std::istream in(&inZ);
С collation-ами всё также плохо?
Ну я свою рабочую нагрузку знаю и мне он не нужен. Всё что жрёт больше (браузер например) упирается в лимиты и «oops вкладка не открывается». На серверах так и подавно не нужен почти никогда — нынче в моде убивать сервисы с превышением лимитов, чем позволять им деградировать соседей по кластеру (хоть и через swap).
ровно как и полное зависание всей системы (да да, даже переключение на tty1 не пашет) с 100% загрузкой ЖД при забивании оперативной памяти
ну тут-то всё понятно — память кончилась — начали свопиться (IO) и так по-кругу (если память нужна). Есть некоторые пути решения (как минимум те, что знаю я): 1) позвать OOM магическим нажатием клавиш, обрабатываемых ядром (SysRq) — но OOM не факт что будет удбивать то что вам надо. 2) использовать как стали делать в Fedora33 earlyroom демона 3) отключить нафиг свап и добавить памяти для удобства работы (если надо) 4) установить лимиты (cgroup) на память на группу/процессы.
У меня TLB не импортировался, а ошибки никакие не выводило
так может стОило разобраться сначала с этим? Ну там, например, уровень логирования msbuild-а крутануть и т.д. А не «забыть как страшный сон»…

«По поводу тысяч — неправда.», да бросьте, даже в MSDN есть раздел, включающий и IDispatch (хотя ничего в нём такого нет для тех, кто когда-нибудь писал ActiveX сервера, аналогично в ATL были примеры, и даже в поставку WinSDK всё это так или иначе входило, в примерах).

Мне лично лень ворошить относительный труп (ActiveX и т.п., плюс MS тоже не рекомендует), да и вам не советую — уж сложностей в IPC с современными фреймворками типа grpc нет же, так спросите себя «оно вам надо» идти этой дорогой?

Note: вы также можете не регить com сервер в реестре, возможно вписать его через manifest (SxS манифест) файл…
пример, чего? Как в C/C++ вызвать IDispatch метод? Так в гугле их тысячи. Как регить COM класс C# — так regasm и его друзья. Кроме того в C++ проще использовать #import (если речь про MS VC), нежели idl (который опять же — из regasm-а)… Короче почитайте книжку какую про COM и C# (второй версии — т.к. потом тема «угасла»), ну и в MSDN всё как бы было написано.

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity