• Как извлечь пользу из статической типизации

      Эта статья о том, как извлечь максимум пользы из статической системы типов при дизайне вашего кода. Статья пытается быть language agnostic (получается не всегда), примеры на Java и взяты из жизни.

      Читать далее
    • Бесплатные сервисы для разработчиков — огромный список


        Бесплатное хранилище артефактов PackageCloud

        Удивительно, но в интернете сотни сервисов, которыми разработчик может пользоваться совершенно бесплатно. «Бесконечное» время (пока компания не обанкротится или не изменит условия), без рекламы, пробного периода и других подводных камней.

        Недавно мы обсуждали эту тему в статье «Боль разработчика: “Никогда не давайте пользователям бесплатный тариф”». Речь шла о том, что на самом деле бесплатный план вовсе не бесплатен — приходится тратить массу времени и усилий на поддержку этих тарифов.

        Но для некоторых бесплатный тариф — единственный способ завлечь новых клиентов. Это просто замечательно с точки зрения самих пользователей. Ведь перед нами десятки бесплатных хостингов, API, CMS, CDN, сервисов обработки данных, поисковых движков, репозиториев, инструментов проверки кода и других. Бесплатный тариф идеален для опенсорс-разработчиков, любительских и некоммерческих проектов, маленьких стартапов. Ни за что не надо платить.
        Читать дальше →
      • Гайд по мобильной рекламе для тех, кто задумался о монетизации

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

          Читать далее
          • +39
          • 4,4k
          • 3
        • Решайтесь на великие поступки — ASCII

          • Перевод
          ASCII — это самый простой из существующих коммуникационных протоколов и единственный формат данных, который может декодировать любая из существующих компьютерных систем.

          Момент посадки на Марс ровера NASA Perseverance (Настойчивость) стал историческим событием. Человечество впервые увидело нечто подобное. Многие люди с замиранием сердца наблюдали за происходящим. «Настойчивость» многие годы будет служить для нас источником вдохновения.

          Каждое изображение, поступающее с Марса после успешной посадки ровера, содержало в себе какой-то сюрприз. Одним из таких сюрпризов стало сообщение, зашифрованное в раскраске парашюта марсохода.

          Интернет-ищейки заявили о том, что им удалось расшифровать скрытое сообщение, нанесённое на купол парашюта, который помог роверу безопасно приземлиться на поверхность Красной планеты. Как оказалось, фраза «Dare Mighty Things» («Решайтесь на великие поступки») — девиз лаборатории реактивного движения NASA (Jet Propulsion Laboratory) — была закодирована на парашюте с использованием красных и белых полос, представляющих двоичный компьютерный код. Этот код, что неудивительно, можно, используя некоторые вычисления, перевести в кодировку ASCII и, в итоге, понять то, что в нём скрыто.


          Ровер сделал этот снимок парашюта в процессе посадки на поверхность Марса

          Пользователи Reddit и Twitter обратили внимание на то, что красно-белый узор похож на нечто, способное нести в себе какой-то смысл. Они расшифровали послание, решив, что красные фрагменты представляют единицы, а белые — нули.

          Эта история разлетелась по всему миру, благодаря ей кодировка ASCII, о которой говорят не особенно часто, оказалась у всех на слуху.

          В этом материале мы поговорим об ASCII, немного коснёмся истории этой кодировки, разберём пример её применения в программном коде. Прочитав эту статью, вы поймёте, что очень сложно не полюбить ASCII, кое-что о ней узнав.
          Читать дальше →
          • +27
          • 6,3k
          • 7
        • Выбираем и собираем 60% клавиатуру


          В этой статье я не буду описывать преимущества и недостатки механических клавиатур. Одной единственной идеальной клавиатуры для всех не существует. Многие считают вершиной развития «островные» клавиатуры с ножничным механизмом, кто-то может комфортно печатать лишь на Topre, другие запаслись парой-тройкой IBM Model M на всю оставшуюся жизнь. Вокруг переключателей Cherry MX и их клонов диапазон предпочтений тоже весьма широк — одним подавай лёгкие линейные переключатели, другим нужны жёсткие MX Green с кликом. Речь пойдёт о компактной разновидности, так называемых «шестидесятипроцентных клавиатурах».
          Читать дальше →
        • Ричард Хэмминг: Глава 22. Обучение с помощью компьютера (CAI)

          • Перевод
          «What you learn from others you can use to follow;
          What you learn for yourself you can use to lead.»
          — Ричард Хэмминг
          imageОсталось опубликовать 1 главу…

          Сomputer-aided instruction (CAI) — машинное обучение. Применение ЭВМ в учебном процессе. ЭВМ в диалоговом режиме предлагает учащемуся материал в виде текстов и графических изображений, дает задания и проверяет их выполнение, позволяет выполнять учебные эксперименты.
          Перевод Islam Rasulov

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

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

          Истории известно огромное количество людей, которые искали легкие способы обучиться чему-либо. Олдос Хаксли в своей книге «О дивный новый мир» обсуждает идею обучения во время сна, когда под подушку вам подкладывается микрофон и через него происходит воспроизведение чего-либо. Он также раскрывает и серьёзные ограничения такого процесса.
          Читать дальше →
          • +12
          • 2,6k
          • 7
        • Современные технологии — сфера многообразная. Многие темы в ней бесконечно далеки друг от друга. Невозможно быть экспертом сразу во всех из них, но можно — в какой-то одной. Именно статьи таких экспертов — подробные, сложные, узконаправленные; словом, лучшие — мы собрали для хабравчан в этой коллекции. Выбранные материалы отвечают на все вопросы по своей теме. Показывают, как лучше всего изложить свои знания, если вы профи. И подсказывают, из каких ещё источников читателю получить знания.
          Посмотреть коллекцию
        • Композиция или наследование: как выбрать?

          • Перевод

          В начале...


          … не было ни композиции, ни наследования, только код.


          И был код неповоротливым, повторяющимся, нераздельным, несчастным, избыточным и измученным.


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


          Мрачные были времена.


          Но вот лучик ООП воссиял над миром… Правда, несколько десятилетий1 никто этого не замечал. Покуда не появился графический интерфейс2, которому, как выяснилось, очень-очень не хватало ООП. Когда нажимаешь на кнопку в окне, что может быть проще, чем отправить кнопке (или ее представителю) сообщение "Нажатие"3 и получить результат?


          И вот тут ООП взлетел. Было написано множество4 книг, расплодились бесчисленные5 статьи. Так что сегодня-то каждый может в объектно-ориентированное программирование, так?


          Читать дальше →
        • Легкий способ научиться слепому десятипальцевому набору

          • Tutorial
          Традиционно рекомендации по обучению десятипальцевой печати сводятся к двум советам:
          • тратить нервы на клавиатурные тренажеры вроде пресловутого «Соло на клавиатуре»;
          • заклеить подписи на клавишах.

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

          Что если я скажу вам, что есть абсурдно простой, состоящий из одного пункта способ научиться слепой печати без этих дурацких органичений?
           

          Читать дальше →
        • Оформление сложных условий

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

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

          Так как с высасыванием из пальца у меня проблемы, в качестве источника примеров взята часть исходников GCC 4.8.2, для авторов которых стандарты оформления — не пустой звук. Используя примеры, буду приводить файл и строку начала, чтобы желающие могли убедиться, что все честно.
          Читать дальше →
        • Удивительно быстрые алгоритмы

          • Tutorial

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


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


          Интересно? Добро пожаловать под кат!

          Читать дальше →
        • Математика на пальцах: методы наименьших квадратов

          • Tutorial

          Введение




          Я математик-программист. Самый большой скачок в своей карьере я совершил, когда научился говорить:«Я ничего не понимаю!» Сейчас мне не стыдно сказать светилу науки, что мне читает лекцию, что я не понимаю, о чём оно, светило, мне говорит. И это очень сложно. Да, признаться в своём неведении сложно и стыдно. Кому понравится признаваться в том, что он не знает азов чего-то-там. В силу своей профессии я должен присутствовать на большом количестве презентаций и лекций, где, признаюсь, в подавляющем большинстве случаев мне хочется спать, потому что я ничего не понимаю. А не понимаю я потому, что огромная проблема текущей ситуации в науке кроется в математике. Она предполагает, что все слушатели знакомы с абсолютно всеми областями математики (что абсурдно). Признаться в том, что вы не знаете, что такое производная (о том, что это — чуть позже) — стыдно.

          Но я научился говорить, что я не знаю, что такое умножение. Да, я не знаю, что такое подалгебра над алгеброй Ли. Да, я не знаю, зачем нужны в жизни квадратные уравнения. К слову, если вы уверены, что вы знаете, то нам есть над чем поговорить! Математика — это серия фокусов. Математики стараются запутать и запугать публику; там, где нет замешательства, нет репутации, нет авторитета. Да, это престижно говорить как можно более абстрактным языком, что есть по себе полная чушь.
          Математика для программистов!
        • От действий над матрицами к пониманию их сути…

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

          Лет эдак 20 назад довелось мне изучать высшую математику в вузе, и начинали мы с матриц (пожалуй, как и все студенты того времени). Почему-то считается, что матрицы — самая лёгкая тема в курсе высшей математики. Возможно — потому, что все действия с матрицами сводятся к знанию способов расчёта определителя и нескольких формул, построенных — опять же, на определителе. Казалось бы, всё просто. Но… Попробуйте ответить на элементарный вопрос — что такое определитель, что означает число, которое вы получаете при его расчёте? (подсказка: вариант типа «определитель — это число, которое находится по определённым правилам» не является правильным ответом, поскольку говорит о методе получения, а не о самой сути определителя). Сдаётесь? — тогда читаем дальше…
          Читать дальше →
        • Как я готовился к собеседованию в Google

          • Перевод
          Каждый инженер-программист стремится впечатлить людей своим техническим мастерством. Технологические гиганты этого мира — прекрасное место для работы технарей, которые могут предоставить услуги миллиардам пользователей. На моём недавнем собеседовании было несколько раундов, я получил предложения от Google и Amazon. В последние несколько лет онлайн-сообщество очень помогло мне в подготовке к собеседованиям. В этом посте я поделюсь всем о моём пути к собеседованию и верну вклад общества в моё обучение.


          Приятного чтения!
        • Трюк с XOR для собеседований и не только

          • Перевод


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

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

          Дан массив из n — 1 целых чисел, находящихся в интервале от 1 до n. Все числа встречаются только один раз, за исключением одного числа, которого нет. Найдите отсутствующее число.

          Разумеется, существует множество прямолинейных способов решения этой задачи, однако есть и довольно неожиданный, в котором применяется XOR.
          Читать дальше →
        • Kite: контекстные подсказки и автодополнение при написании кода



            Во время написания кода часто приходится открывать Google, искать образцы кода, документацию и подсказки. Разработчики приложения Kite предлагают продвинутое решение — интерактивный «помощник», который в процессе набора кода в фоновом режиме вытягивает контекстную информацию из общедоступных образцов кода в интернете (и из кодовой базы текущего проекта) и показывает на экране в удобном виде.

            Kite интегрируется в редактор кода и консоль.
            Читать дальше →
            • +12
            • 16,9k
            • 8
          • Эффективный способ повысить умственную работоспособность

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

                Ошибок в условиях допускается великое множество. Можно взять для примера любой пост из блога PVS-studio, в каждом есть ошибки, связанные с невнимательным обращением с условиями. И правда, нелегко разглядеть ошибку в условии, если код выглядит так (пример из этого поста):

                static int ParseNumber(const char* tx)
                {
                  ....
                  else if (strlen(tx) >= 4 && (strncmp(tx, "%eps", 4) == 0
                    || strncmp(tx, "+%pi", 4) == 0 || strncmp(tx, "-%pi", 4) == 0
                    || strncmp(tx, "+Inf", 4) == 0 || strncmp(tx, "-Inf", 4) == 0
                    || strncmp(tx, "+Nan", 4) == 0 || strncmp(tx, "-Nan", 4) == 0
                    || strncmp(tx, "%nan", 4) == 0 || strncmp(tx, "%inf", 4) == 0
                          ))
                  {
                      return 4;
                  }
                  else if (strlen(tx) >= 3
                    && (strncmp(tx, "+%e", 3) == 0
                     || strncmp(tx, "-%e", 3) == 0
                     || strncmp(tx, "%pi", 3) == 0   // <=
                     || strncmp(tx, "Nan", 3) == 0
                     || strncmp(tx, "Inf", 3) == 0
                     || strncmp(tx, "%pi", 3) == 0)) // <=
                  {
                      return 3;
                  }
                  ....
                }
                Читать дальше →
              • Указатели, ссылки и массивы в C и C++: точки над i

                • Tutorial
                В этом посте я постараюсь окончательно разобрать такие тонкие понятия в C и C++, как указатели, ссылки и массивы. В частности, я отвечу на вопрос, так являются массивы C указателями или нет.

                Обозначения и предположения


                • Я буду предполагать, что читатель понимает, что, например, в C++ есть ссылки, а в C — нет, поэтому я не буду постоянно напоминать, о каком именно языке (C/C++ или именно C++) я сейчас говорю, читатель поймёт это из контекста;
                • Также, я предполагаю, что читатель уже знает C и C++ на базовом уровне и знает, к примеру, синтаксис объявления ссылки. В этом посте я буду заниматься именно дотошным разбором мелочей;
                • Буду обозначать типы так, как выглядело бы объявление переменной TYPE соответствующего типа. Например, тип «массив длины 2 int'ов» я буду обозначать как int TYPE[2];
                • Я буду предполагать, что мы в основном имеем дело с обычными типами данных, такими как int TYPE, int *TYPE и т. д., для которых операции =, &, * и другие не переопределены и обозначают обычные вещи;
                • «Объект» всегда будет означать «всё, что не ссылка», а не «экземпляр класса»;
                • Везде, за исключением специально оговоренных случаев, подразумеваются C89 и C++98.


                Указатели и ссылки


                Указатели. Что такое указатели, я рассказывать не буду. :) Будем считать, что вы это знаете. Напомню лишь следующие вещи (все примеры кода предполагаются находящимися внутри какой-нибудь функции, например, main):

                int x;
                int *y = &x; // От любой переменной можно взять адрес при помощи операции взятия адреса "&". Эта операция возвращает указатель
                int z = *y; // Указатель можно разыменовать при помощи операции разыменовывания "*". Это операция возвращает тот объект, на который указывает указатель
                

                Читать дальше →
              • Магия тензорной алгебры: Часть 1 — что такое тензор и для чего он нужен?

                  Содержание


                  1. Что такое тензор и для чего он нужен?
                  2. Векторные и тензорные операции. Ранги тензоров
                  3. Криволинейные координаты
                  4. Динамика точки в тензорном изложении
                  5. Действия над тензорами и некоторые другие теоретические вопросы
                  6. Кинематика свободного твердого тела. Природа угловой скорости
                  7. Конечный поворот твердого тела. Свойства тензора поворота и способ его вычисления
                  8. О свертках тензора Леви-Чивиты
                  9. Вывод тензора угловой скорости через параметры конечного поворота. Применяем голову и Maxima
                  10. Получаем вектор угловой скорости. Работаем над недочетами
                  11. Ускорение точки тела при свободном движении. Угловое ускорение твердого тела
                  12. Параметры Родрига-Гамильтона в кинематике твердого тела
                  13. СКА Maxima в задачах преобразования тензорных выражений. Угловые скорость и ускорения в параметрах Родрига-Гамильтона
                  14. Нестандартное введение в динамику твердого тела
                  15. Движение несвободного твердого тела
                  16. Свойства тензора инерции твердого тела
                  17. Зарисовка о гайке Джанибекова
                  18. Математическое моделирование эффекта Джанибекова


                  Введение



                  Это было очень давно, когда я учился классе в десятом. Среди довольно скудного в научном плане фонда районной библиотеки мне попалась книга — Угаров В. А. «Специальная теория относительности». Эта тема интересовала меня в то время, но информации школьных учебников и справочников было явно недостаточно.



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



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