Страницы

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

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

четверг, 30 мая 2019 г.

В чем преимущества выделения контроллера в mvc?

У меня сразу несколько вопросов по mvc. Спрашивать буду на примере игрушечной программки, которую специально для этого написал:
public class View implements Observer {
private Model model; private IController controller;
private JLabel firstNumber = new JLabel(); private JLabel secondNumber = new JLabel(); private JLabel resultLabel = new JLabel();
public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Model model = new Model(); IController controller = new Controller(); View view = new View(); view.setModel(model); view.setController(controller); view.createAndShowGUI(); } }); }
public void setModel(Model model) { this.model = model; model.addObserver(this); }
public void setController(IController controller) { this.controller = controller; }
public void createAndShowGUI() { JFrame frame = new JFrame("mvc train"); frame.setSize(400, 400); frame.getContentPane().add(createMainPanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
private Component createMainPanel() { JPanel mainPanel = new JPanel(); mainPanel.add(firstNumber); mainPanel.add(secondNumber); mainPanel.add(resultLabel); JButton inc1 = new JButton("increment first"); inc1.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { controller.execute("inc1", model); } }); JButton dec1 = new JButton("decrement first"); dec1.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { controller.execute("dec1", model); } }); mainPanel.add(inc1); mainPanel.add(dec1); JButton inc2 = new JButton("increment second"); inc2.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { controller.execute("inc2", model); } }); JButton dec2 = new JButton("decrement second"); dec2.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { controller.execute("dec2", model); } }); mainPanel.add(inc2); mainPanel.add(dec2); return mainPanel; }
@Override public void update(Observable arg0, Object arg1) { firstNumber.setText("" + model.getA()); secondNumber.setText("" + model.getB()); resultLabel.setText("" + (model.getA() + model.getB())); }
}
Это класс представления. Получается такая картинка:
Кнопка increment first увеличивает на единицу первое число, increment second - второе, decrement first уменьшает первое число на единицу, decrement secomd - второе. В общем, после двух нажатий на increment first и одного нажатия на increment second получаем такую картинку:

Два числа хранятся в модели. Вот она:
public class Model extends Observable {
private int a; private int b;
public void incrementA() { a++; setChanged(); notifyObservers(); }
public void incrementB() { b++; setChanged(); notifyObservers(); }
public void decrementA() { a--; setChanged(); notifyObservers(); }
public void decrementB() { b--; setChanged(); notifyObservers(); }
public int getA() { return a; }
public int getB() { return b; }
@Override public void addObserver(Observer observer) { super.addObserver(observer); setChanged(); notifyObservers(); }
}
Мой контроллер:
public class Controller implements IController {
@Override public void execute(String action, Model model) { switch (action) { case "inc1": model.incrementA(); break; case "inc2": model.incrementB(); break; case "dec1": model.decrementA(); break; case "dec2": model.decrementB(); } }
}
Теперь вопросы. Самый главный вопрос собственно в названии.
Чем нам помог контроллер? Код из веток case оператора switch в контроллере мог бы с таким же успехом находится в слушателях. На каждую ветку по слушателю. В итоге слушателей все равно приходится создавать, что бы вызвать метод контроллера. А потом в этом методе в операторе switch прописывать тот же самой код, что мог бы быть в слушателях. Может быть я вообще неправильно реализовал mvc? Подозреваю что именно так. Причем именно в части контроллера. Потому что по нему в сети мало информации. Если это так то прошу подсказать как правильно. Слышал что можно создавать контроллеры для каждого элемента (в данном случае для каждой кнопки). Но ситуация не сильно поменяется. В моем примере все методы, которые вызывается в ветках case не имеют параметров. В реальных программах это скорее всего будет не так. Некоторые кнопки могли бы требовать вызовов методов с параметрами, причем с разным количеством параметров. Что делать в такой ситуации? Где лучше вычислять самое правое число? В моем примере я делаю это в функции update(). Не лучше ли это делать в модели?


Ответ

Контроллер помогает структурировать код. Весь код, реагирующий на пользовательский ввод, принадлежит контроллеру.
Можно было бы всё слить в один класс, и делать всю логику в OnClick, и код получился бы наверное даже короче. Но вашей целью должен быть не самый короткий, а самый понятный и легко поддерживаемый код. Мне кажется, ваша диспетчеризация команд по строкам — неправильна. Команды должны быть не строками, а объектами. (У нас же ООП, в конце-концов, да?) И вместо длинного свитча у вас должен быть всего лишь вызов Invoke. [Но это практика из MVVM, общепринятого паттерна в WPF, а традиции в MVC могут быть и другими.] Вычисления принадлежат модели и только ей. Представление должно не выполнять работу модели (а сложение в реальной программе превратится в серьёзное, длинное вычисление), а лишь только отображать её.

Поиск всех значений в TreeMap c “неполным” ключом

Доброго времени суток. Нужен совет, как найти все значения в TreeMap с "неполным" ключом. Допустим имеются какие то значения с ключами "Book","Boom","Trap"... При ключе "Boo" должен выводить значения у которых ключ начинается на этот кусок.
Пробовал использовать методы ceilingKey(), floorKey(), higherKey(), lowerKey(), но столкнулся с проблемой, выводит лишь одно значение. Попробовал удалять элементы после получения, тогда он выводит весь TreeMap пока не опустеет.
Может есть какой то более подходящий подход для этой задачи ?


Ответ

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

Узнать имя класса во время исполнения программы

У меня есть функция (используется для записи логов), которая вызывается в разных классах. Не хочется каждый раз переписывать код в ней для каждого нового класса(они будут и добавляться и убираться со временем, ну или вообще функция будет использоваться в дальнейшем в других проектах).
Мне хотелось бы узнавать имя класса, из которого она вызывается (для задания имени файлу и прочих плюшек) не передавая лишних параметров в функцию.
Это можно реализовать? Можно и boost`ом.


Ответ

Функция typeid(object) возвращает объект типа type_info с информацией о типе объекта, для которого она вызывается (собственно, о классе). У этого объекта(type_info) есть метод name(), который и возвращает имя класса. Для использования нужно подключить
Так что в итоге для получения имени класса нужно использовать
typeid(*this).name()
Или, если функция не является методом класса, передать в typeid сам объект или разыменованный указатель.

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

Дано: бинарное дерево (алгоритм дерева написан вручную). Число S. Нужно найти последовательность узлов (только с вверху вниз или наоборот) в бинарном дереве, сумма которых равна S
Например: есть бинарное дерево, а число S = 9.
Решение: 3+6, 4+5, 9.
п.с. желательно, что бы это был отдельный класс, который имел доступ к классу binTree
#pragma once class binTree { protected: struct Node { int Value; Node * pLeft; Node * pRight; Node * pParent; Node(int x) :Value(x), pLeft(NULL), pRight(NULL), pParent(NULL) {} }; Node * m_pRoot; void InoderTreeWalk(Node * x); Node * TreeSuccessor(Node *x); Node * TreeMin(Node * x); public: binTree(); ~binTree(); virtual void TreeInsert(int k); Node * TreeSearch(Node * X, int k); void ShowTree(); int Root(); };


Ответ

Задача тянет на олимпиадную, пишу идею.
Решение будет сделано с помощью динамики по дереву.
Для каждого узла в дереве заведём список значений. Инициализация - в листах {0, Value}. Пересчёт снизу вверху. Значение для узла пересчитывается примерно так (текущая вершина U):
for (auto left : U->left->list) U->list.add(left + U->Value); for (auto right: U->left->right) U->list.add(right+ U->Value); U->add(U->Value); U->list->unique();
Я специально пишу псевдокодом, т.к. там может быть любая структура от специфики задачи (list vector set bitset) и т.д.
Для каждой вершины, где в списке есть S будет последовательность ответ, которая заканчивается в ней. Её можно восстановить примерно так. Последовательность однозначно задаётся начальным и конченым элементом. Я верну только начальные.
list fun(Tree *U, int S){ S -= U->Value;
list tmp; if (S == 0) tmp.add(U);
if (U->left->list.contains(S)) tmp.add(fun(U->left,S); if (U->rigth->list.contains(S)) tmp.add(fun(U->rigth,S); return tmp; }
Сложно что-то порядка O(N^2 log N). Оптимизировать можно, но если выводить все последовательности то их может быть примерно столько же. Дальнейшие реализации/оптимизации вам виднее.

Entity Framework не удаляется связанная по внешнему ключу запись

Пытаюсь удалить элемент из коллекции UsersVaults объекта типа User, но получаю Exception (текст ошибки и код ниже). Подскажите, где я повернул не туда?
Метод изменения объекта:
[HttpPost] public ActionResult Edit(int id, FormCollection form) { try { using (var db = new AccessControlSystemDatabaseModel()) { var user = db.Users.Find(id); var tempData = form.AllKeys.ToDictionary(key => key, key => form[key]);
user.RoleID = Convert.ToInt32(tempData["RoleID"]); user.Username = tempData["Username"].ToString(); user.Password = tempData["Password"].ToString(); user.Email = tempData["Email"].ToString();
if (!tempData["GrantAccess"].ToString().Equals("false") && user.UsersVaults.Where( d => d.VaultID == AuthenticationController.CurrentUser.UsersVaults.ToList()[0].VaultID) .ToList() .Count == 0) { user.UsersVaults.Add(new UsersVault { UserID = id, VaultID = AuthenticationController.CurrentUser.UsersVaults.ToList()[0].VaultID, }); } else { var tt = user.UsersVaults.Where( d => d.VaultID == AuthenticationController.CurrentUser.UsersVaults.ToList()[0].VaultID).ToList()[0];
user.UsersVaults.Remove(tt); }
db.Entry(user).State = EntityState.Modified; db.SaveChanges();
return RedirectToAction("Index"); } } catch(Exception e) { return RedirectToAction("Index"); } }
Модель:
public partial class AccessControlSystemDatabaseModel : DbContext { public AccessControlSystemDatabaseModel() : base("name=AccessControlSystemDatabaseModel") { }
public virtual DbSet Roles { get; set; } public virtual DbSet Users { get; set; } public virtual DbSet UsersVaults { get; set; } public virtual DbSet Vaults { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(e => e.UsersVaults) .WithRequired(e => e.User) .WillCascadeOnDelete(true);
modelBuilder.Entity() .HasMany(e => e.UsersVaults) .WithRequired(e => e.Vault) .WillCascadeOnDelete(true); } }
public partial class Role { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Role() { Users = new HashSet(); }
public int ID { get; set; }
[Required] [StringLength(255)] public string RoleName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection Users { get; set; } }
public partial class User { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public User() { UsersVaults = new HashSet(); }
public int ID { get; set; }
[Required] [StringLength(255)] public string Username { get; set; }
[Required] [StringLength(255)] public string Password { get; set; }
public int? RoleID { get; set; }
[StringLength(255)] public string Email { get; set; }
public virtual Role Role { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection UsersVaults { get; set; } }
public partial class UsersVault { public int ID { get; set; }
public int UserID { get; set; }
public int VaultID { get; set; }
public virtual User User { get; set; }
public virtual Vault Vault { get; set; } }
public partial class Vault { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Vault() { UsersVaults = new HashSet(); }
public int ID { get; set; }
[Required] [StringLength(255)] public string VaultName { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection UsersVaults { get; set; } }

Текст исключения:
"Операция завершилась с ошибкой. Не удалось изменить связь, поскольку один или несколько свойств внешнего ключа не допускают значения NULL. При изменении связи соответствующему свойству внешнего ключа присваивается значение NULL. Если внешний ключ не поддерживает значений NULL, должна быть определена новая связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от NULL, либо необходимо удалить несвязанный объект."


Ответ

В EF, к сожалению, операции Add и Remove для навигационных коллекций не всегда симметричны - первая операция устанавливает связь между сущностями и при необходимости добавляет их в базу, вторая же только разрывает связь. Но разорвать связь между UsersVault и User невозможно, отсюда и ошибка.
Поэтому надо вместо удаления объекта из коллекции явно удалить его из базы:
var tt = user.UsersVaults.Single(...); db.Entry(tt).State = EntityState.Deleted;
или
db.UsersVaults.Remove(tt);
Для сохранения симметричности операций, можно при добавлении UsersVault точно так же сразу добавлять его в базу:
db.UsersVaults.Add(new UsersVault { UserID = id, VaultID = ..., })
Кстати, в вашем текущем коде есть дублирование - UserID присваивать не обязательно если вы добавляете объект через навигационную коллекцию - EF проставит его сама.

В качестве альтернативного решения могу предложить вообще удалить сущность UsersVault - она не нужна! EF умеет самостоятельно отображать связи "многие-ко-многим" на промежуточные таблицы, просто создайте mtm-связь между Users и Vaults

Как работать с TCP в Swift?

У меня есть TCP сервер, который слушает входящие команды и общается с БД. Как мне слать к нему запросы из ios приложения? Работаю со swift 2
Другими словами, нужно реализовать следующее: Пользователь вводит логин и пароль, пытается войти в свой аккаунт. В это время посылается запрос на сервер - "Проверь, есть ли такой юзер в БД". Он это делает, и шлет ответ обратно на ios приложение.
Никак не могу понять, как мне такое реализовать. Насколько я понимаю, мне нужно работать с потоками, но ничего путного про это на ios я не нашел.


Ответ

Если я Вас правильно понял, то потоки Вам вовсе не нужны. Тут надо использовать блоки. Скажем Вы отправляете запрос и включаете индикатор загрузки, а когда приходит ответ Вы прекращаете загрузку и в зависимости от результата с сервера используете success или же failure блок. Советую использовать AFNetworking
Что-то на подобии
let manager = AFHTTPRequestOperationManager() manager.GET( "http://myServerUrl.com", parameters: ["email":"myemail@gmail.com", "password":"1234Password"], success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in //TODO - make login action }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in // TODO - show error message } )

Как добавить в приложение уже заполненную базу?

Есть приложение, в нем есть список чего-то на 200 итемов.
Как мне поставлять приложение с уже заполненной базой ? т.е. чтобы после установки приложения этот список заполнился из базы.


Ответ

Схематично:
В assets кладете Вашу БД Создаете БД в приложении (стандартно SQLiteOpenHelper) Копируете при первом запуске БД из assets в БД приложения. Работаете с заполненной БД. После очистки данных приложения пользователем повторить п.3

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

Есть окно с элементом spinner, который должен заполняться значениями из базы данных MS SQL. Для связи с БД использую jtds 1.2.8 в асинхронных запросах, но никак не выходит найти способ чтобы переправить данные результата запроса в активность, которая послала асинхронный запрос. Как реализовать заполнение spinner после выполнения запроса?
UA.java
public class UA extends AppCompatActivity{
private QueryItem Item = new QueryItem();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ua); Item.setId(Search_Page.id_intent); Search_Page.id_intent = 0; String[] query = new String[2]; query[1] = "get_dish_links"; query[0] = "EXEC " + query[1] + "" + Item.getId(); new AsyncRequest().execute(query); final SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar); }
public void onClick(View view) { final Spinner spinner = (Spinner)findViewById(R.id.spinner); //Item.setUnit(spinner); }
public void fill_spinner(List links){ final Spinner spinner = (Spinner)findViewById(R.id.spinner); ArrayAdapter possible_units = new ArrayAdapter(this, android.R.layout.simple_list_item_1, links); spinner.setAdapter(possible_units); spinner.setSelection(0); possible_units.notifyDataSetChanged(); }
AsyncRequest.java
public final class AsyncRequest extends AsyncTask {
public final static String MSSQL_DB = "jdbc:jtds:sqlserver://localhost:1433; DatabaseName=Lazycook"; public final static String MSSQL_LOGIN = "lazyuser"; public final static String MSSQL_PASS = "12344321"; public final static JSONConverter conv = new JSONConverter(); public String action;
@Override protected JSONArray doInBackground(String[] query) { JSONArray resultSet = new JSONArray(); action = query[1]; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); Connection con = null; Statement st = null; ResultSet rs = null; try { con = DriverManager.getConnection(MSSQL_DB, MSSQL_LOGIN, MSSQL_PASS); if (con != null) { st = con.createStatement(); rs = st.executeQuery(query[0]); if (rs != null) { int columnCount = rs.getMetaData().getColumnCount(); // Сохранение данных в JSONArray while (rs.next()) { JSONObject rowObject = new JSONObject(); for (int i = 1; i <= columnCount; i++) { rowObject.put(rs.getMetaData().getColumnName(i), (rs.getString(i) != null) ? rs.getString(i) : ""); } resultSet.put(rowObject); } } } } catch (SQLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (st != null) st.close(); if (con != null) con.close(); } catch (SQLException e) { throw new RuntimeException(e.getMessage()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } return resultSet; }
@Override protected void onPostExecute(JSONArray result) { switch (action){ case "get_dish_links" : { List links = conv.JSONtoLink(result); // вот здесь думал использовать вызов fill_spinner // нужного объекта, передав ему результат }
} }
}


Ответ

Создайте интерфейс
public interface MyInterface { void doSmth(JSONArray result); } Реализуйте его в активити
public class UA extends AppCompatActivity implements MyInterface{
@Override public void doSmth(JSONArray result) { System.out.println("вызван doSmth в Активити"); //вот и ваш результат из задачи в актвити }
... } Передавайте его в задачу через конструктор и вызывайте его метод, передавая туда результат из onPostExecute
public final class AsyncRequest extends AsyncTask {
MyInterface myInterface;
public AsyncRequest(MyInterface myInterface){ this.myInterface = myInterface; }
@Override protected void onPostExecute(JSONArray result) { System.out.println("вызван onPostExecute"); myInterface.doSmth(result); } } В активити запускайте так:
new AsyncRequest(UA.this).execute(query);

Python. Вывод текста по середине терминала

Как можно вывести текст в центре экрана терминала, используя shutil.get_terminal_size().columns и shutil.get_terminal_size().lines?


Ответ

Если текст уже разбит на строки, то достаточно просто отформатировать:
>>> import shutil >>> lines = ['String right here', 'And here', 'Here', 'A-a-a-and here'] >>> width = shutil.get_terminal_size().columns >>> position = (width - max(map(len, lines))) // 2 >>> for line in lines: # left justtified ... print(' '*position + line) ... String right here And here Here A-a-a-and here >>> for line in lines: # right justified ... print(line.rjust(width // 2)) ... String right here And here Here A-a-a-and here >>> for line in lines: # center ... print(line.center(width)) ... String right here And here Here A-a-a-and here

Шаблонная хэш-функция

Допустим, мне нужно сделать некий шаблонный контейнер Map на хэш-таблице. Контейнер, естественно, может принимать ключем значение любых типов - как, в таком случае, написать хэш-функцию? Как привести произвольный тип T (для которого может быть не перегружен оператор приведения) к целочисленному типу? Вроде как должен помочь reinterpret_cast, который приводит к указателю, но конструкция вида
reinterpret_cast (key);
Отказывается компилироваться, когда key имеет не-целочисленный тип.
Если же приводить указатель к указателю (как в примере на msdn)
reinterpret_cast (&key);
то теряется смысл хэш таблицы - поиск по ней не будет работать, поскольку ключ с идентичным значением будет иметь другой адрес, и результат хэш-функции будет тоже другой.
Можно ли как-то насильно интерпретировать байты произвольного объекта в памяти как целочисленный тип? Вообще, какое решение будет правильным? Как эта проблема решена в std::unordered_map или QMap?


Ответ

Классы наподобие unordered_set вычисляют хеш не сами, а используют std::hash (а также дают возможность пользователю указать свою реализацию хеширования, если он недоволен стандартной, или если её не существует).
std::hash, в свою очередь, тоже не пользуется никакой особой магией, а просто имеет шаблонные специализации для примитивных типов, строк и указателей (обычных и «умных»).
Мне кажется, вам стоит не изобретать велосипед, а воспользоваться той же идеей. А ещё проще, просто используйте std::hash. Поверьте, в написании контейнера есть много сложностей помимо этой.

Таким образом, просто используйте
size_t hash_value = std::hash()(t);

Как прикрепить ViewModel к UserControl?

Как прикрепить ViewModel к UserControl? В случае с window всегда делал так:
new MainWindow() { DataContext = new MainVm() };
Если делать так для UserControl то компилятор ругается. Как нужно действовать в данной ситуации?
P.S. Для общей картины обьясню к какому эффекту я стремлюсь: есть главное окно, и в зависимости от нажатий пользователся должны отображатся разные, никак не связанные между собой данные. Поэтому для каждых из этих данных я хочу создать отдельные UserControl и Vm, и по надобности просто подменять один UserControl на другой. Если у меня неправильный подход, поправьте меня.


Ответ

Контрол не должен устанавливать себе сам DataContext. DataContext должен устанавливать родительский элемент. Делайте как-то так:

То есть: нужные VM для частей, которые представляются в виде контролов, должны быть в MainVM как свойства. (Таким образом, кстати, все VM смогут общаться через центральную VM.)
Надеюсь, вы поняли идею.

Кстати, и главное окно тоже не должно создавать себе VM. Обычно делается так:


public partial class App : Application { MainVM mainVM = new MainVM();
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); new MainWindow() { DataContext = mainVM }.Show(); } }

Ввод данных в С. Не определяется GetString() из cs50

Почему у меня не определяется string s = GetString();?
hell.c
#include #include
int main(void) { printf("State our name: "); string s = GetString(); printf("hello, %s
", s); }
cc hell.c -o hell
/tmp/ccHZXs2m.o: In function `main' hell.c:(.text+0x16): undefined reference to `GetString' collect2: error: ld returned 1 exit status make: *** [hell] Error 1


Ответ

Почему бы тебе не воспользоваться методом scanf() для чтения с консоли?
int main(void) { string name; printf("Введите ваше имя"); scanf("%s", name); printf("Привет, %s
!", name); return 0; }

Как правильно работать с экземпляром класса на двух страницах? C#/UWP

Есть две страницы, на первой я создаю экземпляр класса, в который я добавляю данные. Перехожу на вторую страницу и они отображаются. Но когда я заново захожу на первую страницу, и создаю новые данные, они перезаписывают уже имеющиеся, а не добавляются. Я так понимаю, должен быть один экземпляр класса, в который я каждый раз буду добавлять данные, но как это реализовать?


Ответ

Я нашел решение, воспользовавшись передачей объекта класса как параметра во время перехода на другую страницу.
Frame.Navigate(typeof(Page), DS);
Где DS это то, что мы хотим передать, а Page та страница на которую переходим.

Библиотеки для графиков

Есть ли какие-нибудь библиотеки для работы с графиками на Android?


Ответ

Open source библиотека Graph View. Сайт | GitHub MPAndroidChart - open source, поддерживаем множество видов графиков. GitHub Androidplot - open source, также поддерживает множество видов графиков. Сайт | GitHub | Bitbucket HelloCharts. GitHub Платная библиотека Chart. Сайт Платная библиотека aiCharts. Сайт

Проблема при установке Oracle JDK на Debian

Возникла ошибка при установке Oracle JDK на Debian 8 Jessie
rostislav@Rostislav-PC:~/Загрузки$ sudo dpkg -i jdk1.8.0-91_1.8.091-1_amd64.deb Выбор ранее не выбранного пакета jdk1.8.0-91. (Чтение базы данных … на данный момент установлено 119167 файлов и каталогов.) Подготовка к распаковке jdk1.8.0-91_1.8.091-1_amd64.deb … Распаковывается jdk1.8.0-91 (1.8.091-1) … Настраивается пакет jdk1.8.0-91 (1.8.091-1) … Unpacking JAR files... tools.jar... plugin.jar... javaws.jar... deploy.jar... rt.jar... jsse.jar... charsets.jar... localedata.jar... jfxrt.jar... /var/lib/dpkg/info/jdk1.8.0-91.postinst: line 641: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postinst: line 653: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--install): подпроцесс установлен сценарий post-installation возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91
Процесс установки был таким (инструкцию нашел тут):
Скачал официальную версию JDK с сайта Oracle. Установил alien из официального репозитория. Перегнал .rpm в .deb командой sudo alien --scripts jdk-8u91-linux-x64.rpm Установил .deb пакет командой sudo dpkg -i jdk1.8.0-91_1.8.091-1_amd64.deb, во время чего и возникла ошибка
Из-за чего произошла ошибка и как ее исправить?

UPD_0 (kvm): При попытке удалить JDK:
rostislav@Rostislav-PC:~$ dpkg --remove --force-remove-reinstreq jdk1.8.0-91 dpkg: ошибка: запрошенная операция требует привилегий суперпользователя rostislav@Rostislav-PC:~$ sudo dpkg --remove --force-remove-reinstreq jdk1.8.0-91 (Чтение базы данных … на данный момент установлено 116630 файлов и каталогов.) Удаляется jdk1.8.0-91 (1.8.091-1) … /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 586: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 598: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--remove): подпроцесс установлен сценарий post-removal возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91 rostislav@Rostislav-PC:~$ sudo dpkg --purge --force-remove-reinstreq jdk1.8.0-91(Чтение базы данных … на данный момент установлено 116630 файлов и каталогов.) Удаляется jdk1.8.0-91 (1.8.091-1) … /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 586: /usr/sbin/alternatives: Нет такого файла или каталога /var/lib/dpkg/info/jdk1.8.0-91.postrm: line 598: /usr/sbin/alternatives: Нет такого файла или каталога dpkg: ошибка при обработке пакета jdk1.8.0-91 (--purge): подпроцесс установлен сценарий post-removal возвратил код ошибки 127 При обработке следующих пакетов произошли ошибки: jdk1.8.0-91


Ответ

Установить JDK из rpm это целое приключение, лучше воспользоваться java-package
Убедитесь, что подключены contrib архивы в /etc/apt/sources.list
deb jessie main contrib non-free
Установите java-package: apt install java-package Скачайте JDK с сайта Oracle, но не rpm, а tar.gz. Запустите создание deb-пакета JDK:
fakeroot make-jpkg jdk-8u91-linux-x64.tar.gz
Возможно, появятся ошибки о неудовлетворенных зависимостях, установите пакеты, о которых говорится в ошибках, затем заново запустите создание пакета. В моем случае было:
sudo apt install libgl1-mesa-glx libxslt1.1 libxtst6 libxxf86vm1
Удалите старый некорректно установленный пакет JDK. Установите созданный пакет
sudo dpkg -i oracle-java8-jdk_8u91_amd64.deb


UPD1. Если снести кривой пакет JDK через apt remove jdk1.8.0-91 не удается, удаляем его принудительно:
sudo dpkg --remove --force-remove-reinstreq jdk1.8.0-91 sudo dpkg --purge --force-remove-reinstreq jdk1.8.0-91

UPD2. Создайте симлинк
sudo ln -s /usr/sbin/update-alternatives /usr/sbin/alternatives
и еще раз попробуйте снести. Потом удалите симлинк.

Универсальный класс с параметром в виде универсального класса

Возможно ли, и если да, то как, создать универсальный (generic) класс, параметром для которого выступает другой универсальный класс?
Псевдо-код поясняющий идею:
class Gen where T : class { } // тут всё ОК class MoreGen where G : Gen { } // здесь непонятно как сделать
Хочется ограничить параметры для MoreGen только классами Gen, чтобы была возможность использовать следующий код:
new MoreGen>(); // Должно быть OK new MoreGen(); // Нужна ошибка компиляции new MoreGen>(); // Нужна ошибка компиляции


Ответ

На основании упомянутого в комментариях ответа на английском SO, решение "в лоб" не является возможным. Для достижения желаемого эффекта приходится добавлять интерфейс:
interface IGen {} class Gen : IGen where T : class { } class MoreGen where G : IGen { }
public class Test { public static void Main() { new MoreGen>(); // OK new MoreGen>(); // OK // new MoreGen(); // no implicit reference conversion from `string' to `IGen' // new MoreGen>(); // The type `int' must be a reference type } }
Результат выполнения кода

Регулярное выражение лишние символы

Есть задача, написать регулярное выражение на пропуск 2х слов, к примеру имя и фамилия, на любом языке (англ, немецкий...).
Вот как я подумал
var str = "Имя фамилия текст текст"; str.match(/^[^!@#]+ [^!@#]+$/i);
И вот результат
["Имя фамилия текст текст"]
Почему , регулярное выражение прошло валидацию? МОжет я не правильно проверяю, я не пойму...
По идее, регулярка должна найти совпадение
начало_строки[любой_символ_кроме!@#]минимум1раз пробел [любой_символ_кроме!@#]конец_строки
Но, в примере после 2ого слова есть еще пробелы, символы, и их тоже пропускает
Мне нужно проверить на любые символы кроме тех 3х знаков
Вот тестер https://regex101.com/r/kJ5vZ2/4


Ответ

Вы сами отвечаете на свой вопрос. Регулярное выражение [^!@#]+ включает в себя любые символы кроме !, @ и # в том числе включает и пробел! А это значит, что вся строка Имя фамилия текст текст подходит под первое [^!@#]+. Добавьте в список исключаемых слов пробел
Пример:
var str = "Имя фамилия текст текст"; str.match(/^[^!@# ]+ [^!@# ]+$/i);
https://regex101.com/r/kJ5vZ2/5

Почему индекс в методе pop находится вне границы?

import random WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd", "adam"] newwords = [] length = len(WORDS) newpos = "" while WORDS: newpos = random.randint(0, length-1) newwords.append(WORDS.pop(newpos)) WORDS.remove(WORDS[newpos]) print(newwords)
В общем, писал алгоритм для вывода списка WORDS в случайном порядке. И наткнулся на ошибку "pop index out of range". Не могу понять, почему метод выходит за границы? P.S. Про shuffle я знаю, просто хочу написать код таким способом.


Ответ

remove не нужно вызывать, pop уже удаляет элемент из списка. Кроме этого, значение length нужно обновлять на каждой итерации, тк список WORDS изменяет свой размер.

PostgreSQL: максимальное и текущее количество соединений

Как можно узнать максимальное и текущее количество установленных соединений на сервере PostgreSQL?


Ответ

За максимальное количество соединений отвечает параметр max_connections, получить который можно при помощи запроса
SHOW max_connections;
Количество подключенных к серверу соединений можно получить, выполнив запрос
SELECT COUNT(*) FROM pg_stat_activity;

Запись радиоэфира с пропуском тишины в Linux

Доброго времени суток. Имеется трансивер, подключённый к линейному входу ПК под управлением убунты. Задача - вести запись вызывной частоты. Подскажите, какой программой можно захватывать линейный вход с пропуском тишины так, чтобы записи сохранялись в разные файлы с названием равным времени, в которое была сделана запись. Ещё лучше, если есть возможность писать всё в один файл, если тишина длилась, например, не более минуты. (Чтобы в один файл попадал, например, общий вызов и все отклики на него. А как только тишина длится более минуты - то следующая запись пойдёт в новый файл.)


Ответ

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

Как получить данные из onResponse? Retrofit.

Не могу получить данные из onResponse.
public void loadData() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(myurl) .addConverterFactory(GsonConverterFactory.create()) .build(); RESTPK service = retrofit.create(RESTPK.class); Call call = service.loadJsonStr(); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { pathPoster = response.body().getPath().get(0).get1(); //переменая которую мне нужно вытащить System.out.println(pathPoster); } @Override public void onFailure(Call call, Throwable t) { } }); }
Если в onResponse вывести на экран переменную pathPoster, то она показывает правильный результат, но если ее вывести на экран после вызова loadData(), то в ней уже ничего нет и приложение вылетает с ошибкой. Получить данные получил, но пользоваться ими не получается.
loadData(); System.out.println(pathPoster);
ошибка:
FATAL EXCEPTION: mainjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.awesomedevelop.recyclerview/com.awesomedevelop.recyclerview.MainActivity}: java.lang.NullPointerException


Ответ

Потому что у тебя асинхронный запрос. onResponse вызывается после загрузки информации, а System.out.println(pathPoster) вызывается до загрузки, судя по твоему коду. То есть, когда информация еще не успела загрузиться из сети. А падает потому что строка в которую ты не записал еще данные по-умолчанию null.
Либо делай синхронный запрос, либо все действия после загрузки выполняй в onResponse.
Если переделаешь на синхронный запрос, учти, что синхронные запросы в сеть, нельзя делать в Ui потоке приложения.
http://square.github.io/retrofit/2.x/retrofit/

Валидное расположение блоков

Подскажите как грамотно расположить блоки как на данном рисунке(блок 3 немного заезжает на блок 1,), что б они сохранили при этом адаптивность свою(при изменении ширины экрана не проваливались ни куда). Можно и на бутстрапе, просто интересен грамотный подход, да бы минимизировать использование лишних тегов и стилей.Заранее спасибо


Ответ

css - calc()
browser support calc
.block-1 { height: 200px; background: #ccc; } .block-2, .block-3 { height: 100px; background: #ddd; } .block-3 { height: 100px; background: #999; margin-left: -50px; width: calc(100% + 50px)!important; } @media screen and (max-width: 767px) { .block-3 { margin-left: 0; width: 100%!important; } }

1
2
3

Правильная замена классов в галерее

Есть слайдер с js-анимацией. Анимирование происходит путем подмены класса, их координаты заданы в css и в js - circleCoords.
Код выкладываю на plunker, т.к. его много и чтоб понять проблему нужно увидеть событие глазами: https://plnkr.co/edit/qHn1HytgxucUwl0tkBTe?p=preview
Перед тем как мы еще не кликали на элемент карусели, функция animate каждый раз принимает массив с именами классов, на каждой итерации последний в списке элемент массива ставится на перед (происходит циклический сдвиг). При клике на элемент, мы меняем очередность элементов в массиве, и подаем его в функцию animate в соответствующем порядке после изменений классов в html-дереве.
Но почему-то, после клика, элементы начинают сдвигаться беспорядочно, а не как следует - друг за другом в новой построенной очереди. Я уверен что где-то пропустил какую-то мелочь, нужен свежий взгляд профи) Благодарен за внимание!


Ответ

немного упростил код, смотреть результат лучше на всю страницу.
var dd = $("[data-id]"), elems = $.makeArray(dd), circleCoords = [{ top: 0, left: 229 }, { top: 100, left: 677 }, { top: 265, left: 603 }, { top: 265, left: 307 }, { top: 265, left: 14 }, { top: 100, left: -58 }]; dd.on("click", function() { var i = $.inArray(this, elems); elems[i] = elems[0]; elems[0] = this; $(elems[i]).removeClass("active"); move() }); function move() { var deferreds = []; $(elems[0]).addClass("active"); $.each(elems, function(indx, el) { deferreds.push($(el).animate(circleCoords[indx],2000)) }); $.when.apply(null, deferreds).done(function() { if (!busy) timer = window.setTimeout(function() { var el = elems.pop(); $(elems[0]).removeClass("active"); elems.unshift(el); move() }, 2000) }) } var busy, timer; $(".container").mouseleave(function() { busy = false; !dd.queue("fx").length && move() }).mouseenter(function() { window.clearTimeout(timer); busy = true }); move() .container { padding-top: 30px; } .animation-wrap { position: relative; width: 1170px; height: 565px; margin: auto; overflow: hidden; } .animation-wrap a { display: none; position: absolute; width: 119px; height: 30px; z-index: 72; top: 279px; left: 196px; } .animation-wrap .small { position: absolute; width: 222px; height: 131px; left: 50%; top: 50%; margin-left: -138px; margin-top: -81px; cursor: pointer; z-index: 2; opacity: 1; -webkit-transition: all 0.7s ease; -moz-transition: all 0.7s ease; -ms-transition: all 0.7s ease; -o-transition: all 0.7s ease; transition: all 0.7s ease; } .animation-wrap .small:hover { -webkit-filter: brightness(130%); filter: brightness(130%); } .animation-wrap .big { position: absolute; opacity: 0; margin: 0 auto; -webkit-transition: all 0.7s ease; -moz-transition: all 0.7s ease; -ms-transition: all 0.7s ease; -o-transition: all 0.7s ease; transition: all 0.7s ease; } .active .small { opacity: 0; cursor: default; } .active .big { opacity: 1; z-index: 3; width: 507px; height: 360px; } [data-id] { position: absolute; width: 400px; height: 380px; } [data-id=obj1] { top: 70px; left: -165px; } [data-id=obj2] { top: 0; left: 285px; } [data-id=obj3] { top: 70px; left: 730px; } [data-id=obj4] { top: 285px; left: 610px; } [data-id=obj5] { top: 285px; left: 285px; } [data-id=obj6] { top: 285px; left: -40px; }


Фиксированное значение столбца (= null) в зависимости от значения другого столбца

В таблице tablename есть столбцы type и arg. Нужно ввести ограничение, по которому при type = 1, всегда arg = null
Каким образом это можно организовать в PostgreSQL? Версия 9.5.2.
Можно реализовать это на уровне приложения, но требуют, именно, на уровне СУБД. Чтобы она не дала нарушить это правило.


Ответ

ALTER TABLE test ADD CONSTRAINT null_arg CHECK ((type = 1 AND arg IS NULL) OR type <> 1)

Как восстановить базу данных из *.MYD *MYI *FRM?

У нас упал сайт и хостер предоставил данные файлы для восстановления.
Какие данные, кроме упомянутых файлов, потребуются для восстановления?


Ответ

Какие данные, кроме упомянутых файлов, потребуются для восстановления?
если все таблицы хранились в вашей базе данных только с использованием движка myisam, то перечисленных файлов, по идее, должно быть достаточно
Each MyISAM table is stored on disk in three files. The files have names that begin with the table name and have an extension to indicate the file type. An .frm file stores the table format. The data file has an .MYD (MYData) extension. The index file has an .MYI (MYIndex) extension.
разве что ещё файл db.opt потребуется с глобальными для базы данных настройками (типа набора символов по умолчанию и т.п.).

все эти файлы хранятся в каталоге, носящем имя базы данных (он расположен обычно в каталоге с данными mysqld: часто это /var/lib/mysql). вот полное содержимое этого каталога (носящего имя вашей базы данных) вам и потребуется.
скопируйте этот каталог внуть каталога с данными mysqld (выставив каталогу и файлам права и принадлежность как у «соседних» баз данных) и перезапустите mysqld — сервер после этого должен «подхватить» новую базу данных (она должна быть видна в списке, выдаваемом командой show databases).

если же хотя бы одна таблица использовала довольно популярный ныне движок innodb, то ситуация несколько сложнее. описание таблицы, понятно, хранилось в каталоге базы данных в файле имя-таблицы.frm. а вот сами данные таблицы могли храниться в существенно разных местах:
если глобальная конфигурационная переменная на старом сервере innodb_file_per_table имела значение off, то данные всех таблиц из всех баз данных хранились в одном файле, и хостер вряд ли его вам предоставит. если же эта глобальная переменная была установлена в on, то данные для каждой innodb-таблицы хранились в файлах имя-таблицы.ibd внутри каталога с вашей базой данных.

Генерация всех подмножеств множества мощности n,которые не содержат соседних элементов

Предположим у меня есть множество A={1,2,...,n}.(длинна n известна)
Как мне сгенерировать все подмножества,которые не содержат соседних елементов?" (к примеру,если я беру элемент 2 из A, то то элементы 1 и 3 я взять уже не могу)
P.S:Сначала думал просто сгенрировать все подмножества, а потом выбрать те,которые не содержат соседних элементов.Но такой подход очень не эффективен.
P.P.S.:рекурсией пользоваться нельзя


Ответ

Стоит начать с того, что максимальная мощность такого подмножества будет ceil(n/2). Минимальная - единица. Соответсвенно, нужно сгенерировать все подмножества длиной 1, затем длиной 2, затем ..., и так далее до ceil(n / 2). Суть данного решения в том, что есть зафиксированные элементы и итератор, который добирает из множества нужное количество элементов. Например для подмножеств мощностью 2: есть подмножества {1,3}, {1,4}, {1,5}, {1,6}. Фиксированный элемент здесь - 1, и итератор собирает все элементы последовательно, начиная с 3. Когда итератор дойдет до конца - фиксированный элемент меняется. Так как подмножества могут быть длиннее, чем 2, то фиксированный элемент - это тоже множество - переменная subset_base. Для каждого нового "уровня" (для подмножества с мощностью + 1) - фиксированные элементы не генерируются заново, а берутся прямиком с предыдущего уровня и затем дополняются. Ключевая строка, пожалуй - это subset_first = tpl[1] + 2 - именно здесь определяется, что сосед не попадет в подмножество. Можно изменять слагаемое 2, определяя критерий "соседства".
Необходимо n / 2 раз пройти по всему множеству. Таким образом сложность O(n^2).
import math
A = {1, 2, 3, 4, 5, 6, 7, 8}
subsets = [{elem} for elem in A] A = sorted(list(A)) # Для удобства seeker_position = 0 subset_first = 0
subset_length = 2
base_subsets_for_next_level = [({elem}, index) for index, elem in enumerate(A)]
while subset_length <= math.ceil(len(A) / 2): helper = [] for tpl in base_subsets_for_next_level: subset_base = tpl[0] subset_first = tpl[1] + 2 while subset_first < len(A): subset = subset_base | {A[subset_first]} subsets.append(subset ) helper.append((subset, subset_first)) subset_first += 1 base_subsets_for_next_level = helper seeker_position += 1 if seeker_position + 2 * (subset_length - 1) >= len(A): subset_length += 1 seeker_position = 0
subsets.append({}) # Пустое множество print(subsets)
Результат: [set([1]), set([2]), set([3]), set([4]), set([5]), set([6]), set([7]), set([8]), set([1, 3]), set([1, 4]), set([1, 5]), set([1, 6]), set([1, 7]), set([8, 1]), set([2, 4]), set([2, 5]), set([2, 6]), set([2, 7]), set([8, 2]), set([3, 5]), set([3, 6]), set([3, 7]), set([8, 3]), set([4, 6]), set([4, 7]), set([8, 4]), set([5, 7]), set([8, 5]), set([8, 6]), set([1, 3, 5]), set([1, 3, 6]), set([1, 3, 7]), set([8, 1, 3]), set([1, 4, 6]), set([1, 4, 7]), set([8, 1, 4]), set([1, 5, 7]), set([8, 1, 5]), set([8, 1, 6]), set([2, 4, 6]), set([2, 4, 7]), set([8, 2, 4]), set([2, 5, 7]), set([8, 2, 5]), set([8, 2, 6]), set([3, 5, 7]), set([8, 3, 5]), set([8, 3, 6]), set([8, 4, 6]), set([1, 3, 5, 7]), set([8, 1, 3, 5]), set([8, 1, 3, 6]), set([8, 1, 4, 6]), set([8, 2, 4, 6])]
`

Повторение результата при возведении в степень

Как мне вычислить все возведения в степень с x_min ^ y_min по x_max ^ y_max без повторов результатов. Например:
x2 ^ x8 = z ... x85 ^ y23 = p ... но x85 ^ y28 = z !
Как видно, результат z повторяется у разных вычислений, каким образом можно пропускать все следующие вычисления при условии, что сравнивать с ранее вычисленными результатами не допустимо?
# code python 3 min_x, max_x = 5, 127 min_y, max_y = 2, 250 result = '' for x in range(min_x, max_x): for y in range(min_y, max_y): result += str(x ** y)


Ответ

UPDATE: - только что проверил с вашими числами - Python "занимал" около 1GB памяти, timing я обновил для ваших чисел
In [105]: x = np.arange(5, 8800, dtype=np.uint64)
In [106]: y = np.arange(2, 8250, dtype=np.uint64)
In [107]: r = np.unique(np.array([np.power(x, np.repeat([pw], len(x))) for pw in np.nditer(y)]))
In [108]: len(''.join(r.astype(str))) Out[108]: 457656
In [109]: %timeit np.unique(np.array([np.power(x, np.repeat([pw], len(x))) for pw in np.nditer(y)])) 1 loop, best of 3: 11.3 s per loop
In [115]: np.version.version Out[115]: '1.10.4'
numpy solution:
x = np.arange(5, 127, dtype=np.uint64) y = np.arange(2, 250, dtype=np.uint64)
r = np.unique(np.array([np.power(x, np.repeat([pw], len(x))) for pw in np.nditer(y)]))
# чтобы сэкономить память записываем строку в `r` r = ''.join(r.astype(str)) print(r)
Timing для 5000 x 5000 массива:
In [102]: %timeit np.unique(np.array([np.power(x, np.repeat([pw], len(x))) for pw in np.nditer(y)])) 1 loop, best of 3: 3.89 s per loop
In [103]: x.shape Out[103]: (4995,)
In [104]: y.shape Out[104]: (4998,)

MediaPlayer воспроизведение

На сайте нашёл код:
public void onClick (View v){ index = 0; mp = MediaPlayer.create(getApplicationContext(), sounds[index] ); mp.setLooping(false); mp.start(); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer mp){ if(index < sounds.length-1){ index++; mp = MediaPlayer.create(getApplicationContext(), sounds[index]); mp.start(); mp.setOnCompletionListener(this); } else mp.release(); } }); }
Но он воспроизводит все треки друг за другом. Может кто-нибудь подскажет: как сделать при нажатии на кнопку воспроизведение одного трека? И пока трек воспроизводится, кнопка должна быть неактивна, а следующее нажатие воспроизводит второй трек. И ещё как сделать управление с кнопки громкости+ ?


Ответ

Так пропишите такое поведение. При нажатии делаете кнопку неактивной, а по окончании возвращаете:
int index = 0; //дабы не сбрасывалось по нажатию на кнопку выносим public void onClick (View v){ yourButton.setEnabled(false); //кнопка неактивна mp = MediaPlayer.create(getApplicationContext(), sounds[index]); mp.setLooping(false); mp.start(); mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer mp){ yourButton.setEnabled(true); //после окончания воспроизведения делаем кнопку активной mp.release(); if(index < sounds.length-1){ index++; //увеличиваем счетчик для воспроизведения следующего трека } else { index = 0; //сбрасываем в 0 } } }); }

Как высчитать скидку?

Всем привет. Есть 3 таблицы - Скидки(Discount), Клиенты(Clients) и Заказы(Orders)
Discount
id_discount count_orders percent_discount 1 5 1,5 2 10 2,5
Clients
id_client Name Surname 1 Ivan Petrov 2 Vasya Vasev
Orders
id order_sum id_client
Вопрос, как посчитать общую сумму, учитывая количество заказов, который сделал клиент? Если общее кол-во заказов 5 и выше, то идет скидка в 1.5%, если 10 и выше, то 2.5%. В противном случае скидки нет. Заранее спасибо


Ответ

Firebird нет под руками, так что пишу максимально приближенный к стандартам запрос, сработает с высокой вероятностью. Вы не указали к какой конкретно сумме вы хотите применить скидку, поэтому посчитал, что следует выдать все заказы, вычислив для каждого из них сумму со скидкой, с предположением что в данный момент в заказах сумма без скидки.
select O.id,O.id_client, O.order_sum-(O.order_sum/100*coalesce(D.percent_discount,0)) from Orders O left join (select id_client,max(D.count_orders) as d_cnt from (select id_client,count(1) as cnt from Orders group by id_client) as C, Discount as D where D.count_orders<=cnt group by id_client) as S on S.id_client=O.id_client left join Discount as D on D.count_orders=S.d_cnt
Подзапрос C выбирает текущие количества заказов по клиентам К ним клеются все скидки с меньшим или равным количеством Подзапрос S. Берется количество для скидки для максимально подошедшего кол-ва заказов По left (т.к. скидки может и не быть) доклеиваются скидки с учетом нужного количества
Таблицу clients приклеить по желанию.

Python. Как работает генератор списка с lambda

Написал вот такую строчку:
a = [lambda x : x^n for n in range(10)]
При этом на каждой итерации
for i in range(10): print(a[i](2))
выдает 11, a
for i in range(10): print(a[2](i))
выдет: 9 8 11 10 13 12 15 14 1 0
Почему?


Ответ

Если я правильно понял, то происходит следующее:
a = [lambda x : x^n for n in range(10)] - тут создается список функций. Это то же самое, что и:
def xoring(x): for n in range(10): pass return x^n
a = [] for i in range(10): a.append(xoring)
Можно даже посмотреть что внутри списка и увидеть набор функций:
>>> a [. at 0x029E1468>, . at 0x02B7C300>, . at 0x02B7C348>, . at 0x02B7C390>, . at 0x02B7C3D8>, . at 0x02B7C420>, . at 0x02B7C468>, . at 0x02B7C4B0>, . at 0x02B7C4F8>, . at 0x02B7C540>]
Далее, for i in range(10): print(a[i](2)), 10 раз вызывается i-я функция из списка a и ей передается аргумент 2. Так как функции одинаковые, то и результаты одинаковые. Т.е. внутри происходит следующее:
lambda x : x^n for n in range(10) - здесь i изменяется от 0 до 9 и ксорится с x. Т.к. x = 2, то x^i даст такие результаты:
2^ 0 = 2 2^ 1 = 3 2^ 2 = 0 2^ 3 = 1 2^ 4 = 6 2^ 5 = 7 2^ 6 = 4 2^ 7 = 5 2^ 8 = 10 2^ 9 = 11
Последнее значения и возвращает функция.
Здесь for i in range(10): print(a[2](i)) 10 раз вызывается функция с индексом 2 в списке a и ей передается значение i, которое меняется от 0 до 9. То же самое, что и
for i in range(10): print(xoring(i))
Что в результате и дает
0 ^ 9 = 9 1 ^ 9 = 8 2 ^ 9 = 11 3 ^ 9 = 10 4 ^ 9 = 13 5 ^ 9 = 12 6 ^ 9 = 15 7 ^ 9 = 14 8 ^ 9 = 1 9 ^ 9 = 0

WebStorm Git (git repository cannot be cloned to an existing directory)

В чем проблема?
12:53:22 Created Git repository in /Applications/MAMP/htdocs/workout_test 12:59:47 Update canceled 12:59:47 Can't update: no tracked branch No tracked branch configured for branch master. To make your branch track a remote branch call, for example, git branch --set-upstream master origin/master*


Ответ

Думаю вот это должен сработать:
git init git remote add origin PATH/TO/REPO git fetch git checkout -t origin/master
Информация взята отсюда

Что обозначают атрибуты name и content у метки meta?

Что обозначают данные атрибуты у метки meta?


Ответ

это мета тег для определения устройства с которого зашли на сайт, initial-scale - это маштаб страницы изначально, а width=device-width oпределяет ширину viewporta, подробнее почитайте вот тут http://frontender.com.ua/mobile-web/wtf-viewport/

Как занести данные из HTML-формы в MySQL при помощи JDBC?

Имеются 2 HTML-формы

и

База данных на MySQL Server, где присутствуют аналогичные поля login varchar (45) NOT NULL и password varchar (45) NOT NULL.
Подскажите, как при помощи JDBC записать данные HTML-формы в БД MySQL. PHP не предлагать, можно другие Java-технологии.


Ответ

Быстрая реализация с использование сервлета:
html


TheFirstServlet
public class FirstServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); String login = request.getParameter("login"); String password = request.getParameter("password"); insert(login, password); PrintWriter printWriter; try { printWriter = response.getWriter(); printWriter.println("Ну, попытались"); } catch(IOException exc) {} }
public void insert(String login, String password) { Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc.url", "jdbc.login", "jdbc.password"); stmt = conn.createStatement(); String sql = "INSERT INTO NAME_TABLE (`login`,`password`)" + "VALUES ('" + login + "','" + password + "')"; stmt.executeUpdate(sql); } catch (SQLException | ClassNotFoundException exc) { exc.printStackTrace(); System.out.println("Не записал"); } finally { try { if(conn!=null) conn.close(); if(stmt!=null) stmt.close(); } catch (SQLException exc) {} } }
Ну, как-то так по-простому.

Проблемы с чтением файла через javascript

Есть функция, где я пытаюсь записать в переменную данные текстового файла с сервера
function loadModel(){ var cookiePath = readCookie('modelID'); var modelPath = "../modelbase/php_base/models/"+cookiePath+".zedit"; var rawFile = new XMLHttpRequest(); rawFile.open("GET", modelPath, false); rawFile.onreadystatechange = function () { if(rawFile.readyState === 4) { if(rawFile.status === 200 || rawFile.status == 0) { var modelText = rawFile.responseText; alert(modelText); } } } rawFile.send(null); }
Но при попытке считывания в консоль получаю предупреждение (на строке rawFile.open...):
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/
Есть ли какой-то способ получить данные из нужного файла?


Ответ

Предупреждение говорит вам:
"Вы пытаетесь отправить синхронный xhr запрос. Отправлять синхронные запросы больше не модно, потому что юзерам не нравится ждать."
За синхронность/асинхронность xhr отвечает третий параметр функции xhr.open Можно поставить его в true или вообще убрать (он true по умолчанию).

Как запретить анимацию togglebutton?

Знатоки, подскажите пожалуйста, каким образом я могу запретить анимацию нажатия ToggleButton ? Если кнопка нажата, то другая автоматически меняет стиль на не нажатую, но если я нажму на кнопку, которая нажата - она отжимается - как запретить этот "отжим" ?


Ответ

Можно просто обработать событие Click для каждого ToogleButton

Обработчики :
private void Toogle1_OnClick(object sender, RoutedEventArgs e) { var button = (ToggleButton)e.OriginalSource; if ((bool)button.IsChecked) { button.IsEnabled = false; toogle2.IsChecked = false; toogle2.IsEnabled = true; } }
private void Toogle2_OnClick(object sender, RoutedEventArgs e) { var button = (ToggleButton)e.OriginalSource; if ((bool)button.IsChecked) { button.IsEnabled = false; toogle1.IsChecked = false; toogle1.IsEnabled = true; } }

Переименование окон и вкладок эмулятора терминала

В Debian 8 (Jessie) возможно ли изменять названия окон (вкладок) на произвольные значения? Интересует прежде всего Terminal и его вкладки.
На данный момент контекстные меню для вкладок и для окон (Alt+Space) не содержат подобных действий, хотя в Ubuntu же, например, возможность переименования вкладок терминала имелась.


Ответ

многие реализации эмуляторов терминала для x-window system перехватывают escape-последовательность такого вида
\x1b]0;заголовок для окна и иконки\x07 \x1b]1;заголовок только для иконки\x07 \x1b]2;заголовок только для окна\x07
и устанавливают заголовок окна и/или иконки в панели задач.
отправить последовательность можно, например, программой echo
$ echo -e '\x1b]0;заголовок для окна и иконки\x07'

значения символов "escape" (шестнадцатиричное 1b) и "bell" (7) можно задать и в восьмиричной форме: \033 и \007

Не работает text-overflow

Не работает text-overflow. Каким образом решается данная проблема?
.item { padding: 10px 10px; border-top: 1px solid #DCDCDC; border-bottom: 1px solid #DCDCDC; background: #F7F7F7; margin-bottom: 5px; position: relative; } #description { color: black; text-overflow: ellipsis; }

Заголовок
Задает все свойства фона элемента страницы в один прием. Заменяет собой атрибуты background-attachment, background-color, background-image, background-position и background-repeat.


Ответ

С помощью двух данных свойств можно "починить" text-overflow.
white-space: nowrap - запрещаем делать перенос на другую строку. overflow: hidden - непосредственно скрываем текст, выходящий за рамки контейнера, для того чтобы в силу вступило свойство text-overflow.
.search_page_item { padding: 10px 10px; border-top: 1px solid #DCDCDC; border-bottom: 1px solid #DCDCDC; background: #F7F7F7; margin-bottom: 5px; position: relative; } #description { color: black; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }

Заголовок
Задает все свойства фона элемента страницы в один прием. Заменяет собой атрибуты background-attachment, background-color, background-image, background-position и background-repeat.

маркеры из локальной базы данных

Как правильно сделать запрос для вывода маркеров на андроид устройстве (на google maps). Я подключаюсь к json, но ничего не происходит. Подскажите, как это делается.
Обновление
Вот ссылка на json, мне нужно вывести маркеры в приложении.


Ответ

Добавить маркер можно так:
map.addMarker(new MarkerOptions() .position(new LatLng(10, 10)) .title("Hello world"));
Вам необходимо из ответа с сервера вытянуть координаты и добавить на карту:
private void fun(GoogleMap map, String response) throws JSONException { JSONObject object = new JSONObject(response); JSONArray arr = object.getJSONArray("markers"); for (int i=0; i

Как вывести файл Xml деревом в консоль с рекурсией. Вроде все читается, но вот как вывести именно деревом, как и сам файл Xml никак не соображу

вот код
using System.Text; using System.Xml; using System.Xml.Linq; using System.IO;
namespace TestApp_Dipl { class Program { static int iter; static void Main(string[] args) { Program ThisClass = new Program(); Console.WriteLine("Main"); XmlDocument XmlDoc = new XmlDocument(); XmlDoc.Load("File.xml"); XmlNodeList _fnames = XmlDoc.GetElementsByTagName("CD"); Console.WriteLine(_fnames.Count.ToString()); ThisClass.GetNodes(_fnames);

Console.ReadKey(); }
void GetNodes(XmlNodeList NodeListVar) { int i = 1; foreach (XmlNode el in NodeListVar) { if (el.HasChildNodes) { Console.WriteLine(i++ + ". " + el.Name); GetNodes(el.ChildNodes); } else { Console.WriteLine("-> " + el.InnerText); } } }
} }
Xml file.xml
Empire Burlesque Bob Dylan USA Columbia 10.90 1985 Hide your heart Bonnie Tyler UK CBS Records 9.90 1988
Хотелось бы в консоли получить так:
CATALOG 1.CD TITLE Empire Burlesque ARTIST Bob Dylan COUNTRY USA COMPANY Columbia PRICE 10.90 YEAR 1985 2.CD TITLE Hide your heart ARTIST Bonnie Tyler COUNTRY UK COMPANY CBS Records PRICE 9.90 YEAR 1988


Ответ

Если вам не требуется специфический для класса XmlDocument функционал, то проще воспользоваться XDocument из пространства имен System.Xml.Linq. Это позволит получить более компактный код.
Для вывода на консоль в том виде, который вы указали есть три пути.
1. Рекурсивный обход дерева XML
Реализуется довольно просто:
static void Main(string[] args) { XElement doc = XElement.Load(@"H:\test.xml"); PrintElementV1(doc); Console.ReadKey(); }
static void PrintElementV1(XElement elem) { if (elem.Elements().Count() > 0) { Console.WriteLine(elem.Name); foreach (XElement e in elem.Elements()) { PrintElementV1(e); } } else { Console.WriteLine("{0}: {1}", elem.Name, elem.Value); } }
Но вставить в этот вод избирательную нумерацию конкретных элементов без "костылей" не выйдет. "Костыль" для нумерации может выглядеть так:
static void PrintElementV1(XElement elem, int num) { if (elem.Elements().Count() > 0) { Console.WriteLine("{0}. {1}", num, elem.Name); int i = 1; foreach (XElement e in elem.Elements()) { PrintElementV1(e, i++); } } else { Console.WriteLine("{0}: {1}", elem.Name, elem.Value); } }
При этом будут пронумерованы все элементы кроме тех, которые не содержат в себе других элементов.
2. Фиксированный обход дерева XML
С точки зрения дерева, рекурсия сохраняется, такова уж структура дерева, но если эта структура фиксирована и известна, то можно обойтись без рекурсивного вызова методов а использовать цепочку вызовов в цикле. Покажу на примере:
static void Main(string[] args) { XElement doc = XElement.Load(@"H:\test.xml"); Console.WriteLine(doc.Name); PrintCDList(doc); Console.ReadKey(); }
static void PrintCDList(XElement elem) { int i = 1; foreach (XElement e in elem.Elements()) { Console.WriteLine("{0}. {1}", i++, e.Name); PrintContent(e); } }
static void PrintContent(XElement elem) { foreach (XElement e in elem.Elements()) { Console.WriteLine("{0}: {1}", e.Name, e.Value); } }
как видите, рекурсия отсутствует, но если структура XML будет отличаться от заложенной в коде, "все превратится в тыкву" и будет давать неверные результаты.
3. Ручной парсинг
Можно выполнить всю работу руками, получив исходный текст XML в виде текста. Для этого можно воспользоваться любым известным вам способом получения текста из файла.
Далее к строке исходного XML текста применяем всевозможные регулярные выражения или другие известные вам способы преобразования строки до получения строки или массива строк нужного вида и выводим полученное.
Приводить код данного способа не стану, так как вариантов для подобного решения существует масса, а взглядов на то, как это сделать правильно еще больше. К тому же, я сильно сомневаюсь, что подобный вариант будет существенно производительнее чем два предыдущих, скорее наоборот.
Выбирайте какой вариант вам больше подходит =)
PS: Если важно использовать именно XmlDocument, пишите в комментарии, дополню соответствующим примером.