• Зачем разработчику издеваться над собственным кодом

    • Translation


    Проблема решена: 317 кликов исправили ошибку

    В 1992 году я считал себя лучшим программистом в мире. В свое оправдание могу сказать лишь, что тогда я только закончил колледж (это было еще до появления Интернета) и жил в Боулдере, штат Колорадо, подрабатывая в мелких компаниях – я почитал за большую удачу возможность просто услышать о других программистах, не говоря уже о том, чтобы повстречаться с ними.

    В итоге я познакомился с человеком по имени Билл О’Нил, который нанял меня в качестве программиста, работающего по контракту. Он создал компанию с довольно неоригинальным названием Computer Research & Technologies, и мы стали работать над различными задачами вместе.

    Мы занимались разработкой CRUD-приложений [Create, Read, Update, Delete – вариант приложения с базовыми функциями создания, просмотра, обновления и удаления записей в базе данных – прим. перев.] для бизнеса на Visual Basic и FoxPro под Windows 3.1 (и иногда под DOS, так как предчувствовали, что новомодный графический интерфейс останется с нами надолго).

    Билл был первым профессиональным программистом, с которым я когда-либо работал. Да что тут говорить, он был первым программистом вообще, с которым я когда-либо работал. Он выдавал мне техзадание, по нему я писал программу на Visual Basic и затем отдавал ее на проверку Биллу. После этого он спокойно объяснял мне, что мой код никуда не годится.
    Читать дальше →
  • Нейросеть в 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)
    


    Слишком сжато? Давайте разобьём его на более простые части.
    Читать дальше →
  • Параллельный парсинг большого количества HTML-страниц с помощью Apache Ignite (GridGain) в 200 строк кода

    Периодически у меня появляются задачи обработать большое количество файлов. Обычно это конвертирование из одного формата в другой: XSLT-трансформация, парсинг, конвертация картинок или видео. Для решения этих проблем я приспособил фреймворк GridGain In-Memory Data Fabric. Он дает возможность делать distributed computing, MapReduce, распределенные кэши и очереди, распределенную файловую систему в памяти, перемещение кода к данным, job stealing, ускорители для Hadoop и многие другие модные ныне вещи. И все это легко и под разные операционки. Вы легко можете все это пощупать под виндовс.

    Попробую рассказать о своем опыте использования на примере простенькой задачи.
    Читать дальше →
  • Параллельная разработка настолки и компьютерной игры: как всё встало с ног на голову в разных версиях



      Есть такой парень Влаада Хватил. Он живёт в Чехии, любит играть и время от времени выпускает какую-нибудь мелкую штуку. Несколько лет назад очередная «мелкая штука» взяла и порвала рынок сначала Чехии, потом Европы, а потом и США. Ну и наш немного.

      Он сделал игру «Космические дальнобойщики», второй тираж которой почти не доехал до магазинов – разобрали на предзаказах. Третий тираж ждала вся Европа – я помню, в Праге продавец в магазине назвал мне точное количество дней до поставки. Они там считали каждый час и вели тетрадку учёта предзаказов. Толстую.

      Этой игрой Влаада добавил новый атом в список механик настолок (что случается раз в пару лет) – механики реального времени для походовых игр. Так вот, я поговорил с ним о разработке, в особенности – о том, какие грабли были при переносе его игры в приложение.

      Получился разговор вообще о том, что делает игру интересной. За жизнь такой.
      Читать дальше →
    • Пишем простейший плагин для ReSharper

      • Tutorial
      Цель: написать, протестировать и развернуть простейший плагин для R#, содержащий пользовательские Quick-Fix и Context Action.

      План статьи:
      1. Настройка среды разработки
      2. Пример №1: простейшее расширение-заглушка
      3. Установка плагина
      4. Отладка, полезные советы
      5. Пример №2: модификация кода с помощью R# API
      6. Функциональное тестирование плагинов средствами R# API

      В ролях:
      Visual Studio 2015
      ReSharper Ultimate 10

      Заинтересовавшихся приглашаю под кат.
      Читать дальше →
      • +18
      • 8.2k
      • 8
    • Поиск с помощью регулярных выражений может быть простым и быстрым

      • Translation
      В этой статье мы рассмотрим два способа поиска с помощью регулярных выражений. Один широко распространён и используется в стандартных интерпретаторах многих языков. Второй мало где применяется, в основном в реализациях awk и grep. Оба подхода сильно различаются по своей производительности:



      В первом случае поиск занимает A?nAn времени, во втором — An.

      Степени обозначают повторяемость строк, то есть A?3A3 — это то же самое, что и A?A?A?AAA. Графики отражают время, требуемое для поиска через регулярные выражения.

      Обратите внимание, что в Perl для поиска строки из 29 символов требуется более 60 секунд. А при втором методе — 20 микросекунд. Это не ошибка. При поиске 29-символьной строки Thompson NFA работает примерно в миллион раз быстрее. Если нужно найти 100-символьную строку, то Thompson NFA справится менее чем за 200 микросекунд, а Perl понадобится более 1015 лет. Причём он взят лишь для примера, во многих других языках наблюдается та же картина — в Python, PHP, Ruby и т. д. Ниже мы рассмотрим этот вопрос более детально.

      Наверняка вам трудно поверить приведённым данным. Если вы работали с Perl, то вряд ли подмечали за ним низкую производительность при работе с регулярными выражениями. Дело в том, что в большинстве случаев Perl обращается с ними достаточно быстро. Однако, как следует из графика, можно столкнуться с так называемыми патологическими регулярными выражениями, на которых Perl начинает буксовать. В то же время у Thompson NFA такой проблемы нет.

      Возникает логичный вопрос: а почему бы в Perl не использовать метод Thompson NFA? Это возможно и следует делать, и об этом пойдёт далее речь.
      Читать дальше →
    • TensorFlow: машинное обучение от Google, теперь – умнее и для всех

      • Translation
      Всего-то пару лет назад мы не могли общаться с приложениями Google сквозь уличный шум, не переводили русские надписи в Google Translate и не искали фото того самого лабрадудля в Google Photos, только лишь о нём услышав. Дело в том, что наши приложения были тогда недостаточно умны. Что ж, очень быстро они стали значительно, значительно умнее. Сегодня, благодаря технологии машинного обучения, все эти замечательные штуки, равно как и многое другое и более серьёзное, мы можем делать играючи.

      В общем, встречайте: мы создали принципиально новую систему машинного обучения по имени TensorFlow. TensorFlow быстрее, умнее и гибче в сравнении с нашей предыдущей технологией (DistBelief, с 2011, та самая, что распознавала кошку без учителя), благодаря чему стало значительно проще адаптировать её к использованию в новых продуктах и исследовательских проектах. TensorFlow – высокомасштабируемая система машинного обучения, способная работать как на простом смартфоне, так и на тысячах узлов в центрах обработки данных. Мы используем TensorFlow для всего спектра наших задач, от распознавания речи до автоответчика в Inbox и поиска в Google Photos. Такая гибкость позволяет нам конструировать и тренировать нейросетки до 5 раз быстрее в сравнении с нашей старой платформой, так что мы действительно можем использовать новую технологию значительно оперативнее.

      image

      Читать дальше →
    • Скриптование под .NET на JScript

      Хочу показать простой пример, как просто с помощью стандартных средств подгружать яваскриптовские скрипты и работать с ними. Для простоты эксперимента пусть в скриптах будут опеределяться две функции:
      Name() — возвращает имя скрипта, которое могло бы в реальной игре быть именем бота.
      Do(x, y) — некая функция, которая принимает два числовых аргумента, что-то делает и возвращает результат. В реальной игре она могла бы отвечать за поведение бота.
      Читать дальше →
    • Лекции Технопарка: мастер-класс Алексея Рыбака «Про то, что я бы хотел, чтобы мне рассказали, пока я учился»

        Сегодня мы начинаем серию публикаций новых мастер-классов Технопарка. И первая из них — мастер-класс Алексея Рыбака на свободную тему, в котором он поделился со студентами соображениями о том, чем работа в реальной жизни отличается от учебы. Видео смотрите на нашем сайте, а адаптированную расшифровку — ниже.

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

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


        Читать дальше →
      • Подводные камни Entity Framework и производительность

          При работе с Entity Framework, как и с любым другими ORM, часто возникают вопросы, связанные с его производительностью. Многие разработчики из-за незнания нюансов делают ошибки, приводящие к плохим результатам. Затем, во время анализа проблем и поиска решений, недостаточно разобравшись в вопросе, приходят к выводу, что улучшить ситуацию можно только переходом на другой ORM или отказом от него вообще. Хоть в некоторых ситуациях такое решение может оказаться разумным, зачастую не все так плохо — просто нужно знать нюансы. В этой статье я попытался собрать те подводные камни, с которыми мне чаще всего приходилось сталкиваться на практике.
          Читать дальше →
        • Легкая прогулка от функтора через монаду к стрелке


            Давайте совершим прогулку по цепочке Pointed, Functor, Applicative Functor, Monad, Category, Arrow, в процессе которой я попытаюсь показать что все это придумано не для того что бы взорвать мозг, а для решения вполне реальных проблем, притом существующих не только в haskell. Большая часть кода написана на C#, но думаю и без его знания можно будет понять что к чему.
            Читать дальше →
          • Почему Go — это плохо продуманный язык программирования

            • Translation
            Это перевод статьи юзернейма tucnak с Medium, которая получила обширное обсуждение на reddit.com/r/programming.

            image
            Окей, заголовок действительно несколько громкий, признаю. Cкажу больше: я прусь от громких заголовков, все из-за внимания. В этой блогозаписи я постараюсь доказать тот факт, что Go это ужасно продуманный язык (спойлер: это так). Я уже играюсь с Go уже на протяжении нескольких месяцев, первый helloworld собрал, кажется, в июне. Математик из меня никакой, но с тех пор прошло уже что-то около 4 месяцев и я даже успел залить на Github несколько репозиториев и собрать немного звезд! Стоит также упомянуть, что у меня совершенно нет опыта применения Go в продакшне, так что любые мои слова о «поддержке кода» или «деплое» не стоит принимать за единственноверную истину.

            Я люблю Go, я полюбил его как только впервые попробовал его. Я потратил несколько дней на то, чтобы принять идиоматику, смириться с отсутствием дженериков, разобраться с откровенно странным способом обработки ошибок и вы знаете, всеми этими классическими проблемами, так или иначе связанными с Go. Я прочел Effective Go, много статеек из блога Dave Cheney, следил за всеми новостями из мира Go. Я даже могу сказать, что я достаточно активный участник сообщетсва! Я люблю Go и ничего не могу с этим поделать — Go просто замечательный. Тем не менее, я считаю, что Go это ужасный плохо продуманный язык, который делает совершенно не то, что «продает».
            Читать дальше →
          • <input> Я ♥ тебя, но ты меня обламываешь

            • Translation

            Привет, представляю твоему вниманию перевод статьи Моники Динкулеску '<input> I ♡ you, but you're bringing me down'. Художественный перевод с английского не является моей основной специализацией, поэтому в тексте возможны неточности. Правки призываю отправлять личным сообщением, а если есть что сказать, велкам в комментарии. Отдельное спасибо @Kt за редакторские правки. Приятного чтения.


            Некоторые люди делают мебель. Некоторые люди вяжут. Некоторые люди имеют хобби, которые никак не пересекаются с HTML спецификациям из 90-х. Но я не из таких. И, вот история о том, как <input> стал той хренью, которой он является, и почему его надо сжечь


            Ранние годы



            1995 был клевым годом. Друзья, Скорая Помощь, Зена по телеку. TLC занимали верхушки чартов с хитом "Waterfalls". С браузерами было нормуль, потому что HTML было все очень нормуль. У нас были Mosaic, Netscape и IE1, а при утверждении спеков HTML 2, наконец, выкроили время для стандартизации форм. Девяносто пятый был годом рождения <input>, и теперь, когда он достаточно взрослый, чтобы покупать в магазине алкоголь, нам нужно поговорить.
            Продолжить чтение статьи
          • Гексагональная архитектура

            • Translation
            На недавнем Laracon NYC я читал доклад о гексагональной архитектуре. Несмотря на то, что я получил позитивную реакцию слушателей, мне кажется, что остались люди, которые хотели бы получить чуть более полное представление о том, что это такое. Разумеется, с примерами. Это моя попытка расширить тот доклад.

            1. Видео с доклада
            2. Слайды


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



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



            Гексагональная архитектура, ни в коем случае не новый подход к разработке с применением фреймворков. Напротив, это всего лишь обобщение «лучших практик» — практик новых и старых. Я обернул эти слова в кавычки, чтобы люди не воспринимали их совсем буквально. Лучшие практики, которые работают для меня, могут не работать для вас — все зависит от задачи и преследуемых целей.



            Этот тип архитектуры придерживается классических идей, к которой приходят разработчики при проектировании приложений: отделение кода приложения от фреймворка. Пусть наше приложение формируется само по себе, а не на базе фреймворка, используя последний только как инструмент для решения каких-то задач нашего приложения.


            Читать дальше →
          • У нас проблемы с промисами

            • Translation
            Разрешите представить вам перевод статьи Нолана Лоусона «У нас проблемы с промисами», одной из лучших по теме из тех, что мне доводилось читать.

            У нас проблемы с промисами


            Дорогие JavaScript разработчики, настал момент признать это — у нас проблемы с промисами.

            Нет, не с самими промисами. Их реализация по спецификации A+ превосходна. Основная проблема, которая сама предстала передо мной за годы наблюдений за тем, как многие программисты борются с богатыми на промисы API, заключается в следующем:

            — Многие из нас используют промисы без действительного их понимания.

            Если вы мне не верите, решите такую задачку:

            Вопрос: В чем разница между этими четырьмя вариантами использования промисов?

            doSomething().then(function () {
              return doSomethingElse();
            });
            
            doSomething().then(function () {
              doSomethingElse();
            });
            
            doSomething().then(doSomethingElse());
            
            doSomething().then(doSomethingElse);
            

            Узнайте решение задачи
          • Балансировка 70 тысяч запросов в секунду на HighLoad++


              Библиотека докладов


              Это не просто статья — это целая библиотека докладов про внутреннее устройство тех или иных крупных и высоконагруженных проектов. Все эти доклады звучали на конференциях HighLoad++ и РИТ++ за последние несколько лет.


              Читать дальше →
            • Игры на CSS. Часть 2: StarCraft

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

              Смотрите видео и под кат.

              Читать дальше →
            • 19 советов по повседневной работе с Git

              • Translation
              • Tutorial


              Если вы регулярно используете Git, то вам могут быть полезны практические советы из этой статьи. Если вы в этом пока новичок, то для начала вам лучше ознакомиться с Git Cheat Sheet. Скажем так, данная статья предназначена для тех, у кого есть опыт использования Git от трёх месяцев. Осторожно: траффик, большие картинки!

              Содержание:
              1. Параметры для удобного просмотра лога
              2. Вывод актуальных изменений в файл
              3. Просмотр изменений в определённых строках файла
              4. Просмотр ещё не влитых в родительскую ветку изменений
              5. Извлечение файла из другой ветки
              6. Пара слов о ребейзе
              7. Сохранение структуры ветки после локального мержа
              8. Исправление последнего коммита вместо создания нового
              9. Три состояния в Git и переключение между ними
              10. Мягкая отмена коммитов
              11. Просмотр диффов для всего проекта (а не по одному файлу за раз) с помощью сторонних инструментов
              12. Игнорирование пробелов
              13. Добавление определённых изменений из файла
              14. Поиск и удаление старых веток
              15. Откладывание изменений определённых файлов
              16. Хорошие примечания к коммиту
              17. Автодополнения команд Git
              18. Создание алиасов для часто используемых команд
              19. Быстрый поиск плохого коммита

              Читать дальше →