Как стать автором
Обновить
8
0
Толмачёв Дмитрий @FiresShadow

Разработчик ПО

Отправить сообщение

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

Время на прочтение8 мин
Количество просмотров32K


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

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

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

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

Билл был первым профессиональным программистом, с которым я когда-либо работал. Да что тут говорить, он был первым программистом вообще, с которым я когда-либо работал. Он выдавал мне техзадание, по нему я писал программу на Visual Basic и затем отдавал ее на проверку Биллу. После этого он спокойно объяснял мне, что мой код никуда не годится.
Читать дальше →
Всего голосов 47: ↑41 и ↓6+35
Комментарии24

Как иногда плохой код и антипаттерн решают

Время на прочтение3 мин
Количество просмотров27K
Привет %username%!

Сегодня я хотел бы рассказать о том, как мне помог в проекте плохой код.

Кому интересно, прошу под кат.
Читать дальше →
Всего голосов 84: ↑61 и ↓23+38
Комментарии70

Нейросеть в 11 строчек на Python

Время на прочтение8 мин
Количество просмотров534K

О чём статья


Лично я лучше всего обучаюсь при помощи небольшого работающего кода, с которым могу поиграться. В этом пособии мы научимся алгоритму обратного распространения ошибок на примере небольшой нейронной сети, реализованной на 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)


Слишком сжато? Давайте разобьём его на более простые части.
Читать дальше →
Всего голосов 47: ↑44 и ↓3+41
Комментарии17

Параллельный парсинг большого количества HTML-страниц с помощью Apache Ignite (GridGain) в 200 строк кода

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

Попробую рассказать о своем опыте использования на примере простенькой задачи.
Читать дальше →
Всего голосов 13: ↑11 и ↓2+9
Комментарии14

Параллельная разработка настолки и компьютерной игры: как всё встало с ног на голову в разных версиях

Время на прочтение8 мин
Количество просмотров27K


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

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

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

Получился разговор вообще о том, что делает игру интересной. За жизнь такой.
Читать дальше →
Всего голосов 40: ↑37 и ↓3+34
Комментарии34

Пишем простейший плагин для ReSharper

Время на прочтение12 мин
Количество просмотров9K
Цель: написать, протестировать и развернуть простейший плагин для R#, содержащий пользовательские Quick-Fix и Context Action.

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

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

Заинтересовавшихся приглашаю под кат.
Читать дальше →
Всего голосов 20: ↑19 и ↓1+18
Комментарии8

Поиск с помощью регулярных выражений может быть простым и быстрым

Время на прочтение21 мин
Количество просмотров48K
В этой статье мы рассмотрим два способа поиска с помощью регулярных выражений. Один широко распространён и используется в стандартных интерпретаторах многих языков. Второй мало где применяется, в основном в реализациях 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? Это возможно и следует делать, и об этом пойдёт далее речь.
Читать дальше →
Всего голосов 85: ↑79 и ↓6+73
Комментарии14

TensorFlow: машинное обучение от Google, теперь – умнее и для всех

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

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

image

Читать дальше →
Всего голосов 20: ↑16 и ↓4+12
Комментарии30

Лекции Технопарка: мастер-класс Алексея Рыбака «Про то, что я бы хотел, чтобы мне рассказали, пока я учился»

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

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

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


Читать дальше →
Всего голосов 66: ↑61 и ↓5+56
Комментарии15

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

Время на прочтение15 мин
Количество просмотров67K
При работе с Entity Framework, как и с любым другими ORM, часто возникают вопросы, связанные с его производительностью. Многие разработчики из-за незнания нюансов делают ошибки, приводящие к плохим результатам. Затем, во время анализа проблем и поиска решений, недостаточно разобравшись в вопросе, приходят к выводу, что улучшить ситуацию можно только переходом на другой ORM или отказом от него вообще. Хоть в некоторых ситуациях такое решение может оказаться разумным, зачастую не все так плохо — просто нужно знать нюансы. В этой статье я попытался собрать те подводные камни, с которыми мне чаще всего приходилось сталкиваться на практике.
Читать дальше →
Всего голосов 32: ↑30 и ↓2+28
Комментарии21

Легкая прогулка от функтора через монаду к стрелке

Время на прочтение8 мин
Количество просмотров27K

Давайте совершим прогулку по цепочке Pointed, Functor, Applicative Functor, Monad, Category, Arrow, в процессе которой я попытаюсь показать что все это придумано не для того что бы взорвать мозг, а для решения вполне реальных проблем, притом существующих не только в haskell. Большая часть кода написана на C#, но думаю и без его знания можно будет понять что к чему.
Читать дальше →
Всего голосов 55: ↑43 и ↓12+31
Комментарии152

Почему Go — это плохо продуманный язык программирования

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

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

Я люблю Go, я полюбил его как только впервые попробовал его. Я потратил несколько дней на то, чтобы принять идиоматику, смириться с отсутствием дженериков, разобраться с откровенно странным способом обработки ошибок и вы знаете, всеми этими классическими проблемами, так или иначе связанными с Go. Я прочел Effective Go, много статеек из блога Dave Cheney, следил за всеми новостями из мира Go. Я даже могу сказать, что я достаточно активный участник сообщетсва! Я люблю Go и ничего не могу с этим поделать — Go просто замечательный. Тем не менее, я считаю, что Go это ужасный плохо продуманный язык, который делает совершенно не то, что «продает».
Читать дальше →
Всего голосов 140: ↑114 и ↓26+88
Комментарии289

<input> Я ♥ тебя, но ты меня обламываешь

Время на прочтение5 мин
Количество просмотров54K

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


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


Ранние годы



1995 был клевым годом. Друзья, Скорая Помощь, Зена по телеку. TLC занимали верхушки чартов с хитом "Waterfalls". С браузерами было нормуль, потому что HTML было все очень нормуль. У нас были Mosaic, Netscape и IE1, а при утверждении спеков HTML 2, наконец, выкроили время для стандартизации форм. Девяносто пятый был годом рождения <input>, и теперь, когда он достаточно взрослый, чтобы покупать в магазине алкоголь, нам нужно поговорить.
Продолжить чтение статьи
Всего голосов 73: ↑63 и ↓10+53
Комментарии55

Гексагональная архитектура

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

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


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



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



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



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


Читать дальше →
Всего голосов 20: ↑16 и ↓4+12
Комментарии16

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

Время на прочтение16 мин
Количество просмотров235K
Разрешите представить вам перевод статьи Нолана Лоусона «У нас проблемы с промисами», одной из лучших по теме из тех, что мне доводилось читать.

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


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

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

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

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

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

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

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

doSomething().then(doSomethingElse());

doSomething().then(doSomethingElse);

Узнайте решение задачи
Всего голосов 139: ↑136 и ↓3+133
Комментарии121

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

Время на прочтение5 мин
Количество просмотров39K

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


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


Читать дальше →
Всего голосов 43: ↑38 и ↓5+33
Комментарии11

Игры на CSS. Часть 2: StarCraft

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

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

Читать дальше →
Всего голосов 38: ↑35 и ↓3+32
Комментарии20

19 советов по повседневной работе с Git

Время на прочтение14 мин
Количество просмотров285K


Если вы регулярно используете 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. Быстрый поиск плохого коммита

Читать дальше →
Всего голосов 152: ↑149 и ↓3+146
Комментарии62

Игра на голом HTML / CSS

Время на прочтение3 мин
Количество просмотров89K
Сегодня речь пойдет о том, как создать игру не используя js и прочих скриптов. Только HTML / CSS, только хейткор.


Читать дальше →
Всего голосов 50: ↑45 и ↓5+40
Комментарии67

Блок-схема для выбора STL-алгоритма

Время на прочтение1 мин
Количество просмотров28K


Третьего дня, во время сортировки старых закладок, попалась мне на глаза блок-схема с алгоритмом выбора STL-контейнера. «Почему же для контейнеров есть, а для стандартных алгоритмов нет? — подумал я. — Это необходимо исправить». Подумано — сделано. Сперва планировалось за пару часов нарисовать нечто простенькое, но в дальнейшем обнаружилось, что алгоритмы никак не хотят умещаться в простенькую схему. Я слегка увлекся, и спустя два вечера схема вобрала в себя 84 алгоритма, а также немного дополнительной информации. Под катом можно увидеть, что получилось в итоге.
Долой велосипеды!
Всего голосов 56: ↑52 и ↓4+48
Комментарии19

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность