Страницы

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

четверг, 11 июля 2019 г.

Перемещающаяся кнопка, как сделать OnClick?

Всем доброго времени суток!
Пусть есть любой View (для примера, кнопка), который должен постоянно двигаться и, в случае клика по нему, вызывать обработчик onclick. Я так полагаю, что если двигать кнопку, используя translate-анимацию, то кликнуть по ней можно будет только в том месте, откуда она начала движение, или в том, где прекратила движение.
Так не пойдет, нужно, чтоб в любом участке ее пути она была кликабельна там, где находится в конкретный момент. Можно заставить кнопку двигаться в цикле, изменяя ее X-, Y-координаты. Но тогда, я так полагаю, если зажать кнопку и подождать, пока она выйдет из под пальца в результате своей анимации, обработчик клика все равно сработает (или не сработает?). Нужно, чтоб он срабатывал только в случае, если палец был поднят от экрана в том же месте, где в это мгновение находится кнопка.
Как это реализовать, я не знаю, может, посоветуете пути решения?
В результате ответ, данный ниже, оказался правильным, вот реализация проверки, не ушла ли кнопка из-под пальца, если кому надо:
Я повесил на кнопку onTouchListener, и вот его код (isOff на входе =false):
case MotionEvent.ACTION_DOWN: firsttapX = motionEvent.getX();//берем Х и Y куда ткнули пальцем( по кнопке) firsttapY = motionEvent.getY(); break; case MotionEvent.ACTION_MOVE: if (isOff==false) { dx = motionEvent.getX() - firsttapY;//получаем разницу между текущим dy = motionEvent.getY() - firsttapX;//положением кнопки и точкой куда мы if (abs(dx) > 50 || abs(dy) > 50) {//нажали isOf=true; /*тут то, что я хотел реализовать по клику мимо кнопки или если она свалила из-под пальца, это же продублировано в onClick мимо кнопки*/ } } break;
Если разница больше определенного числа (размер кнопки), то кнопка не под пальцем isOff=true перестает обрабатывать ACTION_MOVE.


Ответ

Если использовать ObjectAnimator, то кликнуть по ней можно будет и в момент движения. Но это только для API 11+

Редирект в Spring MVC

В последнее время мне никто не отвечает, но я всё равно почему-то спрашиваю...
Привет, товарищи. По прежнему мусолю официальный пример на оф. сайте Spring, переписываю их код с помощью аннотаций. Там есть формочка, чтобы увеличить цену, вот такая:

По нажатии кнопки Execute цены на товар увеличиваются на заданный процент, и после этого пользователя перебрасывает на страницу со списком товаров. Вот их код, который это обслуживает:
public ModelAndView onSubmit(Object command) throws ServletException {
int increase = ((PriceIncrease) command).getPercentage(); logger.info("Increasing prices by " + increase + "%.");
productManager.increasePrice(increase);
logger.info("returning from PriceIncreaseForm view to " + getSuccessView());
return new ModelAndView(new RedirectView(getSuccessView())); }
Опустим работу с логированием, базой данных, остановимся только на возвращаемом методом значении. Моя задача - сделать так, чтобы после увеличения цен на странице с товарами появилось уведомление, мол, "цены успешно повышены", а при обновлении страницы пропало. Я пробовал так:
@RequestMapping(method = RequestMethod.POST) public ModelAndView post(Model model) { model.addAttribute("hello", "world"); return new ModelAndView(new RedirectView("/home.htm")); }
так:
@RequestMapping(method = RequestMethod.POST) public ModelAndView post(Model model) { return new ModelAndView("redirect:/home.htm").addObject("hello", "world"); }
так:
@RequestMapping(method = RequestMethod.POST) public ModelAndView post(Model model) { return new ModelAndView("redirect:/home.htm", "hello", "world"); }
так:
@RequestMapping(method = RequestMethod.POST) public View post(Model model) { model.addAttribute("hello","world"); return new RedirectView("/home.htm"); }
А ещё тут предлагают вызывать метод, отвечающий за страницу со списком товаров. Все мои попытки, представленные выше, передают мой hello=world в url, получается
http://localhost/home.htm?hello=world
Соответственно если я сделаю пометку таким образом, она никуда не денется после обновления страницы. Как мне быть? Может, есть какой-то способ передать в модель той страницы дополнительные атрибуты? На PHP я это делал с помощью $_SESSION, может, и здесь сессии использовать?
P. S. Спасибо тем, кто доскроллил вопрос до конца, надеюсь получить ответ, палец вверх и принятый ответ гарантирую.


Ответ

может и здесь сессии использовать?
Ну а как еще? Это же по факту состояние, которое надо сбрасывать после первого показа. Ну куки еще разве что. Вордпресс, конечно, живет себе гет-параметрами, но он вордпресс. Вообще эта штука называется flash messages, единственная проблема будет со списками, когда надо по одному ключу забить кучу сообщений https://stackoverflow.com/questions/11881720/multiple-flash-messages-in-spring-mvc
В последнее время мне никто не отвечает, но я всё равно почему-то спрашиваю... палец вверх и принятый ответ гарантирую.
-_-

Как составить алгоритм для поиска комбинаций в массивах?

Здравствуйте, помогите пожалуйста придумать алгоритм для поиска всех возможных групп из комбинаций. Исходные данные: Массив комбинаций $combinations => [ a => [11, 38], b => [38, 64, 71], c => [11, 24, 38, 65] d => [128, 38, 57, 40] ... ] каждая комбинация в этом массиве может состоять из 2, 3 или 4 чисел Нужно найти все возможные группы из 4х чисел, в которых будут участвовать от 2-х до 4-х комбинаций из массива комбинаций и определить сколько комбинаций входит в группу и каких. В группе должно быть 4 числа, ни больше, ни меньше. Например можно составить группу в которой будут участвовать 2 комбинации (a и b): $group => [11, 38, 64, 71] В эту группу входит первая и вторая комбинация. Третья комбинация (с) уже содержит в себе первую комбинацию (a), т.е. она тоже состоит из двух комбинаций. Как найти группы, в которых будет от 2х до 4х комбинаций? Я нагородил много вложенных циклов и то, работает криво и ищет только среди комбинаций которые состоят из 2х чисел. Код получился огромный и страшный, что даже боюсь показывать его кому-то. А страшный он из-за того, что не могу придумать оптимальный алгоритм поиска групп.


Ответ

Код: # Входящий массив: $ar = array( 'a' => '11, 38', 'b' => '38, 64, 71', 'c' => '11, 24, 38, 65', 'd' => '128, 38, 57, 40' );
# Искомые числа: $in = array('11', '38', '64', '71');
$result = array();
foreach($ar as $key => $value){ $line = explode(',',$value);
foreach($in as $inn){ if(in_array($inn,$line)){ $result[$key]['count']++; $result[$key][] = $inn; } } } print_r($result); Результат работы кода: Array ( [a] => Array ( [count] => 2 [0] => 11 [1] => 38 )
[b] => Array ( [count] => 3 [0] => 38 [1] => 64 [2] => 71 )
[c] => Array ( [count] => 2 [0] => 11 [1] => 38 )
[d] => Array ( [count] => 1 [0] => 38 )
) Надеюсь, что помог. UPD: $ar = array( 'a' => '11,38', 'b' => '38,64,71', 'c' => '11,24,38,65', 'd' => '128,38,57,40', 'e' => '38,115,64', 'f' => '64,11,57,38' ); $line = array(); foreach($ar as $key => $value){ $line[$key] = explode(',',$value); } $r = 1; foreach($line as $keyRes => $res){ $c = 1; foreach($line as $keyRes2 => $res2){ if($c > $r){ $arMerge[$keyRes][$keyRes2] = array_merge($res,$res2); }; $c++; } $r++; } foreach($arMerge as $intKey1 => $intVal1){ foreach($intVal1 as $intKey2 => $intVal2){ foreach($intVal2 as $intVal){ $resAr[$intKey1][$intKey2][] = (int)$intVal; } } } foreach($resAr as $uniqKey1 => $uniqVal1){ foreach($uniqVal1 as $uniqKey2 => $uniqVal2){ if(count(array_unique($uniqVal2)) == 4){ $result[] = $uniqKey1.'-'.$uniqKey2; } } } print_r($result); Результат выполнения: Array ( [0] => a-b [1] => a-c [2] => a-e [3] => a-f [4] => b-e ) Теперь вроде правильно.

Как подключить javadoc в Android Studio?

Использую в своём приложении OSMBonusPack. Есть javadoc, как подключить не знаю. В интернете нашёл, что подключение должно быть аналогично IntelliJ IDEA, но в Project structure не нашел нужных настроек. Насколько я понимаю, библиотека должна быть в разделе modules, но там только app, самой библиотеки(OSMBonusPack) там нет.


Ответ

tools - sdk manager - source for android sdk, если студия попросит путь - указать из папки sdk нужного api

Как реализовать переход назад по fragment-ам в navigation drawer

У меня есть navigation drawer . В listView я выбираю item заменяю fragment1, в fragment1 из списка выбираю item и заменяю fragment1 на fragment2...
Как вернуться назад по фраментам? По нажатию левой верх кнопки открывается navigation drawer. Это все происходит в одном activity. Правильно ли я это делаю? Можно пример?


Ответ

Вот только что (минуту назад) решал аналогичную задачу.
Что нам надо:
1) При запуске активити показывать гамбургер.
2) При замене фрагмента поменять гамбургер на стрелку.
3) При нажатии на стрелку вернуть предыдущий фрагмент
4) Опять показать гамбургер.

Делаем:
1) Если ND сделан правильно, то гамбургер уже показан при запуске.
2) Показать стрелку можно так:
mDrawerToggle.setDrawerIndicatorEnabled(false);
3, 4) Она будет реагировать на нажатия в onOptionsItemSelected() по id R.id.home
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: //При нажатии вызывается обработчик кнопки назад //Он по умолчанию должен будет вернуться по списку фрагментов назад onBackPressed(); //Надо вернуть иконку гамбургера mDrawerToggle.setDrawerIndicatorEnabled(true); return true; } }
P.S. Вот тут решали подобную задачу на англо-саксонском.

Поименованные аргументы из Python в с++ через SWIG

Здравствуйте. Объявляю в С++ class, ну например:
сlass Point { public: Point(int color, int x=0, int y=0); };
Теперь из Pyhton пробую создать объект
p = Point(16, y=0)
Но получаю что-то вроде:
TypeError: __init__() got an unexpected keyword argument 'y'
Как при помощи SWIG генерировать для Pyhton интерфейс с поименованными аргументами?


Ответ

Добавьте в Ваш интерфейсный файл, например point.i, следующую строку:
%feature ("kwargs") Point;

Формирование вложенных в список списков из других списков по определенным правилам?

Добрый день, есть три списка
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
нужно из них сделать список со вложенными списками, вот такой:
newList = [[1,3,4], [2,3,4], [8,9,10], [12,13,14], ...]
Первый элемент вложенного списка это первый это первый элемент списка allIndex_A. Второй элемент это первый элемент из списка allIndex_В, значение которого больше значения первого элемента из вложенного списка. Третий элемент это также первый найденный элемент из списка allIndex_С, значение которого больше первого элемента во вложенном списке.
Первый элемент второго вложенного списка это второй элемент из списка allIndex_A. Второй и третий элемент второго вложенного списка находятся по таким же условиям как и в первом вложенном списке. То есть это должен быть первый найденный элемент из списков allIndex_В и allIndex_С, значение которого больше значения первого элемента.
Пример получившегося списка newList выше. Начал изучать программирование недавно, многих вещей еще не знаю. Буду благодарен, если кто-то объяснит как сделать то, что мне нужно или хотя-бы даст ссылку где можно почитать на тему вопроса.


Ответ

Вот решение, основанное на использовании zip(), чтобы транспонировать элементы трёх списков
#!/usr/bin/env python from itertools import tee
def gt_first(first, iterable): """Yield items from iterable that are greater than corresponding items from first.
first, iterable are sorted. """ it = iter(iterable) x = next(it) #NOTE: wrap with try/except StopIteration for pep-479 for item in first: while not (x > item): x = next(it) yield x
allIndex_A = [1, 2, 8, 12, 17, 21, 23, 29] allIndex_B = [3, 5, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 28, 30] allIndex_C = [4, 6, 10, 14, 16, 19, 25, 27]
a, ab, ac = tee(allIndex_A, 3) L = list(map(list, zip(a, gt_first(ab, allIndex_B), gt_first(ac, allIndex_C)))) print(L)
Результат
[[1, 3, 4], [2, 3, 4], [8, 9, 10], [12, 13, 14], [17, 18, 19], [21, 22, 25], [23, 24, 25]]
В ответе нет вложенного списка [29, 30, None], так как allIndex_C не имеет элемента большего 29 (можно itertools.zip_longest() вместо zip() использовать, чтобы подставить какое-нибудь значение, вместо игнорирования вложенного списка целиком).
Время исполнения линейное (O(n)). Если входные списки не отсортированы, то их надо отсортировать, тогда время исполнения O(n*log n) (на сортировку).

Уведомление о завершении сборки проекта в Visual Studio(2012)

Часто когда сидишь над большими проектами, особенно ночью, на сборку уходит много времени, но еще больше тратится из-за того, что по завершении проекта по уммолчанию отсутствует звуковое уведомление, которое может тебя разбудить. Как такое уведомление можно настроить?


Ответ

Вам нужно:
Создать *.bat файл с командой @echo • Открыть свойства проекта в Visual Studio, затем Build Events > Post-Build Event > Command Line > Edit Ввести команду call <имя батника> (например call C:\beep.bat) Сохранить изменения и протестить.

Реализация обновления Model из ViewModel (MVVM pattern, update Model from ViewModel)

В процессе изучения MVVM натолкнулся на проблему обновления данных в Model, полученных из ViewModel , имеется некое приложение, в котором:
Model:
public class Journal:IJournal { public Common CommonInfo { get; set; } public ObservableCollection Excavations { get; set; } }
public class Common:ICommon { public String Object { get; set; } public UInt32 NumJournal { get; set; } }
public class Excavation:IExcavation { public String NumExcavation { get; set; } public DateTime DateCreateExcavation { get; set; } }
ViewModel:
class JournalViewModel : PropertyChangedNotification,IJournal { public CommonViewModel CommonInfo { get { return GetValue(() => CommonInfo); } set { SetValue(() => CommonInfo, value); } }
public ObservableCollection Excavations { get { return GetValue(() => Excavations); } set { SetValue(() => Excavations, value); } }
public JournalViewModel(Journal journal) { CommonInfo = new CommonViewModel(journal.CommonInfo); Excavations = new ObservableCollection(); foreach (var excavation in journal.Excavations) { Excavations.Add(new ExcavationViewModel(excavation)); } } }
class CommonViewModel : PropertyChangedNotification,ICommon { public String Object { get { return GetValue(() => Object ); } set { SetValue(() => Object , value); } }
public UInt32 NumJournal { get { return GetValue(() => NumJournal ); } set { SetValue(() => NumJournal , value); } }
public CommonViewModel(Common common) { Object = common.Object; NumJournal = common.NumJournal ; } }
class ExcavationViewModel : PropertyChangedNotification, IExcavation { public String NumExcavation { get { return GetValue(() => NumExcavation ); } set { SetValue(() => NumExcavation , value); } }
public DateTime DateCreateExcavation { get { return GetValue(() => DateCreateExcavation ); } set { SetValue(() => DateCreateExcavation , value); } }
public ExcavationViewModel(Excavation excavation) { NumExcavation = common.NumExcavation ; DateCreateExcavation = common.DateCreateExcavation ; } }
Думаю будет совершенно не критично, если обойтись без View. В приведенном примере кода четко видно, что объект класса Journal передается в конструктор JournalViewModel и после чего, данные из этого объекта заносятся в свойства VM. Однако заносятся только данные, т.е. VM с M по сути не связаны. Возникает вопрос, а что если модель предназначена для сериализации и десериализации в определенный формат файла и работает именно с ним, ведь нужно обновлять данные модели...
Начитавшись статей, нашел 3 различных способа решить проблему обновления модели из VM:
1) Создать метод в VM который будет обновлять всю модель сразу (действия обратные действиям в конструкторе в полученный объект Journal записывать данные из свойств VM)
2) Создать некие Event отслеживающие изменения VM и записывающие данные в M
3) Создать свойство хранящее начальный объект Journal и в конструкторе записывать в него принимаемого значения после чего в getter и setter свойств использовать return Journals.Common (например) Однако, есть некоторая проблема с типами не могу понять, где ссылка работает, а где перестает действовать. Потому что я передаю объект (ссылку) Journal в конструктор VM, он так же содержит внутри себя Common который тоже является объектом (ссылкой), но связывания не происходит передаются только данные.
В данном примере
class BookViewModel : ViewModelBase { public Book Book;
public BookViewModel(Book book) { this.Book = book; }
public string Title { get { return Book.Title; } set { Book.Title = value; OnPropertyChanged("Title"); } } }
Связь VM с M реализована как раз через ссылку, не пойму правильно ли так их связывать в условиях паттерна, ведь по сути мы просто протягиваем модель и в нее через привязку к представлению записываем данные... В данной статье видел картинку в ней указано что VM общаясь с M использует 3 вида связи:
События изменения модели Обновление модели Получение данных
Сейчас работаю по примеру. не смотря на то что проблема выгрузки возникла почти сразу не обращал внимание, а теперь решил все таки заняться этим =( Если есть возможность, подскажите, пожалуйста, куда лучше копать чтобы не набить еще больше шишек..


Ответ

Как оказалось, действительно существует несколько способов взаимодействия с моделью. А использовать прямую связь с моделью, можно, как в этом примере:
class BookViewModel : ViewModelBase { public Book Book;
public BookViewModel(Book book) { this.Book = book; }
public string Title { get { return Book.Title; } set { Book.Title = value; OnPropertyChanged("Title"); } } }
однако в этом случае VM не будет той гибкой прослойкой, функцию которой она должна исполнять в серьезных приложениях. В любом случае, такой способ имеет место быть, но скорее в случаях когда модель и логика объединены или имеют одну и ту же структуру.<>
Если же Модель требуется обновляться во время изменения информации в VM сразу же (что может требоваться в любой системе) то нужно использовать Event-ы отслеживающие изменения VM и записывающие данные в M. К сожалению я не нашел примера =(
Однако моя задача сводилась к тому, что изменение в VM можно было бы вносить в M в любое время, и не важно, делать это сразу (Event) или во время выполнения команды (например сохранения). Для этого код классов VM был дополнен методами GetModel
class JournalViewModel : PropertyChangedNotification,IJournal { public CommonViewModel CommonInfo { get { return GetValue(() => CommonInfo); } set { SetValue(() => CommonInfo, value); } }
public ObservableCollection Excavations { get { return GetValue(() => Excavations); } set { SetValue(() => Excavations, value); } }
public JournalViewModel(Journal journal) { CommonInfo = new CommonViewModel(journal.CommonInfo); Excavations = new ObservableCollection(); foreach (var excavation in journal.Excavations) { Excavations.Add(new ExcavationViewModel(excavation)); } }
public Journal GetModel() { ObservableCollection excavations = null; if(Excavations!=null) { excavations = new ObservableCollection(); foreach(var excavation in Excavations) excavations.Add(excavation.GetModel()) } return new Common { Excavations= excavations , CommonInfo = CommonInfo.GetModel()
}; }
}
class CommonViewModel : PropertyChangedNotification,ICommon { public String Object { get { return GetValue(() => Object ); } set { SetValue(() => Object , value); } }
public UInt32 NumJournal { get { return GetValue(() => NumJournal ); } set { SetValue(() => NumJournal , value); } }
public CommonViewModel(Common common) { Object = common.Object; NumJournal = common.NumJournal ; }
public Common GetModel() { return new Common { Object = Object , NumJournal = NumJournal
}; } }
class ExcavationViewModel : PropertyChangedNotification, IExcavation { public String NumExcavation { get { return GetValue(() => NumExcavation ); } set { SetValue(() => NumExcavation , value); } }
public DateTime DateCreateExcavation { get { return GetValue(() => DateCreateExcavation ); } set { SetValue(() => DateCreateExcavation , value); } }
public ExcavationViewModel(Excavation excavation) { NumExcavation = common.NumExcavation ; DateCreateExcavation = common.DateCreateExcavation ; }
public Excavation GetModel() { return new Excavation { NumExcavation = NumExcavation , DateCreateExcavation = DateCreateExcavation };
}
}
Если у людей читающих этот ответ будет возможность ответить на вопрос: "Как организовать обновление Model во время изменения VM", буду очень благодарен. Иметь представление, что делается это через Event - хорошо, но видеть пример - ещё лучше. Так же буду благодарен за советы и комментарии касательно использованного способа (GetModel).
EDIT 25.06.2015 После точных замечаний @VladD, я решил внести некоторые изменения, возможно они будут правильнее нынешней реализации. И ведь действительно везде есть свои плюсы и минусы. В моей реализации, пользователь может вести работу сразу с несколькими журналами, предположим с 10. Сейчас я храню коллекцию не из 10 Journal (модели), а из 10 JournalViewModel (далее буду называть JourVM или просто VM), естественно JourVM содержит в себе множество свойств, полей, методов и команд, в таком случае, я не храню данные в виде объекта Journal в памяти (именно в объект модели Journal сериализуются данные из JSON, после чего грузятся в JourVM через конструкторы), а храню все JourVM в памяти и при необходимости вызываю метод GetModel() выгружаю все данные в объект модели только чтобы сериализовать модель в JSON.
В этом случае я вроде бы выигрываю немного памяти с тем, что не храню Journal (убирается после того как отдал данные в VM), однако перегружаю всю систему храня кучу VM =(
Видимо правильней было бы хранить коллекцию из Journal (List) и при переключении вкладок, используя interaction обращаться к модели, выгружая данные из модели в VM, при этом провести объекты модели через все VM для мгновенных изменений в модели, если разобрать на примере кода описанном выше, получится:
class JournalViewModel : PropertyChangedNotification, IJournal { public CommonViewModel CommonInfo { get { return GetValue(() => CommonInfo); } set { SetValue(() => CommonInfo, value);} }
public ObservableCollection Excavations { get { return GetValue(() => Excavations); } set { SetValue(() => Excavations, value); } }
private Journal _JournalM;
public JournalViewModel(Journal journal) { _JournalM = journal;
CommonInfo = new CommonViewModel(_JournalM.CommonInfo); Excavations = new ObservableCollection(); foreach (var excavation in _JournalM.Excavations) { Excavations.Add(new ExcavationViewModel(excavation)); } }
}
class CommonViewModel : PropertyChangedNotification, ICommon { public String Object { get { return GetValue(() => Object); } set { SetValue(() => Object, value); _CommonM.Object = Object; } }
public UInt32 NumJournal { get { return GetValue(() => NumJournal); } set { SetValue(() => NumJournal, value); _CommonM.NumJournal = NumJournal; } }
private CommonInfo _CommonM;
public CommonViewModel(Common common) { _CommonM = common; Object = _CommonM.Object; NumJournal = _CommonM.NumJournal; }
}
class ExcavationViewModel : PropertyChangedNotification, IExcavation { public String NumExcavation { get { return GetValue(() => NumExcavation); } set { SetValue(() => NumExcavation, value); _ExcavationM.NumExcavation = NumExcavation; } }
public DateTime DateCreateExcavation { get { return GetValue(() => DateCreateExcavation); } set { SetValue(() => DateCreateExcavation, value); _ExcavationM.DateCreateExcavation = DateCreateExcavation; } }
private Excavation _ExcavationM;
public ExcavationViewModel(Excavation excavation) { _ExcavationM = excavation; NumExcavation = _ExcavationM.NumExcavation; DateCreateExcavation = _ExcavationM.DateCreateExcavation; } }
По идее в конструктор VM поступает ссылка на M, мы ссылаемся на нее в VM и у нас не тратится драгоценная память, при изменении информации она сразу же меняется в нужной области в M и не требуется переключаться между VM. Сейчас мое приложение реализовано через TabControl-ы. 1) TabControl имеет вкладки Журналы, Настройки Справка и в качестве DataContex имеет MainVM который в свою очередь хранит VM с коллекцией журналов, отдельную VM с настройками и VM со справкой. 2) TabControl в качестве вкладок использует журналы из коллекции (DataContex на коллекцию из VM) хранящий ещё один TabControl с ссылками вкладок на определенные части VM. что вызывает некоторые тормоза в графике =( Если я все ещё не правильно интерпретирую данную мне информацию к размышлению и исправлению структуры и логики приложения это очень печально.

Background-image и border-image у одного элемента

При использовании одновременно свойств background-image и border-image возникает проблема, что фоновая картинка не залезает под рамку в IE. В chrome/ff/safari - всё нормально. div { width: 200px; height: 200px; display: block; background-image: url('http://www.jpl.nasa.gov/spaceimages/images/mediumsize/PIA17011_ip.jpg'); border-width: 30px; border-style: solid; border-width: 13px; border-image: url(http://www.norabrowndesign.com/css-experiments/images/border4.png) 13 repeat; }



Ответ

Надо добавить
border-color: transparent;
http://jsfiddle.net/vtzrnL6t/3/ - есть лишние свойства http://jsfiddle.net/vtzrnL6t/6/ - сокращённый вариант

Редактирование и настройка почтовых заголовков (mail headers) в Python

Добрый день! Мне необходимо для тестирования системы периодически отправлять и получать специальные письма с различными заголовками. Для реализации этой задачи я использую smtplib и MIMEText с энкодером encode_quopri.
import smtplib from email.mime.text import MIMEText from email.encoders import encode_quopri
SERVER = 'mailserver.loc' FROM = 'sender@' + SERVER TO = 'abonent1@' + SERVER
msg = MIMEText('проверка проверка проверка', 'plain', _charset='windows-1251') msg['Subject'] = 'subject' msg['From'] = FROM msg['To'] = TO msg['X-Message-id'] = 'xmsg_id' encode_quopri(msg)
print (msg)
На выходе получаю:
Content-Type: text/plain; charset="windows-1251" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: subject From: sender@mailserver.loc To: abonent1@mailserver.loc X-Message-id: xmsg_id Content-Transfer-Encoding: quoted-printable
=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA= =E0
Но у меня задвоился заголовок:
Content-Transfer-Encoding: base64 ... Content-Transfer-Encoding: quoted-printable
Я попробовал удалить первый, но тогда ломается quoted-printable и результат:
7/Du4uXw6uAg7/Du4uXw6uAg7/Du4uXw6uA=3D
Моя цель получить вот такой заголовок:
Date: Wed, 1 Jun 2011 11:25:32 +0400 From: Billinfo X-Priority: 3 (Normal) Message-ID: <878185321.20110601112532> To: abonent1@mailserver.loc Subject: Just a subject Resent-from: Billinfo MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------115EA32B5A1C2" Resent-Message-Id: <20110601072537.A8F1A3C14A> Resent-Date: Wed, 1 Jun 2011 11:25:37 +0400 (MSD)
------------115EA32B5A1C2 Content-Type: text/plain; charset=windows-1251 Content-Transfer-Encoding: quoted-printable
=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA=E0=20=EF=F0=EE=E2=E5=F0=EA= =E0 ------------115EA32B5A1C2 Content-Type: APPLICATION/VND.MS-EXCEL; name="doc.xls" Content-transfer-encoding: base64 Content-Disposition: attachment; filename="doc.xls"
some base64 content ------------115EA32B5A1C2--
Буду благодарен за любую помощь в решении моего вопроса!
UPD 11/04/2015: Моё решение:
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.charset import Charset from email.encoders import encode_quopri
SERVER = 'mailserver.loc' FROM = 'billing@' + SERVER TO = 'abonent1@' + SERVER
msg = MIMEMultipart('mixed') msg['Subject'] = 'subject' msg['From'] = FROM msg['To'] = TO msg['X-Message-id'] = 'xmsg_id'
charset = Charset('windows-1251')
att1 = MIMEText('проверка111 проверка проверка', 'plain', _charset=None) encode_quopri(att1) att1.set_charset(charset) del att1['Content-Transfer-Encoding'] del att1['MIME-Version'] att1['Content-Transfer-Encoding'] = 'quoted-printable'
msg.attach(att1)
print (msg.as_string())
################### OUTPUT ################### # Content-Type: multipart/mixed; boundary="===============2009055196==" # MIME-Version: 1.0 # Subject: subject # From: billing@mailserver.loc # To: abonent1@mailserver.loc # X-Message-id: xmsg_id
# --===============2009055196== # Content-Type: text/plain; charset="windows-1251" # Content-Transfer-Encoding: quoted-printable
# =D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0111=20=D0=BF=D1=80=D0=BE=D0= # =B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0= # =B0 # --===============2009055196==--
Благодарю за помощь! Заголовки нормально воспринимаются принимающей программой и письмо корректно обрабатывается.


Ответ

То, что вы желаете получить — составное письмо. Его составляющие: 1. текст; 2. файл-вложение.
Поэтому при формировании письма следует использовать тип MIMEMultipart, который будет играть роль оболочки для его частей (именно ему следует присваивать заголовки, которые вы присваиваете MIMEText).
Далее к оболочке нужно будет прикрепить (метод attach) объекты типов MIMEText (ваш текст), и MIMEApplication (ваш файл-вложение).

Загрузка файлов в Django

setting.py
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATIC_URL = '/static/'
форма

{% csrf_token %}
{{ form }}

views.py
def uploads(request):
if request.method == 'POST': form = upload(request.POST, request.FILES)
return HttpResponse(request.FILES['file'].temporary_file_path)
else: form = upload() return render_to_response('ff.html', {'form': form})
request.FILES['file'].temporary_file_path должен возвращать путь к временному файлу.В папке media файл отсутствует, а в браузере отображается только знак >
в модели формы только поле FileField(). При добавлении в него upload_to в консоли выдается ошибка __init__() got an unexpected keyword argument 'upload_to'


Ответ

Кратко: файл, загружаемый через форму, необходимо обработать, чего ваша программа не делает
Когда вы загружаете файл, Django сперва помещает его во временно хранилище. Маленькие файл размещаются в памяти, большие — в системной временной директории (на Linux это /tmp/).
Пример (UploadFileForm — форма, содержащая поле file типа FileField):
def upload_file(request): # Если метод POST if request.method == 'POST': # Заполняем форму полученными данными form = UploadFileForm(request.POST, request.FILES) # Если данные валидны if form.is_valid(): # обрабатываем файл handle_uploaded_file(request.FILES['file']) # перенаправляем на другую страницу return HttpResponseRedirect('/success/url/') # Если другой метод (обычно GET) else: form = UploadFileForm() # Выводим форму загрузки return render_to_response('upload.html', {'form': form})
Перенаправление делают для того, чтобы при обновлении страницы файл не загружался повторно. handle_uploaded_file — функция обработки файла, её нужно писать самому.
Пример копирования содержимого полученного файла в файл /srv/media/data.txt
def handle_uploaded_file(f): with open('/srv/media/data.txt', 'wb+') as dest: for chunk in f.chunks(): dest.write(chunk)
Нужно использовать chunks, так как копирование по частям меньше нагружает систему. Просто копирование из временной папки тоже не подходит, так как файл может быть загружен в память.
Путь, по которому будет сохраняться файл можно сформировать самому из MEDIA_ROOT и имени загруженного файла с помощью os.path.join
Обрабатывать файл можно по-разному. Можно прочитать его содержимое целиком при помощи метода read() или по частям с помощью метода chunks() и что-то с ним сделать. Но чаще всего файл просто сохраняют в какую-либо директорию, где он будет в дальнейшем хранится.
Также Django предоставляет удобный способ. Если файл также хранится в модели, то его можно сохранить в указанное место одним вызовом. Для этого в модели вы создаёте поле типа FileField с аргументом upload_to, содержащим путь, по которому будет размёщён файл. Если вы создавали форму на основе модели (то есть, с помощью ModelForm), то достаточно команды
form.save()
для сохранения файла в указанное место. Также вы сможете загружать файлы через админку.
Загрузка файлов в Django

Создание расширения для вкладок Chrome

Вот думаю как у всех кто держит много вкладок возник вопрос как это удобизировать, единственный путь который я пока что вижу это сделать вкладки вложенными, ну условно выглядит это так, есть вкладка которую называешь сам, зайдя в неё прям под этой строкой появляется вложенный набор вкладок, собственно вопрос есть ли такое (я не нашёл) и можно ли это сделать средствами Chrome , я расширений не писал, но js знаю , самое главное даёт ли Chrome такой доступ к своему интерфейсу через расширения или нет? На картинке пример как это могло бы выглядеть.


Ответ

Вопрос понял по скриншоту из комментариев:

Нативно Chrome Extensions API такой возможности не предоставляет.

Как передавать данные между методами в Qt?

Имеется вот такой код:
#include "dialog.h" #include "ui_dialog.h" #include #include
Dialog::Dialog(QWidget* parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); }
Dialog::~Dialog() { delete ui; }
void Dialog::doTask(int& number, QString& ip, int& pt) { QNetworkAccessManager manager; QNetworkReply* reply = qobject_cast(sender());
QNetworkRequest request(QUrl(ui->url->text())); reply = manager.get(request);
QEventLoop loop; connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec();
QString source; source.append(QString::fromLocal8Bit(reply->readAll()));
if (source.contains(ui->search->text(), Qt::CaseInsensitive)) { qDebug() << "Okay."; } else { qDebug() << ">>> BAD <<<"; }
qDebug() << "TaskID: " << number; qDebug() << "IP: " << ip; qDebug() << "Port: " << pt; qDebug() << "MS: " << ui->wait->value(); QThread::currentThread()->msleep(ui->wait->value()); qDebug() << "Processing " << " - "" of thread: " << QThread::currentThreadId(); qDebug() << "Stopped "; }
void Dialog::on_pushButton_clicked() { QVector vector; for (int i = 0; i < ui->spinBox->value(); i++) { vector.append(i); }
QProgressDialog pdialog("", "", 0, 100, this, Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint); pdialog.setLabelText("Processing.."); pdialog.setCancelButtonText("Stop");
QFutureWatcher watcher;
connect(&pdialog,SIGNAL(canceled()), &watcher,SLOT(cancel())); connect(&watcher, SIGNAL(finished()), &pdialog, SLOT(reset())); connect(&watcher,SIGNAL(progressRangeChanged(int,int)), &pdialog,SLOT(setRange(int,int))); connect(&watcher, SIGNAL(progressValueChanged(int)), &pdialog,SLOT(setValue(int)));
QThreadPool::globalInstance()->setMaxThreadCount(ui->spinBox_2->value());
QString ip; int pt; auto q_future = QtConcurrent::map(vector, [this, &ip, &pt](int& number) { ip = "127.0.0.1"; pt = 80; doTask(number, ip, pt); });
watcher.setFuture(q_future);
pdialog.exec(); watcher.waitForFinished();
if (watcher.isCanceled()) { qDebug() << "canceled!!!"; QMessageBox::critical(this, "Canceled", "You clicked cancel!"); } else { qDebug() << "finished!!!"; QMessageBox::information(this, "finished", "All done!"); } }
void Dialog::on_proxy_clicked() { auto proxy = QFileDialog::getOpenFileName(nullptr, QObject::tr("Add proxy"), QCoreApplication::applicationDirPath(), QObject::tr("Text file (*.txt)"));
if (true == proxy.isEmpty()) { QMessageBox::critical(nullptr, "Warning", "Empty path proxy list."); return; // передумали } QFile file(proxy);
QString n; if (file.open(QIODevice::ReadOnly)) n = QTextStream(&file).readAll();
QRegExp rx("[\:\;]"); QRegExp rx2("[
]");
QString str(n);
QList result; foreach(const QString &lst1, str.split(rx2, QString::SkipEmptyParts)) result << lst1.split(rx);
ui->cproxy->setNum(result.count()); }
но не совсем ясно как передать данные из result (on_proxy_clicked()) в метод on_pushButton_clicked для дальнейшей обработки (перебор ip и port (pt) )
Какое решение посоветуете в коде?
P.S. Просто прокси чекер.


Ответ

Как вариант, можно слот on_pushButton_clicked() дополнить аргументом, имеющим значение по умолчанию. Получится что-то вроде такого в объявлении:
void on_pushButton_clicked(const QList &result = QList());
... и
void Dialog::on_pushButton_clicked(const QList &result) {...}
... в реализации.
Таким образом, сохраняется возможность вызывать слот по кнопке, а также появляется средство передачи в него списка данных.

Не показывается реклама admob

Добрый день!
Пытаюсь добавить рекламу в свое приложение, все по инструкции https://developers.google.com/mobile-ads-sdk/docs/admob/android/quick-start
Сначала добавил строчку в build.gradle (module: app)
compile 'com.google.android.gms:play-services:7.0.0'
Изменил манифест

+

+

Добавил
ca-app-pub-3940256099942544/6300978111
Изменил .xml файл
xmlns:ads="http://schemas.android.com/apk/res-auto"
+

Добавил в код активити:
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView;
+
AdView mAdView = (AdView) findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest);
При рендеринге в android studio видно место под баннер, но при запуске приложения баннера нет
05-05 15:14:49.746 1386-1386/su.worldbest.bbdd W/GooglePlayServicesUtil﹕ Google Play services is missing. 05-05 15:14:49.770 1386-1386/su.worldbest.bbdd W/GooglePlayServicesUtil﹕ Google Play services is missing. 05-05 15:14:49.790 1386-1389/su.worldbest.bbdd D/dalvikvm﹕ GC_CONCURRENT freed 208K, 3% free 8742K/8976K, paused 4ms+2ms, total 14ms 05-05 15:14:49.802 1386-1386/su.worldbest.bbdd I/Ads﹕ CsiReporterFactory: CSI is not enabled. No CSI reporter created. 05-05 15:14:49.814 1386-1386/su.worldbest.bbdd I/Ads﹕ Starting ad request. 05-05 15:14:49.818 1386-1386/su.worldbest.bbdd I/Ads﹕ Use AdRequest.Builder.addTestDevice("D5C4A6CB58FB68100CD3CBDF39CB8F22") to get test ads on this device. 05-05 15:14:49.870 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DexOpt: --- BEGIN 'ads-1062427778.jar' (bootstrap=0) --- 05-05 15:14:49.894 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DexOpt: --- END 'ads-1062427778.jar' (success) --- 05-05 15:14:49.894 1386-1398/su.worldbest.bbdd D/dalvikvm﹕ DEX prep '/data/data/su.worldbest.bbdd/cache/ads-1062427778.jar': unzip in 0ms, rewrite 22ms 05-05 15:14:50.330 1386-1405/su.worldbest.bbdd I/Ads﹕ CsiReporterFactory: CSI is not enabled. No CSI reporter created.
Баннера не видно ни на эмуляторе, ни на реальном устройстве. Что делать?


Ответ

Первое время не мог понять почему не виден баннер, хотя делал все по инструкции!
Оказалось, что баннер часто не виден только потому, что, банально, не влазит (по размеру) в то пространство, которое Вы ему отвели. И, в основном, по ширине!
Нужно смотреть размеры и ограничения (особенно padding'и) всех охватывающих его LinearLayout'ов, GridLayout'ов, ScrollView и т.п. Т.е. просмотреть размеры (еще раз: особенно padding'и) всех родительских Layout'ов по всей иерархии общего макета страницы (*.xml)
К сожалению, никаких предупреждений (сообщений) на этот счет не делает Android Studio (3.0.1) до сих пор. А надо бы!!! Пора уже! )

Не пробрасываются порты извне через роутер к серверу. Почему они фильтруются?

Роутер (ASUS RT-N10PV2) выходит через белый ip от провайдера. Веб-интерфейс повесил на 8081 порт. В локальной сети есть linux сервер (через virtualbox+vagrant). 80 порт nginx, 8080 порт apache, 53 порт dns.
В настройках роутерах включил forwarding данных портов.
Но извне всё равно выдает что порт закрыт. а 8081 открыт. До этого веб-интерфейс роутера стоял на 80ом порте и этот порт был тоже открыт.
Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-05 02:46 Coordinated Universal Time Nmap scan report for 161.*.189.89.sta.211.ru (89.189.*.161) Host is up (0.11s latency). Not shown: 94 closed ports PORT STATE SERVICE 22/tcp filtered ssh 23/tcp open telnet 53/tcp filtered domain 80/tcp filtered http 8080/tcp filtered http-proxy 8081/tcp open blackice-icecap
Nmap done: 1 IP address (1 host up) scanned in 3.29 seconds
- вывод nmap.
Пробовал пробросить порт для основного ПК. Всё сработало. Порт открылся.
Фаерволл на серваке отключил. iptables пуст.
config.vm.network "public_network", ip: "192.168.1.11"
- vagrant конфиг подключения.
Т.е.
Adapter 1: nat (forwarding 22 port for ssh), Adapter 2: bridged
Скрины virtualbox:

Примерная схема сети: Провайдер порты не блочит.
Почему эти порты фильтруются?


Ответ

Смущает тот факт, что на карте сети у сервера всего 1 адрес - в то время как у сервера аж два адаптера.
Судя по всему, оба адаптера на сервере смотрят в одну и ту же сеть. При этом пакеты идущие через один маскарадятся - а через другой нет. В то же время, маршрут по умолчанию (если настраивать сервер без изысков) может быть лишь один. Если пакет попадет на сервер через один адаптер - а вернется через другой - то он вернется с неверным IP.
В итоге, из двух адаптеров полноценно может работать лишь один.
Изучайте маны по vagrant - текущая конфигурация ненормальная.

Где искать файл с текстом письма?

Здравствуйте. В окружении development установил config.action_mailer.delivery_method = :file - при отправке письма не отправлять его, а записывать в файл. Вопрос: где искать это файл? В какой файл будет записан текст письма?


Ответ

# output to tmp/mails directory config.action_mailer.delivery_method = :file # ... and to specify output location config.action_mailer.file_settings = { :location => Rails.root.join('tmp/mail') }

ASP.NET MVC method NotFound

Всем привет. есть следующий метод
[HttpPost] public ActionResult AttachFile(int operationId) { var _operation = _operationService.GetOperationById(operationId); foreach (string file in Request.Files) { var upload = Request.Files[file]; if (upload != null) { var attachedFile = new AttachedFile() { OriginalName = upload.FileName, NewName = upload.FileName, RootDirectory = _operation.GetDirectory(), Stream = upload.InputStream }; _fileWorking.SaveFile(attachedFile); } } return RedirectToAction("Index", new { operationId = operationId }); }
Данный метод используется в следующем представлении:
@model IEnumerable @{ ViewBag.Title = "Index"; if (Request.IsAjaxRequest()) { Layout = null; } }

@Ajax.ActionLink("Update", "Index", "Attachment", new { operationId = ViewBag.OperationId }, new AjaxOptions { UpdateTargetId = "tabAttachment" }, new { @id = "ActionLink", @role = "presentation", @style = "visibility:hidden;" })
@Html.Partial("_AttachmentFilesList", Model)
@Scripts.Render("~/bundles/attachment")
Код скрипта:
$(document).ready(function () { $('#submit').on("click", function (e) { e.preventDefault(); var files = document.getElementById('uploadFile').files; if (files.length > 0) { if (window.FormData !== undefined) { var data = new FormData(); for (var x = 0; x < files.length; x++) { data.append("file" + x, files[x]); }
$.ajax({ type: "POST", url: "/Attachment/AttachFile?operationId=" + $('#submit').attr('data-operationId'), contentType: false, processData: false, data: data, success: function () { $("#ActionLink").click(); }, error: function () { $("#ActionLink").click(); } }); } else { alert("Браузер не поддерживает загрузку файлов HTML5!"); } } }); });
При запуске приложения на локальной машине все работает.файлы сохраняются. После публикации приложения на сервер метод не срабатывает. Запустил отладку в браузере и вижу следующую ошибку:
"NetworkError: 404 Not Found - http://10.5.0.253/Attachment/AttachFile?operationId=154"
Не пойму, почему так?


Ответ

Нет, так, как вы предложили в комментарии, делать не нужно.
Проблема в виртуальном пути. Но просто захардкодить другой путь - неправильно! Ведь приложение может быть установлено по любому пути.
Для правильного получения виртуального пути к действию следует воспользоваться хелпером Url
url: "@Url.Action("AttachFile", "Attachment")?operationId=" + $('#submit').attr('data-operationId')
Способ выше подойдет, если ваш скрипт находится в .cshtml-файле. Но есть лучший способ, к тому же работающий всегда. Можно передать нужный путь через атрибут любого из элементов. В вашем случае красивее всего будет передать url там же, где сейчас передается operationId

url: this.dataset.url,

Как добавить что угодно на русском языке в Django

Есть класс в модели
class Author(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) email = models.EmailField(blank=True, verbose_name='e-mail') def __unicode__ (self): return u'%s %s' % (self.first_name, self.last_name)
Пытаюсь добавить пользователя на русском, выдает ошибку
OperationalError at /admin/books/author/add/ (1366, "Incorrect string value: '\\xD0\\x9A\\xD0\\xBB\\xD0\\xB8...' for column 'first_name' at row 1")
Подскажите как подправить


Ответ

Нужно создать БД с кодировкой utf-8. Как именно -- смотрите документацию по своей СУБД. Для PostgreSQL: createdb -E utf-8 Исходники тоже в юникоде держать + в начале файлов прописывать # encoding: utf-8

Как дожидаться await асинхронно для List, чьи задачи уже запушенны

Начал разбираться с async/await, понял принцип работы, но столкнулся со такой проблемой:
///

/// эмитирует файл для загрузки /// public class LoadingFile { public string FileName { get; set; } public int TimeLoad { get; set; }
public LoadingFile(string fileName, int timeLoad) { FileName = fileName; TimeLoad = timeLoad; } }
В классе ViewModel два списка: Список файлов которые нужно загрузить и список уже загруженных файлов.
#region Constructors
public MainWindowViewModel() { //файлы для загрузки. с разным временем скачивания LoadingFiles = new List { new LoadingFile("1", 2000), new LoadingFile("2", 200), new LoadingFile("3", 2000), new LoadingFile("4", 100), new LoadingFile("5", 50), new LoadingFile("6", 70), new LoadingFile("7", 1000), new LoadingFile("8", 2000)
};
//Загруженные файлы. LoadedFiles = new ObservableCollection(); } #endregion
Команда WPF которая запускает процесс скачки
/// /// команда WPF /// private Command _load; public Command Load { get { return _load ?? (_load= new Command(async () => { try { var tasks = LoadingFiles.Select(file => LoadFileAsync(file)).ToList(); //запустим все задачи асинхронно и сохраним их в списке задач
foreach (var task in tasks) //хоть задачи и выполняются асинхронно но результатов дожидаемся синхронно. { var result = await task; LoadedFiles.Add(result); }
MessageBox.Show("Загрузка завершена"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }));
} }
асинхронная задача по скачиванию.
private async Task LoadFileAsync(LoadingFile file) { var res = await Task.Factory.StartNew(() => { Thread.Sleep(file.TimeLoad); return file; }); return res; }
ИТОГО: хочу добиться параллельного скачивания, т.е. чтобы в список скаченных файлов попадали сначала файлы с малым временем скачивания а не по порядку 1,2,3,4... В моей реализации var result = await task; заставляет обязательно дождаться скачивания первого файла, хотя многие другие файлы с меньшем временем скачивания уже скачаны и помешаются в список мгновенно, после скачки первого. Но мне нужен правильный порядок: т.е. все таски параллельно дожидаются await и когда дождались помешают результат в список.


Ответ

Попробуйте такое:
В UI-коде:
async Task DownloadFileAndShow(LoadingFile f) { var res = await LoadFileAsync(file); LoadedFiles.Add(res); }
И запускайте все эти задачи:
var tasks = LoadingFiles.Select(file => DownloadFileAndShow(file)); await Task.WhenAll(tasks);
Ну или просто упакуйте всё в асинхронную лямбду:
await Task.WhenAll( LoadingFiles.Select( async file => LoadedFiles.Add(await LoadFileAsync(file))));

(это если я правильно понял: вам нужны результаты в порядке загрузки, правильно?)

WPF, Text Formatter API - Пример реализации абстрактного класса TextSource

Данный вопрос тесно связан с этим. Но ещё раз вкратце о реальной задаче: реализую текстовый редактор с поддержкой форматирования текста (выделение фрагмента текста, изменение гарнитуры его шрифта, размера и т.п.). Для решения сей задачи выбрал Text Formatter. Сейчас же меня интересует реализация текстового хранилища, для чего надо наследовать и реализовать абстрактный класс TextSource. Чтобы разобраться, как это сделать, хотелось бы увидеть какие-то примеры. Желательно, более сложные, нежели в официальном примере


Ответ

Ответ на вопрос получил на форуме MSDN - ссылка. Код примера привожу ниже:
class SampleTextSource : TextSource { string text = "Foo Bar
Next Line";
List spans = new List { new Span { Start = 0, Length = 3, Color = Brushes.Blue }, new Span { Start = 3, Length = 1, Color = Brushes.Black }, new Span { Start = 4, Length = 3, Color = Brushes.Red }, new Span { Start = 7, Length = 1, Color = Brushes.Black }, new Span { Start = 8, Length = 4, Color = Brushes.Green }, new Span { Start = 12, Length = 5, Color = Brushes.Black }, };
class Span { public int Start; public int Length; public Brush Color;
public bool Contains(int index) { return Start <= index && index < Start + Length; } }
public int Length { get { return text.Length; } }
public override TextRun GetTextRun(int textSourceCharacterIndex) { var span = spans.Find(s => s.Contains(textSourceCharacterIndex));
if (span == null) return new TextEndOfParagraph(1);
if (span.Length == 1 && text[span.Start] == '
') return new TextEndOfLine(1);
return new TextCharacters(text, span.Start, span.Length, new SampleTextRunProperties(span.Color)); }
public override TextSpan GetPrecedingText(int textSourceCharacterIndexLimit) { throw new NotImplementedException(); }
public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex) { throw new NotImplementedException(); } }
class SampleTextRunProperties : TextRunProperties { private readonly Brush foregroundBrush;
public SampleTextRunProperties(Brush foregroundBrush) { this.foregroundBrush = foregroundBrush; } ...реализация остальных необходимых свойств (можно взять из SDK-примера) }
class SampleTextParagraphProperties : TextParagraphProperties { ...реализация остальных необходимых свойств (можно взять из SDK-примера) }
class SampleTextElement : UIElement { protected override void OnRender(DrawingContext drawingContext) { TextFormatter text = TextFormatter.Create(); SampleTextSource source = new SampleTextSource(); SampleTextParagraphProperties paraProps = new SampleTextParagraphProperties(); int index = 0; double y = 0.0;
while (index < source.Length) { TextLine line = text.FormatLine(source, index, RenderSize.Width, paraProps, null); line.Draw(drawingContext, new Point(0.0, y), InvertAxes.None); index += line.Length; y += line.TextHeight; } } }
SDK-пример можно скачать здесь
Если необходимо, чтобы текст отображался с переносом (а это зачастую и требуется), то нужно, во-первых, в реализации TextParagraphProperties переопределить свойство TextWrapping, а во-вторых, в реализации метода TextRun GetTextRun(int textSourceCharacterIndex) в последнем выражении return использовать следующий фрагмент кода, вместо выше приведённого:
return new TextCharacters(text, textSourceCharacterIndex, span.Length - (textSourceCharacterIndex - span.Start), new SampleTextRunProperties(span.Color));
Это делается для поддержки возможности разбивать span на несколько строк.

Solr Search like default search

Поставил search_api и search_api_solr плагины,настроил Solr, но вот как поставить теперь его как дефолтный, в Configuration -> Search settings не появляется возможность выбрать его, подскажите что не так? Сам поиск работает, создал вьюшку все индексирует.


Ответ

search_api - самостоятельная поисковая система.
Выключите search, создайте блок во вьюшке с exposed фильтром поискового запроса и используйте его.

Разрезать видео с помощью opencv c++

С помощью videocapture из видеоролика длиной N минут делать много удалений длиной несколько секунд. Знаю есть вариант, через VideoWriter просто переписывать видео. Но зачем он тогда нужен, когда через вызов cmd можно использовать ffmpeg?
Ищу нормальный способ из in.mp4 вырезать секундные куски и получить out.mp4 без ffmpeg. И еще вопрос, везде при разрезке in.mp4 потом надо склеивать все куски. Избежать такого возможно?


Ответ

Нарезать видеофайл на отдельные отрезки OpenCV позволяет, но по большому счёту это неподходящий для данной задачи инструмент. Всё равно, что саблей косить траву. Вроде и замах красивый, а некое неудоумение не отпускает.
В OpenCV класс VideoWriter является обёрткой над FFmpeg и предоставляет лишь базовый функционал по сохранению видеокадров в файл. Создан он лишь для удобства разработки приложений, не претендующих на гибкую настройку параметров видеоформатов и кодеков, которые неизбежно приходится учитывать непосредственно при работе с C API FFmpeg.
Чтобы не заниматься "склеиванием" кусков, нужно, используя тот же C API FFmpeg, читать видеокадры из исходного файла и записывать желаемые в отдельный файл. Очень вероятно, что для этой операции и промежуточные декодирование с кодированием не потребуются. Читаем из входного потока AVPacket и без перекодирования записываем в выходной поток.

Debian 8. Удаление графического интерфейса

"По наследству" досталась виртуальная машина с установленным на ней Debian 8. И все бы хорошо, только вот не нужен мне графический интерфейс. С linux дела мало имел. Подскажите пожалуйста каким образом можно его удалить или отключить?


Ответ

удаление начать можно с деинсталляции пакета xserver-xorg-core
$ sudo aptitude -y remove xserver-xorg-core
а вот для отключения необходимо знать, кто запускает xserver. скорее всего, это делает desktop manager. эту функцию может выполнять много пакетов. найти тот, что установлен в системе можно, например, такой командой:
$ aptitude search '~i~Px-display-manager'
пример вывода:
i xdm - X display manager
вот его и надо отключить, чтоб не запускался при старте системы:
$ sudo update-rc.d xdm disable

Как передать переменную id='имя(переменная цифра)' в js #имя(переменная цифра) код

Есть код javascript

и php
echo "

закрыть
Пример модального окна c id ".$row['id']."
"; echo "";
В php формируется id='applicationModal1', id='applicationModal2' и таких блоков много.
Как обозначить в коде javascript переменную цифру?
Код из браузера. Все блоки идентичны только меняется конечная цифра в id
закрыть
Пример модального окна c id 8


Ответ

Привязывать одно и тоже событие к пачке разных элементов по ID - не лучшее решение. Если у вас несколько элементов должны вести себя одинаково - у них должен быть одинаковый класс (например, modal-trigger). Проставьте его всем элементам. Потом проставьте им разный data-аттрибут с индексом модального окна (например, data-modal-number). И навесьте на всех их один обработчик:
$(function(){ $(".modal-trigger").click(function(){ // this в этом обработчике - это элемент, на который кликнули var modalNumber = $(this).data("modal-number"); alert(modalNumber); $("#applicationModal" + modalNumber).arcticmodal(); }); }); show modal 1 show modal 2
По хорошему и поиск applicationModalX по id стоит убрать, но это уже на ваше усмотрение.

Выбор элементов с проверкой их родителей

Нужно выбрать те span на странице, которые не являются потомками заголовков (h1 - h6). Есть много селекторов для потомков, но вот селектора, который бы проверял принадлежность родителю, я, увы, не нашел.
Пример:
one

HEY

two

HEY2

three
Нужно выбрать span'ы за исключением тех, что в h2 и h3


Ответ

Выбираем все на странице. Для каждого пробегаемся по всем его родителям вплоть до document (можно было и только до ). Проверяем имя тега каждого родителя. Если оно входит в - , то отбрасываем этот Все оставшиеся считаются результатом.
document.addEventListener('DOMContentLoaded', onDomReady); function onDomReady() { var allSpans = document.getElementsByTagName('span'); var resultSpans = []; var regExp = /^H\d$/i; for (var i = 0; i < allSpans.length; i++) { var parent = allSpans[i].parentNode; while (parent != document) { if (regExp.test(parent.tagName)) { break; } parent = parent.parentNode; } if (parent == document) { resultSpans.push(allSpans[i]); } } for (var i = 0; i < resultSpans.length; i++) { resultSpans[i].style.color = 'red'; } }; not in hX

simple

not in hX, but in div
deep

То же самое с jQuery (если кому-то понадобится):
$(document).ready(function() { var headers = []; for (var i = 0; i <= 9; i++) { headers.push('h' + i); } var headersSelector = headers.join(','); var $resultSpans = $('span').filter(function() { return $(this).parents(headersSelector).length == 0; }); $resultSpans.css('color', 'red'); }); not in hX

simple

not in hX
deep

Работа с изображениями в D

У меня есть двумерный массив булевых значений (bool[][]), и мне нужно записать этот массив в BMP. То есть, к примеру, есть такая матрица:
[0 0 0 0 1] [0 0 1 1 1] [0 0 0 0 1] [0 0 0 0 1] [0 0 0 0 1]
и мне нужно каким-то образом получить из нее .bmp файл с изображением цифры "1". То бишь, true — черный пиксель, false — белый. Как можно это сделать в D?


Ответ

Для записи BMP можете воспользоваться, например, библиотекой arsd, из которой потребуется модули bmp и color
import arsd.bmp, arsd.color;
void main() { ubyte[][] image = [ [ 0, 0, 0, 0, 0, 0, 0, 1], [ 0, 0, 0, 0, 0, 0, 1, 1], [ 0, 0, 0, 0, 0, 1, 1, 1], [ 0, 0, 0, 0, 1, 1, 1, 1], [ 0, 0, 0, 1, 1, 1, 1, 1], [ 0, 0, 1, 1, 1, 1, 1, 1], [ 0, 1, 1, 1, 1, 1, 1, 1], [ 1, 1, 1, 1, 1, 1, 1, 1], [ 0, 1, 0, 1, 0, 1, 0, 1], ];
auto col = [Color.black, Color.green];
auto w = image[0][].length; auto h = image[].length;
ubyte[] data;
for (int j=0; j auto img = new TrueColorImage(w, h, data); writeBmp(img, "result.bmp"); }

Падение приложения при возврате после перехода по внешней ссылке

Разрабатываю приложение для Windows Phone системы, на странице имеется кнопка типа HyperlinkButton , при ее нажатии приложение переходит на определенный Url запуская стандартный браузер, после этого приложение закрывается, и нельзя вернуться в него нажав кнопку Back.
Так же, при совершении данной операции через проект запущенный в VS 12 кнопка Back возвращает в приложение. Но если сделать те же действия в приложении запущенном не через VS(через это приложение задеплоиное на телефоне) то оно закрывается.
В чем может быть причина? В каком направлении копать?
Провел эксперимент с состояниями(suspending /resuming), только на этой станице где переход по Url осуществляется происходит такое, на других все работает нормально. При переходе в suspending все хорошо, как только делаю resuming - валится ошибка такая.
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in WinRT information: GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate. A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in mscorlib.ni.dll A first chance exception of type 'Name.Common.SuspensionManagerException' occurred in mscorlib.ni.dll


Ответ

В общем то немного покопав информации в интернетах нарыл такую вещь, что при переходе из одной страницы на другую( посредством Frame.Navigate) необходимо передавать в качестве параметра простейшие данные(строки, числа), большие объекты программа при сворачивании в стек не записывает, оттого и валится такая ошибка.

Как получить параметры из URL?

При авторизации через API ВКонтакте происходит переадресация на URL вида:
http://localhost:58821/Auth#access_token=123456712345123451234512345&expires_in=0&user_id=1234567
Обращение к Request.Url.AbsolutePath, Request.Url.AbsoluteUri или Request.RawUrl даёт только ссылку на хост. Как я могу получить параметры из данного URL? Upd.: Вероятно проблема в том что адрес и get параметры разделяются символом '#', а не '?', поэтому параметры получить не получается. Можно ли как-то получить всю строку?


Ответ

Вы ошиблись при выборе типа авторизации - вам необходимо использовать авторизацию предназначенную не для мобильных приложений(клиентскую), а для сайтов(серверную).
При этом, необходимо что бы ваш веб-сервер был доступен извне - если не по домену, то хотя бы по какому-то публичному ip. С localhost серверную авторизацию использовать не получится.
Если бы это у вас был клиентский код, то можно было бы добавить себе в проект сборку System.Web и использовать код вроде такого:
var uri = new Uri("http://localhost:58821/Auth#access_token=123&expires_in=0&user_id=456"); var fragment = uri.Fragment.TrimStart('#'); // access_token=123&expires_in=0&user_id=456 var access_token = HttpUtility.ParseQueryString(fragment).Get("access_token"); // 123
Однако у вас сайт на ASP.NET, и фрагмент(часть Uri начинающаяся с '#') из серверного кода вы не получите никак - клиентом он не передаётся.
В вашем случае использовать авторизацию для мобильных устройств нельзя. Точнее конечно можно выпрашивать у пользователя их настоящие логин/пароль, передавать их вместо пользователя, авторизовывать своё приложение, да сохранять токен - но это плохо попахивает, и обязательно вызовет недоверие у пользователей.

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

Имеется изображение какой-либо музыкальной композиции. Требуется произвести распознавание знаков, однако мешают нотные линии. Поиск контуров посредством findContours() выделяет всё подряд так, что в итоге нотные знаки никак не разделяются. Как преодолеть?


Ответ

Можно использовать морфологические операции. У нотных линий имеется одно существенное отличие, которое позволяет отделить их от любых других объектов, - это их ширина. Она фактически приближается к ширине самого изображения. Этим и нужно воспользоваться.
Но сначала необходимо произвести бинаризацию изображения:
// Загружаем изображение. cv::Mat src_mat = cv::imread("allegretto.png", cv::IMREAD_GRAYSCALE); if(src_mat.empty()) return;
// Собственно бинаризация. cv::Mat bin_mat; cv::threshold(src_mat, bin_mat, 0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
Флаг THRESH_BINARY_INV используется, чтобы поменять цвета переднего плана и фона. Знаки станут белыми, а фон - чёрным. Флаг THRESH_OTSU удобен тем, что автоматически подбирает порог для бинаризации. Получится вот такое изображение:

Теперь можно перейти к морфологии. Создаём матрицу структурного элемента с тем расчётом, чтобы по горизонтали оно сравнялось с половиной ширины исходного изображения. Применяем эрозию и дилатацию:
cv::Mat hrz_krn_mat = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(bin_mat.cols/2,1));
cv::Mat hrz_mph_mat; cv::morphologyEx(bin_mat, hrz_mph_mat, cv::MORPH_ERODE, hrz_krn_mat); cv::morphologyEx(hrz_mph_mat, hrz_mph_mat, cv::MORPH_DILATE, hrz_krn_mat);
В принципе две последние строки можно заменить на использование флага MORPH_OPEN (операция открытия), которая выполнит тоже самое: вызовет сначала эрозию, а затем дилатацию:
cv::Mat hrz_mph_mat; cv::morphologyEx(bin_mat, hrz_mph_mat, cv::MORPH_OPEN, hrz_krn_mat);
В результате получится:

Фактически, получена маска нотных линий. Однако просто так нельзя её вычесть из исходного бинаризованного изображения. Если это осуществить, то поскольку каждая из линий лежит на множестве нотных знаков, последние отчасти потеряют свои пиксели и результат окажется далёким от желаемого.
Необходимо получить маску нотных знаков таким образом, чтобы ликвидировать всякое присутствие нотоносца:
cv::Mat vrt_krn_mat = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(1,3));
cv::Mat vrt_mph_mat; cv::morphologyEx(bin_mat, vrt_mph_mat, cv::MORPH_OPEN, vrt_krn_mat);
Как хорошо заметно на следующем изображении, маска нотных знаков не содержит больших горизонтальных линий, но в то же время часть важных деталей исходного изображения также было потеряно:

Но теперь стало возможно создать маску нотных линий с разрезами в местах присутствия нотных знаков:
cv::Mat sbt_mat; cv::subtract(hrz_mph_mat, vrt_mph_mat, sbt_mat);

Остаётся лишь изъять маску нотных линий из исходного бинаризованного изображения:
cv::Mat dst_mat = cv::Mat::zeros(bin_mat.size(), CV_8U); bin_mat.copyTo(dst_mat, ~sbt_mat);
Теперь изображение можно пустить на вход findContours() с тем, чтобы получить контуры каждого из нотных знаков в отдельности.

Принцип организации маршрутов (роутов) в ASP MVC 4

Всем привет, есть такой вот роут
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("", new Route("{action}/{controller}", new MvcRouteHandler())); routes.MapRoute( name: "", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index" } ); }
в первом добавлении идет {action}/{controller}, а во втором наоборот {controller}/{action} вопрос в том, что при отправке запроса такого типа http://localhost:3373/home/index?Name=Vasya&Message=Gleb выдается ошибка, так как почему-то приложение использует роут №1, добавление во второй роутер слова Default дела не меняет, зато если удалить первый роут, тогда все работает отлично. Почему так и по по какому принципу он решает какой роут будет дефолтным если не указываются имена роутов ?


Ответ

Маршруты обрабатываются строго в порядке их добавления. Как только будет найден подходящий маршрут, он используется и дальнейший поиск подходящего маршрута не выполняется.
Адрес http://localhost:3373/home/index содержит две секции, поэтому подходит под первый шаблон.
Вы пишете:
добавление во второй роутер слова Default дела не меняет
Вы видимо вот об этой строчке:
defaults: new { controller = "Home", action = "Index" }
Здесь слово defaults не означает что этот маршрут надо использовать как дефолтный, оно указывает какие значения подставить в переменные в шаблоне маршрута, если они вдруг пусты. То есть если вы используете только второй маршрут, то адрес
/ будет интерпретироваться как /Home/Index /Home тоже будет интерпретироваться как /Home/Index
То есть, если в маршруте нет какой-то секции, будет использовано указанное вами дефолтное значение для этой секции.
В вашем случае адрес home/index подходит уже под первый ваш маршрут, поэтому до анализа второго маршрута дело даже не доходит.

Как разместить элементы TableLayout равномерно на весь экран?

Использую этот код, и получается такая картинка:

private void GrdidGenerate() { for (int i = 0; i < LevelGrid[pos]; i++) { TableRow tableRow = new TableRow(this); tableRow.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT)); for (int j = 0; j < LevelGrid[pos]; j++) { ImageView imageView = new ImageView(this); TableRow.LayoutParams params = new TableRow.LayoutParams(100 / LevelGrid[pos], 100 / LevelGrid[pos], 1); params.setMargins(5, 5, 5, 5); imageView.setLayoutParams(params); imageView.setImageResource(R.drawable.abc_btn_radio_material); imageView.setBackgroundColor(Color.rgb(r, g, b)); imageView.setAdjustViewBounds(true); tableRow.addView(imageView, j); } grid.addView(tableRow, i); } }
Как сделать так, чтобы колонки растягивались на всю длину и не вылезали за поля?


Ответ

Решил проблему, так:
TableRow.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT, 1);

C++ Api FindFirstChangeNotification код ошибки 2: Не удается найти указанный файл

Код функции main.
LPCWSTR path = (LPCWSTR)"F:\\Test\\"; HANDLE hDir; hDir = FindFirstChangeNotification((LPCWSTR)"F:\\Test\\", FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); if (hDir == INVALID_HANDLE_VALUE) { //std::cout << "Handle: 0x" << hDir << " " << path; ErrorExit(TEXT("Operation")); }
ErrorExit(TEXT("Operation")) - обработчик функции GetLastError(), которая выдает ошибку с кодом 2. Хэндл при выводе равен 0xffffffff
Во всех примерах первый параметр функции FindFirstChangeNotification указан без приведения к LPCWSTR
Но у меня в VS2015 без приведения ругается именно на это место, говоря о том, что необходим лонг поинтер, который я собственно и ставлю.
Не понимаю, в чем проблема. Помогите разобраться.


Ответ

Правильно будет написать
LPCWSTR path = TEXT( "F:\\Test\\" );
тем более, что вы уже используете этот макрос в тексте программы.

Добавление элементов в начало списка

Есть 2 списка
in1 = [23,55,0] in2 = [100]
Нужно во второй список добавить в начало списка столько нулей, чтобы количество элементов в обоих списках стало одинаковым. К сожалению, стандартная библиотека дает возможность добавлять элементы только в конец.


Ответ

"стандартная библиотека дает возможность добавлять элементы только в конец" - это не так. list.insert() позволяет добавлять элементы в произвольные позиции.

Rest-сервис. Проблема получения данных в веб-запросе

Поставлена задача, с веб-сервиса вытащить JSON-массив, а затем его обработать. По идее, технология Rest, должна выводить в браузере String, но этого не происходит.
Вопросы:
Неправильная конфигурация в RequestMapping или в теле метода нужно еще что-то прописать?
В чем моя недоработка?
Вот вариант кода:
import com.squareup.okhttp.OkHttpClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;
@RestController
public class Places { /*OkHttpClient client = new OkHttpClient(); String a;*/
@RequestMapping(value = "https://api.parse.com/1/classes/Place", method = RequestMethod.GET, headers = {"Content-Type = application/json", "X-Parse-Application-Id = /*my app-id*/", "X-Parse-REST-API-Key = /*my app-secret*/"}) public String getting(){ /*Request request = new Request.Builder() .url("https://api.parse.com/1/classes/Place") .addHeader("Content-Type", "application/json") .addHeader("X-Parse-Application-Id", "app-id") .addHeader("X-Parse-REST-API-Key", "app-secret") .build();
Response response = client.newCall(request).execute(); a = response.body().string();
return a;*/ return "getting"; }
}


Ответ

Аннотация @RequestMapping говорит Spring-у, что отмеченный ей метод будет обрабатывать HTTP запрос от внешнего клиента. У вас же в этой аннотации указаны параметры чужого сервера и заголовки, как будто вы подразумевали подключение вашего сервера к другому серверу по HTTP.
Поле value должно указывать относительный путь на вашем сервере, который будет обрабатываться этим методом.
В поле headers указываются названия заголовков (без значений), которые должны присутствовать, чтобы запрос был обработан. Сами значения можно передать в метод параметром с аннотацией @RequestHeader
Для примера посмотрим на фрагмент кода:
@RestController public class Places {
@RequestMapping(value = "/classes/Place", method = RequestMethod.GET, headers = {"X-Parse-Application-Id", "X-Parse-REST-API-Key"}) public String getting(@RequestHeader("id") String id, @RequestHeader("key") String key){
return "getting"; } }
Объявлен контроллер Places c одним методом getting(). Этот метод будет вызван, если пользователь обратится HTTP-методом GET по URL вида http://ваш_сервер/ваш_путь_развертывания/classes/Place и при этом передаст HTTP заголовки X-Parse-Application-Id и X-Parse-REST-API-Key.

Если вы хотите из Spring MVC приложения подключиться к другому REST-сервису посмотрите на RestTemplate. Для вашего случая это будет выглядеть как-то так:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders(); headers.set("X-Parse-Application-Id", myAppId); headers.set("X-Parse-REST-API-Key", myAppSecret); HttpEntity entity = new HttpEntity("", headers);
ResponseEntity result = restTemplate.exchange("https://api.parse.com/1/classes/Place", HttpMethod.GET, entity, String.class);

is not identical to 'int'

Добрый день! Разбираюсь в Swift, по официальной книге Apple. В главе про функции наткнулся на пример, который не работает:
func alignRight(var string: String, count: Int, pad: Character) -> String { let amountToPad = count - count(string) if amountToPad < 1 { return string } let padString = String(pad) for _ in 1...amountToPad { string = padString + string } return string } let originalString = "hello" let paddedString = alignRight(originalString, 10, "-")
Если вставить этот код в playground выдает ошибку:
Что делать?


Ответ

Ошибка исчезает при такой записи:
let amountToPad = count - Swift.count(string)
(из комментария pavelip) Так же помогает переименовать переменную count во что-то другое, например, _count:
func alignRight(var string: String, _сount: Int, pad: Character) -> String { let amountToPad = _сount - count(string)
Очевидно, это происходило из-за конфликта названия переменной с названием функции.

Не корректная отдача статического файла после изменения

Использую vagrant. Ност: MacOS, гость: debian. На виртуальной машине установлен nginx 1.8.
После изменения статического файла (css или js) nginx отдает старый файл с добавленными какими-то символами.
Выглядит в браузере как-то так:

Пробовал изменять настройки nginx. sendfile, expires. Ничего не помогло. Выводил с помощью cat файл, выглядить вроде как нужно.
Что бы хоть как то работать, удаляю файл. Запрашиваю его снова, возвращается 404-я. Добавляю файл обратно. Запрашиваю - файл возвращается корректным.
Подскажите куда копать или как победить это.


Ответ

Решение нашел вот здесь
## Redirect everything that isn't a real file to index.php location / { try_files $uri $uri/ /index.php?$args; sendfile off; }

Копировать в буфер с формы

Есть форма
echo "";
Мне нужно сделать такую кнопку, чтобы, при нажатии на нее, текст, который в форме, копировался в буфер обмена.


Ответ

Попробуйте так
var button = document.querySelector('.copy'); button.addEventListener('click', function(event) { var text = document.querySelector('.text'); text.select(); document.execCommand('copy'); });

Как вывести элементы двух моделей в одном списке? RAILS

Имеем две модели Video и Picture. Как вывести на странице видео и картинки вперемешку, в одном списке, отсортировав их по дате?


Ответ

Если хотите хорошо и рельсово – готовьтесь к крупным изменениям.
Я полагаю, что вы хотите достать их отсортированными средствами БД: так вы получаете целый ряд очень вкусных возможностей. Пытаться пользоваться для этого двумя разными таблицами – смертоубийство, ActiveRecord будет всеми силами противиться.
Здесь я покажу два трюка: STI и render "неоднородной" коллекции.
Из вышенаписанного напрашивается вывод: делать нужно одной таблицей. Это, впрочем, не означает, что модель должна быть одна. Добавив поле type (типа string) к своей таблице, вы получите очень занятное поведение – ActiveRecord будет в этом поле сохранять название класса модели, и при запросах будет его соблюдать. То есть, если у вас есть такие классы:
class Media < ActiveRecord::Base class Video < Media class Photo < Media
Первый класс создаётся, как обычно – не забудьте только дать ему все поля, что есть и у Video, и у Photo. А класс Video можно сделать хоть руками – ему не нужна миграция. Но если пользоваться генератором, то так:
rails g model Video --no-migration --parent Media
...то запрос на Media.all вовсе необязательно вернёт именно коллекцию объектов Media. Причём система будет следить, чтобы в поле type были только названия базового класса (который, собственно, владеет таблицей) и его наследников (непосредственных и не очень). Если туда вписать что-то неправильное, будет ошибка при попытке инстанцировать объект.
А теперь самое вкусное. Сделав вышеобозначенные классы и убедившись, что они хранятся в одной и той же таблице (по генерируемым запросам), сделайте в контроллере это:
@medias = Media.all # Потом вы это захотите разбить на страницы. # Это можно. Потом.
Где-нибудь в виде выведите эту коллекцию следующим образом:
render @medias # Ну, а как ещё...
...добавьте partial'ы, которые он будет просить в сообщениях об ошибках и возрадуйтесь

Можно ли пометить отдельные секции исполняемого образа как незагружаемые в ОЗУ

Например в случае большого SFX-архива, до нескольких гигабайт, логично загрузить только исполняемый код распаковщика, а сам архив оставить на диске. И потом спокойно его распаковывать.
Если да, то как это сделать средствами Visual Studio? Как это вообще делается в случае SFX?


Ответ

Часто делают так. Создается EXE без дополнительных данных, а потом к нему дописывается "архив", при этом параметры секций не меняются. Загрузчик в память загрузит только сам EXE, оверлей не будет загружен, поскольку он не в секции. Запущенный EXE делает, к примеру, GetModuleHandle(NULL), получает адрес своего заголовка в памяти, парсит таблицу секций и узнает файловое смещение конца последней секции. Ровно за ним - оверлей с "архивом", который он может читать как ему угодно. Вариант номер два: после сборки в неиспользуемые поля заголовка вносится размер EXE, и запущеный процесс читает оттуда смещение до оверлея.

Как сделать таблицу с фиксированной шириной колонок и горизонтальным скроллом?

Здравствуйте!
Есть элемент table, в строчках которого может быть некоторое число ячеек. Может быть 3 ячейки, может быть 5 или 10, но в разных строчках обязательно одинаковое количество. Ну то есть представляем нормальную, человеческую таблицу, как в экселе.
Как мне сделать через css так, чтобы:
У таблички была некоторая фиксированная ширина, скажем 700px; У каждой колонки была некоторая фиксированная ширина, скажем 300px; Если суммарная ширина ячеек больше чем ширина таблицы, то должен появляться горизонтальный скролл. Собственно это у меня никак не получается: пока ширина колонок равномерно сокращается если превышает ширину таблицы, выставление свойства overflow не помогает
Иллюстрация к тому, что я хочу: http://jsfiddle.net/yt6169s1/

1 2 3 4 5 6 7
1 2 3 4 5 6 7

.table-wrapper { width: 700px; }
.mytable { border-collapse: collapse; overflow: auto; }
.mytd { width: 300px; border: 1px solid black; }
Соответственно я хочу чтобы на примере по ссылке было видно только 1ю, 2ю колонки шириной 300px и часть 3й шириной 100px, а остальные прокручивались.
Я могу сделать это только через css, не применяя javascript и не меняя таблицу на структуру из дивов? Совместимость со всяким старьем необязательна.
Попробую переформулировать еще получше: Мне нужна некоторая область ограниченной ширины (скажем 700 px) в которую будет влезать несколько колонок фиксированной ширины (т.е. ширина колонок точно такая какую я указал, сказал 200px у каждой колонки - и будет честных 200px у каждой колонки). И если колонок больше чем надо (скажем 5), то чтобы появлялся горизонтальный скролл.
Другими словами мне надо примерно как здесь: http://jsfiddle.net/qr6e61bw/ только с таблицей а не с дивами


Ответ

В таблице пишешь table-layout: fixed. В этом режиме ширина таблицы не пересчитывается при изменении или вписывании в родительский регион, а имеющийся overflow: auto даст скроллбар снизу. Детали тут
.mytable { border-collapse: collapse; overflow: auto; table-layout: fixed; }
Адпейт: Причина оказалась в другом - атрибут width в колонке устанавливает максимальную ширину колонки, причем минимальная ширина ограничена элементами внутри колонки. В данном случае в колонках по одному символу, и минимальная ширина оказывается недостаточной для появления скролла. Лечится прописыванием min-width в стиль mytd
.mytd { min-width: 300px; border: 1px solid black; }
Для задания точной ширины колонки желательно использовать max-width или width вместе с min-width.

Как выполнить shell-скрипт как git-alias, но не добавляя сам alias?

Например, есть такой git-alias.
[alias] root = "!pwd"
Его можно использовать в shell-скрипте:
echo `git root`
Я бы хотел выполнять его "от имени Git", но не регистрируя alias. Как-то так:
echo `git run "pwd"`
Возможно ли это?


Ответ

Это возможно с использованием параметра git -c. Перевод из man git
-c <имя>=<значение> Передает команде параметр конфигурации. Предоставленное значение будет использовано вместо значения, имеющегося в файлах конфигурации (но никаких постоянных изменений конфигурации не произойдет). Требуется, чтобы <имя> было указано в том же формате, как и в конфигурационных файлах (вложенные ключи разделяются точками: foo.bar) Обратите внимание, что знак = можно не использовать (git -c foo.bar ...). В таком случае значение переменной будет установлено в логическое true. Если указать = без значения (git -c foo.bar= ...), то переменной будет присвоено значение пустой строки.
Решение:
echo `git root`
например, так:
$ cd /tmp; $ echo $(git -c alias.root='!pwd' root) /tmp
обновление
echo `git run "pwd"`
можно, например, так:
echo $(git -c alias.run='!$1' run "pwd")

к слову
конструкция
$(команда)
как замена
`команда`
прописана в posix и потому является полностью переносимой, а ввиду её очевидного удобства (при вложенном использовании), имеет смысл именно ею и пользоваться.

Подсчёт времени выполнения методов

Нужно померить время выполнения методов. написать так:
Stopwatch.Start(); Method(); Stopwatch.Stop();
не проблема.
Но возникает вопрос: можно сделать разумное логирование например так:
using(MyCustomProfiler p = new MyCustomProfiler()) {
Method(); Method2(); //////// MethodN(); }
И что бы логировался каждый метод внутри using
Может кто то знает элегантные решения, вместо использования ContextBoundObject, IContextProperty, IContributeServerContextSink, IMessageSink
Если вдруг есть еще способ логировать вызовы внутренних вызовов методов, то это будет шикарно.
Нужно написать решение (код), а не использовать профайлер.
StackTrace и StackFrame тоже не очень подходят.


Ответ

В .NET можно использовать Profiling API. И, возможно, что CLR выводит информацию о вызовах в ETW (Event Tracing for Windows). В nuget-пакете Microsoft.Diagnostics.Tracing.TraceEvent есть классы для работы с ETW.