Пользуетесь ли вы кнопкой «стоп» в музыкальном проигрывателе?

В последние несколько лет появилась тенденция убирать кнопку «стоп» из интерфейса музыкальных проигрывателей. Например, такой кнопки нет в Ubuntu (Rhythmbox), в Mac OS X (iTunes), в Android, в iOS.

Так, в случае с Rhythmbox, если у вас нет кнопки «стоп» на мультимедийной клавиатуре (в этом случае «стоп» всё-таки работает — хотя в интерфейсе нет ни кнопки, ни пункта в меню), чтобы добиться эффекта, который был бы от кнопки «стоп», нужно поставить музыку «на паузу», и затем закрыть Rhythmbox. Либо выбрать последнюю композицию и промотать её до конца.

Иначе при нажатии на «плэй» воспроизведение начнётся с того же места (что вполне логично для кнопки «пауза»), что далеко не всегда уместно (особенно для музыки). Либо придётся вместо «плэй» нажимать на кнопку для воспроизведения предыдущей композиции (для того, чтобы начать воспроизведение текущей композиции сначала).

Лично вам нравится такое решение? Вы согласны с тем, что кнопка «стоп» — лишняя? Или всё-таки не стоило её везде убирать?

Пользуетесь ли вы кнопкой «стоп» в музыкальном проигрывателе?

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

Проголосовало 10 человек. Воздержался 1 человек.

ссылка на оригинал статьи http://habrahabr.ru/post/181674/

Где разработчики настолько суровы, что в хакатоне побеждает проект весом в 100 кг?

На днях в наших питерском и мюнхенском офисах прошел первый для JetBrains хакатон. Десятки команд внутри компании отложили обычную работу, чтобы на 48 часов сосредоточиться на создании собственного продукта. Такой формат кодинга нон-стоп набрал популярность давно, но в JetBrains хакатоны раньше не проводились. Первый опыт вышел удачным, и мы решили им поделиться: вдруг и в других компаниях хакатоны помогут ребятам сменить контекст и реализовать давние идеи.

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



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

Кстати, следует сказать о том, как выбирали победителей. По истечении 48 часов программисты поехали отсыпаться по домам, и на следующий день собрались в офисе, чтобы презентовать свои работы перед коллегами. Посмотреть на презентации участников пришло больше 150 коллег. Затем среди всех сотрудников компании открылось голосование за лучший проект — каждый голосующий мог распределить три голоса между понравившимися проектами.

Всего в хакатоне приняли участие более 70 человек, в среднем, по 3-4 человека в команде, но были и смельчаки, кодившие в полном одиночестве. Потоки кода хлынули на github сразу после открытия репозитория для разработчиков. Интересно, что несколько групп состояли из сотрудников разных продуктовых команд. Это дало коллегам уникальную возможность потрудиться вместе в новом составе, что редко получается в обычной жизни. Обстановка тоже была новой — в помещениях нового питерского офиса. Некоторые сотрудники специально для этого приехали в Петербург.

Мы старались всячески поддержать концентрацию и боевой дух участников. Во время специально приготовленных горячих завтраков, обедов и ужинов хакатонщики могли обсудить последние успехи и неожиданные проблемы. Не обошлось и без будки Red Bull, открывшейся в самый необходимый момент (говорят, что это — примета правильного хакатона). Кроме того, мы пригласили профессионального массажиста, чтобы участники могли немного расслабиться и отдохнуть во время массажа.

В итоге на суд публики были представлены 22 проекта. И так понятно с каким нетерпением участники хакатона ждали объявления результатов. Максим Шафиров, CEO JetBrains, на церемонии награждения победителей поблагодарил всех, кто принял этот вызов, и сказал участникам: “Я очень впечатлен тем, как это все прошло, чего вы достигли. В следующий раз я точно буду участвовать сам. По моим ощущениям это — одна из самых классных вещей, которая в компании случилась в этом году, а с нами много чего случилось позитивного. Получить такой же эмоциональный заряд в следующий раз будет тяжело, потому что самих себя удивлять довольно сложно каждый раз. Но я надеюсь, что мы все вместе постараемся.”

Теперь о самом интересном — о победителях. Третье место поделили между собой два проекта. Автором первого проекта, Feature Suggester, выступил Александр Подхалюзин. Его идея родилась из наблюдения: даже опытные разработчики IntelliJ IDEA сами используют не все возможности IntelliJ IDEA. Нередко человек по привычке вручную делает операцию, которая давно автоматизирована и назначена на горячую клавишу в IntelliJ IDEA. Александр сделал плагин для IntelliJ IDEA, который отслеживает некоторые типичные действия и подсказывает, как их можно сделать значительно быстрее. Этот плагин — большое подспорье и для начинающих работать с IDE, и для преподавателей в вузах, и для студентов. База подсказок расширяется, и поэтому даже опытные разработчики могут найти с помощью плагина новые способы ускорить кодинг, а могут и предложить свое расширение.

image

Плагин доступен в репозитории плагинов для IntelliJ IDEA 12.1.3 или IntelliJ IDEA 13 EAP. Ищите "IDEA Feature Suggester".

Другой финалист, тоже занявший третье место, Василий Кудряшов с проектом Sovietoons для любителей советской мультипликации. Это веб-сайт, основная идея которого — критерий похожести мультфильмов по совпадению рабочих коллективов, создавших эти мультфильмы. На этом сайте можно найти мультфильм, над которым работали известные режиссеры и художники, но его почему-то мало показывали по ТВ и поэтому он может оказаться неожиданным открытием. Проект содержит базу множества мультипликаторов, для каждого из которых приводится полный список его работ. На сайте представлены студии со всеми созданными мультфильмами и ради эксперимента — список различных техник мультипликаций.

Участники проекта Book’n’Meet, занявшего второе место (Анна Орешникова, Антонина Весна, Станислав Курилов, Андрей Волков и Алексей Киреев), подметили, что в офисах компании JetBrains много переговорных комнат, в них каждый день проходят регулярные стенд-апы продуктовых команд, многочисленные телеконференции, в которых участвуют люди из разных офисов. Чтобы не возникало хаоса и боев за переговорки, было принято рационализаторское решение: проект Book’n’Мeet. Это — программа для планшетов, которые висят рядом с каждой переговорной комнатой в офисе и являются своеобразными информационными табло. На экране отображается текущий статус переговорки (занята/свободна), время, которое осталось до конца свободного или занятого периода, информация о текущей встрече и расписание на текущий день. Если переговорка свободна, то можно её сразу же занять, если нет — можно найти ближайшие свободные и занять одну из них. Также можно забронировать любой свободный период на текущий день.

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

Команда из восьми человек (Дмитрий Иванов, Сергей Балтийский, Леонид Стрюк, Артём Бухонов, Никита Раба, Сергей Кукс, Иван Сердюк, Денис Корнеев) сделала оригинальный музыкальный инструмент Ideaphone на основе оркестровых колоколов, сделанных из газопроводных труб, управляемый автоматизированной системой на базе Arduino. К инструменту прилагается веб-сервер и клиент для управления (веб-приложение с привычными музыканту черными и белыми клавишами).

Победители тщательно составили технические требования:

Функциональные

  • Инструмент должен покрывать хотя бы две октавы (24 полутона). Звучание отдельных нот должно совпадать с нотами первой и второй октавы равномерно-темперированного строя.
  • Громкость должна быть достаточна, чтобы мелодию было слышно во всех комнатах отдельно взятого этажа БЦ Universe (при правильном расположении инструмента на этаже).
  • Одновременно можно извлекать несколько звуков, что позволяет фактуре музыки быть не одноголосной, а полифонической, гармонической или гомофонно-гармонической.
  • Композиция должна уметь проигрываться по таймеру
  • Интеграция с TeamCity — при поломке билда на инструмент передаётся сигнал — проиграть гневную мелодию.

Нефункциональные

  • Благородное звучание: при ударе о трубу есть четкий основной тон и терцово-квинтовые обертона. Остальные шумы должны быть как можно тише. Предположительно достигается тонкой толщиной стенок трубки
  • войлок на конце бойка может придать более тихое звучание
  • Удобное редактирование композиций на устройстве — редактор + удобный интерфейс заливки.
Видео: презентация работы идеафона

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/company/JetBrains/blog/181672/

Выгодно покупаем софт для Mac OS X

Всем привет!

Легализация программного обеспечения в настоящее время — это не только тернистый путь подчищения кармы, но и верный способ избежать возникновения разногласий с законами Российской Федерации, которые мы чтим и уважаем.

И как бы ни шутили Windows-пользователи по поводу количества программ на Mac OS X, тем не менее, софт пишется, и зачастую — качественный и удобный. Но и эти программы, используемые в нелицензионном режиме, могут привести к серьёзным проблемам с УК РФ.

Замечу, что в силу слабой распространённости Маков на территории Российской Федерации, даже несмотря на стремительный рост их популяции, в процентном отношении нелицензионного ПО используется гораздо меньше, чем на Windows.

Чем это обусловлено?

ПО из коробки

Традиционно компания Apple снабжает свои компьютеры достаточным набором ПО, чтобы можно было купить компьютер, персонифицировать его и немедленно начать работать на нём (этому качеству даже посвящён один из роликов рекламной серии ‘Get A Mac’):

«Из коробки» на Маках предустановлены собственно операционная система и три мультимедийные программы iPhoto, iMovie и GarageBand. По-крайней мере, купленный в начале 2013 года Macbook Air поставлялся именно с таким набором ПО.

Таким образом, купив Мак, вы уже как минимум не-пират, потому что операционная система — легальна! Причём даже если у вас старый Мак и операционную систему надо покупать, то за Mountain Lion вы выложите выложить 649 р, сравните это с ценниками на Windows.

Mac App Store

На волне успеха iTunes Store и App Store, 6 января 2011 года Apple открыла свой собственный онлайн-магазин программного обеспечения для Маков — Mac App Store (MAS), ассортимент которого на сегодняшний день насчитывает более 10 000 позиций. При наличии соответствующего желания, MAS — удобное средство для добровольной покупки софта на каждый день.

В App Store трёх моих Маков, авторизованных под моим личным Apple iD, в разделе «Покупки» я вижу такую картину:

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

Разумеется, в Windows-системах возможность аналогичные возможности, но чистое преимущество Apple и MAS — экономия при установке одинаковых программ на нескольких Маках. Разумеется, Apple не блокирует возможность установки программы под учётной записью на неавторизованных компьютерах — это уже совесть владельца Apple ID.

Аналогичная ситуация — в аналогичных магазинах ПО, например, Steam. Да, с играми для Mac пока пресно, но аналогично — купленную под Steam-аккуантом игру можно установить на другом компьютере (для трёх моих Маков также это правило в силе, чо).

Как ещё можно сэкономить при покупке ПО для Мака?

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

С другой стороны, у некоторых разработчиков, публикующих программы в MAS, есть интересный бзик: на пример CyberDuck я поясню суть явления.
В Mac App Store этот FTP-клиент стоит 779 р.:

Но с официального сайта программу можно скачать и использовать совершенно бесплатно:

Разве что время от времени утка будет просить задонейтить её, но тут, сами понимаете, можно самому регулировать размер вознаграждения.

Аналогичный пример — Movist (MAS, free) и handyPrint (donationware).

В процессе поиска путей приобретения легального ПО я лично задействовал несколько способов, давайте по очереди:

Распродажи и раздачи

Время от времени разработчики программ устраивают распродажи или даже раздачи своих продуктов, например, вчера Твиттер разразился твитами о том, что легендарный 1Password подвёргся распродаже с 50%-скидкой:

Для отлова таких предложений, конечно же, годится Твиттер (iOS_Russia, например) и специализованные сайты типа appshopper.com, macupdate.com, Cult Of Mac.

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

Бандлы (пакеты)

Кроме распродаж софта, довольно часто встречаются так называемые бандлы (пакеты), когда объединяются несколько программ и продаются по цене, заведомо меньше суммарной, например: The Mac Productivity Bundle 4.0 или Omni Group Bundle Giveaway (уже завершились, куда это вы?).

Выгода таких предложений несомненна:

Самое примечательное, в таких пакетах почти всегда бывают нужные и полезные программы!

Также пакеты могут раздаваться совершенно бесплатно:

Источники: тот же Твитер и старые знакомые сайты macupdate.com, Cult Of Mac, stacksocial.com.

[лайфхак] Распаковка бандлов

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

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

После успешного проведения переговоров (в-основном, на английском языке) перекидываем деньги по PayPal:

и наслаждаемся лицензионно легальной программой:

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

Удачи в легализации, друзья!

ссылка на оригинал статьи http://habrahabr.ru/post/181656/

HTML/CSS/JS + Node.js + node-webkit = Кроссархитектурные приложения


С ростом популярности node.js он становится всё более привлекательным для разработки приложений. По крайней мере я в последнее время очень часто использую эту технологию для быстрой разработки оных. И на данный момент, технологически нет никаких препятствий для разработки кроссплатформенных приложений на одном языке. И не только классических Web-приложений (клиент-сервер) но и десктопных.

1. Если нужен быстрый старт, ставим express

npm install express 

2. Создаём файл server.js примерно следующего содержания:

  var express = require('express');   var http = require('http');    var app = express();   // Куча всяких настроек express`а               app.get('/', index.index);    http.createServer(app).listen(app.get('port'), function(){     console.log('Express server listening on port ' + app.get('port')); }); 

3. Создаём файл index.js и кладём его в папку routes

exports.index = function(req, res){   res.render('index', {}); }; 

4. Создаём index.ejs (я использую ejs как шаблонизатор) и кладём его в папку view

<!DOCTYPE html> <html>   <head>       <meta charset="utf-8">       <title>Hello world</title> </head> <body> 	<h1>Hello world!</> </body> </html> 

Вуаля!

Запускаем

node server.js 

Остаётся скопировать файлы на сервер, настроить nginx на проксирование запросов к нашему сервису… ну это Вы знаете. Но ведь не всегда есть желание или возможность возится с сервером. И даже если запускать проект локально… много возни. Хочется чего-нибудь «из коробки». Чтобы кликнул мышкой на ярлыке и приложение запустилось.

Проект node-webkit, анонсирование которого имеется на хабре, пригодится для сборки подобного.
Суть технологии в том, чтобы можно было внедрить api node.js в клиентский javascript-код. Т.е. вы можете соединятся с БД и файловой системой из клиентского кода напрямую, без посредников. Звучит заманчиво, и кстати работает, но мне не очень по душе такое смешение. Получается исключительно десктопное приложение. Мне по нраву другой вариант.
Приложение выполнено в классическом для web-приложений стиле: клиентский код и серверный. И я должен иметь возможность запускать его как на сервере, предоставляя многопользовательский доступ и как локальное (однопользовательское) приложение.

Вот рецепт:
1. node-webkit должен знать о стартовой html-странице которую он будет отображать первой.
дописываем в package.json следующее

"main": "nw-start.html" 

2. nw-start.html будет следующего содержания

<!DOCTYPE html> <html> <head> 	<script> 		function bodyOnLoad(){ 			require('./server.js'); 			window.location.assign('http://localhost:3000/'); 		} 	</script> </head> <body onload="bodyOnLoad()"> 	<h1> 		Loading... 	</h1>	 </body> </html> 

3. Весь код server.js сделаем immediate-функцией.

(function startServer(){     var express = require('express');     var app = express();     ....     http.createServer(app).listen(app.get('port'), function(){ 	  console.log('Express server listening on port ' + app.get('port'));     }); })(); 

4. Упаковываем весь проект в zip-архив nw-project.zip
5. Запускаем

nw nw-project.zip 


После недолгой паузы во время которой загружается «серверная» часть

Суть происходящего достаточно проста. node-webkit загружает стартовую страницу. После этого выполняется клиентская функция bodyOnLoad. bodyOnLoad загружает модуль server.js (вызов node.js require). Вызов приводит к исполнению кода в server.js и, следственно, запуску http-сервера. Осталось только сменить URL страницы, что и делает window.location.assign(‘http://localhost:3000/’).

Подобный подход позволяет не меняя архитектуры web-приложения сделать его desktop-версию. Правда надо понимать, что за эту простоту придётся заплатить некоторой производительностью… ведь обмен данными будет происходить не напрямую, а через сетевые запросы.

Удачных выходных…

ссылка на оригинал статьи http://habrahabr.ru/post/181670/

Элементарный симулятор полёта спутника

Решил недавно написать симулятор полёта спутника вокруг центрального тела. Сразу оговорюсь, что масса спутника принебрежительно мала, по сравнению с массой центрального тела.
image

Собственно первой частью работы было изучение математики.Тут было довольно просто: использовались элементарные уравнения кинематики.

/* t - время шага G - коэффициент притяжения(аналог гравитационной постоянной) msun - масса центрально объекта (в условных еденицах) */ var r2=(xsun-xc)*(xsun-xc)+(ysun-yc)*(ysun-yc); //  Квадрат радиуса-вектора var gs=G*msun/r2;       // Ускорение, сообщаемое спутнику // Разложение пройденного пути по векторам                                   var ivx=(t*t*gs/2)*(xsun-xc)/Math.sqrt(r2);             var ivy=(t*t*gs/2)*(ysun-yc)/Math.sqrt(r2); // прибавление средней арифметической скорости vx+=ivx/t;                                                vy+=ivy/t; var V=Math.sqrt(vx*vx+vy*vy)                                   // модуль скорости  /* Координаты */ xc+=vx*t; yc+=vy*t; 

Собственно на этом математическая часть закончилась.

Интерфейс

По задумке планировалось, что пользователь сам выберет начальную точку и сам сообщит начальную скорость.
Реализовывал на JS через два слушателя событий:

var xc,yc,xc2,yc2,intervalID,vx,vy; /* Кнопка нажата */ cnv.addEventListener('mousedown',function (event) { /* получаем начальное положение спутника */ xc=event.offsetX; yc=event.offsetY;  /*  На всякий случай очищаем анимацию */ clearInterval(intervalID) }, false) /* В это время юзер переносит мышь, задавая направление и модуль начальной скорости */ cnv.addEventListener('mouseup',function (event) { /*  И тут тоже очищаем анимацию */ clearInterval(intervalID) /* получаем координаты мыши */ xc2=event.offsetX; yc2=event.offsetY; /* разложение скорости по векторам*/ vx=(-xc+xc2)*0.4 /* начинаем анимацию*/ vy=(-yc+yc2)*0.4 intervalID=setInterval(dodo,70); }, false) 

Тестирование

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

var i=0; do{ var r2=(xsun-xc)*(xsun-xc)+(ysun-yc)*(ysun-yc); var gs=G*msun/r2; var ivx=(t*t*gs/2)*(xsun-xc)/Math.sqrt(r2); var ivy=(t*t*gs/2)*(ysun-yc)/Math.sqrt(r2); vx+=ivx/t; vy+=ivy/t; var V=Math.sqrt(vx*vx+vy*vy) xc+=vx*t; yc+=vy*t; i++ }while(i<=1/t) 

Доводка

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

ctx.moveTo(xc,yc) ctx.lineTo(xsun,ysun) ctx.stroke() 

Находиться всё здесь: http://astrokot.ru/planetarium/vectors.html

ссылка на оригинал статьи http://habrahabr.ru/post/181664/