Уже три года я публикую регулярные обзоры свежих статей по теме интерфейсов, новых инструментов и коллекций паттернов, интересных кейсов и исторических рассказов. Из лент нескольких сотен тематических подписок отбирается примерно 5% стоящих публикаций, которыми интересно поделиться. Предыдущие материалы: апрель 2010-август 2013.
Пользователь
Windows Phone 8 такая, какой её задумали разработчики
10 мин
168K▌Вместо предисловия
Для начала хотелось бы сказать пару слов о новомодном тренде в области веб-дизайна и дизайна интерфейсов — плоском дизайне (Flat UI).
Flat, очень хорошо играет на контрасте. Metro особенно сильно выделяется в сфере UI.
Можно провести небольшую параллель: посмотрите на это надгробие. Оно прекрасно, не так ли?
Крупнее
Но. Оно выглядит прекрасно только потому что другие надгробия не такие же, в других надгробиях на этом фото слишком много деталей, форм, изгибов.
Однако если на кладбище все надгробия будут такие же, как это, тогда это будет ужасающая серость и беда. Прелесть минимализма именно в контрасте.
Другой яркий пример контраста минимализма
Возьмём другой пример, зажигалки Zippo. Представьте, вы заходите в бар и у всех посетителей в руках зажигалки Zippo разных расцветок и форм.
И тут вы достаёте свою минималистичную Zippo Black.
Она элегантна своей простотой. Среди пестрящей вычурности других зажигалок ваша, скорее всего, будет наиболее сильно выделяться из общей массы.
Но давайте теперь представим обратную картину.
У всех посетителей в руках минималистичная Zippo Black и тут вы заходите с золотой Zippo с красной вставкой и выдавленной трубкой. И на этот раз уже ваша далеко не минималистичная золотая Zippo будет привлекать внимание посетителей.
И тут вы достаёте свою минималистичную Zippo Black.
Она элегантна своей простотой. Среди пестрящей вычурности других зажигалок ваша, скорее всего, будет наиболее сильно выделяться из общей массы.
Но давайте теперь представим обратную картину.
У всех посетителей в руках минималистичная Zippo Black и тут вы заходите с золотой Zippo с красной вставкой и выдавленной трубкой. И на этот раз уже ваша далеко не минималистичная золотая Zippo будет привлекать внимание посетителей.
Минимализм не должен быть в мейнстриме, ни в коем случае.
Его нужно внедрять маленькими порциями там, где всё очень вычурно, очень нагромождено, усложнено. Но стоит минимализму стать мейнстримом, как он сразу потеряет весь свой шарм и красоту. Тогда будет просто серая безликая масса.
В 2010 году, когда на рынке смартфонов властвовали Apple, Samsung и HTC с нагромождёнными интерфейсами iOS, TouchWiz и HTC Sense, Windows Phone поражал воображение по внешности, дизайну.
+79
Timers in .Net
3 мин
58KВ последнее время не в первый раз сталкиваюсь с тем, что разработчики не до конца понимают как работает один из стандартных таймеров в .NET — System.Threading.Timer.
Т.е. в общем-то они вроде понимают что таймер что-то выполняет, скорее всего в ThreadPool — и если его использовать для периодического выполнения чего-либо, то он вполне подойдет. Но вот если вам надо создать не один таймер, а положим 1000, то тут люди начинают волноваться: а вдруг вот что-то там не так, а вдруг это все-таки 1000 потоков и даже боятся использовать их в таких случаях.
Хотелось бы пролить немного света на этот «таинственный» System.Threading.Timer.
Т.е. в общем-то они вроде понимают что таймер что-то выполняет, скорее всего в ThreadPool — и если его использовать для периодического выполнения чего-либо, то он вполне подойдет. Но вот если вам надо создать не один таймер, а положим 1000, то тут люди начинают волноваться: а вдруг вот что-то там не так, а вдруг это все-таки 1000 потоков и даже боятся использовать их в таких случаях.
Хотелось бы пролить немного света на этот «таинственный» System.Threading.Timer.
+29
Расписание вузов на телефонах: как мы провели лето — в поисках фрилансеров
4 мин
12KЛето — это проклятое для фриланса время. Но не со стороны фрилансера, а со стороны заказчика.
3 апреля 2013 года мы запустились в 5 вузах. Запустились, не все доделав, что хотели, но был уже апрель. За ним, напомню, май, половина которого — это праздники, а вторая половина — зачетная неделя. Поэтому апрель — это все, что нам оставалось, чтобы проверить, зайдет ли наш проект вообще или нет.
В апреле мы публиковали пост на Хабре про наш проект. Этот пост дал нам больше, чем любая другая публикация: больше всего установок, больше всего обращений от вузов, больше всего предложений помочь с проектом, и мы бесконечно благодарны за это Хабру и вам, потому что вы и есть Хабр. Этот пост — наш отчет о том, что мы сделали за лето, но все же стоит напомнить, что у нас за проект.
+42
Хранение деревьев в базе данных. Часть первая, теоретическая
4 мин
129KТуториал
Полгода назад написал бандл ClosureTable для фреймворка Laravel 3. Поводом для написания стала вот эта замечательная презентация Билла Карвина о способах хранения и обработки иерархических данных в MySQL с использованием PHP.
Итак. Существует несколько шаблонов проектирования баз данных для хранения и обработки иерархических структур:
Итак. Существует несколько шаблонов проектирования баз данных для хранения и обработки иерархических структур:
- Adjacency List («список смежности»)
- Materialized Path («материализованный путь»)
- Nested Sets («вложенные множества»)
- Closure Table («таблица связей»)
+35
Обзор свежих материалов, июль-август 2013
12 мин
18KУже три года я публикую регулярные обзоры свежих статей по теме интерфейсов, новых инструментов и коллекций паттернов, интересных кейсов и исторических рассказов. Из лент нескольких сотен тематических подписок отбирается примерно 5% стоящих публикаций, которыми интересно поделиться. Предыдущие материалы: апрель 2010-июнь 2013.
+42
Фильтры исключений в CLR
7 мин
14KПривет, хабралюди. Сегодня мы рассмотрим один из механизмов CLR, который напрямую недоступен для разработчиков на языке C# — фильтры исключений.
Опрос среди моих знакомых программистов на C# показал, что они (само собой) никогда этим механизмом не пользовались и даже не знают о его существовании. Поэтому предлагаю всем любознательным ознакомиться с текстом статьи.
Итак, фильтры исключений — это механизм, который позволяет блоку
Под катом — код на VB.NET, F#, CIL и C#, а также проверка различных декомпиляторов на обработку механизма фильтров.
Опрос среди моих знакомых программистов на C# показал, что они (само собой) никогда этим механизмом не пользовались и даже не знают о его существовании. Поэтому предлагаю всем любознательным ознакомиться с текстом статьи.
Итак, фильтры исключений — это механизм, который позволяет блоку
catch
декларировать предусловия, которым должно удовлетворять исключение, дабы быть пойманным данным блоком. Этот механизм работает не совсем так же, как выполнение проверок внутри блока catch
.Под катом — код на VB.NET, F#, CIL и C#, а также проверка различных декомпиляторов на обработку механизма фильтров.
+33
Unit тесты на практике
12 мин
146KВ последнее время появилось и продолжает появляться достаточно много публикаций на тему разработки через тестирование. Тема достаточно интересная и стоит того, чтобы посвятить её исследованию какую-то часть своего времени. В нашей команде мы используем модульное тестирование уже на протяжении года. В этой статье я хочу рассказать о том, что получилось и какой опыт в итоге мы приобрели.
Сразу оговорюсь, что примеры приводятся применительно к языку C# и платформе .NET. Соответственно, в других языках/платформах подходы и реализации могут отличаться.
Итак…
Сразу оговорюсь, что примеры приводятся применительно к языку C# и платформе .NET. Соответственно, в других языках/платформах подходы и реализации могут отличаться.
Итак…
+28
Ungit — самый простой способ использовать Git
1 мин
33KДоброго времени суток уважаемые хабражители. Буквально только что увидел потрясающий проект на GitHub от FredrikNoren.
Необходим Node.js версии 0.10 или выше и npm версии 1.3.1 или выше
Я думаю, что после просмотра видео, моего более тщательного описания не потребуется. Спасибо всем за внимание.
Ungit:
- Чистый и интуитивно понятный интерфейс для Git (что есть невероятно круто для освоения Git)
- Работает на любой платформе с установленными Node.js и самим Git
- Веб-ориентированный. Возможность запускать его в облаке.
- GitHub
Необходим Node.js версии 0.10 или выше и npm версии 1.3.1 или выше
Установка
npm install -g ungit
Я думаю, что после просмотра видео, моего более тщательного описания не потребуется. Спасибо всем за внимание.
+57
Как Яндекс распознаёт музыку с микрофона
10 мин
159KПоиск по каталогу музыки — это задача, которую можно решать разными путями, как с точки зрения пользователя, так и технологически. Яндекс уже довольно давно научился искать и по названиям композиций, и по текстам песен. На сказанные голосом запросы про музыку мы тоже умеем отвечать в Яндекс.Поиске под iOS и Android, сегодня же речь пойдёт о поиске по аудиосигналу, а если конкретно — по записанному с микрофона фрагменту музыкального произведения. Именно такая функция встроена в мобильное приложение Яндекс.Музыки:
В мире есть всего несколько специализированных компаний, которые профессионально занимаются распознаванием музыкальных треков. Насколько нам известно, из поисковых компаний Яндекс стал первым, кто стал помогать российскому пользователю в решении этой задачи. Несмотря на то, что нам предстоит ещё немало сделать, качество распознавания уже сопоставимо с лидерами в этой области. К тому же поиск музыки по аудиофрагменту не самая тривиальная и освещённая в Рунете тема; надеемся, что многим будет любопытно узнать подробности.
В мире есть всего несколько специализированных компаний, которые профессионально занимаются распознаванием музыкальных треков. Насколько нам известно, из поисковых компаний Яндекс стал первым, кто стал помогать российскому пользователю в решении этой задачи. Несмотря на то, что нам предстоит ещё немало сделать, качество распознавания уже сопоставимо с лидерами в этой области. К тому же поиск музыки по аудиофрагменту не самая тривиальная и освещённая в Рунете тема; надеемся, что многим будет любопытно узнать подробности.
+305
Использование async и await в C# — лучшие практики
8 мин
224KТуториал
Перевод
Ключевые слова async и await, введённые в C# 5.0, значительно упрощают асинхронное программирование. Они также скрывают за собой некоторые сложности, которые, если вы потеряете бдительность, могут добавить проблем в ваш код. Описанные ниже практики пригодятся вам, если вы создаёте асинхронный код для .NET приложений.
+59
WPF: Нестандартное окно
7 мин
160KНа днях, после долгого перерыва, надо было поработать на WPF, и возникло желание заменить поднадоевший стандартный вид окон Windows 7 на что-нибудь более вдохновляющее, скажем в стиле Visual Studio 2012:
+83
Немного об интерфейсах в .Net (по мотивам одного интервью)
8 мин
49KВ прошедний понедельник мне посчастливилось попасть на собеседование на Senior .Net Developer в одну международную компанию. Во время собеседования мне предложили пройти тест, где ряд вопросов был связан с .Net. В частности в одном из вопросов надо было дать оценку (истина/ложь) ряду утверждений, среди которых было и такое:
Быстро ответив на этот вопрос отрицательно и отдельно дописав на полях. что для foreach необходима реализация не IList, а IEnumerable, я перешел к следующему вопросу. Однако по дороге домой меня мучал вопрос: реализует ли массив все-таки этот интерфейс или нет?
Про IList я смутно помнил, что этот интерфейс дает мне IEnumerable, индексатор и свойство Count, содержащее число элементов коллекции, а также еще пару редко используемых свойств, типа IsFixedCollection(). Массив имеет свойство Length для своего размера, а Count в IEnumerable является методом расширения от LINQ, что было бы невозможно, если бы этот метод был реализован в классе. Таким образом, получалось, что массив не мог реализовывать интерфейс IList, однако какое-то смутное чувство не давало мне покоя. Поэтому вечером после интервью я решил провести небольшое исследование.
В .Net любой массив элементов, например int[], по умолчанию реализует IList, что позволяет использовать его в качестве коллекции в операторе foreach.
Быстро ответив на этот вопрос отрицательно и отдельно дописав на полях. что для foreach необходима реализация не IList, а IEnumerable, я перешел к следующему вопросу. Однако по дороге домой меня мучал вопрос: реализует ли массив все-таки этот интерфейс или нет?
Про IList я смутно помнил, что этот интерфейс дает мне IEnumerable, индексатор и свойство Count, содержащее число элементов коллекции, а также еще пару редко используемых свойств, типа IsFixedCollection(). Массив имеет свойство Length для своего размера, а Count в IEnumerable является методом расширения от LINQ, что было бы невозможно, если бы этот метод был реализован в классе. Таким образом, получалось, что массив не мог реализовывать интерфейс IList, однако какое-то смутное чувство не давало мне покоя. Поэтому вечером после интервью я решил провести небольшое исследование.
+46
Как преуспеть со своим мобильным приложением
16 мин
36KRecovery Mode
Перевод
Большинство приложений провальны. Эта жестокая реальность приводит многих разочарованных разработчиков к заключению, часто подсознательному, что преуспевание в App Store — всё равно, что разбогатеть на «золотой лихорадке»: нужно быть чертовски удачливым.
Идея «удачи» — опасное успокоительное средство, облегчающее боль неудачи. А боль — это хорошая вещь. Она показывает, что что-то идёт не так. Если моё приложение потерпело крах, я хочу знать почему. Вместо того, чтобы обвинять мироздание, почему бы не посмотреть, что ребята из tap tap tap и Tapbots делают для того, чтобы снова и снова достигать успеха.
Несмотря на то, что безупречное следование этой формуле невозможно, работа в этом направлении резко увеличит ваши шансы на успех. Эти принципы выработаны для iOS, но многие из них могут быть применены и для других платформ.
Идея «удачи» — опасное успокоительное средство, облегчающее боль неудачи. А боль — это хорошая вещь. Она показывает, что что-то идёт не так. Если моё приложение потерпело крах, я хочу знать почему. Вместо того, чтобы обвинять мироздание, почему бы не посмотреть, что ребята из tap tap tap и Tapbots делают для того, чтобы снова и снова достигать успеха.
Несмотря на то, что безупречное следование этой формуле невозможно, работа в этом направлении резко увеличит ваши шансы на успех. Эти принципы выработаны для iOS, но многие из них могут быть применены и для других платформ.
+43
WPF: 4 варианта кнопки с иконкой и текстом
12 мин
114KЯ думаю что каждый (или почти каждый), из тех, кто приходит в WPF из WinForms, поначалу испытывает растерянность по поводу функционала стандартных контролов.
Казалось бы – вот он — знакомый контрол.
Он очень похож на старого знакомого из WinForms. Даже сигнатура обычных методов либо полностью совпадает, либо претерпела незначительную трансформацию (ну, например, свойство Enabled получило приставку Is). Настроек у контролов много, от параметров визуализации рябит в глазах.
Но при чуть более тесном знакомстве и попытке натянуть привычные способы построения интерфейса на XAML и приходит та самая растерянность.
Как же так? Ну неужели у кнопки нет свойства Image? Вы ведь шутите, правда?
Казалось бы – вот он — знакомый контрол.
Он очень похож на старого знакомого из WinForms. Даже сигнатура обычных методов либо полностью совпадает, либо претерпела незначительную трансформацию (ну, например, свойство Enabled получило приставку Is). Настроек у контролов много, от параметров визуализации рябит в глазах.
Но при чуть более тесном знакомстве и попытке натянуть привычные способы построения интерфейса на XAML и приходит та самая растерянность.
Как же так? Ну неужели у кнопки нет свойства Image? Вы ведь шутите, правда?
+10
Упрощение регистрации и работы с DependencyProperty
4 мин
18KПри работе с WPF/Silverlight, периодически приходится создавать кастомные DependencyProperty, в основном при создании контролов. Стандартный подход объявления и работы с ними не идеальный и имеет минусы, о которых будет сказано ниже. Соответственно, появилась идея упростить запись регистрации и работы с DependencyProperty.
+23
Профилирование JavaScript с Chrome Developer Tools
7 мин
67KПеревод
Скорость сайта состоит из 2 частей: как быстро загружается страница и как быстро работает код в ней. Многие сервисы, такие как минификаторы или CDN, помогают ускорить загрузку, но скорость работы кода зависит только от вас.
Небольшие изменения в коде могут давать огромные изменения в производительности. Всего несколько строк могут означать разницу между быстрым сайтом и диалогом “Unresponsive Script”.
Небольшие изменения в коде могут давать огромные изменения в производительности. Всего несколько строк могут означать разницу между быстрым сайтом и диалогом “Unresponsive Script”.
+58
Duck typing или “так ли прост старина foreach?”
5 мин
20KЯ думаю, что многие разработчики знают, что цикл foreach в языке C# не так прост, каким он кажется на первый взгляд. Для начала давайте ответим на вопрос: «А что нужно, чтобы конструкция foreach успешно компилировалась?». Интуитивным ответом на этот вопрос кажется что-то типа: «Реализация классом интерфейса IEnumerable или IEnumerable<T>.». Однако, это не так, ну, или не совсем так.
Полный ответ на этот вопрос такой: «Для того чтобы конструкция foreach успешно компилировалась необходимо, чтобы у объекта был метод GetEnumerator(), который вернет объект с методом MoveNext() и свойством Current, а если такого метода нет, то тогда будем искать интерфейсы IEnumerable и IEnumerable<T>».
Причин у такого «утиного» поведения две.
Полный ответ на этот вопрос такой: «Для того чтобы конструкция foreach успешно компилировалась необходимо, чтобы у объекта был метод GetEnumerator(), который вернет объект с методом MoveNext() и свойством Current, а если такого метода нет, то тогда будем искать интерфейсы IEnumerable и IEnumerable<T>».
Причин у такого «утиного» поведения две.
+40
Обновления Live Tiles в фоновых агентах
7 мин
4.7KПо моему мнению, одной из сильных сторон Windows Phone является его дизайн. Точнее концепция дизайна, которую может использовать разработчик для получения максимума отдачи при разработке своих приложений.
Одна из ключевых концепций – Live Tiles или «живые тайлы» — «иконки приложений на стероидах». Правильное использование Live Tiles привязывает пользователя к приложению и даёт совсем другие ощущения при использовании. Например, когда я выбирал приложение для прогноза погоды, ключевым критерием для меня являлось то, чтобы приложение имело Live Tile и оперативно обновляло прогноз. В результате, после настройки приложения и закрепления Live Tile на стартовом экране, я практически больше это приложение не запускал, но при этом, сразу же после снятия лок-скрина вижу оперативную информацию о погоде.
Хороший пример, подумаете вы, но как нам сделать так?
+37
Карринг vs Частичное применение функции
7 мин
21KПеревод
Перевод статьи Джона Скита, известного гуру языка C#, автора книги C# In Depth, сотрудника Google, человека #1 по репутации на stackoverflow.com и наконец героя Jon Skeet Facts. В этой статье Джон доступно объясняет, что представляют из себя карринг и частичное применение функции, концепции, пришедшие из мира функционального программирования. Кроме того, он подробно поясняет в чём их различие. Признаюсь, что я и сам их путал до прочтения этой статьи, поэтому мне показалось полезным сделать перевод.
Это немного странный пост, и прежде чем читать его вам, пожалуй, следует отнести себя к одной из этих групп:
- Те, кто не интересуются функциональным программированием и находят функции высшего порядка запутанными: вы можете пропустить эту статью полностью.
- Те, кто знают всё о функциональном программировании и хорошо понимают разницу между каррингом (currying) и частичным применением функции (partial function application): пожалуйста, внимательно прочтите этот пост и отпишитесь в комментариях, если найдете неточности.
- Те, кто частично знаком с функциональным программированием, и заинтересован узнать больше: отнеситесь к этому посту скептически и внимательно прочтите комментарии. Прочитайте другие статьи более опытных разработчиков для получения дополнительной информации.
В общем-то, я знаю, что некоторые люди иногда путают термины карринг и частичное применение функции — используют их взаимозаменяемо, когда этого делать не следует. Это одна из тех тем (как, например, монады), которую я до некоторой степени понимаю, и я решил, что лучшим способом удостовериться в своих знаниях будет написать об этом. Если это сделает эту тему более доступной для других разработчиков, тем лучше.
+93
Информация
- В рейтинге
- Не участвует
- Откуда
- Amsterdam, Noord-Holland, Нидерланды
- Дата рождения
- Зарегистрирован
- Активность