Ctrl +  Позднее

Мелодии «Монтаны»

29 октября 2012, 17:52

Помните, да?

У меня, к сожалению, модели с 16 мелодиями не было, зато была с 7. Я не знал, что там за музыка была, но она мне жутко нравилась. Даже больше, чем в модели часов с такими мелодиями, как Twinkle Twinkle Little Star.

Вот недавно моему взору они и попались. И нагрянуло. Сходу узнал только Дикси. Остальное было только на слуху.

Немного погуглив, понял, что нужно искать в районе американской патриотической музыки времен Гражданской войны. Вот так и нашёл.

Первый трек идёт из часов, второй — оригинал.

Итак:


To Arms In Dixie

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


Montana Original — To Arms In Dixie


American Civil War Music (Confederacy) — To arms, in Dixie!


The Stars And Stripes Forever

Национальный марш США. Версия Андре Рьё мне понравилась больше, чем официальная оркестра морской пехоты США.


Montana Original — The Stars And Stripes Forever


Andre Rieu — The Stars And Stripes Forever


American Patrol

Марш, написанный Фрэнком Мичемом в 1885. Наиболее популярная версия исполнена оркестром Гленна Миллера.


Montana Original — American Patrol


BBC Big Band Orchestra — American Patrol


Anchors Aweigh

Боевая песня Военно-морского флота США. Написана в 1906 году Чарльзом Зиммерманом.
К эпичному танцу из Тома и Джерри вроде отношения не имеет, хотя называется так же, да и Джин Келли в роли морячка.


Montana Original — Anchors Aweigh


John Philip Sousa — Anchors Aweigh


When The Saints Go Marching In

Госпельная песня, которая со временем стала стандартом джаза. Какой была самая первая версия, наверное никто уже никогда и не узнает, поэтому эталоном исполнения считается, наверное, Луис Армстронг.


Montana Original — When The Saints Go Marching In


Louis Armstrong — When The Saints Go Marching In


The Yellow Rose Texas

Традиционный фолк, датированный 1858 годом. Ассоциируется с войной за независимость Техаса.


Montana Original — The Yellow Rose Texas


Mitch Miller — The Yellow Rose Texas


She Wore a Yellow Ribbon

Тоже песня времен Гражданской Войны. Каноничным является исполнение Митча Миллера.


Montana Original — She Wore a Yellow Ribbon


Mitch Miller — She Wore a Yellow Ribbon



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

Всем «Радио „Анклав“», посоны.

Доминирующие цвета

25 октября 2012, 14:24

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

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

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

Для симметрии бирки слева раскрашивались в пару доминирующих цветов изображения справа (по версии дизайнера они всегда должны были быть розовыми).

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

Ну а дальше верстка, наложение полупрозрачных масок и результат.

Это всё к чему? Технолог — тоже дизайнер.

Нафаршировал

21 сентября 2012, 18:55

Снёс всё-таки привод и родной маковский хард. Заказал оптибэй, ссд и новенький хард.

И это на 13". Аккумулятор не сильно просел от такой прожорливости. Часов 5 сублима с терминалом вытягивает. Ну не прелесть ли?

PySubler

19 сентября 2012, 1:52

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

Для OS X есть замечательная программа — Subler, которая позволяет проводить махинации с тегами в mp4 видео-файлах. Ну и внезапно её разработчики оказались людьми добрыми, поэтому выкатили консольную версию SublerCLI, которая умеет делать достаточно интересные вещи.

Тут то мы и подходим к основной сути — каждый раз вызывать консольную утилиту неудобно, путаница в параметрах, особенно если заранее не знаешь, что вообще там будет. Да и код некрасив. Всё это баловство вылилось в библиотеку pySubler.

Допустим, у нас есть фильм mkv и нужно его подготовить для iTunes. Да нет проблем!

from pySubler import Subler

obj = Subler()
obj.Source("inception.mkv")
obj.Dest("inception.m4v")
obj.AddArtwork("~/Images/inception.jpg")
obj.Name = "Начало"
obj.Artist = "Кристофер Нолан"
obj.Save()

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

Список полей, которые можно поменять огромен: начиная от списка актёров, заканчивая телесетью, которая осуществляла вещание (если речь идёт об сериалах). Для удобства были добавлены классы-перечисления, чтобы выпадайки немного помогали.

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

def Complete(data):
    print "Я всё!"

s = Subler()
s.onFinish += Complete
s.Save(acync=True)

В данном случае конвертация запустится асинхронно, код продолжит выполняться после s.Save(acync=True). Как только конвертация закончится, сработает событие onFinish и в функцию Complete придут stdout и stderr сублера. Такие дела.

Устанавливается это чудо просто:

git clone git://github.com/gleero/Subler.git
cd Subler
python setup.py install

Ну и код, конечно же, на гитхабе: https://github.com/gleero/pySubler

Артикли

24 июня 2012, 3:22

Английские артикли «The» и «A» должны игнорироваться при сортировке и поиске в любых списках. К сожалению, не все этого понимают.

Увидел я, к примеру, кафе «Lounge» и хочу почитать отзывы о нём на городском портале. Поиска нет, зато есть выборка по алфавиту. Но по букве «L» ничего нет! Почему? Потому что кафе, оказывается, называлось «The Lounge» (а на вывеске «The» где-то затерялось), соответственно, искать нужно было на «T».

Получаем дизайнеров-идиотов, которые при проектировании сайта не предусмотрели таких вещей.
Если я ищу Beatles в списке всех исполнителей, я ожидаю их увидеть в начале, на букве «B», но никак не на букве «T».

Не знаю как на Андроиде, но Эппл это всё предусмотрели, что не может не радовать:

Итак!
В списках все значения, в начале которых имеются артикли «The» или «A», должны быть отсортированы так, будто этого артикля у них нет.
В поиске артикли также должны опускаться. Если я введу «The Aerosmith», в результатах должны быть Аэросмит, не смотря на то, что артикля в названии у них нет.

Тэгбота кстати этому я тоже обучил. Для него песни «The Animals — The House of the Rising Sun» и «Animals — House of the Rising Sun» являются одним и тем же, поэтому и рейтинг, и количество воспроизведений для них будут считаться как на одну песню.

Сказ о том, как тегбот ищет музыку

18 июня 2012, 20:33

Вот и закончился самый сложный и долгий этап работы над ботом — это очень важная веха в работе над лампачём. И в связи с этим я хочу рассказать некоторые аспекты работы бота.

Главная задача, которая была успешно решена — это, конечно, разнообразие музыки. Раньше, основным источником новых песен для бота являлся last.fm. Там очень много музыки, а также понятный и простой АПИ. Казалось, всё должно быть отлично, но, как обычно, действительность не соответствовала надеждам. Разнообразные методы поиска похожих треков, поиск по жанрам, исполнителям — всё это работало с популярной музыкой. Чтобы найти более редкие, нетрендовые треки, приходилось, соответственно, делать поиск похожего по другим редким и нетрендовым трекам. А получить список наименее релевантных песен по жанру оказалось вообще трудной задачей. Поэтому, чтобы разбавить музыку, приходилось что-то дополнительно выискивать. Что приводит нас к следующей задаче —

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

Напрашивается резонный вопрос: «Где брать всё это?». Ведь чтобы собрать хорошую коллекцию музыки, без человека не обойтись. Всё гениальное, как оказалось, просто! В интернете есть огромная куча хороших тематических радиостанций, на которых хорошо натренированные люди, непосредственно разбирающиеся в конкретном жанре, собирают отличные плейлисты.

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

Итак, FmCheckerd — демон, который раз в минуту опрашивает 57 радиостанций на играющие там треки. Все радиостанции аккуратно разделены по жанрам, поэтому треки лежат не кучей, а в соответствующих жанру виртуальных плейлистах. Плейлисты представляют собой sqlite3 базу данных, в которой удобно убивать дубликаты, а также методом стека держать строго определённое число записей.

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

Перед попаданием в основной плейлист, песня всё же проходит фильтрацию. Она попадает в эфир, если её устоявшийся рейтинг более 25%, подходит по тематике, и соответствует нескольким внутренним фильтрам (ОЛОЛОЦЕНЗУРА). Если песня попадает в эфир впервые, то она регистрируется в общей БД. С тех пор песня становится неотъемлемой частью радио, так как для неё ведётся подробная статистика. Пример: во время плавного перехода с одного жанра на другой, песни следующего жанра могут заминусовать, если после классики внезапно начнёт играть митол. Всё это будет учитываться для построения расписания эфирной сетки (да-да, тоже будет).

До пробного запуска вещания осталось совсем немного времени.

Уведомления в сафари

15 июня 2012, 15:04

В 10.8 сафари научился слать сообщения в новый центр уведомлений. Игрушку Эпл дали также веб-разработчикам, продвинув в w3c новый стандарт Web Notifications.
Пример самого простого сообщения, которое можно отправить в центр уведомлений:

var dn = new Notification("Вечер в хату, посоны", { body: "Лампач скоро заработает!" });
dn.show();

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

Комфортный свет в комнате

23 мая 2012, 11:18

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

Поэтому было решено провести небольшую модернизацию света в своей комнате.

Первоначальная идея состояла в том, чтобы поместить несколько источников света по углам комнаты и прикрыть снизу какими-нибудь деревяшками, чтобы свет из четырех углов шел в середину комнаты и таким образом её освещал. Но пришлось отказаться от неё по некоторым причинам.

Очередной подход к снаряду — прикрепить к центру потолка лист фанеры и засунуть между ними лампы. Более удачная идея, осталось подумать над реализацией.

Первое, что приходит в голову — металлопрофиль.

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

Тут внезапно подсказывают идею, что можно всё делать и на гибком креплении. Цепи! То, что нужно!
Все проблемы вроде как проясняются, можно действовать.

Итак, краткий гайд по установке:

Покупаем, собственно, лист фанеры. Я купил 1.5х1.5 метра, толщину желательно побольше, а то лист может просесть из-за гибкости. 10мм хватит за глаза. После покупки лист лучше положить горизонтально на пол, чтобы он выпрямился.

Лист можно покрасить, но я купил обычную черную самоклеющуюся пленку.

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

И в собранном виде:

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

Теперь можно подготовить потолок. Цепь нужно разделить на 5 кусков по 4-5 звеньев. Крепить их лучше всего с помощью небольших крюков, которые с помощью анкеров загоняются в потолок.

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

Далее крепятся лампы:

Провода с лампы подрезаются и прикручиваются к тем, что выходят к потолку от переключателя. В моём случае получилось 2 выключателя, каждый включает по две лампы на параллельных сторонах.

Ну и всё, осталось только повесить:

Вот как выглядит снизу:

Вцелом дешево и сердито. Примерный прайс:
Лист фанеры — 12$
4 люминесцентные лампы — 52$
Черная самоклеющаяся пленка — 10$
Цепи, кольца, крюки — мне досталось бесплатно, но я не думаю, что дороже 5-10$

Новые боты

20 мая 2012, 21:18

Так уж сложилось, что пришло время нового тагбота.

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

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

Площадкой вещания являлся сервис moeradio.ru, который перестал нормально справляться со своей работой: вещание вечно рвалось, были подлагивания и прочие недуги. Начался переезд на новый временный домен, был арендован хостинг, на котором был поднят Айскаст (нормальный ретранслятор). Кстати, занимательный факт: айскаст был дополнен небольшим хаком и перекомпилирован, а бот отправлял теги через модифицированный заголовок. Благодаря этому ретранслятор на лету переводил теги в нужную конечному клиенту кодировку. Многие популярные плееры получали кодировку в utf-8, а некоторые упоротые (вроде WMP) получали cp-1251. Из-за всего этого русские буквы в тегах всегда были русскими, а не кракозябрами, как в большинстве интернет-радиостанций. Вот так-то.

После переезда появился сайт, на который бот тотчас же научился отправлять разнообразные данные о треках.

Через некоторое время появилось голосование, чатик, эфиры с диджеем.

Боту пришлось следовать новым трендам и учиться проводить тематические эфиры. Код, неподверженный расширению обрастал костылями, в которых копаться было всё труднее и труднее. Багов становилось всё больше, желания копаться в этом — всё меньше.

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

Были оставлены только самые важные наработки, а все внутренности радио ушли на свалку истории.

Учитывая весь имеющийся опыт и возможные развития событий, я делаю нового бота. Бота, которого можно оставить хоть на год автономной работы, и он не подведет. Бота, основная задача которого — саморазвитие. Бота, который лучше будет понимать свою аудиторию. Бота, который, что уж там, охуенен!

К данному моменту готово ядро, скрипты анализа и обучения. Новому боту вместо виртуалбокса с виндовс 2003 будет достаточно ноды на ОпенВЗ с лайтовым дебианом, так как бэкенд нового бота полностью написан на Питоне с вкраплениями С++.

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

Некоторые подробности работы буду публиковать тут, так что стей тюнед.

Что играет на радио?

30 апреля 2012, 22:39

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

Итак, вкратце.
Существует два гиганта интернет-радиовещания: Shoutcast и Icecast. Я предпочитаю второй по многим субъективным причинам, но нужно решение универсальное. Различий в протоколе у них нет, разве что шоуткасту нужно насильно сказать, что я хочу получать от него теги помимо мп3-потока.

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

При хттп-запросе потока нужно дополнительно указать заголовок «Icy-MetaData:1» и юзер-агент какого-нибудь плеера. Некоторые серверы, получая юзер-агент браузера, выдают статусную страничку с количеством слушателей, битрейтом, и прочими ненужными в данный момент. А нам нужен именно поток. После того, как получили правильный контент, осталось считать заголовки ответа и найти среди них «icy-metaint».

Тут первая странность протокола — теги отдаются не сразу. Обычно нужно скачать секунду потока, а там уже лежит заветное название трека. Тут то и пригодится заголовок «icy-metaint», который хранит смещение в байтах, через которое прервется поток и пойдут мета-данные. Пропускаем mp3 данные, читаем один байт и умножаем его значение на 16. Столько байтов будет размер самих данных. Считываем их и радуемся — у нас есть теги.

Алсо, после нескольких тестов на разных радиостанциях заметил интересную особенность: ICY заголовки могут в http идти как обычными заголовками, так и обычным текстом. Пришлось учесть.

В скрипт осталось добавить поддержку локейшен-редиректов и все точно будут счастливы.

Скачать готовый скрипт на питоне.

Ctrl +  Ранее