Страницы

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

среда, 19 июня 2019 г.

Как наложить один элемент разметки на другой?

Хочу наложить к примеру , помню получалось как то можете помочь. Есть вот код нужно элемент avatar наложить на circle (чтобы он был поверх него)







Ответ

Для налоложения виджетов используется контейнер FrameLayout, который размещает все виджеты от левого верхнего угла, если не указано гравити (или RelativeLayout, если позиционирование более сложное)








Для простых случаев можно использовать решение из этого ответа

Зацикливание анимации XML

Надо зациклить, чтобы объект уменьшался, а потом увеличивался и так бесконечное количество раз.
Сделал вот так:

Но оно только увеличивается и все. Помогите, буду благодарен.


Ответ

Пожалуйста, добавьте в scale аттрибут repeatCount со значением infinite

Не убивается процесс из python

Здравствуйте! Есть программа, которая создает процесс, который пингует адрес 192.168.1.1 и записывает данные в файл text.txt. А основная программа читает первые 4 строки из файла и выводит их на стандартный поток вывода, после чего "убивает" раннее созданный процесс и сама завершается. Проблема в том, что процесс не убивается. После завершения программы данные все еще записываются в файл text.txt.
from subprocess import * import time
my_file = open('text.txt', 'a') child=Popen(['ping 192.168.1.1'],shell=True,stdout=my_file) s=' ' my_file_2 = open('text.txt', 'r') k = 0 time.sleep(1) while s: k += 1 if k == 5: child.kill() #пытаюсь убить процесс break s=my_file_2.readline() print(s.rstrip()) time.sleep(1) my_file.close() my_file_2.close()


Ответ

Процесс у вас продолжает жить, потому что child в вопросе это shell, а не ping процесс (python запускает оболочку, которая запускает ping команду). child.kill() убивает shell, а ping продолжает жить.
Не используйте shell=True. Если shell=True используется, то необходимо применять методы, которые убьют сразу всю задачу (группу процессов). См. How to terminate a python subprocess launched with shell=True

Чтобы прочитать 4 строки из вывода дочернего процесса и убить его:
#!/usr/bin/env python3 from subprocess import Popen, PIPE
with Popen(['ping', ip], stdout=PIPE, universal_newlines=True) as process: for n, line in enumerate(process.stdout, start=1): print(line, end='') if n == 4: process.terminate() # or use process.kill()
В зависимости от платформы, у ping могут быть параметры командной строки, которые ограничивают общее кол-во запросов (-c) и/или продолжительность работы (-w).
Если по времени хотите чтение остановить, то см. Stop reading process output in Python without hang?

Как сконвертировать SVN-репозиторий с Google Code в git?

Я так понял, Google Code закрывается и SVN-сервер больше не держит. Скачал source-archive.zip с него, внутри него лежат:
branches .svn tags trunk wiki
В trunk, который я тоже пытался checkout'ить, лежат .svn и все файлы проекта.
И, собственно, что со всем этим дальше делать? Так как сам я svn не знаю и хочу git, пытался копипастить команды из гугла (поэтому просьба не смеяться при чтении ниженаписанного :), но что-то не катит.
Пытался в git svn clone file:///path/to/directory или git svn clone file:///path/to/directory/trunk — ругается, что «No repository found».
svnserve -d -r /path/to/directory и просто svn checkout svn://localhost с разными вариациями ссылки — аналогично «No repository found».
subgit захотел от меня сервер в интернете, а где мне его взять-то, если svnserve отдавать отказался.


Ответ

К сожалению вы опоздали. Вся ваша история была удалена 25 января 2016 года. Все что вы можете сейчас сделать - это взять содержимое этого архива и закоммитить в git в качестве начального состояния.
PS папки .svn и все их содержимое коммитить точно не нужно.

Не работают списковые элементы ASP.NET

Хочу использовать asp:CheckBoxList, но браузер выдаёт ошибку:
Uncaught SyntaxError: Failed to execute 'matches' on 'Element': 'A ASP:CHECKBOXLIST' is not a valid selector.

Критерії вибору:

Тип

Option 1 Option 2

Ціна


Помогите решить проблему.


Ответ

На представлении в asp.net mvc нельзя использовать контролы из asp.net webforms, Надо либо вручную написать html select/option либо использовать Razor Syntax. Примеры:
HTML Tag

Razor:
Controller:
public ActionResult SelectCategory() { List items = new List(); items.Add(new SelectListItem { Text = "Volvo", Value = "0"}); items.Add(new SelectListItem { Text = "Saab", Value = "1" }); items.Add(new SelectListItem { Text = "Mercedes", Value = "2", Selected = true }); items.Add(new SelectListItem { Text = "Audi", Value = "3" }); ViewBag.Cars= items; return View(); }
View:
@Html.DropDownList("Cars")

Для чего нужны escape последовательности в адресах URL?

Часто встречаю ссылки записанные в escape последовательности с символом процента в качестве отделителя для закодированного символа. Для чего применяется эта технология?


Ответ

Они применяются для того чтобы передавать специальные символы. например
Нужно передать параметр значение которого R&D, если просто дописать его в url
url?param=R&D
То можно заметить, что значение параметра будет на самом деле R, так как & служит для разделения параметров.
При использования escape же получим строку
url?param=R%26D
которая отлично передается.

Что означает idl-атрибут в спецификации html5?

В спецификации html5 часто встречается понятие idl-атрибут. Например, из описания атрибута title
"The title IDL attribute must reflect the title content attribute"
Примерный перевод: "idl-атрибут title должен отображать содержимое атрибута title"
Совершенно не понимаю, что означает эта фраза? Причем тут idl и какое отношение idl имеет к html? Я думал idl - это совершенно иной язык.
Или, например, атрибут style.
"The style IDL attribute is defined in the CSS Object Model (CSSOM) specification"
Примерный перевод: "idl-атрибуту style дано определение в спецификации CSS Object Model (CSSOM) specification"
Понятно, что этому атрибуту дано определение в такой-то спецификации, но что это за атрибут? для чего он нужен, что дает? и какое отношение имеет к спецификации html?


Ответ

Во-первых, мир веба постоянно меняется, постоянно появляются новые фичи, которые надо бы специфицировать. Количество спек разрослось, и вот для того чтобы как-то унифицировать понятия, используемые в разных спецификациях, появилась некая "мета-спека": Web-IDL, Interface Defenition Language for Web. Документ, описывающий как нужно описывать интерфейсы для новых браузерных возможностей. Собственно понятие IDL-атрибут оттуда и берется.
Во-вторых, в вебе довольно часта ситуация сначала появляются фичи, и только когда фичи все давно используют, под них пишется спека. Которая просто берет что есть и описывает формально. То есть по сути спека большее время на развитие фичи не влияет.
В результате у нас есть некий интерфейс. Те самые IDL - атрибуты. И есть реальный мир. И надо бы эти две вещи как-то познакомить между собой, а то нехорошо получается. Приведенные вами строки этим и занимаются.
Примеры: Допустим у вас есть в html

sometext


По первой выделенной строчке: Что вы получите когда напишете document.getElementById('someid').title? Вот строка спеки и говорит о том, что "не волнуйся парень, то что ты в теге написал для title и то что ты получить пытаешься, это одно и то же"
"The title IDL attribute must reflect the title content attribute"
По второй выделенной строчке
"The style IDL attribute is defined in the CSS Object Model (CSSOM) specification"
Что ты реально получишь обратившись сделав document.getElementById('someid').style - смотри в спеке по цсс.

Запрос для подсчета среднего времени сессии

Есть таблица time_user с полями:
user_id event time
В неё пишутся события, которые генерирует пользователь.
Как можно вычислить среднюю длину сессии по всем сессиям всех пользователей, если под сессией подразумевается последовательность событий одного пользователя, промежуток между которыми(событиями) не превышает 5-ти минут?
Я набросал запросец, но он считает неверно.
SELECT COUNT(t.user_id) cnt_session, t.user_id FROM time_user t WHERE ROUND( ( ( SELECT t1.`time` FROM time_user t1 WHERE t1.user_id = t.user_id AND t1.`time` > t.`time` LIMIT 1 ) - t.`time` ) / 60 ) > 5 GROUP BY t.user_id ORDER BY t.`time` ASC
Запрос создания таблицы:
CREATE TABLE `time_user` ( `user_id` INT(11) NULL DEFAULT NULL, `time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `event` ENUM('Y','N') NULL DEFAULT NULL, INDEX `user_id` (`user_id`), INDEX `time` (`time`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
Помогите, пожалуйста


Ответ

select avg(length) from ( select user_id, snum, TIMESTAMPDIFF(SECOND,min(time),max(time)) length from( select user_id,time, @snum:=if(@user=user_id and TIMESTAMPDIFF(SECOND,@ptime,time) <= 60*5, @snum,@snum+1) snum, @user:=user_id, @ptime:=time from time_user, (select @ptime:=0, @user:=0, @snum:=0) A order by user_id, time ) B group by snum ) C
Подзапрос B нумерует сессии подряд, ориентируясь на id пользователя и время события из предыдущей записи (при сортировке по пользователю и времени), запомненное в переменных. Подзапрос C группирует по полученным номерам сессий и вычисляет длину сессии как разность между минимальным и максимальным временем в ней. Внешний запрос берет среднюю длину сессии (в секундах). Если надо сессии в разрезе пользователей добавьте соответствующий group by

Покритикуйте код игры Камень-Ножницы-Бумага

Помогите начинающему в Python - пример кода игры Камень-ножницы-Бумага. Хотел бы избавиться от global аргументов и вообще какие могут быть советы по оптимизации. С ООП еще толком не знаком. Еще не нравится присваивание начальных значений.
Вот пример:
import random CountD = 0 # Счетчики - Ничья, Победа, Проигрыш (Draw, Loose, Win) CountL = 0 CountW = 0 l = ['k','n','b'] # Значения для рандомной выборки - Камень, Ножницы, Бумага
def inp(): # ввод числа раундов global n while True: try: n = int(input('Введите количество игр n ')) return n except ValueError: print('Это не число!')
def logic(x, y): # логика игры global CountD, CountW, CountL if x == y: print('Ничья') CountD += 1 elif (x == 'k' and y == 'n') or (x == 'n' and y == 'b') or (x == 'b' and y == 'k'): print('Выигрыш') CountW += 1 else: print('Проигрыш') CountL += 1 return CountD, CountL, CountW
# Поехали! inp() while n != 0: while True: x = input('Камень (k), Ножницы (n), Бумага (b)') if x not in l: print('Введите k, n, b') else: break
y = random.choice(l) logic(x, y) n -= 1 else: print('Победы - {0}
Проигрыши - {1}
Ничьи- {2}'.format(CountW, CountL, CountD))
В дальнейшем думаю припилить простенький AI, чтобы "ловить" повторения хода игрока.


Ответ

CountD = 0 # Счетчики - Ничья, Победа, Проигрыш (Draw, Loose, Win) CountL = 0 CountW = 0
Ну первое что скажу в питоне принято именовать переменные с маленькой буквы разделяя их нижним подчеркиванием (win_count, lose_count).
l = ['k','n','b'] # Значения для рандомной выборки - Камень, Ножницы, Бумага
Константы так же но в верхнем регистре (TYPE_LIST). И какой смысл так сокращать имена? Тут никакой гонки нет по символам. Должно быть понятно самому программисту что там за объект. Иначе тебе придется комментировать весь свой код.
Для констант списка имеется специальный объект turple, который работает как же как list за исключением того, что его нельзя изменять и тем самым весит он на много меньше.
TYPE_LIST = ('stone', 'scissors', 'paper')
Так же можно заменить на Enum
class GameType(enum.Enum): STONE = 0 SCISSORS = 1 PAPER = 2
Далее не понятно зачем у Вас возвращаются глобальные переменные. Эту строчку можно просто удалить.
return CountD, CountL, CountW
и эту
return n
всю логику запуска скрипта желательно вынести в условие __name__ == '__main__'
if __name__ == '__main__': # Поехали! inp() while n != 0: # ------ # Остальной код
Это означает, что этот блок выполнится только в том случае, если этот скрипт был основным при запуске. Это нужно, чтобы если вдруг Вам понадобилась переменная или функция из этого скрипта, то когда Вы импортируете этот файл и повторно эти функции не выполнятся.
Так же я бы предложил создать отдельный класс для игры
class Game: TYPES = ('stone', 'scissors', 'paper')
def __init__(self): #: WIN, LOSE, DRAW counts = 0, 0, 0 num = 0
def increase_count(self, n): counts[n] += 1
def round_logic(): if self.user_choice == self.ii_choice: print('Ничья') self.increase_count(2) elif (self.user_choice == 'k' and self.ii_choice == 'n') or (self.user_choice == 'n' and self.ii_choice == 'b') or (self.user_choice == 'b' and self.ii_choice == 'k'): print('Выигрыш') self.increase_count(0) else: print('Проигрыш') self.increase_count(1)
def round(self): while True: self.user_choice = input('Камень (k), Ножницы (n), Бумага (b)') if self.user_choice not in Game.TYPES: print('Введите k, n, b') else: break
self.ii_choice = random.choice(Game.TYPES) self.round_logic()
self.num -= 1 if self.num is 0: self.end()
def end(): print('Победы - {0}
Проигрыши - {1}
Ничьи- {2}'.format(*self.counts)
@staticmethod def start(): while True: try: n = int(input('Введите количество игр n ')) return Game(n) except ValueError: print('Это не число!')
if __name__ == '__main__': Game.start()

Использование Google Guava

Пытаюсь разобраться с EventBus из библиотеки Google Guava. Хотелось бы посмотреть пример его использования относительно моей задачи. Другими словами, не могли вы показать пример использования ?
Допустим у меня есть некий класс, в котором есть вот такой вот внутренний класс-слушатель:
private class StopScanButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { try { portConnection.writeByte((byte) 0xFF); portConnection.writeByte((byte) 0x05); portConnection.writeByte((byte) 0xFF); } catch (SerialPortException | NullPointerException e1) { labelState.setText("Ошибка! Возможно вы не подключились к устройству!"); labelState.repaint(); } } }
Как я могу его вынести на шину?
P.S. Было бы еще лучше, если бы вы показали пример применения относительного этого класса. Но за пример относительно класса выше тоже буду очень признателен.


Ответ

Для начала, нужно создать класс описывающий событие:
public class TestEvent {
private final String message;
public TestEvent(String message) { this.message = message; }
public String getMessage() { return message; } }
и обработчик события, ключевой тут является аннотация @Subscribe, при помощи нее шина и понимает, какое же событие мы собираемся слушать:
public class EventListener { @Subscribe public void listen(TestEvent event) { System.out.println(event.getMessage()); } }
Затем нужно где-то в приложении инициализировать экземпляр EventBus, например как общедоступное статическое поле в вашем главном классе:
public static final EventBus bus = new EventBus();
После чего зарегистрировать слушатель(слушатели) на шине:
bus.register(new EventListener());
Теперь, где бы ты ни было(у вас - внутри ActionListener для JButton) при вызове:
bus.post(new TestEvent("message"));
все слушатели этого типа события, получат его

Баг с Roboto шрифтом на десктопном хроме

(оригинальный вопрос - https://stackoverflow.com/questions/37512815/bug-with-roboto-font-and-break-word-on-desktop-chrome)
Баг обнаружен на десктопных версиях:
beta Chrome version 51 Chrome 53 (canary)
Дело в странном поведении строки при сочетании букв нижнего регистра rt
Автоматически происходит перевод строки как на рисунке ниже -

Вот пример кода демонстрирующий баг:
.container { word-break: break-word; } .line { padding: 5px; } .inline-block { display: inline-block; padding: 7px 10px; background-color: #efefef; border: 1px solid silver; overflow: auto; white-space: pre-wrap; font-family: Roboto; }

rt
rt rt rt
morty
mo rty
mo Rty
mo rTy

Бага нету в хроме для планшета и смартфона.
Как убрать баг используя данные стили css ?
P. S. Объясните, пожалуйста, почему такой баг собственно имеет место быть?


Ответ

Всё-таки нашёл решение:
font-kerning: none;
Хотя ещё вопрос, насколько оно приемлемо...
.container { word-break: break-word; } .line { padding: 5px; } .inline-block { display: inline-block; padding: 7px 10px; background-color: #efefef; border: 1px solid silver; overflow: auto; white-space: pre-wrap; font-family: Roboto; font-kerning: none; }

rt
rt rt rt
morty
mo rty
mo Rty
mo rTy

Вшить dll библиотеку в проект [дубликат]

На данный вопрос уже ответили: Как скомпилировать все проекты солюшена в один .EXE? 3 ответа У меня проект на выходе состоит из одного файла. Решил я в проекте использовать стороннюю dll библиотеку. Как сделать так чтобы моя программа всё так же состояла из одного файла?


Ответ

Если сторонняя DLL - тоже .NET-сборка, то попробуйте ILMerge
ILMerge is a utility that can be used to merge multiple .NET assemblies into a single assembly. ILMerge takes a set of input assemblies and merges them into one target assembly.

Контроль порядка выдачи результатов асинхронной операции

Я пишу программу, которая показывает превью изображений, добавляя их в ячейки таблицы. В соседних ячейках есть поля для имени, тегов и источника загружаемых фотографий, которые я также заполняю, после чего загружаю всю эту информацию вместе с файлами на сервер. Я использую объект FileReader, который в свою очередь записывает файлы методом readAsDataUrl. Но проблема в том, что этот метод работает асинхронно и как результат я вижу превью не в том порядке, в котором файлы будут загружены на сервер, а сами превью не соответствуют файлам, которые за ними стоят, получается перемешка. Это породило проблему, поскольку описания файла, которые вносит пользователь (имя, тег, источник) в результате не соответствуют картинке.
Вот как это выглядит (обратите внимание на описания). Процесс загрузки:

Результат загрузки:

Здесь люди уже поднимали и решили похожую проблему, но я не знаю, как применить эти идеи в моем случае, когда для каждого превью динамически создаются элементы таблицы. Прошу помощи.
Мой код:
JavaScript
$(document).ready(function () {
$("#fileUpload").on('change', function () {
//Get count of selected files var countFiles = $(this)[0].files.length; var imgPath = $(this)[0].value; var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase(); var image_holder = $("#image-holder"); image_holder.empty(); if (extn == "gif" || extn == "png" || extn == "jpg" || extn == "jpeg") { if (typeof(FileReader) != "undefined") { //loop for each file selected for uploaded.
var newElem = document.createElement('table'); newElem.id = 'tl'; newElem.align = 'center'; newElem.border = 0;
for (var i = 0; i < countFiles; i++) { var reader = new FileReader();
reader.onload = function (e) {
var newRow = newElem.insertRow(0); var newCell1 = newRow.insertCell(0); newCell1.innerHTML = ""; var newCell2 = newRow.insertCell(0); newCell2.innerHTML = ""; var newCell3 = newRow.insertCell(0); newCell3.innerHTML = ""; var newCell4 = newRow.insertCell(0);
$("", { "src": e.target.result, "class": "thumb-image" }).appendTo(newCell4);
};
document.getElementById("image-holder").appendChild(newElem); reader.readAsDataURL($(this)[0].files[i]); image_holder.show(); } } else { alert("This browser does not support FileReader."); } } else { alert("Please select images only"); } }); });
HTML:




Ответ

Для организации последовательной загрузки можно использовать Promise
Для этого загрузку изображения с помощью FileReader, можно вынести в функцию, которая будет возвращать Promise, который разрешится тогда, когда картинка загрузится.
Она может выглядеть так:
function loadImage(image){ return new Promise(function(resolve, reject){ var fileReader = new FileReader(); fileReader.onload = function(e){ resolve(e.target.result); } fileReader.readAsDataURL(image); }); }
Используя функцию then можно подписаться на событие, которое произойдет, когда Prmoise перейдет в состояние готов.
например так:
loadImage().then(function(imageAsDataUrl){ ... });
Таким образом можно собрать цепочку асинхронных операций, которые будут выполняться друг за другом.
Итоговый вид может быть таким:
var queue = Promise.resolve();
[].reduce.call(this.files,function(queue, file, index){ return queue.then(function(){ return loadImage(file).then(function(imageAsDataUrl){ var newRow = newElem.insertRow(0); var newCell1 = newRow.insertCell(0); newCell1.innerHTML = ""; var newCell2 = newRow.insertCell(0); newCell2.innerHTML = ""; var newCell3 = newRow.insertCell(0); newCell3.innerHTML = ""; var newCell4 = newRow.insertCell(0);
$("", { "src": imageAsDataUrl, "class": "thumb-image" }).appendTo(newCell4); }); }); }, Promise.resolve()).then(function(){ // все картинки загрузились image_holder.show(); })
небольшое отступление: $(this)[0] это то же самое, что и this, можете проверить с помощью следующего выражения $(this)[0] === this вернет true

Java - Проблема с проверкой массива;

Всем доброго времени суток! Возникла проблема с проверкой массива на языке программирования java. Кратко: Есть переменная для ввода пользователя, есть массив, и есть if ветка, и да.. Есть объект random . Пользователь вводит слово : Привет (Должна пройти проверка if) После проверки массива, вызывается функция вывода сообщения пользователю(Из второго массива, это должно быть рандомно);
Как правильно записать массив?(И что бы в коде выглядело нормально); Как сделать проверку массива в if? (Я использовал equals(); ); Как правильно выводить рандомную фразу из массива? (Указание массива с переменной рандома не работает);
Кусочек кода(порезанный):
String setscan = scans.nextLine();//Считывает ввод пользователя; setscan = setscan.replaceAll(" +", "");//Игнорирует пробелы при вводе;
String[] dict_one = { "Добрый день", "Привет", "Здравствуй"};
Random rnd = new Random(); //Создаем новый объект класса Random; int rnds = rnd.nextInt(2); // Генерируем числа от 0 - 2;
//Словарь 1, проверка - ответ; if (setscan.equals(dict_one)) { System.out.println(dict_one[rnds]);
Буду очень благодарен! Примечания: На форуме я новичок, так же как и в java;


Ответ

if (Arrays.asList(dict_one).contains(setscan)) System.out.println(dict_one[rnds]);

Кнопка с градиентом

Пытаюсь сделать вот такую кнопку

пытаюсь это сделать подобным образом, что то типа:


т.е. я пытаюсь сделать одну фигуру градиентом и внутри нее еще одну фигуру просто белую с отступами но вижу либо один градиент либо только белое, пробовал отступы и там и там ставить.В чем может быть проблема? Как сделать вложенные фигуры?


Ответ

В общем то у меня проблема не воспроизводится.
вот разметка:

вот результат:

я только убрал атрибуты, дублирующие дефолтные и все в основном. Еще градиент от центра.

Как конкатенировать значения из 3 столбцов в 1?

Привет всем. У меня есть 2 таблицы:
Avto:
ID ID_driver 1 23 2 32
Driver
ID_driver Name Surname 23 Misha Volkov 32 Valera Petrov
Как мне запросом вывести в одно поле сразу и имя, и фамилию водителя, чтобы получить следующее при выводе в таблице Avto
ID Name_Driver 1 Misha Volkov 2 Valera Petrov
Cейчас у меня есть такой запрос, но он выводит по разным полям.
SELECT A.*, DR.NAME AS NAME, DR.SURNAME AS SURNAME FROM Avto A INNER JOIN DRIVER DR ON A.ID_Driver = DR.ID
Получается вот такое
ID ID_driver Name Surname 1 23 Misha Volkov 2 32 Valera Petrov


Ответ

ответ для interbase/firebird: select char_field1 || ' ' || char_field2 (гуглится с полпинка при правильном названии бд. )
первоначально теги были проставлены mysql/sql поэтому ответ про mysql оставлю для истории:
google://mysql concat и в принципе, когда хотите что-нибудь соединить/сложить строки (в любом языке, хоть mysql, хоть python), гуглите concat+mysql, concat python, а потом уже задавайте вопрос здесь. это будет хорошим тоном
в качестве упражнения можете исправить вот это решение:
SELECT A.*, CONCAT(DR.NAME, '%', DR.SURNAME) as driverName FROM Avto A INNER JOIN DRIVER DR ON A.ID_Driver = DR.ID
и пожалуйста, если вы о себе не думаете, подумайте о других, не надо писать названия таблиц и полей КАПСОМ. КАПСОМ следует писать операторы SQL. Иначе кто-нибудь, когда будет дебажить ваши запросы без подсветки синтаксиса (да и с ней тоже), проклянет вас черным словом.
P.S. уточняйте, пожалуйста, базу данных, поскольку тег mysql вы удалили
mysql> use db; Database changed mysql> mysql> create table driver (name text, surname text); Query OK, 0 rows affected (0.22 sec)
mysql> insert into driver values ('vanya', 'petrov'); Query OK, 1 row affected (0.03 sec)
mysql> select concat(name, surname) from driver; +-----------------------+ | concat(name, surname) | +-----------------------+ | vanyapetrov | +-----------------------+ 1 row in set (0.00 sec)
mysql> select concat(name, surname) as kek from driver; +-------------+ | kek | +-------------+ | vanyapetrov | +-------------+
автора простить можно только потому, что он не знает о существовании кучи диалектов SQL

Добавить товары в заказ до оплаты

Здравствуйте! Пишу в первый раз сайт интернет-магазина и столкнулся с проблемой: как добавить товары в заказы, до оплаты заказа? т.е. есть таблица, например, Orders, в которую товары попадают после оплаты, но, как хранить эти товары до оплаты? Прочитал что нужно создать промежуточную таблицу с ID товаров и заказов, но не совсем понятно как добавлять туда значения ID заказа, если я еще в таблицу Orders ничего не вносил? В общем какая-то каша в голове, покажите какой-то пример или ресурс, где об этом можно почитать.


Ответ

Для этого есть корзина (если я вас правильно понял), но её логика может быть разной ...
Я делаю так:
для анонимного пользователя помещаю текущие товары в корзине в сессию; для зарегистрированного — в таблицу users в поле products_in_cart
При оформлении заказа, в зависимости от того, кто его оформлял: аноним или зарегистрированный пользователь; переношу товары либо из сессии, либо из таблицы users соответственно в таблицу orders и ставлю в поле is_paid значение 0, которое говорит о том, что заказ не оплачен; после оплаты меняю значение поля is_paid в таблице orders на 1, которое говорит о том, что заказ оплачен ...

идентификатор последней вставленной записи

Есть запрос на вставку:
$query = "INSERT INTO tblOrder ( CustomerID,DateOrder,TimeOrder,TypePurchID,TotalSum,DeliveryID ) VALUES ( '$idcustomer',CURRENT_DATE,CURRENT_TIME,'$typepurch','$summ','$delivery' )"; $add = $mysqli->query($query);
Как мне получить идентификатор этой записи (т.е. последней)? Идентификатор проставляется автоматически AUTO_INCREMENT


Ответ

Есть функция mysqli_insert_id() - возвращает автоматически генерируемый ID, используя последний запрос.
/* проверка соединения */ if (mysqli_connect_errno()) { printf("Соединение не установлено: %s
", mysqli_connect_error()); exit(); }
mysqli_query($link, "CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)"; mysqli_query($link, $query);
printf ("ID новой записи: %d.
", mysqli_insert_id($link));
/* удаление таблицы */ mysqli_query($link, "DROP TABLE myCity");
/* закрытие соединения */ mysqli_close($link); ?>

Как осуществить подзапрос SQL?

Имеется две таблицы: ВОПРОСЫ И ОТВЕТЫ
ВОПРОСЫ

ID_ВОПРОСА (PK) ТЕКСТ ВОПРОСА ОТВЕТ (FK) ПРАВИЛЬНЫЙ ОТВЕТ (FK)


ОТВЕТЫ

ID_ОТВЕТА (PK) ТЕКСТ ОТВЕТА ID_ВОПРОСА (FK)

Как возможно реализовать такой запрос?
INSERT INTO ВОПРОСЫ (ТЕКСТ ВОПРОСА, ОТВЕТ, ПРАВИЛЬНЫЙ ОТВЕТ) VALUES ("ТЕКСТ ВОПРОСА", ПОДЗАПРОС(СОЗДАТЬ ЗАПИСЬ В ТАБЛИЦЕ ОТВЕТЫ И ОТДАТЬ ЕГО ID), 1)
Вероятно, ход мыслей неверный. Но я прям и не знаю как иначе. Буду рад любой помощи


Ответ

Схематично порядок работы с таблицами может выглядеть следующим образом
-- Сначала вставляем вопрос INSERT INTO ВОПРОСЫ (ТЕКСТ ВОПРОСА, ОТВЕТ, ПРАВИЛЬНЫЙ ОТВЕТ) VALUES ("ТЕКСТ ВОПРОСА", NULL, NULL);
-- Получаем идентификатор вопроса SET @id = LAST_INSERT_ID();
-- Вставляем ответы INSERT INTO ОТВЕТЫ (NULL, "ТЕКСТ ОТВЕТА", @id); SET @answer_id = LAST_INSERT_ID(); INSERT INTO ОТВЕТЫ (NULL, "ТЕКСТ ОТВЕТА", @id); SET @answer_id = LAST_INSERT_ID(); INSERT INTO ОТВЕТЫ (NULL, "ТЕКСТ ОТВЕТА", @id); SET @answer_id = LAST_INSERT_ID(); INSERT INTO ОТВЕТЫ (NULL, "ТЕКСТ ОТВЕТА", @id); SET @answer_id = LAST_INSERT_ID();
-- Обновляем FK ВОПРОСЫ.ОТВЕТ UPDATE ВОПРОСЫ SET ОТВЕТ = @answer_id WHERE id = @id;
-- Вставляем правильный ответ INSERT INTO ОТВЕТЫ (NULL, "ТЕКСТ ПРАВИЛЬНОГО ОТВЕТА", @id);
-- Получаем идентификатор правильного ответа SET @answer_right_id = LAST_INSERT_ID();
-- Обновляем FK ВОПРОСЫ.ПРАВИЛЬНЫЙ ОТВЕТ UPDATE ВОПРОСЫ SET ПРАВИЛЬНЫЙ ОТВЕТ = @answer_right_id WHERE id = @id;
При реальном использовании русские названия столбцов и таблиц, следует заменить на английские эквиваленты, не содержащие пробелов.

Библиотека gettext в lua

Необходима библиотека gettext для lua (CGI-сайт). Какие существуют решения?


Ответ

Решение на ffi: https://github.com/bungle/lua-resty-gettext. Данная реализация просто пробрасывает все библиотечные функции gettext напрямую.

JavaFX: классы против fxml

Если загуглить JavaFX Tutorial, то поисковик выдаст кучу уроков как программировать на JavaFX. Но почти во всех программа пишется за счет классов. Но ведь можно еще использовать fxml, разве это не лучше ? Какие плюсы и минусы у каждого из подходов ?


Ответ

Меньше кода в контроллере - единственный из плюсов. Например:

это все в fxml, собственно разницы фактически нет, пишите как хотите

Форматирование исходников с исключениями

Вот такой вот странный вопрос вдруг возник. Какие программы для форматирования исходников (в первую очередь на C, другие языки интересуют меньше) позволяют указывать области для исключений?
Столкнулся с куском кода, в котором пришлось расставлять не только осмысленные, но и фейковые комментарии (/* */), чтобы не потерять ясность после форматирования:
static int a[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* '0' - '9' */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* */ -1, -1, -1, -1, -1, -1, -1, /* 'A' - 'Z' */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, /* */ -1, -1, -1, -1, -1, -1, /* 'a' - 'z' */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, /* */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* ... up to 255 ... */ };
Для indent, bcpp и astyle этого хватает, но тут нужно в каждом частном случае подбирать варианты. И теоретически захотелось иметь возможность помечать неформатируемые блоки какими-то спецмаркерами.


Ответ

Это ж надо было столько времени тормозить, разглядывая маны...
AStyle, раздел Disable Formatting Indent, 1.10 Disabling Formatting

Tabs android Material Design [закрыт]

Подскажите пожалуйста принцип создания tabs в стиле MD. Пробовал, как здесь, но у меня ничего не получается. Постоянно вылетает приложение. Если можно, то с маленьким примером. Спасибо.
Вот сама ошибка:
FATAL EXCEPTION: main Process: com.example.artem_molodcov.twoontwo, PID: 11829 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/internal/widget/TintManager; at android.support.design.widget.TabLayout$TabView.(TabLayout.java:1145) at android.support.design.widget.TabLayout.createTabView(TabLayout.java:635) at android.support.design.widget.TabLayout.addTabView(TabLayout.java:669) at android.support.design.widget.TabLayout.addTab(TabLayout.java:365) at android.support.design.widget.TabLayout.addTab(TabLayout.java:340) at android.support.design.widget.TabLayout.setTabsFromPagerAdapter(TabLayout.java:624) at android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:595) at com.example.artem_molodcov.twoontwo.MainListActivity.onCreate(MainListActivity.java:51) at android.app.Activity.performCreate(Activity.java:5975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) at android.app.ActivityThread.access$800(ActivityThread.java:147) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5253) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:949) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:744) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.internal.widget.TintManager" on path: DexPathList[[dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-support-annotations-23.4.0_dcdd6768897d75c0d1439daffc3b1358df6baa97-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-internal_impl-23.4.0_fe7d3ab8a52aa947417c08c3ae37236e85c4d61a-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-com.google.android.gms-play-services-basement-8.1.0_57f3a6586736edbe7205ae9716f14bb019184c22-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-com.google.android.gms-play-services-appindexing-8.1.0_3a3a0e1fb0f9e5763fd45e331d5ebdf1a01da940-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-com.android.support-support-vector-drawable-23.4.0_234c55a414dbdcd5584df6ee8876d06099cb28b3-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-com.android.support-support-v4-23.4.0_8e2ccdac55547effbded05d725b49a19a8b4c747-classes.dex", dex file "/data/data/com.example.artem_molodcov.twoontwo/files/instant-run/dex/slice-com.android.su
Я еще совсем тупой в области Android разработке. Учусь 3 день. Прошу простить.
Ошибка вот в этом коде(в последней строчке):
DesignDemoPagerAdapter adapter = new DesignDemoPagerAdapter(getSupportFragmentManager()); ViewPager viewPager = (ViewPager)findViewById(R.id.pager); viewPager.setAdapter(adapter); TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout); tabLayout.setupWithViewPager(viewPager);
Вот build.gradle(module app)
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.0.1' compile 'com.android.support:cardview-v7:22.2.1' compile 'com.google.android.gms:play-services-appindexing:8.1.0' }


Ответ

Скорее всего проблема в различии версий библиотек поддержки. Они должны быть одинаковы и, желательно, самые последние.
Попробуйте так:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.google.android.gms:play-services-appindexing:8.1.0' }

При этом библиотека для тестов вам, скорее всего, просто не нужна и её можно смело выкинуть:
testCompile 'junit:junit:4.12'

Выстроить элементы внутри svg последовательно

Как последовательно выстроить группы внутри одного svg-элемента? Надо чтобы элементы g первого svg сами встали приблизительно как svg-теги во втором divе.
https://jsfiddle.net/kj1tmre3/1/


PS: Этот вопрос по-английски.


Ответ

К сожалению, svg не умеет автоматически раскладывать элементы, как это происходит в html. Однако, можно вложить группы друг в друга и применить к ним transform - в таком случае каждая группа будет уползать всё дальше от родительской. Вот такой хак:
.dest g { transform: translateX(24px); } .dest svg > g { transform: translateX(0); }


PS: А вообще лучше воспользоваться несколькими svg-тегами.

Инкремент при вставке записи

Каким образом реализовывается инкремент?
К примеру,
SET инкремент=1; INSERT INTO ТЕСТ('ДОМ_1', 'ДОМ_2') VALUES (инкремент++(инкремент=1),инкремент++(инкремент=2))


Ответ

Если я правильно понял вопрос, можно поступить следующим образом
SET @inc = 1; INSERT INTO ТЕСТ('ДОМ_1', 'ДОМ_2') VALUES (@inc := @inc + 1, @inc := @inc + 1);

Отмена перенос строки в HTML, чтобы убрать лишний пробел

Мой html-код генерится php-скриптом. Если знак препинания обернут в отдельный тег и стоит на следующей строке, то между этим знаком препинания и предшествующим словом появляется нежелательный пробел:
текст1; текст2 ; текст3; текст4; ...

Можно ли как-то отменить перенос строки в html-коде и добиться, чтобы у пользователя в браузере текст и знаки препинания отображались без пробелов?
@if ('' != $wmeaning->multi_translation) {{ $wmeaning->multi_translation }}; @endif
@foreach ($bridge->translationAdditions as $translationAddition) @if (!empty($translationAddition->translation_addition)) {{ $translationAddition->translation_addition }} @endif
@if (!empty($translationAddition->translation_comment)) {{ $translationAddition->translation_comment }} @endif
@if (!empty($translationAddition->translation_operand)) {{ $translationAddition->translation_operand }} @endif
; @endforeach


Ответ

UPD 3. Стоящей на отдельной строке давать другой класс ;, которому назначить margin-left: -10px;. Значение подобрать под размер шрифта.
.container { font-size: 40px; } .semicolon-alone { margin-left: -10px; )

text;
text ;

UPD 2. С учётом комментариев к ответу предлагаю ещё три варианта.
1) Узнать, как вставлять более серьёзные куски PHP, собирать строку без лишних пробелов и выводить её целиком. Не работал с Laravel. Нужно нечто в таком духе:
$tmp = "";
if (!empty($translationAddition->translation_addition)) { $tmp .= "" . $translationAddition->translation_addition . ""; }
if (!empty($translationAddition->translation_comment)) { $tmp .= "" . $translationAddition->translation_comment . ""; }
if (!empty($translationAddition->translation_operand)) { $tmp .= "" . $translationAddition->translation_operand . "'; }
$tmp .= ";";
2) Закрывать комментарии по условию. Будет много, очень много комментариев.
@if ('' != $wmeaning->multi_translation) {{ $wmeaning->multi_translation }}; @endif
@foreach ($bridge->translationAdditions as $translationAddition) @if (!empty($translationAddition->translation_addition)) {{ $translationAddition->translation_addition }} @endif {{ $translationAddition->translation_comment }} @endif {{ $translationAddition->translation_operand }}; @endforeach
3) Обнулять размер шрифта только у содержимого цикла. Для этого заворачивать его в дополнительный спан.
.kill-the-space { font-size: 0; } .text, .semicolon { font-size: 20px; )
@foreach ($bridge->translationAdditions as $translationAddition)
@if (!empty($translationAddition->translation_addition)) {{ $translationAddition->translation_addition }} @endif
@if (!empty($translationAddition->translation_comment)) {{ $translationAddition->translation_comment }} @endif
@if (!empty($translationAddition->translation_operand)) {{ $translationAddition->translation_operand }} @endif
;
@endforeach

UPD. Предлагаю добавить в ваш код HTML-комментарии, чтобы спрятать просвет между спанами:
@if ('' != $wmeaning->multi_translation) {{ $wmeaning->multi_translation }}; @endif
@foreach ($bridge->translationAdditions as $translationAddition) @if (!empty($translationAddition->translation_addition)) {{ $translationAddition->translation_addition }}; @endforeach
Если программа такое не переварит, то клонировать точку с запятой:
@if ('' != $wmeaning->multi_translation) {{ $wmeaning->multi_translation }}; @endif
@foreach ($bridge->translationAdditions as $translationAddition) @if (!empty($translationAddition->translation_addition)) {{ $translationAddition->translation_addition }}; @endif
@if (!empty($translationAddition->translation_comment)) {{ $translationAddition->translation_comment }}; @endif
@if (!empty($translationAddition->translation_operand)) {{ $translationAddition->translation_operand }}; @endif @endforeach
А вот так можно заткнуть дыру с помощью стилей:
.container { font-size: 0; } .text, .semicolon { font-size: 20px; )
text1;
text2 ;
text3 ;

Насколько правильно использовать мой подход передачи значения переменной из js в переменную php

Добрый день знатоки!=)
Вообщем смотрел кучу материалов на счет передачи переменной из js / jqwery в PHP , во всех этих материалах объяснялось, что это не самая тривиальная задача, куча строк кода приводилось в пример, через метод $_GET например( или вообще дикие какие-то методы, библиотеки, строк 25-100 кода) ...
И сегодня, в 3:30 утра, сидя за решением очередной задачки, кокраз с этим связанной, и выпив пару бутылочек вкусного пива, меня "осенило" -
зачем писать весь этот не нужный код из примеров, когда все можно сделать настолько просто, что сам себе не поверил что вообще сработает. Короче закралось сомнение что вообще это получится, но как оказалось все гениальное просто... Вот привожу код собственно того, что мне пришло в голову:

Я был сильно удивлен, что это сработало- изначально думал скептически, что это приход в пьяном угаре, но нет...
Вот закралось сомнение- может все же я что-то упустил из виду, может так делать нельзя по каким-то не явным причинам. Просто я программирую можно сказать первый месяц, и то только процедурное программирование на PHP, c js только начинаю смотреть простейшие вещи.
Прошу не закидывать камнями в случае если это банально- и я сейчас поделился тем, что всем известно как 2+2... Просто тогда зачем всех вводят в заблуждение, что передача значения переменной js в php это ппц как сложно?!
В общем вопрос- насколько это допустимо? Можно ли этим пользоваться, есть ли какие-то подводные камни?


Ответ

Итак в html документе мы имеем код

После построения документа $peremennayaPhp несёт в себе (string)"peremennayaJs", а не значение из var peremennayaJs. В итоге выходит такая функция alert(peremennayaJs), она и выводит 1

Можно ли одновременно изменить размеры компонентов внутри компонента при входе в полноэкранный режим?


Возможно ли одновременно расширить все компоненты при развертывании в полноэкранный режим, находящиеся в ScrollBox, и при свертывании вернуть размеры? Знаю, как прописать для одного, но компонентов там много.


Ответ

Установите Anchors контролов [право, лево, верх] и они сами расширятся.
Обратите внимание на предложение @kami.

Странное поведение разметки после 5 версии андроида

Есть некая разметка, приведу в пример лишь ее часть. По скроллу вверх она должна прятать toolbar и оставлять табы, на версии до lolipop все происходит как нужно. Однако, начиная с версии 5.0 и выше, убирается лишь status bar и при этом toolbar занимает место status bar
Сразу подумал на android:fitsSystemWindow, и все что у меня вышло - это сделать нормально на версии после 5, и полное скрытие на версиях до 5.
Раньше с подобным никогда не встречался, на мой взгляд поведение слишком странное.
Вот часть кода разметки:









Ответ

Это гугл опять воду мутит. В версии либ 23.3.0 всё более-менее нормально работает. На версии 23.4.0 придётся пользовать костыль проставления paddingTop тулбару

Настройка DNS Bind9

Добрый день, дорогие друзья. Есть вопрос по Bind9. Я в нём только начинаю разбираться и вот появилась задача где нужно перенаправлять все запросы на DNS на 1 IP. То есть на любой запрос домена, DNS сервер должен ответить одним IP-адресом.
Большое спасибо.


Ответ

Идём в файл /etc/bind/named.conf.default-zones. Находим запись о корневой зоне. Она имеет следующий вид:
zone "." { type hint; file "/etc/bind/db.root"; }
Меняем её на следующую:
zone "." { type master; file "/etc/bind/db.fakeroot"; }
Далее создаём файл /etc/bind/db.fakeroot со следующим содержимым:
; Стартовая запись зоны. @ IN SOA ns.example.com. admin.example.com ( ; Основной сервер имён, e-mail администратора. 2016061001 ; Серийный номер. 1h ; Интервал обновления для вторичных серверов. 1h ; Интервал повтора запроса вторичного сервера при неудаче. 1w ; Время обслуживания зоны вторичными серверами при отказе первичного. 1h ; Время кэширования отрицательных ответов. )
IN NS xxx.xxx.xxx.xxx * IN A xxx.xxx.xxx.xxx
(Подставляем здесь вместо xxx.xxx.xxx.xxx требуемый адрес.)
Далее перезапускаем сервер командой rndc reload и радуемся результату.
Если хотим перенаправлять на свой сервер также и IPv6-трафик, то добавляем в /etc/bind/db.fakeroot строку следующего вида:
* IN AAAA xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
(Подставляем здесь вместо xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx требуемый IPv6-адрес.)

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

Есть два @Html.DropDownListFor(), один из которых предполагает выбор даты, а второй - времени события. Подскажите, пожалуйста, возможно ли с помощью razor-а передать два значения в качестве одной строки в контроллер из представления? Т.е. получить в результате в контроллере одну переменную формата, например, "MM/dd/yyyy/HH/mm/ss", при том что из отдельных DropDownListFor() берутся дата: "MM/dd/yyyy" и время: "HH/mm/ss".
Возможно ли собрать эти строки вместе и передать в метод контроллера как одну строку?


Ответ

Вам нужна кастомная привязка модели. Механизм привязки модели в asp.net достаточно умён для простых и для большинства сложных моделей, но в подобных случаях он бессилен. Тут на помощь приходит возможность создания собственных привязчиков модели. Для этого вам потребуется создать класс, реализующий интерфейс IModelBinder. Проще это сделать, унаследовавшись от класса DefaultModelBinder. Примерно так:
public class DateTimeModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var request = controllerContext.HttpContext.Request; var date = DateTime.Parse(request.Form.Get("date")); var time = TimeSpan.Parse(request.Form.Get("time")); date = DateTime.Today.Add(time);
return date; } }
а затем применить указать этот класс в качестве привязчика модели для вашего параметра. Вряд ли вы хотите делать приваязку модели таким образом везде в вашем проекте, поэтому стоит делать это с помощью атрибута для параметра вашего метода. Примерно так:
ActionResult MyAction([ModelBinder(typeof(DateTimeModelBinder))] DateTime arg)

c#, MVVM, Command, ContextMenu Binding

Столкнулся с проблемой. Имеется внутри View

И внутри ViewModel такое
public RelayCommand ShowCommand { get; set; }
void InitCommands() { ShowCommand = new RelayCommand( x => Show(x), (can) => { return can == null ? false : Directory.Exists(ApplicationPath.Groups + (can as Event).Persons + @"/") ? File.Exists(ApplicationPath.Groups + (can as Event).Persons + @"/" + "GroupList.dat") : false; }); }
В (can) все время (при запуске страницы) заходит null. Когда же я выбираю в ListBox элементо и жмакаю правой кнопкой, то меню айтем с данной командой не доступен.
Директория и файл существуют. Event - мой класс, в котором есть поле строковое Persons; Команду видит, биндинг работает.
Также прикрепляю класс RelayCommand - paste.org.ru/?wu3n62


Ответ

Проблема вот в чём.
У вас дана реализация CanExecute, но нет реализации CanExecuteChanged. Поэтому изменения CanExecute не подхватываются.
Есть несколько путей решения этой проблемы.
Во-первых, ваша реализация RelayCommand (это нестандартный класс, значит, вы берёте его из какого-то фреймворка или написали самостоятельно) может предоставлять возможность запустить CanExecuteChanged. Тогда вы должны сами реализовать логику, которая определяет эти обстоятельства, и «дёргает» CanExecuteChanged в нужный момент. Этот путь может быть сложен, если ваш параметр меняется со временем.
Во-вторых, вы можете в тот момент, когда по логике программы команда может активироваться или деактивироваться, вызвать вручную CommandManager.InvalidateRequerySuggested. После этого значение CanExecute будет перечитано.

У меня и правда InvalidateRequerySuggested не сработало на RelayCommand. Я поменял его на RoutedUICommand, и всё взлетело.
Смотрите. Во-первых, определяем нужную команду:
public class GlobalCommands : RoutedUICommand { private GlobalCommands() { } // запрещаем создавать экземпляры снаружи
public static GlobalCommands ShowStudents = new GlobalCommands() { Text = "Отобразить список студентов" }; // сюда можно добавлять ещё команды }
Затем, в главной VM создаём CommandBinding
public IEnumerable SupportedBindings { get { return supportedBindings; } } List supportedBindings;
void InitCommands() { supportedBindings = new List() { new CommandBinding( GlobalCommands.ShowStudents, (sender, args) => ShowStudents(args.Parameter), (sender, args) => args.CanExecute = CanShowStudents(args.Parameter)) }; } // ... void ShowStudents(object iEvent) { if (iEvent is Event) { var _event = iEvent as Event;
// загрузить конкретную группу } }
bool CanShowStudents(object iEvent) { Debug.WriteLine("CanShowStudents called"); var ev = iEvent as Event; if (ev == null) return false; Debug.WriteLine($"CanShowStudents, persons = {ev.Persons}"); return Directory.Exists(AppPathGroups + @"\" + ev.Persons) && File.Exists(AppPathGroups + @"\" + ev.Persons + @"\" + "GroupList.dat"); }
Таким образом создаётся привязка команды к её реализации.
Затем, привязки нужно зарегистрировать, чтобы какой-нибудь UI-объект их обрабатывал. Например, окно. Для этого в App.xaml.cs пишем:
// вызывается на Application.Startup void ApplicationStartup(object sender, StartupEventArgs e) { var vm = new ViewModel(); foreach (var binding in vm.SupportedBindings) CommandManager.RegisterClassCommandBinding(typeof(Window), binding);
var w = new Window1(); w.DataContext = vm; w.ShowDialog(); }
И наконец, в UI пишем такое:

В таком варианте код работает.

Принципиально ли различие версий Debian? [закрыт]

У меня на VPS стоит Debian 7.9 (64), хочу у себя на компе установить на VirtualBox всё тоже самое, чтобы без проблем доделать сайт и потом перенести на VPS.
Если я у себя на компе установлю Debian 8.5 (64) то по идее может же быть такой момент, что на компе работает все нормально, а на VPS - нет? Или вероятность мала и не париться ставить 8.5?
сайт python 2.7 + djanjo + oscar


Ответ

Это больше зависит от того, какие пакеты в Debian вы используете.
В общем случае такая ситуация очень даже возможна. Скорее теоретически, но всё же.
Если пользоваться Debian 8 и сильно рассчитывать на новые пакеты, после миграции на Debian 7 можно обнаружить, что каких-то пакетов в официальных репозиториях там нет. Совсем.
Скорее всего, им можно будет найти замену. Скорее всего, это даже будет не очень сложно. Но может потребоваться обновить и зависимости. Собрать что-то из исходников. В общем, "худший случай" может в себя включать много приключений, но у него мало шансов.

Ваши сомнения были бы понятны, если бы ваша система для разработки была на Debian 8 и вам было бы жалко работать не на ней. Но если вы всё равно собрались ставить систему в VirtualBox, то лучше поставить ту же самую версию ОС, которую ожидаете на сервере. Так ожидания будут гораздо лучше стыковаться с действительностью.
Ах да, самое главное. У Debian есть архив образов старых версий. Нужную вам версию можно взять там.

Поиск изображений-околодубликатов

Столкнулся с задачей поиска одинаковых изображений. Как и во всём новом, получил избыток смежной, не нужной мне информации, множество английской литературы и прочего.
Итак, мне хотелось бы получить наводку на достаточно качественный и быстрый алгоритм, который, однако, не является из ряда вон сложным. То есть, к абсолютному качеству и большому функционалу не стремлюсь (мне это не нужно), но алгоритм должен соответствовать таким условиям:
Находит не просто похожие, а идентичные объекты, причём под идентичными подразумевается не почти-копия изображения как такового, а скорее отображение точно такого же предмета (near-duplicates): он может повернуться, наклониться, сдвинуться вбок, стать темнее/ярче, покрыться сторонними деталями и тому подобное, но это с большой вероятностью один и тот же предмет; То есть, следует работать не только с низкими частотами, которые, грубо говоря, определяют структуру, ведь тут важны более-менее однозначно характеризующие объект детали, которые теряются, если переходить к низким частотам; Алгоритм работает куда меньше секунды, желательно настолько быстро, чтобы успевать сравнивать хотя бы пару десятков изображений с такой же парой десятков, то есть, качественность важна, но скорость - важнее; Исходные картинки сами по себе обычно не очень большие, а их количество, думаю, будет сравнительно небольшим, предположительно, в рамках нескольких сотен; Исходные картинки - чёрно-белые и безо всякой дополнительной обработки, разве что кроме нормализации; то есть, учитывать, что алгоритм должен уметь искать какие-то хорошенько и по-разному обработанные, но одинаковые по содержанию, изображения, нет необходимости; Огромным плюсом будет существование не смутного описания алгоритма, а чего-либо конкретного, в оптимуме - псевдокод, в идеале - код.
Да, прошу направления, какой алгоритм раскапывать, это не требование в духе "сделайте за меня всё", это - "более знающие, пожалуйста, сделайте оптимальную выборку, чтобы я мог нормально сориентироваться, так как я сейчас дезориентирован".


Ответ

Из комментариев к вопросу стало понятно, что в целом суть задачи сводится к вычислению межкадровой разницы и поиску соответствия локальных изменений отдельных единиц интереса во времени. Проще говоря, если в кадре смещается несколько объектов, то необходимо различать, какое из смещений к каковому объекту относится.
Детектор движения
Как только речь заходит о межкадровой разнице, то в качестве решения сразу всплывает детектор движения. В составе фреймворка OpenCV имеется прекрасный пример, демонстрирующий возможности этого инструмента, да и Youtube переполнен соответствующими роликами. В том числе с вычислением вектора движения и связанных компонент, что составляют части целого объекта.
Однако у детектора движения имеются два очевидно слабых момента. Первый заключается в том, что если съёмка ведётся на улице, то фактор изменения фона (облачность в солнечный день или сильный ветер камеру на столбе трясёт) приводит к тому, что относительно малые пиксельные изменения объектов теряются на фоне более глобальных изменений во всём кадре. И это практически никогда не удаётся победить.
Второй момент - это прекращение движения объекта. Полное, либо просто существенное снижение скорости. И если автомобили на скоростной трассе редко стремятся остановиться, то те же самые автомобили на оживлённом перекрёстке будут соблюдать правила дорожного движения. Пешеходы же, так вообще могут следовать одним только им известной логике, нарушая порой даже самые лояльные законы перемещения в пространстве. Получасовое преодоление бордюра на карачках - это одна из самых безобидных картин, которую будет вынужден понять и принять цифровой разум алгоритма.
Исходя из обозначенных моментов, можно сделать вывод, что детектор движения - это вполне себе подходящее решение, но только лишь при наличии одного условия: скорость смещения объектов интереса должна быть всегда существенно выше, нежели чем скорость изменения фона. Если это правило не соблюдается, то функционал детектора движения необходимо дополнить обработчиками исключительных ситуаций, в которых объект интереса может начать терять в скорости, либо полностью остановиться.
Таким обработчиком исключительной ситуации может являться использование так называемых особенных точек (feature points) на той части изображения, которая содержит медленно изменяемый объект. Как только детектор движения начнёт фиксировать резкое уменьшение количества пикселей (значение подбирается эмпирически), изменившихся между двумя кадрами, то в дело вступают особенные точки, которые и будут следить за местоположением объекта до начала возобновления фазы его активного движения.
Особенные точки изображения в противовес детектору движения в целом неинвариантны к быстрому изменению объекта в естественной среде, но в то же время позволяют относительно легко его обнаруживать от кадра к кадру, если тот не претерпевает существенных изменений.
Оптический поток
Вычисление оптического потока является альтернативой вышеуказанному подходу. В какой-то мере это решение - компромисс использованию особенных точек и детектора движения.
С одной стороны, вычисление оптического потока становится чрезвычайно затруднительно, если объект интереса смещается очень быстро при некоей стандартной скорости кадрового захвата, но в то же самое время неплохо себя чувствует на средних и малых скоростях движения. В случае же полной неподвижности объекта может проявиться погрешность в детекции его местоположения. Эти нюансы индивидуальны для каждого алгоритма вычисления оптического потока.
Например алгоритм Лукаса-Канаде, производящий вычисление сдвига объекта по предварительно отобранным точкам, может запросто потерять этот самый объект просто по той причине, что у того большое количество пикселей в некоторой позиции и её окрестностях имеют близкое значение. Это вполне себе может произойти, если рассматривать в качестве объекта интереса автомобиль, крыша, двери и прочие части которого имеют близкие по цвету области и не выражены какими-либо особенностями. Но в связи с тем, что точек для сравнения число ограниченное (значительно меньше, нежели чем пикселей в интересующей области), то сам процесс поиска производится на высокой скорости с минимальными затратами вычислительных ресурсов.
В противовес - алгоритм Фарнебека, производящий вычисление оптического потока для всех пикселей заданной области изображения. С ним обычно наблюдается более точный результат, но и существенное потребление вычислительных ресурсов.
Вместо заключения
В ответе неспроста упоминается детектор движения как часть некоего комплексного решения. Несмотря на его ограничения, в целом он имеет одно значительное преимущество, которое зачастую становится принципиальным в отдельных задачах - детектор движения позволяет определять границы объектов. Ни оптический поток, ни особенные точки таковой информации не дают, а значит разделение рядом расположенных объектов будет весьма затруднительно.

Сайт на основном домене и поддомене - разные по содержанию

Подскажите, чем чревато размещение на основном домене, например site.com сайта автомобильной тематики (к примеру), а на субдомене another.site.com - абсолютно другого сайта, скажем о музыке?
В Сети много споров на эту тему, и однозначного ответа я не нашел. Как это повлияет с точки зрения SEO? Спасибо.


Ответ

Обратим внимание на мотивы подобного "разделения". Для чего прибегать к такому подходу? Если ответ - экономия на другом домене, то: а) это не серьёзно; б) и о какой раскрутке может идти речь, когда экономят на основном "имени", ибо это равнозначно (визуально) сайту на бесплатном хостинге. А если же ответ на данный вопрос с этой причиной не связан, то прибегнем к опыту других сайтов с подобным подходом.
Например площадки для личных блогов от Google, LiveJournal и т.п., работают как раз по такому принципу, где каждому участнику создаётся свой поддомен, по адресу которого содержится его блог с тематикой, отличной от тематики других участников. И тем не менее поисковые системы вполне отлично разбираются "что" и "где" искать.

Отсутствует VKScope.MARKET в Android SDK Vk

Мне нужно выполнить market.get, для этого надо разрешение market (VKScope.MARKET), но в android sdk я его не нашёл.


Ответ

Надо писать так:
private String[] scope = new String[] {VKScope.WALL, VKScope.GROUPS, VKScope.PHOTOS, "market"};

Как избежать выход за пределы экрана элемента в теле NestedScrollView?

Всем здравствуйте! Хотел добавить все элементы в NestedScrollView чтобы при небольшом дисплее можно было прокрутить. При добавлении их туда, часть расположено в верхней части экрана и они наложены друг на друга, а часть вышли за пределы экрана. Всё испробовал - не помогает. Что мне делать? Подскажите, пожалуйста!
С NestedScrollView выглядит так:

Без NestedScrollView:
Код разметки xml с NestedScrollView: