Время от временя в интернете, в основном на сайтах различных магазинов и торговых площадок, мы сталкиваемся с программной лупой, позволяющей рассмотреть более детально фотографии различных товаров (что то подобное реализовано на сайте www.ebay.com). Созданием такой лупы для платформы Android мы и займёмся (специально для новичков).
Arseniy Seroka @JagaJaga
Chief executive officer @ Serokell
[Перевод] Различия в разработке под BlackBerry и Android
6 мин
15KОт переводчика: данный текст должен помочь комментаторам из этой и этой тем, желающим узнать, как обстоят дела с разработкой для BlackBerry 10.
![](https://habrastorage.org/storage3/7ef/304/e54/7ef304e5448ad84e00ba88f0ac234bb1.jpg)
Я хочу поделиться с вами собственным опытом разработки для Android и BlackBerry. Речь пойдёт не только о, собственно, программировании, но также об анализе статистики и получаемой прибыли.
Я ни в коем случае не хочу судить о платформах, лишь делюсь своими впечатлениями и фактами.
![](https://habrastorage.org/storage3/7ef/304/e54/7ef304e5448ad84e00ba88f0ac234bb1.jpg)
Я хочу поделиться с вами собственным опытом разработки для Android и BlackBerry. Речь пойдёт не только о, собственно, программировании, но также об анализе статистики и получаемой прибыли.
Я ни в коем случае не хочу судить о платформах, лишь делюсь своими впечатлениями и фактами.
+19
Заземлённые указатели
8 мин
52K![pointres, gnd](https://habrastorage.org/getpro/habr/post_images/831/651/efd/831651efd0f84343112273ecaaf70bfd.png)
Не так давно, один из сотрудников покинул наш коллектив и присоединился к компании, занимающийся разработкой программного обеспечения, связанного с встраиваемыми системами. Ничего особенного в этом нет, всегда и везде, кто-то уходит, а кто-то приходит. Всё зависит от количества плюшек, удобства и предпочтений. Интересно другое. Человек искренне переживает за состояние кода на новом месте работы, что в результате и вылилось в эту совместную статью. Тяжело, «просто программировать», когда знаешь, что такое статический анализ кода.
+76
Pixel-perfect верстка Android макетов
7 мин
56KРазрабатывать интерфейс Android приложений — непростая задача. Приходится учитывать разнообразие разрешений и плотностей пикселей (DPI). Под катом практические советы о верстке макетов дизайна Android приложений в Layout, который совпадает с макетом на одном устройстве а на остальных растягивается без явных нарушений дизайна: выхода шрифтов за границы; огромных пустых мест и других артефактов.
UPD: Пост спорный, но много ценных советов в комментариях
![](https://habrastorage.org/storage3/947/a25/fab/947a25fab07572f4a80bd20335cfc74b.jpg)
UPD: Пост спорный, но много ценных советов в комментариях
![](https://habrastorage.org/storage3/947/a25/fab/947a25fab07572f4a80bd20335cfc74b.jpg)
+33
Пять подводных камней при использовании shared_ptr
15 мин
137KКласс shared_ptr — это удобный инструмент, который может решить множество проблем разработчика. Однако для того, чтобы не совершать ошибок, необходимо отлично знать его устройство. Надеюсь, моя статья будет полезна тем, кто только начинает работать с этим инструментом.
Я расскажу о следующем:
Я расскажу о следующем:
- что такое перекрестные ссылки;
- чем опасны безымянные shared_ptr;
- какие опасности подстерегают при использовании shared_ptr в многопоточной среде;
- о чем важно помнить, создавая свою собственную освобождающую функцию для shared_ptr;
- какие существуют особенности использования шаблона enable_shared_from_this.
+55
Совместный запуск Linux и baremetal OS
4 мин
16KНедавно я выложил в сеть под BSD лицензией небольшой проект на 8 килострочек C кода. Официально это коллекция бенчмарков для моих клиентов — вендоров промавтоматики. Код очень специфический, и, на первый взгляд, малоприменим за пределами узкой области PLC и motion control. Но есть небольшая изюминка, на которой я не очень акцентировал внимание в статье на IDZ. В поставку бенчмарков включена baremetal среда для их исполнения. В этом посте я опишу, что это такое, и как ее можно использовать.
+29
Смертные грехи Программиста
3 мин
55KЯ знаю, что мой глас так и останется гласом вопиющего в пустыне администратора. Кто я, собственно? Всего лишь администратор, жалкое подобие демиурга, которым является Программист. Он – создатель сущего, а мой удел всего лишь поддерживать его творения в работающем состоянии и молиться, чтобы паства, то есть, пользователи, не распяли меня, когда у них что-то не работает.
Но даже Программист грешен, если не соблюдает семь заповедей.
Программист любит верить в то, что запускающий его программу пользователь подобен администратору. Увы, увы, такого права ему чаще всего никто не давал, поэтому если Программист об этом не подумал, то птица скорби Симург возносит свои крылья над администратором.
Но даже Программист грешен, если не соблюдает семь заповедей.
Не возомни паству пастырем
Программист любит верить в то, что запускающий его программу пользователь подобен администратору. Увы, увы, такого права ему чаще всего никто не давал, поэтому если Программист об этом не подумал, то птица скорби Симург возносит свои крылья над администратором.
+92
Я оглянулся посмотреть не оглянулась ли она… или история о том, как я был сам себе провайдером в начале 2000-х
8 мин
64KИнтернет в нашем городе появился стандартно — в виде государственного монополиста связи, устроившего модемный пул в несколько десятков каналов. Доступ к Всемирной паутине пришел не на пустое место — уже несколько лет процветала сеть Fidonet, насчитывавшая у нас целых три ноды и до сотни подписчиков-поинтов. Номер своего поинта уже и не вспомню, но где-то в архивах на дисках еще пылится подборка нужного софта — тоссера, голдеда, продвинутой «звонилки» и прочего.
Так что модемы у многих были, равно как и желание поскорее приобщиться к мировой сети.
![](https://habrastorage.org/storage2/7de/9ac/eea/7de9aceea6f307baee90abbd2c71af2e.jpg)
Так что модемы у многих были, равно как и желание поскорее приобщиться к мировой сети.
![](https://habrastorage.org/storage2/7de/9ac/eea/7de9aceea6f307baee90abbd2c71af2e.jpg)
+154
Оптимизируем, оптимизируем и еще раз оптимизируем
5 мин
24KПо долгу службы мне периодически приходится пользоваться профайлером, так как требования к производительности серверов задокументированы и не могут опускаться ниже определенного уровня. Помимо некоторых очевидных архитектурных изменений и решений частенько находятся повторяющиеся места от модуля к модулю, от одного проекта к другому, которые создают дополнительную нагрузку на виртуальную машину, которыми и хочу поделиться.
Так уж случилось, что на глаза чаще всего попадался код работы с Date потому с него и начнем:
Не один десяток раз я имел возможность наблюдать, как во время обработки одного запроса от пользователя в нескольких разных местах создается новый объект даты. Чаще всего цель одна и та же — получить текущее время. В простейшем случае это выглядит так:
Казалось бы — вполне очевидное и правильное решение. В принципе, да, за исключением двух моментов:
Очень часто в веб проектах возникает задача перевести строку в дату или наоборот дату в строку. Задача довольно типичная и чаще всего выглядит так:
Это правильное и быстрое решение, но если серверу приходится парсить строку на каждый пользовательский реквест в каждом из сотен потоков — это может ощутимо бить по производительности сервера в виду довольно тяжеловесного конструктора SimpleDateFormat, да и помимо самого форматера создается множество других объектов в том числе и не легкий Calendar (размер которого > 400 байт).
Ситуацию можно было бы легко решить, сделав SimpleDateFormat статическим полем, но он не является потокобезопасным. И в конкурентной среде легко можно словить NumberFormatException.
Вторая мысль — использовать синхронизацию. Но это таки довольно сомнительная вещь. В случае большой конкуренции между потоками, мы можем не просто не улучшить производительность но и ухудшить.
Но решения есть и их как минимум 2:
Так уж случилось, что на глаза чаще всего попадался код работы с Date потому с него и начнем:
Date
Не один десяток раз я имел возможность наблюдать, как во время обработки одного запроса от пользователя в нескольких разных местах создается новый объект даты. Чаще всего цель одна и та же — получить текущее время. В простейшем случае это выглядит так:
public boolean isValid(Date start, Date end) {
Date now = new Date();
return start.before(now) && end.after(now);
}
Казалось бы — вполне очевидное и правильное решение. В принципе, да, за исключением двух моментов:
- Использовать Date сегодня в java — уже, пожалуй, моветон, учитывая тот факт, что почти все методы в нем уже Deprecated.
- Нету смысла создавать новый объект даты, если вполне можно обойтись примитивом long:
public boolean isValid(Date start, Date end) {
long now = System.currentTimeMillis();
return start.getTime() < now && now < end.getTIme();
}
SimpleDateFormat
Очень часто в веб проектах возникает задача перевести строку в дату или наоборот дату в строку. Задача довольно типичная и чаще всего выглядит так:
return new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").parse(dateString);
Это правильное и быстрое решение, но если серверу приходится парсить строку на каждый пользовательский реквест в каждом из сотен потоков — это может ощутимо бить по производительности сервера в виду довольно тяжеловесного конструктора SimpleDateFormat, да и помимо самого форматера создается множество других объектов в том числе и не легкий Calendar (размер которого > 400 байт).
Ситуацию можно было бы легко решить, сделав SimpleDateFormat статическим полем, но он не является потокобезопасным. И в конкурентной среде легко можно словить NumberFormatException.
Вторая мысль — использовать синхронизацию. Но это таки довольно сомнительная вещь. В случае большой конкуренции между потоками, мы можем не просто не улучшить производительность но и ухудшить.
Но решения есть и их как минимум 2:
- Старый, добрый ThreadLocal — cоздаем SimpleDateFormat для каждого потока 1 раз и переиспользуем для каждого последующего запроса. Данный подход поможет ускорить парсинг даты в 2-4 раза за счет избежания создания объектов SimpleDateFormat на каждый запрос.
- Joda и ее потокобезопасный аналог SimpleDateFormat — DateTimeFormat. Хоть йода в целом и медленнее дефолтного Java Date API в парсинге дат они идут наравне. Несколько тестов можно глянуть тут.
+26
Мультиквайногенератор
9 мин
18KНа хабре месячник квайнов, поэтому хочу поделиться своими разработками, которые проделывал ещё четыре года назад.
Хороший мультиквайн — это произведение инженерного искусства, но…
При взгляде на очередную порцию «помех на телеграфной линии», у обычного программиста возникает лишь изумление: «как такое вообще возможно», и «кем был тот сумрачный тевтонский гений».
Я хочу сорвать покровы и показать, как легко писать мультиквайн любой степени сложности на любом наборе языков программирования, включая вайтспейс и брейнфак.
Поскольку мы имеем дело с текстами программ и результатами их исполнения, то было бы естественно взглянуть на это дело как на функции над строками.
Хороший мультиквайн — это произведение инженерного искусства, но…
При взгляде на очередную порцию «помех на телеграфной линии», у обычного программиста возникает лишь изумление: «как такое вообще возможно», и «кем был тот сумрачный тевтонский гений».
Я хочу сорвать покровы и показать, как легко писать мультиквайн любой степени сложности на любом наборе языков программирования, включая вайтспейс и брейнфак.
Поскольку мы имеем дело с текстами программ и результатами их исполнения, то было бы естественно взглянуть на это дело как на функции над строками.
+75
Пишем приложения для Google Glass
7 мин
18KНесколько дней назад я имел возможность основательно попрактиковаться в разработке приложений для Google Glass. Полученный опыт растеряется со временем, так как пока разрабатывать что-то ещё под “очки” не планирую. Чтобы поделиться пока ещё свежими впечатлениями решил написать этот топик.
Думаю, всем кто интересуется Google Glass известно, что представляет собой программная “начинка” этого гаджета. Да, это Android 4 с адаптированным launcher-ом. Да, в “очках” вполне можно запускать обычные android-приложения, установив их туда через adb. Известно вам наверняка и про Mirror API, который до недавнего времени считался единственным способом официально предоставить свой сервис пользователю Google Glass. Ниже я немного расскажу о использовании этого инструмента. Но главное, о чём хотелось бы рассказать — как писать под Google Glass полноценные android-приложения, используя пока ещё не официальный Glass Development Kit.
Думаю, всем кто интересуется Google Glass известно, что представляет собой программная “начинка” этого гаджета. Да, это Android 4 с адаптированным launcher-ом. Да, в “очках” вполне можно запускать обычные android-приложения, установив их туда через adb. Известно вам наверняка и про Mirror API, который до недавнего времени считался единственным способом официально предоставить свой сервис пользователю Google Glass. Ниже я немного расскажу о использовании этого инструмента. Но главное, о чём хотелось бы рассказать — как писать под Google Glass полноценные android-приложения, используя пока ещё не официальный Glass Development Kit.
+26
Неэффективный программист или как взломать свой мозг за 2 дня
9 мин
190K![](https://habrastorage.org/storage2/b51/042/b6d/b51042b6d3c380df9295852d3dbdc09f.jpg)
Disclaimer: Автор понимает, что ничего нового не открыл, но подача материала может оказаться достаточно полезной, особенно для тех, кто регулярно пытается сконцентрироваться и расти над собой.
Интернет сделал нас ленивыми!
Почему? Кто в последний раз посмотрел видео больше 3х минут? Кто прочитал пост больше 2 страниц? Какой заголовок более привлекателен, «63 способа бла-бла-бла» или «3 проверенных метода бла-бла-бла»? А если эти три проверенных метода выделены от основного текста, то это вообще гуд (можно не читать текст вовсе, а просто пробежаться по выделенным подзаголовкам).
В этом свои плюсы. Наш мозг эволюционировал, и обрабатывает информацию быстрее, чем, скажем, 15-20 лет назад (да и эволюционирует быстрее, чем это было возможно век назад). Как компании справляются с высокими нагрузками? Как процессор выполняет программу по возможности быстро? С помощью кэширования! (как вариант, но самый приоритетный). Что делает наш мозг, чтобы справиться с большой нагрузкой? Кэширует! Что именно и как — оставим на размышление ИИшникам (специалистам по искусственному интеллекту). В противном случае при увеличении размера обрабатываемой информации время «отклика» бы увеличилось в разы, и на ответ на «как добраться до ближайшей больницы?» уйдет больше времени, чем человек «в силе ждать». «Сила ждать» тоже уменьшилась, «размер» нашего терпения уменьшился, и мы быстро устаем, если продолжительность видео большая, размер статьи большой (на самом деле продолжительность может не влиять на терпение, больше всего влияет полезная информация, если «воды» меньше или вовсе нет, то и терпеть ничего не приходится, посему данный пост написан «эз лаконик эз посибл»).
+156
Краткое введение в GNU autoconf
5 мин
50KI saw a book entitled «Die GNU Autotools» and I thought «My feelings exactly». Turns out the book was in German1. ©
Можно долго рассуждать о несовершенстве сего инструментария, о превосходстве CMake/QMake/подставьте_вашу_любимую систему сборки, но проекты, использующие autotools, окружают нас повсюду, и стоит как минимум знать, что это за зверь и с чем его едят, чтобы при попытке сделать, а то и отправить разработчикам патч, не править автосгенерированные файлы, чем я не так давно занимался.
Так же следует понимать, что именно autoconf системой сборки не является вообще, это система конфигурации перед сборкой. autoconf почему-то многие считают неким монстром, «проверяющим 15 давно несуществующих версий компилятора Fortran, а потом поддержку ключей этими компиляторами», что не совсем верно, ибо оно делает ровно то, что ему скажут. Другое дело, что многие просто копипастят его конфиг из проекта в проект, в итоге результат получается ужасающим.
В данной статье (планируется всё же осилить цикл) я хотел бы рассказать про autoconf, зачем он нужен и как его использовать.
Можно долго рассуждать о несовершенстве сего инструментария, о превосходстве CMake/QMake/подставьте_вашу_любимую систему сборки, но проекты, использующие autotools, окружают нас повсюду, и стоит как минимум знать, что это за зверь и с чем его едят, чтобы при попытке сделать, а то и отправить разработчикам патч, не править автосгенерированные файлы, чем я не так давно занимался.
Так же следует понимать, что именно autoconf системой сборки не является вообще, это система конфигурации перед сборкой. autoconf почему-то многие считают неким монстром, «проверяющим 15 давно несуществующих версий компилятора Fortran, а потом поддержку ключей этими компиляторами», что не совсем верно, ибо оно делает ровно то, что ему скажут. Другое дело, что многие просто копипастят его конфиг из проекта в проект, в итоге результат получается ужасающим.
В данной статье (планируется всё же осилить цикл) я хотел бы рассказать про autoconf, зачем он нужен и как его использовать.
+58
Семьи типов и Покемоны
11 мин
20KПеревод
Предисловие
Когда я начал изучать Хаскель, я был почти сразу поражён. Для начала, нырнув с головой в актуальные рабочие проекты, открыл, что большинство настоящих библиотек используют языковые расширения, присутствующие только в GHC (Glasgow Haskell Compiler). Это меня покоробило слегка, прежде всего потому, кто захочет использовать язык настолько немощный, что будет необходимо использовать расширения, присутствующие лишь у одного поставщика. Ведь так?
Хорошо, я решился снова это осилить и узнать всё об этих расширениях, и я вывел три горячих топика для общества Хаскеля, которые решали похожие проблемы: Обобщённые Алгебраические Типы Данных, Семьи Типов и Функциональные Зависимости. Пытаясь найти ресурсы, которые обучают о них, я смог найти только статьи, описывающие, что это такое, и как их использовать. Но никто, на самом деле, не объяснял зачем они нужны!.. Поэтому я решил написать эту статью, используя дружественный пример, пытаясь объяснить зачем всё-таки нужны Семьи Типов.
![](https://habrastorage.org/storage2/989/946/059/9899460598e394cb692d0c1bd0051b10.jpg)
Вы когда-нибудь слышали про Покемонов? Это замечательные существа, которые населяют Мир Покемонов. Вы можете считать, что они как животные с экстраординарными способностями. Все покемоны владеют стихией, и все их возможности зависят от этой стихии. Например, покемон Огненной стихии может дышать огнём, в то время как покемон Водной стихии может брызгать струями воды.
Покемоны принадлежат людям, и их специальные способности могут быть использованы во благо для продуктивной деятельности, но некоторые люди всего лишь используют своих покемонов для борьбы с другими покемонами других людей. Эти люди называют себя Тренерами Покемонов. Это может сначала звучать как жестокое обращение с животными, но это очень даже весело и все, похоже, рады, включая покемонов. Имейте в виду, что в мире покемонов, кажется, всё в порядке, даже если 10-летние покидают дом, дабы рисковать своими жизнями ради того, чтобы стать самыми лучшими Тренерами Покемонов, как будто никто и никогда таковыми не становился.
Мы собираемся использовать Хаскель для того, что бы представить ограниченную (и даже несколько упрощённую, да простят меня фанаты) часть мира покемонов.
+21
Замена Dropbox на BitTorrent Sync + Raspberry Pi
2 мин
65K![](https://habrastorage.org/storage2/409/454/656/40945465655d5b4e0675fdad7bc08844.jpg)
Для Raspberry Pi нашли ещё одно полезное применение. Мини-компьютер отлично справляется с бэкапом и синхронизацией файлов между различными устройствами. К нему можно подключить внешний диск или большую флэшку, и RPi готов работать круглосуточно, синхронизируя файлы с компьютеров, ноутбуков и Android-устройств (скоро выйдет и клиент для iOS). Незачем платить за облачный сервис, если можно сделать такое же удобное «облако» у себя дома, и бесплатно.
Американский программист Джек Минарди опубликовал пошаговую инструкцию, как запустить BitTorrent Sync на Raspberry Pi.
+69
Бюджетная маркерная доска за 730 рублей своими руками
3 мин
154KВ хабратопике Фотографии рабочих мест хабражителей и… был один интересный комментарий от хабрапользователя hermit931
И в мозге сразу возникла мысль: «Зачем я выкинул старые деревянные окна при ремонте квартиры !» Мозг продолжил выдавать мысли: «Как сделать маркерную доску с наименьшими денежными затратами и наибольшей долговечностью и эффективностью».
Я поделился идеей с коллегой. Через пять минут спрашиваю: «Что ты думаешь о том, чтобы сделать маркерную доску». Как выяснилось, он за эти пять минут уже перечетал все хабратопики по этому поводу (параллельно этим занимался и я).
Мы с коллегой проанализировали все хабратопики по изготовлению маркерных досок своими руками и разделили их на две группы:
1) Маркерные доски по технологии: подложка + цветной фон + стекло
Контрастная и долговечная маркерная доска
Идеальная маркерная доска
Маркерная доска своими руками
Общее описание: Весьма надежно и капитально, но обходится весьма дорого. Можно немного доплатить и взять фабричную маркерную доску из магазина.
2) Маркерные доски с применением самоклеящейся пленки или скотча на белой бумаге
Бюджетная маркерная доска
Маркерная доска
Общее описание: Обходится очень дешево, но это пленка на бумаге, которая имеет маленькую износоустойчивость.
Хотелось совместить прочность первой группы и дешевизну второй. Кому интересно, что у нас получилось — прошу под кат.
… Ах да — у меня не совсем доска, а из старого окна рама со стеклом ) разница не большая, только в весе :)
И в мозге сразу возникла мысль: «Зачем я выкинул старые деревянные окна при ремонте квартиры !» Мозг продолжил выдавать мысли: «Как сделать маркерную доску с наименьшими денежными затратами и наибольшей долговечностью и эффективностью».
Я поделился идеей с коллегой. Через пять минут спрашиваю: «Что ты думаешь о том, чтобы сделать маркерную доску». Как выяснилось, он за эти пять минут уже перечетал все хабратопики по этому поводу (параллельно этим занимался и я).
Мы с коллегой проанализировали все хабратопики по изготовлению маркерных досок своими руками и разделили их на две группы:
1) Маркерные доски по технологии: подложка + цветной фон + стекло
Контрастная и долговечная маркерная доска
Идеальная маркерная доска
Маркерная доска своими руками
Общее описание: Весьма надежно и капитально, но обходится весьма дорого. Можно немного доплатить и взять фабричную маркерную доску из магазина.
2) Маркерные доски с применением самоклеящейся пленки или скотча на белой бумаге
Бюджетная маркерная доска
Маркерная доска
Общее описание: Обходится очень дешево, но это пленка на бумаге, которая имеет маленькую износоустойчивость.
Хотелось совместить прочность первой группы и дешевизну второй. Кому интересно, что у нас получилось — прошу под кат.
+34
[C++] Всё ли мы знаем об операторах new и delete?
4 мин
82KТуториал
Привет! Ниже речь пойдет об известных всем операторах new и delete, точнее о том, о чем не пишут в книгах (по крайней мере в книгах для начинающих).
На написание данной статьи меня побудило часто встречаемое заблуждение по поводу new и delete, которое я постоянно вижу на форумах и даже(!!!) в некоторых книгах.
Все ли мы знаем, что такое на самом деле new и delete? Или только думаем, что знаем?
Эта статья поможет вам разобраться с этим (ну, а те, кто знают, могут покритиковать:))
На написание данной статьи меня побудило часто встречаемое заблуждение по поводу new и delete, которое я постоянно вижу на форумах и даже(!!!) в некоторых книгах.
Все ли мы знаем, что такое на самом деле new и delete? Или только думаем, что знаем?
Эта статья поможет вам разобраться с этим (ну, а те, кто знают, могут покритиковать:))
+62
Тройка полезных монад
4 мин
47KПеревод
Внимание: перед тем как читать текст ниже, вы уже должны иметь представление о том, что такое монады. Если это не так, то прежде прочитайте вот этот пост!
Перед нами функция
![](https://habrastorage.org/storage2/cae/b90/f70/caeb90f70d874d167b9c41b79f6d9936.png)
И мы можем применить её несколько раз:
Всё работает как и ожидалось. Но вот вы решили, что хорошо бы иметь лог того, что происходит с этой функцией:
![](https://habrastorage.org/storage2/589/c29/38b/589c2938bad51c85d798b6b6a9109331.png)
Что ж, отлично. Но что будет если вы теперь захотите применить
Вот то, что мы хотели бы, чтобы происходило:
![](https://habrastorage.org/storage2/79d/276/7a6/79d2767a62262147d45b5cd660041b34.png)
Спойлер: автоматически так не сделается. Придётся всё расписывать ручками:
Фу! Это ни капли не похоже на лаконичное
А что, если у вас есть ещё функции, имеющие лог? Напрашивается такая схема: для каждой функции, возвращающей вместе со значением лог, мы бы хотели объединять эти логи. Это побочный эффект, а никто не силён в побочных эффектах так, как монады!
Перед нами функция
half
:![](https://habrastorage.org/storage2/cae/b90/f70/caeb90f70d874d167b9c41b79f6d9936.png)
И мы можем применить её несколько раз:
half . half $ 8
=> 2
Всё работает как и ожидалось. Но вот вы решили, что хорошо бы иметь лог того, что происходит с этой функцией:
![](https://habrastorage.org/storage2/589/c29/38b/589c2938bad51c85d798b6b6a9109331.png)
half x = (x `div` 2, "Я только что располовинил " ++ (show x) ++ "!")
Что ж, отлично. Но что будет если вы теперь захотите применить
half
несколько раз?half . half $ 8
Вот то, что мы хотели бы, чтобы происходило:
![](https://habrastorage.org/storage2/79d/276/7a6/79d2767a62262147d45b5cd660041b34.png)
Спойлер: автоматически так не сделается. Придётся всё расписывать ручками:
finalValue = (val2, log1 ++ log2)
where (val1, log1) = half 8
(val2, log2) = half val1
Фу! Это ни капли не похоже на лаконичное
half . half $ 8
А что, если у вас есть ещё функции, имеющие лог? Напрашивается такая схема: для каждой функции, возвращающей вместе со значением лог, мы бы хотели объединять эти логи. Это побочный эффект, а никто не силён в побочных эффектах так, как монады!
+53
Обзор новых возможностей С++14: Часть 1
10 мин
139KВ апреле в Бристоле прошла встреча комитета С++, на которой были рассмотрены первые предложения по внесению изменений в новый стандарт С++14. Все рассматриваемые в этой статье изменения были одобрены на этой встрече и уже занимают свое почетное место в последней версии черновика нового стандарта (N3690 от 15 мая 2013).
Краткий перечень:
Краткий перечень:
- Автоматическое определение типа возвращаемого значения для обычных функций
- Обобщенная инициализация захваченных переменных лямбд с поддержкой захвата-по-перемещению
- Обобщенные (полиморфные) лямбда-выражения
- Упрощенные ограничения на создание
constexpr
функций - Шаблоны переменных
-
exchange
-
make_unique
- Обособленные строки
- Пользовательские литералы для типов стандартной библиотеки
-
optional
-
shared_mutex
иshared_lock
-
dynarray
+64
Кручу-верчу, запутать хочу: углы Эйлера и Gimbal lock
3 мин
127K![](https://habrastorage.org/storage2/ec3/09f/b74/ec309fb74e342b35166a4be332670df6.png)
Выставите любой палец левой руки вперед. Давайте, не стесняйтесь, никто не будет над вами смеяться. Это нужно для важного эксперимента. Выставили? Теперь представьте что вы — это ваш палец (ну и бред). Повернитесь под прямым углом направо, затем наверх, и наконец налево. Где вы оказались? Правильно, в том же месте, но уже на спине.
С некоторой натяжкой именно так работает вращение с помощью углов Эйлера. Немного непредсказуемо и неудобно, не правда ли? Углы Эйлера имеют несколько недостатков, но есть одно особенно нехорошее свойство из-за которого вы не захотите с ними связываться. Его имя — Gimbal lock.
В русском языке gimbal lock называют по-разному: шарнирный замок, блокировка осей, складывание рамок. К сожалению, по запросам в поисковике с такими ключевыми словами выдаётся много мусора, а статья в Википедии оставляет желать лучшего, поэтому я сам расскажу вам об этом феномене и предложу как с ним бороться.
Внимание! Заходя под кат вы подвергаетесь риску поломать голову.
+53
Информация
- В рейтинге
- Не участвует
- Откуда
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Дата рождения
- Зарегистрирован
- Активность