Страницы

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

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

Перегрузка метода внутри класса в 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); });