Pull to refresh

Как превратить телефон в музыкальную студию

Smartphones
Translation


Компания ZOOZ Mobile анонсировала сегодня Nokia N95-совместимую версию своего основного программного продукта ZOOZBeat. Программа позволяет превратить телефон в «музыкальную студию» (см. видео), реагируя на жесты пользователя.

Еще пара слов и еще одно видео
Total votes 26: ↑18 and ↓8 +10
Views 480
Comments 24

Величие шрифтов

Typography *
Потрясающе видео «Mankind Is No Island», смонтированное из снимков шрифтов и текстов, снятых на мобильный телефон на улицах Сиднея и Нью-Йорка, получило награду на австралийском кинофестивале Tropfest NY 2008.


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

Читать дальше →
Total votes 71: ↑61 and ↓10 +51
Views 1.4K
Comments 16

Паттерн Наблюдатель: списки и матрёшки из слушателей

Programming *
В этой хабрастатье на примере паттернов Наблюдатель и Компоновщик рассмотрено, как применять принципы объектно-ориентированного программирования, когда стоит использовать композицию, а когда наследование. А так же рассмотрено, какие существуют способы повторного использования кода, кроме copy-paste.

Статья достаточно простая, в ней рассматриваются очевидные вещи, но надеюсь, что она будет интересна начинающим программистам, которые пока встречались со словами из первого абзаца только на лекциях по программированию. (На самом деле эта статья и есть кусочек практического занятия по программированию.)
Читать дальше →
Total votes 21: ↑19 and ↓2 +17
Views 22K
Comments 16

Композиция vs наследование

Programming *C++ *C# *
Sandbox
Как и всем разработчикам, мне часто приходилось читать и слышать утверждение, что «композиция всегда лучше наследования». Наверное, даже слишком часто. Однако я не склонен принимать что-либо на веру, поэтому давайте разберёмся, так ли это.
Читать дальше →
Total votes 24: ↑13 and ↓11 +2
Views 82K
Comments 12

Ещё немного автоматической генерации музыки

Sound

Недавно на хабре мы видели несколько интересных подходов к автоматическому написанию музыки. Позвольте представить ещё один. Сразу оговорюсь: я не буду здесь пользоваться никакими правилами гармонии. Сложной математики тоже не будет. Решим задачу наиболее простым способом. Если вам не очень интересно, как это всё делалось, можете пролистать вниз, там есть несколько примеров, можно сразу оценить, как звучит результат.

Итак, мы хотим написать нечто достаточно музыкальное.
С чего начать?
Total votes 37: ↑35 and ↓2 +33
Views 25K
Comments 42

Является ли Go языком ООП?

Programming *ООP *Go *
Translation
Object-oriented design is the roman numerals of computing.
— Rob Pike, автор Go.

image

Предлагаю вашему вниманию вольный перевод заметки «Is Go An Object Oriented Language?» за авторством Steve Francia, в которой автор наглядно рассказывает об особенностях использования парадигмы ООП в Go. Сразу предупреждаю, что из-за свойств оригинального материала большую часть текста пришлось переформулировать полностью, где-то добавить своего. Флажок перевода убирать не стал.
Читать дальше →
Total votes 59: ↑49 and ↓10 +39
Views 57K
Comments 27

Ответ на Решетчатое наследование

Abnormal programming *ООP *
Sandbox
Эта публикация — ответ на текст «Решетчатое наследование», опубликованный хабрапользователем potan, с предложением альтернативы, на субъективный взгляд автора, более близкой к ООП с классами (для случая с ограниченным набором классов).
Читать дальше →
Total votes 8: ↑4 and ↓4 0
Views 3.1K
Comments 10

Что нужно знать, чтобы хорошо рисовать?

Krita Foundation corporate blog Open source *
Translation
Tutorial


Давид Ревуа — прекрасный художник, работающий со свободным программным обеспечением, постоянный член сообществ Krita Foundation и Blender Institute, концепт-художник анимационных проектов Gooseberry Open Movie Project, Mango Open Movie Project (Tears of Steel) и Durian Open Movie Project (Sintel). В этой статье он делится с начинающими художниками списком знаний, которые необходимо приобрести, чтобы работы получались реалистичными. Он обращает внимание, что для рисования «в цифре» следует обзавестись теми же навыками, что и в традиционной технике. Итак, приобщимся к его опыту.
Читать дальше →
Total votes 134: ↑128 and ↓6 +122
Views 240K
Comments 113

Языки программирования. Композиционный взгляд

Programming *Perfect code *Designing and refactoring *Functional Programming *
Здравствуй, Хабр! Сегодня хотел бы поднять вопрос об использовании композиций и их роли в программировании. Те, кто сталкивался с функциональными языками, скорее всего слышали о них, а те, кто не сталкивался, возможно, узнают что-нибудь новое. Надеюсь на интересную дискуссию в конце статьи об их применении. Эшер для привлечения внимания.


Поехали
Total votes 22: ↑12 and ↓10 +2
Views 8.8K
Comments 18

Практика функционального программирования на JavaScript с использованием Ramda

JavaScript *Functional Programming *
Translation
Мы в rangle.io давно увлекаемся функциональным программированием, и уже опробовали Underscore и Lodash. Но недавно мы наткнулись на библиотеку Ramda, которая на первый взгляд похожа на Underscore, но отличается в небольшой, но важной области. Ramda предлагает примерно тот же набор методов, что и Underscore, но так организовывает работу с ними, что функциональная композиция становится легче.

Разница между Ramda и Underscore – в двух ключевых местах – каррирование и композиция.
Читать дальше →
Total votes 32: ↑31 and ↓1 +30
Views 21K
Comments 34

Композиция и интерфейсы

Programming *.NET *Designing and refactoring *C# *ООP *
Sandbox

В мире объектно-ориентированного программирования уже достаточно давно подвергается критике концепция наследования.


Аргументов достаточно много:


  • дочерний класс наследует все данные и поведение родительского, что нужно не всегда (а при доработке родительского в дочерний класс вообще попадают данные и поведение, которые не предполагались на момент разработки дочернего);
  • виртуальные методы менее производительные, а в случае, если язык позволяет объявить невиртуальный метод, то как быть, если в наследнике нужно его перекрыть (можно пометить метод словом new, но при этом не будет работать полиморфизм, и использование такого объекта может привести к неожидаемому поведению, в зависимости от того, к какому типу приведен объект в момент его использования);
  • если возникает необходимость множественного наследования, то в большинстве языков оно отсутствует, а там, где есть (C++), считается трудоемким;
  • есть задачи, где наследование как таковое не может помочь — если нужен контейнер элементов (множество, массив, список) с единым поведением для элементов разных типов, и при этом нужно обеспечить статическую типизацию, то здесь помогут обобщения (generics).
  • и т.д., и т.п.

Альтернативой наследованию являются использование интерфейсов и композиция. (Интерфейсы давно используется в качестве альтернативы множественному наследованию, даже если в иерархии классов активно используется наследование.)

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

А как можно решить эту задачу (отсутствие дублирования кода) в случае композиции и интерфейсов?
Этой теме и посвящена настоящая статья.
Читать дальше →
Total votes 16: ↑14 and ↓2 +12
Views 26K
Comments 38

Имена или семантика классов в программировании

Programming *System Analysis and Design *
1. При программировании на придумывание имен может уходить ощутимо много времени. Казалось бы, такая маловажная вещь, как имя. И вот только сегодня я осознал, почему я трачу на это время, и почему, в итоге, это не напрасная трата времени.

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

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

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

Как вы яхту назовете, так она и поплывет.
Читать дальше →
Total votes 25: ↑14 and ↓11 +3
Views 12K
Comments 41

Теория близости: главное правило дизайна, которое помогает перейти от субъективных ощущений к конкретике

Логомашина corporate blog Web design *Interfaces *Usability *Graphic design *
Впервые о теории близости я прочитал в 2007 году. Она была сформулирована так: «объекты, расположенные близко друг к другу, воспринимаются связанно». Тогда я подумал: «спасибо, Кэп! Я как-то и сам догадался, что букву “М” нужно вешать ближе к мужскому туалету, а не к женскому». Тогда я не осознал, что это одно из главных правил дизайна, которое помогает подбирать расстояния между элементами, размеры полей, расположение кнопок, размер логотипов и многое другое. А главное, теория позволяет быстро понять, хороший перед вами дизайн или нет, даже если вы не дизайнер.
image
Читать дальше →
Total votes 64: ↑60 and ↓4 +56
Views 62K
Comments 23

Поговорим о юзернеймах

Information Security *Website development *Typography *PostgreSQL *Django *
Translation
Пару недель назад я выпустил django-registration 2.4.1. Сборки 2.4.x станут последними в версии django-registration 2.x, дальше будут выходить только исправления багов. Основная ветка сейчас готовится к версии 3.0, откуда планируется удалить кучу устаревшего хлама, накопившегося за последнее десятилетие поддержки, и я постараюсь учесть лучшие практики современных приложений Django.

В ближайшее время напишу подробнее о новой версии, но именно сейчас хочу немного поговорить об обманчиво простой проблеме, с которой приходится иметь дело. Это имена пользователей. Да, я мог бы написать одну из популярных статеек типа «Заблуждения программистов об X», но всё-таки предпочитаю реально объяснить, почему это сложнее, чем кажется, и предложить некоторые советы, как решить проблему. А не просто стебаться без полезного контекста.
Читать дальше →
Total votes 38: ↑37 and ↓1 +36
Views 14K
Comments 13

Наследование, композиция, агрегация

C# *ООP *
Sandbox
Нередко случается, что решив разобраться с какой-то новой темой, понятием, инструментом программирования, я читаю одну за другой статьи на различных сайтах в интернете. И, если тема сложная, то эти статьи могут не на шаг не приблизить меня к понимаю. И вдруг встречается статья, которая моментально дает озарение и все паззлы складываются воедино. Трудно определить, что отличает такую статью от других. Правильно подобранные слова, оптимальная логика изложения или же просто более релевантный пример. Я не претендую на то, что моя статься окажется новым словом в C# или же лучшей обучающей статьей. Но, возможно для кого-то она станет именно той, которая позволит разобраться, запомнить и начать правильно применять те понятия, о которых пойдет речь.
Читать дальше →
Total votes 19: ↑13 and ↓6 +7
Views 232K
Comments 97

Эволюция мобильной архитектуры Reddit

Development for iOS *Development of mobile applications *Designing and refactoring *ООP *
Translation


Это первая из статей, где мы рассказываем об архитектуре приложения Reddit под iOS. Здесь речь идёт о функциональности, которая работает ближе к UI. В частности, о переходе к архитектуре Model-View-Presenter (MVP). Преимущества такого рефакторинга:

  • Улучшение гибкости кода, его ясности и поддерживаемости для поддержки будущего роста и ускорения итераций.
  • Повышение производительности прокрутки в 1,58 раза.
  • Стимуляция модульного тестирования. Количество тестов увеличилось с нескольких штук до более 200.
Читать дальше →
Total votes 10: ↑10 and ↓0 +10
Views 3.8K
Comments 0

Сложное модульное архитектурное окружение в UE4

Working with 3D-graphics *Unreal Engine *Graphic design *Game design *
Translation
Тайлер Анлауф подготовил подробный анализ модульного окружения ROME: Church of Sant’Ivo созданного им в UE4 и 3ds Max. В статье он рассказывает о предварительном черновом плане (blockout), модульной сборке, освещении, постобработке и многом другом.


ROME: Church of Sant’Ivo


В данном анализе я поделюсь с вами своим процессом работы над ROME: Church of Sant’Ivo, хитростями, которым научился, трудностями, с которыми столкнулся во время работы, а также планами под дальнейшему усовершенствованию сцены, потому что она пока ещё не завершена.


Цели проекта


Задачи этого проекта заключались в усовершенствовании моего процесса работы над графикой, изучении Unreal Engine и улучшении моих навыков работы с освещением, цветом и композицией. Храм Сант-Иво алла Сапиенца соответствует целям проекта — в нём очевидно заметны возможности работы с модульной структурой, освещением, цветом и композицией.

Полезно было выбрать место, которое бы находило во мне отклик и вдохновляло меня. Этот архитектурный шедевр периода раннего римского барокко имеет богатую историю, величественный архитектурный язык и масштаб, который я нахожу интригующим. Этот масштаб также вызывал сложности из-за ограничений времени, поэтому мне нужно было всё тщательно спланировать.
Total votes 30: ↑30 and ↓0 +30
Views 12K
Comments 0

Выбираемся из дебрей тестов: строим короткий путь от фикстуры к проверке

2ГИС corporate blog IT systems testing *Programming *Scala *Functional Programming *


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


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

Читать дальше →
Total votes 30: ↑30 and ↓0 +30
Views 6.3K
Comments 5

Пытаясь композировать некомпозируемое: стыковочные схемы

Haskell *Functional Programming *

Введение


В Haskell принято работать с эффектами как с функторами, объектами которых являются некоторые выражения, которые нам интересны в данный момент.

Когда мы видим тип выражения Maybe a, мы абстрагируемся от фактического существования некоторого a, сконцентрировав все внимание именно на этом a. Та же история с List a — множественные значения a; State s aa, зависящая от некоторого текущего состояния; Either e aa, которое может вернуть некоторую ошибку e.
Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Views 3.2K
Comments 0

Функциональное программирование с точки зрения EcmaScript. Композиция, каррирование, частичное применение

JavaScript *
Привет, Хабр!

Сегодня мы продолжим наши изыскания на тему функционального программирования в разрезе EcmaScript, на спецификации которого основан JavaScript. В предыдущей статье мы разобрали основные понятия: чистые функции, лямбды, концепцию имутабельности. Сегодня поговорим о чуть более сложных техниках ФП: композиции, каррировании и чистых функциях. Статья написана в стиле «псевдо кодревью», т.е. мы будем решать практическую задачу, одновременно изучая концепции ФП и рефакторя код для приближения последнего к идеалам ФП.

Итак, начнём!

Предположим, перед нами стоит задача: создать набор инструментов для работы с палиндромами.
ПАЛИНДРО́М
Мужской родСПЕЦИАЛЬНОЕ
Слово или фраза, которые одинаково читаются слева направо и справа налево.
«П. «Я иду с мечем судия»»
Одна из возможных реализаций данной задачи могла бы выглядеть так:

function getPalindrom (str) {
  const regexp = /[\.,\/#!$%\^&\*;:{}=\-_`~()?\s]/g;
  str = str.replace(regexp, '').toLowerCase().split('').reverse().join('');
  //далее какой-то аякс запрос в словарь или к логике, которая генерирует фразы по переданным буквам

  return str;
}

function isPalindrom (str) {
  const regexp = /[\.,\/#!$%\^&\*;:{}=\-_`~()?\s]/g;
  str = str.replace(regexp, '').toLowerCase();
  return str === str.split('').reverse().join('');
}
Читать дальше →
Total votes 9: ↑7 and ↓2 +5
Views 7.4K
Comments 46
1