• 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. Быстрый поиск плохого коммита

    Читать дальше →
  • Как вырастить айтишника



      Как недавно признался Цукерберг, «я никогда не стал бы программистом, если бы не играл ребёнком в компьютерные игры». Не станем утверждать, что путь к успеху в IT лежит через геймерство. Но всё же без тесного знакомства с самыми разными программами и гаджетами программисту не обойтись. И в наши дни знакомство это начинается с достаточно раннего детства. Информационные технологии уже давно проникли в нашу жизнь. Современные программисты, в детстве игравшие на приставках и компьютерах, зачастую сталкивались с непониманием родителей, в чьей молодости не было подобных вещей. Зато теперь эти самые программеры сами обзавелись детьми и гораздо лучше понимают их увлечения. Зачастую даже становятся этакими наставниками по хайтек-развлечениями, обучая детей премудростям комбо-ударов, постройки юнитов и частой отправки врагов на респаун. Как волки обучают волчат азам охоты. И нам стало любопытно, во что же программисты сегодня могут поиграть со своими детьми? И не просто поиграть, а с пользой для молодого ума.
      Читать дальше →
    • «Never say never» или Работаем с таймзонами правильно

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

        TL;DR: Работа с таймзонами — это боль и унижение. Никогда не работайте с таймзонами!

        Итак, все кругом твердят вам, что при получении времени от пользователя нужно сразу же переводить его в UTC, работать со временем нужно только в UTC и хранить время тоже нужно строго в UTC. Совет, на первый взгляд, выглядит разумным, и следование ему делает вашу жизнь проще… Если только ваша программа не предполагает сложной работы с датами. Записать в базу данных дату и время регистрации пользователя на сайте? Сохранить время отправки сообщения или дату создания заказа в интернет-магазине? Вывести сообщение в лог с указанием даты-времени? Используйте UTC и всё будет в порядке, можете даже не читать эту статью дальше. Любое текущее время можно совершенно спокойно конвертировать в UTC и забыть о проблемах. Но что, если мы хотим работать с временем в будущем? Или в прошлом? Например, если мы пишем сервис календаря, или сервис для отложенной отправки сообщений?

        Читать дальше →
      • «Eppur si muove!»* или Работаем с таймзонами в Python

        • Translation
        На нашей планете Земля, в одно и то же время, в разных географических точках планеты может быть разное время суток. Это следствие того, что наш мир — вращающийся геоид, а не плоский диск, а что наша Солнечная система имеет только одну звезду — Солнце. Ещё со школы всем известно о часовых поясах, и все мы встречались с их проявлениями в реальной жизни («Московское время – 15 часов, в Петропавловске-Камчатском – полночь», джетлаг при дальних перелётах, и т.д.). К несчастью, часовые пояса всего лишь частично основаны на физических особенностях нашего мира, и при компьютерных вычислениях приходится учитывать другие, порой неожиданные, нюансы.

        * «И всё-таки она вертится!» — крылатая фраза, которую якобы произнёс Галилео Галилей, покидая процесс инквизиции после отречения от своего убеждения в том, что Земля вращается вокруг Солнца. В нашем случае, увы, это вращение приводит ко всем этим «замечательным» проблемам с часовыми поясами.

        Что общего у этой статьи и Галилео? Да, в общем-то, ничего. Боюсь, что если бы наш мир был центром вселенной, нам всё равно пришлось бы иметь дело с таймзонами. Будем считать заголовок моей оплошностью, которую я уже не могу исправить (хотя я могу).
        Читать дальше →
      • Пишем код C на Cython

        • Translation
        Последние два года я решаю все задачи исключительно на Cython. Это вовсе не значит, что я пишу на Питоне, а потом «Ситонизирую» это с использованием различных деклараций типов, нет, я просто пишу на Cython. Я использую «сырые» структуры и массивы C (а иногда и векторы C++) и маленькую обёртку вокруг malloc/free, которую я написал сам. Код работает практически так же быстро, как C/C++, потому что это и есть код на C/C++, украшенный синтаксическим сахаром. Это код на C/C++ с функционалом Python именно там, где мне это нужно и где я этого хочу.

        Читать дальше →
      • Типы данных наносят ответный удар

        • Translation
        Это вторая часть моих размышлений на тему «Python, каким бы я хотел его видеть», и в ней мы более подробно рассмотрим систему типов. Для этого нам снова придётся углубиться в особенности реализации языка Python и его интерпретатора CPython.

        Если вы программист на языке Python, для вас типы данных всегда оставались за кадром. Они где-то там существуют сами по себе и как-то там взаимодействуют друг с другом, но чаще всего вы задумываетесь об их существовании только когда возникает ошибка. И тогда исключение говорит вам, что какой-то из типов данных ведёт себя не так, как вы от него ожидали.

        Python всегда гордился своей реализацией системы типов. Я помню, как много лет назад читал документацию, в которой был целый раздел о преимуществах утиной типизации. Давайте начистоту: да, в практических целях утиная типизация — хорошее решение. Если вы ничем не ограничены и нет нужды бороться с типами данных по причине их отсутствия, вы можете создавать очень красивые API. Особенно легко на Python получается решать повседневные задачи.

        Практически все API, которые я реализовывал на Python, не работали в других языках программирования. Даже такая простая вещь, как интерфейс для работы с командной строкой (библиотека click) просто не работает в других языках, и основная причина в том, что вам приходится беспрестанно бороться с типами данных.

        Не так давно поднимался вопрос добавления статической типизации в Python, и я искренне надеюсь, что лёд, наконец, тронулся. Постараюсь объяснить, почему я против явной типизации, и почему надеюсь, что Python никогда не пойдёт по этому пути.

        Читать дальше →
      • Гик-конкурс: как мы это делали (часть 2) и итоги

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



          Начнём мы, пожалуй, с принтера.

          Принтер

          Критически важным узлом нашего проекта по понятным причинам является принтер, поэтому к его выбору мы подошли особенно тщательно. Перебрав около 15 разных моделей, мы остановились на струйном принтере HP Officejet Pro X451dw с возможностью дуплексной печати (то есть с двух сторон листа). Его конкурентным преимуществом стали также высокая скорость печати, большой лоток на 500 листов (с возможностью докупить ещё один на такое же количество) и достаточно большая высота, на которой расположено выходное окно для отпечатанных листов.
          Читать дальше →
        • Гик-конкурс: как мы это делали (часть 1)



            Как многие из вас наверняка помнят, у нас сейчас в самом разгаре розыгрыш призов. Вкратце напомним, о чём речь. Некоторое время назад мы задались идеей придумать что-нибудь интересное для Хабра, приуроченное ко Дню программиста. В результате долгих обсуждений нам пришла в голову мысль провести розыгрыш призов, но не классический и скучный, а необычный и гиковский. В ходе экспериментов и споров на свет родилась хитроумная установка для печати билетов участников розыгрыша и… измерения веса общей массы билетов. Arduino, датчики, камеры, алюминиевые профили, оргстекло, немного инженерной смекалки и много нецензурных выражений – кто бы мог подумать что из всего этого получится интересный проект?

            По правилам розыгрыша, 25 октября — последний день, когда все запоздавшие ещё могут принять участие. Напоминаем, что для этого нужно иметь аккаунт на Хабре и нажать на одну единственную кнопку на странице проекта. Аккаунты могут быть любыми, как read only, так и с инвайтом. А церемония определения победителей пройдёт 31 октября, в Хэллоуин. Но об этом мы ещё сообщим дополнительно.

            Мы подготовили видео, в котором вы из первых рук узнаете о том, как мы придумывали и создавали установку, круглосуточная работа которой вот уже целый месяц транслируется на странице проекта.

          • Python, каким бы я хотел его видеть

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

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

            Я хочу начать наш разговор с одной странности интерпретатора (слоты) и закончить его самой большой ошибкой архитектуры языка. По сути, эта серия постов является исследованием решений, заложенных в архитектуре интерпретатора, и их влияния как на интерпретатор, так и на сам язык. Я считаю, что с точки зрения общего дизайна языка такие статьи будут выглядеть гораздо интереснее, чем просто высказывание мыслей по улучшению Python.
            Читать дальше →
          • Профилирование и отладка Python, инструменты

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

              Сегодня мы познакомимся с основной и самой многочисленной группой инструментов — событийными профайлерами.

              Приступим!
              • +66
              • 64.5k
              • 9
            • Профилирование и отладка Python, переходим к практике

                В прошлой статье мы определили понятия профилирования и оптимизации, познакомились с различными подходами к профилированию и видами инструментов. Немного коснулись истории профайлеров.

                Сегодня я предлагаю перейти к практике и покажу на примерах способы ручного профилирования (и даже «метод пристального взгляда». Будут так же рассмотрены инструменты для статистического профилирования.
                Поехали!
              • Профилирование и отладка Python

                  Некоторое время назад я рассказывал о «Профилировании и отладке Django». После выступления я получил много вопросов (как лично, так и по email), с парой новых знакомых мы даже выбрались в бар, чтобы обсудить важные проблемы программирования за кружечкой отменного эля, со многими людьми я продолжаю общаться до сих пор.

                  Поскольку выступление вызвало живой интерес, а беседы с коллегами позволили мне переосмыслить некоторые моменты презентации и исправить достадные ляпы, я решил оформить доклад и свои мысли в виде статьи. Это позволит ознакомиться с темой гораздо большему кругу заинтересованных лиц, к тому же Хабр предоставляет из себя идеальную площадку для комментирования предложенного материала и общения с интересными собеседниками.
                  Welcome!
                • Инфраструктура и жизненный цикл разработки веб-проекта

                    Когда проект маленький, особых проблем с ним не возникает. Список задач можно вести в текстовом файле (TODO), систему контроля версий, по большому счёту, можно и не использовать, для раскладки файлов на живой сервер их можно просто скопировать (cp/scp/rsync) в нужную директорию, а ошибки всегда можно посмотреть в лог-файле. Глупо было бы, например, для простенького сервиса с двумя скриптами и тремя посетителями в день поднимать полноценную систему управления конфигурациями серверов.

                    С ростом проекта требования растут. Становится неудобно держать в TODO-файле несколько десятков задач и багов: хочется приоритетов, комментариев, ссылок. Появляется необходимость в системе контроля версий, специальных скриптах/систем для раскладки кода на сервер, системе мониторинга. Ситуация усугубляется, когда над проектом работает несколько человек, а уж когда проект разрастается до нескольких серверов, появляется полноценная инфраструктура («комплекс взаимосвязанных обслуживающих структур или объектов, составляющих и/или обеспечивающих основу функционирования системы», Wikipedia).

                    На примере нашего сервиса "Календарь Mail.ru" я хочу рассказать о типичной инфраструктуре и жизненном цикле разработки среднего по размерам веб-проекта в крупной интернет-компании.

                    Срыв покровов
                  • Romo: домашний питомец

                      Конструкторы, Lego, радиоуправляемые машинки и вертолёты, компьютерные игры… Индустрия производит массу товаров для детей любых возрастов, но давайте будем честными: покупка и последующие игры для пап увлекательны не меньше (а порой гораздо больше), чем для их любимых чад.

                      Недавно ко мне приехала посылка с очередной игрушкой для сына (ага, я тут ни при чём!) — робот Romo:

                      (iPhone в комплект поставки не входит)

                      Хочу познакомить всех читателей с этим замечательным, не побоюсь этого слова, домашним питомцем. Мы в офисе уже успели наиграться в него.
                      Читать дальше →
                    • «Achtung!», или Мониторим состояние сборки проекта


                        Для сборки проекта, запуска тестов и проверки качества кода мы (в проекте «Календарь Mail.ru») используем Jenkins CI. Запуск сборки происходит сразу же после пуша в репозиторий git (по хуку) и, конечно же, хочется своевременно получать информацию о провалившихся сборках. С одной стороны, уведомления по email вроде бы достаточно, с другой стороны хочется чего-то более заметного и весёлого.
                        Читать дальше →
                      • Yet another cool story about bash prompt

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



                          Zsh красив, приятен, чертовски функционален, но, признаюсь честно, я не смог совладать со всеми его многочисленными настройками. Я хочу работать, а не бороться со своим рабочим окружением. Простой пример: пару раз из-за автодополнения zsh я удалял все директории и файлы в текущей директории — zsh просто ставил пробел между автодополненной директорией и введённой мною звёзочкой (я хотел удалить всё в выбранной папке). Помните тот эпичный баг с пробелом и удалении директории /usr? У меня было то же самое. Спасибо гиту, выручил в который раз.

                          Впрочем, дело не в zsh — будь я чуточку умнее, я бы с ним обязательно справился бы, и всё было бы хорошо, но мы, суровые программисты, будем использовать bash и vim, а гламурные zsh и textmate оставим хипстерам и прочим модникам ;)

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



                            С рождением ребёнка существенно повышается внимание, уделяемое погоде на улице: если сам ты можешь выйти на улицу в чём придётся, и немножко помёрзнуть или промокнуть, не взяв зонтик, то родительский инстинкт просто не даст причинить неудобство твоему ребёнку. Спасибо современным технологиям, — температуру на улице и прогноз погоды можно в любой момент посмотреть на специальных сайтах (вроде pogoda.mail.ru или pogoda.yandex.ru).

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

                            Как говорится в известной пословице: мужик сказал, женщина напомнила, женщина напомнила, женщина напомнила, женщина задолбала, — мужик сделал.

                            Читать дальше →
                          • Распознаём изображение с токена при помощи камеры

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

                              и сказали: жмёшь кнопку, смотришь цифры, вводишь пароль и радуешься. «Безопасность, конечно, превыше всего, но и о комфорте забывать не следует» — примерно так подумал я и провёл ревизию имеющегося у меня электронного хлама.
                              Читать дальше →
                            • Работа с буфером обмена в Linux: теория и практика

                                Совсем немного теории


                                Copy and PasteИсторически сложилось так, что в X Window System (X11, — оконная система для Linux, UNIX) существует два буфера обмена.

                                Один из них (clipboard) похож на буфер обмена в Windows — при нажатии на Ctrl+Insert или Ctrl+C выделенный фрагмент (текст, картинка, файл) копируется в буфер обмена, а при нажатии на Shift+Insert (или Ctrl+V) — вставляется из него. Следует заметить, что во многих программах эти сочетания зарезервированы для иных целей и приходится пользоваться другими — например, в терминале сочетание Ctrl+C используется для завершения процесса, а для работы с буфером обмена используются сочетания Ctrl+Shift+C для копирования и Ctrl+Shift+V для вставки.

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

                                Перейти к практике...