Задать вопрос
  • Индексирует ли поисковый робот теги в head добавленные с помощью Jquery?

    alexfedoseev
    @alexfedoseev
    React & Rails Dev
    Google bot уже научился рендерить JS, одно из моих SPA без серверного рендеринга он проиндексировал, и оно спокойно живет в выдаче (хотя, полагаю, что приоритет он всё-таки отдает сайтам со стандартным html с сервера).

    Но не рекомендую успокаиваться с этой мыслью, потому что сниппет из вопроса —это дорога в ад. Будущее — это isomorphic / universal javascript. И начальный html должен прилетать на клиента с сервера. Поэтому на вопрос как исправить ситуацию ответ такой: перестать делать `$("head").append`, и начинать вникать в современные подходы к веб-разработке.
    Ответ написан
    Комментировать
  • $$$ что значит в php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это называется переменная с переменным именем (variable variable).

    class Foo {
      public $deepest = 'Limbo';
      
      public function __toString()
      {
        return 'deep';
      }
    }
    
    $deeper = 'deepest';
    $deep = 'deeper';
    $b = new Foo();
    
    echo $b->$$$b;


    Выражение выполняется справа налево:
    1. $b->$$($b) превращается в $b->$$($b->__toString()), поскольку именно так ведут себя объекты, когда на них пытаются натравить echo;
    2. $b->$$($b->__toString()) превращается в $b->$(${'deep'}), именно это значение возвращает метод __toString класса Foo, инстансом которого является $b;
    3. $b->$(${'deep'}) превращается в $b->$($deep), это как раз вызов переменной при помощи значения из другой переменной;
    4. $b->$($deep) превращается в $b->${'deeper'}, поскольку именно такое значение находится в переменной $deep;
    5. $b->${'deeper'} превращается в $b->($deeper);
    6. $b->($deeper) превращается в $b->deepest;
    7. наконец, получается значение свойства 'deepest' из $b, а там как раз хранится 'Limbo', оно и выводится в echo.

    dd178a12658f41679b71884846669132.jpg
    Ответ написан
    8 комментариев
  • Нужен ли антивирус для LINUX, какой выбрать?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Возрадуйтесь: все это барахло на линуксе не нужно. Софт ставится через пакетный менеджер и через него же корректно удаляется. Глобальной свалки типа реестра нет. Антивирус нужен только на почтовом или samba-сервере в организации с виндовыми машинами.
    Ответ написан
    9 комментариев
  • Почему приложение x64 в два раза медленнее x86?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Отвечать на этот вопрос без какой-либо дополнительной информации - это как гадать на кофейной гуще. Какой CPU - если это древний Pentium D с допотопным конвейером и глупыми регистрами - одно дело, а если это новейший Core i7 на Haswell - другое. Что до настроек - вот честно, "стандартные" вообще ни о чём не говорит. Я уже не говорю, что было бы не плохо указать количество опытов с максимальным и минимальным - вполне возможно глупые ОС с планировщиком как-то неудачно распределяют время. Любой ответ, который можно тут указать может быть техническим грамотным, но совершенно не соответствующий истине.

    Рискну предположить такой расклад - об оптимизациях мы почти ничего не знаем и делаем "стандартную" дебаговую сборку. В этих случаях транслятор вставляет в код специальные метки, по которым можно будет сопоставить инструкции с файлом и номером строки. Понятное дело, что в объектные файлы попадут и холостые циклы и бесполезные разыменования. Ни о каких кэшированиях или перестановках не может быть и речи - что попросили, то получили.

    Теперь давайте вместе подумаем о том, какие различия между x86-64 и x86. На самом деле, вопрос поставлен не очень корректно - x86-64 почти полностью включает в себя x86. Из изменённого - размер указателя (адреса), да немного переделана логика регистров (хотя все они на месте, просто добавилось ещё лишние несколько десятков) - теперь часть аргументов в функцию передаётся через дополнительные регистры, тогда как в x86 все идут через стек. Однако получить здесь преимущество не так уж и просто - процессор тоже не дурак, в случае линейной обработки информации (или любая длительная работа с небольшими участками памяти) он прекрасно всё кэширует и работа со стеком в общем случае не сильно медленнее работы с регистрами.

    Теперь смотрим на код. Что там? Куча адресной арифметики, немного функций, да и аргументов почти нет. 8 миллионов слов? Не думаю что рекурсия вынудит вылезти стеку за пределы кэша, так что есть подозрение о паритете архитектур в данном случае. Однако большое количество адресной арифметики и увеличенный размер адреса в битах... во сколько раз? В два раза?

    Ну да ладно, ясное дело, сложение реализовано за 1 такт. Скорее всего. Конечно, здесь вопрос процессора, но даже узнав модель будет сложно узнать наверняка, разве только синтетическим тестом (много раз обращаться по адресу - сумме двух случайных чисел). Да и Windows 8.1 никогда не был стандартом производительности (скорее с точностью наоборот), и VC++ никогда не был лучшим компилятором.

    Попробуйте gcc (меня разве только интересует откуда на Windows взялся gcc) с флагом -O3. И посмотрите машинный код для 64 бита и 32 бита (можно пользоваться objdump из binutils или посмотреть машинный код в IDE Visual Studio - точно расположение кнопки не помню, но можно поискать в менюшках). Скорее всего причина не одна, их множество. Так, вызов функции сопровождается сохранением контекста, тогда как в x64 регистров больше, больше и контекст. Собираем такие моменты по крупицам... Вот и получаем.

    P.S. Давным давно, разговаривал с преподавателем. Простая перекомпиляция под 64 бита ускорила код на 30%. Это был колхозный кодек, немного похожий на libx264 (от туда была сдёрнута часть кода). Естественно, проект собирался со всеми оптимизациями, со всем расширениями инструкций - со всем, чем можно. И сборка под платформу x86-64 (с SSE, MMX, FMA и прочие). Жутко наукоёмкий разношёрстный код (писали все - от зелёных аспирантов, до ровесников Страуструпа и профессоров университета) - туева хуча функций, структур, объединений и очень, очень много параметров, многие из которых передают в аргументы функций. Ну и целевая платформа - жутко порезанный и переделанный Windows Embedded - там просто не чего было планировать.
    Ответ написан
    Комментировать
  • Что не так с Node.js?

    un1t
    @un1t
    Высоконагруженные проекты пишут на любых языках, многие написаны на php или perl. Нельзя называть эти языки быстрыми.
    То что он держит какую-то нагрузку это просто смешно. Никакую нагрузку он не держит, яваскрипт достаточно медленный, впрочем тоже можно сказать и о php.
    Нагрузку держит асинхронный поход (не яваскрипт!) который искользуется в том случае если у вас IO bound сервис, т.е. большую часть веремени он ничего не делает, а просто ждет ответа от другого сервиса или БД.
    Решать какие-нибудь задачи которые CPU bound на node.js ... ну вобщем это не подходящий инструмент, т.к. язык медленный, будет все работать медленнл.
    У меня лично претензии к js, что язык этот имеет мало возможностей и много костылей, хотя он активно развивается и в ES6 видно много улучшений В node.js мало библиотек, они сырые и медленные. Я сравниваю с Python, но даже у PHP тут есть преимущества. На node.js нет полноценного веб-фреймворка, аля Django, RubyOnRails или Yii. Конечно это вопрос времени, но пока все сыро.

    node.js и асинхронный подход.
    На ноде большинство библиотек асинхронные, если ты захочешь написать что-то синхронное, то у тебя будут проблемы.
    Асинхронный подход он не хороший и не плохой, это инструпент для решения определенных задач.
    Люди же использующие ноду используют асинхронный подход везде, они вынуждены. Но это как забивать гвозди микроскопом - долго дорого, неудобно и ненадежно.
    Асинхронный подход нужен для решения специфичесих задач. C# или Python имеют языковые конструкции упрощяющие асинхронное програмирование, но в ноде ничего подобного нет. Писать асинхронный код на JS это тот еще геморой. Всякие anync и promise немного улучшают ситуацию, но проблема остается.
    Ответ написан
  • Удаленный работадатель требует сделать ИП, зачем это нужно?

    edinorog
    @edinorog
    Троллей не кормить!
    ИП отвечает собственным имущество за косяки
    ИП работает по договору. в случае чего можно и в суд с ним им сходить
    ИП имеет счет и получает деньги на него. легче бухам
    ИП не пропадает и не бухает если не хочет влететь на деньги (сроки однако)
    Ответ написан
  • Удаленный работадатель требует сделать ИП, зачем это нужно?

    @Alexey_Kutepov
    Разработчик программного обеспечения
    Сейчас же закон хотят принять по поводу зп в конвертах. Да и без него можно сесть
    Ответ написан
    1 комментарий
  • Какими средствами создаются сложные онлайн конструкторы сайтов?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Какими средствами создаются сложные онлайн конструкторы сайтов,

    Ну вот нанимают программиста, платят зарплату, он пишет код. Все просто.
    учитывая защиту от воровства конечного содержимого верстки и JS сценариев?

    Никак вы ничего не защитите. Просто забейте.
    Ответ написан
    4 комментария
  • Как оценить работу штатного SEO-шника?

    kopcap_va
    @kopcap_va
    SEO Consultant
    За выведение слов в ТОП? а потом? штрафовать, если слова пропали из топ-10 выдачи?

    Это не продуктивный подход, т.к. слова могут входить-пропадать в Топ-10 совершенно по разным причинам.

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

    Штрафы являются "мотиватором" далеко не для всех - для многих это наоборот серьезный демотиватор, заставляющий искать новую работу и наплевательски относится к текущей, особенно когда штрафы начисляются по необъективным причинам. Это ведь не завод, где по плану надо за смену закрутить 100 болтов...

    В SEO кроме стандартных технических вещей, есть еще аналитика, поиск эффективных решений, анализ конкурентов и другие работы, где заранее определить, что тот или иной пункт займёт, к примеру, 18 минут - нельзя.
    Ответ написан
    3 комментария
  • Инвестиции в проект = халявные деньги?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Стартапы нужны чтобы отмывать бабки у лохов :). Фонды (лохи) выдают деньги в надежде что выстрелит 1 из 100. Остальные 99 никому не нужны и прогарят. Стартаперы на этом бабки зарабатывают, фонды тоже. Просто вероятность заработать у стартапера 1:10000 . у фонда 1:100 . что как бы намекает что фонд в проигрыше не останется.

    Настоящему бизнесу не нужны бабки в обмен на долю. Настоящий бизнес берет кредит в банке и развивается отдавая бабки а не долю. Потому что доля это самое ценное что есть у бизнеса.
    Ответ написан
    Комментировать
  • Как бороться со страхом использовать Javascript на сервере?

    Я думаю страх очень простой - из-за отстуствия ощущения поддержки. Большого Брата вроде MS или Оракла не стоит за Node.js. Я конечно не хочу сказать, что всем на него плевать и никто не предложит поддержку - другое дело, насколько эти фирмы на слуху.
    Смежным вопросом является доступность важных для коммерческой разработки вещей. Если вы ранее использовали WCF - не удивительно, что после такой махины, которая из коробки поддерживает огромное количество стандартов для олдскульных XML веб-сервисов (с безопасностью, адресацией и т.д.), и даже REST-сервисы, многие захотят идти в ноду и заново собирать себе там необходимые инструменты и библиотеки, даже если они есть (что конечно надо сначала проверить).
    Ну и, наконец, основным субъективным фактором является желание использовать полученные навыки. У WCF довольно приличный порог входа, и разбираться нужно реально долго, прежде чем можно чтото применить на практике с пониманием происходящего. Это как с WPF последнее время народ негодует - все потратили N месяцев на изучение (один XAML чего стоит), а от майкрософта за последние 6 лет толком не новшеств ни обновлений не было, все смотрят на переписанный с нуля ASP.NET (который теперь всю платформу ведет в правильное русло), и завидуют. Так и вы приходите весь в белом и говорите - забейте на ваш багаж корпоративного дотнета, все идем в ноду.
    Ответ написан
    5 комментариев
  • Как объективно протестировать производительность node.js и PHP в запросах к mysql БД?

    Как у нас на пхп. Пишешь строчки, выполняет по порядку. Сделал до конца одно, дальше. Как у нас с нодежс. Пишешь строчки и тоже по порядку, но не по такому порядку, как в php. К примеру у нас 2 обращения к базе. Они тоже будут идти по порядку, но почти одновременно, так как сразу после первого обращения к базе он не дожидаясь ответа обратится второй раз. Дожидаться ответа он уже будет в callback функции к обращению.

    PHP - спокойный тип, который спокойно выполняет задачи и не запутывается. Nodejs - карьерист амфетаминщик, который в любое свободное время (к примеру, пока ждет ответа от той же базы) будет выполнять другие свои обязанности.
    Ответ написан
    Комментировать
  • Javascript: как скопировать превью картинок в формате blob?

    Вот работающий пример копирования src в новую картинку
    jsfiddle.net/61xda7Ly

    Код картинки взят отсюда https://blueimp.github.io/JavaScript-Load-Image/
    Ответ написан
    3 комментария
  • Асинхронная многопоточность в PHP: для чего?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Все очень просто. Вот вам приблизительное значение таймингов доступа к данным:
    io-cost.png

    То есть запросив данные в сети мы тупо ждем. Долго ждем и ничего не делаем.

    В случае с curl (он же HTTP) мы можем соорудить очередь запросов и послать их одним махом и ждать пока завершится загрузка всех документов в очереди для обработки результатов. Если мы хотим забрать 10 документов, то без multi curl у нас ушло бы времени "среднее время получения документа" * 10. И это примерно. В случае же с мультикурлом мы получаем время обработки 10 запросов как время выполнения самого долгого запроса. Если представить что время запросов всегда одинаковое, получаем выйгрыш примерно в 10 раз.

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

    Так вот... возьмем блокирующие сокеты и попробуем запросить 1024 байт данных из оного. Причем клиент в данный момент ничего не отправляет, буфер чтения пустой. И так допустим минут 10. Как только мы сделали запрос за данными, и оказалось что буфер чтения пустой, процесс выполнения блокируется пока не появятся данные.

    А теперь представим что проверять периодически наличие данных нам надо не в одном сокете а в десятке. Представим так же что 9 клиентов подключенных по нашим сокетам хорошие и присылают данные вовремя, а один не хороший и любит тупить по пол часа. Если бы мы пользовались блокирующими сокетами, то мы можем обрабатывать только одного клиента за раз. Причем если у него вдруг данных не оказалось - нам придется ждать, хотя в других сокетах уже вполне могли появиться данные какие для обработки. И если в случае с "хорошими" клиентами мы можем тратить на оных по пол секунды - секундочке, то наткнувшись на плохого клиента наш сервер замирает за те самые пол часа о которых мы договаривались. Сервер тупо ждет "плохого" клиента а хорошие в итоге не могут достучаться до сервера. Новых соединений мы так же не установим... короче все мертво.

    И тут на помощ к нам приходит опция O_NONBLOCK. В этом случае если у сокета пустой буфер чтения он сразу вернет выполнение не вернув нам ни капли данных не дожидаясь медлительных клиентов-тугодумов. В случае если буфер не пустой - все будет так же как и в случае с блокирующими сокетами - тупо вернет содержимое буфера и вернет управление. Так что мы можем в бесконечном цикле просто проверять по очереди все сокеты. В этом случае делей получения данных будет сведен к минимуму.

    И вроде как все хорошо, да только бесконечный луп без блокировок это полная загрузка процессора. Не хорошо. При блокирующих вызовах нагрузка не большея (зависит от задачи) но тогда наш сервер очень медленно будет отвечать. Но не все так плохо.

    Еще есть такая чудная штука, которую предоставляет операционная система как select или epol (в контексте php socket_select и stream_select). Данные функции позволяют нам скармливать массивы сокетов, за которыми вы следите (не сокетов, а их дескрипторов но не суть, и не один массив а три, массив дескрипторов что бы следить появились ли данные на чтение, записал ли сокет все и освободился ли буфер записи и третий отслеживает сокеты в которых произошли какие-то ошибки, например отвалилось соединение). Так же этой функции можно задавать таймаут, что очень удобно если мы сначала собираем данные с нескольких клиентов и если от них небыло вестей пару секунд, значит мы забрали все и можно начинать обработку.

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

    Но все что выше имеет смысл только с TCP/TLS, если бы у нас были UDP сокеты, то было бы еще веселее. Там нету никаких буферов. Не принял данные - потерял данные. Нету соединений. Нету блокировок. Есть только пакеты. Поэтому этот протокол используют (или используют как основу) для реализации реалтайм систем. Задержек нету, а если какой пает не дошел, велика вероятность что он уже не актуален. Правда если сеть не надежная и потери пакетов велики, то начинается боль и слезы и обычно все же для таких случаев дублируют все на TCP.
    Ответ написан
  • Как изменить input без перезагрузки?

    0neS
    @0neS
    ajax

    Готовый код не прошу, но должны же быть решения готовые!!?
    эта пять
    Ответ написан
    Комментировать
  • Как заблокировать таблицу в SQL?

    @bobzer
    Java EE Developer
    когда первая копия create_task считала данные,создала поток но еще не изменила статус записи, а вторая копия уже считала данные
    Лично я уже много лет в таких случаях использую конструкцию SELECT ... FOR UPDATE - т.е. считывание с одновременной блокировкой, которое осуществляется в пределах открытой транзакции. Первый поток считывает запись и блокирует ее на уровне СУБД. При этом любой другой поток(и), попытавшийся считать запись также с модификатором FOR UPDATE будет ожидать своей очереди до тех пор, пока первый не завершит транзакцию (изменив при этом статус обработки). Только после этого следующий поток продолжит исполнение, и завершит операцию чтения. При этом надо не забыть проверить статус - если после захвата блокировки мы видим, что статус "обработано", то текущий поток "опоздал" и должен завершиться без дальнейшей обработки записи.
    Ответ написан
    Комментировать
  • Как заблокировать таблицу в SQL?

    @Sumor
    Прочитай про разные уровни изоляции. Например:
    MSDN SQL server
    MSDN ADO
    Wikipedia
    Ответ написан
    Комментировать
  • Как заблокировать таблицу в SQL?

    sim3x
    @sim3x
    По-хорошему тебе нужна очередь.

    По-плохому, сделай метки в таблице о том что происходит с тасками (в обработке, в очереди, ...)
    Ответ написан
    1 комментарий
  • Каков правильный путь изучения SQL?

    @andreyqin
    Теория - Грабер + www.sql-tutorial.ru
    Практика - sql-ex.ru
    Ответ написан
    Комментировать