Обновить
1098.54

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга
Уровень сложности

Композиция протоколов для инъекции зависимостей

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

Мне нравится использовать композицию и инъекцию зависимостей, но когда каждая сущность начинает инъектится несколькими зависимости, получается некое нагромождение.


Проект растет и приходится инъектить все больше зависимостей в объекты, рефакторить методы помногу раз, Xcode не особо с этим помогает, как мы знаем.


Но есть более управляемый способ.


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

Книга «Экстремальное программирование: разработка через тестирование»

Время на прочтение7 мин
Количество просмотров45K
image Возвращение знаменитого бестселлера. Изящный, гибкий и понятный код, который легко модифицировать, который корректно работает и который не подкидывает своим создателям неприятных сюрпризов. Неужели подобное возможно? Чтобы достичь цели, попробуйте тестировать программу еще до того, как она написана. Именно такая парадоксальная идея положена в основу методики TDD (Test-Driven-Development — разработка, основанная на тестировании). Бессмыслица? Не спешите делать скороспелые выводы. Рассматривая применение TDD на примере разработки реального программного кода, автор демонстрирует простоту и мощь этой методики. В книге приведены два программных проекта, целиком и полностью реализованных с использованием TDD. За рассмотрением примеров следует обширный каталог приемов работы в стиле TDD, а также паттернов и рефакторингов, имеющих отношение к TDD. Книга будет полезна для любого программиста, желающего повысить производительность своей работы и получить удовольствие от программирования.
Читать дальше →

Своя криптовалюта на ethereum

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


Общая рыночная капитализация глобального рынка криптовалют за последний год выросла с $6 млрд (в январе 2016 года) до $28 млрд (на текущий момент). С начала 2017 года рынок криптовалют вырос примерно в полтора раза. На биржах торгуются уже больше сотни разных криптовалют. Крупные организации объединяются в консорциумы, чтобы выпускать свою валюту. Даже государства делают свои национальные криптовалюты. Технологии блокчейна дошли до такого уровня, что уже почти любой может запустить свою криптовалюту, чем мы в этой статье и займемся. Легче всего создать свои монеты на смарт контрактах на базе ethereum.

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

Свои потоки ввода-вывода в C++ с помощью std::streambuf

Время на прочтение16 мин
Количество просмотров87K
В статье на примерах объясняется, как реализовать поддержку потокового ввода-вывода из стандартной библиотеки (<iostream>) для своих классов.

В тексте статьи будет часто встречаться слово «поток», что означает именно поток ввода-вывода ((i/o)stream), но не поток выполнения (thread). Потоки выполнения в статье не рассматриваются.


Введение


Потоки из стандартной библиотеки — мощный инструмент. Аргументом функции можно указать поток, и это обеспечивает ее универсальность: она может работать как со стандартными файлами (fstream) и консолью (cin/cout), так и с сокетами и COM-портами, если найти соответствующую библиотеку.

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

Генератор тестовых данных для C++

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

image


При unit-тестированиии кода рано или поздно встает вопрос тестовых данных. И если в одном случае достаточно просто несколько жестко зашитых переменных, то в других случаях необходимы сколько-нибудь большие и случайные данные. В управляемом мире нет проблем с генерацией пользовательских типов (взять тот же Autofixture), но мир C++ зачастую вызывает боль и страдание (поправьте меня, если это не так). Не так давно я познакомился с замечательной библиотекой boost::di и под ее влиянием у меня начала созревать идея библиотеки, которая позволила бы C++ программистам генерировать пользовательские типы данных, забитых случайными значаниями, и это не потребовало бы предварительного их описания. Получилось что-то вроде:


struct dummy_member{
    float a;
    int b;
};
struct dummy{
    explicit dummy(dummy_member val, std::string c) : val_(val), c_(c) {}
private:
    dummy_member val_;
    std::string c_;
};
int main(int argc, char* argv){
    auto d = datagen::random<dummy>();
    return 0;
}

Ссылка на код. Библиотека header-only,C++14. Всех интересующихся прошу под кат.

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

Генератор проектов

Время на прочтение21 мин
Количество просмотров15K
В данной статье речь пойдет о специфическом программном продукте, предназначенном для разработки больших программно-информационных комплексов. Этот продукт называется «Генератор проектов», и в его основе лежит инструментальный подход к программированию, когда сам процесс разработки программных систем рассматривается как объект автоматизации. Эта тема была довольно модной где-то в 70-80-х годах прошлого века, но на наш взгляд, такой подход не устарел и сегодня. По крайней мере, нашему творческому коллективу долгие годы удавалось разрабатывать промышленные автоматизированные системы различного назначения с помощью собственного инструментария.

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

N причин, чтобы использовать Create React App

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


Create React App — отличный инструмент для быстрого старта React-приложений. Вы не тратите время на настройку Webpack, Babel и других привычных инструментов. Они заранее настроены и спрятаны, так что разработчики могут сфокусироваться на коде и бизнес-логике приложения.
Читать дальше →

Шаг за шагом: собираем и тестируем Интернет вещей на базе платформы SAP Cloud Platform

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

Эта статья может помочь участникам конкурса SAP Кодер 2017 решить одну из задач


Интернет вещей – захватывающая тема, которая уже завтра изменит мир. Существующие IoT-платформы позволяют протестировать технологию, чем мы и займемся.

Перед вами пошаговый пример создания и настройки системы сбора данных с устройств на базе Arduino и ее подключение к SAP Cloud Platform.


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

Добавили возможность встраивать JS-скрипты в доски. Как мы делаем свою систему управления проектами

Время на прочтение5 мин
Количество просмотров9.9K
Первого апреля системе YouGile исполнился год. Нешуточный срок для проекта, который начался с мысли — «А давайте на выходных сделаем себе удобную систему управления проектами». Сейчас несколько тысяч пользователей, в основном переходят с BaseCamp и Trello, все открыто для тестирований и присылания нам обратной связи.

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

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

Работает просто — по комбинации клавиш Ctrl+~ вызывается встроенный редактор JavaScript.



Можно на JS писать или заливать любые скрипты и они будут менять работу отдельных досок или проектов в компании. Выделена библиотека — примерно 200 объектов и методов, которые позволяют менять параметры системы, выполнять свой код на различные события в системе и удобно создавать свои элементы интерфейса или изменять существующие.
В статье рассматриваются примеры и задается вопрос о необходимости такой функции в системах управления проектами.

No Bugs, No Flaws или о надежности систем как таковых

Время на прочтение4 мин
Количество просмотров3.2K
Сегодня просматривая публикацию Егора Бугаенко When Do You Stop Testing!, с удивлением обнаружил, что немногие понимают и задумываются о том, что проблема тестирования и утверждения того, что система не имеет недостатков принципиально не решаема. Это кстати еще актуально и в связи с внедрением электронных выборов, и требованиями со стороны официальных лиц и журналистов доказательств отсутствия дыр в системе безопасности. Например у нас (Эстония) эта дискуссия идет полным ходом, и политики хотят получить стопроцентные доказательства надежности системы электронных выборов. Публичные политики, как правило незнакомы с логикой в её формальном виде. А Юм и Поппер, в лучшем случае, напоминают о каких то скучных философских семинарах, о которых лучше забыть. Но когда я слышу о том, что тестер или сеньор начинает вполне серьезно доказывать, что код протестирован и ошибок нет совсем, мое лицо приобретает это выражение:

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

Статический анализ → уязвимость → профит

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

В статьях про PVS-Studio всё чаще говорят об уязвимостях и дефектах безопасности, которые можно найти с помощью статического анализа. Авторов этих статей критикуют (и я в том числе), что не каждая ошибка является дефектом безопасности. Возникает однако интересный вопрос, можно ли пройти весь путь от сообщения статического анализатора до эксплуатации найденной проблемы и получения какой-то выгоды. В моём случае выгода всё же осталась теоретической, но эксплуатировать ошибку удалось, не особо вникая в код проекта.

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

Суперсилы WinDbg для .NET-разработчиков

Время на прочтение18 мин
Количество просмотров18K
Продолжая серию публикаций по докладам на конференциях, мы остановились на лучшем докладе DotNext 2016 Moscow, в которой Саша goldshtn Гольдштейн рассказывает о возможностях WinDbg для отладки .NET приложений. Этот действительно мощный инструмент позволяет решать задачи, с которыми не справляется встроенный отладчик Visual Studio.

Особенно этот материал будет полезен тем, кому сложно смотреть доклады на английском языке, так как расшифровка переведена на великий и могучий!


Третий сервис лишний: Telegram и сам дружит с телефонией

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


Я всегда восхищался силой коллективного разума. И укреплению моей убежденности в ней послужила недавняя история: я рассказал, как можно интегрировать телефонию с Telegram с помощью сервиса IFTTT, на что коллеги из Voximplant ответили, как это можно сделать проще, а потом господин recompileme в своем комментарии обратил внимание на то, что удобный API телеграма решает задачу без участия каких-либо третьих сервисов.




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


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

Ближайшие события

Зачем использовать статические типы в JavaScript? (Преимущества и недостатки)

Время на прочтение15 мин
Количество просмотров19K
Мы о многом рассказали в первой части. Теперь с синтаксисом покончено, давайте наконец перейдём к самому интересному: изучению преимуществ и недостатков использования статических типов.

Преимущество № 1: Вы можете заблаговременно находить баги и ошибки


Статическая проверка типов позволяет проверять, что определённый нами инвариант принимает значение true, даже не запуская программу. И если имеется какое-то нарушение этих инвариантов, оно будет обнаружено перед запуском программы, а не во время её работы.
Читать дальше →

Стэнфордские курсы CS193P Зима 2017: Разработка iOS 10 приложений с помощью Swift

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


Стэнфордский университет, США — один из лучших в мире в области информатики (Computer Science). Он щедро делится своими курсами, и одним из самых популярных и успешных курсов является курс CS193P по разработке приложений на iOS, который читает профессор Пол Хэгерти. Это курс читается ежегодно, начиная с 2010 года. На данный момент актуальным является курс CS193P «Developing iOS 10 Apps with Swift», Зима 2017 года — «Разработка iOS 10 приложений с использованием Swift», и уже выложены все 17 Лекций и 5 Заданий на iTunes U (но можно смотреть и на Youtube).
В новом курсе отчетливо видно, что профессор сделал небольшой разворот всего курса от ОБЪЕКТНО-ОРИЕНТИРОВАННОГО программирования, к ФУНКЦИОНАЛЬНОМУ программированию с множеством неизменяемых объектов с APIs похожими на математические функции.
Конечно, iOS вовсе не была сконструирована на основе идеи функционального программирования. Но люди, которые изобретали Swift, держали “в голове” идею о функциональном программировании. Так что при разработке вашего iOS приложения (по крайней мере в части Модели) вы можете использовать множество элементов функционального программирования.

Это новый рубеж в iOS программировании, потому что в течение 10 лет люди, в основном, использовали в iOS программировании только reference type объекты, имея в виду концепцию объектно-ориентированного программирования. Но когда вы программируете на Swift с помощью структур structs и перечислений enums, и особенно если вы подключаете механизмы протоколов protocols и Generics, то вы можете реально сделать прекрасную работу, имеющую дело с реальным функциональным программированием.
Читать дальше →

Логика сознания. Часть 12. Поиск закономерностей. Комбинаторное пространство

Время на прочтение26 мин
Количество просмотров36K
imageПоэзия — та же добыча радия.
В грамм добыча, в годы труды.
Изводишь единого слова ради
Тысячи тонн словесной руды.
Но как испепеляюще слов этих жжение
Рядом с тлением слова-сырца.
Эти слова приводят в движение
Тысячи лет миллионов сердца.

Владимир Маяковский


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

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

Немного о строках в Си, или несколько вариантов оптимизировать неоптимизируемое

Время на прочтение9 мин
Количество просмотров205K
Хабра, привет!

Не так давно у со мной произошел довольно-таки интересный инцидент, в котором был замешан один из преподавателей одного колледжа информатики.

Разговор о программировании под Linux медленно перешел к тому, что этот человек стал утверждать, что сложность системного программирования на самом деле сильно преувеличена. Что язык Си прост как спичка, собственно как и ядро Linux (с его слов).

У меня был с собой ноутбук с Linux, на котором присутствовал джентльменский набор утилит для разработки на языке Си (gcc, vim, make, valgrind, gdb). Я уже не помню, какую цель мы тогда перед собой поставили, но через пару минут мой оппонент оказался за этим ноутбуком, полностью готовый решать задачу.

И буквально на первых же строках он допустил серьезную ошибку при аллоцировании памяти под… строку.

char *str = (char *)malloc(sizeof(char) * strlen(buffer));

buffer — стековая переменная, в которую заносились данные с клавиатуры.

Я думаю, определенно найдутся люди, которые спросят: «Разве что-то тут может быть не так?».
Поверьте, может.

А что именно — читайте по катом.
Читать дальше →

Зачем использовать статические типы в JavaScript? (Пример статической типизации на Flow)

Время на прочтение9 мин
Количество просмотров36K
Как разработчик JavaScript вы можете целый день программировать, но не встретить ни одного статического типа. Так зачем думать об их изучении?

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

Заинтересованы? Тогда вам повезло — именно об этом наша серия статей.

Во-первых, определение


Проще всего понять статические типы — это противопоставить их динамическим. Язык со статическими типами называют языком со статической типизацией. С другой стороны, язык с динамическими типами называют языком с динамической типизацией.
Читать дальше →

Centrifugo – 3.5 миллиона оборотов в минуту

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


Последний раз я писал про Centrifugo чуть больше года назад. Пришло время напомнить о существовании проекта и рассказать, что произошло за этот период времени. Чтобы статья не скатилась в скучное перечисление изменений, я попробую сконцентрировать внимание на некоторых Go библиотеках, которые помогли мне в разработке – возможно, вы почерпнете для себя что-то полезное.
Читать дальше →

Эволюция приложений или куда мы идем

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

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


image

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

Вклад авторов