• Сравнение производительности версий PHP

    • Translation

    В этой статье мы рассмотрим результаты нескольких бенчмарков, начиная с PHP 5 и вплоть до экспериментальной JIT-ветки (сейчас в разработке). На момент написания не было известно, появится ли до PHP 8 ещё какая-то основная версия, например PHP 7.2. Но логично предположить, что возможности экспериментальной ветки как минимум будут включены в PHP 8.

    Читать дальше →
  • 36 млн запросов в час, 10000+ постоянно работающих клиентов, на одном сервере, nginx+mysql

    Сложилась ситуация, что участвую в проекте, который работает с достаточно большой нагрузкой. Как уже написал — 36 млн запросов в час. Я много чего прочитал и перепробовал за последний месяц, настраивая сервер; хотелось бы просто сжато и компактно выдать тезисно то, что работает хорошо в такой конфигурации.

    Первое, что я заметил — множество советов как все настроить под большую нагрузку. Читайте их внимательно, обычно в тексте найдете, что речь про «высокую нагрузку» в 15-20 тысяч клиентов в сутки. У нас клиентов примерно миллион, активных, ежедневных.

    У нас нет денег и мы все делаем за свой счет, поэтому экономим. Итог — весь миллион клиентов обслуживается на одном сервере, вот на таком — EX-60 на hetzner.
    Читать дальше →
  • Нейронные сети для начинающих. Часть 2



      Добро пожаловать во вторую часть руководства по нейронным сетям. Сразу хочу принести извинения всем кто ждал вторую часть намного раньше. По определенным причинам мне пришлось отложить ее написание. На самом деле я не ожидал, что у первой статьи будет такой спрос и что так много людей заинтересует данная тема. Взяв во внимание ваши комментарии, я постараюсь предоставить вам как можно больше информации и в то же время сохранить максимально понятный способ ее изложения. В данной статье, я буду рассказывать о способах обучения/тренировки нейросетей (в частности метод обратного распространения) и если вы, по каким-либо причинам, еще не прочитали первую часть, настоятельно рекомендую начать с нее. В процессе написания этой статьи, я хотел также рассказать о других видах нейросетей и методах тренировки, однако, начав писать про них, я понял что это пойдет вразрез с моим методом изложения. Я понимаю, что вам не терпится получить как можно больше информации, однако эти темы очень обширны и требуют детального анализа, а моей основной задачей является не написать очередную статью с поверхностным объяснением, а донести до вас каждый аспект затронутой темы и сделать статью максимально легкой в освоении. Спешу расстроить любителей “покодить”, так как я все еще не буду прибегать к использованию языка программирования и буду объяснять все “на пальцах”. Достаточно вступления, давайте теперь продолжим изучение нейросетей.
      Читать дальше →
    • Нейросеть в 11 строчек на Python

      • Translation

      О чём статья


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

      Дайте код!


      X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
      y = np.array([[0,1,1,0]]).T
      syn0 = 2*np.random.random((3,4)) - 1
      syn1 = 2*np.random.random((4,1)) - 1
      for j in xrange(60000):
          l1 = 1/(1+np.exp(-(np.dot(X,syn0))))
          l2 = 1/(1+np.exp(-(np.dot(l1,syn1))))
          l2_delta = (y - l2)*(l2*(1-l2))
          l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
          syn1 += l1.T.dot(l2_delta)
          syn0 += X.T.dot(l1_delta)
      


      Слишком сжато? Давайте разобьём его на более простые части.
      Читать дальше →
    • Правильное использование Yii

      Вступление


      На самом деле, в заголовке должен стоять знак вопроса. Довольно долго я не кодил как на yii, так и на php в целом. Сейчас, вернувшись, хочется переосмыслить свои принципы разработки, понять куда двигаться дальше. И лучший способ — изложить их и выложить на ревью профессионалам, что я и делаю в этом посте. Несмотря на то, что я преследую чисто корыстные цели, пост будет полезен многим новичкам, и даже не новичкам.
      Читать дальше →
    • Визуализация concurrency в Go с WebGL

        Одной из самых сильных сторон языка программирования Go является встроенная поддержка concurrency, основанная на труде Тони Хоара «Communicating Sequential Processes». Go создан для удобной работы с многопоточным программированием и позволяет очень легко строить довольно сложные concurrent-программы. Но задумывались ли вы когда-нибудь, как выглядят различные паттерны concurrency визуально?

        Конечно, задумывались. Все мы, так или иначе, мыслим визуальными образами. Если я попрошу вас о чём-то, что включает числа «от 1 до 100», вы мгновенно их «увидите» в своей голове в той или иной форме, вероятно даже не отдавая себе в этом отчёт. Я, к примеру, ряд от 1 до 100 вижу как линия с числами уходящая от меня, поворачивающая на 90 градусов вправо на числе 20 и продолжающая до 1000+. И, покопавшись в памяти, я вспоминаю, что в самом первом детском саду в раздевалке вдоль стены были написаны номерки, и число 20 было как-раз в углу. У вас же, вероятно, какое-то свое представление. Или вот, другой частый пример — представьте круглый год и 4 сезона года — кто-то их видит как квадрат, каждая грань которого принадлежит сезону, кто-то — как круг, кто-то ещё как-то.

        Так или иначе, позвольте мне показать мою попытку визуализировать основные паттерны concurrency с помощью Go и WebGL. Эти интерактивные визуализации более-менее отражают то, как я вижу это в своей голове. Интересно будет услышать, насколько это отличается от визуализаций читателей.

        Читать дальше →
      • Интересные способы использования Go каналов (перевод)

        Предлагаю вам перевод статьи Gary Willoughby «Interesting ways of using Go channels».

        Статья предназначена для тех, кто уже немного разбирается в Go.

        gopher

        Интересные способы использования Go каналов


        Я написал этот пост, чтобы задокументировать доклад про Go каналы Джона Грэм-Камминга на конференции GopherCon 2014. Доклад назывался «Краткое руководство по каналам» и он доступен для просмотра на youtube.com.

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

        Следующие примеры демонстрируют различные техники, как использовать каналы в Go. Код был специально упрощен для их понимания. Не стоит его использовать для продакшн версий. Например, пропущены все обработки ошибок.
        Читать дальше →
      • Nginx + Lua + Redis. Эффективно обрабатываем сессию и отдаем данные

          image
          Предположим, у вас есть данные, которые вы хотите кэшировать и отдавать, не используя тяжелые языки, как php, при этом проверяя, что пользователь аутентифицирован и имеет право на доступ к данным. Сегодня я расскажу, как, используя связку nginx lua redis, выполнить эту задачу, снять нагрузку с сервера и увеличить скорость отдачи информации сервером в десятки раз.
          Читать дальше →
        • Что такое красивый код, и как его писать?

          1. Вступление


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

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

          Но когда дело доходит собственно до кода, все становится гораздо менее однозначно. Да, можно указать на слабые места, можно даже объяснить, что с ними не так. И в следующий раз получить ревью с абсолютно новым набором проблем.

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

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

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

          В этом-то и заключается вся сложность: твое представление о “достойном” и “красивом” коде полностью основано на личном многолетнем опыте. Попробуй теперь передать это представление в сжатые сроки человеку с совсем другим опытом или даже вовсе без него.

          Но если для нас действительно важно качество кода, который пишут люди, работающие вместе с нами, то попробовать все же стоит!
          Читать дальше →
        • ipgeobase в Nginx

            Когда возникает задача — по адресу посетителя получать его город и налоговый (автомобильный) код региона, кажется — да это же просто, в инете полно таких штук!
            А потом смотришь: одни платные, другие нельзя у себя развернуть, третьи можно, но это ресурсозатратно, четвертые о регионах РФ ничего не знают…
            И тут на помощь спешит больной мозг программиста с навязчивой идеей: «Нет у других — сделай сам»

            Читать дальше →
            • +22
            • 15.7k
            • 9
          • Пусковая петля: запуск полезного груза на орбиту за 3$/кг

              UPD3: за сутки «псевдо-собрали» 1.000.000$ и более 500 желающий полететь в космос

              «Планета есть колыбель разума, но нельзя вечно жить в колыбели.» Циолковский

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

              В комментах к посту "3d принтер будет печатать космические конструкции прямо на орбите" впервые увидел упоминание о технологии "пусковая петля"

              Меня поразило то, что это законченная(т.е. не требующая еще не существующих ресурсов, как сверхпрочные материалы) технология, в отличие от прочих технологий безракетного космического запуска.
              Единственное, чего не хватает, — спроса на данную услугу.

              ТТХ «Петли»
              Уровень перегрузки — 3g
              Количество груза в год — 6.000.000 тонн (шесть миллионов тонн)
              Частота запусков — 80 запусков в час
              Окупаемость — 5 лет
              Стоимость установки — 30 млрд $ (Бюджет Сочи 2014 — 950+ млрд руб. пруф)
              Стоимость вывода на орбиту 1 кг полезного груза — 3$ (три доллара за кг)
              Читать дальше →
            • Кэширование фронтэнда: Flask, Nginx+Memcached+SSI

              Достаточно давно мне на глаза попались следующие статьи по этой тематике:

              С PHP я дружу, поэтому попробовал примеры и убедился, что это работает. Но всё это имело «фатальные недостатки» :) — PHP, а я фанат Python и по работе занимаюсь в основном бэкендом. Серьёзно говоря, применить на практике это не представлялось возможным.

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

              В первую очередь было реализовано черновое решение для моего любимого фрэймворка Flask использующее для кэширования стек Varnish+ESI. Это заработало и даже показало неплохие результаты. Позже пришло понимание, что возможно Varnish «лишний игрок» и всё тоже и даже гибче можно получить на связке Nginx+Memcached+SSI. Был сделан и этот вариант, по производительности особых отличий замечено не было, но последний показался более гибким и управляемым.

              Тот проект не вырулил даже на взлетную полосу, или вырулил но без меня. Подумав, я решил «причесать код» и выложить его в OpenSource и на суд общественности.
              Читать дальше →
            • Сказ о том, как бы я продвигал сайт или не так страшно SEO как его малюют

              • Tutorial

              Сначала предметная область


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

              Ключи/запросы


              Это фразы, которые набираются в поиске, для достижения результата (ответа на вопрос, покупки, получения информации…)
              По частотностям
              НЧ – низкочастотные (величина вычисляется логарифмически относительно самого большого числа запросов по ВЧ запросу из категории), для простоты пусть будет все что ниже 300 запросов (хотя в каждой группе по разному).
              СЧ – среднечастотные (величина вычисляется логарифмически относительно самого большого числа запросов по ВЧ запросу из категории), для простоты пусть это будет все что выше 300 и ниже 2000 запросов (хотя в каждой группе по разному).
              ВЧ – максимальное значение количества поисков простого запроса, к примеру «Светильник».
              По конкуренции
              НК – низкоконкурентные запросы, по которым есть шанс двинуться в топ (мало точных вхождений поисковой фразы, мало главных страниц, низкое количество результатов в поисковой выдаче)
              СК – средне конкурентные запросы, по которым есть шанс продвинуться в топ, но есть и конкуренция (весь топ занят или главными или точными вхождениями, но показатели ссылочной массы конкурентов низкие)
              ВК – высококонкурентные запросы, по которым необходимо из кожи вон вылезти чтоб продвинуться (и топ весь занят, и ссылочная масса ужасающая) при средних бюджетах ВК топ недостижим, но можно долго работать, чтоб кардинально поменять выдачу (закупка сателлитов, ссылочной массы, грамотное внутренне СЕО).

              Семантическое ядро


              Предполагает, что будет оптимизироваться каждая страница сайта. Это значит, что страница конечно будет давать ответ на запрос пользователя, но при этом на ней должен быть материал, который включает в себя эти ответы. То есть признаки, по которым ПС сможет выдать именно эту страницу на это запрос…
              Пока что это сами запросы пользователей – они же «КЛЮЧИ»
              Ключевые фразы подбираются для каждой страницы персонально.
              Для главной страницы берутся общие запросы (описывающие общую категорию и выделяющие общую тематику сайта).
              Для страницы категории выбираются запросы более узкой тематики, выделяющие отдельную категорию в общей всего сайта.
              Для страницы товара/услуги – берутся максимально конкретные запросы, отражающие ее суть и позволяющие максимально точно ее/его идентифицировать.

              0 Стратегия: Тариф Беззаботный


              Минимум затрат, так как трафик тупо покупается у ПС. Других вариантов нет.

              1 Стратегия: На халяву


              Низкоконкурентный трафик – занимается ниша, где есть спрос, но нет конкурентов – классический «кто первый встал – того и тапки».
              Схема до боли проста – ищем свободные ниши, подбираем НК запросы, пишем материал (даем полезное на запрос пользователя) – попадаем в ТОП, для усиления эффекта можно закупить по парочке ссылок.
              Посмотреть нормальные стратегии...
            • Не повторяйте моих ошибок на собеседовании

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

              Также рискну обрисовать пути решения проблем, состоящие в том, чтобы поменять то, что можно поменять (в основном — себя), а не то, чего изменить нельзя (скажем, рынок труда).

              Ошибка №1
              Соискатель получает столько приглашений на собеседование, что не в состоянии их обработать.
              Логичный вывод соискателя: «на рынке острый дефицит кадров, так что могу отсеивать компании как хочу, отфутболив тех, кто заикнется о коде на бумажке, сортировках или гномиках». Возможна и менее скромная вариация того же вывода: «раз меня все хотят, значит, я классный профессионал, могу всем диктовать свои условия». Звучит, вроде, логично, но абсолютно бесполезно.

              Я предлагаю взглянуть на корень ошибки (да-да, это ошибка). Если соискатель получает слишком много приглашений — значит, он неправильно составил резюме. Ведь именно резюме послужило причиной лавинообразного интереса.
              Читать дальше →