Страницы

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

понедельник, 27 мая 2019 г.

Java. TDD. Как проверить в assertThat() что объект имеет определенный тип (как instanceof)

Надо в тесте проверить что определенный объект имеет определенный тип.
boolean res = (desc[2][7] instanceof Place); assertThat(res,is(true));
Что-бы вот так не писать... Есть ли какой-то метод в util?


Ответ

Нужно использовать org.hamcrest.CoreMatchers.instanceOf
Ответ: https://stackoverflow.com/a/12404813/4828657

Компилятор для С поддерживающий стандарт С11 для Windows 7

Какой компилятор языка С поддерживает стандарт С11 и может быть установлен в операционной системе Microsoft Windows Домашняя расширенная SP1 ?


Ответ

Компилятор gcc, который портирован под Windows в проекте MinGW-w64.
При компиляции нужно указывать флаг, какой конкретно использовать стандарт:
gcc -std=c11
Подробнее, про поддерживаемые стандарты gcc можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Standards.html

C# и обобщенная (generic) лямбда

Есть ли в c# возможность создать обобщенную лямбду, например
static void Main() { Console.WriteLine(Fun(x => x * x, x => x + x, 3));
Func, Func, int, int> fun = (a, b, x) => a(b(x));
Console.WriteLine(fun(x => x * x, x => x + x, 3)); } static T Fun(Func a, Func b,T x) { return a(b(x)); }
Вот есть функция Fun, и она обобщенная, но есть ли возможность то же провернуть с лямбдой, например один раз я хочу вызвать лямбду fun с типом int, а другой раз с типом double
Заранее спасибо


Ответ

Нет, определять собственные обобщенные параметры лямбды не могут.

Как получить больше 1000 людей, лайкнувших пост, через VK API?

Пытаюсь получить всех пользователей, кто поставил лайк под записью, через likes.getList. Но есть ограничение: получить разом можно только 1000 человек. А как получить всех пользователей, если таковых является, например, 3500?
Вот так я получаю список первой 1000 лайкнувших:
$res = file_get_contents('https://api.vk.com/method/likes.getList?t‌​ype=post&owner_id=-1‌​111&item_id=111&exte‌​nded=1&count=1000&of‌​fset=0'); $resp = json_decode($res, true); foreach($resp['response']['items'] as $val) { echo $val['first_name'] . "

"; }


Ответ

Небольшая функция, которая работает рекурсивно, каждый раз смещая параметр offset на нужную величину (на offset в запросе + количество уже выбранных юзеров count) пока не придет пустой ответ. Это значит, что пора обрывать рекурсию.
Однако может еще прийти ответ error вместо response. Но эта обработка на вашей совести))
Еще также указывайте версию API, а то может вернуть не те данные, которые ожидаете или вообще ошибку вернуть.
$count = 1000; $offset = 0; $apiVersion = 5.60; $result = [];
getLikesData($result, $count, $offset, $apiVersion);
function getLikesData(&$output, $count, $offset, $apiVersion) { $query = 'https://api.vk.com/method/likes.getList?type=post&owner_id=-1‌​111&item_id=111&extended=1&friends_only=0&v='.$apiVersion.'&count='.$count.'&offset='.$offset; $resp = json_decode(file_get_contents($query), true);
if (!$resp['response']) return;
$items = $resp['response']['items'];
if (empty($items)) return;
foreach ($items as $item) { $output[] = $item; }
getLikesData($output, $count, $offset + $count, $apiVersion); }
echo '

';
print_r($result);
echo '
';

В функции находится цикл для заполнения результирующего массива по порядку. Если вместо этого воспользоваться array_push, то будет отрабатывать быстрее. Однако в результирующем наборе будет массив массивов.
Это я к чему... Выбирайте что нужно: меньшая скорость, но по порядку или большая скорость, но потом при выводе придется организовывать двойной цикл.

Не отображается floating action button на реальном устройстве , в режиме preview отображается

Ребилд делал,кэш чистил,ошибок в редакторе нет. использую navigationview.
Код activity_main
android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start">



Код app_bar_main

app:bb_inActiveTabAlpha="0.8" app:bb_inActiveTabColor="@color/colorBacgroundContent" app:bb_showShadow="true" app:bb_tabXmlResource="@xml/bottombar_tabs"/>
android:layout_height="wrap_content" android:animateLayoutChanges="true" android:theme="@style/AppTheme.AppBarOverlay">
android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay"/>

app:srcCompat="@android:drawable/ic_dialog_email"/>


Ответ

Нужно поменять местами контент и кнопку, т.к. контент перекрывает эту самую кнопку:

C# MVVM (WPF). как использовать Model?

Здравствуйте, попрошу помочь с пониманием использования MVVM патерна. Как представляю я его для себя:
Существует отдельный самодостаточный проект (или библиотека) в котором написан какой - то готовый функционал. Пользователю проекта предоставляется интерфейс в котором открыты свойства который определяют состояние сервиса и открыты события для оповещения сервисом (push/pull notification). Например для нотификации использовать ReactiveExt. Стоит задача использовать этот сервис, написать для него UI. Создаем новый WPF проект, для облегчения поддержки MVVM используем какой-нибудь фреймворк (я использую Caliburn.Micro). Создаем связку View-ViewModel. Используем Binding, code behind стараемся не использовать (используем только для функционала замкнутого на View). Отлаживаем отдельно UI-ый проект. Проверяем работу всех нотификаций, байндинга и т.д. Имеем 2 готовых не связанных проекта. Сервис и UI. Дальше... Самое простое получить экземпляр сервиса во ViewModel ( создать напрямую, передать в конструкторе, получить через DI). И подписать обработчики события на события сервиса. В теле обработчиков использовать свойства ViewModel которые участвуют в байндинге. Также ViewModel обращается за состоянием сервиса к открытым свойствам сервиса. Таким образом работа сервиса будет связанна с UI.
А где Model в этой структуре?
Если сделать Mapping сервиса на объект Model. Т.е. копия сервиса имеющая только нужные для UI свойства. И уже получать экземпляр модели во ViewModel.
Но ведь тогда придется дублировать и события (нотификацию).
Тут я немного запутался)))... Подскажите где же Model???


Ответ

Вы всё правильно описываете. Сервис — это и есть ваша модель.
Если вы считаете, что у сервиса свойства, готовые для отображения в UI, это чаще всего не так. Например, модель живёт в непонятно каком потоке (а то и в нескольких, как ей удобно), а VM должна жить в UI-потоке. VM должна выставлять INotifyPropertyChanged, а ваша модель выставляет Rx. Ну и вам наверняка не нужны все свойства вашего сервиса, а некоторые, возможно, вы хотите объединить или преобразовать как вам больше подходит для UI.
Да, это может быть некоторым дубляжом кода. Вот тут немного больше по этой же теме.

Виртуальная память процесса в windows, что из неё видно и как меняются адреса?

Вопрос по загрузке PE и распределению в адресов в режиме пользователя. Насколько я знаю, PE-секции выгружаются в общую для всех пользовательских программ область, в зависимости от доступности, и адреса задаются при загрузке в память, но тут вопрос - как происходит адресация внутри программы, раз мы не меняя кода получаем работоспособную программу и при этом можем через ту же память обращаться в адресное пространство других процессов? К примеру, у меня в программе по адресу 0x1 лежит mov ax,bx и когда происходит jmp 0x1 он перекидывает меня именно в мою программу, а не в чужую, при этом я могу прочитать тот же 0x1 другой программы как? И как бы мне выцепить user32 и kernel32 без таблицы импорта, но из своего pe-файла? И чего там ещё интересного можно найти?


Ответ

Насколько я знаю PE-секции выгружаются в общую для всех пользовательских программ область в зависимости от доступности и адреса задаются при загрузке в память
Так было до Windows 3.1 включительно, когда виртуальной памяти попросту не существовало, и разделение производилось по отовсюду доступным сегментам. В современных же операционных системах каждый процесс находится в собственном, изолированном адресном пространстве («песочнице»).
Согласен, если файл (в том числе исполняемый) отображается в несколько процессов в режиме только на чтение и без каких-либо изменений, то операционная система может (но не обязана) сэкономить немного ОЗУ и отобразить соответствующие страницы виртуальной памяти этих процессов в один и тот же регион памяти физической
Однако это всего лишь трюк на уровне отображения виртуальной памяти на физическую силами железа. С точки зрения самих программ никакого общего региона не существует.
к примеру у меня в программе по адресу 0x1 лежит mov ax,bx и когда происходит jmp 0x1 он перекидывает меня именно в мою программу а не в чужую
Перед тем, как переключить выполнение на какой-либо поток вашего процесса, операционная система производит определённую донастройку процессора. В частности, она извлекает из своих внутренних структур физический адрес карты отображения памяти и передаёт его специальному блоку процессора, мапперу
Маппер же использует указанную карту примерно следующим образом:

(Иллюстрация взята из ответа на вопрос «Какую модель памяти сегментную или страничную использует windows, linux, macos?»)
при этом я могу прочитать тот же 0x1 другой программы как?
Надо попросить операционную систему не выделять пустую страницу, как она это обычно делает, а создать привязку к уже существующей странице. Иными словами, как бы прорубить окно в чужое адресное пространство.
Однако отображаемый блок не должен накладываться на уже занятый регион виртуальной памяти вашего процесса. С другой стороны, это окно можно создать в любом месте памяти вашей программы.
Для этого необходимо вызвать системную функцию MapViewOfFileEx(), указав целевой процесс и адрес в его виртуальной памяти.
И как бы мне выципить user32 и kernel32 без таблицы импорта но из своего pe-файла?
LoadLibrary() + GetProcAddress(). Всё остальное — хаки и ненадёжно.