Существует ли какой-то html-тег для этого, или можно дать блоку какой-то класс для обозначения "главного" текста на странице? Проблема в том, что на каких-то страницах моего сайта браузер дает возможность просмотреть статью в режиме чтения, а на каких-то нет. Взять тот же Хабр, в этой статье кнопка появляется, а в этой нет.
Ответ
Ответ прост - соблюдать семантику в HTML-разметке. Рекомендую прочитать про HTML5-теги. Согласно его стандартам, основной текст на странице нужно помещать в Тег article. Как это реализовано, можно посмотреть на примере моей последней работы. Там реализована семантическая разметка и сайт отлично читается на мобильном Safari. На Windows не проверял, но скорее всего там принцип работы идентичный.
Здравствуйте. Постараюсь объяснить ситуацию на пальцах: есть страница, на которой можно посмотреть список всех заказов (и провести поиск среди них). У каждого заказа имеется несколько характеристик, в том числе и идентификтора заказчика. Для облегчения поиска по заказчикам, под полем ввода имени появляется ниспадающий список со всеми заказчиками. Чтобы сделать систему максимально быстрой, список отдается пользователю при загрузке страницы в виде 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("
Sasha Omelchenko
Общая схема примерно такая: ввод нескольких букв в поле → отправка данных на сервер аяксом→ поиск введенных данных на сервере по таблице → возврат данных на страницу.
Так работала первая версия этой системы. На событие INPUT вешался обработчик, который каждый раз отправлял данные на сервер. Но из-за ввода данных в поле "залпом" сервер был завален большим количеством запросов. Потом была добавлена задержка на ожидание ввода (в 400 мс) перед отправкой данных. Так как таблица довольно большая, на формирование ответа уходит порядка 1-2 секунд (если под условие поиска подходит 1+ тыс. строк), что, согласитесь, довольно неприятно. Именно после этого было решено хранить заранее сформированный список в базе данных и обновлять его только при регистрации пользователей или обновлении их данных.
Ответ
Добавлять на страницу такое количество данных и осуществлять по ним поиск при помощи js это действительно плохая идея с низкой производительностью. Выводите на страницу только результаты поиска. Общая схема примерно такая: ввод нескольких букв в поле → отправка данных на сервер аяксом→ поиск введенных данных на сервере по таблице → возврат данных на страницу.
Я пользуюсь Xamarin for VS2015. Летом я установил Xamarin на личный компьютер. Там до сих пор всё работает, там можно создавать приложения. Другое дело - рабочий компьютер. Туда я установил Xamarin в октябре. И пошло-поехало... Начнём с того, что как только я компилирую программу на каком либо устройстве, VS ждет, что-то делает, и говорит, мол, что при сборке возникли ошибки. А окно ошибок ничего не показывает. Я думал, что проблема в эмуляторе( я бедное существо у которого нет смартфона). Поэтому использовал прилагающийся эмулятор от Google. Не работало. Просто не запускалось, хотя писало "Готово". После использования Nox Emulator, понял что просто код не так компилируется. APK файл появился - но не работает. И да... Всё это шаблон, начальный код. То есть после создания проекта я ничего не менял. Не работает! Что надо сделать, чтобы исправить проблему?
Ответ
Бывают разные случаи. Когда такое возникает.
Чаще всего. Достаточно удалить bin и obj в проекте. И проблема уходит.
Проверяйте настройки проекта. Такие у меня настройки. Может стоять лишняя галочка предназначенная только для Release.
Проверьте Advanced properties / Support architectures (для эмуляторов должны стоять галочки x86_64 и/или x86
В путях к sdk и ndk не должно быть русских символов
Обновите sdk, ndk до последних версий.
Если выше перечисленное не помогло. И Вы используете шаблонное приложение.
Попробуйте переустановить sdk, ndk или обновить плагин для Visual Studio. Иногда помогает и это. Но это редкий случай.
Не использовать эмуляторы Apache Cordova. Только от google либо Microsoft.
Примерные действия. Которые мне помогают решать такую проблему. Которая периодически возвращается.
Для начала, мне не даётся использование 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 файлов). Нужно это положение для программы безопасного удаления данных, т.е. потом я полученные кластеры затру.
Добрый день! Хочу при помощи 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), я не хочу тянуть их в этот код
[]
Ответ
Для начала повторюсь, что 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
Привет всем. Если я хочу решить уравнение с одной переменной, я делаю так: 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?
Спасибо за время, потраченное на чтение поста
Ответ
Попробуйте указать 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