Страницы

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

вторник, 22 января 2019 г.

Как увеличить зону клика ссылки?

Использую ползунок (input type range).Дело в том, что по макету он в 1px и все идеально, только вот кликнуть по нему очень сложно, надо попасть в этом самый 1px. Можете, пожалуйста, посоветовать как увеличить его зону?


Ответ

Без кода, могу предложить добавить невидимый before(подкрасила цветом, чтобы видно было область, вам этот цвет просто убрать нужно):
.link { position: relative; display: block; margin:50px auto; height: 1px; width: 1px; background: pink; cursor: pointer; } .link:before { content: ''; position: absolute; display: block; top: -15px; left: -15px; right: -15px; bottom: -15px; background: rgba(255, 0, 0, 0.06);//цвет убрать }

Обработка множественных запросов на RxJava

Есть поле для вводе текста, допустим ищем пользователей по имени в БД. Есть метод (упрощенный), который выполняется при каждом наборе символа.
public void loadUsers(){ getUsers(mName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }
Проблема данного метода в том, что при быстром наборе текста вполне вероятна ситуация, когда ответ на предпоследний запрос пришел позже, чем на последний. Тогда отображаемые данные будут не соответствовать введенному тексту. Вопрос: как обработать запросы в том порядке, в котором выполнялись? Или, может быть, можно игнорировать предыдущие запросы? P.S. С использованием RxJava.


Ответ

Как вариант можно хранить Subscription и её сначала обнулять, а потом новый запрос слать. Типа как-то так (за названия методов не ручаюсь):
Subscription s;
public void loadUsers() { if(s != null && !s.isUnsubscribed()){ s.unsubscribe(); } s = getUsers(mName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(users -> { //отображение данных }, throwable -> { //обработка ошибки }); }

Посчитать количество элементов в jquery?

Мне нужно считать количество блоков в блоке с классом .blocks и в зависимости от их количества, создать столько же ссылок на эти элементы. Каждая ссылка будет скролить к соответствующему элементу.
Подскажите пожалуйста, как можно это реализовать? Буду очень благодарен.

1
2
3


Ответ

$('.blocks .section').each(function(index, element){ $(this).attr('data-block', index); $('.navigation').append('

  • Блок '+$(element).html()+'
  • ') }); $(document).on('click', '.navigation .scrollto', function(){ var block_id = $(this).attr('data-block'), block = $('[data-block="'+block_id+'"]:not(.scrollto)'); if (block.offset() !== undefined){ $('html, body').animate({ scrollTop: block.offset().top }, 1000, 'swing', function(){ // здесь код если надо что-то делать после прокрутки }); } return false; });
    1
    2
    3

    В данном случае не обязательно подсчитывать. Достаточно просто для каждого блока вставлять ссылку, т.е.
    $('.blocks .section').each(function(index, element){ $('.navigation').append('
  • Блок '+$(element).html()+'
  • ') });

    Обобщённый метод для чтения данных из файла

    Здравствуйте. Подскажите, как написать обобщённый метод чтения данных из файла. Например, в одном случае нужно считать строки, в другом - целые числа. Как написать метод типа такого:
    public static List readFromFile(Path pathIn, TypeValue typeValue){...};
    Корректен ли такой код:
    public static List readFromFile(Path pathIn, TypeValue typeValue){ try(Scanner in = new Scanner(pathIn)) { if (typeValue == TypeValue.typeInt) { List list = new ArrayList<>(); while (in.hasNextInt()) { list.add(in.nextInt()); } return list; } else { List list = Files.readAllLines(pathIn); return list; } } catch (IOException e){ return null; } }
    Здесь pathIn - путь к файлу с данными, typeValue - флаг для обозначения данных (Integer, String и т.д.). Смущает, что возвращается не параметризованный List. Как вообще решается задача чтения из файла, если формат данных может быть разным - Integer, Double, String и т.д.? Или следует писать для каждого типа данных свой код для чтения? Как-то громоздко тогда получается.


    Ответ

    Функционал из Java 8 Stream & Lambda позволяет передавать в метод функциональный интерфейс, который будет применен к потоку данных:
    public void start() throws IOException { Path path = Paths.get("test"); List resultStringList = readFile(path, Function.identity()); List resultIntList = readFile(path, Integer::parseInt); }
    public List readFile(Path path, Function func) throws IOException { return Files.lines(path) .map(func) .collect(Collectors.toList()); }
    }

    По каким критериям в Java строка попадает в пул строк?

    По сути этот вопрос продолжает другой вопрос
    Во многих статьях говорится, что при создании строк без new через литерал строка попадает в пул строк. В противном случае необходим метод intern. Как тогда объяснить поведение ниже ?
    String s2 = "hello"; String s1 = "hello"; System.out.println(s1 == s2); // true
    System.out.println("hel" + "lo" == "hello"); // true
    s1 = "hello"; s2 = "hel"; String s3 = "lo";
    System.out.println(s1 == s2 + s3); // false System.out.println(s2 + s3 == "hel" + "lo"); //false
    Если в последнем случае s2 ссылается туда же куда и литерал "hel", и с s3 такая же история, то почему "hel" + "lo" не равно (по ссылке) s2 + s3 ?


    Ответ

    Строка может попасть в пул констант в двух случаях:
    На этапе компиляции.
    Компилятор проходит по всем строкам в исходном коде и добавляет их в пул констант. Если в коде есть какие-то места, в которых нужны вычисления и компилятор может их произвести, то он делает это. В Вашем примере это System.out.println("hel" + "lo" == "hello");. Сконкатенировал "hel" + "lo" и положил в пул.
    Вызов String.intern()
    Описание метода (ссылка на документацию). Здесь надо обязательно указать границы применения данного способа. Данный методы выглядит очень заманчиво: "мы можем сократить использование памяти, и производительность в програме!! Это громадная оптимизация!!"
    Из intern пула НЕ возможно удалить данные intern медленнее чем реализация (через ConcurrentHashMap, например) интернирования. Потому что во внутренней таблице (в которой хранятся интерниованные строки) всего около 60 000 бакетов и большОе количество строк может забить эти бакеты. Покачто эта Map не ресайзится. intern может влиять на работу всей JVM так как таблица используется для хранения информации о классах
    Если мне не верите, то Алексею Шипилеву должны поверить (про intern с 32 минуты).

    VS 2017. Повторный build проекта

    После полного build solution, повторный build один проект пересобирает. Из за чего такое может быть?


    Ответ

    Потому что в файле проекта была строчка
    Always

    Практическая разница между Linq To Entites и Linq To Objects

    Изучая различия между LINQ To Entites и LINQ To Objects в EntityFramework - столкнулся с интересной вещью :
    var phones = db.Phones.Where(p=> p.CompanyId == 1).ToList().Where(p=> p.Id<10);
    Здесь используются два метода Where, но их реализация будет различной. В первом случае, db.Phones.Where(p=> p.CompanyId == 1) транслируется в выражение SQL, которое было рассмотрено выше. Далее метод ToList() по результатам запроса создает список в памяти компьютера. После этого мы уже имеем дело со списком в памяти, а не с базой данных. И далее вызов Where(p=> p.Id<10) будет обращаться к списку в памяти и будет представлять Linq to Object.
    И мне стало интересно : А не проще ли просто получать нужное значение из БД путем простого обращения через LINQ не используя при этом LINQ To Objects?
    Ведь запрос в даном случае будет выглядеть так :
    var phones = db.Phones .Where(p => p.CompanyId==1 && p.TelephoneId<10)
    Хотелось бы узнать какой подход в данном случае будем эффективней и почему?


    Ответ

    Смотрите. Базы данных предназначены, кроме всего прочего, и для того, чтобы быстро и эффективно работать с большими объёмами данных. Например, базы данных легко справляются с выборкой из таблиц, больших по размеру, чем оперативная память. А вот получение целой такой таблицы в память с целью последующей фильтрации уже провалится по перерасходу памяти.
    Также и фильтрация в базе данных может быть очень быстрой, т. к. если у неё есть индекс на фильтруемое поле, она может совместить фильтрацию с выборкой. (А особо умные базы данных могут, исходя из запросов, такой индекс и выстроить сами.) Если индекса нет, то всё равно польза от фильтрации на стороне базы в том, что выброшенные фильтром данные не нужно перегонять из базы в программу, и не нужно создавать их в основной программе только для того, чтобы тут же выбросить.
    Поэтому обычно имеет смысл те части запроса, которые можно выполнить в базе данных (это та часть, при которой вы остаётесь в рамках IQueryable), выполнять на ней.
    (Я не уверен, относится ли эта рекомендация к вложенным подзапросам, пускай лучше специалисты по базам данных поправят меня.)
    К сожалению, скорость операций на базе данных имеет и обратную сторону: не все операции можно выполнить на базе данных, поэтому промежуточные результаты запроса приходится материализовать (то есть, получать из базы и загружать в память), используя ToList или AsEnumerable, и «дорабатывать напильником» в самой программе.

    «Умения» различных баз данных отличаются между собой. Обычно база данных должна уметь фильтровать не только по равенству поля значению, но и уметь сравнивать с константой. Судя по всему, либо вам попался код для менее продвинутой базы данных (да, абстракции протекают), либо автор кода ошибся. Либо это «костыль» под какой-нибудь баг. Если сравнение возможно выполнить на базе данных, его стоит именно там и выполнять.

    Как переписать Template deduction guide (С++17) на C++14?

    Дан код на С++17:
    template struct Ok { T value; }; template<> struct Ok {};
    // template deduction guides template Ok(T) -> Ok;
    Template deduction guides позволяют имея тип Ok вызывать Ok как функцию (так выглядит, на самом деле вызывается конструктор):
    auto c = Ok(5); // T deduced as int // без template deduction guide я так писать не могу, // но должен писать: auto c = Ok(5); // T can not be deduced :(
    Вопрос в том, как это переписать на С++14 или ниже? Чтоб я писал просто:
    auto c = Ok("hello"s); // T deduced as std::string
    Но с произвольным типом.


    Ответ

    template Ok> makeOk(T&& arg){ return Ok>{std::forward(arg)}; }
    auto c = makeOk(5); auto d = makeOk(std::make_unique(6.7));

    Ошибка подключение к БД в symfony

    Вылил сайт на хостинг и появилась ошибка подключения к базе данных.
    You have requested a non-existent parameter "database_name". Did you mean one of these: database
    Локально всё работает нормально. В чём может быть ошибка?


    Ответ

    Скорее всего неправильно задан конфиг в parameters.yml либо в config.yml.
    в parameters.yml добавьте:
    parameters: database_host: YOUR_HOST database_port: 3306 database_name: DB_NAME database_user: DB_USER database_password: DB_PASS
    а в config.yml добавьте подключение к доктрине
    doctrine: dbal: default_connection: default connections: default: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8

    Что такое статический полиформизм?

    Наткнулся на такой термин - "статический полиформизм". Не знал про такое сочетание. В гугле особо ничего не нашел.
    Кто бы мог дать обьяснение термина + пример?


    Ответ

    Этим умным словосочетанием обозначают обычную перегрузку методов. Не ту, что имеет место в классах-наследниках, помечаемых словом override, а что-то наподобие:
    class Foo { public void some() { // какой-то код }
    public void some(int parameter) { // какой-то код } }

    Правильное выполнение запроса RxJava+Retrofit

    Здравствуйте. Недавно начал разбираться с RxJava. Что-то тяжело пока дается... Есть сервер на котором есть приватные чаты(тет-а-тет) и групповые. Посредством Rest запроса на сервер нужно выудить следующую инфу оттуда: Все существующие чаты и диалоги:
    Observable> chats = apiService.getChats(); Observable> dialogs = apiService.getDialogs();
    Объекты Chat и Dialog содержат переменные:
    int unreadMessagesCount (количество непрочитанных сообщений); int id (по этому id запрашивается список сообщений из чата)
    Запросы на список сообщений
    Observable> dialogMessages = apiService.getDialogMessages(String id); Observable> chatMessages = apiService.getChatMessages(String id);
    Как в этом случае более грамотно составить запросы используя RxJava, чтобы опросить все чаты и диалоги на предмет новых сообщений и затем получить эти сообщения в один список?


    Ответ

    Например как-то так:
    Получаем массив чатов. Преобразуем массив оных в очередь объектов Chat Получаем детали каждого. Результат преобразовываем обратно в массив:.

    apiService.getChats() .from(Observable::from) .flatMap(chat -> apiService.getChatMessages(chat.id)) .toList() .subscribe(System::out);
    Если без лямбд, то from(Observable::from) можно переписать вот такой ужасной конструкцией:
    .flatMap(new Func1, Observable>() { @Override public Observable call(List chats) { return Observable.from(chats); } })

    Отправка header методом POST PHP (замена xhr.setRequestHeader) [закрыт]

    Можно ли как то перевести это в PHP, если да то подскажите пожалуйста как?
    function request(func, params, onSuccess) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://FF2:7000/$gate/request', true); xhr.setRequestHeader("pro-verba-esb-queue", "IM"); xhr.setRequestHeader("x-function", encodeURI(func)); xhr.onreadystatechange = function() { if (this.readyState != 4) return; if (this.status != 200) { alert( 'ошибка: ' + (this.status ? this.statusText : 'запрос не удался') ); return; } onSuccess(this.responseText); } xhr.send(JSON.stringify(params)); }


    Ответ

    Воспользуйтесь curl
    $url = 'http://FF2:7000/$gate/request';
    $headers = array( 'pro-verba-esb-queue: IM', 'x-function: '+encodeURI(func) );
    $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;

    Запустить java файл с кастомной версией java

    Добрый день. У меня имеется некий сервер на Debian на котором я запускаю некие Java файлы. Для их запуска используется Java, которая уже установлена в систему. Собственно вопрос в том, а могу ли я скачать другую версию Java в какую-то папку и уже запускать мои файлы не с помощью системной версии Java, а с той, которую скачали отдельно? Если да - то какой командой. Спасибо


    Ответ

    Да, разумеется можете. Допустим, вы запускаете файл с помощью системной java так:
    java -jar myapp.jar
    тогда если скачав другую версию, например в директорию /home/user/downloads/jdk/ вы можете запускать свой файл так:
    /home/user/downloads/jdk/bin/java -jar myapp.jar

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

    К примеру есть вот такая строка: String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession."
    Мне надо разбить её на слова, удалив при этом все знаки препинания и спецсимволы, а слова поместить в список.
    ArrayList words = new ArrayList<>(); String word = text.replaceAll(",", " "); - тут, насколько я понимаю, надо делать регулярное выражение ? Или можно без него удалить знаки препинания и спецсимволы ?


    Ответ

    Можно разбить строку с помощью регулярного выражения.
    String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession."; String[] results = text.split("\\W+"); System.out.println(Arrays.toString(results)); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession]
    Чтобы \\W+ "понимал" Юникод, добавьте (?U) перед регулярным выражением (чтобы не удалялись русские и другие буквы), "(?U)\\W+"
    Обратите внимание, что \\W+ не найдёт знака подчёркивания _ и если его надо найти, используйте "[\\W_]+"
    См. демо онлайн
    Можно найти все буквы Юникода (\p{L}) и ASCII-цифры ([0-9]) с помощью
    String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession. И ещё..."; Pattern pattern = Pattern.compile("[\\p{L}0-9]+"); Matcher matcher = pattern.matcher(text); List result = new ArrayList<>(); while (matcher.find()){ result.add(matcher.group(0)); } System.out.println(result); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession, И, ещё]
    Ещё одно Java-демо

    вопросы по поводу работы с жесткими дисками в linux

    Здравствуйте, читаю "Системное программирование" Роберта Лава, он пишет про fsync(), O_SYNC, но не понятно о назначении этих функций...
    Где необходимы вызовы этих функций? Если б это было нужно всегда, то синхронизация бы была по дефолту установлена. Цитата из книжки.
    Налицо огромное увеличение издержек, поэтому синхронизированный ввод-вывод следует использовать только при отсутствии альтернатив. Со сколькими параллельными операциями ввода / вывода может работать жесткий диск? Ну т.е. хочу я в 1000 нитях параллельно читать или писать в разные файлы на диске, будет ли толк, или начнет всё тормозить (имеется ввиду не из-за переключения контекста, а из-за каких-то причин с самим диском)?


    Ответ

    fsync и его подвиды требуются, когда приложение хочет получить гарантию, что данные уже записаны на физический диск, а не будут записаны на диск.
    Впрочем, начну лучше со второго вопроса:
    со сколькими параллельными операциями ввода/вывода может работать жесткий диск?
    С одной. Потому что внутри HDD только один блок головок чтения-записи. И из-за ограничений физических законов нашей вселенной этот блок может одновременно находиться только над одним местом магнитного диска.
    И следующее механическое ограничение - магнитные диски вращаются с постоянной скоростью, а читать-писать можно только в одном месте. Значит если мы хотим прочитать сектора в разных местах диска нам требуется:
    спозиционировать на эту дорожку блок головок чтения-записи дождаться, пока требуемый сектор не окажется под головкой
    Простым математическим подсчётом получаем механический предел в 120 операций в секунду для 7200 rpm дисков (с частотой вращения 7200 оборотов в минуту). Будет меньше операций если надо читать с разных областей диска, т.к. перемещение магнитной головки штука медленная мало того из-за того что механическая операция но должна осуществляться точно (речь о микрометрах), так ещё и в условиях вибрации от собственно самого диска и всех прочих вибраций. Как итог вполне можно попасть не на ту дорожку и придётся перепозиционировать головки ещё раз.
    Но зато можно успеть прочитать больше данных, если они идут последовательно в секторах одной дорожки.
    В общем, механический диск - штука крайне медлительная и прогресс CPU и оперативной памяти (не имеющих механический частей и потому значительно более быстрых) в прошлом тысячелетии потребовали вводить всевозможные ухищрения. В частности, операционные системы начали кешировать операции чтения и записи данных в неиспользуемых в данный момент выполняющимися программами областях оперативной памяти. И если с чтением всё просто - точно такая же копия лежит в энергонезависимой памяти механических дисков - то с кешированием записи как-то печальнее. Операционная система отвечает приложению "данные записаны", а на самом деле они размещены в оперативной памяти и будут записаны когда-нибудь чуть позже, может через несколько секунд. И это замечательно работает и ускоряет все операции с дисков. Вот только при критическом сбое системы (например по питанию) данные будут потеряны.
    И чтобы дать приложениям возможность попросить систему именно записать какие-то данные в энергонезависимую память и добавили вызов fsync, который синхронизирует кэш записи с дисками.

    Повторюсь - для механических дисков позиционировать головки операция очень медленная. Поэтому если вы начнёте читать-писать с механическим диском с 1000 потоков - это будет бесконечно долго. При том, ситуацию для вас всеми своими силами постараются сгладить и планировщики ввода-вывода и кэширование файловых операций. Из-за позиционирования головки механические диски могут давать неплохую производительность на последовательных операциях, но производительность случайных операций у механики удручающая.
    Но, к счастью, за последние лет 10 сильно подешевела flash-память и появились SSD диски. Дисками их называют только по привычке, на самом деле никакой механики там уже нет. И параллельная обработка запросов (пусть и за счёт обращений к разным кристаллам памяти) и куда более внушительная производительность по метрике количества операций в секунду (iops) - всё возможно. И, вероятно, со временем будут пересмотрены в сторону упрощения и планировщики ввода-вывода (собственно blk_mq в ядре linux уже) и упрощены другие нагромождения этих десятилетий когда для хранения данных использовалась медлительная механика. У flash-памяти своих интересных фокусов тоже хватает (например, есть не 2 операции чтение и запись, а чтение, стирание, запись - запись возможна только в предварительно очищенную страницу. Отсюда выросла необходимость в команде trim) - но это уже тема отдельных изысканий.

    Упрощение sql запроса с подзапросами. Oracle

    Здравствуйте. Нужно упростить запрос но пока что не как не могу понять как это сделать. Идея в том что бы все вложенные селекты переписать в джоины. ПОдскажит пожалуйста как это сделать. Вот мой запрос.
    select weight from myTableData where port = (select port from myTableDict where Name = 'название') and date = ( select max(date) from myTableData where port = (select port from myTableDict where Name = 'название'));
    Это пример моего запроса. Надеюсь всё расписал достаточно понятно. Если нет то пишите объясню. Нужно сделать вместо селектов вложенных, джоины не могу пока что понять как именно это сделать.
    План запроса:
    udp_port это port, w это myTableData, s это myTableDict. Собстенно в таблице WEIGHER_DATA, 31 милион записей с небольшим. На ней есть 2 индекса. На поле upd_port и на поле insert_date которое я подписал в примере как date. Стоимость запроса почти под 56 тысяч как по мне многовато. С этой информацией можно как то упростить и понизить стоимость запроса?


    Ответ

    select max(weight) keep (dense_rank last order by M.port,M.date) from myTableData M, myTableDict D where D.Name='название' and M.port=D.port
    Конструкция KEEP дает значение поля weight для последней (dense_rank last) записи в порядке сортировки по дате. т.е. значение на максимальную дату. JOIN сокращен до запятой и параметры из ON перенесены в where.

    Переопределение имени глобальной переменной

    Почему оно работает? Слышал об предварительном объявлении, но это явно другой случай. Или в чистом виде UB?
    Сам код на IdeOne
    #include using namespace std; const int x = 5;
    int main(){ int x[x]; cout << "OK!" << endl; return 0; }


    Ответ

    Нет, это не UB. Согласно стандарту, раздел 6.3.2, клауза 2 упоминает в точности ваш пример:
    const int i = 2; { int i[i]; }
    В нём определяется массив из двух целых чисел внутри блока.

    Полная цитата из стандарта (перевод мой):
    Точка декларации имени находится непосредственно за её полным декларатором (...) и перед инициализатором (если он есть), за исключением замечаний ниже. [ Пример:
    unsigned char x = 12; { unsigned char x = x; }
    Здесь второй x инициализируется своим собственным (неопределённым) значением. — конец примера ] [ Замечание: Имя из внешней области действует вплоть до точки декларации имени, которое его перекрывает. [ Пример:
    const int i = 2; { int i[i]; }
    определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

    Button не отжимается после выполнения Command

    Иногда кнопка после выполнения команды не становится активной. Помогает клик по форме. Скажете пожалуйста в чем может быть проблема?

    XAML: