Страницы

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

пятница, 15 февраля 2019 г.

Как узнать на сайте ли пользователь или нет?

То есть как в вк: проверяется на сайте ли пользователь, и потом пишет. И мне интересно как это делается. Знает ли кто эту страшную тайну?


Ответ

В случае VK, если говорить про почту, используется Long Polling, отправляются запросы на imxxx и al_im.php
Т.е, если неплохая достаточно точность нужна, то клиент должен пинговать сервак периодически.
Если точность особо не важна, то можно запоминать последнее время, когда человек заходил на сайт или когда посылал к серваку последний запрос. Это и будет, по сути, временем, когда человек последний раз был онлайн.

Hover-антипод, как сделать при отведении мыши обратный эффект медленным?

Хотел сделать чтобы при наведении менял цвет, а при отведении с такой же скоростью обратно. Но получилось что обратно он возвращает цвет моментально, подскажите как сделать?
a { font-family: pf_square_sans_proregular; text-decoration: none; color: #000000; padding: 7.5px 10px 7.5px 8px; height: 30px; width: 222px; display: block; } a:hover, li { background: #171B25; transition: all 2s ease; } a:hover .text { color: white; transition-duration: 0.5s; }



Ответ

a { font-family: pf_square_sans_proregular; text-decoration: none; color: #000000; padding: 7.5px 10px 7.5px 8px; height: 30px; width: 222px; display: block; transition: all 2s ease; } a:hover, li { background: #171B25; } a:hover .text { color: white; transition-duration: 0.5s; }


Transition перенести необходимо

Как проверить раскладку клавиатуры на нужный язык?

Первое что делаю это собираю информацию о языках в системе:
public static InputLanguage GetLanguage(string language) { language = language.ToLower(); foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) { if (lang.LayoutName.ToLower() == language) { return lang; } } return null; }
Затем пробую проверить язык тот или не тот через функцию if
if(InputLanguage.CurrentInputLanguage == GetLanguage("us")) { Console.Write("Определён Английский!"); } else if (InputLanguage.CurrentInputLanguage == GetLanguage("ru")) { Console.Write("Определён Русский!"); }
Но он не определяет его. Может Я не так его определяю?
Как решить задачу?


Ответ

Использованный вами способ не будет правильно работать в консольном приложении, только в приложении WinForms.
В консоли на данный момент мне удалось однозначно получить только язык ввода по-умолчанию и системную локаль. С текущей раскладкой пока не далось справиться даже через WinAPI (подсмотрено тут), возвращает только язык ввода по-умолчанию. Если найдется решение, допишу сюда же.
Ошибки в текущем решении и способы их устранения ниже:
Вы некорректно сравниваете названия языков. Если хотите использовать двух-буквенные обозначения, то исправьте условие в GetLanguage на такое
... if (lang.Culture.TwoLetterISOLanguageName == language) ...
В таком случае английский будет обозначен как en, а не us, независимо от конкретной его вариации.
Если нужно учитывать вариант языка, то замените условие на такое:
... if (lang.Culture.Name == language) ...
и используйте стандартные обозначения языков: en-US, ru-RU При сравнении объектов InputLanguage нельзя использовать оператор ==, так как он будет сравнивать только ссылки на объекты InputLanguage. Вместо этого используйте метод Equals, который в данном классе переопределен и возвращает корректный ответ при эквивалентности языков.
... if (InputLanguage.CurrentInputLanguage.Equals(GetLanguage("ru"))) ...

Список всех языков, которые знает ваша система, их названия и атрибуты можно получить так
var culture = CultureInfo.GetCultures(CultureTypes.AllCultures);

next(), nextInt(), nextLine(), nextDouble()

Если у нас int x = scan.nextInt(), то при вводе строковых значений и double значений вылазит Exception
Если у нас String x = scan.nextLine, то при вводе int значений и double значений, мы не получаем Exception (или можно сказать ошибку), как будто nextLine() не для String значений, а для всех. Почему, если мы чётко указали:
String x = scan.nextLine();
Если у нас double x = scan.nextDouble(), то при вводе String значений он выдаёт Exception и int (если пишем 123 - то выведет 123.0).
Почему всё отрабатывает как надо, а nextLine() принимает любые значения, если мы указали String, то есть "задали параметры строго".


Ответ

Потому что введеные через nextLine() числа воспринимаются, как текст - символы цифр, а не числа, с которыми можно производить арифметические действия. Возможно это не очевидно, но цифры тоже могут быть текстом, а так же имеют свои коды в кодовой таблице символов.
Для того, чтобы с полученным таким образом числом можно было производить числовые операции, как сложение или вычитание, его предварительно нужно преобразовать из строки, собственно, в число, к примеру типа int. Без преобразования такое число можно только вывести на экран, но не сложить с другим (точнее, мы получим сложение строк, как "123" + "1" будет "1231", а не 124.
В случае nextInt() этого, очевидно, не требуется и мы сразу получаем числовой тип (int), для которого доступны любые математические действия. Естественно, этот тип не может принимать символы, кроме чисел и выдает эксепшен
PS: в чем отличие. Рассмотрим пример для таблицы кодов ASCII и числа типа byte, так как и тот и другой использует 1 байт для хранения единицы информации.
Символ "1" имеет код в таблице символов (для ASCII-кодировки это 0x31), но число 1 не имеет кода, оно хранится в виде, собственно, числа в памяти. Так, к примеру, символы "123" будут хранится, как набор кодов: 0x31,0x32,0x33 и занимать 3 байта (по одному байту на каждый символ-код), в то время, как число 123 будет занимать один байт и храниться в этом байте, как значение - 123. Мы можем сложить его с другим таким же числом (например, 7) и новое число будет по прежнему занимать один байт (будет в этом байте хранится значение - 130). С набором символов-кодов мы этого делать не можем, так как они представлены совершенно другим образом.

Что такое пространственная сложность алгоритма?

Что такое пространственная сложность алгоритма?


Ответ

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

Как правильно составить ТЗ?

Бывают случаи, когда ТЗ предоставленное заказчиком неполное, плохо составленное или его вообще не существует. Какие тогда вопросы вы задаете прежде чем начать работу и чтобы потом не возникало вопросов у заказчика? Дизайн сайта бывает разной сложности и разного качества, но все же есть ли какие-то вопросы общего характера?


Ответ

В "сайте" есть две основные компоненты: функционал и дизайн. По функционалу, даже "поведению" сайта все относительно просто: это описывается так же, как для любого другого программного обеспечения, разве что с поправкой на stateless-характер HTTP. Цели, средства, use cases и прочие варианты и методы описания "как это должно работать". Что касается дизайна - то мои партнеры, занимающиеся дизайном, обычно поступают так: рисуют несколько набросков, из которых клиент потом выбирает понравившийся вариант. Далее этот набросок прорисовывается подробнее, после чего на этой картинке ставятся подписи обеих сторон, она получается статус "Приложение № (n+1): макет" и становится неотъемлемой частью общего ТЗ на сайт. Что касается деталей реализации (например, табличная или блочная верстка будет использовать) - как мне кажется, их необязательно указывать в ТЗ кроме тех случаев, когда это а) критично б) заказчик имеет хорошее представление об этом. Сам процесс написания ТЗ всегда трудоемок, требует вникания в предметную область Заказчика. Кстати, хорошо работает вопрос "а что Вам нравится из продукции конкурентов"? :) Успехов!

Операторы '||' и 'or'

Доброго времени. Сейчас работал с базой и озадачился вопросом: $db_res = sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" ); $query = sqlite_query($db_res, "SELECT * FROM $table") || die ('Ошибка в запросе!'); При использовании "|| die()" получаю ошибку Warning: sqlite_query() expects parameter 1 to be resource, string given in ... on line ... Ошибка в запросе! Если изменить оператор "||" на "or" все работает правильно, почему?


Ответ

Дело в том, что оператор || имеет более высокий приоритет, чем оператор =, по этому $db_res будет присвоен результат выражения sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" ), т.е. true. Оператор or наоборот имеет более низкий приоритет, чем =, следовательно сначала $db_res будет присвоен результат sqlite_open( $db_name ) и только потом будет применено логическое ИЛИ: $db_res || die ("Ошибка при открытии БД!" ) Т.е. если явно расставить приоритеты, то оба выражения будут выглядеть так: $db_res = ( sqlite_open( $db_name ) || die ("Ошибка при открытии БД!" ) ); ( $db_res = sqlite_open( $db_name ) ) or die ("Ошибка при открытии БД!" );