Pull to refresh
55
0
Виктор Мельник @aNNiMON

Пользователь

Send message

2048

Reading time1 min
Views405K
19-летний итальянский разработчик Габриэле Чирулли (Gabriele Cirulli) создал чрезвычайно захватывающую игру 2048, скрестив тетрис и «пятнашки».



На каждом раунде в игре появляется две плитки с цифрой «2». Нажимая стрелки, нужно сбросить их в сторону, при этом плитки одного «номинала» складываются. Выигрыш засчитывается при достижении результата 2048.
Читать дальше →

Углубляясь в Graphics2D

Reading time32 min
Views79K
Добрый день, Хабражители!

Сегодня я опять постараюсь привлечь Ваше внимание к некоторым сторонам и тонкостям работы с графикой в Java. Я уже кратко описал в предыдущей статье некоторые доступные средства и способы создания компонентов и UI, но это лишь вершина айсберга. Именно поэтому я хочу уделить отдельное внимание (и статью) именно работе с графикой. Естественно имеется в виду Graphics2D – Java 3D это большая отдельная тема (возможно о ней еще пойдет речь в дальнейшем, но не сегодня).

Итак, из предыдущей статьи Вам уже должны быть известны некоторые основы построения компонентов — постараемся расширить эти знания.

Начнем с того, что если рассматривать любой компонент с точки зрения MVC – он состоит из 3ех частей:
Model – модель, которая хранит в себе данные о состоянии компонента и на основе которой строится внешний вид
View – непосредственно визуальное отображения компонента
Controller – отвечает за управление компонентом (события от клавиатуры, мыши и прочих устройств ввода)

Фактически, все стандартные компоненты Swing построены по паттерну MVC. К примеру в JButton — ButtonModel отвечает за поведение и состояние кнопки (Controller и Model), а ButtonUI в свою очередь за внешнее её представление (View). В итоге на долю самого класс JButton практически ничего не остаётся. Речь пойдет по большей части о реализации внешнего представления компонентов (View), и если уточнять — о Graphics2D, на основе которого, фактически, рисуется весь интерфейс.

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

Читать далее...

Жизнь как 8-битная игра: Руководство

Reading time5 min
Views263K
Press Start
Жизнь — игра, в которую играют буквально все. Эта статья — ваше руководство.

Основы

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

Грамотное определение языка пользователя

Reading time3 min
Views85K
Сейчас работаю над сайтом, который претендует на глобальность, естественно и с мультыязычностью у него должно быть все в порядке.

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

Пишем, собираем и запускаем HelloWorld для Android в блокноте

Reading time10 min
Views130K


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

По-сути эта статья является переводом и переработкой статьи Building Android programs on the command line под современные на данный момент JDK (7) и Android SDK (API level 19). Кроме того, я многое упростил и добавил кое-что от себя.

Используя только блокнот, мы напишем совсем маленькое учебное Android-приложение. А затем скомпилируем его, соберём и запустим на устройстве — и всё через командную строку. Заинтересовало? Тогда прошу.
Читать дальше →

Война с дизайнером: откуда берётся хороший дизайн

Reading time5 min
Views43K
Вы более 9000 раз заказывали дизайн, и ни разу не разочаровались? Творческие люди понимают вас с полуслова, а результат их работы непременно радует ваш глаз и кошелек? Может быть, вы дизайнер-профессионал, отточивший мастерство общения с закачиком до мастерского уровня?

Тогда этот пост не для вас. Вы и так все знаете.

Но если письма от дизайнера, который занимается вашим проектом, начинаются заголовком «правки ver_3_b_часть II», а общаться с каждым днем все сложнее — попробуйте почитать. Может быть, здесь найдется полезный совет, который облегчит вам жизнь и сэкономит деньги.
Я предлагаю вашему вниманию несколько заметок-соображений, которые накопились за время моей работы в этой области.
Вот первые три

NinjaMock — бесплатное приложение для прототипирования интерфейсов

Reading time6 min
Views179K
Привет %username%! У нас отличные новости: вышла официальная версия NinjaMock — онлайн-сервиса для создания прототипов. Теперь ты можешь рисовать отличные прототипы веб- и мобильных приложений совершенно бесплатно!

Узнай, как это возможно и почему NinjaMock лучше всех!

Чак Норрис и Google Glass — что общего, а вот…

Reading time4 min
Views41K
Недавно мне (несказанно поперло) выпал шанс купить Google Glass по Explorers Program. Стоило только заказать, как на следующее утро почтальон разбудил меня стуком в деверь — вам посылка. Не умываясь и не чистя зубы…

Под вечер возникла возможность попрограммировать. Изучив пару-тройку примеров и настроив окружение — я взялся за дело. Возникла идея написать приложение которое будет вытаскивать шутку про Чака Норриса из веб-сервиса, парсить JSON, и читать вслух.

Читать дальше →

Разработка виджета под Android

Reading time6 min
Views44K
На Хабре уже достаточно статей о том, как разработать «hello world»-виджет для устройств на базе Android. Еще больше об этом можно почитать в сети, в том числе и на сайте Google для разработчиков, StackOverflow и других ресурсах. Казалось бы, все подробно разжевано, есть сотни примеров — зачем же писать очередную статью, когда вокруг и так достаточно информации?
Однако, когда мы начали разработку виджета, нам пришлось потратить несколько недель на то, чтобы разобраться с нюансами и реализовать проект так, как мы задумали его изначально.
Надеемся, наш опыт поможет сэкономить время на реализацию вашего виджета.
Читать дальше →

Тонкости оператора switch

Reading time6 min
Views89K
Да, это целая статья по самому обычному switch в JDK 7. Бывает так, что накопленный материал кажется интересным и малоизвестным, а потом оказывается, что любая бабка у подъезда уже 50 лет знает об особенностях реализации switch. Но я попробую. Для затравки, предлагаю 3 вопроса:

  1. (Простой) Каков результат работы этого кода?
    switch(5){
    default: System.out.print(0);
    case 1: System.out.print(1); break;
    case 4: System.out.print(4);
    case 2: System.out.print(2);
    }

  2. Следующие 2 варианта практически одинаковы. Немного отличаются литералами.
    //Вариант 1
    switch("BBBBBB"){
    case "AaAaAa": break; 
    case "AaAaBB": break;
    case "AaBBAa": break;
    case "AaBBBB": break;
    case "BBAaAa": break;
    case "BBAaBB": break;
    case "BBBBAa": break;
    case "BBBBBB": break;
    }
    //Вариант 2
    switch("BBBBBB_8"){
    case "AaAaAa_1": break;
    case "AaAaBB_2": break;
    case "AaBBAa_3": break;
    case "AaBBBB_4": break;
    case "BBAaAa_5": break;
    case "BBAaBB_6": break;
    case "BBBBAa_7": break;
    case "BBBBBB_8": break;
    }
    Почему первый switch выполняется в несколько раз медленнее, по крайней мере, с отключенным JIT (-Djava.compiler=NONE)? Сами проверьте в цикле! JIT таким кодом не проведешь, но если немного пошаманить, то небольшая разница будет заметна.
  3. Какова вычислительная сложность алгоритма нахождения совпадающего значения среди n case-ов (по крайней мере, в JDK 7)?
Читать ответы и статью

Изобретаем JPEG

Reading time28 min
Views178K

Вы правильно поняли из названия, что это не совсем обычное описание алгоритма JPEG (формат файла я подробно описывал в статье «Декодирование JPEG для чайников»). В первую очередь, выбранный способ подачи материала предполагает, что мы ничего не знаем не только о JPEG, но и о преобразовании Фурье, и кодировании Хаффмана. И вообще, мало что помним из лекций. Просто взяли картинку и стали думать как же ее можно сжать. Поэтому я попытался доступно выразить только суть, но при которой у читателя будет выработано достаточно глубокое и, главное, интуитивное понимание алгоритма. Формулы и математические выкладки — по самому минимуму, только те, которые важны для понимания происходящего.

Знание алгоритма JPEG очень полезно не только для сжатия изображений. В нем используется теория из цифровой обработки сигналов, математического анализа, линейной алгебры, теории информации, в частности, преобразование Фурье, кодирование без потерь и др. Поэтому полученные знания могут пригодиться где угодно.

Если есть желание, то предлагаю пройти те же этапы самостоятельно параллельно со статьей. Проверить, насколько приведенные рассуждения подходят для разных изображений, попытаться внести свои модификации в алгоритм. Это очень интересно. В качестве инструмента могу порекомендовать замечательную связку Python + NumPy + Matplotlib + PIL(Pillow). Почти вся моя работа (в т. ч. графики и анимация), была произведена с помощью них.

Внимание, трафик! Много иллюстраций, графиков и анимаций (~ 10Мб). По иронии судьбы, в статье про JPEG всего 2 изображения с этим форматом из полусотни.
Читать дальше →

Продвижение непопсового приложения в Google Play

Reading time4 min
Views13K


Последние 3 или даже 4 месяца я долго и упорно писал IDE/редактор кода для веб-программистов под Android. Так получилось, что 2.5 года назад я уже писал в паре с товарищем аналогичную программу, и каким-то чудом она была достаточно успешной, несмотря на то, что это был практически первый опыт создания чего-либо, кроме университетских лабораторных работ.

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

Задача о ранце и код Грея

Reading time4 min
Views42K
Не так давно на Хабре была статья «Коды Грея и задачи перебора». Статья эта скорее, математическая, нежели программистская, и мне, как простому программисту, читать её было невыносимо тяжело. Но сама тема мне знакома, поэтому я решил описать её своим взглядом, а так же рассказать о том, как использовал её в решении задачи о ранце.

image
КДПВ: задача о ранце на живом примере

Предыстория


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

Задача почему-то запала мне в душу. Вернувшись домой, я быстро накатал решение: наивный перебор всех возможных сумм с выбором наилучшего. Сочетания я получал, перебирая все N-разрядные двоичные числа и беря суммы тех исходных чисел, которым соответствуют единицы. Но я с огорчением обнаружил, что при количестве элементов начиная где-то с 30, программа работает очень долго. Оно и не удивительно, ведь время работы такого алгоритма — n*2n (количество сочетаний, умноженное на длину суммы).
Чем же всё закончилось?

Искусственный интеллект под Android с открытым API

Reading time7 min
Views192K

Только ленивый не знает сегодня о том, что такое голосовой помощник Siri. Когда два года назад этот продукт был показан на презентации нового iPhone 4S, многие посмотрели на развитие IT-индустрии по-новому. Действительно, искусственный интеллект в кармане, понимающий естественную речь, еще не показывал никто.

Многие в то время начали говорить о том, что Apple может уже на следующем WWDC предоставить всем программистам под iOS возможность использовать открытое API ассистента Siri для своих собственных программ. Картина вырисовывалась радужной — любое приложение смогло бы реагировать на пользовательские фразы, исполняя различные команды. Действительно, если в магазине AppStore так много разных полезных приложений, почему бы им не дать возможность управления голосом? Тем более что такой вид коммуникации с пользователем, как речь, быстро стал трендовым после выхода iPhone 4s.

О том, удалось ли это сделать Apple, и что удалось сделать нам, читайте далее.

Читать дальше →

Сборка CLDC HotSpot Implementation для ARM

Reading time4 min
Views6K
В данной статье рассматривается виртуальная Java-машина CLDC HI с открытым исходным кодом компании Sun для встраиваемых и мобильных платформ, а также её построение для вычислительных машин с архитектурой ARM.
Читать дальше →

Топ комментариев Хабра — сервис, детали реализации, и немного статистики (С#)

Reading time3 min
Views30K
Некоторое время назад страничка «Лучшие комментарии» была удалена с Хабра (подробности здесь: habrahabr.ru/qa/18401).
Тем не менее, мне бывало интересно туда заглянуть — и ради лулзов, и статьи иногда интересные попадаются из тех, что в ленте упустил. Так что решил я сделать свой небольшой сервис. Надеюсь, администрация не будет против.

Текущий URL сервиса: habrastats.comyr.com


Ссылка и технические подробности

Работа с растром на низком уровне для начинающих

Reading time6 min
Views78K
Поводом для данной статьи стал следующий пост: «Конвертация bmp изображения в матрицу и обратно для дальнейшей обработки». В свое время, мне немало пришлось написать исследовательского кода на C#, который реализовывал различные алгоритмы сжатия, обработки. То, что код исследовательский, я упомянул не случайно. У этого кода своеобразные требования. С одной стороны, оптимизация не очень важна – ведь важно проверить идею. Хотя и хочется, чтобы эта проверка не растягивалась на часы и дни (когда идет запуск с различными параметрами, либо обрабатывается большой корпус тестовых изображений). Примененный в вышеупомянутом посте способ обращения к яркостям пикселов bmp.GetPixel(x, y) – это то, с чего начинался мой первый проект. Это самый медленный, хотя и простой способ. Стоит ли тут заморачиваться? Давайте, замерим.

Использовать будем классический Bitmap (System.Drawing.Bitmap). Данный класс удобен тем, что скрывает от нас детали кодирования растровых форматов – как правило, они нас и не интересуют. При этом поддерживаются все распространенные форматы, типа BMP, GIF, JPEG, PNG.
Читать дальше →

Замечательное выступление настоящего программиста

Reading time1 min
Views150K
Не нашёл на хабре — спешу поделиться. Восхитительное выступление Александра Соловьёва ingspree на конференции JavaScript Frameworks Day 2013. На видео ниже просто набор отрывков из него, желающим посмотреть полностью — сюда.

Много бесплатных книг по программированию

Reading time7 min
Views347K
Читать дальше →

Information

Rating
Does not participate
Location
Украина
Registered
Activity

Specialization

Software Developer, Backend Developer
From 1 ₴
Java
Linux
Bash