• Java - тормозит, а Cи - нет?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Программы на C/C++ работают быстрее за счёт отказа от контроля всего и вся (расхода памяти, переполнения стека, корректности указателей), за счёт явной и жёсткой типизации переменных, за счёт меньшего количества обёрток вокруг типов данных. Но это позволяет программисту выстрелить себе в ногу таким количеством способов, которые в Java и не снились.
    Ответ написан
    8 комментариев
  • Каков план личностного развития JavaScript программиста с нуля?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Выучить русский язык. Узнать, что такое "личностное развитие" и чем оно отличается от профессионального.
    Ответ написан
    2 комментария
  • Как реализовать алгоритм RSA на Python?

    qmax
    @qmax
    программер
    Рекомендация от профессора стэндфордского университета Dan Bioneh на курсе крипторгафии:
    не пытайтесь реализовать алгоритмы сами!
    Ответ написан
    1 комментарий
  • JQuery, обращение к элементу через атрибут data-*?

    aen
    @aen
    Keep calm and 'use strict';
    А зачем вообще так делать? Что вам мешает добавить еще один класс в разметку и уже по нему обращаться. Это будет гораздо быстрее, чем через атрибут.

    Опять таки есть нюанс. Дата атрибуты при изменении не меняют своего состояния в разметке. То есть, если у вас был элемент:
    <li class="demo" data-id='1'>Пункт 1</li>,
    затем его значение дата атрибута поменяли
    $('demo').eq(0).data('id', 3),
    то вы разметке он все также останется
    <li class="demo" data-id='1'>Пункт 1</li>.
    Это может привести к проблемам.
    Ответ написан
    4 комментария
  • Создание виртуального интерфейса

    astrobeglec
    @astrobeglec
    Наиболее простой и действенный способ: Открываешь файл /etc/network/interfaces текстовым редактором от суперпользователя, например так
    sudo gedit /etc/network/interfaces
    

    И редактируешь его приводя к следующему виду:
    auto eth0
    iface eth0 inet static
    	address 192.168.1.5
    	netmask 255.255.255.0
    	network 192.168.1.0
    	broadcast 192.168.1.255
    	gateway 192.168.1.1
    	dns-nameservers 8.8.8.8 192.168.1.1
    
    auto eth0:1
    iface eth0:1 inet static
    	address 192.168.0.5
    	netmask 255.255.255.0
    	network 192.168.1.0
    	broadcast 192.168.1.255
    	gateway 192.168.0.1
    	hwaddress ether 00269ebba619
    	dns-nameservers 8.8.8.8 192.168.1.1
    
    

    где:

    auto eth0 — автоматический подъем сетевого интерфейса
    iface eth0 inet static — используется статичный адрес
    (если адрес выдает dhcp, то пишешь iface eth0 inet static)
    address 192.168.1.5 — IP адрес интерфейса 1
    netmask 255.255.255.0 — маска сети
    network 192.168.1.0 и broadcast 192.168.1.255 — это можно опустить, но и лишним не будет.
    gateway 192.168.1.1 — шлюз (IP адрес устройства для выхода в интернет)
    dns-nameservers 8.8.8.8 192.168.1.1 — DNS сервера

    auto eth0:1 — второй сетевой интерфейс на данном устройстве и далее по аналогии.
    Ответ написан
    4 комментария
  • JQuery parents().get(2) против parent().parent().parent()?

    Smileek
    @Smileek
    Спасибо, веселенькая задачка получилась.:)
    Тестим вот на этом:
    <div id="i1"><div id="i2"><div id="i3"><div id="i4"></div></div></div></div>
    <div id="info"></div>

    Вот так:
    var x, dt, dt2;
    var iter = 100000;
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parent().parent();
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
        x = $("#i4").parents().get(2);
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + ":" + (dt2 - dt));
    

    На заданном примере выигрывает parents().get(2). 3398:2910
    Далее делаем 12 вложенных элементов и прогоняем пример из комментария — пять parent()-ов против parents().get(5): с огромным перевесом выигрывает get(5) — 5374:3954.
    А вот get(3) проигрывает parent().parent().parent() — 3406:3880.

    Получается, что выбрать все 12 элементов и в них найти третий, дольше, чем три раза прыгнуть вверх по дереву.

    Наконец, вернемся к первому варианту с четырьмя элементами, и попробуем воспользоваться полученным родителем.
    var x, dt, dt2;
    var iter = 10000; /* <-- В 10 раз уменьшим, а то зависнем */
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parent().parent().attr("id")); /* <-- Запишем id родителя в текст потомка */
    }
    dt2 = new Date();
    $("#info").text(dt2 - dt);
    				
    dt = new Date();
    for (var i = 0; i < iter; i++)
    {
       $("#i4").text($("#i4").parents().get(2).attr("id"));  /* <-- Попробуем сделать то же самое */
    }
    dt2 = new Date();
    $("#info").text($("#info").text() + " " + (dt2 - dt));
    

    И вот тут нас ждет сюрприз: $("#i4").parents().get(2).attr is not a function
    arr.get(i), по сути, то же, что и arr[i], то есть мы получим просто Object.
    Для того, чтобы воспользоваться jQuery-функциями, придется обернуть его в денежный знак:
    $("#i4").text( $( $("#i4").parents().get(2) ).attr(«id»));
    От этого мы и потеряем в производительности: 2665:2973.

    Мораль:
    1) Всегда найдутся варианты использования, которые лучше для одного варианта и хуже для другого.
    2) Эффект от производительности или ее потери будет только на больших числах — в самом первом примере мы выиграли 0,4 секунды за 100000 (!) итераций.
    3) Поэтому поступайте, как велит эстет внутри Вас: мне, скорее всего, в реальном примере было бы удобнее получить jQuery-объект и дважды воспользоваться parent()-ом. С другой стороны, восемь раз я бы писать parent() не стал: религия не позволяет.
    Ответ написан
    2 комментария