Страницы

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

понедельник, 18 марта 2019 г.

stopPropagation для отмены изменения state в React

Есть функция, которая меняет состояние state, срабатывающая при клике на внутреннем элементе:
toggleModal(typeModal){ this.setState({ [typeModal]: !this.state[typeModal] }); }
При клике вне элемента состояние state должно изменяться:
closeModal(typeModal){ this.setState({ [typeModal]: false }); }
closeModal вещаем на onClick у контейнера, например, Body.
Вопрос: как запретить всплытие изменения состояния на элементе? (return false; и event.stopPropagation() не работают)


Ответ

1. Информация в вопросе слегка неполна и противоречива. Начнем, с того что согласно документации event.stopPropagation лучше применять с версии 0.14, до нее можно возвращать false у обработчика. И если Вы обрабатываете все с помощью реактовской системы событий, все должно работать.
2. Proof of concept: jsfiddle. Только с реактовскими событиями, обработчик клика висит на контейнере.
3. Значит остается достать хрустальный шар и угадать что не работает у вас. Вероятнее всего Вы мешаете реактовские события с браузерными.
closeModal вещаем на onClick у контейнера, например, Body.
Т.е. body это у вас не ректовский компонент а самое что ни на есть document.body с событием onclick. React использует свою систему синтетических событий. Физически, по крайней мере для всплывающих событий это один обработчик на document, дальше используется делегирование. Поэтому такой подход напрямую не сработает: к моменту когда событие до реактовского обработчика дойдет, оно уже всплыло.
4. Окей, как тогда мне ловить клик снаружи компонента? Можно сделать например так: jsfiddle. Смысл в том что пока компонент существует, на document висит наш обработчик клика. Срабатывание его при клике на сам компонент мы обрабатываем ручками в самом обработчике. Если у вас устаревшая версия реакта, (<0.14), то апи может быть чуть чуть другим, но смысл от же.
Магия происходит здесь:
// Привязываем-отвязываем обработчик на документ, соответственно жизненному циклу компонента componentWillMount: function () { document.addEventListener('click', this.unStrike, false); },
componentWillUnmount: function () { document.removeEventListener('click', this.unStrike, false); },
и здесь:
unStrike: function(event){ // предотвращаем срабатывание на самом элементе if (ReactDOM.findDOMNode(this).contains(event.target)) { return; } // smth else },

Как получить список файлов отсутствующих в папке, если есть список всех файлов которые в ней должны быть?

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


Ответ

например, так:
$ comm -1 -3 текущий.список.файлов файл.со.списком
текущий список файлов можно и не сохранять в файл текущий.список.файлов, а передать его по конвейеру:
$ ls каталог | comm -1 -3 - файл.со.списком
или, если в качестве оболочки используется что-нибудь современное типа bash или zsh, то воспользоваться конструкцией <(...)
$ comm -1 -3 <(ls каталог) файл.со.списком

пояснения про опции программы comm
-1 — убрать из результатов строки, уникальные для первого файла -2 — убрать из результатов строки, уникальные для второго файла -3 — убрать из результатов строки, совпадающие в обоих файлах
подробробнее см. man comm

JavaScript: при возникновении ошибки на странице - отправить код серверу через AJAX

Здравствуйте!
Есть ли на JavaScript такая возможность, чтобы при возникновении ошибки на странице, отправлять информацию об этом(ошибка, которая пишется в консоле, номер строки) посредством Ajax на сервер?
На сервере я бы получил код ошибки и определил версию браузера, если бы таковые имелись.
Подскажите, возможно ли это?


Ответ

window.addEventListener('error', function (errorEvent) { console.log('Сработал сыщик ошибок: ', errorEvent.error); // Отправляете запрос на сервер, в errorEvent есть вся информация // об ошибке }) a.b;

Загрузка видео на сайт в виде Blob

Если посмотреть на youtube.com, то url у любого видео выглядит вот так: blob:https://www.youtube.com/17c9289e-4450-4ea0-a0bd-56570172d62a. Это говорит о том, что видео было загружено в виде бинарного объекта и обработано функцией window.URL.createObjectURL().
Я не понимаю как они это делают со всем видео целиком, ведь оно большого размера, а url у видео не меняется до конца времени проигрывания (если плеер не решил поменять качество или сервер).
Вопрос заключается в том, как загружать видео на клиент в виде Blobа так, как делают это на youtube.com.


Ответ

D-side, подсказал посмотреть в сторону MediaSource. Этот объект позволяет задать url объекта video как window.URL.createObjectURL(mediaSource). Это позволяет задавать источник в виде Blob'а, но с одним важным свойством: мы можем догружать данные в mediaSource, например, при получении продолжения видео по AJAX или каким-либо другим способом.
Пример работы с MDN:
var video = document.querySelector('video');
var assetURL = 'frag_bunny.mp4'; var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) { var mediaSource = new MediaSource; video.src = URL.createObjectURL(mediaSource); mediaSource.addEventListener('sourceopen', sourceOpen); } else { console.error('Unsupported MIME type or codec: ', mimeCodec); }
function sourceOpen (_) { var mediaSource = this; var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec); fetchData(assetURL, function (buf) { sourceBuffer.addEventListener('updateend', function (_) { mediaSource.endOfStream(); video.play(); }); sourceBuffer.appendBuffer(buf); }); };
Метод рабочий, но есть свои приколы, например, 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' - единственный майм кодек, который работает и в Chrome и в Mozilla. Если хочется работать с webm: 'video/webm; codecs="vp9,vorbis"' в Mozilla, то придется включать флаг в about:config, что не очень приятно для пользователя.

Оформление пакета для NPM

Здравствуйте. Решил я тут создать и опубликовать пакет для node.js. Прочитал пару статей по оформлению пакетов, дал команду "npm init" и понеслась. Написал код, написал README.md, сохранил всё на gitlab, сделал "npm publish" и.. не впечатлило.
Как так у всех получается содержимое README.md "прицеплять" как документацию на странице пакета (например: https ://www.npmjs.com/package/express-session), а у меня получилось нечто такое: https://www.npmjs.com/package/express-sticky-cluster
Содержимое package.json:
{ "author": { "name": "Valeriy V. Pushkar", "email": "" }, "bugs": { "url": "https ://github.com/kainpl/express-sticky-cluster/issues" }, "dependencies": { "http-proxy": "*", "merge": "*", "cookie": "*" }, "description": "Sticky session balancer based on a cluster and node-http-proxy modules, with express and socket.io support", "devDependencies": {}, "directories": {}, "dist": { "shasum": "671d155887bf4b6b3055989ef65b077c022df890", "tarball": "https ://registry.npmjs.org/express-sticky-cluster/-/express-sticky-cluster-0.0.1.tgz" }, "gitHead": "066bc4d03d2d058ff534be1949120a41d0507464", "homepage": "https ://github.com/kainpl/express-sticky-cluster#readme", "keywords": [ "express.js", "cluster", "http-proxy", "socket.io", "sticky-cluster", "sticky-sessions" ], "license": "MIT", "main": "index.js", "maintainers": [ { "name": "kain_pl", "email": "" } ], "name": "express-sticky-cluster", "optionalDependencies": {}, "readme": "https ://github.com/kainpl/express-sticky-cluster#readme", "repository": { "type": "git", "url": "git+https ://github.com/kainpl/express-sticky-cluster.git" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "version": "0.1.1" }


Ответ

Спасибо! Ответ на вопрос:
Уберите поле readme. Тогда npm сам всё сделает – Alexey Ten

table-layout с исключением одной колонки

У меня есть динамическая таблица, с одним полем. При нажатии кнопки "добавить" добавляется еще один и тд. на первом у меня нет кнопки "удалить" но при добавлении следующих, эта кнопка появляется. Для таблицы я использую table-layout поскольку внутри может быть select который может быть длинным и портить всю таблицу и table-layout меня вполне устраивает, но вот когда я добавляю следующее поле и появляется мелкая кнопка "удалить" - она тоже идет как ячейка (td) и соответственно ее размер становиться таким же как и размер других ячеек. я пробовал делать на table table-layout:fixed; width:100%, а на ячейку width:5%, но это не помогло, также как и просто установление ширины. Подскажите как сделать ее поменьше? Пример плнкр


Ответ

как вариант вышло пара вариантов для решения вопроса:
добавить стили в css:
table, tr, td:nth-child(-1) { width: auto; border:none; margin: 1px; }
добавить в одну дополнительную колонку, которую можно скрыть прибавив стиль border-color:transparent и добавив установленную ширину например width:30px и тогда все ячейки будут по размерам одинаковы за исключением последней. Плюс еще в том что не зависимо от кол-ва динамически добавившихся колонок - последняя будет выделена именно под нужную ширину. это тоже работает но не так красиво выходит :)

Использование ConfigureAwait(false) в консольном приложении

Есть консольное приложение, которое принимает входящие подключения, считывает команду, выполняет ее, и возвращает ответ (или выполняет без ответа). Область деятельности у приложения такая:
1) Http запросы.
2) Запросы к базе данных.
3) Отправка команд по сокетам в другое консольное приложение.
Перерыл много статей в интернете, где написано, что использование ConfigureAwait(false) недопустимо в GUI приложении, т.к. там требуется исходный контекст после выполнения асинхронной функции. У меня консольное приложение, в котором, как я понял, не важно в каком контексте продолжит выполняться функция. Правильно ли я думаю? Может ли повсеместное использование ConfigureAwait(false) в моем приложении обернуться боком? А конкретно:
1) Возможна ли взаимоблокировка (Deadlock).
2) Увеличение нагрузки на систему / уменьшение производительности.
3) Выполнение асинхронных функций не по заданному порядку (вычитал и такое в одной статье).
4) Или какая-нибудь другая проблема, про которую я не знаю.
Пример кода из программы:
private async Task UpdateUserBalance(int id, decimal amount) { Transaction transaction = await DataBase.StartTransactionAsync().ConfigureAwait(false);
try { UserModel user = await UserModel.FindAsync(id, transaction).ConfigureAwait(false);
user.balance += amount;
await user.Update(transaction).ConfigureAwait(false);
await transaction.CommitAsync().ConfigureAwait(false); } catch (Exception e) { await transaction.RollbackAsync().ConfigureAwait(false); } finally { transaction.Dispose(); } }
Есть так же функции async void, которые вызывают недоверие по отношению к deadlock-ам. Пример:
class TimerClass { private Timer _timer; // using System.Timers;
public TimerClass() { _timer = new Timer(5 * 1000); _timer.Elapsed += Callback; _timer.AutoReset = true; _timer.Enabled = true; _timer.Start(); }
private async void Callback(object state, ElapsedEventArgs e) { // code
await SomeAsyncFunc().ConfigureAwait(false);
// code } }
И еще вопрос. Возможен ли deadlock в этом коде? Т.к используется task.Result.
List tasks = new List();
for(int i = 0; i < someLength; i++) { tasks.Add(SomeTaskFunc()); }
await Task.WhenAll(tasks);
for(int i = 0; i < tasks.Count; i++) { Task task = tasks[i]; // Дальше идут операции с task.Result }


Ответ

Формально говоря, для консольного приложения или сервиса повсеместное использование ConfigureAwait(false) действительно не нужно. Поскольку контекст синхронизации все равно отсутствует, то нет нужны в привязке конкретного кода к конкретному контексту (как в случае с UI приложением) -- весь код будет работать в пуле потоков.
Однако я бы все равно рекомендовал использовать ConfigureAwait(false) везде, где возможно, по двум причинам:
Вы повысите переиспользуемость кода. Если код будет затем перенесен в GUI приложение, он сразу будет работать правильно. Если вам или используемой вами библиотеке понадобится установить свой контекст, ваш код продолжит работать корректно (по крайней мере, не изменит своего поведения).

Отвечая на конкретные вопросы:
Нет. До тех пор, пока у вас отсутствует контекст синхронизации (либо он есть, но без message loop) и вы не используете блокирующие вызовы типа Result и Wait(), можете забыть о дедлоках. Не будет. Не вижу связи (ссылка на статью помогла бы прояснить вопрос).

Что касается async void методов, то главная опасность их заключается в двух вещах, которые с ConfigureAwait(false) никак не связаны:
Исключения, возникшие в таких методах, не обрабатываются. Для таймера и консольного приложения это будет означать завершение процесса. Поэтому нужно либо искать полностью асинхронные альтернативы, либо использовать в колбэке глобальный try/catch Такой метод завершает свое выполнение, грубо говоря, сразу после первого await. Т.о., если сам асинхронный вызов или код, находящийся после асинхронного вызова, занимает значительно время, то вызовы колбэка по таймеру могут накладываться друг на друга. Обойти это можно, если каждый раз выключать таймер в начале метода, и снова включать в конце метода.
UPD
Возможен ли deadlock в этом коде? Т.к используется task.Result.
Блокирующее ожидание таска (через Result или Wait()) само по себе не гарантирует вам дедлок! Все зависит от контекста и от того, что происходит внутри вызываемого метода. Если внутри SomeTaskFunc() нет ничего криминального, то дедлок невозможен хотя бы потому, что к моменту обращения к Result все таски уже завершили свою работу (await Task.WhenAll(tasks)). А еще потому, что у вас консольное приложение и вы пользуетесь одним контекстом. Про блокирующее ожидание и дедлоки почитайте в этом вопросе
P.S.
написано, что использование ConfigureAwait(false) недопустимо в GUI приложении, т.к. там требуется исходный контекст после выполнения асинхронной функции
Не совсем корректное утверждение. Использовать ConfigureAwait(false) в GUI приложениях нужно везде, где нет необходимости выполнять продолжение в UI потоке. Т.е. опускать ConfigureAwait(false) нужно только в UI коде. Везде дальше по дереву вызовов присутствие ConfigureAwait(false) крайне желательно (читай, обязательно).

NuGet выпуск своей библиотеки

Интересует вопрос. Есть ряд классов которые нацелены на решение одной проблемы - допустим работа с api cms/соц сети/и т.п. Как можно из этого собрать библиотеку и издать ее в NuGet. Как я правильно понимаю NuGet также поддерживает разные версии библиотеки. То есть каждое обновление библиотеки, публикуемое, так же доступно для скачивания пользователями.


Ответ

Оригинальная статья из документации по созданию нюгета вручную: http://docs.nuget.org/ndocs/create-packages/creating-a-package
Прекрасная статья, которая описывает даже больше и лучше, чем задано в вопросе: https://habrahabr.ru/post/274283/

Как обработать push android

Как сделать так, чтобы когда приложение в бэкгранде, push уведомление отправлялось не сразу в notification center, а обрабатывалось приложением методом onMessageReceived? Пуш сделано на firebase.


Ответ

Отправляйте data-сообщения (без объекта Notification)
With FCM, you can send two types of messages to clients: Notification messages, sometimes thought of as "display messages." Data messages, which are handled by the client app. Client app is responsible for processing data messages. Data messages have only custom key-value pairs. Use notification messages when you want FCM to handle displaying a notification on your client app's behalf. Use data messages when you want to process the messages on your client app.
About FCM Messages

Code Contracts и TeamCity

Коллеги, добрый день.
Настраиваю TeamCity 10 для сборки ASP.NET проекта созданного в VS 2015. В проекте, кроме всего прочего, используется библиотека CodeContracts. На сборочном сервере VisualStudio не установлено. Насколько я понимаю, в этом случае TeamCity использует установленный на машине msbuild. В результате, при сборке на сервере рерайтинг контрактов не происходит.
Нашел несколько рекомендаций в интернете. Делал следующее:
Скачал с сайта visualstudiogallery и установил библиотеку CodeContracts на сервере. В файле проекта прописал дополнительный импорт
C:\Program Files (x86)\Microsoft\Contracts\
Не помогло. Ничего не рерайтилось.

Установил библиотеку контрактов как nuget пакет в проект (ссылка). Пакет официальный от Microsoft. Все тулзы для рерайта лежат внутри этого пакета. В файле проекта добавил похожий импорт, однако ссылающийся на .target файлы внутри данного nuget пакета.
$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\packages\DotNet.Contracts.1.10.20606.1\'))`
Аналогично - не помогло.
Интересная деталь - в куске конфига в пункте 2 переменная CodeContractsInstallDir "указывает" на папку вышеописанного nuget пакета. Логично предположить, что операции с контрактами будут вестись с помощью тулзов из этой папки. Однако при сборке студией на своей машине в логах я вижу использование тулзов контрактной библиотеки из стандартного расположения "C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite.exe". Как это происходит - тоже не совсем понятно...
Возможно кто-то сталкивался с данной проблемой и может подсказать решение и поделится опытом?


Ответ

В результате никакие частичные решения не помогли. Пришлось установить 2015 студию со всеми либами и рантаймом на сборочный сервер. После этого все подхватывалось и работало корректно.
Кстати в следующем проекте от CodeContracts отказался, слишком мало бенефитов для меня...

Копировать проект в папку с номером версии проекта

Хочется использовать версионность приложения как нынче у браузеров - в подпапках лежат целиком старые и новые версии и какую запускать решает лишь простой лаунчер:

Вопрос - можно ли в проекте на событиях билда(до сборки, после сборки, не важно по идее) как то указать копирование не в конкретную подпапку, а в ту, которая соответствует текущей версии проекта? Интересуют реализации как без сторонних утилит, так и с ними, если других вариантов нет.


Ответ

Удалось найти решение на SO
Выгружаем проект лаунчера и пишем в него:
$(PostBuildEventDependsOn); PostBuildMacros; md "$(TargetDir)\@(VersionNumber)" xcopy /y /r /e "$(ProjectDir)\..\Core\bin\$(ConfigurationName)" "$(TargetDir)\@(VersionNumber)"
Насколько понимаю, решение получилось немного сборку, ведь версия берется от самого лаунчера. Для меня это не проблема, т.к. использую одну версию на всё решение.

Вырезать из текста программы комментарии

Есть задачка, на входе дан текст (код программы с комментариями типа /*коммент*/). Нужно вырезать из этого текста комментарии и вернуть. Вот мой пример, но он не работает. Как его можно исправить ?:D
#define L 300
int main() {
char s1[L]; // Входной текст char s2[L]; // Выходной текст
int fl = 0;

printf("Введите исходный текст (макс %d симв.):
", L); gets(s1); printf("Начальный текст:
"); puts(s1); strcpy(s2,"");
int i = 0; while(i if (s1[i] == '/' && s1[i+1] == '*') fl = 1; if (s1[i] == '*' && s1[i+1] == '/') fl = 0;
if (fl == 0) { int j = 0; strcat(s2, &s1[j]); j++; } i++; }
printf("Выходной текст:
"); puts(s2);
system("pause");
}


Ответ

Странный кусок, что вы хотели здесь сделать?
if (fl == 0) { int j = 0; strcat(s2, &s1[j]); j++; }
P.S.
#include #include #include
const char CMT_START[] = "/*"; const char CMT_END[] = "*/";
static char *remove_comments( const char *string ) { char *cmt; const char *sptr = string; char *copy = malloc( strlen( string ) + 1 );
if( !copy ) { return NULL; } *copy = 0;
while( cmt = strstr( sptr, CMT_START ) ) { strncat( copy, sptr, cmt - sptr ); cmt = strstr( cmt + 1, CMT_END );
if( cmt ) { sptr = cmt + sizeof( CMT_END ) - 1; } else { /* Спорный момент: оставлять в строке незавершённый * комментарий или нет. В данном случае он будет * отброшен. */ return copy; } }
if( *sptr ) { strcat( copy, sptr ); }
return copy; }
int main() { char *s = remove_comments( "123 /* 456 */ 789 /* 098 */ abc /*" ); if( s ) { printf( "%s
", s ); } free( s ); return !s; }

Как правильно писать библиотеку?

Пишу скрипт показа сообщения .Файл notify.js
;(function(){ function Notify(titleText, messageText) {
var notify = document.createElement("div"); notify.className = "notify"; var title = document.createElement("div"); title.className = "notify title"; title.innerHTML = titleText; var message = document.createElement("div"); message.className = "notify message"; message.innerHTML = messageText;
notify.appendChild(title); notify.appendChild(message); function show(){ document.body.appendChild(notify); } } })();
При подключении скрипта в index.html и при вызове Notify("title","message").show() ошибка Notify is not defined и это понятно, но как по-другому писать, чтобы не было конфликтов с локальными скриптами? Много ошибок допускаю, скажите, какие? Как правильно организовать код, писать библиотеку?


Ответ

У Вас код локально создался и... умер, т. к. при завершении функции, её окружение уничтожается. Исключение - замыкание (например, ссылка на какие-то данные сохраняется и после завершения работы).
// В параметрах передаём модуль и this (глобальный объект, не обязательно window) (function(myModule, global){ // Если есть система зависимостей AMD, добавляем модуль туда if(typeof define === "function" && define.amd) define("logger", [], () => myModule()); // Если же это RequireJS, не будем идти против воли Творца :) else if(typeof module !== 'undefined' && module.exports) module.exports = myModule(); // Если систем сборки нет, значит экспортируем в глобальный объект else global['logger'] = myModule(); }(function(){ let myModule = _ => console.info(`Вывод '${_}' через модуль`); return myModule; }, this)); // Сработает 3-я ветка экспорта logger('Test');
Но стандарт устанавливает более интересную конструкцию для модулей, рекомендую с ней ознакомится

Направление движения транспорта с помощью картинки Python

Пишу телеграмм бота, который показывает движение транспорта на карте. Делаю это на питоне.
C картами телеграмм работает ограничено показывает только булавку, а мне нужно нарисовать и направление?

вот пример данных, которые я получаю
1, 1, 39692550, 47219635, 12, 138, 344, тип, номер_широта, долгота_скорость, курс, номер
предпоследний параметр показывает градусы по окружности.
Идея была такая, взять картинку со стрелкой и наклонять ее насколько надо. И просто отправлять ее после карты ниже. Реализовал все с помощью библиотеки PIL , но получается плохо. После каждого поворота картинки, приходиться ее сохранять и под конец, она уже выглядит как набор пикселей.
Можете ли вы мне подсказать другие варианты? Может все таки можно нанести на карту стрелку движения как в навигаторе. А может можно с помощью какой-нибудь математической библиотеки рисовать каждый раз компас с направлением и отправлять его как картинку?
Даже для юмора хотел реализовать все с помощью черепашки, но как создать изображение я так не разобрался.
Решил проблему используя google charts, передаю градусы по ссылке и гугл рисует сам картинку с направлением. Но все же вопрос в том,можно ли присылать локацию со стрелкой, а не с булавкой ?


Ответ

Но все же вопрос в том,можно ли присылать локацию со стрелкой, а не с булавкой ?
Ответ на этот вопрос - нет. Локация - это точка на карте, как следует из документации
Location This object represents a point on the map.
А метод sendLocation предназначен только для этого:
Use this method to send point on the map.
Если Вам нужен какой-то специфичный функционал, то попробуйте использовать какие-то сторонние сервисы, генерирующие необходимое Вам изображение и посылайте его в виде фото.

Картинки по кириллическому адресу

Есть картинка расположенная по кириллическому адресу вида http://вася-пупкин.бел/NAME.jpg И когда я пытаюсь её загрузить при помощи Glide или Picasso то ничего не выходит, никакой реакции. Как можно декодировать URL в подходящий вид? Сразу скажу что пробовал и не помогло:
Uri.encode(url) IDN.toASCII(post.getImgUrl())


Ответ

Метод который поможет перевести адрес из кириллицы в Punycode
public static String convertUnicodeURLToAscii(String url) throws URISyntaxException { if (TextUtils.isEmpty(url)) return url; url = url.trim(); // Handle international domains by detecting non-ascii and converting them to punycode boolean isAscii = CharMatcher.ASCII.matchesAllOf(url); if (!isAscii) { URI uri = new URI(url); boolean includeScheme = true; // URI needs a scheme to work properly with authority parsing if (uri.getScheme() == null) { uri = new URI("http://" + url); includeScheme = false; } String scheme = uri.getScheme() != null ? uri.getScheme() + "://" : null; String authority = uri.getRawAuthority() != null ? uri.getRawAuthority() : ""; // includes domain and port String path = uri.getRawPath() != null ? uri.getRawPath() : ""; String queryString = uri.getRawQuery() != null ? "?" + uri.getRawQuery() : ""; // Must convert domain to punycode separately from the path url = (includeScheme ? scheme : "") + IDN.toASCII(authority) + path + queryString; // Convert path from unicode to ascii encoding url = new URI(url).toASCIIString(); } return url; }

Как избавиться от ООМ при работе с Bitmap?

Я работаю с Bitmap и рабочий процесс выглядит так
Юзер делает фото, оно сохраняется в файл после чего открывается юзеру для подтверждения. Если юзер подтверждает фото то выполняется crop части фото и еще раз показывается юзеру для подтверждения.
Таким образом юзер делает 5 фото.
Так вот после первой фото и все хорошо. Фото показывается юзеру и проходит 2 этапа подтверждения.
Но на втором фото юзеру показывается фото , он ее подтверждает и получает ошибку
FATAL EXCEPTION: AsyncTask #2 Process: com.fittingroom.newtimezone, PID: 7196 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.OutOfMemoryError: Failed to allocate a 63489036 byte allocation with 16777216 free bytes and 60MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:882) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:858) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:478) at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAccept.getCroppedBitmapFromPath(PresenterActivityAcceptNotAccept.java:65) at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAccept.access$200(PresenterActivityAcceptNotAccept.java:16) at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAccept$1.doInBackground(PresenterActivityAcceptNotAccept.java:41) at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAccept$1.doInBackground(PresenterActivityAcceptNotAccept.java:31) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  at java.lang.Thread.run(Thread.java:818)
вот код в котором появляется ошибка
private Bitmap getCroppedBitmapFromPath(String path) { final File photo = new File(path); final BitmapFactory.Options options = new BitmapFactory.Options(); final Bitmap bitmap = BitmapFactory.decodeFile(photo.getAbsolutePath(), options); int height = bitmap.getHeight();
Bitmap result; final Matrix matrix = new Matrix(); matrix.postRotate(90); final double centerX = height * 0.5; final double centerY = height / 447 * 480; final double widthAndHeight = height / 447 * 160; final int pointY = (int) (centerX - widthAndHeight / 2); final int pointX = (int) (bitmap.getWidth() - centerY - widthAndHeight / 2); final int widthAndHeightResult = (int) widthAndHeight; result = Bitmap.createBitmap(bitmap, pointX, pointY, widthAndHeightResult, widthAndHeightResult, matrix, false);
return result; }
Вот в этой строчке
final Bitmap bitmap = BitmapFactory.decodeFile(photo.getAbsolutePath(), options);
может как то нужно освобождать байты с которыми Bitmap работает?
или может как то уменьшить размер картинки?


Ответ

Можно, если это например jpeg или png работать с картинкой меньшего качества, а потом уже приводить ее к нормально виду, когда закончили работу.
А как менять качество:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; final Bitmap bitmap = BitmapFactory.decodeFile(selectedImageUri.getPath(), options);
Да и в плюс данного метода:
наверняка эта картинка маленькая, результирующая нет смысла показывать хорошее качество

Как спрятать часть текста на CSS или кнопка“Еще”?

Есть блок в котором находится описание товара. Возможно ли сделать с помощью свойств CSS, если текст больше блока, то часть его скрывается и появляется кнопка, по нажатию на которую блок с текстом полностью открывается. Сейчас в голове только вариант с помощью overflow: hidden и js или label, input. менять высоту блока.


Ответ

Можно вот так сделать
button {outline: none;} .text { display: block; width: 300px; height: 10px; border: 1px solid black; padding: 5px; margin-top: 5px; outline: none; overflow: hidden; } .text:focus, button:focus ~ .text {height: auto;}

Я люблю овый год! В этот день случаются чудеса. Я желаю вам в новом году успехов, счастья, любви, много репутации на StackOverflow, новых проэктов и конечно же денег. С наступающим!

Как правильно csrftoken от django в angular2?

Доброго времени суток,
Переписываю проект с angular (роутинг был на стороне backend) на angular 2 На стороне backend стоит django. Написал роутинг, аутентификацию по средством записи в куки (использовал для этого пакет angular2-cookie). Ранее, для того чтобы просто забрать csrftoken, чтобы спокойно писать код, использовал своего рода небольшой костыль:
let token = document.cookie.replace(/(?:(?:^|.*;\s*)csrftoken\s*\=\s*([^;]*).*$)|^.*$/, "$1");
Но теперь этот вариант не работает, а как правильно работать с csrftoken django - angular2 не могу в полной мере разобраться.
Буду благодарен, если кто-нибудь поможет в этой сложившейся ситуации. Спасибо


Ответ

Вам стоит посмотреть сюда: https://angular.io/docs/ts/latest/guide/security.html
Your server may use a different cookie or header name for this purpose. An Angular application can customize cookie and header names by providing its own CookieXSRFStrategy values.
{ provide: XSRFStrategy, useValue: new CookieXSRFStrategy('myCookieName', 'My-Header-Name') }

Docker: сеть, интерфейсы и контейнеры

У меня есть два сетевых интерфейса: eth0 - локальная сеть, tun0 - через него я хожу в интернет(поднимается и тушится с помощью самописного скрипта). На этой же машине стоит docker, у него есть свое собственное окружение для контейнеров. Из этого окружения наружу торчит интерфейс docker0, все контейнеры связываются с внешним миром через него. Тут возникает проблема: при поднятом tun0(при этом он становится дефолтным) контейнеры не хотят через него связываться. Как я понял надо как то перенаправить docker0 на tun0? Как это сделать?


Ответ

Отвечаю на собственный вопрос: Проблема заключалась в том, что у меня не был указан dns сервер моей сети и по умолчанию был отключен ip_forwarding. Для начала его нужно включить, раскомметнировав строчку:
net.ipv4.ip_forward=1
в файле /etc/sysctl.conf и перезагрузив машину.
Далее в файле /etc/defaut/docker редактируем строку:
DOCKER_OPTS="-dns <ваш_адрес_dns>"
После редактирования перезапустите докер.

Принцип открытости/закрытости при динамическом определении типа файла

Есть код приложения в котором необходимо динамически определить тип файла (HTML или TXT) по содержимому и в зависимости от полученного типа файла вызвать соответствующий алгоритм обработки.
interface IFileType { void Process(); } class HtmlFile : IFileType { public void Process() { Console.WriteLine("HTML"); } } class TxtFile : IFileType { public void Process() { Console.WriteLine("TXT"); } } class FileTypeHandler { public static IFileType Define(string fileContent) { var file = fileContent.IndexOf("class Program { static void Main(string[] args) { FileProcessor fileProcessor = new FileProcessor(); fileProcessor.ProcessFile(@"d:\index.html"); Console.ReadKey(); } }
Вывод:
HTML
Все работает как мне надо. Меня интересует насколько гибок мой код к появлению в будущем новых типов файлов, к примеру JSON. Ведь с появлением нового класса реализующего интерфейс IFileType, также изменится алгоритм определения типа по содержимому в классе FileTypeHandler.
Все ли я правильно спроектировал, касательно принципа открытости/закрытости?


Ответ

Я вижу следующие проблемы в вашем коде.
Метод FileTypeHandler содержит логику определения, для всех форматов. На данном этапе это не страшно, т.к. их не много, но если их количество будет увеличиваться, метод станет запутанный и тяжел в расширении.
Рекомендую, создать сущности, для каждого формата, и в них реализовывать определение. Это позволит избежать запутанности и облегчит добавление новых.
Приведу код, как я бы в данной ситуации реализовал. В нем есть небольшие упрощения. Написал, на java, но думаю вы разберетесь.
enum FormatTypes { TXT("txt", new TxtDetector()), HTML("html", new HtmlDetector());
public final String name; private final Detector detector;
FormatTypes(String name, Detector detector) { this.name = name; this.detector = detector; } }
interface Detector { boolean isCorrectType(String fileName, String content); }
class TxtDetector implements Detector { }
class HtmlDetector implements Detector { }
class DetectorHandler { public static String getType(String fileName) { String content = //чтение содержимого
for (FormatTypes types : FormatTypes.values()) if (types.detector.isCorrectType(fileName, content)) //просто возвращает название формата, //можно при необходимости в FormatTypes положить какую то логику return types.name;
throw new IllegalArgumentException("type is not supported"); } }

Применение нейронных сетей и ИИ в Мобильных Приложениях.

Здравствуйте, хотелось бы узнать , примеры приложений , да и в целом, где и как применяются нейронные сети и ИИ в приложениях. Сам пишу на java под android, и хотелось бы узнать, реально ли совмещать данные занятия:"Изучение нейронных сетей и ИИ и практиковаться и внедрять их в Мобильных Приложениях?


Ответ

Как показала моя практика это возможно, однако писать нейросеть в самом приложении не самая лучшая идея. Когда начинал изучение нейросетей, с 0 написал свою нейросеть в виде библеотеки для андроид. Использую ее в 2 своих проектах: анализ рынка акций и анализ предпочтений фильмов. В обоих случаях все работает, но дает очень большую нагрузку на ЦП телефона и он буквально становиться сковордкой на которй можно жарить яишницу. Если кончено сеть не глубокая и данных для обработки не много то можно и так, но почитав кучу статей понял что намного лучше релизвать нейросеть отдельно на сервере и общаться с ней по сети. На мой взгляд лучший фреймворк для НС это TensorFlow от гугла.

Поиск текста с учетом звучания на русском и английском языках

Какими средствами лучше всего организовать индексирование и поиск русских слов, которые являются записью английской транскрипции? Например, слово vision в русском варианте будет записано как вижн или вижен, но значение сути не меняется. Поиск, соответственно, должен быть произведен как по vision так и по вижн без потери результатов на выходе. Soundex и Metaphone, на сколько я понимаю, работают строго в одном языке без скрещиваний.


Ответ

Мне кажется, в большинстве случаев, будет достаточно функционала синонимов. База данных, скорее всего, имеет определенную тематическую направленность, например медицина или электротехника. И чтобы настроить поиск с учетом транслита/звучания слов на разных языках достаточно заполнить 500-1000 синонимов. Но использовать анализатор с фильтром типа synonym не для индексации, а для анализа поискового запроса.
Синонимы лучше вынести в отдельный файл, а не хранить в настройках.
{ "index" : { "analysis" : { "analyzer" : { "synonym" : { "tokenizer" : "whitespace", "filter" : ["synonym"] } }, "filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "analysis/synonym.txt" } } } }

Пример содержимого файла synonym.txt:
vision, вижн, вижен

Если этого недостаточно, то получаем очень сложную задачу.
Если дело ограничивается транслитом, то смотреть в сторону плагина ICU Transform Token Filter Если нет, и нужно vision, вижн, вижен для всех возможных слов, то смотреть в сторону машинного обучения. Это решение Rosette for Elasticsearch, видимо платное.
Полезные ссылки.
Обсуждение данной темы Rosette name translator - есть поддержка русского языка
Soundex и Metaphone - это фонетические алгоритмы, работают, как вы написали, в одном языке. Это не то, что вам нужно.

bower i bash: bower: command not found

Понадобилось доработать проект. Клонирую к себе - git clone ... Инициализирую npm - npm i Инициализирую bower - bower i
И тут пишет -
bash: bower: command not found
Файлы: package.json, bower.json, .bowerrc есть. nodejs, git - последние версии.
Работаю в coneMu (bash: git bush).
До этого все прекрасно работало.При чем с ноутбука все отлично запускается и работает, а вот с компьютера - нет.
Не понимаю в чем проблема. Может быть кто-то сталкивался с подобной проблемой. На SO пишут, что с путями что-то не так, но не пойму что и как исправить.


Ответ

Решила так: вручную перенесла все файлы bower с c:\Program Files\Git\usr\local\ в c:\Users\USER-NAME\AppData\Roaming
pm. Все заработало.

Javascript - ручная сортировка

Есть недоделанная функция сортировки, которая должна находить минимальный элемент массива и засовывать его в новый массив. Так как я не знаю, как удалить предыдущий минимальный эллемент, функция выдает массив из одного самого минимального числа из данного ей массива(например [44, 5, 2, 6, 3] она выдает [2, 2, 2, 2, 2], вместо [2, 3, 5, 6, 44])
Мне нужно дополнить/подправить код ниже, а не новый или сокращенный вариант. Я хочу понять, как это работает через функции и циклы, сколько только я разных способов не перепробовал - все напрасно:
function sort(arr) { var sorted = []; var min = Infinity; for (j = 0; j < arr.length; j++) { for (var i = 0; i < arr.length; i++) { if (arr[i] < min ) { min = arr[i]; } } sorted.push(min); } return sorted; }


Ответ

Код в вопросе мягко говоря не оптимален, но его можно "исправить" )
function sort(arr) { var sorted = []; var min = Infinity; var minIndex = Infinity; for (j = 0; j < arr.length; j++) { for (var i = 0; i < arr.length; i++) { if (arr[i] < min ) { min = arr[i]; minIndex = i;// нужен предполагаемый индекс минимума кроме самого минимума, чтобы убрать его из исходного массива } } arr[minIndex] = Infinity;// исходный массив надо поправить, в нем нет больше "найденного минимального элемента, поставим бесконечность, чтобы была больше любого" sorted.push(min); min = Infinity;// надо сбрасывать минимум, иначе в следующей итерации не найдем ничего меньше, либо инициализиировать переменную внутри первого for } return sorted; }

Как найти соседний селектор в css?

Я знаю, что при коде вида .class1 + .class2 заданые стили применятся к классу class2, который следует сразу после class1. Но как мне задать стили конкретно классу1, после которого есть class2?


Ответ

Поскольку обратного селектора, вроде .class1 - .class2 в CSS не существует, какой-нибудь частный случай можно решить селектором + или ~, назначением display: flex родителю и установкой order потомкам. Разметка при этом должна исходить из того, что «предыдущий» элемент должен располагаться ниже. Альтернативой свойству order может быть свойство flex-direction: row-reverse
.container { display: flex; } .child { border: 1px solid; padding: 1em; } .class2 { order: 1 } .class3 { order: 2 } .next ~ .prev { background: #ccc; }

class3

Загрузка страницы не прекращается

Всем доброго времени суток. На одном из сайтов заметил, что не прекращается загрузка страницы(индикатор в заголовке вкладки не перестает вращаться). Выяснил, что причина - записи в iframe через document.write(). Код(упрощенно) примерно такой(зависание можно проверить локально):



Какие процессы вызывают крутящийся индикатор? И почему они возникают? Заранее спасибо.


Ответ

Как сказано в learn.javascript.ru
Метод document.write(str) работает только пока HTML-страница находится в процессе загрузки. Он дописывает текст в текущее место HTML ещё до того, как браузер построит из него DOM.
document.getElementById('k_c0').contentDocument - возвращает document. d.write - записывает в document фрейма и не может записать. Соответственно не может загрузить страницу полностью. Вот она и крутится.

JS/PHP - получить значение у текущего id

Добрый день. Есть код:
login; ?> email; ?> sponsor; ?>


Суть кода здесь идет вывод данных у пользователя в таблице. Проблема заключается в том, что при клике по кнопке открывается модальное окно и нужно чтобы при клике на нее бралось значение допустим из элемента
И это значение мне нужно получить потом при отправке формы в модальном окне т.е в модальном окне будет форма со скрытым полем и в нее я подставлю уже e-mail пользователя. Вот и возникает вопрос как получить данные при клике на кнопку с поля input , но у текущей строки таблицы! Если сделать получать данные по конкретному id функцией getElementById , то получение данных будет происходить со всех полей у которых есть такой же id. Вот и проблема как получить текущее значение.. увы в js не силен.


Ответ

Вариантов достаточно много: продублировать дата атрибуты в кнопки и вытягивать из них информацию, задать уникальный id ячейке при клике на кнопу обращаться к ней и искать скрытый инпут, задать hidden инпуту уникальный id, а в кнопках (в дата атрибуте) указывать id скрытого инпута (реализация ниже)...
$('.delete-btn').click(function () { var $email = $('#' + $(this).data('hidden-input')); $('.modal-body').text($email.val()) $('#myModal').modal('show') })


Хранение в памяти много изображений

Задача состоит вот в чем. Есть сайт с элементами меню, каждый элемент подгружает что-то одно:
Секвенции (Например моделька 360 состоящая из набора фотографий) Видео Просто картинка
Не напрягая лишним функционалом, просто сведу к минимуму: Есть кнопка при какой необходимо, чтобы все секвенции, картинки или даже видео подгружались в памяти и при воспроизведении не глючили.
Какие самые благоприятные варианты реализовать это без лагов?
Буду рад любой помощи.

Реализовал загрузку всех изображений в кэш, лаги всё равно есть. Поэтому уже обратился сюда.
Код загрузки изображений в кэш:
!function ($) { /** * В поданный на вход элемент создается div, куда будут помещены изображения. * Данную функцию вызывает массив, в каком содержаться пути к изображениям. * @param el Элемент, куда будет помещен блок с кэшем * @param id Уникальное имя для блока с кэшем */ $.fn.preload = function (el, id) { // Если элемента с указанным идентификатором не существует, то загружаем в кэш if (!el.find('#' + id).exists()) { // Формируем блок, где будут лежать указанные изображения $("

").hide().appendTo(el); // Проходим каждый элемент массива и формируем изображение this.each(function () { $('').attr("src", this).appendTo("#" + id); }); } }; }(window.jQuery);
/** * Загрузка переданного элемента в кэш (Осуществляет загрузку секвенций и картинок) * @param el Dom-element * @param index Индекс массива */ function preload_item(el, index) { var id = el.attr('data-id'), // Указанный идентификатор для элемента src, // Тут будет храниться путь к картинке frames, // Кол-во фреймов, какие будут записаны в кэш arr = [], // Массив, в каком будет храниться путь к каждому изображению img_name, // Будет храниться только имя изображения с удаленным постфиксом directory; // Будет храниться папка, в какой будут все изображения
// Определяем тип контента, если секвенции, то много изображений, иначе одно изображение switch (el.attr('data-content')) { case 'sequence': src = el.attr("data-path"); frames = parseInt(el.attr('data-frames'));
// Записываем каждый путь к фрейму, для записи в кэш for (var i = 1; i < frames + 1; i++) { img_name = src.split('/')[src.split('/').length - 1]; directory = src.split('/').slice(0, -1).join("/"); arr.push(directory + "/" + img_name.split('_')[0] + "_" + i + "." + img_name.split('.')[1]) } // Записываем в кэш и передаем элемент в каком будет содержаться images_cache и уникальное имя для него $(arr).preload(content, img_name.split('_')[0] + id); break; case 'image': // Костыль небольшой. // Получаем путь к изображению где лежать с мал. разрешением и заменяем на папку, где лежать с большим разрешением. src = el.find('img').attr("src").replace('colors_small', 'colors_big');
// Формируем путь к изображению img_name = src.split('/')[src.split('/').length - 1]; directory = src.split('/').slice(0, -1).join("/"); arr.push(directory + "/" + img_name);
// Записываем в кэш и передаем те же данные $(arr).preload(content, img_name.split('.')[0] + id); break; }
// Получаем список все img, какие не успели загрузиться var images_not_loaded = $(".images_cache > img").not(function () { return this.complete; });
var count = images_not_loaded.length;
// Если кол-во > 0 if (count) { // Записываем их images_not_loaded.load(function () { count--; // Если уже нечего записывать и "левая переменная" if (!count && index === ids.length - 1 && startAnimate) { // Что-то делаем } }); } else { // Если уже нечего записывать и "левая переменная" if (index === ids.length - 1 && startAnimate) { // Что-то делаем } } }


Ответ

Загружайте изображения через new Image(); .src даст вам путь. .onload создаст событие окончания загрузки - потом устанавливайте в требуемый вам div.
Как полагаю, часть проблем у вас от того, что вы все добавляете в DOM, что также нагружает браузер.
Как пример, используйте вот такой вариант:
var images = {}; // Массив изображений
function preload(el){ var id = el.attr('data-id'); var content = el.attr('data-content');
var obj = { loaded: 0, images: [] }; var src = el.attr('data-path'); /// тут непонятно как вы генерируете пути var arr = (content === 'sequence') ? getImageUrlsFromSequenceData() : getImageUrlsFromImageData(); /// но предположим в конце у нас их будет массив arr arr.forEach(function(item){ //создаем элемент Image var image = new Image(); //устанавливаем событие для получения того, что оно загрузилось //количество незагруженных вы можете получить через obj.images.length-obj.loaded image.onLoad=getActionOnLoad(obj); //назначаем урл image.src=item; //добавляем в массив obj.images.push(image); }); //добавляем в ссылочный массив images[id] = obj; }
function getActionOnLoad(obj){ return (function(){ obj.loaded++; //тут еще можно вызывать требуемый нам каллбек, если loaded //достигло images.length. его можно добавить в параметры прелоадера }); }
function getImageUrlsFromSequenceData(data){ //тут вы генерируете ссылки для sequence return []; } function getImageUrlsFromImageData(data){ //тут вы генерируете ссылки для Image return []; }

Spring Security OAuth2

Есть сервис с авторизацией через OAuth2 (например, vk.com). Есть clientId и clientSecret. Нужно написать демона, который будет делать какие-то запросы к API сервиса.
Возможно ли это сделать в фоновом режиме и автоматически получать access_token по истечению срока? Например, многие сервисы после авторизации больше не запрашивают данные пользователя.
UPD. Мне нужно сохранять access_token (например, в БД), а потом из обычного потока работать с OAuth2RestTemplate
public void run() { // access_token = получаем из БД сохраненный access_token. // создаем restTemplate из access_token while (true) { Map map = restTemplate.getForObject(..., Map.class); } }


Ответ

После долгих попыток рецепт получился следующим.
Получаем access_token из базы данных в новом потоке; Оборачиваем его в DefaultOAuth2AccessToken Создаем DefaultOAuth2ClientContext и добавляем в него DefaultOAuth2AccessToken Создаем OAuth2RestTemplate с настройками и установленным контекстом. Выполняем запросы и ловим UserRedirectRequiredException. Исключение означает, что ключ больше не валидный и нужно запросить новый у пользователя через контроллер.

C# 6.0. Elvis-оператор для переменных типа dynamic

Добрый день!
При написании приложения на MVC возникла следующая ситуация: У меня есть в базе данных таблица User, в которой есть поле IdRole, которое может быть null. Класс-модель для таблицы User выглядит так (эта модель сгенерировалась с помощью ADO.NET):
[Table("risksdb.user")] public partial class user { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public user() { risk_record = new HashSet(); }
[Key] public int IdUser { get; set; }
public int? IdRole { get; set; }
[Required] [StringLength(45)] public string Login { get; set; }
[Required] [StringLength(45)] public string Password { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection risk_record { get; set; }
public virtual role role { get; set; } }
Как видно, свойство Role может принимать null. Для вывода таблицы user, я использую ViewBag, который является dynamic. В него (ViewBag.Users)я помещаю IEnumerable Users в своем контроллере и в cshtml-файле я вывожу его примерно так:

IdUser

IdRole

Login

Password

@foreach (var u in ViewBag.Users) {

@u.IdUser

@u.IdRole

@u.Login

@u.Password

}
Вопрос: Нужно ли делать проверку на null для поля переменной типа dynamic или нет? Если да, то как правильно сделать это и где (в контроллере или еще где-то)?
Доп. вопрос: Как лучше передавать в cshtml-файл модель: через ViewBag или через параметр object model?


Ответ

1) Зависит от того, может быть у этой переменной значение null или нет. Если в контроллере всегда безусловно что-то присваиваете ViewBag.Users, то и над проверкой заморачиваться ни к чему. Проверку нужно проводить там, где может возникнуть ошибка. Например, в представлении ошибка может возникнуть в цикле foreach, если ViewBag.Users будет равен null
2) Конечно же через object model. Это удобный и общепринятый механизм. Достаточно в представлении (cshtml-файл) добавить строку @model IEnumerable и далее к модели обращаться через переменную Model. Это сразу даёт понимание типа модели. С передачей через ViewBag нет строгой типизации и понять, какого типа там данные может быть сложно. P.s. Просто представьте, что вы программируете только бизнес-логику приложения, а все представления в вашей команде пишет "верстальщик". Чтобы он каждый раз не спрашивал вас как получить из модели те или иные данные вы можете сказать ему, что в качестве модели передаете экземпляр класса User, поля данных которого заведомо описаны в вашем коде.

Компилятор и интерпретатор. В чем разница?

Да, да. Это очередной вопрос о разнице между компилятором и интерпретатором ЯП. Только ответы, которые обычно даются меня не удовлетворяют.
Обычно говорят, компилятор переводит код на каком либо ЯП в исполняемый и уже при выполнении код сразу выполняется непосредственно процессором. В случае интерпретатора, в процессе выполнения программы специальная программа интерпретатор считывает исходный код программы построчно и выполняет его. Шаг за шагом. При этом говорится, что мол компиляторы не так-то просто еще написать.
Собственно вопрос вот в чем. Если в итоге программа выполняется, то какая в сущности разница выполняется сразу машинный код, или сначала интерпретатор что-то делает с исходным кодом, а уже потом выполняет его - в итоге-то процессор выполняет такие же инструкции машинные. Какая тогда разница? Явно же не в том, что компилятор сохраняет машинный код в файл заранее, а интерпрететор нет) Ну допустим я понимаю, что при интерпретации программы с if-ами какая-то часть никогда может быть и не выполнена, а следовательно не переведена в машинный код. Но, опять же, наверное не в этом проблема, что сложно перевести все if-ы в машинный код заранее, то есть скомпилировать код.
Короче, в чем еще отличия и сложности реализации компилятора в отличии от интерпретатора?


Ответ

Отличий два:
Интерпретатор не занимается генерацией машинного кода. Вместо этого он вызывает для каждой интерпретируемой команды специальную функцию (являющуюся частью кода интерпретатора), которая и делают всю работу.
Компилятор же (как обычный, так и JIT) сначала генерирует машинный код, который затем скармливается процессору для непосредственного исполнения. Компилятор делает всю работу единожды (при сборке программы), а интерпретатор — каждый раз при чтении очередной инструкции. То есть при компилировании накладные расходы выполнения меньше, а следовательно, выше скорость работы конечного кода.
Теперь касательно сложности реализации компилятора. Интерпретатор просто берёт и выполняет очередное выражение программы; а как выполнит — тут же забывает про него (разумеется, предварительно сохранив результат). Компилятор же вынужден мыслить более глобально: тут и оптимизации, и межмодульный импорт/экспорт сущностей (ведь программа может состоять из множества файлов исходных кодов). В придачу, компилятор должен придерживаться определённых соглашений и стандартов для взаимодействия с другими инструментами (компоновщиком, к примеру); интерпретатор же является «вещью в себе», делающей всю работу самостоятельно.

Запись массива в json файл

Есть html страница с 3 input-и type="radio"(один из них submit), при выборе одного и нажатия на подтверждающую кнопку данные какая кнопка выбрана обрабатываются php скриптом и записываются в json файл. Но проблема в том, что когда один раз выбираешь первый а потом второй то в файл записывается вместо одной из цифр(кол-ва нажатий конкретно на этот input) какие-то знаки.Переменные $yes и $no меняются в зависимости от того как часто нажимали на каждую из кнопок. Вот весь код php

How are you?

Good:
Bad:

Вот весь код php
$filename = "data.json"; $content = file($filename);
$array = explode(",", $content[0]); $yes = isset($array[0]) ? $array[0] : 0;; $no = isset($array[1]) ? $array[1] : 0;;
if ($vote == 0) { $yes += 1; } if ($vote == 1) { $no += 1; }
$insertvote = [ 'Good: ' => $yes, 'Bad: ' => $no ]; $pretty = json_encode($insertvote, JSON_PRETTY_PRINT); $fp = fopen($filename,"w"); fputs($fp,$pretty); fclose($fp); ?>
Вот вывод json файла
{ "Good: ": "{
", "Bad: ": 1 }


Ответ

Проблема в том, что Вы не декодируете json перед использованием:
$content = json_decode(file_get_contents($filename), true) ?: ['Good' => 0, 'Bad' => 0];
if ($vote == 0) $content['Good'] += 1; if ($vote == 1) $content['Bad'] += 1;
file_put_contents($filename, json_encode($content));

Python - NameError (двунаправленный связный список)

Правильно ли я реализую двунаправленный связный список и, если да, то как исправить ошибку?
class Cell: def __init__(self, value, name, prev, next): self.value = value self.name = name self.prev = prev self.next = next
E = Cell(5, "E", D, None) D = Cell(4, "D", C, E) C = Cell(3, "C", B, D) B = Cell(2, "B", A, C) A = Cell(1, "A", None, B)
NameError: name 'D' is not defined


Ответ

Вы на правильном пути, однако если конструктор списка будет принимать и предыдущую и следующую вершины, то возникнет циклическая зависимость. Возможным решением может быть убирание prev и next из конструктора и вынос их установки в отдельный метод:
class Cell: def __init__(self, value, name): self.value = value self.name = name
def set_prev_and_next(self, prev, next): self.prev = prev self.next = next
A = Cell(1, 'A') B = Cell(2, 'B') C = Cell(3, 'C') D = Cell(4, 'D') E = Cell(5, 'E')
A.set_prev_and_next(E, B) B.set_prev_and_next(A, C) C.set_prev_and_next(B, D) D.set_prev_and_next(C, E) E.set_prev_and_next(D, A)
Однако в таком случае вам нужно будет каждый раз ручками заботиться о том, чтобы значения prev и next были согласованы. Например, если вы захотите вставить элемент в середину списка, то вам нужно будет вызвать метод set_prev_and_next у трёх элементов: вставляемого, предыдущего и следующего. Гораздо лучшим вариантом будет написать метод вроде insert_after, который будет вставлять элемент после некоторого элемента и сам обрабатывать согласованность значений prev и next. Например, так:
class Cell: def __init__(self, value, name): self.value = value self.name = name self.prev = None self.next = None
def insert_after(self, cell): if self.next is None: cell.prev = self cell.next = self self.prev = cell self.next = cell else: cell.prev = self cell.next = self.next self.next = next cell.next.prev = cell
A = Cell(1, 'A') B = Cell(2, 'B') C = Cell(3, 'C') D = Cell(4, 'D') E = Cell(5, 'E')
B.insert_after(A) C.insert_after(B) D.insert_after(C) E.insert_after(D)

Entity Framework и сборщик мусора

Собирает ли сборщик мусора, коллекции записей, которые были материализованы EF? В одном потоке создаются сущности и вставляются в конкурентную очередь, а затем в другом потоке идет вставка N сущностей в навигационное свойство с последующим SaveChanges. Объекты уничтожаются после SaveChanges?
Или все привязано к контексту и нужно его пересоздавать?


Ответ

1) Да, конечно. Грубо говоря, сборщик мусора очищает всю память, на которую не указывает ни один указатель в процессе. То есть если вы не храните в переменных ссылки на эти коллекции и контекст БД был "уничтожен", то сборщик мусора очистит память (в удобный для него момент времени).
2) После SaveChanges нет. Все сохраненные сущности останутся в полях Local соответствующих DbSet'ов. Поэтому сборщик мусора не сможет очистить выделенную для них память. Дальше два варианта развития событий: 1) вы забудете о ссылке на DbContext, сборщик мусора уничтожит его, потом уничтожит и сущности. 2) вы не забудете о контексте и вызовите Dispose для него, так как он вам больше не нужен.. тогда метод Dispose уничтожит и контекст и все сущности с ним связанные.

Не добавляется сss свойство через jquery

Не могу понять почему не меняется свойство у ссылки, при нажатии, при этом класс добавляется
Вот сам код
$(function() { $(".item-list-dir").click(function () { $(".item-list-dir").removeClass("active"); $(this).addClass("active");
$(this).hasClass("kitchen").css("background-color", "yellow"); }); });


Ответ

https://api.jquery.com/hasclass/
if ($(this).hasClass("kitchen")) $(this).css("background-color", "yellow");

Выполнение задач в Docker-контейнере в Jenkins

Может ли Jenkins работать так же, как GitLab Runner + Docker executor
Из образа развернуть контейнер. Внутрь контейнера клонировать репозиторий git, выполнить произвольные команды. Выделить артефакты и сохранить их вне контейнера, свернуть контейнер (завершить его работу).
Вопрос: нужна пошаговая инструкция по настройке Jenkins для выполнения трех вышеуказанных шагов.
Нашел Docker Plugin. Вроде бы он умеет разворачивать Jenkins slave в докере, подключать его к мастеру и утилизировать после использования. Этот вариант мне точно не подходит, потому что нужно тащить в сборочное окружение Java и прочие не нужные там вещи. Базовый образ jenkins-slave весит в 100 раз больше alpine, это вообще за гранью разумного.
docker images REPOSITORY ... SIZE alpine ... 3.97 MB evarga/jenkins-slave ... 368 MB
Еще нашел плагин Docker build step. Одна из фич — "create new container from image". Возможно, мне нужно именно это, но я не понимаю, как выполнить пункты 2 и 3.


Ответ

В Jenkins можно выполнить bash/batch команду, для bash это будет примерно так:
docker run -it -d my_image # запускам image в detached моде docker exec $(docker ps -a -q --filter ancestor=my_image) bash -c "cd your_path; your_command" # запускаем Вашу команду в контейнере.
list=$(docker exec $(docker ps -a -q --filter ancestor=my_image) bash -c 'ls /path/to/artifacts/inside/container') # создаем список артефактов, которые мы будем вытаскивать из контенера for i in $list; do docker cp $(docker ps -a -q --filter ancestor=my_image):$i ./path/to/outside container ; done # вытаскиваем артефакты согласно списку
for i in $(docker ps -a -q --filter ancestor=my_image); do docker rm $(docker stop $i); done # удалям контейнеры, если они работают

Выделение опции при совпадении значения из текстового поля

Есть некий набор опций:

и input со значением:

Как проще всего реализовать выделение селектора по совпадению значения из текстового поля?


Ответ

Пояснения в комментариях
// Взять значение из `input` var value = $('input[type=text]').val(); // Получить все значения из `select` (один из многих способов) var values = $.map( $('#currency option'), function(option) { return option.value }); // Проверить содержится ли значение из `input` в `select` if ( values.indexOf(value) !== -1 ) { // Установить значение `select` $('#currency').val(value); }

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

Здравствуйте. Решил поработать на чистом JS, и возник банальный вопрос, который не могу понять как решить:
Есть две функции, одна открывает, вторая закрывает Боковое меню:
function openNav() { document.getElementById("mySidenav").style.width = "250px"; document.getElementById("main").style.marginLeft = "250px"; document.getElementById("mySidenav").className += ' mySidenavOpen'; document.getElementById("opener").style.display = "none"; }
function closeNav() { document.getElementById("mySidenav").style.width = "0"; document.getElementById("main").style.marginLeft = "0"; document.getElementById("mySidenav").classList.remove("mySidenavOpen"); document.getElementById("opener").style.display = "block"; }
И тут столкнулся с тем, что после того, как я открыл меню, и перехожу на другую страницу (обычный сайт с шаблонами, не SPA), то, естественно, меню по умолчанию закрыто, для чего решил юзать куки:
Изменил функцию открытия меню, описанную выше, добавив в неё сэт куки:
function openNav() { ... Cookies.set('mySidenav', 'open'); }
И перед всем этим делом, проверяю, есть ли в куках значение:
if (Cookies.get('mySidenav')) { if (Cookies.get('mySidenav') === 'open') { openNav(); } }
И теперь, что очевидно, при каждой загрузке страницы, меню открывается, но только после загрузки всего JS, при этом не являясь открытым по умолчанию (при рендеринге HTML).
Подскажите, как реализовать это правильно?
Если работать с LocalStorage, то суть не поменяется, ведь нужно, в любом случае, ждать, пока по ключу будет получено значение.
Думал про прелоадер, но дело в том, что страницы сейчас грузятся крайне быстро, в связи с малым весом статики и отсутствием медиа, и не хочется портить всё это впечатление бросающейся в глаза "подгрузкой" контента.
ПРИМЕЧАНИЕ
Куки получаю при помощи js-cookie
Все подключения js файлов идут перед закрывающимся тегом .
Ради решения этой задачи не хочу менять расположение скриптов.


Ответ

Вот это да, вопрос задан 9 месяцев назад, и никто так и не ответил. Отвечу, лучше поздно, чем никогда )
Я сталкивался с такой проблемой, и решил ее вот так:
Делаем для враппера (body) всего контента visibility: hidden; opacity: 0; transition: opacity .6s; на событие window on load врапперу добавляем класс .is-loaded котороый сделает visibility: visible; opacity: 1;
В итоге получаем на мгновение белый экран и быстрое плавное появление контента с работающими слайдерами, меню, селект2 и без дерганья. Очень приятно выглядит.

Symfony 3, удалить записи из двух таблиц

Здравствуйте, мне нужно удалить записи из двух таблиц. Есть таблица orders которая связана по типу один ко многим с таблицей order_item. Нужно по некоторой выборке записей из orders удалить соответствующие запитси в order_item.
public function deleteOrders() { $dayClear = new DateTime('-2 days');
return $this->createQueryBuilder('o') ->delete('AdminBundle:Order', 'o') ->delete('AdminBundle:OrderItem', 'oi') ->leftJoin('AdminBundle:OrderItem', 'oi', 'WITH', 'oi.order_id = o.id')
->where('o.total IS NULL') ->andWhere('o.updated <= :dayClear') ->setParameter('dayClear', $dayClear) ->getQuery() ->getResult();
}
Я реализовал такой метод для удаления. но он не рабочий, при этом когда я комментирую строку
->delete('AdminBundle:OrderItem', 'oi')
то данные из первой таблице удаляются. В чем может быть проблема и как решить задачу? Заранее спасибо!


Ответ

Если реализовывать через DQL, думаю проще будет в первую очередь нужно найти ids. И потом можно сделать приблизительно так:
$this->createQueryBuilder('o') ->delete() ->from('AdminBundle:Order o, AdminBundle:OrderItem oi') ->whereIn('o.id', '?', $ids) ->whereIn('o.order_id', '?', $ids) ->getQuery() ->getResult();

Parallax эффект для background

Подскажите инструмент , желательно с RU документацией и минимальной нагрузкой , для реализации Parallax эффекта у background.


Ответ

Есть вот такая штука:
http://www.jqueryscript.net/animation/Easy-Background-Image-Parallax-Effect-with-jQuery-CSS3.html
Сам пользовался либой jquery.parallax.js, но не могу найти её в гугле
Есть ещё вот что:
http://www.jqueryscript.net/animation/Easy-Background-Image-Parallax-Effect-with-jQuery-CSS3.html

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

Как обманывать браузер? У меня есть такой код, который обновляет содержимое. Как можно сделать так, чтобы при выполнении кода крутился бы загрузчик во вкладке браузера, а после — остановился.
$('').load(url+'', function(data) { // Код });


Ответ

Этот текст взят из правки вопроса.
По-моему нету другого решения. Моя реализация.
$('body').on('click', 'a[href]', function(e) { e.preventDefault(); var url = this.href; var iframe = $('