Страницы

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

понедельник, 10 июня 2019 г.

Скролл вверх по клику

Посмотрите пожалуйста пример, внизу страницы input[file] кастомный, почему по клику на него, кидает вверх страницы ?
Пример
document.querySelector("html").classList.add('js'); var fileInput = document.querySelector(".input-file"), button = document.querySelector(".input-file-trigger"), the_return = document.querySelector(".file-return"); button.addEventListener("keydown", function(event) { if (event.keyCode == 13 || event.keyCode == 32) { fileInput.focus(); } }); button.addEventListener("click", function(event) { fileInput.focus(); return false; }); fileInput.addEventListener("change", function(event) { the_return.innerHTML = this.value; }); .input-file-container { position: relative; width: 225px; padding-top: 500px; } .js .input-file-trigger { display: block; padding: 14px 45px; background: #39D2B4; color: #fff; font-size: 1em; transition: all .4s; cursor: pointer; } .js .input-file { position: absolute; top: 0; left: 0; width: 225px; opacity: 0; padding: 14px 0; cursor: pointer; } .js .input-file:hover+.input-file-trigger, .js .input-file:focus+.input-file-trigger, .js .input-file-trigger:hover, .js .input-file-trigger:focus { background: #34495E; color: #39D2B4; } .file-return { margin: 0; } .file-return:not(:empty) { margin: 1em 0; } .js .file-return { font-style: italic; font-size: .9em; font-weight: bold; } .js .file-return:not(:empty):before { content: "Selected file: "; font-style: normal; font-weight: normal; } /* Useless styles, just for demo styles */ body { font-family: "Open sans", "Segoe UI", "Segoe WP", Helvetica, Arial, sans-serif; color: #7F8C9A; background: #FCFDFD; } h1, h2 { margin-bottom: 5px; font-weight: normal; text-align: center; color: #aaa; } h2 { margin: 5px 0 2em; color: #1ABC9C; } form { width: 225px; margin: 0 auto; text-align: center; } h2+P { text-align: center; } .txtcenter { margin-top: 4em; font-size: .9em; text-align: center; color: #aaa; } .copy { margin-top: 2em; } .copy a { text-decoration: none; color: #1ABC9C; }

Flat UI - Custom Input:file

With JS return

It's just a test, not really usable.
Works on IE > 8 and modern browsers

by @geoffrey_crofte
see also Custom input:file with CSS only



Ответ

Дело в том что после вы даете фокус инпуту. а он в верху страницы. В css снимаем как мне кажется лишний top: 0; и больше не кидает вверх. Оно написано для этого селектора .js .input-file
document.querySelector("html").classList.add('js'); var fileInput = document.querySelector(".input-file"), button = document.querySelector(".input-file-trigger"), the_return = document.querySelector(".file-return"); button.addEventListener("keydown", function(event) { if (event.keyCode == 13 || event.keyCode == 32) { fileInput.focus(); } }); button.addEventListener("click", function(event) { fileInput.focus(); return false; }); fileInput.addEventListener("change", function(event) { the_return.innerHTML = this.value; }); .input-file-container { position: relative; width: 225px; padding-top: 500px; } .js .input-file-trigger { display: block; padding: 14px 45px; background: #39D2B4; color: #fff; font-size: 1em; transition: all .4s; cursor: pointer; } .js .input-file { position: absolute; //top: 0; left: 0; width: 225px; opacity: 0; padding: 14px 0; cursor: pointer; } .js .input-file:hover+.input-file-trigger, .js .input-file:focus+.input-file-trigger, .js .input-file-trigger:hover, .js .input-file-trigger:focus { background: #34495E; color: #39D2B4; } .file-return { margin: 0; } .file-return:not(:empty) { margin: 1em 0; } .js .file-return { font-style: italic; font-size: .9em; font-weight: bold; } .js .file-return:not(:empty):before { content: "Selected file: "; font-style: normal; font-weight: normal; } /* Useless styles, just for demo styles */ body { font-family: "Open sans", "Segoe UI", "Segoe WP", Helvetica, Arial, sans-serif; color: #7F8C9A; background: #FCFDFD; } h1, h2 { margin-bottom: 5px; font-weight: normal; text-align: center; color: #aaa; } h2 { margin: 5px 0 2em; color: #1ABC9C; } form { width: 225px; margin: 0 auto; text-align: center; } h2+P { text-align: center; } .txtcenter { margin-top: 4em; font-size: .9em; text-align: center; color: #aaa; } .copy { margin-top: 2em; } .copy a { text-decoration: none; color: #1ABC9C; }

Flat UI - Custom Input:file

With JS return

It's just a test, not really usable.
Works on IE > 8 and modern browsers

by @geoffrey_crofte
see also Custom input:file with CSS only


Уведомление об изменение в БД MS SQL в ПО

Мне необходимо реализовать функционал отслеживания изменения в БД и согласно этого изменения действовать дальше. Изменения будут вида 1/0. На данный момент, кроме использования таймера каждые 10-30 секунд(это максимум) и SELECT в проверяемое поле, ничего придумать не могу. Подскажите пожалуйста способ, если он существует, что бы БД оповестила об изменение и только тогда я обратился к ней и взял что мне нужно. Проект создан на WinForms.


Ответ

Вы можете подписаться на сообщения sql broker-а Об этом можно почитать здесь
уже есть готовые решения помогающие не создавать велосипеды, к примеру посмотрите на проект

Проверка типов в конструкторе с std::forward

class A { public: using number_t = std::int32_t; using string_t = std::string;
template < class T > using vector_t = std::vector < T >;
public: template < class T1, class T2, class T3 > A(T1 && n, T2 && s, T3 && v) : m_n { std::forward < T1 > (n) }, m_s { std::forward < T2 > (s) }, m_v { std::forward < T3 > (v) } {}
private: number_t m_n; string_t m_s; vector_t < number_t > m_v; };
Вопрос: нужно ли проверять типы T1, T2, T3 в конструкторе? Я так полагаю, что нужно, потому что этот конструктор запросто съедает, например, в качестве первого аргумента double, что нежелательно. Как корректно сделать проверку? Рассматриваю вариант std::enable_if_t и std::is_same. Если так, то как удалять ссылки в случае приема конструктором lvalue-значения? Компилятор ругается на std::is_same < number_t, std::remove_reference< T1 >::type >::value. Пишет: «ожидался тип, а не вот это».


Ответ

Мне кажется, что в данном случае логично применить std::decay - типа
template,int>>, typename = enable_if_t,int>>, typename = enable_if_t,int>> > B(T1&& t1, T2&& t2, T3&& t3) : a1_{std::forward(t1)}, a2_{std::forward(t2)}, a3_{std::forward(t3)} { }
Кстати говоря,
typename = enable_if_t>>
тоже вполне работает. Причем в определенных ситуациях даже лучше - например, const int decay пропустит, убрав const, а вот remove_reference_t - уже нет, так что если, например, конструктор требует именно ссылку, а не константную ссылку - лучше remove_reference_t, если константную ссылку - лучше decay.
Словом, подгонять по месту с помощью напильника и какой-то матери... :)

Преймущества двойного указателя перед одним указателем в реализации класса matrix

Есть 2 реализации класса matrix на С++. Первый вариант с использованием указателя на массив элементов матрицы int *elems_. Для получения элемента матрицы в классе перегружен оператор ()
int& operator() (size_t n, size_t m) const { return this->elems[m * this->cols + n]; }
Второй вариант с использованием двойного указателя (двумерный массив). Выглядит это так int **elems_. Для получения элемента матрицы такая перегрузка оператора:
int& operator() (size_t n, size_t m) const { return this->elems[m][n]; }
Какие есть плюсы и минусы при обоих подходах?


Ответ

На мой взгляд, здесь самый существенный момент - работа с большими матрицами. Ибо в таком случае большое значение имеет работа процессорного кэша. И тогда есть 2 аспекта:
Как реализован сам класс. С этой точки зрения, первый способ лучше, так как он выделяет один непрерывный блок данных, а второй - множество блоков поменьше (и они не обязаны быть смежными). Как вы используете матрицу. Например, если вы последовательно обходите элементы матрицы построчно, то кэш используется эффективно. А если вы обращаетесь к случайным элементам матрицы, то будут частые промахи кэша, подкачка страниц, и все такое прочее. И тогда аспект 1 не имеет значения.
Кстати, совместить ваши способы можно таким образом:
Выделить память одним большим куском; Создать также массив, который будет содержать указатели на начала строк матрицы;
Тогда доступ к элементу можно будет делать как в способе 2, а данные при этом будут лежать в непрерывном блоке данных как в способе 1. При этом накладные расходы - дополнительный массив для указателей (что и так имеется в способе 2).

Локализация JFileChooser через UIManager. Где найти ключи локализации?

Пытаю локализовать JFileChooser через UIManager. Делаю это вот так:`
UIManager.put("FileChooser.saveButtonText", "Сохранить"); UIManager.put("FileChooser.cancelButtonText", "Отмена"); UIManager.put("FileChooser.fileNameLabelText", "Наименование файла"); UIManager.put("FileChooser.filesOfTypeLabelText", "Типы файлов"); UIManager.put("FileChooser.lookInLabelText", "Директория"); UIManager.put("FileChooser.saveInLabelText", "Сохранить в директории"); UIManager.put("FileChooser.folderNameLabelText", "Путь директории");
И далее, где то 20 строк. Но не могу найти всех ключей к FileChooser. Кто-нибудь знает где они?


Ответ

Список можно получить из из ресурсов Swing в зависимости от используемого Look&Fill.
Например: basic
В пакете com.sun.java.swing.plaf есть пакеты под различные локали различных look&fill. Открыв их можно собрать все ресурсы начинающиеся с FileChooser.
Кроме того там есть ресурсы и для прочих стандартных диалогов.

OracleClient непонятные символы в конце каждой ячейки

Пишу приложение на asp.net core 2.0, бд - Oracle, ничего не подходит для подключению кроме стандартного System.Data.OracleClient;
После выполнения запроса в ответе почти в каждой ячейке на конце непонятный символ:
OracleDataReader dataReader = command.ExecuteReader(); string result = dataReader["LOGIN"].ToString();
Результаты типа Sergii Goriainov쳘, sgor⌴, DPå.
Как можно это исправить?


Ответ

Разобрался, баг кодировки в самой библиотеке
Альтернатива Mono.Data.OracleClientCore с тем же багом багом
Один из пользователей послал пул реквест с исправлением ошибки, работает. Пока не приняли вот ссылка на исходники - https://github.com/LinqDan/oracleclientcore

Что означает символ @ в javascript?

Что означает символ @ в javascript/jQuery?
// Метод создает структуру товара. @param jQuerySelector


Ответ

Это часть комментария из JSDoc, описывает параметр который передается в метод.
Пример из wiki:
/** * Создает экземпляр Circle. * * @constructor * @this {Circle} * @param {number} r - Радиус окружности. */ function Circle(r) { /** @private */ this.radius = r;
/** @private */ this.circumference = 2 * Math.PI * r; }

Куда загружается DLL при её использовании процессом?

Среди преимуществ использования динамических библиотек перед статическими значится пункт экономии ресурсов системы, т.е. библиотека загружается в памяти единожды и используется сразу несколькими процессами (в смысле если библиотека уже загружена другим процессом, повторная загрузка выполняться не будет). Отсюда вопрос: куда же на самом деле загружается динамическая библиотека, если Windows позволяет использовать загруженный код нескольким процессам? В адресное пространство процесса? Но ведь тогда, когда процесс загрузивший DLL прекратить работу и выгрузится из памяти операционной системой, другой процесс потерпит фиаско!


Ответ

Куда же на самом деле загружается динамическая библиотека, если Windows позволяет использовать загруженный код нескольким процессам?
В файловое отображение — регион памяти, чьё содержимое синхронизируется с указанным файлом. Вкратце его работу можно описать следующим образом:

(Иллюстрация взята из статьи «File Mapping» в MSDN)
Открываете файл, который необходимо отобразить, с помощью CreateFile(). Это позволяет получить дескриптор HANDLE с нужными правами доступа. Создаёте отображение вызовом функции CreateFileMapping(). При этом происходит выделение блока подкачиваемой памяти для буфера.
«Подкачиваемая» (swappable) память означает, что буфер может быть полностью или частично сброшен из физической памяти в файл подкачки. А может и не быть — ничто не мешает ОС попросту скопировать все изменения в отображаемый файл. А ещё этот буфер может быть вообще выброшен из памяти, если в него не вносилось никаких изменений. Для того, чтобы получить к этому отображению доступ, требуется открыть вид (view) функцией MapViewOfFile(), и попросить ОС отобразить его на определённую часть файла. ОС, в свою очередь, обеспечит наличие данного куска в буфере и «прорубит» окно в адресном пространстве запросившего процесса. При этом разные процессы могут создавать виды, ассоциированные с общим, разделяемым буфером-отображением.
В вашем случае на каждую секцию исполняемого файла создаётся своё отображение с правами доступа, указанными в заголовке соответствующей секции.
В адресное пространство процесса?
Как мы выяснили выше, не в индивидуальное адресное пространство, а в разделяемую память, на которую отображается указанный диапазон адресного пространства процесса
Это возможно благодаря принципам организации работы виртуальной памяти:

(Иллюстрация взята из ответа на вопрос «Какую модель памяти сегментную или страничную использует windows, linux, macos?»)
Но ведь тогда, когда процесс загрузивший DLL прекратить работу и выгрузится из памяти операционной системой, другой процесс потерпит фиаско!
Отображение уничтожается, буфер высвобождается и файл закрывается только после завершения работы всех процессов, работающих с ним.

Как разницу дат привести к формату дни,часы,минуты,секунды?

Пишу обратный отсчет до определенной даты. У меня есть конечная дата (31 декабря 2017) и текущая (она вычисляется каждый раз при перезагрузке страницы). Соответсвенно у меня есть разница между датами в секундах:
var endTime = new Date('2017-12-31T23:59:59.999'); var timeDiff = Math.floor((endTime - new Date()) / 1000);
Я хочу выводить данные в виде X д. Y ч. Z мин. 𐌈 сек.. Как правильно это сделать?
Я пишу:
var sec = Math.floor((endTime - new Date()) / 1000); var d = (sec / (60 * 60 * 24)); var h = sec / 3600 ^ 0; var m = (sec - h * 3600) / 60 ^ 0; var s = sec - h * 3600 - m * 60;
Но в итоге получается: 30.37553240740741 д. 729 ч. 00 мин. 46 сек.


Ответ

Мысль почти верная. Но в итоге достаточно поэтапно из общего числа секунд вычитать "крупные куски" начиная с дней и тогда при декомпозиции получится следующее:
// Наша конечная дата const endTime = new Date('2017-12-31T23:59:59.999'); let timerDiv = document.getElementById('test'); setInterval(timer, 1000); function timer() { // Берем разницу дат в секундах let delta = Math.floor((endTime - new Date()) / 1000); // Вычисляем количество ПОЛНЫХ дней let days = Math.floor(delta / 86400); // А теперь вычитаем из секунд количество дней, выраженных в секундах delta -= days * 86400; // В оставшихся секунд вычленяем количество полных часов let hours = Math.floor(delta / 3600) % 24; // Также их потом вычитаем, выразив в секундах delta -= hours * 3600; // Из оставшихся секунд берем минуты let minutes = Math.floor(delta / 60) % 60; // Опять вычитаем delta -= minutes * 60; // И наконец секунды // В теории деление по модулю на 60 не обязателен let seconds = delta % 60; // Итоговая дата let dateStr = `${days} д. ${hours} ч. ${minutes} мин. ${seconds} сек.`; timerDiv.innerText = dateStr; }



А вообще для обратного отсчета можно взять плагин на чистом JS - countdownjs (см. демо http://countdownjs.org/demo.html), заменить английские буквы на русские и не париться :)
const endTime = new Date('2017-12-31T23:59:59.999'); const pageTimer = document.getElementById('pageTimer'); const counterStr = (ts) => pageTimer.innerHTML = `${ts.days} д. ${ts.hours} ч. ${ts.minutes} мин. ${ts.seconds} сек.`; countdown((ts) => counterStr(ts), endTime);

Как эксель преобразует число во временной формат?

Нужно написать метод на java для преобразования числа в формат времени. Есть два столбца в экселе, в одном записан коэффициент, допустим 4.24 а в другом столбце получается время 5:47:36. Я делаю автоматизацию отчета и нужно чтобы 5:47:36 получалось сразу вместо 4.24. я не могу понять, как эксель преобразует число во временной формат?


Ответ

Алгоритм довольно простой: число 4.24 умножается на количество миллисекунд в сутках: 86 400 000 - получается результат в миллисекундах, который уже можно перевести в дату. Получается, что цифры целой части (4) означают число полных дней и при переводе просто во время (в пределах суток) эту цифру можно не учитывать, оставляя только знаки после запятой: перевод 4.24 и 0.24 вернёт один и тот же результат.
На Java можно написать следующим образом:
Date date = new Date((long) (4.24 * 86400000L)); SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println(format.format(date));

Выбор всех строк в функции

Добрый день! Создаю функцию, суть в том, что в случае, если один из входных параметров = 1, то необходимо взять только одну строку (потом пойдет в цикл), если параметр не задан - то необходимо взять все строки) Решил идти через decode, но не знаю, как обозначить в этом decode, что если параметр не равен 1, то "бери все".
Выглядит это пока так
where r.equipment_id = p_EquipmentId and rownum = decode(p_ForKR, 1, 1, X)
где Х обозначено место, куда нужно прописать это самое "бери все". Если есть вариант более красивый и правильный - готов его применить, только наставьте.
Oracle 9i


Ответ

В вашем запросе можно вместо X взять rownum, тогда, если параметр p_ForKR не равен 1, у вас будет rownum = rownum Еще подобную конструкцию можно записать с помощью nvl, coalesce или CASE, но это в принципе другой способ записать то же самое (разве что nvl может вызвать небольшое проседание производительности на очень больших выборках).

Как назначить TextWatcher на EditField при MVP

Есть MainActivity, есть Presenter, есть отдельный класс Util который наследуется от TextWatcher. Задача в том, чтобы назначить этот TextWatcher на editField.
Сейчас MainActivity
mainPresenterImpl = new MainPresenterImpl(); mainPresenterImpl.translationInputFieldListener(translatedTextInput);
Presenter
@Override public void translationInputFieldListener(EditText translatedTextInput) { Log.v("TAG", "In presenter"); translatedTextInput.addTextChangedListener(textWatcherUtil = new TextWatcherUtil()); }
Util
public class TextWatcherUtil implements 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) { }
}
Задача, назначить в методе afterTextChanged. Там уже дальше будет выполнятся метод сохранения значения в SharedPreferences.
P.S. Если мой вопрос составлен не корректно, то если минусуете, пожалуйста отпишите в комментариях, что сделанно не верно, чтобы ошибок не повторялось. Спасибо


Ответ

textWatcher это из категории дата биндинга в сторону MVVM. В случае паттерна MVP TextWatcher'a держите во вьюхе и в его колбеках вызываете презентер. и вся логика уже в презентере. т.е. будет вот так:
public class TextWatcherUtil implements TextWatcher{
@Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { presenter.beforeTextChanged(...); }
@Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { presenter.onTextChanged(...); }
@Override public void afterTextChanged(Editable editable) { presenter.afterTextChanged(...); }
Т.е. в вашем конкретном случае, вы в коллбеке afterTextChanged() вызываете presenter.onTextChanged() и в этом методе презентер вызывает свои Private методы работы с префами
А если у вас идет работа с префами, что можно считать репозиторием, то можете прикрутить к MVP еще и Interactor если простым языком, это класс между презнтером и моделью, который преобразует данные (+логику работы с ними) из модели в презентер и обратно в необходимом виде

IIS, магическая ошибка 404.13 - Not Found

Я использую IIS v10.0.14393.0 + Django,
При загрузки файла (размер 200 мб.) на сайт отдает ошибку 404.13 (ошибка IIS не Django) при этому если размер файла меньше чем некий лимит, то отдает 200.
В чем может быть проблема?
Если нужно, могу прикрепить web.config


Ответ

Поднимите лимиты размера запроса в конфиге:
Для модуля requestFiltering - скорее всего он у вас срабатывает:

И для httpRuntime:

Через UI, на server / site / app:

Перегрузка операции “>>” в с++

Как можно реализовать перегрузку операции >> так, чтоб выражение a>>b>>c (abc - объекты одного класса) работало следующим образом:
В объект c заносится значение объекта b, а в объект b - значение объекта a


Ответ

Операция при перегрузке должна возвращать старое значение правого операнда. Тогда результатом
a >> b
будет занесение в b значения a, а результат - старое значение b - будет занесено в c
Что-то вроде
#include
using namespace std;
class I { int i; public: I(int i = 0):i(i){} operator int() const { return i; } };
I operator >> (const I& a, I& b) { I c = b; b = a; return c; }
int main(int argc, const char * argv[]) { I a(3), b(4), c(5); a >> b >> c; cout << a << " " << b << " " << c << endl; }

Математика. Определитель матрицы n-го порядка


Помогите с задачей, не могу до конца додумать, что куда и как. Спасибо большое заранее!
Для начала я попытался изменить вторую строчку с помощью первой, у меня вышло:
x x+h x+2h ... x+(n-1)h 0 2x+h x+2h ... x+(n-1)h 0 -x x ... 0 ............................. 0 0 0 ... x
Если здесь что-то ещё менять то, -x из 3ей строчки не уходит, а я хочу привести матрицу к виду:
x x x x 0 x x x 0 0 x x 0 0 0 x
Чтобы можно было разложить на миноры по 1 эл-ту.
Далее я попытался вторую оставить без изменения, а 3ью строчку изменить с помощью первой, но там тоже получилась белиберда и далекая к истине матрица. Я думал может можно при помощи какого-нибудь столбца изменить другой, но тем самым больше проблем создам.
В принципе тут ещё одна идея - изменять вторую с помощью первой, третью с помощью второй и т.д., а потом выносить из каждой строчки множитель (x+h), но остаются единицы и нужному виду не придти. :(


Ответ

Ну, если я не ошибся...

Update Доказывается методом матиндукции. Для каких-нибудь 1, 2, 3 - легко посчитать.
Затем берем nxn и идем по последнему столбцу. Имеем минор для (x+nh) - получается простая матрица с одной диагональю из (-x)n, а для x в нижнем правом углу - наша формула для n. Умножаем, суммируем - все получается как надо :)
Update2

Перехват ссылок на файлы ASP.NET MVC

У меня есть legacy приложение windows, которое обращается к сайту для загрузки картинок, по ссылкам такого вида http://сдпп.рф/user_images/chat/5461fbe12552c.jpg . Этот сайт планируется выключить, т.к. мне нужен этот домен для будущей разработки сайта другой программы. Я собираюсь постепенно изучая ASP.NET написать новый сайт, но сейчас мне нужна заглушка которая обеспечит работу старых ссылок. Я написал такой код:
public class Users_imagesController : Controller { public ActionResult Chat() { NameValueCollection name_value_collection = Request.Params; return View(); } }
И ссылки вида http://сдпп.рф/user_images/chat/5461fbe12552c стали попадать в этот метод, но стоит добавить к пути расширение файла (.jpg), сразу ошибка 404


Ответ

Вы можете определить свой обработчик для картинок. Это пример обработчика.
public class UserInfoHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { /* Пример кода обработчика */ string result = "

Ваш IP: "+context.Request.UserHostAddress+"

"; result+="

UserAgent: "+context.Request.UserAgent+"

"; context.Response.Write(result); } public bool IsReusable { get { return false; } } }
а вот так обработчик прописывается в конфиг файл.

В вашем случае в path надо будет указать "*.jpg"
Источник - https://metanit.com/sharp/mvc5/19.5.php

Как получить текст ошибки запроса Retrofit

У меня есть следующий код, в котором я отлавливаю код ответа и бросаю собственные исключения.
OkHttpClient httpClient = new OkHttpClient.Builder() .connectTimeout(1, TimeUnit.MINUTES) .readTimeout(1, TimeUnit.MINUTES) .addInterceptor(chain -> { Request.Builder ongoing = chain.request().newBuilder();
//...
//build request Request request = ongoing.build(); Response response = null;
//process request try { response = chain.proceed(request); } catch (IOException e) { throw new NetworkException(e.getMessage()); }
if (response.code() == 400){ throw new ClientRequestException(); }
return response; }) .build();
retrofit = new Retrofit.Builder() .client(httpClient) .baseUrl(BASE_URL) .addConverterFactory(new NullOnEmptyConverterFactory()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();
Но в таком случае, мне нужно добавлять сообщение исключения самостоятельно, вопрос могу ли я как то из response получить текст ошибки которую мне отдает сервер?


Ответ

Тело ответа, где содержится ошибка может быть получено так:
String body = response.body();

Возможен ли шаблон со строго определёнными типами?

Есть функция, которая использует один из двух классов потомков и вызывается через std::thread(MyFunc, std::ref(SpecifiedClassType)).detach() У класса-родителя нет некоторых методов потомков, поэтому объявлять объекты потомков типом родителя не вариант.
Можно ли как-то указать какие именно классы могут быть переменной в этой функции, или кроме template вариантов нет?
Пояснение:
Есть класс Capture у которого два потомка - Camera и Screen. Назначение этой системы - получение кадров с камеры или скриншотов экрана - и более ничего (сети там быть не должно). У родителя есть общая для потомков функция GrabJPG, которая вызывается во внешней функции, в потоке. Я хочу, чтобы та функция MyFunc, что я упомянул в начале темы, выглядела примерно так:
void StreamThread(STREAMER &cgf, <только_тип_Camera_или_Screen> &source){ // где cfg - структура с параметрами сетевой конфигурации, // а source - источник кадров - камера или экран. // ... cgf.connection->open(cgf.host, cgf.port) // ... туда-сюда настройки while (cgf.connection->active()){ // ... int size = source->GrabJPG(&buffer); if( size){ cgf.connection->transmit(buffer, size); } // ... } }
Сейчас у меня два таких абсолютно одинаковых StreamThread-а, различающихся только одной переменной - классом камеры или экрана. Не красиво, согласитесь? Должна быть ошибка компиляции, если попытаться засунуть в функцию любой другой класс, не являющийся потомком Capture. Вот, что требуется.


Ответ

Есть несколько подходов к решению подобной проблемы:
Явное инстанцирование
+ Определения для обоих вариантов StreamThread будут сгенерированы автоматически на основе общего шаблонного кода с помощью директив явного инстанцирования (в том файле, где эти директивы будут указаны).
+ (C++11 и выше) Неявное инстанцирование шаблона функции StreamThread для шаблонных аргументов Camera и Screen можно запретить во всех единицах трансляции, куда будет подключен заголовочный файл StreamThread.h
– При попытке скомпилировать функцию StreamThread со значением шаблонного аргумента, отличного от Camera или Screen, будет выдана ошибка линковки (а не компиляции).
// StreamThread.h
template void StreamThread(SREAMER &cgf, Source &source);
extern template void StreamThread(SREAMER &cgf, Camera &source); // C++11 и выше
extern template void StreamThread(SREAMER &cgf, Screen &source); // C++11 и выше
// StreamThread.cpp
template void StreamThread(SREAMER &cgf, Source &source) { // ... }
template void StreamThread(SREAMER &cgf, Camera &source);
template void StreamThread(SREAMER &cgf, Screen &source);
Ограничение множества типов, которые могут использоваться в качестве аргумента шаблона, с помощью SFINAE
При использовании данного подхода будут выдаваться ошибки компиляции в случае несовпадения аргумента шаблонной функции с Camera или Screen
// StreamThread.h
#include
template std::enable_if_t || std::is_same_v> StreamThread(SREAMER &cgf, Source &source) { // ... }
+ При попытке скомпилировать функцию StreamThread со значением шаблонного аргумента, отличного от Camera или Screen, будет выдана ошибка компиляции (о том, что нужная перегрузка функции StreamThread не найдена).
– Шаблон функции StreamThread будет неявно инстанцирован во всех единицах трансляции, куда подключен заголовочный файл StreamThread.h и где происходит вызов функции StreamThread
Комбинированный подход
Объединяет два предыдущих варианта и совмещает в себе их плюсы.
// StreamThread.h
#include
template std::enable_if_t || std::is_same_v> StreamThread(SREAMER &cgf, Source &source);
extern template void StreamThread(SREAMER &cgf, Camera &source); // C++11 и выше
extern template void StreamThread(SREAMER &cgf, Screen &source); // C++11 и выше
// StreamThread.cpp
template std::enable_if_t || std::is_same_v> StreamThread(SREAMER &cgf, Source &source) { // ... }
template void StreamThread(SREAMER &cgf, Camera &source);
template void StreamThread(SREAMER &cgf, Screen &source);

Почему vertical-align: middle ниже середины?

div { background-color: blue; height: 36px; line-height: 36px; } i { background-color: red; display: inline-block; } i.top {vertical-align: top;} i.middle {vertical-align: middle;}

footopmiddlebaz


Ответ

Разобрался: для vertical-align: middle серединой является не середина родительского блока, а середина строчной буквы x. Но из-за того, что чаще всего высота x меньше высоты прописных букв, её середина оказывается немного ниже середины блока. При этом у дочернего блока (того, который с middle) для выравнивания берётся середина именно блока, и положение этой середины подгоняется под середину строчной буквы x родительского блока, в результате чего всё и съезжает.
Все точные съезжания зависят от текущего шрифта и его размера: если поставить шрифт, в котором высота всех букв будет одинакова, то middle может заработать как ожидается (правда, тогда появятся другие проблемы, но это другая история).
Формальное определение из стандарта
middle: Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.

Наследование, проблема с производным классом и динамич. массивом

Столкнулся с одной темой, которую никак не получается разобрать. Имеется следующий кусок кода с базовым классом Array и методом Input, в котором и кроется ошибка:
class Array { public: int *Mass, index; Array() { index = 0; }
virtual void summ(Array Data) {} virtual void foreach() {} void Input(); };
void Array::Input() { cout << "Массив : "; for (int i = 0; i < index; i++) { cin >> Mass[i]; } }
Также имеется производный класс:
class SortArray : public Array { public: SortArray() {} SortArray(int arrSize) { index = arrSize; int *Mass = new int[arrSize]; } void summ(Array Data); void foreach(); };
При попытке выполнить метод Input, для ввода чисел в массив производного класса возникает ошибка, поскольку память под динамический массив похоже была удалена, либо что - то другое. Где искать ошибку? Пробовал перекинуть сами методы, массив, изменять конструктор, но этот динамический массив так и выдает ошибку чтения. Как переработать код? Подскажите пожалуйста.
int arrSize; cout << "Введите размер первого массива: "; cin >> arrSize; SortArray Arr1(arrSize); Arr1.Input();


Ответ

Вот здесь
int *Mass = new int[arrSize];
вы выделили память, но указатель на нее сохранили не в поле класса, а в локальной переменной... И при выходе из конструктора, понятно, ее потеряли.
И еще - не оставляйте неинициализированных переменных. Например,
Array() { index = 0; }
чему после этого равен Mas? Мусору.
Впрочем, вообще вызывает недоумение - Array нигде ни разу не инициализирует Mas, но функция Input - именно в нем... Почему вы спроектировали иерархию именно так?

Как правильно обработать select

Доброго времени суток. Вопрос такой. Необходимо чтобы в форме было поле где указывается есть ли дети, а если да, то сколько их и их возраст. Реализовал это так:
$(document).ready(function() { var count = 6, i, j, el, child; var container = $('#child-amount'); el = $(document.createElement('select')).attr('class', 'child__amount-item'); container.append(el); for (i = 0; i < count; ++i) { child = $(document.createElement('option')); child.attr('value', i + 1); child.text(i); el.append(child); } el.change(function() { count = parseInt($(this).find(':selected').text()); for (i = 0; i < count; ++i) { el = $(document.createElement('select')).attr('class', 'child__old').attr('id', 'child__old_' + i); container.append(el); for (j = 0; j < 18; ++j) { child = $(document.createElement('option')).attr('id', 'child__old-item' + j); child.attr('value', j); child.text(j); el.append(child); } } }); });


Но понимаю, что это не совсем корректно реализовано, так как если выбрать сначала что детей скажем 2, то добавляется 2 selecta, но если тут же изменить количество детей на 1, то будет 3 selecta, то есть они просто приплюсуют. Кто подскажет как избежать этого? И еще необходимо, чтобы если количество детей больше 0, то к select с классом child__amount-item к классу добавлялась приставка, скажем _have - нужно для стилизации.


Ответ

И не назначайте элементам никакие id, они Вам не нужны.
$(document).ready(function() { var count = 6, i, j, el, child; var container = $('#child-amount'); el = $(document.createElement('select')).attr('class', 'child__amount-item'); container.append(el); for (i = 0; i < count; ++i) { child = $(document.createElement('option')); child.attr('value', i); child.text(i); el.append(child); } el.change(function() { var count = parseInt($(this).val()); if (count > 0) $(this).addClass("child-have"); else $(this).removeClass("child-have"); var $ages = container.find(".child__old"); // 1. delete if we have more than selected for (i = $ages.length - 1; i >= count; i--) { $($ages[i]).remove(); } // 2. create if we have fewer than selected for (i = $ages.length; i < count; ++i) { el = $(document.createElement('select')).attr('class', 'child__old'); container.append(el); for (j = 0; j < 18; ++j) { child = $(document.createElement('option')); child.attr('value', j); child.text(j); el.append(child); } } }); });


Получение get параметра в nginx

Нужно в nginx получить get параметр.
Например при запросе на http://my-example.loc/page1?foo=123 в конфиге nginx-а получить этот URL, get параметр foo и присвоить его в переменную.
Понимаю что задача элементарная, но от написания конфигов для nginx-а очень далек.


Ответ

Воспользуйтесь переменной arg_имяпараметра. В вашем случае arg_foo
Также существует переменная args, в которой хранится полная строка аргументов.

Чтобы проверить, был ли параметр передан, можно воспользоваться if-ом:
if ($arg_foo) { rewrite ... break; }
Или чтобы проверить, параметр на какое-то конкретное значение:
if ($arg_foo = bar) { rewrite ... break; }

Не отображаются кириллические символы в терминале Debian у программ на Java скомпилированных в Win10

Собственно установил я себе недавно Debian 9, не смотря на то что в линуксе новичек проблем особых не было. Установил себе jdk 8 от Oracle решил проверить работоспособность и получил странный результат, те файлы которые я создал и скомпелировал в линуксе отображают кирилицу в консоле без проблем.
Файлы же скомпилированные в Win10 показывают всякую ерунду. Хотя сама консоль настроена и работает верно, локаль и utf 8 итд.
И в win10 и debian создавал файлы в sublime text 3.
В чем может быть проблема?
PS: В java и debian новичек так что это может быть стандартная ошибка.

Извиняюсь что не получилось ответить сразу, да это скорей всего из-за кодировки. Но из-за какой именно кодировки я так и не понял.
Провел небольшой тест: Создал три файла, все три сделал в SublimeText3 и сохранил с кодировкой UTF-8. Вот что было внутри.
class Test_Win10_Default { public static void main(String[] args) { System.out.println("ABCabc"); System.out.println("АБВабв"); System.out.println("àéèç"); } }
Первый файл скомпилировал в командной строке WIN10, второй файл был скомпилирован там-же в командной строке, но перед этим я написал команду chcp 65001 поменяв кодировку командной строки на UTF-8. Результат такой, оба файла отображали символы корректно толь после того как я менял кодировку, при это закрывая командную строку кодировка не сохранялась и приходилось опять вводить команду на её смену.
Далее, я перешел в Debian и создал файл с точно таким же кодом, там всё работало нормально. Файлы созданные в Виндовс не работали, оба. Перейдя же обратно в Виндовс я обнаружил что третий файл созданный в Линукс не работает в Виндовс. Даже после смены кодировки терминал отображал первые две строки, а вот третью с французскими буквами, он не понимал.
В общем я запутался в конец. Неужели нет способа поставить одну кодировку Юникод в обеих системах чтобы больше не думать о таких вещах?


Ответ

По умолчанию компилятор использует системную кодировку. В Windows это cp1251. Поэтому собранные под Windows классы показывают крякозяблы. Чтобы этого избежать, необходимо явно указать компилятору какую кодировку использовать
javac -encoding utf-8 Test_Win10_Default.java
Впрочем, вывести символ à в консоль cmd вам это всё равно не поможет. Ничто не поможет нормально выводить двухбайтовую кодировку в консоль заточенную под использование однобайтовой cp866.

Добавление title в SVG средствами JS

Как с помощью JS добавить правильно к элементам SVG , чтобы визуально появлялось сообщение, размещенное внутри tooltip? SVG грузится , а не рисуется на JS.<br><object id="idImageSVG" class="svgClass" /object> <br>Добавлять tooltip в runtime, а не встраивать в SVG? </p><br><h3>Ответ</h3><p style="text-align: justify; font-size: 14px;"> Это в данном вопросе без разницы, как вы добавляете svg в HTML. Если вы добавляете файл svg, через object, то потом будете использовать элементы svg внутри HTML странички через команду use <br>Главное, чтобы, код реализующий title svg был рабочим. А каким способом вы его добавите не имеет значения. Либо в самом файле svg, либо динамически c помощью JS <br>Чтобы тултип срабатывал необходимо его разместить внутри тега группы <g> <br>Пример создания svg tooltip. Удерживайте курсор на фигурах до появления тултипа <br> <meta charset="utf-8"> <svg width="50%" height="50%" viewBox="0 0 400 400"> <g id="titleRect"> <title> Это зеленый квадрат Это пурпурный круг
Добавление svg файлов в HTML:
Your browser does not support SVG
Другие способы добавления svg в HTML

Interlocked.Increment внутри lock

Смотрю на код из статьи и не могу понять, в чём смысл использования Interlocked.Increment внутри lock. Зачем он там?
public class Node { public const int InvalidId = -1; private static int s_idCounter;
private int m_id;
public int Id { get { if (m_id == InvalidId) { lock (this) { if (m_id == InvalidId) { m_id = Interlocked.Increment(ref s_idCounter); } } }
return m_id; } } }


Ответ

Представьте, что у вас несколько экземпляров Id в многопоточном приложении и если они используются в разных потоках (каждый - в своем), оба потока могут оказаться одновременно внутри lock, т.к. для блокировки будут использованы разные объекты (this же). Поэтому использование Interlocked здесь не лишнее и оправдано.
Использование Interlocked было бы не нужно, если бы для всех/разных экземпляров для блокировки был использован один какой-то специально созданный статический объект, но это привело бы к некоторой потере скорости при одновременном доступе к разным экземплярам Id

Git: как “раскоммитить” последний коммит

Ситуация:
Работал над задачей А, но появляется срочная задача В, которая не может ждать ни минуты. И получается:
1) Для сохранения промежуточных изменений я делаю commit в ветке А
2) Переключаюсь на ветку В, фиксю баги, пушу
3) Возвращаюсь на ветку А и хочу, чтоб все изменения, которые я второпях закоммитил, стали снова modified (чтоб в IDE сразу видеть, над какими файлами работал)
Подскажите, как это можно сделать?


Ответ

Используйте git stash
Положить файлы в карман:
git stash
После этого можно переключаться на другую ветку, работать.
После того, как вам нужно вернуть файлы на место даёте команду
git stash apply
Другие полезные команды при работе с карманом:
git stash list
и
git stash drop
PS Но если всё-таки вдруг ну ОЧЕНЬ ХОЧЕТСЯ раскоммитить последний коммит, то есть замечательная команда:
git reset HEAD~

Как сделать так чтобы при разворачиваемости div блок на все строку?

У меня такая проблема, допустим вот пример
$('.header').click(function(){ if($(this).hasClass('expand')){ $(this).closest('table').find('.header').addClass('expand'); $(this).closest('table').find('.child').remove(); $(this).removeClass('expand').after('

blahblahblahblahblahblahblahblah

Привет мир

'); } else { $(this).addClass('expand').parent().find('.child').remove(); } }); table, tr, td, th { border: 1px solid black; border-collapse:collapse; } .header:hover{ cursor: pointer } .header .sign:after{ content: '-' } .header.expand .sign:after{ content: '+' }
Класс Код Город Дата создание Дата редактирование
Мебель 1 Казань 2017-03-10 10:00:00 2017-03-10 10:30:00
Электроника 2 Москва 2017-03-15 09:15:00 2017-03-15 10:30:00
Бытовая химия 3 Санк-Петербург 2017-03-10 10:00:00 2017-03-10 10:30:00

Когда разворачиваешь строку. то весь div блок равняется под столбец, а мне нужно чтобы она шла под всю строку. А то как-то некрасиво получается и если там будут 3 колонки в блоке, то таблица 1 столбец будет вообще громадная. А мне бы хотелось, чтобы таблица сохраняла свои пропорции


Ответ

Добавляйте в таблицу строку с одной ячейкой, перекрывающей пять существующих.
$(this).removeClass('expand') .after('

blahblahblahblahblahblahblahblah

Привет мир

');
Там только есть минус, в том, что если подключить bootstrp и использовать класс col-xs-, то не совсем удобно выходит. https://jsfiddle.net/hollanditkzn/x2bcukw7/12/
Поставьте не два col-xs-4, а два col-xs-6 - общее количество бутстраповских колонок должно равняться 12-ти.

Возврат указателя на локальную переменную C++

Есть два варианта функции. Почему не работает первый - понятно, но почему тогда срабатывает второй вариант?
Первый:
int* f() { int b = 10; return &b; }
Второй:
int* f() { int b = 10; int* a = &b; return a; }


Ответ

Окей, в вашем вопросе на самом деле несколько вопросов.
Во-первых, ваш код, оба его варианта, очевидно неверен, так как локальные переменные умирают вместе с фреймом стека функции, в которой они определены.
Почему первый вариант не компилируется? Компилятор, очевидно, видит, что вы возвращаете указатель на локальную переменную, и выдаёт ошибку (или, скорее всего, предупреждение).
Почему же тогда второй вариант компилируется? Дело в том, что компилятор не обязан ловить вас за руку каждый раз, когда вы совершаете ошибку. Он не будет рассматривать то, откуда пришли значения во всех переменных, которые вы возвращаете. Если в первом случае он вам помог (потому что это было легко), то во втором он просто решил этого не делать (потому что ему пришлось бы анализировать, откуда пришло значение переменной a). C++ — язык для взрослых, он считает, что программист читал документацию, понимает, что он делает, и компилятор не надоедает программисту излишними предупреждениями.
Да, а почему второй вариант работает? А случайно. У вас в стеке случайно ничего не затёрло переменную, расположенную в ничьей памяти. Вот эту самую ничью память случайно никто не забрал. А мог забрать в любой момент. Просто не делайте так, иначе никаких гарантий нормальной работы программы нет.
Если делать по правилам, программа будет работать. Если делать не по правилам, она может работать, а может и нет.

ScrollTop работает некорректно

$(document).ready(function(){ if($(document).scrollTop() > 500){ $(".fading").animate({opacity:1},2000); } });
Когда прокручиваю страницу, то animate не запускается. Но стоит обновить страницу на отметке в 500px и ниже, как скрипт начинает работу. Как сделать, чтобы скрипт включался именно при скроле?


Ответ

Вы, вероятно, хотели проверять это на событие прокрутки, а не только в $(document).ready
$(document).ready(function(){ $(window).scroll(function() { if($(document).scrollTop() > 500){ $(".fading").animate({opacity:1},2000); } }); $(window).scroll(); });

Цвет фона при скроле

Доброго времени суток! Есть один вопрос к знатакам.. Сделал я фиксированое меню с якорями, но есть проблема: Когда я скролю вниз, у меня к прозрачному меню, то есть начальное меню в шапке (на слайдере, если точнее быть), прописывается фон синего цвета. Но, когда я перезагружаю страницу, у меня фон опять прозрачного фона, хотя я нахожусь не на начальной секции (header), а, например, секция resume
Вопрос: как реализовать прикрепление синего фона, если user будет делать релоад (reload) страницы на конкретном якоре (не в начальной позиции, где прозрачный фон шапки) и js будет добавлять css свойство этого же синего фона?
Возможно есть готовые скрипты, пока не нашел.. решил спросить здесь, возможно кто-то уже такое делал при верстке. Вот код:
$(window).scroll(function(){ if($(window).scrollTop() < 300){ $("#ap-head").css("background","transparent") } else { $("#ap-head").css("background","linear-gradient(to right, #01aed9, #01cec7)") } });
Вот css:
#ap-head{ z-index: 99; position: fixed; top: 0; left: 0; right: 0; width: 100%; background: linear-gradient(to right, #01aed9, #01cec7); line-height: 1; transition: all 0.25s ease; }


Ответ

Вы это делаете при $(window).scroll(function(){. И то же самое должны сделать при загрузке страницы. То есть при $(document).ready(function(){});
$(document).ready(function(){ if($(window).scrollTop() < 300){ $("#ap-head").css("background","transparent") } else { $("#ap-head").css("background","linear-gradient(to right, #01aed9, #01cec7)"); } });

Выделение памяти без инициализации с помощью оператора new

Возможно ли с помощью оператора new сделать что-то вроде этого:
class MyData { char data[1024]; MyData() {} };
MyData* dataArray = static_cast(malloc(10 * sizeof(MyData)));
Т.е. выделить память под объект или массив объектов без ее инициализации?


Ответ

Конечно. Можно использовать тот же malloc, а можно использовать operator new (или operator new[]), который выделит кусок "сырой" памяти. Отличие operator new от operator new[] - фактически в том, что можно более эффективнее реализовать собственные версии этих операторов. Так что всё, что сказано про operator new, относится и к operator new[]
operator new также запрашивает непрерывный кусок памяти, и возвращает указатель на "нечто" (void*). Никакие конструкторы эта штуковина тоже не вызывает, но уже знает о исключениях и если выделение не удастся, то, кинет исключение, а не вернет nullptr (хотя это не всегда выполняется). На самом деле, сначала еще попытает счастье с new_handler, но опустим этот момент. Также есть версия, которая не кидает исключение, а возвращает nullptr в случае неудачи и версия, которая совсем не выделяет память, а просто параметр-указатель проходит там "транзитом" (такая версия используется для placement new), причем можно еще и перегружать operator new, но сейчас не об этом.
Для освобождения памяти, выделенной с помощью operator new, используется operator delete
Для освобождения памяти, выделенной с помощью operator new[], используется operator delete[]
void *p = operator new(sizeof(T) * count); operator delete (p);
Вызвать конструкторы для инициализации можно с помощью placement new
T *pT = new (p) T[count];
Конечно же, при таком подходе вызов конструкторов и деструкторов целиком на авторе кода.

Как раскодировать BSON в JSON?

Есть строка в формате BSON (закодированная в base64), как раскодировать ее в JSON-строку?
Строка в таком виде
ugEAAAMwAGsAAAACX2lkAAsAAAAxNUdaczF4UWt3AAJVc2VyQnVpbGQAJQAAADRlMTI3VzEwN3M2N1MxYjc4ZjEwM1U5MHkzN3cxMDBlMTE5ZwAIVXNlckZ1bGxBY2Nlc3MAAQhVc2VyQ2FuQWRkAAAAAzEAagAAAAJfaWQACwAAADV2QlV2ZWdsVm4AAlVzZXJCdWlsZAAkAAAANzF6MTIySjEwM1Y2OFI4MmU4M2o4NWI5OHE2MG45Nms1MloACFVzZXJGdWxsQWNjZXNzAAAIVXNlckNhbkFkZAAAAAMyAGoAAAACX2lkAAsAAAAwWk81anpwb3MzAAhVc2VyRnVsbEFjY2VzcwABAlVzZXJCdWlsZAAkAAAAMTA3TTEyMEwxUDg4WjY3czczQTk0ZDcwRTk3ajEwMWsyNEUACFVzZXJDYW5BZGQAAAADMwBqAAAAAl9pZAALAAAAb0prbDhyZk9GbwACVXNlckJ1aWxkACQAAAAxMjNXODNkOTRpMTRPNjVMOTRFMTI1VTExM3Y2MXU1OFQ4VQAIVXNlckZ1bGxBY2Nlc3MAAQhVc2VyQ2FuQWRkAAAAAA==
В документации сказано, что это:
bson результат запроса, закодированный в base64
Раскодировать base64 пробовал так
function Base64Decode(S: string): string; var i, a, b, X: Integer; begin a := 0; b := 0; for i := 1 to Length(S) do begin X := pos(S[i], Cod) - 1; if X >= 0 then begin b := b * 64 + X; inc(a, 6); if a >= 8 then begin dec(a, 8); X := b shr a; b := b mod (1 shl a); X := X mod 256; Result := Result + chr(X); end; end else Exit; end; end;
После такого раскодировывания получилась строка
'â£'#$008A'(¥º)'#$D#$008A'(¢'#$008C#$0084'+î('#$00AD#$008A'(¢»]éä'#$009B'ÓÄz'#$D'Ã(¤ß'#$0098'''ük'#$17'ó'#$0095#6#$008A'M¢'#$008A'(ÖïYÔ'#$0083#$7F'Óº\5'#$0082'\'#$15'»'#$008A'Ù'#$0084#$008E'ÓºX'#$17#$0085'Y'#$1B'½\9»XÒïYÓ'#$0085#$008F'¢'#$0092'~'#$15'ï'#$009A'èÁ'#$0095#$E'Ë'#$0088'%ï'#$0098'5'#$008A')ªß'#$0098'''üh#øj'#6'î(¢'#$008A'+Ó'#$008A#$0092'¢'#$008A'(¤é'#$0092#6#$008A'3¢'#$008A'(×Âj÷Â'#$008E#9'ö'#$7F#1#$A'*÷ý'#$008E#$14'Ì'#$009E#$B'ö'#$008C'¢®(¢'#$008A'_ÓÆYÔ¼rÓºX'#$18#$0082'`ô'#$0084'['#7#$0084'X,'#$0084'^'#4#$0085'a'#$13#$0082'Y'#1#5'_'#$D#$0081'Zü'#$008A'0÷ý'#$008E#$14'Ð'#$009E#$E'öj'#5'í'#$008E#$15'ý(¢'#$0092'~'#$15'ï'#$009A'åë'#$0096'ãî'#$008C'¢'#$008A'(¥¼)'#$C#$008A'(¢'#$008C#$0084'+î('#$00AD#$008A'(¢º'#$0082'â'#1#$0093#$1C'ú'#$0094'5½(ªß'#$0098'''üo'#$17'ö'#$0094'ãí'#$0088'''ý'#$009B'¢'#$008B'*÷ý'#$008E#$14'Ì'#$009E#$B'ö'#$008C'¢®(¢'#$008A'YÒ'#$0083'uÓ¼Xî»xÚ'#$0084#$0082'Ø'#$0083#$009B'Ù½iÛ'#$0080#$008C'ÙºmÛ'#$0083#$0092'ÓºZ'#$D'¼\ç'#$008A'0÷ý'#$008E#$14'Í'#$008A#1'K'#$008D#6#$008A'(¢'#$008D'[¢ô(¢'#$008A'*òs'#$008C'¢'#$0095'(¢'#$008A#$0094#$C'õ'#$0094'Úü'#$008E'âP'#$0097'¢'#$008C'~'#$15'ï'#$009A'äÁ'#$0092#$E'î(Æ'#$008A'(¢»ZÕá`ÕîaÖóYÖÙ^×ÖaÖÏYÔ'#$0081'}Ó»X8'#$0082'Z'#$17#$0081'`ö'#$0084'}¢'#$0092'~'#$15'ï'#$009A'èÁ'#$0095#$E'Ë'#$0088'%ï'#$0098'5'#$008A')ªß'#$0098'''üh#øj'#6'î(¢'#$008A'('


Ответ

Это можно сделать вот так:
uses System.NetEncoding; ... var VBson: string; VJson: string; begin VBson := 'ugEAAAMwAGsAAA... VJson := Bson2Json(TNetEncoding.Base64.DecodeStringToBytes(VBson)); Writeln(VJson); end;
За декодирование BSON отвечает следующий код (взят из этих сорцов):
uses Classes, System.JSON, System.JSON.BSON, System.JSON.Writers, System.SysUtils;
type TJsonStringWriter = class(TJsonTextWriter) private FStrinBuilder: TStringBuilder; FStringWriter: TStringWriter; public constructor Create; destructor Destroy; override; function ToString: string; end;
{ TJsonStringWriter }
constructor TJsonStringWriter.Create; begin FStrinBuilder := TStringBuilder.Create; FStringWriter := TStringWriter.Create(FStrinBuilder); inherited Create(FStringWriter); end;
destructor TJsonStringWriter.Destroy; begin FStringWriter.Free; FStrinBuilder.Free; inherited Destroy; end;
function TJsonStringWriter.ToString: string; begin Result := FStrinBuilder.ToString; end;
function Bson2Json(const ABytes: TBytes): string; var JsonWriter: TJsonStringWriter; BsonReader: TBsonReader; Stream: TBytesStream; begin Stream := TBytesStream.Create(ABytes); BsonReader := TBsonReader.Create(Stream); JsonWriter := TJsonStringWriter.Create; try JsonWriter.WriteToken(BsonReader); Result := JsonWriter.ToString; finally JsonWriter.Free; BsonReader.Free; Stream.Free; end; end;

Ни с одного браузера не скачивается файл

Знаю, это напрямую не связано с программированием, тем не менее, проблема есть. https://2appstudio.com/journey/ Вот с этого сайта не могу скачать ни 32-, ни 64-битную версию для Windows. Тоже самое и в Firefox, примерно. Помогите, пожалуйста. Программа уж больно понравилась. Спасибо заранее.


Ответ

Настроить хром так, чтобы он не удалял подозрительные файлы самостоятельно: https://superuser.com/questions/387724/how-to-disable-download-scanning-protection-of-new-chrome-17 Выбрать сохранение скачанного файла в следующем запросе:

Отправка пользователю сообщения посредством MSG вызваным из JAVA

Имеется следующий JAVA код созданый и скомпилированый в БД Oracle.
create or replace and compile java source named windowserrors as public class OpenWindows { public static void ErrorText() { try { Process proc = Runtime.getRuntime().exec("Msg * ошибка"); while (true) { try { proc.waitFor(); break; } catch (Exception t) { t.getMessage(); } } } catch(Exception e) { e.getMessage(); } } }
Этот код должен запускать рассылку сообщений (для примера всем пользователям), о том, что совершена ошибка. Написана простая процедура, которая должна его запускать на выполнение, а так же, собственно, сам вызов процедуры.
PROCEDURE Rise_error AS LANGUAGE JAVA NAME 'OpenWindows.ErrorText()';
BEGIN p_oms_patreg.Rise_error; END;
Но, при вызове процедуры ORACLE отрабатывает, но не выводится окно с сообщением. Хотя если запустить данный код на исполнение, например, в Eclipse - появляется соответствующее окно.
Перерыв достаточно много информации, так и не нашел подобный вариант реализации.


Ответ

Проверил, код выполняется нормально.
Убрал проглатывание ошибок:
create or replace and compile java source named windowserrors as public class OpenWindows { public static void ErrorText() throws Exception { Process proc = Runtime.getRuntime().exec("Msg * ошибка"); proc.waitFor(); } }
Создал процедуру:
CREATE OR REPLACE PROCEDURE Rise_error AS LANGUAGE JAVA NAME 'OpenWindows.ErrorText()';
Вызвал ее:
begin rise_error(); end;
Первый раз, вылезло ORA-29532 с сообщением о нехватке привилегий. Выдал привилегии, создал новое подключение к БД и выполнил заново. На сервере БД появилось сообщение (из-за кодировки поехала кириллица, но это уже другой вопрос).
Убедитесь, что:
отключен перехват ошибок в Java (смотрите код выше); выполняется именно нужная процедура (нет ли здесь путаницы: p_oms_patreg.Rise_error;); наличие сообщений проверяется на сервере БД, на котором выполняется код.

Фильтрация блоков по data атрибутам

  • Item 1
  • Item 2
  • Item 3
  • Item 4
  • Item 5
  • Item 6
  • Item 7
  • Item 8

Есть 2 select (может быть и больше), как реализовать фильтрацию по значениям из селектов по Data атрибутам.
Например если в первом select выбран параметр SMG то показываются элементы с item 3, item 7, item 8(остальные скрываются), и если указать во втором селекте например параметр Extraordinary, то показываются только item 4, item 8


Ответ

$(".select-type, .select-class").change(function(){ var dType = $(".select-type option:selected").data("sort"); var dClass = $(".select-class option:selected").data("sort"); $("#items li").each(function(){ if ( (dType == "all" || dType == $(this).data("type")) && (dClass == "all" || dClass == $(this).data("class")) ) { $(this).show(); } else { $(this).hide(); } }); });

Как получить доступ к значению переменной, созданной внутри фигурных скобок в shell

Дано:
Код, разбивающий строку по точке и складывающий полученные части в переменные.
sh """ version='1.2.3.4'
echo \$version | { IFS=. read a b c d; echo \$a; }
echo \"a\" \$a """
При запуске получаем вот это:
+ version=1.2.3.4 + IFS=. read a b c d + echo 1.2.3.4 + echo 1 1 + echo a a
Проблема:
Из-за фигурных скобок переменные, в которых лежит нужные значения, недоступны.
Вопрос:
Каким образом получить значения переменных a, b, c, d за пределами фигурных скобок?


Ответ

А почему бы не прочитать сразу все значения в массив:
IFS='.' read -r -a arr <<< "${version}"
Результат:
[ ~]# echo ${arr[@]} 1 2 3 4 [ ~]# echo ${arr[0]} 1 [ ~]# echo ${arr[1]} 2 [ ~]# echo ${arr[2]} 3 [ ~]# echo ${arr[3]} 4
или так:
IFS='.' read -r -a a b c d <<< "${version}"

google api vision обнаружить на картинке текст и перевести его [закрыт]

Не смог накопать в документации нормальные примеры.


Ответ

Не знаю как сразу читать текст с картинки на русском (если на него надо переводить), но вот после считывания это вполне реализуется с помощью тех же google api
#!/usr/bin/python # -*- coding: utf-8 -*- from google.cloud import vision from google.cloud.vision import types from google.cloud import translate
translate_client = translate.Client()
client = vision.ImageAnnotatorClient()
file_name = os.path.join( os.path.dirname(__file__), 'some_photo.jpg')
with io.open(file_name, 'rb') as image_file: content = image_file.read()
image = types.Image(content=content)
def translate(text,target): returns_text='' for i in text: translation = translate_client.translate(i, target_language=target) returns_text+=translation['translatedText'] return(returns_text)
def detect_document(image): response = client.document_text_detection(image=image) document = response.full_text_annotation returns_text=[] for page in document.pages: for block in page.blocks: block_words = [] for paragraph in block.paragraphs: block_words.extend(paragraph.words)
block_symbols = [] for word in block_words: block_symbols.extend(word.symbols) block_symbols.extend(' ')
block_text = '' for symbol in block_symbols: if(type(symbol)==str): block_text = block_text + ' ' else: block_text = block_text + symbol.text returns_text.append(block_text) return(returns_text)
print(translate(detect_document(image), 'ru'))
https://cloud.google.com/vision/docs/reference/libraries

Минимальный гамильтонов циклов для каждого подмножества вершин графа

Имеется граф с n вершинами, необходимо для каждого подмножества вершин (всего 2n подмножеств) найти длину минимального простого цикла, проходящего через каждую вершину подмножества.


Ответ

(А). Сначала решим задачу нахождения минимальной длины всех простых циклов, содержащих вершину ноль (нумерация вершин с нуля). Воспользуемся динамическим программированием. Будем рассматривать простые пути из вершины ноль в вершину i
0 = v1 → v2 → ... → vk-1 → vk = i
Нам не важно в каком именно порядке были посещены вершин, поэтому будет хранить только битовую маску посещённых вершин (то есть число mask от нуля (включительно) до 2число вершин (невключительно), такое что его i-ый бит равен единице ⇔ была посещена вершина i). Заведём двумерный массив:
dp[i][mask] — минимальная длина простого пути из вершины ноль в вершину i, проходящего через вершины, задаваемые битовой маской mask
Изначально dp[0][20] = 0, остальные элементы равны бесконечности. Сделаем динамику вперёд: будем перебирать последнюю вершину и маску посещённых вершин и пытаться пойти в каждую из непосещённых вершин. Также будем обновлять ответ — путём замыкания пути, то есть добавления ребра последняя вершина → стартовая вершина
Работает это за O(n2 * 2n)

(Б). Теперь решим исходную задачу. Можно было бы перебрать каждую вершину и решить задачу (А) с этой вершиной в качестве стартовой, получилось бы O(n3 * 2n)
Но так ответ для каждого подмножества будет считаться несколько раз — по разу для каждой вершины, входящей в подмножество (когда эта вершина была исходной). Можно этого избежать, сделав так, чтобы для каждого подмножества была выделенная исходная вершина. Например, в качестве неё можно взять вершину с максимальным номером.
Таким образом, мы будем перебирать каждую вершину, запускать алгоритм из пункта (А) с этой вершиной в качестве стартовой, но будем рассматривать только пути, проходящие через вершины с номерами меньшими номера стартовой вершины. Так мы обеспечим, что ответ для каждого подмножества будет подсчитан один раз.
Работает это за = O(n2 * 2n)

#include #include using namespace std;
int main() { // считаем что граф является полным и вводится с клавиатуры, // сначала число вершин n, // затем матрица смежности графа (квадратная матрица размера n) int number_vertexes; cin >> number_vertexes; vector> distances(number_vertexes, vector(number_vertexes)); for (vector &line : distances) { for (double &distance : line) { cin >> distance; } }
// подмножество задаётся битовой маской из диапозона [0, 2^n) // i-ый бит равен единице ↔ вершина i входит в подмножество int mask_count = 1 << number_vertexes; const double max_double = numeric_limits::max(); // answer[mask] == ответ для подмножества, задаваемого mask vector answer(mask_count, max_double); // ответ для пустого подмножества точек --- ноль answer[0] = 0;
for (int start_point = 0; start_point < number_vertexes; ++start_point) { // чтобы не считать ответ для каждой подмаски много раз // выберем для каждой подмаски стартовой вершниу --- вершину с наибольшим номером // таким образом для стартовой вершины i можем считать что существуют только вершины [0..i-1] // это значительно ускорит перебор int number_points_current = start_point + 1; int mask_count_current = 1 << number_points_current;
// для каждой вершины start_point посчитаем динамику: // dp[i][mask] --- минимальная длина простого пути из вершины start_point в вершину i, // проходящего через вершины, задаваемые битовой маской mask // (start_point и i входят в mask) vector> dp(number_points_current, vector(mask_count_current, max_double)); dp[start_point][1 << start_point] = 0;
// динамика вперёд: перебираем последнюю вершину и маску посещённых вершин, for (int mask = 0; mask < mask_count_current; ++mask) { for (int last_point = 0; last_point < number_points_current; ++last_point) { // если существует путь из начальной вершины в последнюю if (dp[last_point][mask] != max_double) { // пытаемся пойти из последней вершину в каждую, ещё не посещённую for (int next_point = 0; next_point < number_points_current; ++next_point) { if ((mask & (1 << next_point)) == 0) { int next_mask = mask | (1 << next_point); double next_distance = dp[last_point][mask] + distances[last_point][next_point]; dp[next_point][next_mask] = min(dp[next_point][next_mask], next_distance); } }
// пытаемся пойти из последней вершину в стартовую, то есть замкнуть путь double next_distance = dp[last_point][mask] + distances[last_point][start_point]; answer[mask] = min(answer[mask], next_distance); } } } }
// как-нибудь используем полученный массив answer
return 0; }

Исчерпано время ожидания при авторизации через ЕСИА

Пытаюсь настроить авторизацию личного кабинета через сервис ЕСИА (все необходимые данные системы были зарегистрированы на портале, разрешение на доступ к тестовому сервису получено). После отправки запроса на получение авторизационного кода и после ввода на форме данных тестового пользователя ЕСИА, вместо редиректа на указанный в параметрах адрес, выводит сообщение о том что время ожидания исчерпано. Подскажите, пожалуйста, с чем это может быть связано? P.S. отправляю данные на адрес https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac примерно следующего содержания:
client_id=MY_ID client_secret=MIIEpzCCA4+gAwI... redirect_uri=https%3A%2F%2Fsite.ru%2Fregeca%2Fesia.php scope=openid response_type=code state=f60f1929-b879-4fab-8228-6ae28f8ca7b7 access_type=offline timestamp=2018.01.15+13%3A47%3A15+%2B18000
P.P.S. Как я понимаю, проблема возникает из-за значения в переменной timestamp. Web-сервер находится во временной зоне Екатеринбурга, web-сервер также настроен на эту зону.


Ответ

Обычно такое сообщение означает, что параметр timestamp не валиден, не актуален в большую или меньшую сторону. Системе необходимо синхронизировать время с ресурсом . Логи можно посмотреть по адресу.
P.S. Обнаружила, что для того чтобы получить логи в нормальном виде, к ним нужно заходить к ip-адреса, на котором стоит домен информационной системы (ту, что регистрировали в ЕСИА). По крайней мере, у меня только так получилось посмотреть ответ на запрос. (Получилось зайти с другого ip, так что скорее всего это был какой-то сбой)
P.P.S. Ошибка с исчерпанием времени ожидания была решена после того как был передан верный параметр timestamp. В соответствии с инструкцией timestamp имеет формат yyyy.MM.dd HH:mm:ss Z, в php этот параметр нужно формируется следующим образом:urlencode(date('Y.m.d H:i:s O'))

Ввод тега в текстовое поле

Здравствуйте. Есть проблема с вводом данных в текстовые поля. Табличка в которую помещаются данные, формируется с помощью Table и постепенным собиранием её. Т.е. в Table записываются TableRow в них в свою очередь TableCell и туда запихиваются данные. Проблема в следующем. Допустим в тестовое поле записываем произвольный текст и перед этим текстом пишем

Ответ

Здравствуйте. Поробуйте прогонять ваш текст через HttpUtility.HtmlEncode.
HtmlEncode(String) Преобразует строку в строку в кодировке HTML.
Источник
Пример:
using System.Web;
namespace ConsoleApp1 { class Program { static void Main(string[] args) { var result = HttpUtility.HtmlEncode("

Создать динамические URL в HTML на основе JavaScript

Провожу эксперимент с использованием AMT Amazon Mechanical Turk, требуется перенаправлять пользователей с AMT по ссылке на сервер, где они, собственно, принимают участие в эксперименте.
В чем суть проблемы? Чтобы попасть на сервер, пользователям требуется ввести логин и пароль. У каждого пользователя на AMT имеется ID код, по которому я могу их распознавать - этот ID выполняет функцию логина. Пароли я генерирую заранее (токены), выглядят они примерно так: 4801151f-7489-49cc-a9ce-9c027fe43fcd. Страница задания написана в html цель: написать код, который бы создавал динамические ссылки для каждого пользователя индивидуально.
Пример такой ссылки (шаблон): http://127.0.0.1:8000/?name=AMAZON_ID_NUMBER_IS_HERE&token=TOKEN_IS_HERE То есть ссылка сама выглядит как ниже (с изменяющимся токеном и id) http://127.0.0.1:8000/?name=AD11235543&token=36473gv-dbdb543-rhr35-edef
Попытался поработать над кодом, но я что-то делаю не так.
click the link

Контент для html файла:
Click to enter
Все оказалось проще, чем я думал. Но есть другая проблема: на место токена требуется вставлять всякий раз новый токен. Токены хранятся в отдельном txt файле, который javascript должен считывать в html...

utf-8' codec can't decode byte 0x89 in position 0: invalid start byte при открытии фото

Имеется Django модель user.path, в которой лежит название фото в формате
"{:%Y-%m-%d %H-%M-%S}.png".format(datetime.now())
Тоесть вот такого вида 2018-01-19 12-17-07.png
Пытаюсь отправить ее пользователю
ppath = 'путь к директории с фото' photo = open(ppath + urllib.parse.unquote_plus(user.path))
Но в итоге получаю ошибку
utf-8' codec can't decode byte 0x89 in position 0: invalid start byte


Ответ

Почему open(..., 'rb') помогло?
Дело в том, что без по умолчанию open открывает файлы в режим чтения r. Этот режим включает в себя чтение массива байтов и приведение его к строке, используя указанную кодировку (или системную кодировку, если не указывать).
Файлы фотографий (картинок) являются бинарными файлами, поэтому попытка получения из них текста в указанной кодировке, скорее всего, вызовет ошибку:
ppath = 'путь к директории с фото' photo = open(ppath + urllib.parse.unquote_plus(user.path))
Поэтому, открытие файла в бинарном режиме и помогло:
ppath = 'путь к директории с фото' file_name = ppath + urllib.parse.unquote_plus(user.path) photo = open(file_name, 'rb')

Вычисление координат внутри svg


Есть такой пентагон, по нему построена svg фигура вот такая

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


Ответ

Каждая линия задаётся двумя точками, начальная и конечная.
Такая линия легко параметризуется с помощью векторной геометрии.
A - начальная точка, её координаты {ax,ay} B - конечная точка, её координаты {bx,by}
B - A - Вектор идущий от A к B
A + t * (B - A) формула расчёта любой точки на отрезке AB t лежит на отрезке [0,1]
Получаем формулу для расчёта x компоненты точки и y
x = ax + t * (bx - ax); y = ay + t * (by - ay);
Таким образом мы можем в зависимости от t задавать координаты любой точки на любом отрезке.

Возможно ли изменить ширину фигуры Svg ?

Вот SVG изображение. В нем я пытаюсь уменьшить ширину

Сниппет:


Ответ

Из вопроса непонятно, какую ширину вы хотите уменьшить:
Уменьшить ширину самой фигуры, но насколько уменьшить не ясно. Уменьшить ширину места, которое занимает svg внутри HTML?
Если первый вариант, то необходимо в векторном редакторе перерисовать фигуру нужной ширины и длины. Для этого откройте векторный редактор, установите размер документа близкий по размерам нужной вам фигуры и в границах этого документа нарисуйте нужную фигуру, стараясь оставлять минимальные отступы от границ документа. Фигура очень простая и это будет вам не трудно.
Если это второй вариант,- вы не хотите перерисовывать фигуру, но вам надо уменьшить слишком большие отступы от фигуры до краев SVG, то можно воспользоваться следующей техникой:
Вот ваш SVG, красная рамка показывает границы svg документа. Она добавлена стилями: style="border:1px solid red;"

Видно, что присутствуют очень большие отступы от фигуры до краев svg документа. Какого размера красная рамка, столько места svg займет в HTML. И никакие ухищрения в CSS не помогут уменьшить эти отступы. Уменьшать эти отступы нужно прямо в SVG. Для этого добавим viewport это width height в шапке svg файла. Если вам нужно адаптивное изображение, то ширину и высоту необходимо указывать в процентах.
Для уменьшения отступов меняем соотношение сторон,- делаем высоту в 8 раз меньше
376 /8 = 47px Точно такая же пропорция должна быть у viewport,- width="100" height="12.5%"

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

Нужно ли загружать на сайт шрифты open-sans, sans-serif?

будет выглядеть так font-family: open-sans, sans-serif; Эти шрифты предустановлены в ОС, так что нужно ли их всё равно грузить через @font-face?


Ответ

Не только этот, но и любой другой @font-face надо описывать так, чтобы он в начале искал шрифт в самой системе. Гугл-шрифты так и делают, кстати:
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v15/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }

А Open Sans, кстати, предустановлен не в любой ОС, потому да, его необходимо описывать в @font-face

Как с помощью обработчика событий добавить в массив более одного элемента?

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


Ответ

var Obj = { userPasswords: [], userPass: function(value) { if (value.split('').length < 8) { return 'Длина пароля должна составлять не меньше 8 символов'; } else { this.userPasswords.push(value); return this; } } }; btn.onclick = function () { var pass = document.getElementById('pswrd').value; console.log(Obj.userPass(pass)); };