Страницы

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

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

Будет ли блокировка работать правильно?

У меня в коде много блокировок. Хотел немного сократить код и написал небольшой велосипед. Скажите пожалуйста будет ли это работать должным образом?
public static class LockingCall { public static readonly object LockObject = new object();
public static void Invoke(Action action) { lock (LockObject) { action(); } }
public static T Invoke(Func function) { lock (LockObject) { return function(); } } }


Ответ

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

Как безопасно прочитать файл

Есть несколько способов прочитать информацию из файла. При этом, если файл занят другим процессом, то будет выброшено исключение.
Исключение конечно же можно перехватить, но если это недопустимо, что можно сделать?
Ситуация такая: используется FileSystemWatcher для чтения файла после изменения, изменение скорей всего будет сделано из блокнота. Если сразу после события об изменении попробовать прочитать файл, то его еще будет использовать процесс блокнота и он не успеет освободить доступ, мы получим исключение в большинстве случаев.
Для начала, хотелось бы понять, как можно проверить доступность на чтение файла, перед тем как его читать, что бы не ловить исключение.


Ответ

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

Для чего выносят Service в отдельный процесс?

Можете объяснить, для чего Service выносят в отдельный процесс (при помощи добавления строки android:process в манифесте)?

Сначала я подумал, для того, чтобы, при убийстве приложения (смахиваем пальцем в диспетчере задач), он не умирал вместе с активностью. Как показала практика — он продолжает жить. Потом я подумал, что это сделано для того, чтобы, когда сервис сам себя перезапускает, не открывалась активность — и тут снова не то! Активность при перезапуске не открывается. Потом я подумал, что это сделано для того, чтобы не тормозила активность! Но тут на помощь приходит IntentService...
Так в чем же заключается смысл?


Ответ

IntentService и Service различны и используются для разных задач.
По умолчанию Service действует в UI потоке, а IntentService - в отдельном. Т.е. при сильной нагрузке на обычный сервис будет "тормозить" активити.
Просто заменить на IntentService не всегда возможно и целесообразно, т.к. он используется для иных задач (единоразовое действие - сделал и помер) и, по умолчанию, не должен быть "долгоживущим", в отличие от Service (например плеер с управлением им из уведомления).
Таким образом Service выносят в отдельный поток когда он должен быть "долгоживущим" и, при этом, не должен "тормозить" активити.

настройка консоли GitBash

есть ли возможность настраивать под себя виндовую консоль GitBash ?
мне надо изменить дефолтную директорию, куда я попадаю после входа, а то каждый раз приходится писать длинный путь, чтобы попасть в нужно место - где хранятся проекты хотелось бы изменить редактор файлов, например с Vim на nano


Ответ

открываете консоль, а дальше делаете так
vim ~/.bashrc
(вместо вима можете запустить свой любимый редактор, файла скорее всего не будет)
в открытом окне редактора вставляете такое
cd Documents/myprojects # куда перейти export EDITOR=nano # а это редактор
сохраняете и перезапускаете git bash. Он может ругнуться на то, что отсутствует .bash_profile, но он его создал. Ещё раз закрываем и перезапускаем. Все должно быть так как нужно.
Замечания:
путь нужно писать по правилам баша, то есть с прямыми слешами переменая окружения EDITOR - это такая специальная переменная, куда многие утилиты заглядывают, когда им нужно редактировать файл. В том числе и git, когда ему нужно отредактировать сообщение коммита или сделать интерактивный rebase. в этот же файл можно запихнуть и более сложную логику - к примеру, по понедельникам заходить в один каталог, а в другие дни - в другой. Пример
if [[ `date "+%u"` == 1 ]] # 1 - понедельник then cd /tmp else cd / fi

JavaScript 6 classes

Как можно избегать префиксов "this." перед переменными в классе, если их много? Пример:
class Person { constructor() { this.name = "a"; this.lastName = "b"; this.age = 20; this.hair = "black"; } }


Ответ

Запиши все проперти вначале в вспомогательный объект, а затем присвой их this.
class Person { constructor() { let props = { name : "a", lastName : "b", age : 20, hair : "black" } for (let prop in props) { this[prop] = props[prop]; } } }
Но это все бред, это только сделает код тяжелее. Не бойся использовать this, или же применяй defineProperties, но от него код станет еще толще.
Так же есть экспериментальный метод Object.assing.
Object.assing(this, { name : "a", lastName : "b", age : 20, hair : "black" });
Но насколько я знаю он поддерживается лишь Firefox, а для прочих браузеров существует лишь в виде полифила или трансплайера и по сути представляет из себя инкапсуляцию способа, что я привел вначале.

Как проверить является ли введенная строка числом? [дубликат]

На данный вопрос уже ответили: Как определить, является ли строка числом? 8 ответов Есть ли какой-то булевый метод в java, который принимает строку и проверяет является ли она числом?Например имеем переменную String var="2";. И надо проверить можно ли ее перегнать в переменную числового типа(Например так Integer.parseInt(var);)


Ответ

public static boolean isInteger(String s) { try { Integer.parseInt(s); } catch(NumberFormatException e) { return false; } catch(NullPointerException e) { return false; } // only got here if we didn't return false return true; }
(c) from

Затемнение/засветление у разных объектов в одном блоке

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


Ответ

1. Если речь идет о том случае, когда фон - это изображение, то прозрачность влияет на весь элемент, включая его содержание, и нет никакого способа изменить это поведение. Вы можете обойти эту проблему двумя следующими способами:
"Запасной" ДИВ
Добавьте еще один элемент DIV в контейнер для хранения фона. Это самый кроссбраузерный дружественный метод и будет работать даже на IE6.

I am a transparent image

.myDiv { position: relative; z-index: 5; height: 300px; width: 700px; color: #000; font-size: 400%; padding: 20px; margin-top: 40px; font-family: Arial; text-transform: capitalize; }
.myDiv .bg { position: absolute; z-index: -1; top: 0; bottom: 0; left: 0; right: 0; background: #ccc url('https://images.unsplash.com/photo-1436564989038-18b9958df72b?crop=entropy&fit=crop&fm=jpg&h=650&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=1375') center center; opacity: .4; width: 100%; height: 100%; }
Псевдоэлементы :before и ::before
Можно добавить псевдоэлемент, у которого будет добавлен фон и прозрачность.

Free Beautiful Photo


.container{ width: 700px; max-width: 100%; height: 200px; display: block; position: relative; }
.container:before { content: ""; background: green url('https://images.unsplash.com/photo-1438755582627-221038b62986?crop=entropy&fit=crop&fm=jpg&h=650&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=1375') 0 0 no-repeat; opacity: 0.5; top: 0; left: 0; bottom: 0; right: 0; position: absolute; z-index: -1; }
.sign{ position: absolute; top: 50%; left: 50%; margin-left: -124px; transform: translateY(-50%); }
.sign p{ font-size: 20px; text-transform: uppercase; color: green; font-weight: bold; font-family: Arial; }
Дополнительные замечания
Из-за поведения z-index вам придется установить z-index для контейнера, а также отрицательный z-index для фонового изображения.
Ответ на этот вопрос уже давался на stackoverflow на английском. Там же есть код и ссылки на jsfiddle. Ссылка на ответ
Еще один источник на английском языке
Мой тестовый JSFiddle
2. Если речь идет о случае, когда фон - это просто какой-либо цвет, прозрачность которого нужно изменить то используйте CSS-свойство backround-color: rgba(0, 0, 0, 0.5);
Ответ на такой вопрос на stackoverflow in english