Страницы

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

вторник, 12 марта 2019 г.

Во скольких вкладках открыт сайт?

Как проверить, во скольких вкладках открыт сайт? Чтобы можно было избежать высокой нагрузки на сервер, если например на сайте каждые пару секунд идут несколько запросов на сервер. Скажем у человека открыто 10 вкладок, но пользуется только 1. А в итоге еще 9 отправляют 5 запросов на сервер каждые 2 секунды, хотя толку от этого нет.


Ответ

Из комментариев нашел наиболее правильное решение для моей задачи.
Использование Page Visibility API
document.hidden
Если вкладка видна, то следует выполнять обновление страницы, если не видна то нет смысла в обновлении. Количество вкладок значение не имеет. Это подходит для онлайн редактора, когда нужно регулярно проверять не изменил ли кто нибудь документ который ты сейчас редактируешь, но важно не посылать по 20 запросов с 20 открытых вкладок.
Решения на базе onfocus и onblur имеют много недостатков. Один из них это например работа с 2 мониторами, мы открыли вкладку, переключились в другое окно, но всё еще видим нашу вкладку, однако потеряв фокус она перестала обновляться, хотя всё еще видна, и не факт что содержит самые последние сведения. Если надо и видимую вкладку замораживать, то тут уже придется вешать разные события, чтобы точно убедиться в "активности" пользователя.

Windows-сервис для мониторинга папки и загрузки файлов в БД

Стоит задача разработать сервис, который будет использовать в качестве входа папку на локальном диске и при появлении в ней файлов, сервис должен осуществлять их парсинг, после чего полученные данные укладывать в БД. Нюанс в том, что файлы приходят "парами" (01012015.xml + 01012015.txt), и скидываются в папку круглосуточно по FTP. Разрабытываю Windows Service (C#).Пытался итеративно (каждую секунду) вызывать метод EnumerateFiles в папке, группировать их, затем парсить и полученные данные укладывать в БД. Однако в результате периодически выскакивают исключения (либо файл ещё не польностью загружен через FTP, либо к нему нет пары и т.п.). При добавлении многопоточности ошибок ещё больше. Интересует, существуют ли какие-либо готовые решения на такой случай?


Ответ

У меня была аналогичная задачка.
В основном потоке программы делаете интерфейс и управление.
Сканирование папки с данными можно оставить в 1 служебном потоке - все равно все ограничивается "однопоточным" I/O (и соответственно только в нем решать изолированный вопрос сканирования папки). А вот укладчики в БД сделать воркерами, которых создать, например штук N и которым раздавать данные.
Я бы поколдовал с попыткой открытия файла на запись (или, как подсказывают, FileAccess.Read, FileShare.Read). Пока он не загружен, ОС такого доступа к нему не даст. (тут могут быть и более правильные решения). И так же проверять парность. И только тогда добавлять файлы в список "для обработки", из которого разбирать их воркерами (с использованием крит.секции).

Не проходит запрос к БД при авторизации PHP + MSSQL

Столкнулся со следующей проблемой: не проходит запрос БД. Данные получаю с форм посредством AJAX (запаковываю в JSON и отправляю на сервер). Далее, используя PDO в PHP подключаюсь к MSSQL, где находится БД. На сервер данные приходят, а к БД запрос не выполняется.
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { print("Couldn't connect to the database".$e->getMessage()); }
$user = json_decode($_REQUEST['user']);
$user->password = hash('md5', $user->password);
$query = $db->exec("SELECT * FROM dbo.Users WHERE Login = '".$user->login."' AND Password = '".$user->password."'") or die("Query error"); var_dump($query); if ($query==1) { $cookie_name = $user->login; $cookie_value = $user->password; setcookie($cookie_name, $cookie_value, time() + 3600); }?>
Подскажите, пожалуйста, что делать. Пытался использовать одинарные кавычки для переменных и функцию query(), которая возвращает строку запроса.


Ответ

Проблему решил использованием функции prepare()
$query = $db->prepare('SELECT * FROM dbo.Users WHERE Login = ? AND Password = ? ') or die("Query error"); $query->execute(array($user->login, $user->password)); $res = $query->fetchAll();
if ($user->login == $res[0][1] && $user->password == $res[0][3]) { $cookie_name = $user->login; $cookie_value = $user->password; setcookie($cookie_name, $cookie_value, time() + 3600); } var_dump($res);

Recyclerview не растягивается при освобождении места в layout несмотря на match_parent

Ломаю голову и рою гугл уже несколько дней, не могу понять, по какой причине recyclerView не растягивается при появлении свободного пространства.
Задача такая: при прокрутке списка (recycler) вниз на хотя бы 1 элемент, view-элементы над списком "ужимаются" и дают дополнительное место для списка. "Ужимаю" я их с помощью анимации и библиотеки expectAnim. Привожу ниже xml layout'а, а так же скрины проблемы и фрагмент кода анимации.

















А вот как это выглядит в результате:

При этом не суть важно, если ресайкл перемещается вслед за линией, например, то такое же пространство у него появляется ПОД ним.
А как заставить его растягиваться? Пробовал и setHasFixedSize(false), и получать layout и через params.height задавать значение, а после requestLayout() дёргать. Но всё без толку.
Может быть я вообще не под тем углом смотрю на задачу?


Ответ

На всякий случай отвечу на собственный вопрос, мало ли кто столкнётся с похожей проблемой. Проблема была в том, что проанимированные элементы не исчезали (GONE), а... не знаю даже, что там с ними библиотека делала. Похоже, что просто оставляла за пределами видимой части экрана.
После проигрывания анимации ставлю им View.GONE, и делаю LinearLayout resize для RecyclerView - всё работает.
Правда, появились доп. проблемы, как то, что при увеличении ресайкла "вверх", список в нём надо прокручивать (через вызов scrollToPosition). Но это уже мелочи.

Вывод данных в консоль, с ее очисткой

Доброго дня, коллеги. Есть один код, который выводит в консоль таблицу случайных булевых значений. Все бы ничего, но мне нужно, чтобы значения не выводились потоком, одно за другим, а изменялись в реальном времени. Те по аналогии с часами в консоли: время должно не писаться в новой строке с каждой новой секундой, а должно находиться, и обновляться в изначальной.
boolean[][] dots = new boolean[5][5];
Random randomBoolean = new Random();
//Now i want to create a table with random boolean values //Eternal loop for (;;) { try { Thread.sleep(500); for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { dots[i][j] = randomBoolean.nextBoolean(); System.out.print(dots[i][j] + "\t"); } //Close the column System.out.println(); } System.out.println(); } catch (InterruptedException e) { }
}
Что и куда мне нужно для этого добавить? Спасибо


Ответ

Сама Java очищать консоль не умеет. Но есть небольшая библиотечка, позволяющая отправлять управляющие последовательности в любую ANSI-совместимую консоль - Jansi
import java.util.Random; import org.fusesource.jansi.AnsiConsole;
public class Main { public static void main(String[] args) { AnsiConsole.systemInstall();
Random randomBoolean = new Random();
for (;;) { System.out.print("\u001b[2J"); System.out.flush();
try { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(randomBoolean.nextBoolean() + "\t"); } System.out.println(); } System.out.println();
Thread.sleep(500); } catch (InterruptedException e) {} } } }

Оптимизация запроса с подзапросом в Oracle

Здравствуйте. Есть запрос. Отрабатывает в sql-developer 60 секунд. Второй раз запускаю 8 секунд, 3 раз 3.5 секунды. Кэшируется вообщем. Минут через 10 та же история. Наверное за это время кэш падает. Когда этот запрос первый раз выполянется из кода c# на строчке rdr.Read() вообще выполняется минут 5-10 rdr - OracleDataReader. Не понимаю что ещё можно упростить в запросе. Всё и так проиндексировано кроме поелей edit_state и primary_date. Вообщем вот запрос и explain plan к нему.
SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 AND ( SELECT STRING_VALUE FROM journal_field_data f WHERE r.id = f.journal_record_id AND field_name = 'SERTIF_NUMB' ) = :SERTIF_NUMB ORDER BY r.PRIMARY_DATE DESC;

Если я правильно понял то там где написано full очень много занимает памяти, но там всё проиндексировано. И я немного не понимаю но неужели order by весит ещё больше? Подскажите пожалуйста что тут можно сделать. Я уже даже не знаю что попробовать.
UPD Исправленный вариант запроса:
SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r LEFT JOIN journal_field_data f ON r.id = f.journal_record_id WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 AND field_name = 'SERTIF_NUMB' AND f.STRING_VALUE = :SERTIF_NUMB ORDER BY r.PRIMARY_DATE DESC;


Ответ

Можно использовать 2 варианта.
Первый
SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r JOIN journal_field_data f ON r.id = f.journal_record_id WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 AND field_name = 'SERTIF_NUMB' AND f.STRING_VALUE = :SERTIF_NUMB ORDER BY r.PRIMARY_DATE DESC;
Второй:
SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r JOIN journal_field_data f ON r.id = f.journal_record_id AND f.field_name = 'SERTIF_NUMB' AND f.STRING_VALUE = :SERTIF_NUMB WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 ORDER BY r.PRIMARY_DATE DESC;

Получить представление об общих принципах оптимизации запросов можно из статей на Википедии:
Семантическая оптимизация запросов СУБД Оптимизация запросов СУБД

Почему тут не нужен LEFT JOIN - и вообще, кратко и наглядно о различных вариантах соединений - на иллюстрации:

Приведение параметризованных типов

В сервлете необходимо получить инстанс DAO который обернут в AtomicReference, но при приведении типов компилятор волнуется и пишет:
Unchecked cast: 'java.lang.Object' to 'java.util.concurrent.atomic.AtomicReference' less... (⌘F1) Signals places where an unchecked warning is issued by the compiler, for example:
void f(HashMap map) { map.put("key", "value"); }
Hint: Pass -Xlint:unchecked to javac to get more details.
Сам код выглядит так:
AtomicReference dao = (AtomicReference) req.getServletContext().getAttribute("dao");
Подскажите как можно успокоить компилятор, учитывая что instance of не работает с дженериками, или если работает то как это написать?
Спасибо.


Ответ

Использовать аннотацию @SuppressWarnings("unchecked")