Структуры данных и алгоритмы в Java (2-е издание)

Для меня основное достоинство книги «Структуры данных и алгоритмы в Java» — язык, которым автор описывает алгоритмы. Он не использует сложный академический язык, приправленный тонной высшей математики. Роберт Лафоре использует простой язык и пытается дать максимально простое объяснение, какое только возможно, каждому алгоритму. Почему эта книга? Эта книга — для занятых (или ленивых) студентов или программистов, которые решили повторить алгоритмы перед техническим интервью. Книгу можно просмотреть очень быстро: читаем список идей после каждой статьи, просматриваем примеры кода. Если что‑то показалось непонятным, возвращаемся к основному тексту главы. ...

15 августа 2017 г.

Горячие клавиши Emacs в русской раскладке

Думаю, вы, как и я, не можете позволить себе пользоваться только английской раскладкой клавиатуры. Так или иначе для работы приходится использовать обе: и русскую, и английскую. В целом это не доставляет никаких проблем, пока дело не касается Emacs. Не знаю почему, но в нём горячие клавиши в русской раскладке просто перестают работать. Видимо, сказывается страшное наследие «ASCII — единственно возможный набор символов для всех языков мира». Возможно, есть какие‑то другие причины. ...

10 июня 2017 г.

Property в классе наследнике

Кажется очевидным, что property можно переопределить в классе‑наследнике и вызвать super внутри этого переопределённого свойства. Вроде бы звучит нормально? Да, так и есть. Тем не менее, когда мой коллега задал мне такой вопрос, я «завис» на некоторое время. Возможно, я излишне подозрителен, но каждый раз, когда в коде есть какая‑то магия, я ожидаю подвоха. Поэтому я решил немного поэкспериментировать и доказать себе, что свойства (property) работают так, как ожидается. # -*- coding: utf-8 -*- from __future__ import print_function, unicode_literals, absolute_import class Parent(object): @property def prop(self): print("Parent property") class Child(Parent): @property def prop(self): super(Child, self).prop print("Child property") child = Child() child.prop Работает, как и ожидалось: ...

30 мая 2017 г.

Pyenv на маке

Довольно сложно управляться с несколькими версиями Python на одном ноутбуке. Хотя это довольно распространённая ситуация. Обычно у разработчиков несколько проектов, требующих разных версий Python. В целом есть несколько вариантов для решения этой задачи, но моим любимым остаётся pyenv в компании с плагином pyenv‑virtualenv. Раньше я использовал «голый» Homebrew, но это далеко не так гибко и удобно. Установка $ brew update $ brew install pyenv $ brew install pyenv-virtualenv $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile Базовый шаблон использования Настоятельно рекомендую делать отдельные виртуальные окружения для каждого проекта. Иногда бывает необходимо делать даже несколько окружений для одного проекта. К примеру, если хочется использовать mypy для проекта на Python 2. ...

19 мая 2017 г.

Обзор Soft Skills

Когда я начал читать «Soft Skills» Джона Сонмеза, я не знал, чего от неё ожидать. С одной стороны, как программисты, мы считаем, что нет ничего важнее написания кода. И это правда. Тем не менее чрезвычайно сложно найти интересный проект без продвижения самого себя. Я сомневался, что кто‑нибудь способен объяснить это разработчикам. Не могу сказать, что Джон делает это идеально, но его попытка достаточно хороша, чтобы потратить время и прочитать его книгу. ...

15 апреля 2017 г.

Это MOOC-курс хорош для меня?

Сейчас в сети довольно много различных массовых открытых онлайн‑курсов (MOOC). Одни платные, другие бесплатные. Пару лет назад о подобных курсах говорили на каждом углу: утверждали, что они убьют все другие формы обучения. Этого, разумеется, не произошло. Тем не менее эта форма — полезный и удобный инструмент самообразования, её точно стоит использовать в собственном учебном плане. Правда, стоит для начала выбрать подходящий курс. «Все животные равны. Но некоторые животные равны более, чем другие». Джордж Оруэлл, «Скотный двор» ...

5 апреля 2017 г.

Enums в Python

Enum — наименее используемая фича Python. Как программисты, мы предпочитаем использовать странные словари (дикты) или списки там, где могли бы использовать enum. По большей части это происходит из‑за того, что это довольно новая фича, и требуется использовать внешнюю библиотеку обратной совместимости, если используется Python версии 2.7. Тем не менее довольно много случаев, когда использовать enum гораздо удобнее. В любом проекте на Python легко найти код, который делает проверки против строковых литералов. Подобные конструкции используются для определения типов постов, ролей клиентов и тому подобного. Конечно, этот код меняется со временем — меняется набор используемых строковых литералов. Это делает такой код трудноподдерживаемым и труднотестируемым. ...

17 февраля 2017 г.

Почему я использую текстовые файлы

Примерно неделю назад я пытался мигрировать блог обратно на WordPress. Я решил дать ему ещё один шанс, поскольку у меня есть планы добавлять больше картинок к постам, что достаточно тяжело делать, используя Pelican: очень много ручной работы. В WordPress есть отличные инструменты для управления картинками. К тому же я думал, что WYSIWYG мне подойдёт. Я установил его и даже перенёс пару постов. Но всё же я решил остановиться: форматирование этих двух постов заняло у меня порядка 20 минут. ...

31 января 2017 г.

Effective Java второе издание

Если задать вопрос о том, какую книгу стоит прочесть о Java, все скажут, что «Effective Java». Эта книга есть во всех списках рекомендованных книг по Java — за исключением, пожалуй, только тех, авторы которых пытаются продать вам свои книги. Есть несколько причин, почему эта довольно старая книга остаётся такой популярной. Во‑первых, эта книга учит, как писать хороший Java‑код. Это значит не только быстрый код, но и читаемый, и поддерживаемый. Она описывает общие Java‑паттерны, которые делают ваш код более понятным для других программистов. Книга не рассказывает о том, как «хачить» JVM, — только о том, как использовать её более эффективно. ...

30 декабря 2016 г.

Делаем Java-подобный Optional в Python

В некоторых случаях использование None может превратить код в нечитаемую и неподдерживаемую кашу. К примеру, если есть необходимость отличить «пустое» значение от отсутствия значения для целочисленного ввода, когда 0 не может использоваться в качестве этого «пустого» значения, обойтись, используя только None, очень сложно. Одно из возможных решений — использовать что‑то подобное Optional из Java. Конечно, Optional — не совсем «питонячий» путь. В некоторых случаях можно использовать исключения, как предлагается в этой дискуссии на Stack Overflow. ...

25 ноября 2016 г.