Разделение кода MVC Приложения на DAL BLL . и…элементарное удобство работы

Классическое деление MVC приложения на DAL BLL UI предполагает что, DAL и BLL находятся в разных сборках и DAL ничего не должен знать о бизнес логике.

Прошу прощения за наивные вопросы. Но такое деление как мне кажется создает множество неудобств , а преимущества от него не очевидны.

Преимущества :

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

Недостатки:

  • Сложно организовать наследование.
  • Валидация бизнес логики через атрибуты средствами Entity невозможна.
  • Неоправданное усложнение кода.

Буду очень признательна если кто ни будь поможет решить ниже заданные вопросы просто и элегантно что бы и овцы были целы и волки сыты.

  • 1 ) Я хочу валидировать Entity через атрибуты в том числе кастомные которые затрагивают бизнес логику. Есть ли способ валидации без смешивания слоев?
  • 2 ) Я хочу иметь базовый класс BusinessObject обладающий общими для всех бизнес объектов свойствами и методами. На мой взгляд логично было бы что бы все Entity наследовались от него. Как правильно организовать код?
  • 3 ) По сути развитие предыдущего вопроса. Я имею общий базовый класс для некой категории бизнес объектов например BaseAgree. Он должен содержать базовую бизнес логику для всех договоров (в том числе базовые свойства). Вопрос тот же.

*Ps : по моему класс наследник DBContext и является классом ответственным за сохранение в базу. То что в ему передается именно бизнес объект не является нарушением каких то там правил.

Как не старалась не смогла заставить DBContext работать через интерфейсы то есть такая конструкция не заработала

DbSet SomeEntities { get; } *

Как правильно сконфигурировать nginx для ssl + passenger для работы с Rails 5.2.x на VDS?

Есть VDS на котором установлен сервер Ubuntu 18.04, сертификаты от Let’s Encript и всё это под управлением nginx. К VDS привязан один домен и пока не планируется привязка к нему иных доменов. Есть несколько поддоменов, задачей одного из них является работа в качестве тестовой площадки для Rails-приложений. Пока для одного.

Вот конфигурация nginx для основного домена, который пока представлен временной заглушкой. В дальнейшем там будет жить небольшой сайт на Nuxt.js:

server {   server_name example.com www.example.com;   root /var/www/example.com/html;   index index.html index.htm index.nginx-debian.html;    location / {     try_files $  uri $  uri/ =404;   }     listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot   listen 443 ssl http2; # managed by Certbot    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot   include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }  server {   if ($  host = www.example.com) {     return 301 https://$  host$  request_uri;   } # managed by Certbot    if ($  host = example.com) {     return 301 https://$  host$  request_uri;   } # managed by Certbot    listen 80;   listen [::]:80;    server_name example.com www.example.com;   return 404; # managed by Certbot } 

Это конфигурация nginx для тестового поддомена, который является Rails-приложением:

server {   server_name dev.example.com;   root /home/yart/www/dev.example.com/public;    listen [::]:443 ssl http2; # managed by Certbot   listen 443 ssl http2; # managed by Certbot    access_log /var/log/nginx/deploy.access.log;   error_log /var/log/nginx/deploy.error.log;    passenger_enabled on;   rails_env production;    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot   include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }  server {   if ($  host = dev.example.com) {     return 301 https://$  host$  request_uri;   } # managed by Certbot    listen 80;   listen [::]:80;    server_name dev.example.com;   return 404; # managed by Certbot } 
  1. Как мне добавить для тестового поддомена обработку ошибок 40x, 50x с учётом того, что там работает passendger?
  2. В дальнейшем планирую селить тестовые веб-приложения (Rails, Nuxt) в свои отдельные папки внутри тестового поддомена. Как мне учесть этот момент в данной кофигурации?

Гугл/яндекс умею, пользуюсь иногда, но там не нашел ответов на свои вопросы, поэтому пишу их здесь. Находил различные варианты конфигов для nginx, но все они отказывались работать с 404 ошибкой, например. Сейчас я вместо 404 страницы получаю вот такой ответ на некорректный запрос:

image

access.log, между тем, исправно докладывает о том, что GET-запрос вернул 404 ошибку. То есть, сама ошибка прилетает корректно. Весь вопрос в том, как правильно её отловить средствами nginx?

Неправильная работы при больших значениях

Не так давно свела судьба с Ассемблером, требуется написать программу по следующему заданию: Отсортировать СТОЛБЦЫ матрицы в порядке возрастания из сумм, а так же вывести сам вектор сумм. Реализовать это нужно было отдельной функцией вызываемой в коде С++.

    #include "pch.h" #include <iostream> #include <Windows.h> #include <iomanip>   using namespace std; extern  "C"  void AsmFUNC(int *, int *, int, int);  void printMatrix(int *mass, int n, int m) {     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             cout << setw(4) << mass[i*m + j];         }         cout << endl;         }     }   int main() {     short n, m;     SetConsoleCP(1251);     SetConsoleOutputCP(1251);     do {         cin.clear();         system("cls");         cout << "Введите количество строк(<100)> "; cin >> n;     } while ((n >= 100)||(n<1));     do {         cin.clear();         system("cls");         cout << "Введите количество столбцов(<100)> "; cin >> m;     } while ((m >= 100) || (m < 1));     int *mass = new int[n*m];     int *sum = new int[m];     cout << "Ввод элементов массива:" << endl;     for (int i = 0; i < n; i++)     {         for (int j = 0; j < m; j++)         {             cout << "Элемент[" << i + 1 << "]"<<"["<<j+1<<"]=";             cin >> mass[i*m+j];         }     }     cout << endl;     cout << "Массив до обработки" << endl;     printMatrix(mass, n, m);     AsmFUNC(mass, sum, n, m);     cout << "Массив после обработки" << endl;     printMatrix(mass, n, m);     cout << "Массив сумм" << endl;     for (int i = 0; i < m; i++) cout << " " << sum[i];     cout << endl;     system("pause"); } 

ASM:

.586 .model flat, C .data lenstr dd 0 i dd 0 j dd 0 temp dd 0 temp2 dd 0 .data? .code   AsmFUNC    PROC mass:dword,sum:dword,n:dword,m:dword     mov edi,mass      mov eax,m      shl eax,2      mov lenstr,eax      mov ecx,m      m1:      push ecx      push sum      mov ecx,n      xor esi,esi      xor eax,eax      m2:      add eax,[edi+esi]      add esi,lenstr      loop m2      pop sum      mov ebx,sum      mov [ebx],eax      add ebx,4      mov sum,ebx      add edi,4      inc i      pop ecx      loop m1      mov eax,4      cdq      mov ebx,m      mul ebx      mov ecx,sum      sub ecx,eax      mov ebx,ecx      mov ecx,m      mov i,0      c1:      mov eax,i      mov edx,[ebx+eax*4]      mov temp,edx      push ecx      mov ecx,m      sub ecx,i      mov j,eax      c2:      mov edi,mass      mov eax,j      mov edx,[ebx+eax*4]      cmp temp,edx      jg c3      jmp c3_1      c3:      mov edx,[ebx+eax*4]      push edx      mov edx,temp      mov [ebx+eax*4],edx      pop edx      mov eax,i      mov [ebx+eax*4],edx      push ecx      mov ecx,n      c4:      mov eax,j      mov edx,[edi+eax*4]      mov eax,i      mov esi,[edi+eax*4]      mov [edi+eax*4],edx      mov eax,j      mov [edi+eax*4],esi      add edi,lenstr      loop c4      pop ecx      c3_1:      inc j      loop c2      inc i      pop ecx      dec ecx      jnz c1       ret AsmFUNC    ENDP end 

При вводе трехзначных значений и матрице больше размерности 3х3, получается по сумме четырехзначные числа. Все, что я смог выяснить, это то, что именно увеличение значений элементов матрицы приводит к неправильной работе. На однозначных и двухзначных, что смог, проверил и все работало, так же и с отрицательными проблем не было. Пробовал менять типы, переписывать некоторые команды пересылки другим образом, делал тестовые “посылки” четырехзначных значений по адресу – все передавалось правильно. Прошу помощи

Программа на построение и работы с графиком на C++

Дан текстовый файл, из которого надо взять переменные и записать их в массив, затем нужно построить график по точкам x – номер массива, y – значение массива. В этом программе должна быть возможность выбрать две границы оси (x) и рассчитывать некоторые параметры по ряду чисел массива в этом промежутке, например, выделяю выделяю промежуток, нажимаю условно на кнопку ,,среднеквадратическое значение,, и программа выводит среднеквадратическое значение этого промежутка массива.

Sqlalchemy: передать результат выборки в js для дальнейшей работы с html страницей

Может кто подкинет идей как это сделать или может у кого то есть решение. Мне нужно изменить данные в таблице при нажатии на элемент из списка все это из html.

список:

        <select name="group_select" size="15" multiple="multiple" >             {% for group in groups %}             <option style="width: 120px;" onclick="func2('{{result}}')">{{group.group_name}}</option>             {% endfor %}         </select> 

список:

        <select name="group_select" size="15" multiple="multiple" >             {% for group in groups %}             <option style="width: 120px;" onclick="func2('{{result}}')">{{group.group_name}}</option>             {% endfor %}         </select> 

Обработчик страницы pytho:

@app.route('/') @app.route('/index') def index():     user = g.user     #Выборка     result = db.session.query(Schedule, Groups, Teachers, Lessons).filter(Schedule.group_id == Groups.id,                                                                           Schedule.teacher_id == Teachers.id,                                                                           Schedule.lesson_id == Lessons.id).all()     teachers = Teachers.query.all()     groups = Groups.query.all()      days_enum = {'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5}     r = db.session.query(Schedule).all()      return render_template("index.html", title="Главная", user=user, form=FlaskForm(),                            teachers=teachers, groups=groups, days_enum=days_enum, result=result) 

В вэбе и питоне я совсем новичок. У меня появилась мысль что можно сделать примерно так: обрабатывать нажатия с помощью js (onClick) для каждого элемента списка, думал что получится просто передать result в параметр функции js, но как оказалось мой result это вовсе не JSON и js не понимает того что я пытаюсь ему передать. Вот что мне показуется в консоле браузера: Uncaught SyntaxError: missing ) after argument list. А вот код на который он ругается:

<option style="width: 120px;"         onclick="func2('[(&lt;Schedule 1&gt;, &lt;Group '1ПКС-15'&gt;, &lt;Teacher 'Балабат А.В.'&gt;, &lt;Lesson 'Правовое обеспечение ПД'&gt;), (&lt;Schedule 2&gt;, &lt;Group '1ПКС-15'&gt;, &lt;Teacher 'Зинченко К.Л.'&gt;, &lt;Lesson 'Философия'&gt;), (&lt;Schedule 3&gt;, &lt;Group '1ПКС-15'&gt;, &lt;Teacher 'Зинченко К.Л.'&gt;, &lt;Lesson 'Философия'&gt;), (&lt;Schedule 4&gt;, &lt;Group '1ПКС-15'&gt;, &lt;Teacher 'Балабат А.В.'&gt;, &lt;Lesson 'Философия'&gt;), (&lt;Schedule 5&gt;, &lt;Group '1ПКС-15'&gt;, &lt;Teacher 'Зинченко К.Л.'&gt;, &lt;Lesson 'Правовое обеспечение ПД'&gt;)]')">     1ПКС-15 </option> 

Как в языке Си вывести результат работы функции в терминал?

Есть функция на языке Си, например такая

int id(int x){ return x; }

Как можно вызвать ее с печатью результата в терминал? В JS можно сделать так

console.log(id(1)); 

Как такое сделать в Си?

Update: Благодаря пользователю AnT кое-что получилось. С помощью такого кода удалось вывести результат работы функции в терминал:

#include <stdio.h>  int id(int x){   return x; }  int main (void) {    int x = 1;    int (*operation)(int x);   int result;    operation = id;   result = operation(x);    printf("result = %d \n", result);    return 0; } 

Но мне кажется такой код избыточным. Может быть можно сделать проще?

Задача на время работы, ошибка в коде

Условие задачи следующее: В фирме решили учесть рабочее время своих сотрудников. Для этого по каждому сотруднику собирается информацию, показывающая время его прихода и ухода с работы. Напишите программу, получающую на вход строчку, состоящую из записей вида ВРЕМЯ_ПРИХОДА-ВРЕМЯ_УХОДА, разделённых пробелами, и возвращающую три числа: число дней, которое работник выходил на работу, а также число часов и минут, которое он провёл в офисе. Время прихода и ухода задано в формате h:m, 0 ≤ h < 24, 0 ≤ m < 60, уход всегда не раньше прихода.

Пример ввода: 7:45-14:30 8:00-12:18

Вывод: 2 11 3

Мой код, приведённый ниже (заранее прошу прощения, я только начал изучать питон) выдаёт ошибку на 5ом тесте, не подскажете в чём проблема, пожалуйста?

string = input()  help_string = string.split()  days = len(help_string) hrs = 0 mins = 0  for i in range(days): help_1 = help_string[i].index(':') start_hrs = int(help_string[i][0 : help_1]) ##print(start_hrs) help_2 = help_string[i][help_1 : help_1 + 4].index('-') + help_1 start_mins = int(help_string[i][help_1 + 1 : help_2]) ##print(start_mins) help_1 = help_string[i][help_2 : help_2 + 4].index(':') + help_2 finish_hrs = int(help_string[i][help_2 + 1: help_1]) ##print(finish_hrs) finish_mins = int(help_string[i][help_1 + 1 : ]) ##print(finish_mins) hrs += finish_hrs - start_hrs - 1 mins += finish_mins + (60 - start_mins)  if mins > 60: hrs += mins // 60 mins -= (mins // 60) * 60  if hrs > 24: days += hrs // 24 hrs -= (hrs // 24) * 24  print(days, hrs, mins) 

Разная скорость работы python скрипта на идентичных серверах

Столкнулся с проблемой: есть маленький скрипт python (по переводу PDF в JPG). На вход подается PDF файл, на выходе из него формируются JPG изображения. Этот скрипт необходимо запускать на двух разных серверах. И на одном скорость исполнения скрипта в два раза быстрее, чем на втором (на одном real time 28s, sys time 0.7s, на втором real time 50s, sys time 1.7s), при попытке обработать один и тот же PDF. На более быстром сервере установлен CentOS Linux release 7.3.1611 (Core), на более медленном CentOS Linux release 7.6.1810 (Core). Интерпретатор на быстром Python 3.6.5, на медленном Python 3.6.6. Характеристики серверов идентичные. Объем свободной оперативной памяти тоже почти не отличается. Библиотеки используются только OS, SYS и Wand. Версии Wand идентичны 0.5.1. На что еще можно обратить внимание, чтобы понять причину?

Оптимизация работы с памятью в С++

решил написать свой .obj парсер, и столкнулся с небольшой проблемой…

...  std::vector<Math::Vector4<float>> vertices;  std::string line; std::ifstream inputStream(objFileName); while (std::getline(inputStream, line)) {     if (line.substr(0, 2) == "v ")     {         std::istringstream stream(line.substr(2));         float x, y, z;         stream >> x;         stream >> y;         stream >> z;         vertices.push_back({ x, y, z, 1.0f });     }      ... // Texture coordinate, normals e.t.c. } 

Вопрос заключается в следующем, можно ли как-то оптимизировать в данном случае работу с памятью, но так сказать не во вред удобности? При substr постоянно же будет аллоцироваться новая строка, да и при создании стрима. Хотелось бы как-то ограничиться парой выделений памяти и все на этом, а не фрагментировать кучу такими маленькими выделениями(вектор в дальнейшем будет заменен, так как тоже очень затратно будет происходить реаллоцирование памяти, пока просто хотел бы разобраться со строками)…