• Становимся контрибьютером в PostgreSQL

    • Tutorial
    PostgreSQL Logo В этой статье я хотел бы рассказать о том, как выглядит процесс разработки PostgreSQL глазами одного из контрибьютеров в этот самый PostgreSQL. Заниматься разработкой этой СУБД я начал в декабре 2015 года, когда устроился работать в компанию Postgres Professional. То есть, не так уж давно. А значит, еще свежи воспоминания о моментах, которые поначалу казались мне не вполне очевидными. Хотелось бы их законспектировать, чтобы новым людям, приходящим в нашу команду, а также всем тем, кто желает попробовать себя в роли разработчика открытой реляционной СУБД, было легче. Я расскажу о том, как выглядит процесс разработки PostgreSQL, какие инструменты я использую в своей повседневной работе, как следует оформлять патчи, и так далее. Заинтересовавшихся прошу проследовать под кат.
    Читать дальше →
  • Странные буквы русского афавита

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

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



      Читать дальше →
    • Страх и ненависть и пагинация

        А в чем проблема?


        Типичная пагинация


        Как бы нам не хотелось этого отрицать, практика показывает, что подавляющее большинство своего времени типичный iOS-разработчик проводит за работой с табличками. Проектирование сервисного слоя — это интригующе, разработка универсального роутинга в приложении — захватывающе, а от настройки гибких политик кэширования вообще крышу сносит, но работа с табличными интерфейсами — это наши серые будни. Иногда луч света все же попадает и в эту область, и вместо очередной возни с constraint'ами перед нами может встать задача реализации постраничной загрузки — или, как это модно называть в мобильных приложениях, infinite scroll'а.


        Читать дальше →
        • +17
        • 18.2k
        • 8
      • Карта кэша логического процессора

          Еще одним камнем в поле WMI может служить отсутсвие вменяемой информации о кэше процессора. По крайней мере так дело обстоит в Win7. Нет, есть конечно класс Win32_Processor, в котором среди прочего имеется пара свойств L2CacheSize и L3CacheSize, представленные беззнаковым целочисленным типами и указывающие размер кэша второго и третьего уровня соответсвенно, но этой информации явно маловато.
          Читать дальше →
          • +10
          • 4.9k
          • 2
        • Методы определения принадлежности точки многоугольнику

          Недавно на хабре была статья, в которой описывалось как можно определить, где находится точка по отношению к многоугольнику: внутри или снаружи. Подобная проблема встречается в геометрическом моделировании и в компьютерной графике достаточно часто. А так как метод, описанный в статье, был несколько не оптимален, а в комментариях был небольшой хаос, возникла мысль написать эту статью. Итак, какие алгоритмы существуют в современной компьютерной графике, чтобы определить, принадлежит ли заданная точка многоугольнику или нет.
          Читать дальше →
        • [ В закладки ] Алгоритмы и структуры данных в ядре Linux, Chromium и не только

          • Translation
          Многие студенты, впервые сталкиваясь с описанием какой-нибудь хитроумной штуки, вроде алгоритма Кнута – Морриса – Пратта или красно-чёрных деревьев, тут же задаются вопросами: «К чему такие сложности? И это, кроме авторов учебников, кому-нибудь нужно?». Лучший способ доказать пользу алгоритмов – это примеры из жизни. Причём, в идеале – конкретные примеры применения широко известных алгоритмов в современных, повсеместно используемых, программных продуктах.



          Посмотрим, что можно обнаружить в коде ядра Linux, браузера Chromium и ещё в некоторых проектах.
          Читать дальше →
          • +140
          • 79.7k
          • 15
        • Неконстантные константные выражения

          • Translation
          // <какой-то код>
           
          int main ()
          {
                  constexpr int a = f ();
                  constexpr int b = f ();
           
                  static_assert (!= b, "fail");
          }

          Можно ли в приведенном выше фрагменте вместо комментария вставить такое определение f (), чтобы a получила значение, отличное от b?

          “Разумеется, нет!” — скажете вы, немного подумав. Действительно, обе переменные объявлены со спецификатором constexpr, а значит, f () тоже должна быть constexpr-функцией. Всем известно, что constexpr-функции могут выполняться во время компиляции, и, как следствие, не должны зависеть от глобального состояния программы или изменять его (иными словами, должны быть чистыми). Чистота означает, что функция при каждом вызове с одними и теми же аргументами должна возвращать одно и то же значение. f () оба раза вызывается без аргументов, поэтому должна оба раза вернуть одно и то же значение, которое и будет присвоено переменным a и b… правильно?

          Еще неделю назад я знал, что это правда, и действительно думал, что невозможно пройти static_assert в приведенном выше фрагменте, не допуская неопределенного поведения.

          Я ошибался.
          Увиденное под катом уже не развидеть
        • Тройки Хоара

          Я больше 15 лет при программировании использую логику Хоара и нахожу этот подход очень полезным и хочу поделится опытом. Естественно не надо «стрелять из пушки по воробьям», но при написании достаточно сложных алгоритмов или нетривиальных кусков кода применение логики Хоара сэкономит Ваше время и позволит внести элементы некоторого «промышленного» стандарта при программировании.
          Читать дальше →
        • 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. Быстрый поиск плохого коммита

          Читать дальше →
        • Коварный роутер или почему порты надо открывать


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

          Речь об «автоматической» пробросе порта, через технологию UPnP, без использования «стандартной» библиотеки NATUPnPLib.

          О том, в силу чего был выбран такой непростой путь и почему он все-таки непростой — читайте ниже.
          Подробности эксперимента
        • Zip-квест про космического админа Василия Романова



            Привет!
            Я сварганил на день сисадмина zip-квест. Вот здесь забирайте архив, и вперёд.

            Что надо знать:
            • Вы играете за космического админа, впервые ушедшего за пределы орбиты Земли. Он – это вы, только меньше и другой.
            • Каждый уровень – это подархив, пароль от него можно достать, пользуясь информацией с предыдущих уровней.
            • Поскольку у нас русский космос, пароли могут содержать русские символы, куски кода даже с комментариями, всякий треш и быть регистрозависимыми.

            Читать дальше →
          • Искусство командной строки



              Вот уже как неделю английская версия the art of command line висит в секции trending на Github. Для себя я нашел этот материал невероятно полезным и решил помочь сообществу его переводом на русский язык. В переводе наверняка есть несколько недоработок, поэтому милости прошу слать пулл-реквесты мне сюда или автору оригинальной работы Joshua Levy вот сюда. (Если PR отправите мне, то я после того, как пересмотрю изменения отправлю их в мастер-бранч Джоша). Отдельное спасибо jtraub за помощь и исправление опечаток.

              Enjoy!
            • Cocoa Developers Club — клуб iOS и OS X разработчиков

                Все началось с того, что три месяца назад мы решили объединиться в сообщество русскоязычных iOS-разработчиков.

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

                Для удовлетворения такого спроса мы решили использовать современный подход. В текущий момент для группового общения появились новые инструменты, такие как HipChat или Slack (подробнее про Slack здесь). Кроме того, что они используются в работе конкретной команды, их также можно использовать для объединения в сообщества по интересам. Мы выбрали Slack.
                Читать дальше →
                • +10
                • 4.9k
                • 6
              • Алгоритмы быстрого вычисления факториала

                Понятие факториала известно всем. Это функция, вычисляющая произведение последовательных натуральных чисел от 1 до N включительно: N! = 1 * 2 * 3 *… * N. Факториал — быстрорастущая функция, уже для небольших значений N значение N! имеет много значащих цифр.

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

                Наивный алгоритм

                Итак, простейшая реализация (назовем ее наивной) получается прямо из определения факториала:

                static BigInteger FactNaive(int n)
                {
                    BigInteger r = 1;
                    for (int i = 2; i <= n; ++i)
                        r *= i;
                    return r;            
                }
                

                На моей машине эта реализация работает примерно 1,6 секунд для N=50 000.

                Далее рассмотрим алгоритмы, которые работают намного быстрее наивной реализации.
                Читать дальше →
              • Плохо документированные особенности Linux

                  Привздохнув, произнесла:
                  «Как же долго я спала!»
                  image Когда-то, впервые встретив Unix, я был очарован логической стройностью и завершенностью системы. Несколько лет после этого я яростно изучал устройство ядра и системные вызовы, читая все что удавалось достать. Понемногу мое увлечение сошло на нет, нашлись более насущные дела и вот, начиная с какого-то времени, я стал обнаруживать то одну то другую фичу про которые я раньше не знал. Процесс естественный, однако слишком часто такие казусы обьединяет одно — отсутствие авторитетного источника документации. Часто ответ находится в виде третьего сверху комментария на stackoverflow, часто приходится сводить вместе два-три источника чтобы получить ответ на именно тот вопрос который задавал. Я хочу привести здесь небольшую коллекцию таких плохо документированных особенностей. Ни одна из них не нова, некоторые даже очень не новы, но на каждую я убил в свое время несколько часов и часто до сих пор не знаю систематического описания.

                  Все примеры относятся к Linux, хотя многие из них справедливы для других *nix систем, я просто взял за основу самую активно развивающуюся ОС, к тому же ту, которая у меня перед глазами и где я могу быстро проверить предлагаемый код.

                  Обратите внимание, в заголовке я написал «плохо документированные» а не «малоизвестные», поэтому тех кто в курсе прошу выкладывать в комментариях ссылки на членораздельную документацию, я с удовольствием добавлю в конце список.
                  Читать дальше →
                • Звуковые отпечатки: распознавание рекламы на радио

                  Из этой статьи вы узнаете, что распознавание даже коротких звуковых фрагментов в зашумленной записи — вполне решаемая задача, а прототип так вообще реализуется за 30 строчек кода на Python. Мы увидим, как тут помогает преобразование Фурье, и наглядно посмотрим, как работает алгоритм поиска и сопоставления отпечатков. Статья будет полезна, если вы сами хотите написать подобную систему, или вам интересно, как она может быть устроена.
                  Читать дальше →
                • Сделай сам: MSc Computer Science на уровне топ американских университетов из дома

                    Вступление


                    Давно хотел написать статью про образование в Computer Science, но руки не доходили. Решил все-таки это наконец сделать. Итак, о чем пойдет речь? Речь о том, что из себя представляет диплом MSc Computer Science топовых университетов США (во всех подробностях, включая основные курсы, книги и проекты) и как ему соответствовать.

                    Почему именно MSc? Это — некая развилка: с одной стороны после MSc — вы уже готовый к жизни инженер (да, речь идет о инженерной подготовке, как мне кажется это самое больное место в нашей системе образования), с другой — можно спокойно идти по пути PhD. Как известно, в PhD программу можно попасть и не особо умея программировать — особенно это касается теоретического Computer Science. С другой стороны найти работу программиста тоже дело не очень сложное, и часто не требует мощного образования. Но достигнув уровня MSc — вы получаете возможность разбираться как во всех новый идеях в Computer Science, так и возможность их воплотить в практику. То есть с одной стороны круто разобраться в каком-нибудь deep learning и сделать в нем что-то новое, а также взять и написать свою операционную систему (кто так сделал?). Причем вы не зажаты в рамки узкой специализации (если конечно продолжаете учиться). То есть вы теперь — универсальный солдат, готовый на все.

                    Надеюсь что эта статья будет полезна:
                    1. Студентам, которые хотят соответствовать высоким стандартам топ вузов США, или собирающиеся туда в аспирантуру по Computer Science
                    2. Профессионалам, которые хотят закрыть «дыры» и пробелы
                    3. Может кто-то из преподавателей возьмет на заметку для своих курсов.
                    4. Студентам, аспирантам американских вузов — хотелось бы тоже получить фидбэк, особенно касается последних трендов в образовании

                    Что же здесь будет написано? Минимум философии и общих мыслей: конкретная программа undergraduate и graduate курсов, конечно из дисциплин наиболее мне близких. Все курсы были лично прочувствованы на собственной шкуре, по этому и пишу. (Я пытался записаться на все интересные курсы, которые были, но мой основной упор — системное программирование, базы данных и искусственный интеллект. Отсюда конечно некий bias, но пытаюсь предложить более-менее универсальную программу).
                    Читать дальше →
                  • Именование сложных действий в REST API

                      Во всех руководствах в описаниях REST дают простые примеры, типа вот вам пользователи, они будут ресурсом /users, вот вам один пользователь, он будет /users/[id] и действия с ним добавить\удалить\изменить.

                      А что если действия сложные или комплексные и не вписываются в GET\POST\DELETE?

                      Читать дальше →
                    • Преобразование Фурье в действии: точное определение частоты сигнала и выделение нот

                      последняя редакция статьи доступна на сайте makeloft.xyz

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

                      Когда музыкант играет композицию, то он поочерёдно или одновременно зажимает и отпускает клавиши, в результате чего несколько синусоидальных сигналов накладываются друг на друга образуя рисунок. Именно этот рисунок воспринимается нами как мелодия, благодаря чему мы без труда узнаём одно произведение, исполняемое на различных инструментах в разных жанрах или даже непрофессионально напеваемое человеком.

                      image

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