Страницы

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

пятница, 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

Прозрачные треугольники внизу фиксированного хедера

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


Ответ

Варианты:
Вставляете див с бэкграундом из треугольников Делаете много труегольников через css и border : `border: 20px solid transparent; border-top: 20px solid green; Трансформация!
Вот код
.block { border: 1px solid green; border-radius: 10px; padding: 20px; position: relative; background: green; color: #fff; box-shadow: 0 0 7px #000; /* Добавляем тень для блока */ } .block::after, .block::before { content: ''; position: absolute; background: green; left: 20px; bottom: -11px; width: 20px; height: 20px; box-shadow: 0 0 7px #000; /* Добавляем тень для уголка */ z-index: -1; /* Прячем за основным блоком */ transform: rotate(45deg); /* Поворачиваем на 45º */ -webkit-transform: rotate(45deg); } .block::before { z-index: 1; /* Накладываем поверх, чтобы скрыть следы тени */ box-shadow: none; /* Прячем тень */ }
Источник :
Htmlbook

Перегрузка метода внутри класса в Python

Всю жизнь писал на Java, начал изучать python в связи с чем появилось много вопросов. Например в Java можно писать вот так:
public class test { public static void main(String[] args) {
}
private void testrunner() {
}
private void testrunner(int i) {
}
private void testrunner(String c) {
} }
Как написать так же на питоне ? Ну вот пишу я так IDE сразу ругаться начинает
class test: def testrunner(self): pass def testrunner(self,a): pass


Ответ

В Python нет возможности перегрузить метод класса, как например в Java или С.
Но есть костыль. Метод может иметь значения параметров по-умолчанию, что совместно с проверкой типа аргумента позволит вам сделать то, что вы хотите:
from types import *
class Test(object):
def testrunner(self, i=None): if isinstance(i, str): print 'c: ', i elif isinstance(i, int): print 'b: ', i else: print 'a'

AlarmReceiver, WakefulBroadcastReceiver и установка будильников

Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего, я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий вопрос: тут мой вопрос
Подскажите, пожалуйста, как реализовать следующую задачу: Есть таблица в БД, в которой находятся записи. Колонки в таблице: [ID][NAME][DAY][HOURS][MINUTES]
Также есть Активити, которую нужно вызывать в заданное время.
То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить Alarm-ы, которые будут вызывать Активити.
Содержимое Активити менять не нужно (оно будет менятся уже в onCreate() самой Активити).
Проблема в том, что я не понимаю, как поставить alarm-ы в множественном числе. Опять-таки, по ссылке, приведённой выше, я показал своё виденье реализации задачи.
Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи не могу двигаться дальше :(


Ответ

Попробуйте в Вашем коде заменить на это:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("alarm message", "alarm message"); if (android.os.Build.VERSION.SDK_INT >= 19) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Просто для разных версий андроида регистрация pendingIntent-a происходит по-разному. Плюс, вы всегда регистрировали его под номером 192837, я заменил его на i, так как эта переменная используется в цикле, и она будет уникальная, и каждый последующий pendingIntent не будет перезаписывать предыдущий.
Если есть необходимость удалить все зарегестрированные интенты, то вызовите такую функцию:
public static void clearAlarmReceiver(Context context, int intentsCount) { for (int i = 0; i < intentsCount; i++) { Intent intent = new Intent(context, CheckAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }

Как активировать EditText

У меня есть EditText который при создании активити скрытый editText.setVisibility(View.GONE) , после чего при выполнении некого условия это текстовое поле должно появиться и что бы курсор в нем уже мигал , вместе с этим - должна появится и клавиатура. Я пробовал делать так, поле появляется, но курсор в нем и клавиатура - нет. Что я не так делаю?
@Override public void onQuestionDialogItemClick(int which) { messageCompose.setVisibility(View.VISIBLE); etInputMsg.setEnabled(true); etInputMsg.setSelected(true); }


Ответ

Это покажет клавиатуру
InputMethodManager inputManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(view, 0);
Это даст фокус твоему EditText
etInputMsg.requestFocus();

Нет подходящего конструктора по умолчанию

Есть два класса, о дин наследует другой, тип наследования public. При компиляции выдает следующую ошибку: Нет подходящего конструктора по умолчанию. Подскажите в чем проблема, два заголовочных файла ниже.
Integer.h
class Integer { private: int *_mass; int _system; int _size; public: Integer(const int *mass, const int system, const int size); Integer(const Integer &); ~Integer() { delete[] _mass; _mass = nullptr; } Integer & operator=(const Integer &);
IntegerCalc.h
class IntegerCalc: public Integer { private: Integer _a; Integer _b; public: IntegerCalc(Integer &a, Integer &b) : _a(a), _b(b) {}; // ВОТ ТУТ ВЫДАЁТ ОШИБКУ ~IntegerCalc() {};


Ответ

Ваш класс IntegerCalc наследуется от Integer - а значит, любой конструктор IntegerCalc должен вызывать конструктор Integer. Не конструктор поля, которые вы вызываете - а конструктор базового класса.
Поскольку вы его не вызываете - компилятор автоматически добавляет вызов конструктора по умолчанию. Получается как-то так:
public: IntegerCalc(Integer &a, Integer &b) : Integer(), _a(a), _b(b) {};
Но конструктора по умолчанию в базовом классе-то и нет! Отсюда и ошибка.
Как такую ошибку исправить - зависит от задачи. Я не очень хорошо понимаю что вы хотели своим кодом сделать.
UPD
Подкласс калькулятор наследует класс чисел для того, чтобы иметь возможность использовать операторы и методы.
Так делать не следует. Для того, чтобы "использовать операторы и методы", надо использовать простой friend, а не наследование. А еще лучше - не делать отдельного интерфейса для калькулятора. Почему калькулятор не может пользоваться открытыми методами?

Залогинивание в приложении. Оптимальный вариант. Шифрование

Есть приложение на подобии чата. На сервере есть бд, где хранятся пароли (хэши) и логины. Как лучше всего организовать залогинивание? Я могу сохранять логин и пароль в бд у пользователя (sqlite), а потом подставлять, но это мне не очень нравится, так как можно легко угнать данные. Можно как-нибудь зашифровать, но зная алгоритм, можно расшифровать. Как лучше всего сделать? Где безопаснее всего хранить?
Тот же хром просто надругательство. Пароли шифруются стандартным методом, что позволят без труда их угнать.


Ответ

В общем виде эта задача неразрешима - любая информация, доступная клиенту, является потенциально доступной злоумышленнику. Можно лишь увеличить затраты потенциального злоумышленника на получение информации.
Для начала, неплохой идеей может быть просто base64-преобразование пароля. Куча непонятных буков сама по себе может отпугнуть злоумышленника.
Однако даже испуганный злоумышленник может просто скопировать пароль к себе и воспользоваться вашей же программой. Поэтому следующий уровень защиты - шифровать пароль любым симметричным алгоритмом, а ключ хранить в другом месте. В таком случае злоумышленнику придется сначала найти где хранится ключ, чтобы воспользоваться украденным паролем.

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

Установка приложения через ADB

Дано: название пакета из Google Play к примеру (details?id=com.whatsapp)
Задача: установить это приложение на устройство автоматически, т.е. написал имя пакета и приложение установилось на устройство, как можно это реализовать?


Ответ

Этот вопрос уже задавался здесь (англ)
Если подытожить то что сказано в ответах, то нельзя установить ничего из маркета автоматически. Но можно открыть маркет из командной строки:
adb shell am start -a android.intent.action.VIEW -d 'market://details?id=com.myapp'
Либо скачать .apk файл при помощи apk downloader и установить используя adb install

Деактивация input'a через время

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

$("input[type='text']").focus(function (){ setTimeout(function () { $(this).attr("disabled", "disabled"); }, 3000); });
Пробовал так, но не получилось


Ответ

setTimeout вызывает функцию в глобальном контексте, где this это window
$("input[type='text']").focus(function (){ var thisInput = this; setTimeout(function () { $(thisInput).attr("disabled", "disabled"); }, 3000); });