Страницы

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

среда, 6 марта 2019 г.

Сколько времени ajax запрос ждет ответа от сервера?

Сколько времени .ajax метод ждет ответ? В моем примере он обращается к сервлету, и если в сервлете перед отправкой ответа добавить хотя бы секунду Thread.sleep(), то вызывается обработчик ошибки error, если его убрать, то ответ обрабатывается корректно. Просто в более сложном примере, когда сервлет уже в свою очередь к серверу обращается, что тоже занимает время, ответ опять-таки не приходит. Если вообще понятие времени ожидания запросом ответа?
Вот код ajax запроса
$(document).ready(function () { $("#login-button").click(function () { var userPassword = $("input#userPassword").val(); var userLogin = $("input#userLogin").val(); $.ajax({ type: "POST", url: "login", dataType: "text", data: {login: userLogin, password: userPassword}, success: function (data) { alert("Successful request! Data is " + data.toString()); }, error: function (jqXHR) { console.log(jqXHR); } }); }); });
Метод service в сервлете
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Даже если на секунду включить, ответ не проходит /*try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); }*/
response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().print("test");
}


Ответ

Для начала стоит убедиться, что возврат ajax-запроса происходит из-за нехватки времени - для этого проверяем статус ответа:
error: function(jqXHR, status, e) { if (status === "timeout") { alert("Время ожидания ответа истекло!"); } else { alert(status); // Другая ошибка } }
Если все же ошибка связана с timeout, то можно вручную установить нужное значение, явно указав значение ожидания в миллисекундах:
Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent.
Стандартное значение timeout зависит от конкретной реализации браузера, судя по ответу на enSO.

Вынести load в отдельный метод

$this->load->view('header'); $this->load->view('workmenu'); $this->load->view('all_gk'); $this->load->view('footer');
Вот в этом коде мне не нравится что во всех контролерах мне надо вызывать загрузку хедера, меню, и футера, их можно как то вынести?


Ответ

Из-за отсутствия layout в Codeigniter, нужно прибегать к костылям. Вот решение данной проблемы: Создается библиотека application/libraries/my_layout.php
class MY_Layout extends CI_Controller {
// пути к файлам вида public $header = 'header'; public $footer = 'footer';
// метод получает на вход два параметра: название вида и данные для него public function content($views = '', $data = '') { // загружаем header if ($this->header) { $this->load->view($this->header, $data); }
// загружаем основной контент, который может иметь больше одного вида if (is_array($views)) { foreach ($views as $view) { $this->load->view($view, $data); } } else { $this->load->view($views, $data); }
// загружаем footer if ($this->footer) { $this->load->view($this->footer); } } }
В используемом контроллере достаточно подключить нашу библиотеку и обратиться к нужному виду через $this->my_layout->content('user/test', $data);
class User extends CI_Controller {
public function __construct() { parent::__construct(); $this->load->library('MY_Layout'); }
public function test() { $data['title'] = 'dynamic_string'; $this->my_layout->content('user/test', $data); } }
Вы так-же можете передавать несколько видов одновременно:
$data['title'] = 'dynamic_string'; $views = array( 'menu' => 'menu', 'content' => 'user/test' );
$this->my_layout->content($views, $data);
И в завершении, вы можете отключать часть вашего layout'a или использовать вместо него другой вид.
$this->my_layout->header = 'user/custom_user_header'; // or turn off header $this->my_layout->header = FALSE;
Пример был взят: Источник . Удачного кодинга...

Что такое перечисляемые и неперечисляемые свойства объектов?

В книге Дэвида Флэнагана в главе "Свойства и методы универсального класса Object" столкнулся с термином перечисляемые и не перечисляемые свойства. Раз есть перечисляемые свойства значит есть и не перечисляемые свойства. Хотелось бы узнать что это за свойства и чем отличаются. В интернете не нашел по этой теме ничего подходящего. Поэтому прошу помощи здесь. Всем заранее спасибо.

Выдержка из книги:
Обратите внимание: все свойства объекта, определяемые пользователем, являются перечислимыми. Неперечислимыми обычно являются унаследованные свойства (тема наследования свойств рассматривается в главе 9), поэтому практически всегда этот метод возвращает то же значение, что и метод hasOwnProperty()


Ответ

В цитате речь идет о свойствах объекта.
Они могут быть перечислимыми, и не перечислимыми.
Если свойство перечислимое, то при обходе в цикле for..in его можно будет получить, если не перечислимое - нельзя.
Например:
var o = { e: "prop" }; for (var i in o) { document.write('свойство "' + i + '" перечислимое'); } document.write('
свойство toString не перечислимое: '+o.toString)

Помогите плиз составить SQL запрос

Помогите, пожалуйста:)
Есть три таблицы:
Книги
СREATE TABLE Books ('book_id' int, 'book_name' varchar(7), 'book_price' int);
INSERT INTO Books ('book_id', 'book_name', 'book_price') VALUES (3, 'Book3', 100), (2, 'Book2', 5), (1, 'Book1', 10); Заказчики
CREATE TABLE Customers ('customer_id' int, 'customer_name' varchar(10));
INSERT INTO Customers ('customer_id', 'customer_name') VALUES (2, 'Petrov'), (1, 'Ivanov'); Заказы
CREATE TABLE Orders ('order_id' int, 'customer_id' int, 'book_id' int, 'count' int);
INSERT INTO Orders ('order_id', 'customer_id', 'book_id', 'count') VALUES (3, 2, 1, 1), (2, 1, 3, 5), (1, 1, 2, 1);
В результате запроса, который надо составить, должна получиться таблица:
CREATE TABLE Results ('Name' varchar(10), 'Book' varchar(7), 'Count' int, 'Order_sum' int);
INSERT INTO Orders ('Name', 'Book', 'Count', 'Order_sum') VALUES (Ivanov, Book2, 1, 5), (Ivanov, Book3, 5, 500), (Petrov,Book1, 1, 10);


Ответ

SELECT customer_name, book_name, count, count*book_price FROM Orders INNER JOIN Customers ON Orders.customer_id = Customers.costumer_id INNER JOIN Books ON Orders.book_id = Books.book_id ORDER BY customer_name

Как узнать имя метода следующего после объявления некоторой структуры данных

Здравствуйте, сегодня наткнулся на интересный Ruby гем Contracts, как он работает и его исходный код можно посмотреть тут. И у меня появился вопрос, как это гем достает имя следующего после Contract ... => ... метода, исходный код проекта не дал мне ответов (возможно я не там искал).


Ответ

Cредствами мета-программирования гем вмешивается в процесс определения каждого из инстанс-методов класса.
Обратите внимание на файл lib/contracts/decorators.rb в нем переопределен метод method_added(), который вызывается, когда вы определяете метод при помощи конструкции def
def method_added(name) MethodHandler.new(name, false, self).handle super end
Метод принимает параметр name с именем определяемого метода, вы сначала выполняете контракт и лишь затем вызываете оригинальный метод super, который осуществляет определение метода. Если контракт вызовет исключение (raise) - до определения метода дело даже не дойдет. Если контракт действительный или его нет, то Module#method_added просто штатно продолжит свою работу.

Можно ли производить валидацию в сеттере свойства c#

Можно ли производить валидацию в сеттере свойства c#


Ответ

Вынесено из комментариев.

Да, валидацию присваиваемого значения с последующей генерацией исключения в сеттере производить допустимо.
Обратимся к известной книге "Framework Design Guidelines. Conventions, Idioms, and Patterns For Reusable .NET Libraries", раздел 5.2:
It is OK to throw an exception in a property setter. It is very much like setting an array element, which can throw as well (and not just then checking the index bound but the possibility of type mismatch between the value and the array element type).
Microsoft слово в слово цитирует эту книгу здесь. Кстати, в геттере генерировать исключения не рекомендуется.
А вот Дж. Рихтер в "CLR via C#" (гл. 10 "Свойства") высказывает негативное отношение к свойствам, указывая, что они часто обладают неожиданным для разработчика поведением:
Лично мне свойства не нравятся и я был бы рад, если бы в Microsoft решили убрать их поддержку из .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, являясь по сути методами. Это порождает немыслимую путаницу. Столкнувшись с кодом, который вроде бы обращается к полю, разработчик привычно предполагает наличие множества условий, которые далеко не всегда соблюдаются, если речь идет о свойстве. [...] Свойство, являясь по сути методом, может выдавать исключения, а при обращениям к полям исключений не бывает. [...] Свойство-метод может выполняться довольно долго, в то время как обращения к полям выполняются моментально.
Полностью отказываться от свойств, пожалуй, не стоит, но разумно управлять сложностью их логики необходимо. Добавление в сеттере проверки на null, проверки на диапазон допустимых значений и т.п. с генерацией исключения будет хорошей идеей. А обращаться в свойствах к БД, выполнять длительные вычисления, запускать и блокировать потоки и т.д - уже нет.
Если дополнительные действия выполнять все же нужно, преобразуйте ваше свойство в метод.
Другими словами, в свойстве не следует производить действия, нарушающие принцип наименьшего удивления (этот принцип относят к пользовательскому интерфейсу, но к публичному API он тоже вполне применим).

Как работают замыкания (нюансы)? [дубликат]

На данный вопрос уже ответили: Как работают замыкания в JavaScript 6 ответов Что такое замыкания мне понятно, но в ходе их исследования возникли нюансы:
Есть код:

Не могу осознать благодаря чему переменная numberOfCalls в функции createCounter не обнуляется? Это фишка такая или этому есть разумное объяснение?


Ответ

"Вы вызываете один раз функцию createCounter".
"Замыкание" - создание объекта, содержащего экземпляры всех переменных из внешних областей видимости, используемых функцией.
Вызовите функцию еще раз , а потом начинайте вызывать два результата в произвольном порядке:
$(document).ready(function() { function createCounter() { var numberOfCalls = 0; return function() { return ++numberOfCalls; }; } function appendOutput(aText) { $("#output").append(aText + "
"); } $("#btnRun").click(function() { $("#output").html(""); var fn1 = createCounter(); var fn2 = createCounter(); appendOutput("fn1: " + fn1()); appendOutput("fn1: " + fn1()); appendOutput("fn1: " + fn1()); appendOutput("fn2: " + fn2()); appendOutput("fn2: " + fn2()); appendOutput("fn1: " + fn1()); }); });

output

Почему условие if не срабатывает и транзакция подтверждается?

Сама транзакция:
CREATE PROCEDURE `prog_transact`(vprog_name varchar(255), yprog_cy year, vprog_purp varchar (255), vprog_dt varchar (255), ilic_id int, vprog_vers varchar (63), vprog_ff varchar (255), vprog_website varchar (511), vprog_interface varchar(127), iarch_id int, idev_id int, ipl_id int, ios_id int) begin declare iprog_id int; declare exit handler for sqlexception begin rollback; select 'transaction not commited: sqlexception'; show errors; end; start transaction; if ilic_id=null or iarch_id=null or idev_id=null or ipl_id=null or ios_id=null then rollback; select 'transaction not commited: nulldata'; end if; insert into program (name, creation_year, purpose, dist_type, lic_id, version, file_formats, website, interface) values (vprog_name, yprog_cy, vprog_purp, vprog_dt, ilic_id, vprog_vers, vprog_ff, vprog_website, vprog_interface); select max(id) into iprog_id from program; insert into arch_prog (arch_id, prog_id) values (iarch_id, iprog_id); insert into dev_prog (dev_id, prog_id) values (idev_id, iprog_id); insert into pl_prog (pl_id, prog_id) values (ipl_id, iprog_id); insert into os_prog (os_id, prog_id) values (ios_id, iprog_id); commit; end
По идее, если последние переменные в процедуре заданы как null'ы, то транзакция должна откатиться. Как бы не так!
call prog_transact('Spore',2008,'Компьютерная игра','коммерческое',11,'1.05.1',null,'spore.com','графический', null, null, null, null);
... и транзакция успешно подтверждается! Почему не проверяется условие выше?


Ответ

Нельзя сравнивать значение с NULL при помощи оператора =. Сравнение с неопределенной величиной всегда неопределенная величина. Для того, чтобы выяснить принимает ли величина значение NULL, используйте специальный оператор IS NULL и его отрицательную форму IN NOT NULL
SELECT NULL IS NULL, NULL IS NOT NULL, NULL = NULL, NULL <> NULL; +--------------+------------------+-------------+--------------+ | NULL IS NULL | NULL IS NOT NULL | NULL = NULL | NULL <> NULL | +--------------+------------------+-------------+--------------+ | 1 | 0 | NULL | NULL | +--------------+------------------+-------------+--------------+

Как сделать один id (primary key) в mysql таблице непохожим на другие?

Для технических нужд требуется одну из записей в таблице сделать с id, выпадающим из общего ряда, но так, чтобы это не повлияло на последовательность auto_increment.
-1 не годится, так как поле unsigned
0 не годится, так как в приложении есть проверки на empty
999999 подошел бы, но как быть с auto_increment?
И в целом, какой подход обычно практикуется для решения такой задачи?


Ответ

Вы, конечно, стреляете себе в ногу, но если очень хочется, можно добавить нужную вам строку с большим id, а потом сбросить автоинкремент на старое значение:
ALTER TABLE `your_table` AUTO_INCREMENT = 42
И в целом, какой подход обычно практикуется для решения такой задачи?
Вам нужно, чтобы она была всегда наверху/внизу какого-то списка? Сделайте это лучше дополнительным полем "сортировка" или, на худой конец, просто костылём в коде. То, что вы придумали, очень-очень плохо и когда-нибудь обязательно выйдет боком.

Как преобразовать HTML таблицу в картинку (jpeg/png) силами php?

Дано:
HTML код таблицы.
Задача:
Получить эту таблицу в виде картинки.
Задача подробнее:
Эту таблицу (распарсенный HTML код с сайта) надо отобразить в виде сообщения telegram-бота. Телеграм не поддерживает большую часть HTML тэгов, включая таблицы. Решил вот так проблему решить: получаем код таблицы, преобразуем в картинку, отсылаем картинку таблицы.
Что сам сделал:
Почитал en-SO и решил пойти по пути HTML-PDF-IMAGE Нашёл php-либу, получающую на входе HTML код таблицы и выдающей *.pdf документ с ней. Даже стили можно использовать (sic!). Остался последний шаг - преобразовать pdf в картинку.
Проблема:
По запросу типа
pdf to image php
выдаются только советы использовать некие ImageMagick и GhostScript. Но, насколько я понял, они не подойдут мне, т.к. у меня не выделенный сервер, а просто хостинг с php, а эти модули надо в систему прямо ставить.
Вопрос:
Так таки есть ли способ получить силами непроапгрейженного всякими прогами php изображение из pdf или я вообще не по тому пути иду?
P.S.
Возможно стоит вообще другую либу попробовать?..


Ответ

Возможно стоит сложить код таблицы в открытый доступ с секретной ссылкой, получить эту ссылку, натравить на неё сервис типа screenshotlayer.com, удалить таблицу и радоваться?
screenshotlayer.com удобный (API и плюшки), но платный. Сервисы типа pdfconvertonline.com/webpage-to-png-online.html, web-capture.net бесплатны, но нужно проделать чуть больше движений чтобы получить картинку: сформировать запрос, распарсить ответ и скачать картинку.

Для примера (pdfconvertonline.com/):
POST http://s2.pdfconvertonline.com/convert/convert-webpage-win.php Тело: websiteurl=google.com&filetype=PNG&source=WEENYSOFT&convert=Convert+Now%21 Вернётся 302 на что-то типа http://www.pdfconvertonline.com/results.php?name=00i27-mv4a4.png&ser=2 В коде будет ссылка на картинку:
00i27-mv4a4.png

Вот рабочий код от ТС, делающий запрос на вышепомянутый сайт с нужными заголовками и выводящий результирующий HTML код страницы, коя содержит ссылку на требуемый PNG. Останется только распарсить ответ для получения ссылки на изображение и скачать его к себе на сервер.
'http://s2.pdfconvertonline.com/convert/convert-webpage-win.php', CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_POSTFIELDS => http_build_query(array(websiteurl=>'LINK_TO_HTML_PAGE_WITH_TABLE_IN_IT.html', filetype=>PNG, source=>WEENYSOFT, convert=>Convert+Now%21 )) )); $response = curl_exec($myCurl); curl_close($myCurl);
echo $response;

И опять код от автора ответа: Для парсинга ответа, используем Simple HTML Dom
require_once 'simple_html_dom.php'; // Код страницы ответа в $response
$dom = str_get_html($response);
$link = $dom->find('#item_1 a', 0); // Это ссылка на картинку
printf("Your image: %s", $link->href, $link->innertext); // $image = file_get_contents($link->href);

Расшарить репозитарий в локальную сеть

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


Ответ

установите любой http- или ftp-сервер, в качестве docroot-а настройте в нём каталог, в котором находится репозиторий (в этом каталоге должен быть под-каталог dists).
на компьютерах, которым нужен доступ к этому репозиторию, добавляйте такие же строки в /etc/apt/sources.list, как вы добавили на той машине, где он находится, только url поставьте соответствующий.
т.е., вместо:
deb file:/путь/к/репозиторию ...
указывайте (для http-сервера):
deb http://адрес.или.имя.машины.с.репозиторием/ ...
или (для ftp-сервера):
deb ftp://адрес.или.имя.машины.с.репозиторием/ ...

Как анимировать пунктирную линию (SVG)

Есть готовый файл, сохраненный в SVG. Задача следующая при наведение сделать его анимированным. Суть анимации: рисования элемента от начала до конца. Я полазил по интернету и нашел подходящий пример анимации:
$(document).ready(function() {
var canvas = Snap('.main-svg'); var speed = 1000; var line_clients = canvas.path('M349.333,397.333c0,0,46,42.667,146-2.333 c17.917-8.063,79.666-31,87.333,65'); line_clients.attr({ class: "line-clients" }); var group_line = canvas.group(line_clients);
group_line.attr({ fill: 'none', stroke: '#fff', strokeWidth: 0 });
$.each([line_clients], function(index, value) { value.attr({ strokeDasharray: value.getTotalLength(), strokeDashoffset: value.getTotalLength(), strokeWidth: 1, stroke: '#000' });
value.animate({ strokeDashoffset: 0 }, speed * 2, mina.easeinout ); }); });
Только вот, когда открываешь мой SVG, я не ожидал, что там столько текста ради такой линии Я не прошу за себя сделать работу, но может кто-то пнет меня на нужный источник, а лучше пример. Находил цент, какой с svg конвертирует в JS. Но я либо не разобрался, либо там нет возможности анимации. Всем спасибо!


Ответ

Рисовать в любом случае придётся. Эту линиую надо изобразить заново одним путём. Далее варианта два.
использовать оригинальный кривой и ужасный SVG. Поверх накрыть его своей линией цвета фона, толщины достаточной, чтобы закрыть полностью. Потом анимировать длину штриха и подобрать смещение так, чтобы кривая поверх «скрывалась», открывая пунктир под ней. Ниже эта техника подробнее. если требуется рисовать сплошной линией – можно изобразить прорисовку одного длинного пути, меняя длину штриха (решение отсюда). Пришлось перерисовать путь, чтобы он стал одной кривой. Смотрите в полный экран, т.к. кривая крупная.
.path { stroke-dasharray: 1490; stroke-dashoffset: 1490; animation: dash 4s linear forwards; } @keyframes dash { to { stroke-dashoffset: 0; } }

Чтобы «рисовать» пунктиром можно сразу нарисовать весь путь пунктиром, а потом поверх закрыть этой же кривой цвета фона. И её не рисовать, а наоборот, скрывать задом наперёд той же техникой, как в первом коде. Пример с прорисовкой пунктирной окружности (отсюда):

Parallel.For,Parallel.ForEach.Принцип работы

public static ParallelLoopResult For(int fromInclusive, int toExclusive, Func localInit, Func body, Action localFinally);
У меня остались несколько небольших вопросов,относительно вышеуказанной перегрузки,а именно:
Task создаётся для каждой итерации цикла for? Назначение в body первого int входного параметра.


Ответ

1) Вопрос предполагает наличие конкретного, документированного механизма реализации многопоточности в этой функции. Как именно достигается распараллеливание — внутренняя деталь имплементации.
В текущей имплементации создаётся корневой Task специального типа (ParallelForReplicatingTask), который умеет создавать свои легковесные копии. Но эти классы внутренние, и недоступны программисту. И разумеется в следующей версии имплементация имеет право поменяться без предупреждения.
2) Из документации
The body delegate is invoked once for each value in the iteration range (fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (Int32), a ParallelLoopState instance that may be used to break out of the loop prematurely, and some local state that may be shared amongst iterations that execute on the same thread.
То есть, первый параметр — общее количество итераций. Его можно использовать, например, для того, чтобы понять, какая часть общей работы выполнена.

Важное обновление: как правильно заметил @Grundy, смысл первого параметра в body — номер текущей итерации, а не количество итераций. Судя по всему, в документации ошибка. Заметьте, что номера вполне могут доставляться не подряд. Например, такой цикл:
Parallel.For( 0, 20, () => "Thread #" + Thread.CurrentThread.ManagedThreadId, (iter, loopState, localState) => { var res = localState + " " + iter; Console.WriteLine(res); return localState; }, s => { });
у меня выдал:
Thread #10 0 Thread #10 1 Thread #10 3 Thread #10 4 Thread #10 5 Thread #10 6 Thread #10 7 Thread #10 8 Thread #10 9 Thread #10 10 Thread #10 11 Thread #10 12 Thread #10 13 Thread #6 2 Thread #6 16 Thread #6 17 Thread #6 18 Thread #6 19 Thread #10 15 Thread #11 14

Добавление в базу нового объекта с ссылкой на уже существующие объекты Entity Framework

У меня есть таблица с задачами и таблица с тегами между ними связь многие ко многим.
public class DbTask { [Key] public int TaskId { get; set; } public string Name { get; set; }
public virtual ICollection Tags { get; set; } }
public class DbTag { [Key] public int TagId { get; set; } public String Name { get; set; }
public virtual ICollection Tasks{get; set;} }
Я создаю объект класса DbTask на клиенте и добавляю список уже существующих в базе данных объектов DbTag. После этого отправляю созданный объект на сервер, где добавляю его в базу данных. При добавлении через метод Add в таблицу заносится не только запись о новом DbTask, но и новые DbTag. Как мне сделать что бы новая запись связывалась с уже существующими DbTag?


Ответ

Есть несколько вариантов решения этой задачи:
Создаёте DbTask, делаете селект нужных тегов потом в коллекцию Tags добавляете существующие DbTag. (более правильный, без селекта) Создаёте DbTask, в него добавляете созданные DbTag и в контексте помечаете каждую сущность DbTag как не изменённую,
context.Entry(DbTag).State = EntityState.Unchanged
что позволяет entity framework создать нужные связи.
Ссылка на документацию про присоединение к контексту отсоединённых сущностей
Вообще хорошей практикой в DDD является приведение связи многие ко многим к однонаправленной один ко многим. Как в вашем случае это можно сделать и для чего? Например у каждой задачи может быть несколько тегов и когда вы запросите задачу с её тегами то коллекция тегов будет достаточно короткой, а вот у тега может быть огромное количество задач и запросить тег с его задачами в одном запросе может оказаться затратной операцией и для её решения нужно будет запрашивать задачи используя лимит. А лимитировать сущности в Include() в entity framework нет возможности. Из этого следует, что декларация коллекции Tasks в DbTag заведомо может привести к серьёзным последствиям и такие действия лучше ограничить (не декларировать возможность такого запроса в коде, то есть убрать из кода DbTag коллекцию Tasks). Запросить все таски помеченные тегом можно будет через коллекцию тасков.

hover работает неправильно

При наведении курсора на картинку она должна меняться на другую. А в реальности при наведении курсора hover-картинка подкладывается снизу (я вижу ее контур). Почему так происходит и как это исправить? За CSS, если что, не ругайте, я пока учусь. Как раз на этом сайте.
.soc_net { -webkit-padding-start: 0; margin: 30px 0 0 0; } .soc_net a { display: block; } .soc_net li{ display: inline-block; margin: 0 1px; } .soc_net span{ display: none; } .soc_net .vk:before { cursor: pointer; background-image: url(vk.png); } .soc_net .insta:before { background-image: url(insta.png); } .soc_net .fb:before { background-image: url(fb.png); } .soc_net .ytube:before { background-image: url(ytube.png); } .soc_net .vk:hover { background-image: url(ytube.png); } .soc_net .insta:hover { background-image: url(ytube.png); } .soc_net .fb:hover { background-image: url(ytube.png); } .soc_net .ytube:hover { background-image: url(fb.png); } .soc_net a:before { content:''; display:block; width:48px; height:48px; }



Ответ

Чтобы добавить стиль для hover псевдоэлементу :before, нужно писать так в сss class:hover:before, и тогда всё работает:
.soc_net { -webkit-padding-start: 0; margin: 30px 0 0 0; } .soc_net a { display: block; } .soc_net li { display: inline-block; margin: 0 1px; } .soc_net span { display: none; } .soc_net .vk:before { cursor: pointer; background-image: url(http://mighty.su/images/149_vk.png); } .soc_net .ytube:before { background-image: url(http://quest-city.com/wp-content/uploads/2016/04/YouTube.png); } .soc_net .vk:hover:before { background-size: 100% 100%; background-image: url(http://quest-city.com/wp-content/uploads/2016/04/YouTube.png); } .soc_net .ytube:hover:before { background-image: url(http://mighty.su/images/149_vk.png); } .soc_net a:before { content: ''; display: block; background-size: 100% 100%; width: 48px; height: 48px; transition: all 0.3s ease; }


Работа с HttpURLConnection в Android, полечение информации по GET

Нужно получить результат GET запроса в Android и вернуть значение из метода. Решено! Всем спасибо за участие!
public void sayHello(View view)throws IOException { Thread httpThread = new Thread(new Runnable() { public void run() { String mybla = sendGet(); } }); httpThread.start(); } private String sendGet(){ try{ String mystr = "http://www.pravda.com.ua"; URL obj = new URL(mystr); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); con.setRequestProperty("Accept-Charset", "UTF-8"); InputStream response = con.getInputStream(); Scanner s = new Scanner(response).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : ""; return result; } catch (Exception e) { return e.toString(); } }


Ответ

Все делаете правильно. Для того, чтобы прочитать поток и получить из него String, можете воспользоваться, например, библиотекой Apache commons IOUtils (офф. сайт). С её помощью:
String result = IOUtils.toString(inputStream);
Если предпочетаете способ без сторонних библиотек (что я приветствую, потому что это позволяет узнать что-то новое о языке, в котором вы новичек), то делайте например так:
Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : "";
UPD
Заверните в
new Thread(new Runnable() { public void run() { //вызовите ваш код для сетевого запроса } }).start();
Когда ваш запрос вернул результат внутри вашего Thread, чтобы поменять элемент интерфейса вам понадобится сделать это из UI-потока. Для этого используйте Context.runOnUiThread();

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

Можно ли как-то связать значения инпутов from и to range slider при их редактировании (ввод значений в поля) с функцией getValues(values), вычисляющей разницу to - from?
Пример на codepen
На данный момент происходит вычисление только при перетаскивании ползунков. Меняю ползунки слайдера - вычисляется total, ввожу в поля input свои значения - не вычисляется total )
'use strict'; $(document).ready(function() { console.log('Hello, world!'); // ---------------------------------- Range slider jq ui $('.filter__slider-element').each(function() { var $this = $(this), container = $this.closest('.filter__slider'), min = parseInt($this.data('min')), max = parseInt($this.data('max')), from = container.find('.filter__slider-input-from'), to = container.find('.filter__slider-input-to'); from.change(function() { $('.filter__slider-element').slider('values', 0, from.val()); }); to.change(function() { $('.filter__slider-element').slider('values', 1, to.val()); }); $this.slider({ range: true, min: min, max: max, values: [min, max], slide: function(event, ui) { // При каждом перемещении var values = $(this).slider('option', 'values'); from.val(ui.values[0]); to.val(ui.values[1]); getValues(ui.values); }, // change: function(event, ui) { // В конце перетаскивания // getValues(ui.values); // }, create: function() { // При создании виджета var values = $(this).slider('option', 'values'); from.val(values[0]); to.val(values[1]); //getValues(); }, stop: function(event, ui) { // При завершении перетаскивания getValues(ui.values); } }); }); function getValues(values) { var total = 0; $('.filter__slider-element').each(function() { var values = $(this).slider("option", "values"); var dif = values[1] - values[0]; total += dif; }); $("#totals").text(total); } }); .form { padding: 3rem 0; }

from
to

from
to

Total: 0


Ответ

При установке свойства values происходит событие change, поэтому его стоит раскомментировать и все заработает.
'use strict'; $(document).ready(function() { console.log('Hello, world!'); // ---------------------------------- Range slider jq ui $('.filter__slider-element').each(function() { var $this = $(this), container = $this.closest('.filter__slider'), min = parseInt($this.data('min')), max = parseInt($this.data('max')), from = container.find('.filter__slider-input-from'), to = container.find('.filter__slider-input-to'); from.change(function() { $this.slider('values', 0, from.val()); }); to.change(function() { $this.slider('values', 1, to.val()); }); $this.slider({ range: true, min: min, max: max, values: [min, max], slide: function(event, ui) { // При каждом перемещении var values = $(this).slider('option', 'values'); from.val(ui.values[0]); to.val(ui.values[1]); getValues(ui.values); }, change: function(event, ui) { // В конце перетаскивания console.log('change'); getValues(ui.values); }, create: function() { // При создании виджета var values = $(this).slider('option', 'values'); from.val(values[0]); to.val(values[1]); //getValues(); }, stop: function(event, ui) { // При завершении перетаскивания getValues(ui.values); } }); }); function getValues(values) { var total = 0; $('.filter__slider-element').each(function() { var values = $(this).slider("option", "values"); var dif = values[1] - values[0]; total += dif; }); $("#totals").text(total); } }); .form { padding: 3rem 0; }

from
to

from
to

Total: 0

Назначение ролей для прав доступа

Добрый день.
class Ability
can :manage, Company do |company| user.available_roles.include?(company.role) end
class User
belongs_to :company delegate :admin?, :operator?, :agent?, :sales?, :visitor?, :available_roles, :role, to: :company
class Company
has_many :users
def admin? role == 'admin' end
def operator? role == 'operator' end
def agent? role == 'agent' end
def sales? role == 'sales' end
def visitor? role == 'visitor' end
def available_roles case role when 'admin' %w[visitor sales agent operator admin] when 'operator' %w[visitor sales agent] else [] end end
class CompaniesController
authorize_resource
def new @company = Company.new respond_with @company end
def create @company = Company.create(company_params) respond_with @company end
При создании Компаний, Админ может определить роль компаний %w[visitor sales agent operator admin]
При создании Компаний, Оператор может определить роль компаний только [visitor sales agent]
Через консоль: User.last это user с правами operator
» Ability.new(User.last).can? :manage, Company.new(role: :admin, name: 'Company Administrator') User Load (1.5ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 Company Load (0.8ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT 1 [["id", 4]] # false
» Ability.new(User.last).can? :manage, Company.new(role: :agent, name: 'Company Agent') User Load (1.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 Company Load (0.5ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT 1 [["id", 4]] # true
Но через веб интерфейс оператор может создать компанию с ролью admin и operator
Подскажите пожалуйста, что не так?


Ответ

Помогло в class CompaniesController
authorize_resource заменил на load_and_authorize_resource

Debian сразу не стартует, просит нажать Ctrl+D

Проблема возник после нескольких раз некоректных отключений. При старте системы пишет такое
give root password for maintenance (or type control-d to continue)
После нажатия ctrl+D система нормально запускается, но дело в том, что нужно, чтобы все происходила автоматически, т.к. предназначен он для удаленного использования. Как можно исправить это?
Вывыод команды cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.2.0-4-486 root=UUID=1574feda-1c87-4124-8c82-92f7c65ea60a ro quiet
Ошибки при старте:

[ ok ] Starting the hotplug events dispatcher: udevd. [ ok ] Synthesizing the initial hotplug events...done [....] Waiting for /dev to be fully populated...[ ??? spkr' is already registered, aborting... done. [ ok ] Setting preliminary keymap...done. [ ok ] Setting parameters of disc: (none). [ ok ] Activating swap...done. [....] Checking root filesystem...fsck from util-linux 2.20.1 /dev/sda1: clean, 120539/376752 files, 794127/1526784 blocks done. [info] Loading kernel module loop. [ ok ] Cleaning up temporary files... /tmp. [ ok ] Activating lbm and md swap...done. [....] Checking file systems...fsck from util-linux 2.20.1 fsck.ext4: Unable to resolve 'UUID=ee8d17ee-f799-4ee4-911f-3f2310f3f880' fsck died with exit status 8 failed (code 8). [....] File system check failed. A log is being saved in /var/log/fsck/checkfs i [FAILt location is writable. Please repair the file system manually. ... failed! [....] A maintenance shell will now be started. CONTROL-D will terminate this sh [warn] ell and resume system boot. ... (warning). Give root password for maintenance (or type Control-D to continue):


Ответ

судя по содержимому последней из картинок, программа fsck не смогла найти раздел с uuid ee8d17ee...
fsck.ext4: Unable to resolve 'UUID=...'

почему она вообще его искала? скорее всего потому, что он упомянут в файле /etc/fstab (или в одном из файлов в каталоге /etc/fstab.d/, если таковой есть) и последнее (шестое) поле, обозначающее порядок проверки, не равно нулю. что-нибудь вроде этого:
UUID=ee8d17ee... точка-монтирования тип-фс опции-монтирования частота-создания-дампа порядок-проверки
как быть? либо исправить это поле на ноль, либо закомментировать эту строку, добавив символ # в её начало.
так что выбрать — исправить шестое поле или закомментировать? в том случае, если раздел с таким uuid не существует, строку имеет смысл именно закомментировать. посмотреть (уже после загрузки) uuid-ы всех доступных разделов можно, например, программой blkid
$ sudo blkid

RxJava не работает с файлами в io() потоке

Суть проблемы такова: у меня есть Observable и Subscriber. Observable я пытаюсь запустить в io() потоке, так как он работает с файлами (не буду показывать код, он довольно большой, но не имеет значения), однако он ничего не делает:
Observable creatingObservable = getCreatingObservable(image); Subscriber creatingSubscriber = getCreatingSubscriber();
creatingObservable .subscribeOn(Schedulers.io()) .subscribe(creatingSubscriber);
Если запускать код без subscribeOn - все прекрасно работает. Так в чем же проблема и как ее исправить?

P.S. У меня еще System.out.println() не работает. Проблема распространяется на все потоки Scheduler'a


Ответ

Проблема была в том, что главный поток не дожидался окончания окончания выполнения RxJava'вского потока. В результате, RxJava даже не успевал "пискнуть" - от сюда никаких сообщений из System.out.println() и работы с файлами.

Решение подсказали тут - https://stackoverflow.com/questions/37993371/rxjava-doesnt-work-in-scheduler-io-thread

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

Я работаю с Camera2API и мне нужно отключить возможность делать фото если на улице не достаточно света...
Я вот подумал о том, что когда используется стандартная камера, то там есть возможность установить auto режим на вспышку.
Если я правильно понимаю, то камера работает с каким то сенсором который определяет количество света и если его не достаточно то вспышка работает.
Как подключиться к этому сенсору?


Ответ

В итоге я воспользовался этой офф статьей
И сделал так
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mPressure;
@Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
// Get an instance of the sensor service, and use that to get an instance of // a particular sensor. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight= mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); }
@Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. }
@Override public final void onSensorChanged(SensorEvent event) { float luminosity = event.values[0]; // Do something with this sensor data. }
@Override protected void onResume() { // Register a listener for the sensor. super.onResume(); mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); }
@Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); mSensorManager.unregisterListener(this); } }