Страницы

Поиск по вопросам

пятница, 17 мая 2019 г.

Удаление из строки служебных частей речи(союзы, предлоги частицы, междометия и др.) Python 3

Усердно погуглив, на русском и английском, так и не смог найти библиотеку, которая позволяет удалить из строки абсолютно все служебные части речи, если кто знает подскажите ссылку, буду весьма благодарен.
Пример: Строка до применения: "Однако я так и не смог закончить" Строка после применения: "я не смог закончить"


Ответ

Если вы хотите удалить избранные части речи из строки, то можно части речи определить [к примеру] используя pymorphy2
import pymorphy2 # $ pip install pymorphy2
def pos(word, morth=pymorphy2.MorphAnalyzer()): "Return a likely part of speech for the *word*.""" return morth.parse(word)[0].tag.POS
words = "Однако я так и не смог закончить".split() functors_pos = {'INTJ', 'PRCL', 'CONJ', 'PREP'} # function words print(*[word for word in words if pos(word) not in functors_pos]) # -> я смог закончить
Часть речи по одному только слову может быть неверно определена. В частном случае, вы можете просто свой набор слов для удаления поддерживать.

Можно разобрать части речи, используя averaged_perceptron_tagger_ru из nltk
import nltk # $ pip install nltk # nltk.download('averaged_perceptron_tagger_ru')
words = nltk.word_tokenize("Однако я так и не смог закончить") functors_pos = {'CONJ', 'ADV-PRO', 'CONJ', 'PART'} # function words print(*[word for word, pos in nltk.pos_tag(words, lang='rus') if pos not in functors_pos]) # -> я смог закончить

Как превратить EditText в поток данных для RxJava2?

Начал постепенно переходить на реактивное программирование с замечательным фреймворком RxJava 2 и заинтересовал простейший пример создания потока в динамическом стиле. К сожалению, не считаю пример Observable.just(1,2,3) достаточно полным для себя, но вот уже несколько часов мучаю себя мыслью, как превратить изменения в EditText в поток данных? Если не сложно, опишите, пожалуйста, пример как сделать реальный Observable из TextWatcher, чтобы можно было на него подписаться и подписчик реагировал на изменения текста в EditText.


Ответ

Можно воспользоваться готовой библиотекой RxBinding. Также в ней можно посмотреть конкретную реализацию
Вообще для связки callback-методов с rx используется метод Observable.create, например:
Observable.create(emitter -> { TextWatcher watcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override public void afterTextChanged(Editable editable) { if (!emitter.isDisposed()) { //если еще не отписались emitter.onNext(editable.toString()); //отправляем текущее состояние } } }; emitter.setCancellable(() -> editText.removeTextChangedListener(watcher)); //удаляем листенер при отписке от observable editText.addTextChangedListener(watcher); });
Нужно не забыть подписаться, и самое главное, отписаться от такого источника данных, т.к. он держит ссылку на editText и может привести к утечке памяти.

Нахождение площади четырехугольников по координатам

На плоскости задано n точек с координатами x[n], y[n]. Нужно найти четверки точек, составляющие четырехугольник наибольшей площади.
Я написал такой код, который проверяет все возможные комбинации точек, считает площадь по формуле Гаусса и находит максимальную площадь. Естественно, точек должно быть не меньше 4.
for (i = 0; i < n - 3; i++) for (j = 1; j < n - 2; j++) for (k = 2; k < n - 1; k++) for (l = 3; l < n; l++) { s = fabs(((x[i] * y[j] - y[i] * x[j]) + (x[j] * y[k] - y[j] * x[k]) + (x[k] * y[l] - y[k] * x[l]) + (x[l] * y[i] - y[l] * x[i])) / 2.0); if (s > max) max = s; }
И всё бы хорошо, но площадь упорно равна нулю. Подскажите, что я делаю не так. Может проблема в последовательности ввода координат точек? Есть ли другой способ вычисления площади по координатам?


Ответ

Площадь по данным четырем точкам у вас вычисляется правильно.
Если уж вы взялись решать задачу полным перебором, то вам нужно перебирать все возможные комбинации из четырех различных точек во всех относительных порядках. То есть в самом "брутальном" варианте циклы должны выглядеть примерно так
for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (j != i) for (k = 0; k < n; k++) if (k != i && k != j) for (l = 0; l < n; l++) if (l != i && l != j && l != k) /* Проверяем площадь */;
У вас же наблюдается какое-то странное неоправданное исключение некоторых вариантов, но при этом нет никакой защиты от того, что одна и та же точка может быть взята несколько раз. Например, в вашем наборе ( i, j, k, l ) точка 0 может быть только первой, а точка n-1 - только последней. То есть вариант ( 0, j, n-1, l ) вы никогда не рассмотрите. На каком основании вы исключили такие четырехугольники из рассмотрения?
Из этого перебора, в целях оптимизации, имеет смысл исключить циклические сдвиги одного и того же набора, ибо они описывают один и тот же многоугольник. По той же причине также имеет смысл исключить зеркальные обращения одного и того же набора. Но не более того.
Для исключения из рассмотрения циклических сдвигов достаточно обеспечить, чтобы каждый рассматриваемый набор начинался со своего минимального элемента. Для исключения из рассмотрения зеркальных отражений достаточно обеспечить, чтобы в перестановке (j, k, l) содержалось не более одной инверсии
for (i = 0; i < n - 3; i++) for (j = i + 1; j < n; j++) for (k = i + 1; k < n; k++) if (k != j) for (l = i + 1; l < n; l++) if (l != j && l != k) if ((j > k) + (k > l) + (j > l) <= 1) /* Проверяем площадь */;
Например, на наборе из 5 точек такой перебор проверит только 15 вариантов, в то время как полный перебор проверит 5! = 120 вариантов. На наборе из 6 точек - 45 вместо 720.

Однако эта задача имеет и эффективное решение. Оно начинается из построения выпуклой оболочки для вашего набора точек.
Если выпуклая оболочка имеет четыре или более вершин, то точки, не лежащие на выпуклой оболочке исключаются из дальнейшего рассмотрения. А дальше несложный "поворотный" алгоритм найдет четырехугольник максимальной площади без полного перебора.
Если же выпуклая оболочка является треугольником, то надо лишь найти дополнительную внутреннюю точку, "выкусывающую" минимальную площадь из этого треугольника.

Разное поведение constexpr на разных платформах

Доброго времени суток. Есть класс, который включает в себя другой класс со статическими членами массивами. Я очень хочу сделать что бы у меня была возможность задать все статик значения этих членов в хедере а не в cpp части. Для этого я применил constexpr и эта схема нормально заработала на компиляторе от Microsoft. Однако на g++ под ARM на Debian этот код не компилируется:
undefined reference to `Foo::Target::IP'
В обоих случаях используется С++14. Вопрос вот в чём. Почему один компилятор это принимает, а другой нет, т.е. в чём отличия работы с constexpr внутри у этих компиляторов? Это никак не стандартизовано? Что мне сделать, чтобы такая схема заработала?
class Foo { public: static void GetIp(uint8_t* data) { memcpy(data, &Target::IP[0], 4); }; private: class Target { public: static constexpr uint8_t IP[4] = { 192,168,0,110 }; static constexpr uint16_t Port = 3000; }; }; int main() { uint8_t A[4]; Foo::GetIp(A); printf("%u.%u.%u.%u", A[0], A[1], A[2], A[3]); system("PAUSE"); return 0; }


Ответ

Да чтоб заработало, все просто - добавить
constexpr uint8_t Foo::Target::IP[4];
Только и всего. См. https://ideone.com/ZMqPMn
Но вот что именно строго по стандарту, а что нет - тут я не скажу, не уверен. Понятно, что целочисленное поле и массив - разные вещи, но что именно стандарт разрешает, что нет, и что отдает на откуп реализации - не скажу...

Какую лучше архитектуру использовать для вычислений на GPU

Необходимо перенести вычисления с CPU на GPU. Начал гуглить про это всё, в итоге есть 2 похожие архитектуры - CUDA от Nvidia и OpenCL от AMD, второе можно и на Nvidia использовать. Вроде бы пишут, что видеокарты на AMD больше заточены под вычисления и быстрее на 30-40%.
У кого был опыт программирования на подобном. Можете прояснить пожалуйста, что лучше выбрать для себя?
Программу пишу на C#, но как понял, класс вычислений придется писать на C++ и подключать библиотеку к своей программе.


Ответ

Занимаюсь сложными гидродинамическими расчётами на GPU уже давно - OpenCL. По производительности вычислений float карты NVidia всегда опережают AMD с аналогичным количеством и частотой потоковых процессоров. Процентов на 30-50. От использования double лучше по возможности уходить.

При отправке формы с использованием ajax перезагружается страница

Здравствуйте при отправке формы с использование ajax перезагружается страница почему так происходит подскажите ?

var inputName = document.querySelector('#name'); var inputEmail = document.querySelector('#email'); var formSend = document.querySelector('#send');
formSend.addEventListener('click', function() { var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); });
var formAjax = function(params) { var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { alert(innerHTML = xhr.responseText); } }
xhr.open('POST', 'mail.php'); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send(params); } $name = trim($_POST['name']); $email = trim($_POST['email']);
if ($name == '' || $email == '') { echo 'Заполните все поля'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo 'Введите коректные email'; } else { file_put_contents('app.txt', "$name $email
", FILE_APPEND); echo 'Спасибо'; }


Ответ

Обработчик должен просигнализировать, что стандартное сабмит-поведение формы не требуется:
formSend.addEventListener('click', function() { var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); return false; // !!! });
или
formSend.addEventListener('click', function(event) { event.preventDefault(); // !!! var params = 'name=' + inputName.value + '&' + 'email=' + inputEmail.value; formAjax(params); });
или

почему появляется столбец 'Unnamed'

я создал датафрейм , в нём 3 колнки. Перегоняю его в файл. Читаю данные с файла и вижу новый столбец 'Unnamed' . Всё бы ничего , но я не могу его удалить , вылетает ошибка:
ValueError: labels ['Unnamed'] not contained in axis
откуда вообще он взялся и что с ним делать ?


Ответ

Скорее всего вы сохранили CSV файл с индексом (по умполчанию).
Как это проверить:
In [31]: df.columns.tolist() Out[31]: ['Unnamed: 0', 'a', 'b', 'c']
Пример:
In [16]: df = pd.DataFrame(np.arange(1,10).reshape(3,3), columns=list('abc'))
In [17]: df Out[17]: a b c 0 1 2 3 1 4 5 6 2 7 8 9
In [18]: df.to_csv(r'c:/temp/test.csv')
теперь если просто прочитать его, то получим столбец Unnamed: 0 (т.к. индекс был безымянным):
In [20]: x = pd.read_csv(r'c:/temp/test.csv')
In [21]: x Out[21]: Unnamed: 0 a b c 0 0 1 2 3 1 1 4 5 6 2 2 7 8 9
вот как это выглядит в CSV файле:
In [22]: print(Path(r'c:/temp/test.csv').read_text()) ,a,b,c 0,1,2,3 1,4,5,6 2,7,8,9
Как это обойти:
In [23]: x = pd.read_csv(r'c:/temp/test.csv', index_col=0)
In [24]: x Out[24]: a b c 0 1 2 3 1 4 5 6 2 7 8 9
или сохранять DataFrame без индекса:
In [25]: df.to_csv(r'c:/temp/test.csv', index=False)
In [26]: print(Path(r'c:/temp/test.csv').read_text()) a,b,c 1,2,3 4,5,6 7,8,9
In [27]: pd.read_csv(r'c:/temp/test.csv') Out[27]: a b c 0 1 2 3 1 4 5 6 2 7 8 9

Затемнение всей страницы при открытии выпадающего меню с помощью css

Возможно ли сделать с помощью только css, чтобы при наведении на меню которое имеет подменю появлялась подложка, которая покрывает всю страницу не считая самого меню и текста с повышенным z-index. Важно, что убрав курсор с подменю или пункта меню с подменю подложка должна убираться. Хочу получить такой результат:

Добавила фон во внутрь выпадающего меню, но получаю эффект мерцания и само меню закрыто подложкой:
.text { position: relative; padding: 15px; background: linear-gradient(to bottom, rgba(206, 220, 231, 1) 0%, rgba(89, 106, 114, 1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cedce7', endColorstr='#596a72', GradientType=0); } nav { position: relative; z-index: 99; padding: 0; color: #fff; background-color: #1a2fb0; } ul { display: table; margin: 0; padding: 0; width: 100%; list-style: none; } li { position: relative; display: table-cell; border: 1px solid #6876cb; } a { display: block; padding: 5px; text-align: center; color: #fff; } .dropdown { display: none; position: absolute; z-index: 100; padding: 5px; font-size: 20px; color: #1e2faa; background-color: #fff; box-shadow: 15px 0 15px rgba(0, 0, 0, 0.05); } li:hover .dropdown { display: flex; } .dropdown-bg { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 5; height: 100vh; width: 100vw; background: rgba(11, 11, 46, 0.7); } a:hover~.dropdown-bg, .dropdown:hover~.dropdown-bg { display: block; }

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.


Ответ

Задайте положение через z-index для меню и затемнения.
.text { position: relative; padding: 15px; background: linear-gradient(to bottom, rgba(206, 220, 231, 1) 0%, rgba(89, 106, 114, 1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cedce7', endColorstr='#596a72', GradientType=0); z-index: 2; } nav { position: relative; z-index: 99; padding: 0; color: #fff; background-color: #1a2fb0; } ul { position: relztive; display: table; margin: 0; padding: 0; width: 100%; list-style: none; z-index: 2; } li { position: relative; display: table-cell; border: 1px solid #6876cb; } a { display: block; padding: 5px; text-align: center; color: #fff; } .dropdown { display: none; position: absolute; z-index: 100; padding: 5px; font-size: 20px; color: #1e2faa; background-color: #fff; box-shadow: 15px 0 15px rgba(0, 0, 0, 0.05); } li:hover .dropdown { display: flex; } .dropdown-bg { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 5; height: 100vh; width: 100vw; background: rgba(11, 11, 46, 0.7); z-index: -1; } a:hover~.dropdown-bg, .dropdown:hover~.dropdown-bg { display: block; }

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Easy Blockchain

Всем привет. Помогите найти ошибку. Создаю элементарную блокчейн из 5 элементов. Остальной код работает, проверяла без цикла. Я новичек в джаве. Получается, что сохраняется только два хеша первых элементов.
int numberOfBlocks = 5;
for(int i = 1; i <= numberOfBlocks; i++) {
String endOfNumber = "";
if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; } }
blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); }
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:
" + blockchainJson);


Ответ

Тебе нужно занести сохранение блока в ветку else после операции switch, вот код:
int numberOfBlocks = 5;
for(int i = 1; i <= numberOfBlocks; i++) {
String endOfNumber = "";
if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; }
blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); }
System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); } String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:
" + blockchainJson);
В твоем примере, происходит следующее : ты создаешь 1 блок, потом завершается оператор if и ты исполняешь новое сохранение блока, из-за чего вся цепочка перестает быть валидной.

svg GaussianBlur ломается область видимости

Как правильно задавать параметры для фильтра, чтобы не обрезалось по квадрату. Не могу понять, где эта область видимости задается?
.decor_background { position: fixed; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; background: linear-gradient(to top left, #111 2%, #221c44); filter: blur(20px); z-index: 1; } .svg_elements { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; z-index: 2; } .svg_circle { width: 50px; } #svg_elements__full { width: 100%; } .svg_circle { fill: none; stroke: #68CADA; stroke-width: 5; }



Ответ

Область видимости действия фильтра на объект называется - Filter effects region
Это прямоугольник, с габаритными размерами width="X%", height="Y%" заданными в определении фильтра
Также могут быть заданы координаты левого верхнего угла региона действия фильтра - x="X%" y="Y%"
Если эти все параметры не указаны, то они будут по умолчанию равны:
x="-10%", y="-10%" width="120%" height="120%"
Вы указали в своем примере только width="150%" без height
В результате регион действия фильтра уменьшился и подрезал края.
Внизу пример с новыми параметрами региона фильтра:
.decor_background { position: fixed; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; background: linear-gradient(to top left, #111 2%, #221c44); filter: blur(20px); z-index: 1; } .svg_elements { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; z-index: 2; } .svg_circle { width: 50px; } #svg_elements__full { width: 100%; } .svg_circle { fill: none; stroke: #68CADA; stroke-width: 5; }


Update
Ваш пример работает только Chrome, Opera, Yandex, но не работает в Firefox
Необходимо убрать параметр in="offOut" из определения фильтра и тогда будет работать и в Firefox
.decor_background { position: fixed; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; background: linear-gradient(to top left, #111 2%, #221c44); filter: blur(20px); z-index: 1; } .svg_elements { position: absolute; top: 0; bottom: 0; left: 0; right: 0; height: 100%; width: 100%; z-index: 2; } .svg_circle { width: 50px; } #svg_elements__full { width: 100%; } .svg_circle { fill: none; stroke: #68CADA; stroke-width: 5; }

Error in custom ControlTemplate in TextBox

Почему курсор скрывается за TextBox?


Ответ

Почему курсор скрывается за TextBox?
потому что он такого же цвета, что и фон. Измените цвет курсора и его станет видно:

Как блокировать движение курсора при up и down в input?

Когда есть фокус у input и введен текст. То при нажатии кнопок up и down курсор перемещается в начало или конец строки. Как это можно предотвратить? Добавляю при событии keyup stopPropagation и preventDefault.
$(me.inputSelector).on('keyup', function(e) {
if (e.keyCode == 38) { // вверх e.stopPropagation(); e.preventDefault(); return; } if (e.keyCode == 40) { // вниз e.stopPropagation(); e.preventDefault(); return; } });


Ответ

Надо повеситься на keydown:
document.querySelector('input').addEventListener('keydown', e => { if (e.keyCode == 38 || e.keyCode == 40) { e.stopPropagation(); e.preventDefault(); return false; } });
В момент события keyup нажатие уже обработано браузером

Оптимальный алгоритм на графах

На графе существует две особые вершины: синяя и красная. Задача состоит в том, чтобы при удалении красной вершины, также удалить все вершины из которых нельзя достичь синей, т.е. граф как бы должен распасться на два, один из которых подлежит удалению.
Мое решение состоит в том, чтобы проверить существование пути из каждой вершины в синюю. Если все пути очередной вершины проходят через красную, то производить удаление этой вершины.
Может существует более оптимальное решение?


Ответ

А если так:
Удалить красную вершину и все ребра, примыкающие к ней. В получившемся графе провести поиск в глубину из синей вершины.
Найденная компонента связности и есть искомый результат.

Немного вопросов о многопоточности

Сам не первый год пишу на java, но лишь в рамках хобби, с многопоточностью приходится не так часто работать.
Заинтересовали несколько вопросов, а имённо:
Допустим, мне нужно писать и вычитывать примитивный тип на каком-то объекте (из разных потоков). Допустим, поля открытые (public).
Если верить справке java, операции чтения и записи ссылок являются атомарными (логично, ведь размер такой ссылки обычно помещается в регистр процессора, да и система его поддерживает). Тогда чтение и запись поля, хранящего ссылку на объект, вполне себе нормальная операция для выполнения в разных потоках.
Также справка java уверяет, что чтение и запись примитивных типов, исключая long и double, тоже являются атомарными. Но как быть с этими двумя? Как я понимаю, их нужно лишь пометить как volatile. Но есть ли какие-то побочные эффекты, или этот модификатор только и делает, что гарантирует атомарность операций над переменной?
Хорошо. А теперь, к примеру, я хочу читать и писать поля через геттеры-сеттеры. Если мои геттеры-сеттеры не меняют состояние каких-либо внешних данных, а лишь читают и пишут переменную, достаточно ли мне пометить такую переменную как volatile, или же нужно отмечать геттер/сеттер как syncronized? (При условии, что доступ к переменным возможен лишь через геттер и сеттер). Работа с объектами. А конкретно, с объектами, что не меняют состояния.
К примеру, String. Насколько мне известно, данный тип никогда не меняет состояния, а все его методы, возвращающие строку, возвращают новый экземпляр.
Так вот, могу ли я обращаться к такому объекту из разных потоков без дополнительной синхронизации? Или же я могу тогда что-то упустить (вопрос для случая, когда я могу лишь получить объект, но не изменить значение поля, на него ссылающегося).
Благодарю за терпение того, кто сможет на эти вопросы ответить)


Ответ

Важно, что volatile гарантирует видимость. Изменения volatile-поля в одном потоке будут сразу видны в другом. Если вам нужно потокобезопасно выполнить более сложную процедуру, чем присвоение - воспользуйтесь synchronized или j.u.c.Atomic*-типами, чтобы избежать возникновения гонок (race condition).
Пример: любой многопоточный счетчик
// Плохо private volatile long counter;
public long getId() { counter += 1; return counter; }
// Хорошо private volatile AtomicLong counter = new AtomicLong(0);
public long getId() { return counter.incrementAndGet(); }
// Тоже хорошо private volatile long counter;
public synchronized long getId() { counter += 1; return counter; }
Помните, что synchronized - это всегда явная блокировка (но она довольно дёшева при низкой конкуренции), а Atomic-примитивы используют бесконечный цикл с CAS-инструкциями и могут хорошо оптимизироваться.

Объекты с неизменяемым состоянием (например, все поля такого объекта final) назвают immutable объектами, и с ними безопасно работать из разных потоков. Но если внутреннее состояние объекта содержит изменяемый какой-то компонент и он как-то может быть доступен снаружи - придется дополнительно думать о потокобезопасности. Пример:
// потокобезопасный класс public final class SafeFoo { private final Date date = new Date(); }
// не потокобезопасный класс public final class UnsafeFoo { private final Date date = new Date(); public Date getDate() { return date; } }
Первый класс полностью потокобезопасен. Второй - нет. Метод getDate() осуществляет публикацию внутреннего состояния внешнему коду (unsafe publication). И где-то снаружи можно сделать так, изменив внутренне состояние:
unsafeFoo.getDate().setHours(0);
Защититься от этого можно, например созданием копии:
// потокобезопасный класс public final class SafeAgainFoo { private final Date date = new Date(); public Date getDate() { return date.clone(); } }

Помогите исправить Javascript код

Есть код, который при уменьшении размера экрана до 800 пикс. выводит после заголовка дополнительный код:
$(window).resize(function() { var width = $('body').innerWidth() if (width < 800) { $(".zag").after("

Дополнительный Текст

"); } }); Скрытие Блока в зависимости от разрешения монитора

Заголовок


Сейчас выводится несколько строк одинакового кода, типа лог файл. Нужно что бы код вывелся только один раз при изменении экрана.


Ответ

$(window).resize(function () { var width = $('body').innerWidth(); if (width < 800) { if ($(".dop").length == 0) { $(".zag").after("

Дополнительный Текст

"); } } else { $(".dop").remove(); } });

Бизнес-логика и ее реализация


Вначале про бизнес-логику. Есть идея программы, часть функций уже реализована, структура (как на картинке) уже создана. Встал вопрос насколько такая структура и идея логики программы вообще применимы, какие в них есть недостатки. Основные действия программы помещаются в Main и влезают примерно в 10-50 строчек, которые, по сути, являются приказами для других отделов (инициализация). Получается, что к Class 2 и Class 3 образуются и взаимодействуют только в Class 1, а остальные (например Class10, Class25) даже и не предполагают что такие существуют вовсе, они обращаются только к Class1. Class 1 и Class 10 extend Thread и после инициализации ожидают, когда их вызовут.
Теперь два главных вопроса:
1. Это вообще возможно? Это первая крупная задача, которая встала передо мной, и я столкнулся с некоторыми сложностями, которые у меня остались, наверно, из-за нехватки знаний. А именно: допустим, я создал объект класса Class1 (это в Main). Теперь я хочу обратиться к нему из класса Class25, чтобы получить ответ на вопрос, который решают Class2 и Class3. Как это сделать? Важно - я не хочу создавать директора отдела (Class1) в каждом из подклассов, я хочу чтобы он был один, и в будущем был потоком, если это возможно.
2. И если это все-таки возможно, то насколько это правильно, почему я не видел такой логики в других программах? Связь GETTER-SETTER сводится к минимуму, а ООП развивается по максимуму.


Ответ

Очень хорошие и глобальные вопросы подняты, но вопросов несколько и ответы могут быть очень большими. Отвечу кратко, просто чтобы направить автора вопроса в нужном направлении для развития.
Надо знать, что существуют разные паттерны программирования, то есть на Java можно писать по разному, в разном стиле. И одну и ту же задачу можно решить разными способами и библиотеками.
В целом, на Java активно используется Spring. Знание Spring с избытком ответит на оба вопроса - как один из вариантов решения. Если решать эти вопросы без Spring, то ответы могут быть другими.
По вопросам в целом
Если объект экземпляра Class1 должен быть один (читать про паттерн singleton), то объект создается один раз и используется в других объектах по ссылке. А как он будет сделан - это уже решать автору. Вариантов много: сделать static class Class1 или сделать Spring @Bean Class1 или руками создать объект Class1 и передавать в конструкторы других классов по ссылке или через геттеры-сеттеры.
П.С. Также полезно разобраться с понятием POJO

Сохранение композитного объекта в базе

В домене приложения есть объект/entity Place (Место) и есть у него среди других value object'ов – координаты на яндекс:карте (x,y и zoom карты):
public class Place { public int Id { get; set; }
public string Title { get; set; }
public YandexMapPoint Point { get; set; } }
public class YandexMapPoint { public float X { get; set; }
public float Y { get; set; }
public byte Zoom { get; set; } }
При этом я хочу, чтобы в базе это хранилось в одной таблице с полями Id, Title, x, y, zoom – и при чтении из базы разворачивалось обратно в доменный объект. А при сохранении доменного объекта – наоборот, складировалось в одну таблицу.
Я использую EF (EF6 или Core, не принципиально) Code First.
Как мне описать подобную структуру на уровне работы с базой данных?


Ответ

Конечно, это возможно. Создавая новый проект, я думал, придётся либо с атрибутами помудрить, либо флюэнт-интерфейс заюзать.
Но для начала я создал заготовку следующего вида:
using System; using System.Data.Entity; using System.Linq;
namespace ConAppEF { class Program { static void Main(string[] args) { using (var context = new MyContext()) { Console.WriteLine(context.Places.Count()); } } }
public class MyContext : DbContext { public DbSet Places { get; set; } }
public class Place { public int Id { get; set; } public string Title { get; set; } public YandexMapPoint Point { get; set; } }
public class YandexMapPoint { public float X { get; set; } public float Y { get; set; } public byte Zoom { get; set; } } }
После запуска было создана БД с такой таблицей:
CREATE TABLE [dbo].[Places] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Title] NVARCHAR (MAX) NULL, [Point_X] REAL NOT NULL, [Point_Y] REAL NOT NULL, [Point_Zoom] TINYINT NOT NULL, CONSTRAINT [PK_dbo.Places] PRIMARY KEY CLUSTERED ([Id] ASC) );
Даже не пришлось ничего делать.

Изменить прямоугольник фокуса на MenuItem

Когда наводим мышкой на MenuItem на нем рисуется прямоугольник фокуса, как изменить его цвет фона и цвет рамки, шаблон? Не нашел в шаблоне MenuItem про него ничего


Ответ

То, что вы имеете ввиду, это не фокус, фокус может (и обычно всегда) находиться на другом пункте меню или на другом контроле. Вам же нужен выделенный (highlighted) пункт меню, соответственно, в шаблоне элемента смотрите триггер

именно он срабатывает при наведении курсора на пункт меню, в частности, здесь меняется цвет рамки:

Если в градиенте заменить первый цвет на Red, а второй на Green, то получится вот что:

Тонкости работы css.content

Задача: размещаю легенду в виде пар "термин":"значение". На форме это выглядит так:

...
Destinationадрес подсети или хоста назначения
Gatewayадрес шлюза, через который данный маршрут доступен

Далее, хочу сделать так, чтобы перед каждой расшифровкой значения шло тире - – | – | –. Чтобы вставить просто минус, использую стиль:
table.legend-table tr td:last-child:before { content: " - " }
Но хочется, чтобы это было именно тире. Я сделал промежуточный вариант, вставив символ тире в код, благо исходник в UTF-8 и проблемы нет:
table.legend-table tr td:last-child:before { content: " – " }
Но мне хотелось знать, есть ли нормальный вариант вставить HTML-код перед элементом посредством CSS (то есть – или –)
В идеале было бы найти способ вообще вставки чего угодно перед элементом, например иконки или глифа, или еще чего средствами CSS


Ответ

В свойство content символы юникода могут записываться в 16-битной форме без префикса U+ с экранированием обратным слешем \ . Напрмер, среднее тире – имеет код U+2013 . Полный список символов и их кодов можно найти на https://unicode-table.com/ru/ ul{ list-style:none; padding:0; } li:before{ content:'\2013'; margin-right:5px; }

  • asdas
  • asdas

Вёрстка пагинации на гридах

Здравствуйте, подскажите каким образом можно дополнить стили, чтобы пагинация не ломалась при уменьшении ширины экрана?
Сейчас выходит следующее:
а хотелось бы добиться такого результата:
Второй пример я получил при добавлении min-width: min-content; к классу .pagination__item
но на более широком экране последний элемент не хочет переходить на новую строку и получается так:
.pagination { font-family: Tahoma; display: grid; grid-gap: 5px; grid-auto-flow: column; justify-content: start; grid-template-columns: repeat(auto-fit, minmax(32px, 1fr)); } .pagination__list { display: grid; grid-gap: 5px; grid-template-columns: repeat(auto-fit, minmax(32px, min-content)); } .pagination__item { display: grid; align-content: center; justify-content: center; user-select: none; text-align: center; cursor: pointer; box-sizing: border-box; padding: 5px; border-radius: 3px; background-color: #ffffff; color: #444444; border-width: 1px; border-style: solid; border-left-color: #dbdbdb; border-top-color: #dbdbdb; border-right-color: #c4c4c4; border-bottom-color: #c4c4c4; }



Ответ

Вам надо использовать Flex box. Grid для такой цели не подходит, так как предполагает равный размер ячеек в колонке.
.pagination { display: flex; flex-wrap: wrap; } .pagination div { user-select: none; cursor: pointer; box-sizing: border-box; padding: 5px; border-radius: 3px; background-color: #ffffff; color: #444444; border-width: 1px; border-style: solid; border-left-color: #dbdbdb; border-top-color: #dbdbdb; border-right-color: #c4c4c4; border-bottom-color: #c4c4c4; margin: 3px; }


Как отключить контекстное меню у тега HTML5 video?

У меня реализован live стрим видео webm с использованием MediaSourceExtensions API на стороне JavaScript. Тег video создаётся без контролов, но по клику правой кнопкой мыши по области видео можно показать контролы, промотать видео, развернуть на весь экран...
Мне этого не надо - пользователю веб-приложения должны быть доступны только те функции, которые я запрограммирую, и не более. Как отключить это контекстное меню тега video?
Если это невозможно, может помимо video можно ещё как-нибудь рендерить контент MSE? Может на canvas?...


Ответ

Первый вариант
Используем JavaScript
document.getElementById("id1").oncontextmenu = function (e) { return false; };

без меню

c меню

Данный пример сделан с изображением но для видео он тоже сработает, так как отключает контекстное меню на любом элементе.
Второй вариант
Поверх видео положить прозрачную картинку.
Третий вариант
Чистый HTML (почти)

Реализовать разные варианты оформления элемента

Есть заготовка, как довести её до состояние как на изображении и сделать остальные два варианта?
.sho_bq-background { background: #fafafa; } .sho_bq-background:before { color: #ff0054; content: "\1F676"; font-size: 4em; line-height: 0.1em; margin-right: 0.2em; vertical-align: -.4em; } .sho_bq-background:after { color: #ff0054; position: relative; content: "\1F677"; font-size: 4em; line-height: 0.1em; vertical-align: -0.6em; } cite span:first-child { color: #aeadad; font-style: normal; } cite span:last-child { color: black; font-weight: bold; font-style: normal; }

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн


Ответ

Позиционировать элементы относительно blockquote
blockquote { position: relative; background: #fafafa; padding: 1rem; margin: 1rem; } blockquote:before { position: absolute; left: -10px; color: #ff0054; content: "\1F676"; font-size: 4em; line-height: 0.1em; margin-right: 0.2em; vertical-align: -.4em; } blockquote:after { color: #ff0054; position: absolute; bottom: -20px; right: -10px; content: "\1F677"; font-size: 4em; line-height: 0.1em; vertical-align: -0.6em; } cite span:first-child { color: #aeadad; font-style: normal; } cite span:last-child { color: black; font-weight: bold; font-style: normal; }

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн

Здесь также, как и в первом примере, только нужно изменить цвет элементов и добавить background: white
blockquote { position: relative; background: #fafafa; padding: 1rem; margin: 1rem; background: #fff; border: 2px solid #ccc; } cite span:first-child { color: #aeadad; font-style: normal; } cite span:last-child { color: black; font-weight: bold; font-style: normal; } blockquote:before { color: gray; position: absolute; top: -10px; left: -10px; background-color: white; text-align: center; width: 45px; height: 40px; color: gray; content: "\1F676"; font-size: 4em; line-height: 1em; } blockquote:after { color: gray; background-color: white; width: 45px; height: 40px; position: absolute; text-align: center; bottom: -20px; right: -10px; content: "\1F677"; font-size: 4em; line-height: 1.1em; }

«Идеалами, освещавшими мой путь и сообщавшими мне смелость и мужество, были доброта, красота и истина. Без чувства солидарности с теми, кто разделяет мои убеждения, без преследования вечно неуловимого объективного в искусстве и в науке жизнь показалась бы мне абсолютно пустой»

Автор цитаты: Альберт Эйнштейн

Заполнение таблицы с полем CLOB из текстовых файлов

В определённой папке лежат текстовые файлы с именами, например, file_<номер>.json. Нужно из всех файлов в папке считать текст и заполнить им столбец таблицы типа CLOB, каждый файл в новой строке.
Не могу разобраться как работать с файловой системой.
Пока нашёл такое решение. Но, список файлов нужно самому писать.


Ответ

Один из способов без SQL*Loader. Какой способ предпочтительней можно решить только исходя из требований конкретной задачи (сколько файлов, размер, частота обновлений, необходимость обработки ошибок и т.д.).
Создал файл /tmp/file1.json с примером JSON данных и далее:
create or replace directory jsonFiles as '/tmp';
create table jsonData (id int primary key, json clob);
create or replace procedure loadJsonFromFile (id number, fileName varchar2) as myJson clob; myFile bfile; srcOffset int := 1; destOffset int := 1; langContext int := dbms_lob.default_lang_ctx; warn int; begin insert into jsonData values (id, empty_clob()) returning json into myJson ; myFile := bfilename (upper ('jsonFiles'), fileName); dbms_lob.fileopen (myFile); dbms_lob.loadClobFromFile ( myJson, myFile, dbms_lob.getLength (myFile), srcOffset, destOffset, 0, langContext, warn); dbms_lob.fileclose (myFile); end; /
exec loadJsonFromFile (1, 'file1.json');
select id, dbms_lob.substr (json, 80) json from jsonData;
ID JSON ---------- ------------------------------------------------- 1 {"menu": { "id": "file", "value": "File", "popup": { "menuitem": [
Подробнее в оф. документации
Практически любой проект имеет готовое решение для считывания содержимого директории. Если нет, то список файлов к загрузке можно получить как описано, например, здесь.

Использование Lazy Loading

Пробую использовать lazy loading entityframework. Смотрю примеры с метанита. Но что то не получается. Там есть пример для связи 1 ко многим. Вот мой код: Класс игрок:
class Player { public int Id { get; set; } public string Name { get; set; } public string Position { get; set; } public int Age { get; set; }
public int? TeamId { get; set; } public virtual Team Team { get; set; } }
Класс команда:
class Team { public int Id { get; set; } public string Name { get; set; } public string Coach { get; set; }
public virtual ICollection Players { get; set; } public Team() { Players = new List(); } }
Контекст данных:
class Context : DbContext { public Context() :base("MyConnect") { }
public DbSet Players { get; set; } public DbSet Teams { get; set; } }
И сам код в кнопке формы:
private void button1_Click(object sender, EventArgs e) { using (Context db = new Context()) { var players = db.Players.ToList(); foreach (var p in players) Console.WriteLine($"{p.Name} - {p.Team.Name}");
var teams = db.Teams.ToList(); foreach (var t in teams) { Console.WriteLine($"{t.Name}"); foreach (var p in t.Players) Console.WriteLine($"{p.Name}"); } } }
Так же взятый с метанита. Там утверждается что если свойства с модификаторами public и virtual то lazy loading будет работать без инклюдов и лодов. Но у меня вот этот код выпадает в ошибку как только доходит до строчки с p.Team.Name Так как у игрока не подтягивается коллекция команда. Но если я напишу db.Teams.Load(); тогда всё заработает. Но по моему должно работать и так? Подскажите пожалуйста, в чём проблема? Может я что то не так делаю, уже всю голову сломал.


Ответ

Классы в c# по умолчанию имеют модификатор internal, поэтому если вы пишете:
class Team {}
то ваш класс не public.
Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. Internal is the default if no access modifier is specified.
А именно это влияет на lazy load:
При использовании ленивой загрузки надо иметь в виду некоторые моменты при объявлении классов. Так, классы, использующие ленивую загрузку должны быть публичными, а их свойства должны иметь модификаторы public и virtual.
Пример на метаинте - с public.

JavaFX FXML, для чего Controller?

В уроках об FXML говорится об пользе и преимуществах разделения интерфейса и логики в программах, но есть ещё непонятный мне класс "Controller" (помимо классов логики и интерфейса) . В чём его идея, какую функцию он выполняет? В чём преимущество такого подхода?


Ответ

Возможно, Вам будет интересно мое мнение:
Лично я считаю, что термин "controller" в документации FXML следует воспринимать не более, чем то, что в других технологиях называется "code behind".
То есть это просто дополнительный код для выполнения задач связанных с отображением "вида" (view). (Под "видом" я здесь имею в виду конкретный участок пользовательского интерфейса).
FXMLLoader с помощью инъекций связывает объект контроллера с деревом объектов, которое он нагенерил по fxml-разметке. А также предоставляет некоторые другие возможности, например, одностороннюю привязку ("${expression}") атрибутов-свойств и прочее.
Но вот, к примеру, двусторонняя привязка ("#{...}") FXMLLoader'ом так до сих пор не реализована, и класс контроллера — это как раз подходящее место для ее описания.
Без сомнения, то, что будет в этом "code behind" полностью зависит от вашего подхода и самодисциплины. Как со стороны размещения бизнес-логики, так и со стороны разделения зон ответственности программиста и дизайнера.
Именно Вам решать, будет ли этот класс толстым носителем логики, или лишь тонкой прослойкой между моделью и видом.
При этом, даже, если вы будуте использовать какой-то определенный фреймворк (например, mvvmFx), то это не спасет вас от возможности ошибочно разместить часть бизнес-логики модели в "code behind" определенного вида (эта ошибка может и обнаружится, когда такая функциональность потребуется в другом месте).
С другой стороны, помня о том, что css-стили (кроме USER_AGENT) имеют определенное преимущество над JavaFx-свойствами узлов, в контроллере имеет смысл описывать настройки интерфейса с помощью JavaFx-свойств, а не заданием css-стилей — для того, чтобы дизайнер впоследствии смог исправить интерфейс указанием css-стилей. И даже в этом случае программист может сказать свое "последнее слово", восстанавливая значение свойства в обработчике изменения этого свойства ;)

Под словами "определенное преимущество" я имею ввиду то, что css-стиль перекрывает соответствующее ему свойство. Но только в момент перепроверки стилей. А до этой перепроверки будет действовать свойство. Например, можно установить какое-либо свойство узлу (в обработчике нажатия другой кнопки) и это будет отражено на экране, но при наведении на узел курсора мыши, узлу устанавливается псевдокласс hover и выполняется переустановка его стилей в соответствии с псевдоклассом, тем самым свойство будет заменено стилем. После того, как курсор мыши будет убран с узла, у него будет также убран псевдокласс hover. Это изменение псевдоклассов опять повлечет переустановку стилей узла, но в этих стилях не указано то изменение, которое делалось для свойства в обработчике. Поэтому свойство на экране отражено не будет, хотя оно и работало вначале некоторое время.

Функция сравнения массивов выдаёт true для отличающихся массивов

При таком коде функция возвращает true
function areArraysSame(array1, array2) { if (array1.length !== array2.length) { return; } for (var i = 0; i < array1.length; i++) { if (array1[i] !== array2[i]) { return false; } else { return true; } } } alert(areArraysSame([1, 2, 3], [1, 2, 2]));


Ответ

Нельзя возвращать true внутри цикла, пока еще есть непроверенные элементы массивов.
function areArraysSame(array1, array2) { if (array1.length !== array2.length) { return false; } for (var i = 0; i < array1.length; i++) { if (array1[i] !== array2[i]) { return false; } } return true; } console.log(areArraysSame([1, 2, 3, 4], [1, 2, 2, 4])); console.log(areArraysSame([1, 2, 3, 4], [1, 2, 3, 4])); console.log(areArraysSame([1, 2, 3, 4], [1, 2, "3", 4]));