Страницы

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

среда, 22 января 2020 г.

Как прочитать огромный JSON файл в Java?

#java #json #eclipse


С сайта безопасныедороги.рф необходимо из открытых данных в виде JSON вытащить информацию
о геолокациях каждого дтп: em_place_latitude и em_place_longitude. Сам файл весит 1Гб
и просто когда подключаешь файл - то выскакивает ошибка 


  GC overhead limit exceeded


Я работал с библиотекой simple-json в Eclipse.

Так как я только начал знакомство с JSON, то вообще не понимаю как вытаскивать оттуда
информацию, тем более из огромного файла.

Спасибо!
    


Ответы

Ответ 1



На самом деле всё достаточно просто, если не загружать всё содержимое документа в память. Нужно, в принципе, помнить два основных подхода в разборе документов различных форматов: читается всё с помощью потока (InputStream/Reader или их аналоги) и решается как будет обрабатываться его содержимое: или собиранием всего в память (аналог XML DOM, когда документ, будучи полностью в памяти, позволяет с лёгкостью обходить его дерево), или же работать согласно событийной модели (аналог XML SAX или его pull-аналоги, когда парсер сообщает о том, какие токены встречаются в документе, а пользователь уже сам решает что и как с ними делать). Очевидно, что первый вариант проще в использовании, но требует куда больше ресурсов, в то время как второй вариант сложнее, но и более гибок, зачастую требуя вообще минимум ресурсов. Gson позволяет работать с JSON-потоками с помощью pull-метода: это когда парсер не генерирует события, а предполагает, что пользователь сам знает, что и в каком порядке нужно "тянуть" с потока токенов, но и требуя чтобы каждый токен был обработан хоть как-то. Например: private static final String ITEMS_NAME = "items"; // em_place_latitude не описан в схеме и не встречается в документе private static final String LATITUDE_PROPERTY = "latitude"; // em_place_longitude не описан в схеме и не встречается в документе private static final String LONGITUDE_PROPERTY = "longitude"; static void parseCrashCoordinates(final JsonReader jsonReader, final ICoordinatesListener listener) throws IOException { // Считываем { как начало объекта. // Если его не считать или считать неверно, выбросится исключение -- это и есть суть pull-метода. jsonReader.beginObject(); // Смотрим имя следующего свойства объекта и сравниваем его с ожидаемым. final String itemsName = jsonReader.nextName(); if ( !itemsName.equals(ITEMS_NAME) ) { // Не items? Возможно, у нас нет идей как его обработать -- лучше выбросить исключение. throw new MalformedJsonException(ITEMS_NAME + " expected but was " + itemsName); } // Так же теперь вычитываем [ jsonReader.beginArray(); // И читаем каждый элемент массива while ( jsonReader.hasNext() ) { // Судя по схеме, каждый элемент массива - объект jsonReader.beginObject(); double latitude = 0; double longitude = 0; // И так же пробегаемся по всех свойствах этого объекта while ( jsonReader.hasNext() ) { // Теперь просто смотрим, являются ли они нам известными final String property = jsonReader.nextName(); switch ( property ) { // latitude? Запоминаем. case LATITUDE_PROPERTY: latitude = jsonReader.nextDouble(); break; // longitude? Запоминаем. case LONGITUDE_PROPERTY: longitude = jsonReader.nextDouble(); break; // Иначе просто пропускаем любое значение свойства. default: jsonReader.skipValue(); break; } } // Просто делегируем полученные координаты в обработчик listener.onCoordinates(latitude, longitude); // И говорим, что с текущим элементом массива, именно объектом, покончено. jsonReader.endObject(); } // Также закрываем последние ] и } jsonReader.endArray(); jsonReader.endObject(); } Как выглядит обработчик: interface ICoordinatesListener { void onCoordinates(double latitude, double longitude); } В принципе, возможны ситуации, когда в документе в координатах указана или широта или долгота, или оба значения отсутствуют (и, в принципе, обработка таких случаев является хорошим тоном), но при обработке 148817911056482-crash.json мне такие случаи не встречались. Теперь протестируем всё это дело. public static void main(final String... args) throws IOException { testOutput(); testCollecting(); } // Этот тест просто выводит содержимое координат в стандартный поток вывода // Заметьте: parseCrashCoordinates() сам не решает _что_ делать с координатами -- это целиком наше дело // Поскольку мы вообще просто передаём данные дальше, нас вообще не волнует размер входных данных // Теоретически, это может быть бесконечный поток данных -- круто ведь? private static void testOutput() throws IOException { readAndParse((lat, lng) -> System.out.println("(" + lat + "; " + lng + ")")); } // Здесь мы, напротив, собираем координаты в список. // Выдержит ли JVM увеличение списка coordinates? Возможно, но не факт: зависит от размера данных и памяти, доступной JVM. private static void testCollecting() throws IOException { final List coordinates = new ArrayList<>(); readAndParse((lat, lng) -> coordinates.add(new Coordinate(lat, lng))); System.out.println(coordinates.size()); } private static final class Coordinate { private final double latitude; private final double longitude; private Coordinate(final double latitude, final double longitude) { this.latitude = latitude; this.longitude = longitude; } } private static void readAndParse(final ICoordinatesListener listener) throws IOException { try ( final JsonReader jsonReader = new JsonReader(new BufferedReader(new InputStreamReader(new FileInputStream(...)))) ) { parseCrashCoordinates(jsonReader, listener); } } Этим примером мне удалось разобрать 148817911056482-crash.json размером 746 МБ, не особо тратясь на вычислительные ресурсы (громко сказано, тем не менее :)). Хвост вывода таков: (55.632584; 37.80792) (51.5703; 135.8539) (51.9139; 39.2233) 99497 (3 последние координаты и размер списка, в который были собраны все координаты).

Ответ 2



Вам должна помочь библиотека gson .

Генерация обратного элемента в поле Галуа

#python #алгоритм #криптография


Имеем поле Галуа GF(2409), и неприводимый полином над полем :

f(x) = x409 + x15 + x6 + x + 1
//Коэффициенты при степенях только 0 или 1

Пускай у меня есть какой-то полином a(x) в этом поле.
Вопрос: Как мне найти обратный к "а(x)",относительно f(x) элемент , используя именно
алгоритм Евклида, а не возведение элемента "а(x)" в степень 2409-2.

//Алгоритм поиска обратного элемента пишу на Python используя полиномиальный базис,
а на нём возведение в степень работает слишком долго
//Проблемы возникают при введении операции деления на полиномах
    


Ответы

Ответ 1



2409-2 - это число, содержащее 409 установленных битов и один сброшенный (предпоследний). Это значит, что для быстрого возведения в эту степень элемента a(x) требуется 408 операций возведения в квадрат и 408 операций умножения над полиномами 409-го порядка по модулю f(x). Для умножения полиномов нужно 409 * 410 / 2 умножений, порядок произведения будет 818. Для приведения его к модулю f(x) по методу деления "уголком" требуется 409*4 вычитаний, что практически не влияет на производительность. Итого: 2 * 408 * 409 * 410 / 2 = 68 417 520 умножений. Реальная проблема - в разрядности данных, поскольку при каждом возведении полинома в квадрат сумма его коэффициентов (равная значению полинома при x = 1) также возводится в квадрат, что увеличивает исходную разрядность на 409 log2 a(1) бит и в итоге "утяжеляет" алгоритм, как минимум, на 2 порядка. Остальное - детали реализации.

Можно ли писать приложение Android только на С++

#java #android #cpp #android_sdk


Я собираюсь научиться разрабатывать приложения под Android. Я знаю, что приложения
под Android разрабатываются на языке Java, но также можно и на С++. Так вот, можно
ли не учить Java и использовать только С++, чтобы писать приложения под Android или
обязательно нужно знать Java?
    


Ответы

Ответ 1



Странно, что не вспомнили проект crystax У разработчков проекта есть примеры простеньких прложений на С++. Насколько я знаю, в их планы входило делать нативные библиотеки для разработки UI и прочих тповых задач.

Какой синтаксис лучше использовать при написании React-компонентов: ES5 или ES6?

#javascript #reactjs #ecmascript_6


Не так давно начал изучать React JS и у меня появился вопрос: какой синтаксис лучше
всего использовать при написании React-компонентов: ES5 или ES6? И какое будет преимущество
в зависимости от выбора?
    


Ответы

Ответ 1



ES6. Документация написана в ES6, ES6 имеет не мало чего нового, и на многое из ES6 заточен React. Так же не забывай про сборщик (webpack, например) и будет тебе счастье

Как перенести linux на другую машину?

#linux #ubuntu


Есть linux mint на ноутбуке, пользуюсь уже полгода, сейчас нужно перенести систему
со всеми программами на пк (можно установить с 0 и все настроить, но слишком долго).
Драйвера как и железо совершенно разные. Хотелось бы взять снапшот без драйверов и
развернуть его на пк с последующим обновление драйверов под нужную машину
    


Ответы

Ответ 1



Лично я пользуюсь этим с 2011-го года. Перевалило за 1к разворачиваний образов на разное железо.

Ответ 2



Вы можете осуществить перенос и вручную, разными способами. Подключить два hdd к одному компьютеру и скопировать с одного на другой с помощью dd С помощью livecd загрузиться на новом компьютере, создать разделы, примонтировать, скопировать данные с помощью rsync по сети или локально. Вариацией на тему будет создание и распаковка tar архива. После чего вам нужно будет установить загрузчик, поправить /etc/fstab, и, возможно, обновить initramfs. Если вы используете generic ядро и у вас не стоит проприетарных драйверов (nvidia\amd) то скорее всего касательно драйверов вам ничего делать не придётся

Ответ 3



Воспользуйтесь утилитой ignite-lx (Есть на GitHub, я соразработчик там). Она как раз для этих случаев.

Ответ 4



Вообще перенос что винды начиная с 7-ки, что линя, как бы не должны вызывать проблем. На уровне системы всё подхватывается. Ну может не идеально, но достаточно для того что бы загрузиться. Если просто склонировать диск то проблемы подозреваю будут в двух случаях, с новыми защитами нового биоса (того что uefi) и если при установке были указаны dev id, а не стандартные sdХ. Тогда придётся индивидуально думать на тему реанимации загрузчика. Или установить систему и скопировать нужные файлы из etc чем восстановить большую часть настроек.

example api vine javascript

#javascript #ajax #api


Я тут сутки не спал, поэтому помогите мне подумать.

Есть плеер Vine. У него есть апи https://dev.twitter.com/web/vine/oembed .
Можете сразу посмотреть все заголовки ответа тут https://vine.co/oembed.json?id=5xJVBXAunrD

Мне нужно с клиента получить данные
отправляю запрос



$.ajax({
  url: 'https://vine.co/oembed.json?id=5xJVBXAunrD',
  dataType: "jsonp",
  contentType: "application/json",
  success: () => {
    console.log(arguments)
  },
})





Получаю по лицу: 


  Refused to execute script from
  'https://vine.co/oembed.json?id=5xJVBXAunrD&callback=jQuery211011806981946079831_1482419611704&_=1482419611705'
  because its MIME type ('application/json') is not executable, and
  strict MIME type checking is enabled.


В общем, как я понял, из-за того самого строго соответствия мне нужно все это "Добро"
проксировать?
    


Ответы

Ответ 1



Ошибка происходит из-за того, что сервис отдает json, а dataType = jsonp. Если бы сервис разрешал обращаться к себе с различных сайтов достаточно было бы просто заменить dataType на json. Но в данном случае сервис не разрешает и браузер выдаст ошибку No 'Access-Control-Allow-Origin' header is present on the requested resource. В качестве решение можно либо делать запрос к своему серверу, и уже с него делать серверными средствами запрос, либо воспользоваться одним из сервисов, например: https://cors-anywhere.herokuapp.com/ Пример: $.ajax({ url: 'https://cors-anywhere.herokuapp.com/https://vine.co/oembed.json?id=5xJVBXAunrD', dataType: "json", contentType: "application/json", success: data => { console.log(data) }, }); .as-console-wrapper { top: 0; max-height: 100% !important; }

Ответ 2



Попробуйте заменить контент тайп на Content-Type: application/javascript

Таблица синуса и косинуса

#cpp #оптимизация


Ради оптимизации решил сделать табличку в которой будут лежать синусы и косинусы.
Рисует почти как надо. 



появляется какой-то пик. не могу понять почему и от куда он берется.

sincos::sincos(){
double step = 6.28318530717958647692 / 4096.0f;
sinTable = new float[4099];
cosTable = new float[4099];
int index = 0;
for (double i = 0; i < 6.28318530717958647692; i += step)
{
    sinTable[index] = std::sin(i);
    cosTable[index] = std::cos(i);
    index++;
}

float sincos::getSin(float val)
{
    val = fmod(val, 6.28318530717958647692);
    return sinTable[(int)(4096.0f * val / 6.28318530717958647692)];
}
float sincos::getCos(float val)
{
    val = fmod(val, 6.28318530717958647692);
    return cosTable[(int)(4096.0f * val / 6.28318530717958647692)];
}

    


Ответы

Ответ 1



В вашей таблице нет никаких пиков - http://ideone.com/T4nigg Так что разбирайтесь с рисованием... #include #include class SinCos { public: SinCos() { double step = 6.28318530717958647692 / 4096.0f; sinTable = new float[4099]; cosTable = new float[4099]; int index = 0; for (double i = 0; i < 6.28318530717958647692; i += step) { sinTable[index] = sin(i); cosTable[index] = cos(i); index++; } maxIdx = index; } float getSin(float val) { val = fmod(val, 6.28318530717958647692); return sinTable[(int)(4096.0f * val / 6.28318530717958647692)]; } float getCos(float val) { val = fmod(val, 6.28318530717958647692); return cosTable[(int)(4096.0f * val / 6.28318530717958647692)]; } float maxSinDelta(); float maxCosDelta(); float* sinTable; float* cosTable; int maxIdx; }; float SinCos::maxCosDelta() { float maxval = 0; for(int i = 0; i < maxIdx; ++i) { float delta = fabs(cosTable[i] - cosTable[(i+1)%maxIdx]); if (maxval < delta) maxval = delta; } return maxval; } float SinCos::maxSinDelta() { float maxval = 0; for(int i = 0; i < maxIdx; ++i) { float delta = fabs(sinTable[i] - sinTable[(i+1)%maxIdx]); if (maxval < delta) maxval = delta; } return maxval; } int main() { SinCos s; printf("MaxDelte sin = %f, cos = %f\n", s.maxSinDelta(), s.maxCosDelta()); }

Как правильно отвечать на запрос Captcha?

#php #vkontakte_api #вконтакте #captcha


Как правильно отвечать на запрос капчи?

error;

if(isset($_POST['enter_key']))
{
    $wall1 = file_get_contents("https://api.vk.com/method/users.get?captcha_sid=".$wall->captcha_sid."&captcha_key=".$key."&access_token=".$token);
    print_r($wall1);
}

?>
captcha_img."'>";?>
Я отправляю запрос users.get — в ответ получаю ошибку капчи. Потом отправляю запрос users.get + captcha_sid и captcha_key — в ответ приходит ошибка капчи и запрос опять ввести капчу. Вот пример: http://nicolaa.h1n.ru/1.php .


Ответы

Ответ 1



При отправке капчи вы запрашиваете новую капчу и зачем-то передаете её sid. То есть вы берете новый свежесгенерированный sid и передаете вместе с ним решение старой капчи (у которой другой sid). В принципе, я думаю, это единственная дырка в логике вашего скрипта. Но сама по себе ваша реализация ужасна: лишний запрос к API, неразборчивый код. Разумнее переписать его примерно так: $token, 'v' => '5.67' ]; // Если страницу открыли после отправки формы решения капчи, // то добавляем соответствующие параметры к запросу if (!empty($_POST['captcha_sid']) && !empty($_POST['captcha_key'])) { $parameters['captcha_sid'] = $_POST['captcha_sid']; $parameters['captcha_key'] = $_POST['captcha_key']; } $request = file_get_contents('https://api.vk.com/method/users.get?'.http_build_query($parameters)); $response = json_decode($request); // Если ВК вернул ошибку с капчей, то // показываем форму решения капчи if (isset($response->error->captcha_img)) { echo 'Captcha'; echo '
'; echo ''; echo ''; echo ''; echo '
'; }

Collections.unmodifiable* как определить?

#java #коллекции


Известно, что есть класс java.util.Collections в котором есть методы вида unmodifiable*
возвращающие неизменяемые коллекции. Теперь вопрос, как определить, что коллекция является
неизменяемой?
    


Ответы

Ответ 1



Какое-либо универсальное хорошее решение Вы вряд ли найдете. На мой взгляд, самое некостыльное из костылей – .getClass().isInstance(...): List list = new ArrayList<>(); List unmodifiableList = Collections.unmodifiableList(list); boolean isUnmodifiable = Collections.unmodifiableList(list).getClass().isInstance(unmodifiableList); Еще варианты: Ловить UnsupportedOperationException при добавлении элемента. Но тогда, в случае изменяемой коллекции, после теста элемент нужно удалить. .getClass().getSimpleName().equals(...).

При парсинге с помощью CsQuery текст элемента получаетсяв 16-м коде

#c_sharp #net #парсер


Пробую использовать CsQuery для парсинга html.
Есть в html документе набор дивов с классом some_class. Внутри каждого дива текст
на русском.
Пробую парсить дивы следующим образом:

//...
CQ cq = CQ.Create(html, Encoding.UTF8);
List items = cq.Find("div.some_class").ToList();
// Демо код для просмотра содержимого item-ов
items.ForEach(x => var test = x.InnerText);


В результате в test текст представлен в 16-тиричном коде.
Покопался в IDomObject, не нашёл способа задать кодировку.Также не понятно почему
кодировка слетает, если задал её при создании объекта cq.

Сталкивался ли кто-нибудь с подобной ситуацией? 
    


Ответы

Ответ 1



Это баг в версии 1.3.4 CsQuery. В сообщении об ошибке упоминается метод обхода проблемы: использовать .Cq().Text() вместо .InnerText. Проблема устранена в версии 1.3.5 beta, так что если не боитесь бета-версии, переходите на неё.

Обработка GET-запросов на python: сохранить значение из одного запроса и отдать в другом

#python #get #cgi #esp8266


Добрый день! Написал (точнее скопипастил) такой сервер:

from http.server import HTTPServer, CGIHTTPRequestHandler
import time

server_address = ('192.168.0.198', 800)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
begin_time = time.asctime()
print('Server started on', begin_time)
print('Server is running on address', server_address[0], 'on port', server_address[1])
httpd.serve_forever()


Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются,
но вот нормально их обработать не могу (хочу выводить на отдельной странице).

Что посоветуете?

UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/...
и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же
адресе запущен сервер.
    


Ответы

Ответ 1



микроконтроллер с датчиком температуры отправляет показания методом get Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку: #!/usr/bin/env python from bottle import route, request, run, template # $ pip install bottle temperature = None @route('/') def index(): global temperature temperature = request.query.temperature or temperature return template('Temperature: {{temperature}}', temperature=temperature) run(host='localhost', port=8000) При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту. При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан. То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа: $ http ':8000?temperature=20' что устанавливает значение (20). Чтобы прочитать это значение, достаточно не указывать параметр: $ http :8000 Можно в браузере посмотреть (тот же запрос): $ python -mwebbrowser http://localhost:8000 http команду можно получить, установив httpie библиотеку: $ pip install httpie Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite. Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv): $ pip install bottle то достаточно скачать bottle.py и положить его рядом с кодом сервера.

Стилизация ComboBoxItem

#c_sharp #wpf


Добрый день, столкнулся со следующей проблемкой. Не получается задать прозрачность
ComboBoxItem. Подскажите как можно это сделать.

На данный момент пробую вот так:


    
    


    


Ответы

Ответ 1



Это, к сожалению, не так просто. Давайте делать это по частям. Во-первых, у выпадающего списка комбобокса есть свой цвет фона и цвет границы. Эти цвета берутся как ресурсы с ключами SystemColors.WindowBrushKey и SystemColors.WindowFrameBrushKey, поэтому их можно превратить в прозрачные, если хочется. Transparent Transparent Это даёт почти то, что надо, но именно почти. Видите, в чём проблема? Системный стиль для комбобокса определяет тень, и мы её нашей прозрачностью не отключили. Если вас такой результат устраивает, на этом всё. Если нет, читайте дальше. Как её можно отключить? Для это я не нашёл встроенных средств, и значит, придётся доставать серьёзное оружие — редактировать шаблон. Если у вас Visual Studio 2015 или выше, вы можете легко получить системный шаблон на редактирование, если нет — вам может помочь Expression Blend (или друг, у которого установлена Visual Studio 2015 или старше). Как попросить Visual Studio показать вам стиль, написано в подробностях здесь. Имея стиль, вы должны найти элемент, который задаёт тень. У меня это такой код: ... Мы видим, что тень задаётся контролом , но цвет его установлен в Transparent. Поискав ещё по коду шаблона, находим триггер, который меняет цвет на непрозрачный: Закомментировав этот триггер (у меня он встречается в коде шаблона дважды), получаем нужный результат: Недостаток «бронебойного» метода с переопределением шаблона — вы фиксируете шаблон, подходящий для той операционной системы, на которой вы это делаете. Например, если вы делаете это на Windows 10, внешний вид комбобокса будет как в Windows 10, даже если вы запустите программу на Windows 7. Обычно это не большая проблема, потому что вы меняете стиль полностью.

Расширение для VISUAL STUDIO, которое подкрашивает ключевые слова запросов

#sql #visual_studio #plugin


Запросы находятся в ресурсах в виде *.sql файлов, а в месте вызова находятся инструкции
такого вида:

Properties.Resources.Query


При наведении курсора на Query высвечивается текст запроса, но подсветки синтаксиса нет.

Есть ли какие-нибудь плагины, которые исправляют данную проблему?

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


Ответы

Ответ 1



Такой вопрос уже обсуждался на англоязычном SO, и в качестве варианта было предложено вот это расширение для Visual Studio 2012, которое путём редактирования манифеста можно попробовать завести и в более новых версиях Visual Studio. Однако, обсуждение сошлось на том, что работать это не может корректно, так как синтаксический анализатор не в состоянии определить, является ли строка SQL кодом или просто строкой и может работать некорректно. В качестве альтернативы, можно использовать .sql-файлы с кодом SQL в проекте (которые в принципе подсвечиваются довольно неплохо), используя их так: string sql = System.IO.File.ReadAllText("путь к файлу .sql"); Все ответы взяты из оригинального англоязычного обсуждения.

Ответ 2



Как по мне то Syntax Highlighting Pack подходит наилучше, потому что поддерживает очень много языков программирования и работает с Visual Studio 2015, 2017

Как в CSS сделать выделение текста цветом?

#css


Как в CSS сделать выделение текста цветом? Цвет выделения может быть в RGBA-формате,
т.е. с прозрачностью.



Имеется ввиду не выделение курсором. А изначально текста выделен.
    


Ответы

Ответ 1



div { color: #fff; max-width: 400px; text-align: center; } div > span { padding: 3px 0; line-height: 1.45; background: rgba(20,172,211,.5); box-shadow: 10px 0 rgba(20,172,211,.5), -10px 0 rgba(20,172,211,.5); }
Как в CSS сделать выделение текста цветом? Цвет выделения может быть в RGBA-формате, т.е. с прозрачностью.


Решение логической задачки на прологе

#prolog


Задача:  


Три друга – Петр, Роман и Сергей учатся на математическом, физическом
и химическом факультетах университета.
Если Петр математик, то Сергей не физик.
Если Роман не физик, то Петр – математик.
Если Сергей не математик, то Роман – химик.


Определите специальность Сергея.

Код: 

domains
    dep=symbol
predicates
    faculty(dep)
    cond1(dep, dep)
    cond2(dep, dep)
    cond3(dep, dep)
    solve(dep, dep, dep) % Peter, Roman, Sergey
clauses
    faculty(physics).
    faculty(math).
    faculty(chemistry).

    cond1(Fa1, Fa3):-
        Fa1=math,
        Fa3<>physics.

    cond2(Fa2, Fa1):-
        Fa2<>physics,
        Fa1=math.

    cond3(Fa3, Fa2):-
        Fa3<>math,
        Fa2=chemistry.

    solve(Fa1, Fa2, Fa3):-
        faculty(Fa1),
        faculty(Fa2),
        faculty(Fa3),
        Fa1<>Fa2,
        Fa2<>Fa3,
        Fa1<>Fa3,
        cond1(Fa1, Fa3);
        cond2(Fa2, Fa1);
        cond3(Fa3, Fa2).


При запуске данного кода выскакивает следующая ошибка:



Как можно исправить данную ошибку и есть ли у этой задачки какое-либо другое решение
на прологе?
Ответ у задачки должен быть такой: Петр - химик, Роман - физик, Сергей - математик
    


Ответы

Ответ 1



Используй вместо <> конструкцию not(a=b). domains dep=symbol predicates faculty(dep) cond1(dep, dep) cond2(dep, dep) cond3(dep, dep) solve(dep, dep, dep) % Peter, Roman, Sergey clauses faculty(physics). faculty(math). faculty(chemistry). cond1(Fa1, Fa2):- Fa1=math, not(Fa2=physics). cond1(Fa1, _):- not(Fa1=math). cond2(Fa1, Fa2):- not(Fa1=physics), Fa2=math. cond2(physics, _). cond3(Fa1, Fa2):- not(Fa1=math), Fa2=chemistry. cond3(math, _). solve(Fa1, Fa2, Fa3):- faculty(Fa1), faculty(Fa2), faculty(Fa3), Fa1<>Fa2, Fa2<>Fa3, Fa1<>Fa3, cond1(Fa1, Fa3), cond2(Fa2, Fa1), cond3(Fa3, Fa2). goal solve(Fa1, Fa2, Fa3), write(Fa1),nl, write(Fa2),nl, write(Fa3).

Написание драйвера Linux с работой с прикладным ПО [закрыт]

#linux #драйвер


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Здравствуйте.

Подскажите статьи/книги/треды форумов на тему написания драйверов сетевых устройств
под Linux. Интересно написать драйвер, который будет взаимодействовать с обычным пользовательским
приложением (наподобии FUSE, только сеть).

Спасибо.
    


Ответы

Ответ 1



Основная книжка по драйверам Linux: "Драйверы Устройств Linux, Третья Редакция". Это перевод книги "Linux Device Drivers, Third Edition" by Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman "Программирование модулей ядра Linux" Олег Цилюрик. "Linux PCI drivers" Michael Opdenacker Free Electrons. Поскольку практически все сетевые карточки - PCI-ные. Конкретно по сетевым драйверам: http://rus-linux.net/lib.php?name=/MyLDP/algol/realtekdriver.html Конкретно по FUSE: https://www.ibm.com/developerworks/ru/library/l-fuse/

Как в ReactJS организовать подключение компонента из другого файла?

#javascript #reactjs


Уважаемые знатоки React! Подскажите, как правильно организовать подключение и использование
компонента, который хранится в отдельном файле? В примере ниже мне нужно внутри файла
main.js использовать компонент Header, который хранится в файле componets/header.js

Index.html:












  
  

  
  
  

       

  Тайтл




/js/components/header.js: "use strict"; class Header extends React.Component { render() { return
This is Header
; } } /js/main.js: 'use strict'; import Header from 'components/header'; ReactDOM.render(
, document.getElementById( 'layout' ) );


Ответы

Ответ 1



В вашем случае (вы не используете сборщики), подключайте файл с вашим компонентом через тег script:

Как улучшить верстку тестового задания

#html #css #вёрстка #инспекция_кода


Оцените пожалуйста!
Какие ошибки допущены? Как можно улучшить верстку?  

Задание | Реализация    



h3,
p {
    margin: 0;
}


.box {
    font-family: sans-serif;
    position: relative;
    width: 100%;
    min-height: 35px;
}

.box_title {
  position: relative;
  display: inline-block;
  max-width: 250px;
  padding: 5px 15px;
  min-height: 35px;
  border: 2px solid #93d81c;
  border-bottom: none;
  border-radius: 10px 10px 0 0;
  background: #c9e39c;
}

.box_title::before {
    position: absolute;
    content: '';
    z-index: -10;
    top: 0;
    left: 0;
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 10px 10px 0 0;
    box-shadow: 0 0 6px 1px rgba(0, 0, 0, .7);
}

.box_text {
    position: absolute;
    z-index: -5;
    top: 100%;
    left: 0;
    width: 100%;
    box-sizing: border-box;
    min-height: 150px;
    margin-top: -2px;
    padding: 10px 15px 0;
    border: 2px solid #93d81c;
    border-radius: 0 0 10px 10px;
    background: #c9e39c;
    box-shadow: 0 0 6px 0 rgba(0,0,0, .5);
}

Заголовок

Содержание блока


Ответы

Ответ 1



Спасибо за пример! Отлично попрактиковался на нем. Твой пример в IE11 не идеально смотрится(под header border/тень виднеется) Почти идеально получилось у меня, можно делать заголовок и параграф в несколько строк и все отлично смотрится! Отрицательного z-index не использую! body { font-family: sans-serif; } .block { color: #510000; } .block h2 { position: relative; display: inline-block; background-color: #C9E39C; max-width: 250px; padding: 7px 10px 13px; font-size: 17px; border-top-left-radius: 10px; border-top-right-radius: 10px; border: 1px solid #A3D869; margin-bottom: 0; -webkit-box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); -moz-box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); } .block h2:after { content: ''; display: block; position: absolute; width: 100%; left: 0; bottom: 0; height: 10px; background-color: #C9E39C; color: #C9E39C; z-index: 10; } .block p { position: relative; z-index: 5; top: -3px; display: block; background-color: #C9E39C; margin-top: 0; padding: 10px 11px; font-size: 14px; line-height: 1.5; min-height: 105px; border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; border-top-right-radius: 10px; border: 1px solid #A3D869; -webkit-box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); -moz-box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); box-shadow: 0px 1px 7px -1px rgba(0, 0, 0, 0.75); }

Заголовок

Содержание блока

Вот он на codepen

Посмотреть иерархию классов в Visual Studio

#c_sharp #net #visual_studio


Как в VS можно в удобном виде посмотреть иерархию(Что от какого класса досталось
и т п) в удобном виде?

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

Может быть есть более удобная штука?
    


Ответы

Ответ 1



В редакторе кода нажимаете правой кнопкой на метод и выбираете "View Call Hierarchy". Ну или последовательно Ctrl+K, Ctrl+T

Ускорить код ищущий 10 самых популярных групп среди подписчиков заданной группы ВКонтакте

#python #python_3x #vkontakte_api #инспекция_кода


Как ускорить данный код? В среднем работа занимает около 4 минут на группу в 300
человек. Мне кажется дело в занесении групп в словарь. Есть ли какой-то более рациональный
способ сделать это?

Данный код берет всех подписчиков определенной группы (в данном случае fineline_official),
затем у каждого подписчика проверяет в каких группах он состоит groups = api.users.getSubscriptions(user_id
= mid)['groups']. Затем добавляет в словарь id этих групп. Если в словаре нет id какой-либо
группы, то он добавляет ее туда groups_dict[gid] = 1. Если же id этой группы уже есть
в словаре, то прибавляет 1 к значению ключа. На входе получаем группу (id), на выходе
10 самых популярных групп среди подписчиков данной группы

import vk

session = vk.Session(access_token='token') #VK token
api = vk.API(session)
group_id = 'fineline_official'  #group id
group_stat=api.groups.getMembers(group_id = group_id )  #Получаем участников группы
members_id = group_stat['users']
members_count = group_stat['count']
groups_dict = {}
if members_count <= 1000:
    for mid in members_id:
        try:
            groups = api.users.getSubscriptions(user_id = mid)['groups']
            groups_id = groups['items']
            for gid in groups_id:
                try:
                    groups_dict[gid]
                    groups_dict[gid] += 1
                except:
                    groups_dict[gid] = 1
        except:
            continue
else:
    print('>1000')
lst = []
for k in groups_dict.items():   #Добавление в список кортеж из id группы и кол-ва
участников
    lst.append(k)
lst_sort = sorted(lst, key=lambda x: x[1])  #Сортировка по кол-ву участников
print (lst_sort)
lst1 = lst_sort[-10:]   #10 самых популярных
print(lst1)

    


Ответы

Ответ 1



Отрывок из документации VK: Ограничения и рекомендации 3.1. Частотные ограничения К методам API ВКонтакте (за исключением методов из секций secure и ads) можно обращаться не чаще 3 раз в секунду. Если логика Вашего приложения подразумевает вызов нескольких методов подряд, имеет смысл обратить внимание на метод execute. Он позволяет совершить до 25 обращений к разным методам в рамках одного запроса.

Ответ 2



С помощью execute можно реализовать вот так: import vk import math token ="" session = vk.Session(access_token=token) api = vk.API(session) group_id = "fineline_official" members = api.groups.getMembers(group_id=group_id, v="5.62") # сколько проходов потребуется, если брать из списка по 25 элементов # делим кол-во элемнтов на 25 и округляем в большую сторону num_of_pass = math.ceil(members["count"] / 25) groups_dict = dict() for npass in range(num_of_pass): pass_users = list() # забираем из списка 25 элементов for i in range(npass * 25, npass * 25 + 25): if i < members["count"]: pass_users.append(str(members["items"][i])) # код, который мы будем передавать code = """var u = [""" + ','.join(pass_users) + """]; var i = 0; var r = []; while(i < u.length) { r = r + API.groups.get({"user_id":u[i]}); i = i + 1; } return r;""" users_groups = api.execute(code = code); print(users_groups) for gid in users_groups: try: groups_dict[gid] += 1 except: groups_dict[gid] = 1

Получить строку по индексу в DataGrid

#c_sharp #wpf


Пытаюсь сделать запись содержимого DataGrid в html-таблицу.

Нашел пример кода, но для DataGridView.

private StringBuilder DataGridtoHTML(DataGridView dg)
{
  StringBuilder strB = new StringBuilder();
  //create html & table
  strB.AppendLine("
<" + "table border='1' cellpadding='0' cellspacing='0'>"); strB.AppendLine(""); //cteate table header for (int i = 0; i < dg.Columns.Count; i++) { strB.AppendLine("" + dg.Columns[i].HeaderText + ""); } //create table body strB.AppendLine(""); for (int i = 0; i < dg.Rows.Count; i++) { strB.AppendLine(""); foreach (DataGridViewCell dgvc in dg.Rows[i].Cells) { strB.AppendLine("" + dgvc.Value.ToString() + ""); } strB.AppendLine(""); } //table footer & end of html file strB.AppendLine("
"); return strB;} Проблема в том, что у DataGrid нет свойства Rows как у DataGridView. Подскажите, как перебрать таким же образом строки для DataGrid?


Ответы

Ответ 1



var rowIndex = dataGrid.SelectedIndex; var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(selectedIndex); или dataGrid.SelectedIndex = 3; var selectedRow= (DataRowView)dataGrid.SelectedItem;

Ответ 2



for (int i = 0; i < dataGrid.Items.Count; i++) { DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(i); }

Полный контроль над другими приложениями из формы WPF

#c_sharp #wpf #winapi #unity3d #render


Здравствуйте!
Хотел узнать у опытных программистов: возможно ли выполнять отрисовку окна другого
приложения и перенаправлять ввод-вывод из своего приложения в это приложение?

Т.е. я бы хотел, чтобы внутри моего приложения WPF был некоторый Image, в котором
бы отрисовывалось окно сторонней программы, если содержимое этого окна изменяется,
то Image перерисовывает окно. При этом, если был клик по Image в какой-либо точке,
то для этого стороннего окна происходит событие клика в той точке, которую я кликнул
на картинке.

Возможно ли реализовать это с помощью WinAPI и в каком направлении следует искать
решение данной проблемы?

Заранее благодарен,
proggamer12

Например, как реализована данная программа: http://store.steampowered.com/app/382110/
    


Ответы

Ответ 1



Ну если в лоб, то можно найти окно интересующей программы и получить окно "цель" [DllImport("user32.Dll")] public static extern int FindWindow (string lpClassName, string lpWindowName); Получить область этого окна [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle); затем запустить таймер сканирующий область этого окна и при изменениях, перерисовывать это в своем Image. Что касается кликов, так как у вас есть дубликат координат этого окна, то можно транспонировать координаты для окна "цели" и через WinApi вызвать клик мыши по координатам. [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

Деформация 3D модели с помощью кривых Безье

#cpp #3d #directx #mesh


Пишу программу, которая должна деформировать модель по опорным точкам. 

Получилось написать следующий код, который создает полотно процедурно по 16 опорным
точкам. Вот как это выглядит:



//вычисляем полином Бершнейна третьей степени на основании четырех точек
XMFLOAT3 Bernstein(float u, XMFLOAT3 p1, XMFLOAT3 p2, XMFLOAT3 p3, XMFLOAT3 p4) {
    XMFLOAT3 a, b, c, d;

    a = pointTimes(pow(u, 3), p1);
    b = pointTimes(3 * pow(u, 2) * (1 - u), p2);
    c = pointTimes(3 * u * pow((1 - u), 2), p3);
    d = pointTimes(pow((1 - u), 3), p4);

    return pointAdd(pointAdd(a, b), pointAdd(c, d));
}

//тоже самое что и верхняя функция, только принимаем указатель на массив точек
XMFLOAT3 Bernstein(float u, XMFLOAT3 *p) {
    XMFLOAT3 a, b, c, d;

    a = pointTimes(pow(u, 3), p[0]);
    b = pointTimes(3 * pow(u, 2) * (1 - u), p[1]);
    c = pointTimes(3 * u * pow(1 - u, 2), p[2]);
    d = pointTimes(pow(1 - u, 3), p[3]);

    return pointAdd(pointAdd(a, b), pointAdd(c, d));
}

void CreateSurfaceByControlPoints(XMFLOAT3 points[], D3DTextureVertex **ppVertices) {
    const int step = 16;    //количество делений у полотна
                            //чем больше делений, тем глаже модель становится (создается
больше вершин)

    const int max = (step * (step + 1) * 2);    //общее количество вершин у модели

    XMFLOAT3 temp[4];
    XMFLOAT3 *last = new XMFLOAT3[step + 1];

    //в массиве points, размером 16 точек,
    //у меня верхняя линия с индексами от 0 до 3, следющая от 4 до 7 и т.д.

    for(int i = 0; i < 4; i++) {
        temp[i] = points[(i + 1) * 4 - 1];
    }

    for(int i = 0; i < step + 1; i++) {
        last[i] = Bernstein((float)i / (float)step, temp);
    }

    *ppVertices = new D3DTextureVertex[max];

    int c = 0; //счетчик текущей вершины

    for(int i = 1; i < step + 1; i++) {
        float py = (float)i / (float)step;
        float pyold = ((float)i - 1.0f) / (float)step;

        for(int j = 0; j < 4; j++) {
            temp[j] = Bernstein(py, points[j * 4 + 0], points[j * 4 + 1], points[j
* 4 + 2], points[j * 4 + 3]);
        }

        for(int j = 0; j <= step; j++) {
            float px = static_cast(j) / (float)step;

            (*ppVertices)[c++] = D3DTextureVertex(last[j].x, last[j].y, last[j].z,
pyold, px);

            last[j] = Bernstein(px, temp);

            (*ppVertices)[c++] = D3DTextureVertex(last[j].x, last[j].y, last[j].z,
py, px);
        }
    }

    delete[] last;
}


Все вышесказанное работает отлично, но теперь задача усложнилась и мне нужно загружать
произвольную модель (она тоже 2D, как и моя процедурная), добавлять опорные точки таким
же образом и деформировать меш по такому же подобию.

Модель уже имеет свою геометрию и UV координаты.
Выглядит следующим образом:


Главный вопрос - есть ли какая-нибудь формула, чтобы рассчитать позицию для каждого
вертекса, основываясь на 8 кривых Безье (4 горизонтальных и 4 вертикальных), учитывая
их первоначальную позицию? Как, например, в профессиональных программах Maya или Blender
есть такие инструменты, как произвольно расставить опорные точки и делать с моделью
любые деформации.
    


Ответы

Ответ 1



Спасибо за помощь! Получилось решить проблему следующим образом: //1378 и 861 - значения у меня рассчитаны, чтобы вся модель умещалась на экране //у вас они могут быть другие или вообще по-другому считаться, главное, чтобы pz и px были в пределах [0.0f, 1.0f] //в переменной points хранятся опорные точки //в ppOutVertices хранится указатель на вершины, которые будем задавать //в ppBaseVertices хранится массив вершин по-умолчанию, на основе которых формируем новый массив //nVertices - количество вершин в моделе void UpdateSurface(XMFLOAT3 points[], D3DTextureVertex **ppOutVertices, D3DTextureVertex **ppBaseVertices, UINT nVertices) { XMFLOAT3 tmp[4]; *ppOutVertices = new D3DTextureVertex[nVertices]; for(int i = 0; i < nVertices; i++) { float pz = (float)(*ppBaseVertices)[i].Pos.x / (1378.0f / 100.0f); for(int j = 0; j < 4; j++) { tmp[j] = Bernstein(pz, points[j * 4 + 0], points[j * 4 + 1], points[j * 4 + 2], points[j * 4 + 3]); } float px = (float)(*ppBaseVertices)[i].Pos.z / (861.0f / 100.0f); XMFLOAT3 bern = XMFLOAT3(Bernstein(px, tmp)); (*ppOutVertices)[i].Pos = XMFLOAT3(bern.x, 0.0f, bern.z); } }

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

#javascript


Функция partitionOn принимает 2 аргумента, pred — это функция задающая условия выборки
элементов из массива items.

Функция должна возвращать длину нового массива с элементами удовлетворяющими pred.
А также изменять массив items, который принимает в качестве аргумента. 

В моем коде items не изменяется во внешней области видимости. Как сделать чтобы он
изменялся?

В консоли пишу

window.items.concat(arrPredFalse, arrPredTrue);


и работает, но codewars выдает ошибку.

function partitionOn(pred, items) {
    var arrPredTrue = [];
    var arrPredFalse = [];
    for (var i = 0; i < items.length; i++) {
      if (pred(items[i])) {
        arrPredTrue.push(items[i]);
      } else {
        arrPredFalse.push(items[i]);
      }
    }
    items.concat(arrPredFalse, arrPredTrue);
    return arrPredTrue.length;
}

    


Ответы

Ответ 1



Функция concat в строке items.concat(arrPredFalse, arrPredTrue); Создает новый массив и возвращает его в никуда. При этом в исходном массиве изменений не происходит. Присвоение результата той же переменной items, также не отразится на глобальном массиве, из-за того, что в этом случае просто изменится ссылка на которую будет указывать параметр items. Чтобы изменения применились, нужно использовать функции непосредственно меняющие массив: push, splice items.push(...arrPredFalse, ...arrPredTrue); или items.splice(items.length, 0, ...arrPredFalse, ...arrPredTrue); В примерах выше используется spread operator, упрощающий передачу массива в качестве списка параметров. Без его использования нужно использовать apply items.push.apply(items, arrPredFalse.concat(arrPredTrue)); или items.splice.apply(items, [items.length, 0].concat(arrPredFalse,arrPredTrue));

Как подсказать браузеру где на странице брать контент для Режима чтения?

#html #css #firefox #браузер


Я об этой функции в Firefox:



Существует ли какой-то html-тег для этого, или можно дать блоку какой-то класс для
обозначения "главного" текста на странице? 

Проблема в том, что на каких-то страницах моего сайта браузер дает возможность просмотреть
статью в режиме чтения, а на каких-то нет. 

Взять тот же Хабр, в этой статье кнопка появляется, а в этой нет. 
    


Ответы

Ответ 1



Ответ прост - соблюдать семантику в HTML-разметке. Рекомендую прочитать про HTML5-теги. Согласно его стандартам, основной текст на странице нужно помещать в Тег article. Как это реализовано, можно посмотреть на примере моей последней работы. Там реализована семантическая разметка и сайт отлично читается на мобильном Safari. На Windows не проверял, но скорее всего там принцип работы идентичный.

Варианты заполнения поля и идея реализации этой системы

#javascript #html #css


Здравствуйте. 

Постараюсь объяснить ситуацию на пальцах: есть страница, на которой можно посмотреть
список всех заказов (и провести поиск среди них). У каждого заказа имеется несколько
характеристик, в том числе и идентификтора заказчика. 

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

Проблема в том, что таблица, из которой берется список, довольно большая (8-10 тыс.
записей) и загрузка ее на страницу идет с зависанием (как и поиск в ней). 

Сам вопрос: как лучше организовать эту систему? (код не нужен, нужна лишь идея/структура
и т.д. для быстрого и эффективного поиска)

Пример системы (это не оригинальный код, а лишь копия некоторых функций и обработчиков
событий):



$(document).ready(function() {
  /*
         Получение списка, для упрощения сделал готовый объект
         для примера
    */
  lastElement = null;
  userList = [{
    ID: 1,
    Name: 'Иванов Иван Иванович',
    Phone: 123
  }, {
    ID: 2,
    Name: 'Петров Петр Петрович',
    Phone: 1243
  }, {
    ID: 3,
    Name: 'Максимов Максим Максимович',
    Phone: 1253
  }, {
    ID: 4,
    Name: 'Петров Иван Иванович',
    Phone: 1723
  }, {
    ID: 5,
    Name: 'Иванов Петр Иванович',
    Phone: 1236
  }, {
    ID: 6,
    Name: 'Иванов Иван Петрович',
    Phone: 1253
  }, {
    ID: 7,
    Name: 'Максимов Иван Иванович',
    Phone: 1323
  }, {
    ID: 8,
    Name: 'Иванов Максим Иванович',
    Phone: 1213
  }, {
    ID: 9,
    Name: 'Иванов Иван Максимович',
    Phone: 123
  }, {
    ID: 10,
    Name: 'Даниилов Данил Данилович',
    Phone: 1623
  }, {
    ID: 11,
    Name: 'Примеров Пример Примерович',
    Phone: 123
  }, {
    ID: 12,
    Name: 'Антонов Антон Антонович',
    Phone: 14223
  }, {
    ID: 13,
    Name: 'Кириллов Кирилл Кириллович',
    Phone: 12123
  }, {
    ID: 14,
    Name: 'Иоанов Иоан Иоанович',
    Phone: 12123
  }, {
    ID: 15,
    Name: 'Николаев Николай Николаевич',
    Phone: 123
  }, {
    ID: 16,
    Name: 'Анатольев Анатолий Анатольевич',
    Phone: 12683
  }, {
    ID: 17,
    Name: 'Анатольев Иван Иванович',
    Phone: 122343
  }, {
    ID: 18,
    Name: 'Иванов Анатолий Иванович',
    Phone: 123
  }, {
    ID: 19,
    Name: 'Иванов Иван Анатольевич',
    Phone: 122453
  }, {
    ID: 20,
    Name: 'Иоанов Иван Иванович',
    Phone: 12363
  }, {
    ID: 21,
    Name: 'Иванов Иоан Максимович',
    Phone: 120533
  }, {
    ID: 22,
    Name: 'Максимов Иван Максимович',
    Phone: 12123
  }, {
    ID: 23,
    Name: 'Примеров Иван Максимович',
    Phone: 12633
  }];
  $("body").append("
"); var controlElement = $("#searchPanel"); var table = $("#searchTable"); function OnSearch(l) { var search = $(l).val(); var idx = 0; var j = userList.length; var len = j; var i = 0; var dataHTML = ""; var toSetString = ""; while (--j) { i = len - j; elem = userList[i]; toSetString = elem.Name.concat(" (", elem.Phone, ")"); if (search.length > 0) { idx = elem.Name.indexOf(search); if (idx !== -1) { dataHTML = dataHTML.concat("", toSetString.substr(0, idx).concat("", search, "", toSetString.substr(idx + search.length))); } } else dataHTML = dataHTML.concat("", toSetString, ""); } table.html(dataHTML); } function ShowHelp(l) { lastElement = $(l); var pos = $(l).offset(), h = $(l).height(), topPos = pos.top + h + 5; h = 300; controlElement.css({ top: topPos, left: pos.left, height: h }); controlElement.fadeIn(100); table.empty().append("Загрузка списка... Пожалуйста, подождите"); OnSearch(l); } function HideHelp() { $("#searchPanel").fadeOut(100); } function OnSelect(l) { var value = userList[parseInt($(l).attr("k"))].Name; lastElement.val(value); } $("input[name=myinput]").on("click", function(e) { ShowHelp(e.currentTarget); }); $("input[name=myinput]").on("input", function(e) { ShowHelp(e.currentTarget); }); $("input[name=myinput]").on("blur", function(e) { HideHelp(); }); $("#searchTable").on("mousedown", "tr", function(e) { OnSelect(e.currentTarget) }); }); body { font-family: Sans-Serif; } #searchPanel { background-color: white; z-index: 1000; position: fixed; width: 500px; overflow: auto; display: none; text-align: left } .hightlightTR { width: 100%; } .hightlightTR tr:hover { background-color: #479EC4; border: 1px blue outset; cursor: pointer; } .parametres td, .parametres th { padding: 5px; border: 1px solid black; } Sasha Omelchenko Общая схема примерно такая: ввод нескольких букв в поле → отправка данных на сервер аяксом→ поиск введенных данных на сервере по таблице → возврат данных на страницу. Так работала первая версия этой системы. На событие INPUT вешался обработчик, который каждый раз отправлял данные на сервер. Но из-за ввода данных в поле "залпом" сервер был завален большим количеством запросов. Потом была добавлена задержка на ожидание ввода (в 400 мс) перед отправкой данных. Так как таблица довольно большая, на формирование ответа уходит порядка 1-2 секунд (если под условие поиска подходит 1+ тыс. строк), что, согласитесь, довольно неприятно. Именно после этого было решено хранить заранее сформированный список в базе данных и обновлять его только при регистрации пользователей или обновлении их данных.


Ответы

Ответ 1



Добавлять на страницу такое количество данных и осуществлять по ним поиск при помощи js это действительно плохая идея с низкой производительностью. Выводите на страницу только результаты поиска. Общая схема примерно такая: ввод нескольких букв в поле → отправка данных на сервер аяксом→ поиск введенных данных на сервере по таблице → возврат данных на страницу.

Как объединить несколько списков в список словарей?

#python #python_3x #list #словари


Допустим, есть 3 списка:

names = ['A', 'B', 'C']
numbers = ['5','10','15']
colors = ['red','white','blue']


Как соединить эти 3 списка в словари вида:

{'name': A, 'number': 5, 'color': red}
{'name': B, 'number': 10, 'color': white}
{'name': C, 'number': 15, 'color': blue}

    


Ответы

Ответ 1



names = ['A', 'B', 'C'] numbers = ['5','10','15'] colors = ['red','white','blue'] keys = ['name', 'number', 'color'] zipped = zip(names, numbers, colors) dicts = [dict(zip(keys, values)) for values in zipped] print(dicts) # Напечатает: # [{'name': 'A', 'color': 'red', 'number': '5'}, # {'name': 'B', 'color': 'white', 'number': '10'}, # {'name': 'C', 'color': 'blue', 'number': '15'}]

Xamarin и ошибки компиляции

#c_sharp #visual_studio #visual_studio_2015 #xamarin


Я пользуюсь Xamarin for VS2015. Летом я установил Xamarin на личный компьютер. Там
до сих пор всё работает, там можно создавать приложения. Другое дело - рабочий компьютер.
Туда я установил Xamarin в октябре. И пошло-поехало... Начнём с того, что как только
я компилирую программу на каком либо устройстве, VS ждет, что-то делает, и говорит,
мол, что при сборке возникли ошибки. А окно ошибок ничего не показывает. 

Я думал, что проблема в эмуляторе( я бедное существо у которого нет смартфона). Поэтому
использовал прилагающийся эмулятор от Google. Не работало. Просто не запускалось, хотя
писало "Готово". После использования Nox Emulator, понял что просто код не так компилируется.
APK файл появился - но не работает.

И да... Всё это шаблон, начальный код. То есть после создания проекта я ничего не
менял. Не работает!

Что надо сделать, чтобы исправить проблему?
    


Ответы

Ответ 1



Бывают разные случаи. Когда такое возникает. Чаще всего. Достаточно удалить bin и obj в проекте. И проблема уходит. Проверяйте настройки проекта. Такие у меня настройки. Может стоять лишняя галочка предназначенная только для Release. Проверьте Advanced properties / Support architectures (для эмуляторов должны стоять галочки x86_64 и/или x86 В путях к sdk и ndk не должно быть русских символов Обновите sdk, ndk до последних версий. Если выше перечисленное не помогло. И Вы используете шаблонное приложение. Попробуйте переустановить sdk, ndk или обновить плагин для Visual Studio. Иногда помогает и это. Но это редкий случай. Не использовать эмуляторы Apache Cordova. Только от google либо Microsoft. Примерные действия. Которые мне помогают решать такую проблему. Которая периодически возвращается.

Ответ 2



На самом деле, ответ на вопрос нашёл самостоятельно, когда читал документацию к эмулятору... Заметим, что в каждом неудачном случае, я использовал слабые компьютеры. Поэтому, собственно говоря и возникла ошибка с эмулятором. Решение проблемы: купить смартфон и не мучаться.

Ответ 3



Не каждый смартфон будет работать,у меня на одном компе нормально эмуляцию делает,на другом просто беда,можно пробовать использовать разные эмуляторы,например есть эмулятор bluestack, у эмулятора от студии то-ли на 10,то-ли на 8ке бывают баги связанные с inteL HAXM к примеру.

C++ Определение физического расположения файла на диске

#cpp #winapi #файловая_система


Для начала, мне не даётся использование DeviceIoControl.
Говорит, что hFile неверный, хотя он не NULL. С какими атрибутами открывать?

ANDLE hFile = CreateFile(path,
    GENERIC_READ,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

RETRIEVAL_POINTERS_BUFFER rpb;
STARTING_VCN_INPUT_BUFFER startingVcn;
DWORD dwBytesReturned;
OVERLAPPED overlapped;

DWORD dwFragments = 0, dwTotalClusters = 0;

    // ...

    DeviceIoControl(hFile, 
        FSCTL_GET_REPARSE_POINT,
        &startingVcn, sizeof startingVcn,
        &rpb, sizeof rpb,
        &dwBytesReturned, &overlapped);

     // ... while(dwError == ERROR_MORE_DATA);


Далее алгоритм будет следующий:
Вызвать GetLastError и по коду ошибки определить дальнейшие действия.


Если это первая итерация и ERROR_HANDLE_EOF, значит файл резидентный, если не первая,
то выход из цикла.
Если NO_ERROR, файл занимает 1 фрагмент кластеров (т.е. все по-порядку, а не в разброс
по диску).
Если ERROR_MORE_DATA, есть ещё на диске фрагменты этого файла.


Таким образом, будем иметь список всех фрагментов файла на диске ввиде списка пар
StartLCN-ClustersLength.

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

Работать всё это должно под FAT, FAT32 и NTFS (с поддержкой SPARSE, COMPRESSED и
ENCRYPTED файлов).

Нужно это положение для программы безопасного удаления данных, т.е. потом я полученные
кластеры затру.
    


Ответы

Ответ 1



HANDLE hFile = CreateFile(lpFilePath, FILE_READ_EA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (hFile == INVALID_HANDLE_VALUE) { wcout << "Open file error: " << GetLastError() << endl; system("pause"); return -1; } PSTARTING_VCN_INPUT_BUFFER startingVcn = new STARTING_VCN_INPUT_BUFFER(); PRETRIEVAL_POINTERS_BUFFER prpb = new RETRIEVAL_POINTERS_BUFFER(); DWORD dwBytesReturned = 0; DWORD dwExtentNumber = 0, dwTotalClusters = 0; DWORD dwError; do { DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, startingVcn, sizeof *startingVcn, prpb, sizeof *prpb, &dwBytesReturned, NULL); dwError = GetLastError(); switch (dwError) { case ERROR_HANDLE_EOF: if (dwExtentNumber == 0) cout << "MFT Table..." << endl; else wcout << endl << "Total clusters: " << dwTotalClusters << endl << "Fragments: " << dwExtentNumber << endl; break; case NO_ERROR: wcout << "Fragment 0:" << endl << "\tStart LCN: " << prpb->Extents->Lcn.QuadPart << endl << "\tClusters: " << prpb->Extents->NextVcn.QuadPart - prpb->StartingVcn.QuadPart << endl << endl; wcout << "Total clusters: " << prpb->Extents->NextVcn.QuadPart - prpb->StartingVcn.QuadPart << endl << "Fragments: " << dwExtentNumber; break; case ERROR_MORE_DATA: wcout << "Fragment " << dwExtentNumber << ":" << endl << "\tStart LCN: " << prpb->Extents->Lcn.QuadPart << endl << "\tClusters: " << prpb->Extents->NextVcn.QuadPart - prpb->StartingVcn.QuadPart << endl << endl; dwTotalClusters += prpb->Extents->NextVcn.QuadPart - prpb->StartingVcn.QuadPart; startingVcn->StartingVcn.QuadPart = prpb->Extents->NextVcn.QuadPart; break; default: wcout << "DeviceIoControl error: " << dwError << endl; system("pause"); return -1; } dwExtentNumber++; } while (dwError == ERROR_MORE_DATA); CloseHandle(hFile); system("pause"); return 0;

Python matplotlib Построение гиперболы

#python #график #matplotlib


Добрый день! Хочу при помощи matplotlib построить, например, гиперболу. Есть следующий код:

import matplotlib.pyplot as plt
import pylab, math
xmin = -200
xmax = 200
dx = 0.1

xlist = [float(x) for x in range(xmin,xmax)]
ylist = [float(1/x) for x in range(xmin,xmax)]


ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.grid(True)
plt.title('График функции ')
pylab.plot(xlist,ylist)
pylab.savefig('123.png')


Пример работы на картинке
Как видно, между двумя ветвями функции есть отрезок. Я знаю, что это связанно с тем,
что есть значение крайних точек ветвей, а плот их соединяет. Но это мне не нужно, мне
нужно получить нормальный график. Если бы этот график был всегда гиперболой, было бы
нормально. Но этим графиком может быть любой график с разрывом. Как избежать этого
отрезка? Видел способы, но там использовались дополнительные пакеты(numpy), я не хочу
тянуть их в этот код
[]
    


Ответы

Ответ 1



Для начала повторюсь, что matplotlib уже внутри себя использует numpy, так что избежать его не выйдет. Тем не менее, вот первая версия без numpy в основном коде: import matplotlib.pyplot as plt import decimal # Это замена np.arange def arange(start, stop, step): while start < stop: yield start start += decimal.Decimal(step) hyperbola = lambda x: 1 / x def asymptote_checker(argument, function): try: function(argument) return True except ZeroDivisionError: return False xmin = -20 xmax = 20 dx = 0.1 xlist = [round(x, 4) for x in arange(xmin, xmax, dx)] ylist = [hyperbola(x) if asymptote_checker(x, hyperbola) else float('nan') for x in xlist] plt.plot(xlist, ylist) plt.show() С numpy выйдет покороче: import matplotlib.pyplot as plt import decimal import numpy as np xmin = -20 xmax = 20 dx = 0.1 xlist = np.around(np.arange(xmin, xmax, dx), decimals=4) ylist = 1 / xlist plt.plot(xlist, ylist) plt.show() Пара общих важных моментов для обеих версий: числа в xlist вместо нуля могут внезапно превратиться в мусор типа 7.0485345e-13 или типа того, что выльется в огромное значение по оси Oy. Второй момент - matplotlib игнорирует (и не соединяет точки) числа типа +inf, -inf, NaN - их можно пометить руками, доверить это numpy или использовать numpy masked array.

Sympy: найти только реальные корни уравнения (мнимые корни - проигнорировать)

#python #python_3x #sympy


Привет всем. Если я хочу решить уравнение с одной переменной, я делаю так:

x = sympy.symbols('x')
ans = sympy.solve(a)#Где а-строка с уравнением


Однако, часто значение такого уравнения имеют вид:

X1=-4 

X2=2 

X3=1 - sqrt(7)*I 

X4=1 + sqrt(7)*I


Но это еще нормально(На самом деле, не совсем, ближе ниже спрошу почему). 
А вот это не нормально:

X1=-1/4 - sqrt(-22/(9*(-95/108 + sqrt(3369)/36)**(1/3)) + 11/12 + 2*(-95/108 + sqrt(3369)/36)**(1/3))/2
- sqrt(-3/(4*sqrt(-22/(9*(-95/108 + sqrt(3369)/36)**(1/3)) + 11/12 + 2*(-95/108 + sqrt(3369)/36)**(1/3)))
- 2*(-95/108 + sqrt(3369)/36)**(1/3) + 11/6 + 22/(9*(-95/108 + sqrt(3369)/36)**(1/3)))/2 


А таких 4 корня...
Так вот, вопросы:
1)В первом примере, в 3 и 4-м корне есть символ I(После *). Что это за символ? Я
думал в сторону мнимой единицы(простите меня, математики). Но мне кажется, что это
не она. Что же это? 
2)Как можно избавиться от всего этого? От всяких I, всяких огромных корней... Можно
ли вывести примерное значение в sympy? 
Спасибо за время, потраченное на чтение поста
    


Ответы

Ответ 1



Попробуйте указать real=True: Все корни: In [10]: from sympy import * In [11]: x = symbols('x') In [12]: solve(Eq(x**4-(x-2)**2, 0), x) Out[12]: [-2, 1, 1/2 - sqrt(7)*I/2, 1/2 + sqrt(7)*I/2] Только реальные: In [13]: x = symbols('x', real=True) In [14]: solve(Eq(x**4-(x-2)**2, 0), x) Out[14]: [-2, 1] Альтернативное решение: # все корни In [23]: solve('x**4-(x-2)**2') Out[23]: [-2, 1, 1/2 - sqrt(7)*I/2, 1/2 + sqrt(7)*I/2] # выбираем только реальные корни In [24]: [r for r in solve('x**4-(x-2)**2') if r.is_real] Out[24]: [-2, 1] PS I - это мнимая единица, т.е. такое число, квадрат которого равен -1

Как поменять размер иконок в svg-спрайте?

#svg #svg_спрайт


Использую на проекте svg-спрайт. Спрайт собирал с помощью gulp и плагинов (gulp-svg-symbols,
gulp-svgmin, gulp-cheerio). Проблема в том, что при изменение размера иконки в CSS,
она изменяется в непонятных мне пропорциях. Я задал иконке width: 46px, но она не увеличилась
на 46px. На скриншоте видно, как поле вокруг иконки стало размером 46px, а сама иконка
нет. Как правильно контролировать размер иконок в svg-спрайте? 


Ссылка на картинку

Пример кода, который я использую:



.nav__icon-check {
  width: 46px;
  height: 46px;
  outline: 1px solid red;
}

  
     
  
  
   
  



   





Пример на codepan.
    


Ответы

Ответ 1



В общем-то, у вас при увеличении SVG-элемента иконка увеличивается, но она изначально не занимает всё полотно, потому это слабо заметно. Вам надо изменить значение viewbox-атрибута на, скажем "0 0 25 25". А дальше увеличивайте/уменьшайте иконку сколько душе угодно. .nav__icon-check { width: 100px; height: 100px; outline: 1px solid red; }

Как грамотно подойти к верстке сайта чтобы в дальнейшем было легко его масштабировать? [закрыт]

#html #css #вёрстка #архитектура


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Здравствуйте, собираюсь разрабатывать большой web проект городской, с большим количеством
функционала, но на первой стадии буду делать только верстку. 
Посоветуйте пожалуйста как распределить фалы JS css  и др., как лучше всего поделить
стили на библиотеки и т.д. Главная задача в том чтобы потом было легко все заменять
как модули.
Есть есть статьи по этому поводу напишите пожалуйста. 
    


Ответы

Ответ 1



В данной статье есть примеры разных подходов (архитектур), с их достоинствами и недостатками, по размещению css (в оригинале scss), js и других файлов в проекте. Примеры архитектур из статьи: Функциональное распределение Распределить функциональность на отдельные файлы. _mixins.scss _variables.scss Распределение «Катана» Разделить страницы на части и обозначить стили для каждой части индивидуально. /base /sections _header.scss _content.scss _footer.scss _sidebar.scss _modals.scss /menu _left.scss _right.scss _top.scss _bottom.scss Шаблонное или страничное распределение /base /templates _category.scss _footer.scss _header.scss _index.scss _page.scss _single.scss В терминах веб-дизайна Как и предполагает название, она предназначена для веб-дизайнеров. Не использовать папки. _normalize.scss _buttons.scss _footer.scss _grid.scss _header.scss _icons.scss _navigation.scss _typography.scss screen.scss И так далее... Это может вас натолкнуть на мысли по поводу своей архитектуры.

быстрый метод для создания анаграмм на JS без библиотек

#javascript


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

function listPosition(word) { 
 var arr = [word]; 
 var anagrams = {}; 
 arr.forEach(function(str) { 
 var recurse = function(ana, str) { 
  if (str === '') 
   anagrams[ana] = 1;
   for (var i = 0; i < str.length; i++)
   recurse(ana + str[i], str.slice(0, i) + str.slice(i + 1)); 
  }; 
   recurse('', str); 
}); 
  var result = Object.keys(anagrams); 
  return result.sort().indexOf(word) + 1; 
} 

console.log(listPosition('BOOKKEEPER'));

    


Ответы

Ответ 1



Для начала нужно научиться считать общее число анаграмм слова. Потом можно рекурсивно считать количество лексикографически меньших анаграмм. const fact = n => n<2?n:n*fact(n-1); const wordletters = word => word.split('').sort() .reduce((res,letter) => (res[letter]=(res[letter]|0)+1, res), {}); const objVals = obj => Object.keys(obj) .map(key => obj[key]); // Общее число всех анаграмм // n! / (n₀!*n₁!*n₂!*...nₖ!) const anaCount = word => fact(word.length) / objVals(wordletters(word)) .map(fact) .reduce((c, a) => c*a, 1); const anaIndex = word => { let count = 0; let letters = Object.keys(wordletters(word)).sort(); let index = letters.indexOf(word[0]); let lesser = letters.slice(0, index); // буквы меньшие первой lesser.forEach(letter => { // Считаем все, начинающиеся на letter let set = word.split(''); // исключаем letter set.splice(set.indexOf(letter), 1); count += anaCount(set.join('')); }); // рекурсия от слова без первой буквы if (word.length > 1) count += anaIndex(word.substr(1)); return count; }; console.log(anaCount('BOOKKEEPER')); // 151200 console.log(anaIndex('BOOKKEEPER')); // 10742 console.log(anaIndex('BOOKKEEPERMASTER')); // 10991405956 ES5

Готов ли ASP.NET Core MVC для продакшена? [закрыт]

#c_sharp #net #aspnet_mvc #aspnet_core #net_core


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Здравствуйте, вопрос к тем, кто уже работал с платформой ASP.NET Core MVC. Ранее
работал с ASP.NET MVC, однако сейчас приобрел по новой платформе литературу и планирую
после прочтения заняться разработкой на ней. Безусловно будущего никто не знает, но
я думаю общую картину уже можно обрисовать. На сколько сильно фремверк может претерпеть
изменений, что бы после нового релиза не пришлось переучиваться и переписывать проект?
На сколько сыра платформа? Как много подводных камней при работе с ней, если можно
- детальней? И вообще готова ли она к продакшену, например для разработки корпоративного
портала?
    


Ответы

Ответ 1



Я думаю, что ответ - Да. ASP.Core MVC готов для использования в продакшене. В качестве доказательства можно привести доклад Дениса Иванова из компании 2GIS на конференции DotNext 2017 (https://www.youtube.com/watch?v=ngcigr_8oxw) ASP.NET Core приложения под Linux в продакшене В качестве конспекта привожу выдержки из слайдов доклада. Сервис видеорекламы Требования: 99.99% доступности по миру время отклика 200ms Почему Linux: Существующая on-premise платформа -GitLab CI -CI starting kit на основе make -Docker hub & docker images Компоненты на любом технологическом стеке Kubernetes Поддержка принципа "12-ти факторного приложения" 1) Одно приложение - один репозиторий 2) Зависимости - вместе с приложением 3) Конфигурация через окружение 4) Используемые сервисы как ресурсы 5) Фазы билда, создания образов и исполнения разделены 6) Сервисы - отдельные stateless процессы 7) Port binding 8) Масштабирование через процессы 9) Быстрая остановка и запуск процессов 10) Среды максимально похожи 11) Логирование в stdout 12) Административные процессы .NET Core. Self-contained deployment Полный контроль зависимостей Явное указание платформы при билде (win10-x64 / ubuntu.14.04-x64 / osx.10.12-x64) Только необходимый фреймворк Вместо заключения Не бойтесь использовать .NET Core в продакшене Не бойтесь использовать Linux и .NET Core Docker и Kubernetes сильно упрощают жизнь Пишите эффективный код правильно

чем отличаются green threads, task-based parallelilism от native threads?

#многопоточность


Хочу уточнить некоторые моменты


Правильно ли я понимаю, что green threads это "эмуляция" нативных потоков с помощью
корутин? например, генераторы в python или javascript это green threads?
Правильно ли, что task-based параллелилизм это "эмуляция" потоков без создания своего
стека? Если да, то как такое с нуля реализовать (сама идея).


Буду рад ссылкам, проясняющим эти моменты, возможно я чего-то сам не нашел.

p.s. возможно стоит изменить вопрос: fiber отличается ли от концепции task-based
параллелизма?
    


Ответы

Ответ 1



green thread - это реализация потоков на уровне приложения. То есть, с точки зрения операционной системы их нет. Поэтому, когда операционная система делает планирование переключения потоков, она не выделяет на каждый из них время. Если один зеленый тред заблокируюется в системном вызове - все заблокируется. task-based параллелилизм - это когда мы создаем не треды (и мучаемся с их синхронизацией), а делаем мелкие задачи, которые приложение разбрасывает между тредами. Эти треды (потоки) входят в пул (набор) и их кол-во, запуск-останов полностью управляется приложением (фреймворком). При этом сами задачи об этом не знают. При мелких задачах можно получить хорошую производительность (относительно запуска потока на каждую мелкую задачу). Генераторы в питоне вряд ли являются зелеными тредами. Хотя, это все зависит от того, как это все понимать. Правильно ли я понимаю, что green threads это "эмуляция" нативных потоков вот если так оборвать - то все ок. корутины- это те же зеленые потоки. Но они могут быть и реальными потоками. Правильно ли, что task-based параллелилизм это "эмуляция" потоков без создания своего стека? нет. Это выполнение задач без понимая того, что есть вообще треды и сколько их. А при чем здесь стек - я не знаю. Может имелось ввиду стек потока?

С помощью чего писать игру на c#?

#c_sharp #разработка_игр


Всем привет. 

Я в программировании новичок и хочу сделать какую-нибудь примитивную 2d игру не на
unity, а с нуля, просто для себя (хочу изобрести велосипед). 

Так вот, на WinForms нашла такой способ: по таймеру постоянно повторяется перерисование
карты, карта рисуется в picturebox. Ну и сама карта - массив ячеек 300 на 300, в picturebox
легко можно в квадрате любого размера и в любом месте добавить картинку или залить
цветом. Так вот, оно то работает, карта рисуется и видно, как персонаж ходит, но я
понятия не имею, на сколько это рационально. Ну и есть WPF, где говорят, что окошки
рисуются с помощью видеокарты и все вроде бы круто и можно было бы там все сделать,
вот только picturebox там нету. А то, что есть, не подходит. 

Мне нужно, чтобы можно было создать цикл и внутри цикла высчитывать координаты и
размер квадрата, и в данном квадрате залить цветом или нарисовать определенную картинку.
Есть ли в WPF что нибудь, где можно так сделать? И рационально ли использовать WPF
для такого? Если нет, то где можно писать мелкие 2d игры (с нуля, не на готовом движке)? 
    


Ответы

Ответ 1



XNA - платформа для создания игр. Как и в предыдущих платформах для описания действий игры используется язык программирования (C# или VB). Отличий WinForms и WPF от XNA много. В вышеописанных платформах используется принцип реакции на событие, произошло событие - пишем действия, нет событий нет действия. В XNA же описывается игровой экран в конкретный момент исходя из неких переменных, которые меняются в зависимости от действий пользователя. Кроме того XNA в отличии от платформ для бизнес приложения можно запускать как на PC так и на приставке Xbox или телефоне с OC Windows. Максимально возможная поддержка 3D среди высокоуровневых API. Трехмерную игру писать лучше на этой технологии. //Я не могу не чего порекомендовать кроме C# XNA, ведь я знаком только с ним https://social.msdn.microsoft.com/Forums/ru-RU/4423aa62-8be0-4f56-b9eb-738c10ecd680/-3d-c?forum=msdnfeedbackru

“Множественное наследование” c#

#c_sharp #наследование


Есть иерархия классов, появилась ситуация в которой не могу придумать нормального
решения. (стрелками показано наследование, красным цветом - желаемое, но невозможное )

  

Классы U, S, A, W используют одну и ту же реализацию функции F

А классы SAI, AAI, WAI другую, но общую между собой. Именно это и не получается реализовать
так как нет возможности создать дополнительный класс AI реализовать в нем F  и тогда
наследоваться от него. Получается что придется просто копировать реализацию  F для
SAI, AAI, WAI, что есть плохо. 

Какой есть способ красиво решить эту проблему??

Спасибо!
    


Ответы

Ответ 1



Множественное наследование от нескольких классов невозможно. Используйте интерфейс IFunctionF и два вспомогательных класса F1 и F2, каждый из которых имеет свою реализацию IFunctionF. И далее от F1 и F2 наследуйте ваши семейства U,A,S,W от F1 и SAI, AAI, WAI от F2. public interface F { int F(); } class F1:F { public virtual int F() { return 2; } } class F2 : F { public virtual int F() { return 3; } } class S : F1 { void a() { F(); } } class AAI : F2 { void a() { F(); } }

Ответ 2



C# Extension methods (методы расширения) возможно помогут вам с переиспользованием кода (но, не факт, т.к. вы не сможете использовать приватные члены классов). Пример: Interface IFoo {} public static class IFooExtensions { public static int F(this IFoo foo) { //.... } } //........... int value = (myObj as IFoo).F();

Manifest placeholders для различных build variants

#android #gradle


Есть два продакт флэйвора:

productFlavors {
    demo {
        ...
    }

    full {
        ...
    }
}


и два билд тайпа:

buildTypes {
    release {
        ...
    }

    debug {
        ...
    }
}


Исходя из существующих продакт флейворов и билд тайпов получается четыре билд варианта:

demoRelease
demoDebug
fullRelease
fullDebug


Возможно ли для каждого из четырех билд вариантов в AndroidManifest.xml прописать
различные значения для некоторых атрибутов? Если возможно, то как? С помощью manifest
placeholders или как-то иначе?

Например, есть четыре API-ключа для какого-то сервиса и в зависимости от конкретного
билд варианта в AndroidManifest.xml нужно вставлять свой собственный ключ.



Сейчас у меня это реализовано с помощью отдельного strings.xml для каждого билд варианта,
но хотелось бы где-то в одном файле прописать API-ключи, а не создавать кучу дополнительных
файлов.

Интересует что-нибудь вроде этого решения (в первой части ответа).
    


Ответы

Ответ 1



У меня сделано это так (build.gradle): android { defaultConfig { applicationId "blah-blah" targetSdkVersion targetSdkVersionVar } productFlavors { honeycumb { minSdkVersion minSdkHoneycumb targetSdkVersion targetSdkHoneycumb } kitkat { minSdkVersion minSdkKitkat targetSdkVersion targetSdkVersionVar } } } Остальное прописано в манифестах src/main, src/honeycumb, src/kitkat

Ответ 2



Можно дополнить вариант, предложенный вами таким образом: build.gradle android { defaultConfig { manifestPlaceholders = [ apiKey:project.property('default.ApiKey') ] } } applicationVariants.all{ variant-> if (variant.productFlavors.get(0).name.equals("demo")) { if (variant.buildType.name.equals("release")) { manifestPlaceholders = [ apiKey:project.property('release.demo.ApiKey') ] } else { manifestPlaceholders = [ apiKey:project.property('debug.demo.ApiKey') ] } } else if (variant.productFlavors.get(0).name.equals("full")){ if (variant.buildType.name.equals("release")) { manifestPlaceholders = [ apiKey:project.property('release.full.ApiKey') ] } else { manifestPlaceholders = [ apiKey:project.property('debug.full.ApiKey') ] } } } AndroidManifest.xml gradle.properties (глобальный) Если его нет, то необходимо создать и расположить по пути /.gradle. release.demo.ApiKey="your_key" debug.demo.ApiKey="your_key" release.full.ApiKey="your_key" debug.full.ApiKey="your_key" default.ApiKey="your_key" Глобальный файл нужен только если код будет загружен в публичный репозиторий, так как он игнорируется системами контроля версий (актуально для библиотек). В противном случае можно использовать gradle.properties проекта. источник

Как закрыть интерфейс виртуалки?

#virtualbox


VirtualBox позволяет запустить виртуалку без интерфейса:



Но если я запустил её через обычный запуск, то можно ли потом перейти в вариант без
интерфейса? Закрытие окна подобного варианта не предполагает, да и в меню найти не могу.


    


Ответы

Ответ 1



Можно выполнить эту операцию в 2 шага, но возможны проблемы на втором шаге. Сохранить состояние машины vboxmanage controlvm the_machine savestate Запустить машину через headless (в фоновом режиме) vboxheadless --startvm the_machine Иногда машина может не загрузиться, по разным причинам)

Куда мне стремиться в изучении математики (с 1-го класса по…)? [закрыт]

#математика


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Извините, но много буков...(

Я бы хотел со временем подтянуть математику повыше школьной, но после школы начинается
сильное её разделение на концептуально разные направления. Поэтому я бы хотел просто
для общего познания стремиться к изучению чего-то одного, например мат.анализа (интегр.
и дифф. исчисления, calculus). Но так как я ещё смутно понимаю все задачи, которые
решаются математическим анализом, хотел бы уточнить.

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

Ну, например, начальная траектория даёт инфу для вычисления всей будущей траектории,
цикличность поведения объектов, восстановление прожженной дыры в фотографии или оборванный
фрагмент аудиозаписи, улучшение качества изображения в тёмное время (на основе похожего
фото в светлое время). Или, например, прогнозирование того, что скажет человек ещё
через N слов (или мог бы сказать, но... шутка).

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


Ответы

Ответ 1



Те задачи, которые вы описываете, сейчас чаще всего решаются машинным обучением, а там рулят матрицы и тензоры. Впрочем, это не столько "вычисление" поведения, сколько попытка предсказать его на основе повторяющихся характерных для объекта паттернов поведения. "Вычислением" поведения хоть сколько-нибудь сложных объектов мало где занимаются, слишком уж это неподъёмная задача. Для вычисления поведения относительно простых и хорошо формализованных систем действительно применяют дифференциальное и интегральное исчисление, но, как я уже сказал, этот подход можно применить далеко не всюду.

Как присвоить значение value в input`e? [дубликат]

#javascript #html


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Как изменить значение атрибута value в теге input?
                                
                                    (2 ответа)
                                
                        
                                Закрыт 2 года назад.
            
                    
Есть код:

$(document).ready(function() {

 \
                            \
                                \
                            \
 \

var sss = '\
               \
                  \
               \
               \
                  \
               \
           \';


Значение Value задал, но я его задал в самой функции $(document).ready(function(),
но как их задать вне функции?
    


Ответы

Ответ 1



Понял вопрос по-своему, не серчайте если не то: //Создаем отдельный файл Javascipt и запихиваем его в head //Создаем массив в JSON-стиле var myDetails = [ {name: "шина", price: "3500 руб 1шт", couple: "29500 руб за 10шт", image: "http://shina-lux22.ru/images/tire.png"}, {name: "фара", price: "2500 руб 1шт", couple: "23780 руб за 10шт", image: "http://www.kuzoff.ru/img/TYCAM04-000-L.jpg"}, {name: "стекло", price: "5000 руб 1шт", couple: "47800 руб за 10шт", image: "http://www.glass-cars.ru/images/brend/mitsubishi.jpg"}, {name: "сиденье", price: "10000 руб 1шт", couple: "94620 руб за 10шт", image: "http://www.kolenval.ru/announcement_pictures/0000/5995/00856F_400_3_large.jpg?1241495739"}, ]; //Перебираем в цикле $.each(myDetails, function(){ $("body").append("
\  + this.name +\ "+ this.name +"\ "+"Цена:"+ " "+ this.price +"\ "+"Оптом:"+ " "+ this.couple +"\
"); }); .detail img {width: 130px; height: 120px; display: block;} .detail span {display: block} Уже ближе, к тому, что вы хотели?