Как сканировать QR-код на Андроиде – обзор приложений для считывания QR-кодов. Сканирование QR-кода на Android-девайсах

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

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

Как происходит сканирование QR-кода на Андроиде

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

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

Как видите, QR-код представляет собой набор двоичных данных, так что прочитать его можно даже не имея телефона, главное знать алгоритм, по которому построен код. Этих самых алгоритмов существует несколько и большинство из них заложены в популярные приложения для сканирования QR-кодов на Андроид.

Лучшие приложения для считывания QR-кодов

Хоть мы и употребили слово «лучшие», в действительности, наши предпочтения являются весьма субъективными по той причине, что всем не угодишь, и программа, приглянувшаяся одному пользователю, другому может показаться никуда не годной.

Итак, как отсканировать QR-код на Андроид? Начнем с того, что некоторые производители мобильных устройств встраивают в приложение «Камера» функцию сканирование QR-кодов. Включите вашу камеру, зайдите в настройки и посмотрите, есть ли в списке режимов съемки «Сканер» (ярлык будет иметь характерный вид). Если да, чудесно, тапните по нему и наведите камеру на QR-код. Встроенный модуль тут же прочитает данные и выведет их на дисплей. Элементарно, как дважды два.

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

Популярное приложение для расшифровки кодов QR. Считается наиболее безопасным, поскольку кроме камеры не требует доступ к прочим компонентам, функциям и данным устройства. Приложение имеет удобный интерфейс, читает коды товаров, SMS и Email-сообщений, телефонной книги, геодатчиков, ссылок, отличается хорошей скоростью считывания, поддерживает ведение истории сканирования, в нём имеются автофокус и функция подсветки, активирующаяся при сканировании в плохих условиях видимости.

Дополнительно поддерживается расшифровка линейных штрих-кодов, массовое сканирование. Принцип работы приложения прост – запустили, навели камеру на сканируемый объект, получили расшифрованные данные.

Добротный сканер QR-кодов для Андроид, отличающийся продвинутым функционалом. Приложением поддерживается сканирование разных типов кодов с камеры, открытых в галерее или браузере изображений, ведение истории, создание QR-кодов и обмен ими, создание XQR-кодов для объемных QR-кодов, использование фонарика и вспышки в условиях плохого освещения. Из дополнительных возможностей следует отметить автооткрытие веб-страниц при получении ссылки, сохранение штрих-кодов, использование виджетов. Принцип работы приложения тот же, что и у Молния QR-сканер.

Весьма неплохая программа, позволяющая быстро и качественно сканировать QR-код на телефоне. QR Code Reader работает с большинством типов QR и штрих-кодов, умеет читать ISBN, тексты, URL-адреса, данные календаря, адресной книги контактов, SMS, сведения о местоположении, не нуждается в подключении к интернету. Приложение может похвастать приятным и удобным пользовательским интерфейсом в духе минимализма. Из дополнительных функций можно отметить ведение истории сканирований, использование фонарика в условиях плохой видимости.

Неплохое приложение от разработчика TeaCapps, позволяет сканировать штрих- и QR-коды на Андроид, отличается простотой, удобством и неплохим функционалом. Работает программа со всеми распространенными форматами кодов, включая Data Matrix, Aztec, UPC, EAN и Code 39, поддерживает чтение данных доступа к беспроводным сетям, сведения о местоположении, URL, контакты, события календаря, E-mail, SMS и MATMSG, данные MeCard, .

Среди функций приложения – создание и обмен QR-кодами, автоматическое выполнение релевантных действий, например, переход по ссылке, работа с изображениями без использования камеры, ведение истории и ее экспорт в лог CSV, защита от вредоносных ссылок, масштабирование и использование фонарика для подсветки.

Завершает наш список приложение «QR код - сканер штрих кодов» от разработчика Best App – Top Droid Team. Примечательна эта программа прежде всего высокой скоростью считывания – коды в ней расшифровываются практически мгновенно, стоит только навести камеру. Инструмент работает с большинством типов данных, содержит встроенный генератор QR-кодов, поддерживает обмен и совместное использование кодов, выполнение релевантных действий при получении соответствующего содержимого, сохранение истории сканирований и поиск по ней. Для сканирования и распознания QR и штрих-кода подключения к интернету программа не требует.

Заключение

Ну вот мы и разобрались с тем, как считать QR-код на Android. Как видите, ничего сложного, распознание выполняется в автоматическом режиме, достаточно просто запустить программу-сканер и навести на код камеру. Но если все эти программы так хороши, откуда берутся негативные к ним отзывы в Google Play? Причина проста, как везде и во всём, есть в работе с QR-кодами свои нюансы. Код может не распознаться, если имеет низкое качество, если чтение выполняется в условиях слабого освещения, если пользователь неправильно держит камеру и тому подобное. А еще проблемы могут возникнуть с QR-кодами с высоким уровнем коррекции и, вообще, содержащими относительно большой объем информации, впрочем, последние встречаются не так уже часто.

Перед тем как сканировать QR код на гаджете с Андроидом, нужно скачать соответствующее приложение. Программ для распознавания этого двумерного шифра на Play Market очень много. Какую же из них выбрать?

Приложения для распознавания

Data-lazy-type="image" data-src="http://androidkak.ru/wp-content/uploads/2017/07/sponsor-opportunities1.jpg" alt="сканирование" width="300" height="200"> Среди разнообразия софта для чтения QR-кода выгодно выделяются следующие 5 программ:

  1. QR Droid . После открытия приложения можно сразу начать считывание шифра. При наличии в нем url-адреса автоматически откроется встроенный браузер. Предусмотрено отключение этой функции в настройках приложения. С помощью QR Droid можно не только расшифровать коды, но и создать собственные. Для этого нужно выбрать соответствующий пункт в меню приложения.
  2. BIDI . Эта программа для считывания QR-кодов удобна для Андроида и похожа на предыдущую. Здесь есть функция размещения созданного сервисом шифра на визитной карточке, шаблон которой доступен в меню.
  3. QR Code Reader . Лаконичное приложение с историей расшифровки и кнопкой вспышки. Распознает информацию через камеру или отсканирует готовое изображение из галереи. Сервис может как считывать QR, так и создавать.
  4. Neo Reader . Эту программу используют не только для распознавания QR, но и для расшифровки штрих-кодов. Если приложению не удалось просканировать информацию, можно самостоятельно ввести цифры, написанные под шифром. Есть опция привязки к местоположению и регулировка уровня звука. Распознавание QR этим сервисом происходит очень быстро. Собственные коды с помощью Neo Reader создать нельзя, но в качестве альтернативы приложение предлагает пользователю линк на соответствующий ресурс.
  5. QR Reader . Программа с оригинальным интерфейсом. Сканером удобнее пользоваться в горизонтальном режиме. Функция работает так же, как и у предыдущих программ: после запуска приложения нужно поднести мобильное устройство к матричному изображению и дождаться расшифровки. Есть история распознанных шифров, закладки и возможность создавать собственные коды.

Применение шифров

Data-lazy-type="image" data-src="http://androidkak.ru/wp-content/uploads/2015/08/vnimanie-150x150.jpg" alt="Внимание!" width="50" height="50"> QR отличается от штрих-кода большей областью применения. Его используют во многих сферах - от рекламы до развлечений. Таким видом кодирования можно зашифровать url-адреса сайтов, информацию о произведении искусства (картине, скульптуре) или линк на свою страницу в социальной сети. Но для чего это нужно, и как пользоваться QR кодом?

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

QR-код или Quick Response («быстрый отклик»), по сути, является такой же базой данных, только вместо уже знакомых полосок используются квадратики. Специальное приложение позволяет зашифровать в двумерные черно-белые «шашечки» информацию разного рода: номер телефона или электронной почты, просто текст для ознакомления, координаты, например, достопримечательности или навигации. Чаще всего кодируется в QR-код URL-адрес, т.е. ссылка на организацию или страничку в интернете. Практикуется использование штрих-кода в целях достижения максимального комфорта и универсальности в применении. Ведь куда проще в один клик расшифровать подобную картинку, чем скрупулёзно вбивать символы в строку поиска.

То же самое касается и банального маркетинга. Размещать информацию о проведении какой-нибудь акции на упаковке не всегда уместно, самое важное может просто не поместиться или вовсе испортить весь внешний вид товара. Куда выгоднее и практичнее пристроить специальный QR-код с полным перечнем правил и прочего. Да и просто он выглядит солидно и современно.

История штрих-кода

Новшество в лице QR-кода предложила компания Denso-Wave ещё в середине 90-ых. Размер вмещаемой информации, конечно же, не безграничен. В стандартный QR-код может уместиться чуть более 4 тыс. символов латиницы или 7 тыс. чисел десятичной системы счисления. Больше всего штрих-коды распространены в странах Азии и на своей родине, в Японии. Активно применяются QR-коды в музеях, справочниках, рекламных буклетах и прочих сферах, связанных с туризмом (не обошли стороной даже кладбища).

Для сканирования штрих-кодов обычно используются программы. Они не сложны в освоении и требуют немного памяти. В iPhone используется утилита Scan, подходящая как для сканирования обычных штрих-кодов, так и для создания новых. Вторым вариантом является Bakodo, работающая по сравнению с предыдущим более ускоренно. Единственное, программа не поддерживает русский язык, что оговаривается доступным и понятным интерфейсом.

В случае с платформой Android всё иначе, её библиотека приложений для сканирования QR-кода куда богаче и доступнее. Приложение Quick Mark способно различать штрих-коды нескольких форматов и имеет историю распознавания. Выявленные ссылки автоматически открываются при помощи браузера. Но так как это программа для Android, то в бесплатной версии высока вероятность подхватить кучу захламляющей рекламы. Некоторые смартфоны и вовсе отказываются работать с этим приложением для сканирования QR-кодов. Покупка полной версии во многих случаях решает эту проблему.

Другой вариант называется Barcode Scanner. Его предназначение – сканирование «продуктовых» штрих-кодов, выяснение их цены и сводка отзывов о товаре. Принцип использования ничем не отличается от остальных – поместить изображение в фокус, после чего вся информация выведется на экран. Преимущество в том, что софт бесплатный и никакой рекламы внутри себя не имеет. Существуют и другие представители для работы с QR-кодом, их действительно очень много.

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

Допустим, есть необходимость создать собственный QR-код. Осуществить задумку можно при помощи, опять-таки, смартфона, компьютера или же специального сайта. Например, qrcoder.ru или decodeit.ru . Исходный текст для создания штрих-кода необходимо вставить в поле (или ссылку на него) и нажать кнопку «Создать Код». На некоторых сайтах и вовсе используется комбинация клавиш ctrl+enter. А дальше всплываемые подсказки сами подскажут, что делать. В частности в интернете практикуется создание анимированных QR-кодов, которые могут разворачиваться на несколько градусов. Правда, такой приём может привнести некоторые осложнения в дальнейшее распознавание.

Созданием штрих-кодов на смартфоне помогает заниматься специализированный генератор. Никакой рекламы, никакой платы, всё на русском, доступно, понятно и никаких ограничений. Google Play или AppStore полны различных приложений, остаётся только выбрать подходящее. Продолжая тему вариантов для создания штрих-кодов можно упомянуть и QR Code Reader. Его изюминка в высокой скорости обработки изображений, которые могут быть ещё и видоизменёнными или вовсе уменьшенными. Обладателям ранних версий Windows Phone повезло ещё больше. Им достаточно запустить Bing браузер и активировать кнопку «с глазом», после чего процесс сканирования QR-кода запустится сам собой. Он не такой быстрый и качественный, как предыдущий, но для раза-другого в случае чего сгодится.

Заключение

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

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

Сканировать QR-коды на смартфонах с Android проще чем делать фото. Все что нужно это:

  • Смартфон или планшет с камерой;
  • Интернет.

Я объясню все максимально просто и проведу практическое занятие. Прямо здесь не отходя от статьи. По такой же инструкции можно сканировать и штрих-коды.

“Интерфейс моего смартфона может отличаться от вашего из-за другой темы и версии Android. Отличия не влияют на процесс установки и использования сканера QR-кода”

Для начала нужен сканер QR кодов. Я нашел самый простой. На нем меньше назойливой рекламы и он сканирует - то, что нужно. Установить его - очень просто. Использовать - еще проще.

  1. Для начала заходим в Google Play Market. И пишем в подчеркнутой красным строке: “qr code scanner”, а лучше “smart qr scanner and generator”. Нажимаем на иконку поиска или просто выпавшее предложение, которое нам подходит.


Кроме того у нас вы можете скачать другое отличное приложение для сканирования –

Как сканировать код с сохраненной картинки?

Распознать QR-код с картинки можно и в сети интернет с помощью специальных веб-сайтов. Я выбрал qrrd.ru, потому что это единственный сайт, который у меня загрузился менее чем за 10 секунд и имел более-менее приятный глазу интерфейс.

Как им пользоваться? Сначала заходим на сайт: qrrd.ru или сразу на qrrd.ru/read. Видим следующее:

Зеленым обведено меню сайта, в котором указано все, чем он может вам помочь. В нашем случае выбираем “Распознать QR код”.

Открывается следующая страница с большой кнопкой “+Выберите файлы”. На нее и нажимаем. После этого, снизу появляются варианты как “выбрать файлы”. Тут вы можете или сразу сделать фотографию и отправить. Или же нажать на документы и выбрать фотографию, которая уже есть на телефоне. Я пошел по последнему пути.

Здесь я выбрал вкладку с картинками, нажал на папку где хранятся картинки на моем телефоне и нажал на изображение с QR-кодом, то самое которое уже раньше было здесь в статье.

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

Готово!.

Зачем мне вообще сканировать QR-коды?

В них может находиться полезная информация. Вероятность этого низка, но она может там быть. К тому же, QR-коды часто используются в музеях, чтобы не ставить огромные таблички с кучей информации, а просто использоваться небольшой QR-код и дать каждому возможность отойти в сторону и почитать о экспонате в своем телефоне. Все просто и удобно. Именно для этого компания Denso Wave их и изобрела.

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


Иногда возникают такие ситуации, когда нужно прочитать QR код, а смартфона под рукой нет. Что же делать? В голову приходит лишь попробовать прочитать вручную. Если кто-нибудь сталкивался с такими ситуациями или кому просто интересно как же читается QR код машинами, то данная статья поможет вам разобраться в этой проблеме. В статье рассмотрены базовые особенности QR кодов и методика дешифрирования информации без использования вычислительных машин. Решение задачи непосредственного чтения информации с QR-картинки рассмотрим на примере двух кодов.
Чтобы понять, как извлечь данные из кода, нужно разобраться в алгоритме. Существует несколько стандартов в семействе QR кодов, с их базовыми принципами можно ознакомиться в спецификациях. Кратко поясню: данные, которые необходимо закодировать, разбиваются на блоки в зависимости от режима кодирования. К разбитым по блокам данным прибавляется заголовок, указывающий режим и количество блоков. Существуют и такие режимы, в которых используется более сложная структура размещения информации. Данные режимы рассматривать не будем, в виду того, что извлекать вручную из них информацию нецелесообразно. Однако, основываясь на тех принципах, что описаны ниже, можно адаптироваться и к этим режимам. На случай некорректного чтения данных в QR применяются специальные коды, которые способны исправить недочёты при чтении. Это так называемые коды Рида-Соломона . Принцип вычисления кодов, а также исправление ошибок в блоках информации рассматривать не будем, это тема отдельной статьи. Корректирующие ошибки коды Рида-Соломона (RS) записываются после всех информационных данных. Это очень упрощает задачу непосредственного чтения информации: можно просто считать данные, не трогая коды. Как показывает практика, обычно бОльшую часть QR -матрицы занимают корректирующие RS-коды.

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

Шаг 0. QR код


Взглянув на картинки, можно заметить несколько отчётливых областей. Эти области используются для детектирования QR кода. Эти данные не представляют интереса с точки зрения записанной информации, но их нужно вычеркнуть или просто запомнить их расположение, чтобы они не мешали. Всё остальное поле кода несёт уже полезную информацию. Её можно разбить на две части: системная информация и данные. Также существует информация о версии кода. От версии кода зависит максимальный объём данных, которые могут быть записаны в код. При повышении версии – добавляются специальные блоки, например как здесь: По ним можно сориентироваться и понять какая версия QR перед вами. Коды высоких версий обычно также нецелесообразно считывать вручную. Размещение системной информации показано на рисунке:
Системная информация дублируется, что позволяет значительно понизить вероятность возникновения ошибок при детектировании кода и считывании. Системная информация – это 15 бит данных, среди которых первые 5 - это полезная информация, а остальные 10 – это BCH (15,5) код, который позволяет исправлять ошибки в системных данных. К классу BCH кодов относят и RS коды. Обратите внимание, что на рисунке две полоски по 15 бит не пересекаются.

Шаг 1. Чтение 5 бит системной информации

Как уже говорилось, интерес представляют только первые 5 бит. Из которых 2 бита показывают уровень коррекции ошибок, а остальные 3 бита показывают какая маска из доступных 8 применяется к данным. В рассматриваемых QR кодах системная информация содержит:

Шаг 2. Маска для системной информации

Кроме уже озвученных схем зашиты системной информации, в добавок, используется статическая маска, которая применяется к любой системной информации. Она имеет вид: 101010000010010 . Так как имеет интерес только первые 5 бит, то маску можно сократить и легко запомнить: 10101 (десять-сто один). После применения операции «исключающего или» (xor) получаем информацию. Возможные уровни коррекции ошибок:
L 01
M 00
Q 11
H 10
Возможные маски:
000 (i + j) mod 2 = 0
001 i mod 2 = 0
010 j mod 3 = 0
011 (i + j) mod 3 = 0
100 ((i div 2) + (j div 3)) mod 2 = 0
101 (i j) mod 2 + (i j) mod 3 = 0
110 ((i j) mod 2 + (i j) mod 3) mod 2 = 0
111 ((i+j) mod 2 + (i j) mod 3) mod 2 = 0

Шаг 3. Чтение заголовка данных

Чтобы понять с какими данными предстоит иметь дело, необходимо изначально прочитать 4-х битный заголовок, который содержит в себе информацию о режиме. Специфика чтения данных изображена на картинке:
Список возможных режимов:

Шаг 4. Применение маски к заголовку

После извлечения 4-х бит, описывающих режим, необходимо к ним применить маску.
В нашем случае для двух кодов используются разные маски. Маска определяется выражением, приведённым в таблице выше. Если данное выражение сводится к TRUE (верное) для бита с координатами (i,j) , то бит инвертируется, иначе всё остаётся без изменений. Начало координат в левом верхнем углу (0,0) . Взглянув на выражения, можно заметить в них закономерности. Для рассматриваемых QR кодов, маски будут выглядеть так: Получим режимы:

Шаг 5. Чтение данных

После получения данных о режиме можно приступать к чтению информации. Надо оговорить, что наиболее интересно считывать числовые и буквенно-числовые данные, так как они легко интерпретируются. Но также не стоит бояться 8-битных. Это может быть также легко интерпретируемая информация. Например, многие онлайн генераторы QR текст кодируют в этом режиме, используя . Ещё одна причина, почему следует изначально прочитать режим это то, что от него зависит количество пакетов данных. Которая также зависит и от версии кода. Для версий с первой по девятую длины блоков для более читабельных режимов: Первый блок после указателя режима – это количество символов. Для числового режима количество закодировано в 10 следующих битах, а для 8-битного режима в 8 битах (прошу прощения за тавтологию).
На рисунке видно, что в левом QR коде, как и отмечалось, записана цифра 5. Это видно по указателю количества символов и последующим после него 4 битам. В числовом режиме наряду с 10-битными блоками используются 4-х битные блоки для экономии места, если в 10-битном объёме нет необходимости. В правом коде, зашифровано 4 символа. На данный момент неизвестно, что зашифровано в нём. Поэтому необходимо перейти к чтению следующего столбца для извлечения всех 4-х блок информации.
На рисунке видно, все 4 пакета представляют собой коды ASCII латинских букв, образующие слово «habr» Естественно наилучшим способом остаётся достать телефон из кармана и, наведя камеру на QR-картинку, считать всю информацию. Однако в экстренных случаях может пригодиться и описанная методика. Конечно, в голове не удержишь все указатели режимов и типов масок, а также ASCII символы, но популярные комбинации запомнить (хотя бы те, что рассмотрены в статье) под силу.

Спецификация:

BS ISO/IEC 18004:2006. Information technology. Automatic identification and data capture techniques. QR Code 2005 bar code symbology specification. London: BSI. 2007. p. 126. ISBN 978-0-580-67368-9. P.S. Соблюдайте правила ресурса и условия Creative Commons Attribution 3.0 Unported (CC BY 3.0)