Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1708 сообщений
Cообщения с меткой

разработка мобильных приложений - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

iMessage в iOS 10

Четверг, 30 Июня 2016 г. 15:57 (ссылка)





На WWDC 2016 Apple представила обновление iMessagе. По презентации Keynote могло показаться, что не произошло ничего интересного: добавлены стикеры, большие эмоджи и анимированные фейерверки. Но на самом деле Apple представила целую новую платформу и открыла Messages для разработчиков. Подробно об этом было рассказано на лекциях iMessage Apps and Stickers, Part 1 и Part2. Для тех же, кто пока не успел их посмотреть, но хоть немного заинтересован, ниже будут рассмотрены новые возможности для разработчиков.







Нам доступны два новых типа приложений:


  • наборы стикеров (Sticker Packs)

  • приложения iMessage (iMessage Apps)



Оба эти типа могут создаваться как вместе с iOS-приложением в виде extension, так и существовать самостоятельно. В обоих случаях приложение будет доступно пользователю в Message Store.







Приложения iMessage, в свою очередь, могут предоставлять три вида контента:


  • Интерактивные сообщения. Кажется, самое полезное нововведение;

  • Стикеры;

  • Фотографии, текст, видео, звук — всё, что было доступно раньше.



Доступные платформы



Приложения будут доступны только на платформе iOS 10. Там можно будет создавать и отправлять стикеры. Получать и корректно отображать сообщения можно будет на macOS Sierra и watchOS 3.0. Но на watсhOS 3.0 будут доступны последние использованные стикеры, и их можно будет отправлять. Кроме того обещают механизм обратной совместимости, так на iOS 9 вместо интерактивного сообщения будет приходить 2 сообщения, одно из которых будет содержать ссылку на контент в вебе.



Развития проекта для Android не предвидится, что делает iMessage несколько ограниченным.



Симулятор и Message Store



Для тестирования в симуляторе доступны два пользователя. Можно вести диалог между ними. После каждого нового запуска история сообщений очищается.



Использовать приложения можно будет из Application Drawer (в нем будут находиться приложения, созданные как extension и скачанные из Message App Store) и из самого Message App Store. Кроме этого будет представлен механизм Inline App Attribution. Если пользователю придет сообщение, созданное в приложении, которого у него не стоит, то под сообщением пользователь увидит соответствующую подпись. При клике на нее пользователь перейдет в магазин, где сможет скачать нужное приложение.



Увидеть, что из себя представляет Store пока невозможно ни на симуляторе, ни на девайсе с iOS 10 beta, потому что он еще не запущен.



Стикеры



Если вы решили создать набор стикеров, то у меня есть для вас хорошая (или нет) новость. Для этого не нужно писать ни строчки кода. Выбираете Sticker Pack Application и добавляете туда свои ресурсы. Важно понимать, что это статический набор, и изменить его можно будет только перезалив приложение.

Можно создавать статичные и анимированные стикеры.







Однако, существует набор требований к ресурсам

  1. Форматы PNG, APNG, GIF или JPEG. Но из этого многообразия Apple рекомендует форматы PNG и APNG, во избежание возникновения артефактов изображений.

  2. Файл не более 500 Кбайт.

  3. Изображение должно быть больше 100 x 100 точек, и меньше 206 x 206.



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


  • Small. 100 x 100 точек.

  • Medium. 136 x 136 точек.

  • Large. 206 x 206 точек.



Ресурсы требуются в разрешении 3x, а система сможет уменьшить их, если возникнет необходимость.



После того, как все готово, можно запускать приложение, выбрав Messages как целевое приложение. Наши стикеры уже в списке приложений, и их можно использовать.







Мы получили простой результат с минимальными временными затратами.



iMessage Apps



Для создания приложения iMessage потребуется гораздо больше времени, но и результат можно получить более интересный и полезный. Здесь нужно писать код, но в разработке можно использовать весь привычный iOS SDK.



В презентации Apple как пример было показано приложение, которое делает стикеры с мороженым. Если превратить мороженое в пиццу, то даже стикеры станут полезными с точки зрения бизнеса.



Помимо стикеров приложения iMessage могут создавать интерактивные сообщения, и это может быть все, что угодно. Карты, платежные формы, музыка.



Что же такое интерактивное сообщение?

Так Apple называет сообщения, которые создаются внутри расширений, выглядят они следующим образом:







Теперь расмотрим структуру сообщения. Оно состоит из MSSession, который отвечает за то, как сообщение будет послано, и MSMessageTemplateLayout, который отвечает за отображение сообщения в беседе. В стандартном layout можно задать image или mediaFileURL (если вы, например, хотите использовать видео, контент будет располагаться на месте image), и еще множество caption, которые можно увидеть внизу на слайде. Еще у сообщения можно задать url. Это позволит пользователю с macOS или более ранней версией iOS взаимодействовать с контентом сообщения в веб-браузере.







Давайте расмотрим, из каких частей состоит приложение.

Во-первых, это MSMessagesAppViewController. Это тот контроллер, с которым пользователь взаимодействует, когда выбирает ваше приложение. Он является наследником UIViewController. На экране может находиться в двух состояниях: compact и expanded. На него можно добавить любой ViewController в качестве ChildViewController.







Во-вторых, это MSConversation. Это беседа, где хранятся идентификаторы пользователей, и куда можно добавлять свои сообщения.







В-третьих, MSMessage. Это интерактивное сообщение.







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



Итого



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



Ссылки



Все рассмотренные выше компоненты находятся в фреймворке Messages

Код приложения из презентации Apple
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/304486/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] 10 полезных сайтов с 2D ресурсами для игр

Среда, 29 Июня 2016 г. 18:49 (ссылка)





С развитием HTML5 и мобильных платформ 2D игры возвращаются в моду и привлекают внимание даже крупных издателей. Благодаря таким инструментам, как Unity, и онлайн-ресурсам с игровыми ассетами, разрабатывать эти игры стало намного легче. Ниже представлен список из 10 лучших сайтов с 2D ресурсами для игр – как платными, так и бесплатными.



*Сайты перечислены в случайном порядке*



1. Unity Asset Store (платный)



Крупнейший сайт с платными игровыми ассетами. Использовать движок Unity для работы необязательно – чтобы получить доступ к ресурсам на Asset Store, нужно лишь загрузить его бесплатную версию. Скачанные файлы будут сохранены в папку проекта Unity, откуда их можно импортировать в любой игровой 2D движок.



Стоит отметить, что Unity в руках умелого разработчика обладает огромным потенциалом, о чем свидетельствует большое количество успешных 2D игр (чего только стоит популярная Bad Piggies от Rovio). А Unity Asset Store предлагает широчайший выбор 2D ассетов.







2. GameDev Market (платный)



GameDev Market – относительно новый сайт, удобно организованный по категориям контента (как и Super Game Asset, о котором пойдет речь ниже). Здесь вы найдете как 2D, так и 3D ресурсы, включая UI, спрайты персонажей, иконки и окружения. Художники выставляют ассеты на продажу, и ассортимент растет с каждым днем.







3. Graphicriver – Game Assets (платный)



Graphicriver – один из самых популярных ресурсов шаблонных изображений. В связи с развитием казуальных мобильных игр, там появилась отдельная категория с 2D ассетами. До размещения на сайте весь контент проходит внутреннюю проверку, а после публикации любой пользователь может оставить свою оценку и отзыв. Итого: это надежный, активно развивающийся сайт под пристальным модерированием Envato.







4. Scirra Store (платный)



Scirra – компания-разработчик Construct 2, популярного 2D редактора на HTML5, у которой недавно появился собственный магазин ассетов. Здесь можно найти аудио-, графические ресурсы и даже готовые игровые шаблоны для Construct 2. Впрочем, для работы можно использовать и любой другой 2D редактор.







5. Game Art Partners (платный)



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







6. Super Game Asset (платный)



Если вы создаете RPG или игру с изометрической графикой – этот сайт для вас. Здесь вы найдете самые высококачественные ассеты: красочные иконки для RPG (пожалуй, лучшие из доступных онлайн), 2D спрайты, анимированные спрайты персонажей и огромные изометрические карты. Что немаловажно, большинство представленных ресурсов выполнены в одном стиле.







7. Open Game Art (бесплатный)



Исчерпывающий ресурс для разработчиков игр с открытым исходным кодом, Open Game Art можно назвать крупнейшим собранием игровых ассетов со свободной лицензией. Все материалы – от спрайтов до иконок – можно загрузить по лицензиям GNU или Creative Commons. Это отличный сайт для новичков, но многие ассеты отличаются по визуальному стилю, поэтому их придется тщательно отбирать.







8. Kenny Game Assets (бесплатный)



Еще один отличный сайт с более чем 20 тыс. ассетами, включая элементы UI и различные спрайты для 2D платформеров. Большинство ресурсов представлены в векторной графике и подойдут для любого устройства, независимо от разрешения экрана. Ассеты можно скачать по отдельности (бесплатно) или одним набором (за скромную плату в $9).







9. Game-Icons.net (бесплатный)



Game-icons.net – лучший сайт с бесплатными иконками, которых здесь ни много ни мало 2000. Несмотря на то что все иконки черно-белого цвета, они достаточно универсальные и могут быть использованы для обозначения действий, заклинаний, навыков, предметов и т. п. Приятный бонус – векторный формат.







10. Reiner’s Tilesets (бесплатный)



Лучший сайт c бесплатными тайлами. Здесь можно найти спрайты животных, растений, построек, оружия, визуальных эффектов и практически любых объектов для RPG с изометрической графикой. Стиль ассетов напоминает Diablo II. Это отличный ресурс для начинающих разработчиков, желающих протестировать игровой движок или приступить к созданию своей игры.




Original source: habrahabr.ru.

https://habrahabr.ru/post/304408/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Панель управления databoom. Работа с коллекциями. Часть 2

Вторник, 28 Июня 2016 г. 10:28 (ссылка)

Привет Хабр! Мы продолжаем знакомить разработчиков с сервисом databoom.



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









JSON файлы, используемые в видео, хранятся здесь: github.com/Databoom/pub-src



Подробнее познакомиться с сервисом databoom и БЕСПЛАТНО зарегистрироваться можно на сайте databoom.space

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/304250/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Как работает умный обработчик служебных смс (показывает только важную информацию)

Вторник, 28 Июня 2016 г. 08:34 (ссылка)

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

Приложение парсит входящие смс-ки и показывает только важную информацию из них.

Показывает красиво, быстро и удобно.



1. Как это работает



В манифесте прописываем разрешение на получение и чтение SMS




`


Там же регистрируем receiver

Разрешение action_sms_received_test нужно для тестирования.

Чтобы не тратить деньги на настоящие смс во время тестирования, я отправляю Intent с этим action из приложения и ловлю его.











Теперь ресивер будет получать все входящие сообщения



@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case ACTION_SMS_RECEIVED:
handleIncomingSms(context, intent);
break;
case ACTION_SMS_RECEIVED_TEST:
// do test
break;
}
}


Теперь в методе handleIncomingSms(context, intent); требуется разобраться, что за СМС нам пришла, и принять решение о том, что делать.

Если она является служебной — мы её разбираем, достаем полезную информацию, и отображаем её в красивом виде.

Каким образом мы понимаем, служебная она или нет — опишу позже.



Грубо, это выглядит так



private void handleIncomingSms(Context context, Intent intent) {
L.i("handleIncomingSms");
Bundle bundle = intent.getExtras();

if (bundle == null) {
return;
}

try {
Object[] pdus = (Object[]) bundle.get(PDUS);
String smsText = "";
for (Object pdu : pdus) {
final SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
smsText += message.getMessageBody();
}
checkTemplates(context, smsText);
} catch (Exception e) {
L.i("handleIncomingSms - Exception", Log.getStackTraceString(e));
}

}


Метод checkTemplates();



private void checkTemplates(Context context, String smsText) {
L.i("checkTemplates", smsText);

// get templates
List smsTemplates = DatabaseManager.getSmsTemplates();

if (smsTemplates == null) {
return;
}

// check if sms text according to some template
for (SmsTemplate smsTemplate : smsTemplates) {
List messageLines = SmsNewParser.getMessageLines(smsTemplate, smsText);
if (messageLines != null) {
Sender sender = DatabaseManager.getSender(smsTemplate.sender);
showPopupDialog(context, messageLines, sender != null ? sender.iconUrl : "");
}
}
}


Метод showPopupDialog



private void showPopupDialog(Context context, List message, String iconUrl) {
L.i("showPopupDialog", message, iconUrl);

Intent popupIntent = new Intent(context, PopupActivity.class);
popupIntent.putExtra(PopupActivity.ICON_URL, iconUrl);
popupIntent.putExtra(PopupActivity.MESSAGE_0, message.get(0));
popupIntent.putExtra(PopupActivity.MESSAGE_1, message.get(1));
popupIntent.putExtra(PopupActivity.MESSAGE_2, message.get(2));
popupIntent.putExtra(PopupActivity.MESSAGE_3, message.get(3));
popupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(popupIntent);

}


После этого пользователь видит такой экран

Смысл в том, чтобы быстро увидеть полезную информацию



image



2. Алгоритм распознавания СМС и выдачи важной информации



2.1. Кратко




  • На сервере есть шаблоны

  • В каждом шаблоне указано а) как должна выглядеть СМС б) что именно показывать для неё

  • Приложение при каждом запуске синхронизирует их

  • Каждое входящее сообщение прогоняется по всем шаблонам

  • Если найден шаблон, которому она соответствует — показывается важная информация в нужной форме



2.2. Подробно о модели



Шаблон выглядит так



{
"sender": "bank_alfa",
"text": "3*8272; Pokupka; Uspeshno; Summa: 212,30 RUR; Ostatok: 20537,96 RUR; RU/MOSKVA/GETT; 15.04.2016 06:02:43",
"mask": "~N~*~N4~; ~BANK_ACTION_0~; Uspeshno; Summa: ~SUM_0~ ~CURRENCY_0~; ~BANK_ACTION_1~: ~SUM_1~ ~CURRENCY_1~; ~WORD~; ~N2~.~N2~.~N4~ ~N2~:~N2~:~N2~",
"lines": [
{
"line": "EXTRA_PURCHASE"
},
{
"line": "SUM_0"
},
{
"line": "EXTRA_TOTAL"
},
{
"line": "SUM_1"
}
]
}



  • sender — отправитель

  • text — начальный текст настоящей смс. может быть использован для тестов

  • mask — сам шаблон. используются служебные слова вида ~FOO~

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



Служебные слова делятся на extra и обычные.

Extra означает, что их нет в шаблоне.

Примеры:



~SUM~ — обычное служебное слово. Означает выражение с цифрами, разделенное точкой или запятой.

Используется для определения суммы денег. Для его поиска используется regex



{
"name": "SUM",
"regex": "\\d+[.,]{0,1}\\d+",
"values": [],
"is_extra": false
}


~CURRENCY~ — обычное слово, которое может принимать несколько значений. Для его поиска используется перебор его значений.



{
"name": "CURRENCY",
"regex": "",
"values": [
{
"value": "usd"
},
{
"value": "rur"
},
{
"value": "eur"
},
{
"value": "rub"
}
],
"is_extra": false
}


~EXTRA_CODE_WORD~ — служебное слово типа extra. Используется для вывода текста "Кодовое слово" в результате.



{
"name": "EXTRA_CODE_WORD",
"regex": "",
"values": [
{
"value": "Кодовое слово"
}
],
"is_extra": true
}


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

Эта информация хранится в объектах sender.



Пример:

Это Альфа банк и его иконка.



{
name: "bank_alfa",
icon_url: "https://dl.dropboxusercontent.com/u/1816879/CaptainSms/logo_alfa.png"
}


В итоге не сервере хранится




  • Шаблоны

  • Служебные слова

  • Отправители



Полный json можно посмотреть здесь



2.3. Подробно об алгоритме



Мы скачиваем модель, сохраняем её.

Дальше следует сама процедура разбора смс и создание результирующего сообщения.



Для парсинга текста сообщения я использую класс SmsParser со статичными методами.

Главный метод — getMessageLines(SmsTemplate smsTemplate, String realSmsText)

Он возвращает строки сообщения, если все ок, или null, если мы не нашли подходящий шаблон.

Этот метод вызывается из этого места метода checkTemplates, приведенного выше.



    // check if sms text according to some template
for (SmsTemplate smsTemplate : smsTemplates) {
List messageLines = SmsNewParser.getMessageLines(smsTemplate, smsText);
if (messageLines != null) {
Sender sender = DatabaseManager.getSender(smsTemplate.sender);
showPopupDialog(context, messageLines, sender != null ? sender.iconUrl : "");
}
}


Мы проходим по всем шаблонам из базы и пытаемся для каждого взять message lines.

Если получилось — показываем экран с информацией..



Логика getMessageLines кратко

Бежим по маске и сравниваем её посимвольно с текстом смс, записывая в массив значения встретившихся служебных слов, или выкидывая nullесли встретили несоответствия



Логика getMessageLines подробнее:




  • Бежим посимвольно по тексту маски

  • Если символ — это начало служебного слова (~), то:

    — Понимаем, что это за слово (например, ~SUM_0~)

    — Вычисляем его значение в тексте СМС (например, 255.00)

    — Отрезаем от маски это слово, а от текста это значение (чтобы дальше бежать посимвольно)

  • Иначе, если это простой символ, то:

    — Если они совпадают в максе и тексте, то отрезаем их оттуда и оттуда чтобы дальше сравнивать

    — Если они разные, то выкидываем null — текст не подходит под шаблон



Логика с примерами кода



Как параметры, в метод нам приходят шаблон и текст смс



public static List getMessageLines(SmsTemplate smsTemplate, String smsText)


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

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



private static void initReservedWords() {
L.i("initReservedWords");
mReservedWords.clear();
mReservedWords = DatabaseManager.getReservedWords();
}


Затем создаем список служебных слов из заданного шаблона.



    List reservedWords = new ArrayList<>();
for (SmsTemplateLine line : smsTemplate.lines) {
reservedWords.add(getReservedWordByName(line.line));
}


т.е. если у нас есть шаблон



{
"sender": "bank_alfa",
"text": "3*8272; Pokupka; Uspeshno; Summa: 212,30 RUR; Ostatok: 20537,96 RUR; RU/MOSKVA/GETT; 15.04.2016 06:02:43",
"mask": "~N~*~N4~; ~BANK_ACTION_0~; Uspeshno; Summa: ~SUM_0~ ~CURRENCY_0~; ~BANK_ACTION_1~: ~SUM_1~ ~CURRENCY_1~; ~WORD~; ~N2~.~N2~.~N4~ ~N2~:~N2~:~N2~",
"lines": [
{
"line": "EXTRA_PURCHASE"
},
{
"line": "SUM_0"
},
{
"line": "EXTRA_TOTAL"
},
{
"line": "SUM_1"
}
]
}


то мы хотим получить список




  • EXTRA_PURCHASE

  • SUM_0

  • EXTRA_TOTAL

  • SUM_1



далее идет основная логика



    // check match symbol by symbol
try {

do {
String s = mask.substring(0, 1);
if (s.equals(ReservedWord.SYMBOL)) {

// found start of a reserved word
ReservedWord currentReservedWord = getFirstReservedWord(mask);
String valueOfCurrentReservedWord = getValueOfReservedWord(smsText, mask, currentReservedWord);

// add value in the list, if reserved word is in the list
if (reservedWords.contains(currentReservedWord) && valueOfCurrentReservedWord.length() > 0) {
values.put(currentReservedWord.getForm(), valueOfCurrentReservedWord);
}

// cut text and mask to look next symbols
smsText = smsText.substring(valueOfCurrentReservedWord.length());
mask = mask.substring(currentReservedWord.getForm().length());

} else if (s.equals(smsText.substring(0, 1))) {

// that symbols matches, go to the next symbol
smsText = smsText.substring(1);
mask = mask.substring(1);

} else {
/*
* that symbol does not match, so text not match that mask, so method fails
* because we cannot return correct values according to that list of reserved word
*/
return null;
}
} while (mask.length() > 0);
} catch (StringIndexOutOfBoundsException e) {
/*
* There is some error during parsing.
* That mean text does not match mask.
*/
L.i(TAG, "getMessageLines - Exception - " + Log.getStackTraceString(e));
return null;
}


Она делает ровно то, что описано выше, как "Логика getMessageLines подробнее:"



Далее мы пересортировываем список, т.к. в тексте он встречается в другом порядке, чем наших message lines



    // convert list to the right order
List valuesList = new ArrayList<>();
for (ReservedWord word : reservedWords) {
LLog.e(TAG, "getMessageLines - return list - " + values.get(word.getForm()));
if (values.get(word.getForm()) != null) {
valuesList.add(values.get(word.getForm()));
}
}


Далее мы добавляем служебные слова типа extra, т.к. мы их не находили при прохождении по тексту смс.



    // add values of all the extra words
for (int i = 0; i < reservedWords.size(); i++) {
if (reservedWords.get(i).isExtra) {
valuesList.add(i, reservedWords.get(i).values.iterator().next().value);
}
}


Это нужно вот почему.

На вход нам подали smsTemplate. У него есть набор messageLines. Например, их было 4.



  "lines": [
{
"line": "EXTRA_PURCHASE"
},
{
"line": "SUM_0"
},
{
"line": "EXTRA_TOTAL"
},
{
"line": "SUM_1"
}
]
}


Но в процессе проверки текста на совпадение с шаблоном мы нашли только SUM_0 и SUM_1

Т.к. это данные, которые реально есть в тексте СМС.

Таким образом, после первого куска логики мы имеем массив из двух элементов (в данном случае 212,30 и 20537,96).

Но на выход нам нужно подать 4 строки (к этим двум нужно еще добавить EXTRA_PURCHASE и EXTRA_TOTAL), причем в нужном порядке.

Поэтому в конце метода мы их добавляем.



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



Например, если у нас был шаблон



{
"sender": "bank_alfa",
"text": "3*8272; Pokupka; Uspeshno; Summa: 212,30 RUR; Ostatok: 20537,96 RUR; RU/MOSKVA/GETT; 15.04.2016 06:02:43",
"mask": "~N~*~N4~; ~BANK_ACTION_0~; Uspeshno; Summa: ~SUM_0~ ~CURRENCY_0~; ~BANK_ACTION_1~: ~SUM_1~ ~CURRENCY_1~; ~WORD~; ~N2~.~N2~.~N4~ ~N2~:~N2~:~N2~",
"lines": [
{
"line": "EXTRA_PURCHASE"
},
{
"line": "SUM_0"
},
{
"line": "EXTRA_TOTAL"
},
{
"line": "SUM_1"
}
]
}


то на выходе мы получим




  • Покупка

  • 212,30

  • Осталось

  • 20537,96



На этом главная логика заканчивается.

Далее мы просто показываем это в нашей попап активити таким методом



showPopupDialog(context, messageLines, sender != null ? sender.iconUrl : "");


Текст messageLines просто отображается в текст вьюшках.

iconUrl подгружается в image view с помощью Glide — тут все предельно просто.



Заключение



Очевидно, что алгоритм примитивен и может быть улучшен.

Из идей




  • разбить api на разные json файлы (например один json для каждого отправителя)

  • умный алгоритм прогона по шаблонам (сначала все с кодами — они нужны быстрее всего, затем часто используемые, затем все остальные)

  • вероятно, можно улучшить сам код парсинга (проверить на создание лишних объектов, уменьшить количество циклов и прочее)



Но поставленную задачу приложние решает.



image



Прилагаю главный класс для парсинга сообщений.

Он немного отличается от кода, приведенного выше,

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


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/303990/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Обзор новорождённой платформы Scorocode

Понедельник, 27 Июня 2016 г. 15:19 (ссылка)





BaaS-платформы (Backend as a Service) сделали разработку и сопровождение backend'а для мобильных и веб-приложений достаточно простыми и предсказуемыми процессами. Одним из флагманов движения BaaS стала компания Parse, но в 2016 году она заявила о прекращении обслуживания клиентов с 2017 года.



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



Расцвет BaaS



Разработка серверной части — самый трудный и непредсказуемый этап создания приложения. Зачастую, при планировании разработки проекта, недооценивается необходимый объём ресурсов и время создания backend'а.



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



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



Долгое время ИТ-индустрия искала способы упрощения разработки backend'а. Многие компании создавали инструменты, облегчающие работу над частными аспектами разработки, но это только затрудняло процесс: разработчикам приходилось разбираться не только в конкретной СУБД или платформе, но и в дополнительных инструментах.



Всё изменилось в 2011 году, когда компания Parse предложила новый подход к созданию backend'а на основе облачного сервиса. Он позволял решить две основные задачи:




  • Хранение в облаке и свободное манипулирование структурированными данными;

  • Возможность писать серверную бизнес-логику на JavaScript — стабильно популярном языке программирования на протяжении нескольких лет.



Позднее были добавлены другие полезные функции, облегчающие создание backend'а и инструменты для решения рутинных задач.



Идея имела колоссальный успех. В середине 2012 года сервисом пользовалось 20 000 разработчиков, а ежемесячный прирост пользователей составлял 40%. Теперь этап разработки backend'а занимал дни, а не месяцы, и сэкономленные ресурсы можно было направить на разработку и совершенствование frontend'а.



Использование BaaS позволило точнее оценивать сроки разработки и необходимые ресурсы. Сам процесс создания backend'а стал более формализованным, позволяя для разных платформ использовать единую серверную часть, упростилось сопровождение проекта, расходы снизились и стали более прогнозируемы.



Scorocode: начало



Три года назад Facebook приобрёл Parse, и в конце 2015 года социальная сеть решила использовать мощности BaaS монопольно. Все остальные разработчики должны в течение 2016 года мигрировать на другие ресурсы.



Это событие совпало по времени с началом разработки нашей собственной BaaS-платформы. Изначально мы хотели создать сервис, сразу предоставив пользователям как базовую функциональность аналогичных платформ, так и большое количество новых уникальных функций. В результате мы сделали небольшой пивот, и в качестве отправной точки для Scorocode приняли базовую функциональность Parse с возможностью миграции данных из него в наше облако.



Scorocode: техника вопроса



Scorocode — горизонтально масштабируемая система, построенная на принципах кластеризации. Кластеры разделяются по типам: API, СУБД, файлы, статистика. Каждый кластер API, работающий с конечными приложениями, выдерживает нагрузку около 25 тысяч запросов в секунду. С ростом нагрузки количество кластеров наращивается.







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



Основная СУБД в Scorocode — MongoDB, в качестве in-memory database используется Redis, а сервер очередей работает под управлением RabbitMQ. Высокопроизводительный API написан «с нуля» на Go. Язык был выбран нами после серии экспериментов с Node.js и С++. Google в последнее время очень активно развивает Go, писать на нём комфортно, код получается компактным, а производительность на уровне С++. Множественные микросервисы платформы тоже разработаны на Go.



Scorocode позволяет исполнять два варианта серверного кода:




  • JS-скрипты с бизнес-логикой. Они хранятся и выполняются на наших серверах. Причём выполняются асинхронно — по расписанию или с запуском вручную с клиентов, посредством вызовов через API. Выполнением серверных скриптов занимается движок Google V8.

  • Триггеры на JS, то есть обработчики операций с данными. Они выполняются высокоскоростным движком, написанным на Go. В данном случае мы отказались от V8, потому что он достаточно долго стартует, а у каждого обработчика есть всего лишь 500 миллисекунд для выполнения кода.



Чем мы отличаемся от конкурентов?




  • Scorocode состоит только из самописных и open source-компонентов. Исключена ситуация, когда в какой-то из компонентов сторонними разработчиками вносятся изменения, с которыми нам придётся мириться. Нам известно устройство и алгоритмы работы каждого элемента системы, поэтому исправление ошибок и реализация новых функций могут выполняться в кратчайшие сроки.

  • Корпоративные клиенты могут хранить чувствительные данные в собственном облаке. В этом случае на Scorocode обрабатывается только бизнес-логика, а все запросы к данным перенаправляются на клиентское облако.

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

  • Все серверы и данные находятся на территории РФ. Это позволяет нашим клиентам соблюдать требования законодательства.



Финансовый вопрос



На данный момент у нас действует три тарифных плана:




  • Бесплатный “Free”. Если вы начинающий разработчик, то возможностей тарифного плана может хватить для полноценной работы простого приложения.

  • Базовый “Indie”. По умолчанию предоставляется в 1,5-2 раза больше возможностей, чем на бесплатном тарифном плане. Этого уже достаточно для небольших студий и команд разработчиков. Можно расширять возможности тарифного плана, приобретая в Marketplace дополнительные опции.

  • Корпоративный “Enterprise”. Индивидуальные условия для корпоративных клиентов, отсутствие ограничений, выделенные кластеры, космическая техническая поддержка, и т.д.



С платформой Scorocode можно дополнительно сократить затраты на обслуживание приложений:




  • Всем новым разработчикам мы зачисляем при регистрации на счёт платформы по 3000 рублей. Этого достаточно для оплаты одного месяца тарифного плана Indie.

  • Всем новым студиям разработки и digital-агентствам после подтверждения мы зачисляем на счёт платформы 10 000 рублей. Их можно потратить по своему усмотрению — либо взять Indie на три месяца, либо докупить в Marketplace дополнительные опции.



Развитие



У нас оптимистичные планы по развитию Scorocode на четыре года вперёд. Инвестиции и поддержку нам оказывает группа компаний PROF-IT GROUP, которая в 2015 году вошла в рейтинг самых быстрорастущих IT-компаний по версии Cnews.



Ближайшие планы развития:




  • Интеграция с партнёрскими облачными сервисами для расширения методов обработки данных, хранящихся в Scorocode;

  • Фабрика интеллектуальных чат-ботов;

  • Поддержка полного цикла разработки — от backend до frontend.



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



Приглашаем поделиться в комментариях своими пожеланиями и впечатлениями от использования Scorocode.



Мы будем регулярно вести блог с циклом статей про Scorocode: примеры его использования, наш опыт разработки платформы и особенности разработки приложений в целом. Будем рады видеть вас в подписчиках.
Original source: habrahabr.ru.

https://habrahabr.ru/post/303954/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов для мобильного разработчика #159 (20-26 июня)

Воскресенье, 26 Июня 2016 г. 15:13 (ссылка)

Мы продолжаем разбираться с «последствиями» WWDC, разбираем новые примеры кроссплатформенной разработки, выясняем какие ролики самые эффективные для продвижения приложений в разных категориях и поднимаем грабли hardware-стартапа. Добро пожаловать в новый дайджест!












Уведомления в iOS 10

Говорят, что на этом WWDC не было ничего интересного, кроме интерактивных уведомлений. Действительно, новые уведомления одна из самых интересных новых фич. Не только для разработчиков, но и для простых пользователей. В iOS 10 попытались унифицировать работу с локальными и пуш-уведомлениями и добавили для этого новый фреймворк UserNotifications.framework.




Создаем приложение на JavaScript с помощью React Native

В этом уроке мы будем изучать React Native – фреймворк от компании Facebook для создания нативных приложений под iOS и Android. У него много общего с другим очень популярным фреймворком от Facebook – React Javascript, который предназначен для построения декларативных пользовательских интерфейсов.




Грязные трюки мобильной разработки от J2ME до Android

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



iOS



Android



Разработка



Аналитика, маркетинг и монетизация





Устройства и IoT





<- Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Original source: habrahabr.ru.

https://habrahabr.ru/post/304136/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Сравнение eCPM рекламных сетей на личном опыте

Пятница, 24 Июня 2016 г. 18:28 (ссылка)

Рейтингов рекламных сетей много, и я не претендую на составление еще одного. Просто я уже давно выпускаю игры для iOS и Android и раньше применял во всех одну и ту же схему монетизации. Со временем она сильно устарела и перестала приносить стабильный доход. Пришлось что-то менять и усиленно экспериментировать с другими рекламными сетями. Именно этими экспериментами я и хочу поделиться. И сразу же хочу уточнить, что ниже речь пойдет в основном о российском трафике, который в моих приложениях составляет порядка 90%.

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

https://habrahabr.ru/post/304062/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Почему не взлетел Pied Piper: наш разбор 9 серии 3 сезона сериала «Кремниевая долина»

Пятница, 24 Июня 2016 г. 12:55 (ссылка)

Осторожно, данный текст содержит спойлеры! Если вы смотрите сериал “Кремниевая долина” и еще не видели 9 серию 3 сезона, то не читайте эту статью.



Напомню, что Pied Piper — это сервис эффективной компрессии и облачного хранения файлов, который в этой серии выходит на массовый рынок, и пока что выходит не совсем успешно.







Итак, Pied Piper не взлетел. Сомнений нет, что всё будет хорошо (сезон ещё не закончен, сериал тем более), но для этого Ричарду & Co (точнее, сценаристам) придётся сделать что-то из ряда вон выходящее. Пока же имеем следующие цифры: на 500 тысяч установок лишь 19 тысяч активных пользователей в день (DAU). Неясно, сколько дней прошло с начала запуска приложения, а потому точные значения retention, то есть процент пользователей, которые посетили проект в определенный срок, рассчитать трудно. Но судя по всему, прошло совсем немного времени, и можно с небольшим допущением говорить о метриках retention 1 день или 7 дней.

И 3,8% (то есть19 тысяч / 500 тысяч) — это совсем мало. По опыту, retention 1 дня должен быть в районе 30%, retention 7 дня — в районе 15%. Или ещё одна оценка — 20% за неделю (именно поэтому Моника поначалу прикинула, что должно быть 100 тысяч пользователей), ещё больше завышающая планку для Pied Piper.



На правах аналитика сервиса devtodev разберу основные ошибки ребят из Pied Piper:



Ошибка первая, распространенная: неправильный выбор метрик



Все следят лишь за одной метрикой: количеством установок. Эта метрика всегда будет расти, она кумулятивная, но за растущим числом установок почти никто не видит проблему продукта: пользователи в него не возвращаются.

На этапе запуска продукта метрика Installs часто находится в центр внимания, так как показывает количество пользователей, попробовавших продукт. Однако на первое место надо ставить всё же метрики качества продукта: retention первых дней, ARPU (average retention per user — доход с пользователя), иногда среднюю продолжительность сессии. Если с этими показателями всё в порядке, то можно быть спокойным за продукт, а установки пусть продолжают расти.



Я рекомендую отслеживать ключевые события (хотя бы сжатие файла), чтобы понять:


  • какой процент пользователь доходит до сжатия файла;

  • какие типы файлов выбирает пользователь;

  • насколько успешно происходит сжатие.



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







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



Ключи от закрытого бета-теста были получены лишь ближайшим окружением разработчиков, то есть теми, кто уже знаком с уникальным алгоритмом, придуманным Ричардом. Когда продукт попадает к ним в руки, они знают, куда смотреть, что проверять и чем восторгаться, их отзывы заведомо положительны. Поэтому Ричард не получает должной обратной связи от обычных пользователей (на реплику Моники он предпочёл не обращать внимания).



Что же надо было сделать?



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

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







Ошибка третья, поучительная: проблема с активацией пользователя



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

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

Пользователь, впервые увидевший новое для себя приложение, задаёт себе вопросы:


  • что это такое?

  • чем это может быть мне полезно?

  • чем это отличается от других подобных приложений на рынке?

  • сколько это будет мне стоить?



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



Процесс осознания пользователем преимущества продукта называется активацией (user onboarding), а сам момент, в который пользователь понимает функционал продукта, иногда именуют aha-моментом (“Ага! Я понял, в чём фишка”) — я про это подробно рассказывал вот здесь. Пользователь, испытавший aha-момент, как правило, остаётся в продукте надолго (явно дольше, чем пользователь, до этого момента не дошедший). Для справки: сервис Dropbox, работающий на том же рынке, что и вымышленный Pied Piper, своим aha-моментом считает загрузку первого файла в облако.







Что же будет дальше? Мне самому интересно узнать, как сценаристы выкрутятся из ситуации и выведут Pied Piper на новый уровень: тут надо отдать должное создателям сериала, эмпатия к персонажам настолько высока, что каждую серию переживаешь за них, как за родных. Некоторые вот даже статьи пишут.
Original source: habrahabr.ru.

https://habrahabr.ru/post/304020/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Грязные трюки мобильной разработки от J2ME до Android

Понедельник, 20 Июня 2016 г. 18:22 (ссылка)

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





J2ME



Самый грязный трюк в разработке под J2ME – поставить внутрь основного цикла игры один общий try-catch.



public void run()
{
while(isGame)
{
try()
{
gameField.Update();
}
catch (Exception ex)
{
}
}
}

https://habrahabr.ru/post/303686/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<разработка мобильных приложений - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda