пятница, 24 ноября 2017 г.

Проблема в обновлении MoneyTracker 1.27

Вот такая "красота" наблюдается в старых версиях Android после вчерашнего обновления.
Проблема в том, что рисованный объект, к коим относится и рамка, если у него не указан цвет заливки, на старых версиях Android заливается черным! На последних версиях, как и ожидалось, объект будет прозрачным.
Чтобы устранить дефект, пришлось спешно выпустить обновление 1.28, в котором рамка принудительно заливается белым. Обновление уже доступно.

Обновление MoneyTracker 1.27

В одном из прошлых релизов Money Tracker была добавлена возможность в расход / доход вносить сумму в двух валютах. С необходимостью этого сталкиваешься, когда используешь банковскую карточку, например, из Казахстана (с валютой в тенге, это важно) в России, покупая за рубли. С карты все, разумеется, списывается в тенге, но при этом происходит конвертация из рублей в тенге (по курсу используемой системы, при этом точное значение суммы списания известно не сразу, а обычно через три банковских дня). Ранее расход в рублях было вносить просто некуда.
Новая функция "сломала" поведение экрана ввода расхода / дохода, сделав полем по-умолчанию поле с суммой, но это неудобно, в текущем релизе полем по-умолчанию при добавлении расхода / дохода вновь стало поле с описанием. При редактировании существующего дохода / расхода полем по-умолчанию, как и прежде, является поле с суммой (ведь обычно запись редактируется в связи с уточнением суммы).
И, наконец, поля сумм, подписи к ним и поле с валютой операции взяты в рамку для удобства работы.
Жду обновления в Play Market.

вторник, 10 октября 2017 г.

Обновление Money Tracker 1.23

Пришлось "прыгнуть" через версию из-за нелепых ошибок, вызванных обфускацией приложения перед публикацией. Цель обфускации в моем случае - уменьшение размеров установочного файла и удаление неиспользуемых методов, ресурсов и т. п. Как оказалось, приложение нужно тщательно тестировать после каждого применения обфускации, иначе то одно в нем перстает работать, то другое.
Я настроил Android Studio таким образом, чтобы обфускации подвергался не только релиз, но и отладочная версия, чтобы уже на этапе отладки получить полный комплект ошибок и устранить причину до выпуска ошибочного релиза (поиск причин ошибок и донастройка правил обфускации - отдельная полная страданий процедура).
Как бы то ни было, данный релиз - один из самых масштабных, и решение о его выпуске далось непросто, т. к. полностью переделан внешний вид Money Tracker. Это так называемый Material Design со своими достоинствами и недостатками.
Основное меню теперь спрятано в выдвижной боковой панели.
Работать с курсами валют теперь удобнее.

понедельник, 1 мая 2017 г.

Обновление Money Tracker 1.21

Для меня это очень важный релиз Money Tracker, потому что в нем наконец-то реализована настоящая синхронизация данных между устройствами. К сожалению, пока синхронизируются только проводки (доходы, расходы, переносы средств между счетами), а счет (счета), контрагентов, валюты и категории нужно обязательно привести в соответствие. Это очень важно! Причем не просто названия, а и внутренние идентификаторы тоже. Сложность в том, что без ручной правки JSON-файлов или без перетаскивания файлов из папки в папку этого пока что не сделать. Есть, чем заняться при подготовке следующего обновления.
Самый интересный момент в синхронизации - синхронизация проводок, относящихся к переносу со счета на счет. Эти проводки - парные (одна является расходом для одного счета, другая - доходом для другого), обе ссылаются друг на друга. Поскольку при синхронизации изменяются идентификаторы соответствующих строк в таблице, ссылки друг на друга становятся недействительными, и их приходится заменять в конце процесса синхронизации.
Еще один скользкий момент, для синхронизации нужно выбрать идентификатор устройства, если оно уже участвовало в синхронизации, либо ввести вручную. Но если ввести идентификатор "от балды", то в процессе синхронизации сервер "виснет", поскольку такая ситуация в нем не обрабатывается. Надо подправить и код сервера, благо у меня он выложен на GitHub.
Проводки, загруженные с другого устройства, отображаются светло-серым в списке проводок.

воскресенье, 30 апреля 2017 г.

Синхронизация в Money Tracker

Сегодня полдня помогал жене монтировать ее видеоролики, и в перерывах ковырялся со своим Money Tracker'ом. Поскольку моя половинка тоже ведет финансовый учет в Money Tracker, то задача синхронизации данных между нашими устройствами встала с первого дня.
До сегодняшнего дня синхронизацию я делал окольным путем почти вручную (комбинировал файл с моей резервной копией данными из ее резервной копии). Это довольно нудно, особенно если на втором устройстве накапливается много записей. Поэтому сегодня я слегка доработал экран резервного копирования.
  
Здесь у меня добавился пункт "Синхронизация данных", если выбрать его, станет доступным ввод ID синхронизируемого устройства, либо выбор из ID из списка ранее синхронизированных устройств.
ID устройства теперь можно  посмотреть в окне информации о программе. На картинке ниже виден ID устройства 4475.
Сам алгоритм примитивен. Каждая запись о доходах и расходах в текущей версии Money Tracker уже содержит ID устройства, на котором она создана. Поэтому при каждой синхронизации с первого устройства удаляются все записи, созданные вторым устройством, и загружаются вновь из его резервной копии. Плата за простоту - замедление процесса по мере увеличения количества записей. Сейчас синхронизирует по этому алгоритму пренебрежимо быстро.
Обновление выложу позднее, т. к. тестирование и все дела.

понедельник, 24 апреля 2017 г.

Обновление Money Tracker 1.20

Весеннее настроение дало повод перерисовать все иконки в моем личном финансовом менеджере Money Tracker и попутно исправить несколько небольших ошибок.
Рисовал все в бесплатном векторном редакторе LibreOffice Draw. Пока делал иконки, много раз вспомнил CorelDraw, и как все было удобно в нем. LibreOffice Draw это как "Москвич" среди автомобилей - простой, крепкий, вроде едет, а удобства - в "Мерседесе" :).
Но не это главное. Главное, как я все в итоге автоматизировал.
На каждой странице в моем графическом файле ровно одна векторная иконка.
Макрос, находящийся в том же файле, обрабатывает каждую страницу и сохраняет ее в отдельную растровую картинку и присваивает ей такое же имя, какое присвоено странице. Таким образом, через секунду после запуска макроса я получаю набор иконок заданного размера. Остается только закинуть их в ресурсы проекта Money Tracker и пересобрать приложение.
Вот мой исходник иконок:
Что касается ошибок. Краш приложения происходил на Android 6 при попытке бэкапа на карту памяти, т. к. Android 6 и выше мало разрешений при установке, ему нужно дополнительно дать разрешения и после установки. Это разумно, поскольку позволяет как дать разрешения, так и в любую секунду отозвать их. Мне нравится.
От краша я избавился, написав обработчик ситуации. Теперь Money Tracker на старших Android сделает запрос на доступ к карте памяти при необходимости. Если разрешение ему не дадут, функция бэкапа на карту памяти заблокируется, и все будут довольны.
Вторая ошибка это даже не ошибка. На экране, где вводят курс валюты (если делать это вручную), поле масштабировалось как попало, и могло "поехать" на некоторых разрешениях и при повороте экрана. Теперь масштабируется хорошо.
Третья ошибка - черный цвет текста на экране плановых проводок. Вообще, в используемой мной теме оформления обычный текст слегка серый, и смотрится лучше. Теперь и на экране с плановыми проводками такой же серый.
Текст макроса на LibreOffice Basic, если интересно (очень трудно на нем писать, почти нет документации):

Sub ExportPNG

REM Задайте размер иконки
size = 128

sLocation = StarDesktop.CurrentComponent.getLocation()
If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
End If
sDirectory = Tools.Strings.DirectoryNameoutofPath(sLocation, "/")    + "/"

Dim Page As Object

dim args2(6) as new com.sun.star.beans.PropertyValue
args2(0).Name  = "PixelWidth"        '
args2(0).Value = size
args2(1).Name  = "PixelHeight"
args2(1).Value = size
args2(2).Name  = "Compression"
args2(2).Value = 9
args2(3).Name  = "Interlaced"
args2(3).Value = 0
logicalSize = int(2540 * size / 96)
args2(4).Name  ="LogicalWidth"
args2(4).Value = logicalSize
args2(5).Name  ="LogicalHeight"
args2(5).Value = logicalSize
args2(6).Name  ="Translucent"
args2(6).Value = true

dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(1).Name = "MediaType"
args1(1).Value = "image/png"
args1(2).Name = "FilterData"
args1(2).Value = args2()
args1(3).Name = "SelectionOnly"
args1(3).Value = false

xExporter = createUnoService("com.sun.star.drawing.GraphicExportFilter")

For i = 1 To StarDesktop.CurrentComponent.drawPages.Count()
    Page = StarDesktop.CurrentComponent.drawPages(i - 1)
    args1(0).Value = sDirectory + size + "/" + Page.Name + ".png"
    xExporter.setSourceDocument(Page)
    xExporter.filter(args1())
Next

MsgBox "Экспорт успешно завершен"

End Sub

суббота, 22 апреля 2017 г.

Обновление English Club 1.28

Новые 30 слов (на самом деле 28) в разделе "File 7. House":
  • Балкон - balcony
  • Подвал, цокольный этаж - basement
  • Мы покрасили потолок белым. - We painted the ceiling white.
  • Нам нужно прочистить дымоход перед тем, как зажжем огонь. - We need to clean the chimney before we light the fire.
  • Город - city
  • Уютный - cosy
  • Страна, загородная местность, деревня - country
  • Восточное побережье - east coast
  • Камин - fireplace
  • Мы покрасили ворота в наш сад темно-зеленым. - We painted the gate to our garden dark green.
  • Первый, нижний, цокольный этаж - ground floor
  • Светлый - light
  • Наш дом делается из камня. - Our house is made of stone.
  • Современный - modern
  • Я люблю сидеть у открытого огня. - I like sitting by the open fire.
  • Я живу на окраине Бирмингема. - I live on the outskirts of Birmingham.
  • Путь, дорожка - path
  • Внутренний дворик - patio
  • Крыша - roof
  • Второй этаж - second floor
  • Просторный, вместительный - spacious
  • Ступеньки, шаги - steps
  • Терраса, веранда - terrace
  • Верхний этаж - top floor
  • Город, городок (но не “city”) - town
  • Я вырос в деревне в Уэльсе. - I grew up in a village in Wales.
  • Стена - wall
  • Деревянные полы - wooden floors

Изучайте английский язык с English Club и Oxford Team, и сможете рассказать любому иностранцу про дом или квартиру вашей мечты!

четверг, 16 марта 2017 г.

Обновление Money Tracker 1.19

Наконец добрался до своего приложения для управления личными финансами Money Tracker. Исправлений и доработок немного, самое сложное буду делать позже.
1) Самое грустное. В связи с выходом Android 7.1 обновилось ПО Android Studio, и я смог лично познакомиться с новым багом. Теперь контекстное меню стало выглядеть просто ужасно, полностью отличаясь от "выпадашек" комбо-боксов, и на его вид практически невозможно повлиять (даже цвет заголовка не изменить). Google, исправьте это, пожалуйста.
2) Исправлен код встроенного калькулятора. Раньше если два раза подряд нажать кнопку операции (например, "+"), то экран обнулялся. Теперь можно жать кнопки операций неограниченное количество раз. Кнопка, нажатая последней, определяет операцию, которая будет выполнена, если следом ввести число и нажать "=".
3) Куча информации теперь загружается в базу данных при первом запуске приложения. Например, категории, которые я вывел из собственного опыта эксплуатации приложения. Жаль, что я не догадался сделать это раньше, т. к. нормальные люди пугаются пустых экранов, где ничего не понятно.
В планах улучшение для повышения удобства совместного ведения доходов и расходов разными людьми (т. е. это и сейчас возможно, но дико неудобно потом вручную данные объединять).

понедельник, 13 февраля 2017 г.

Мое знакомство с GitHub

Ранее я делал простенький сервер на Java под названием MoneyTrackerServer. Задача сервера - принимать соединения Wi-Fi от устройств, на которых запущен мой Money Tracker, и обмениваться с ним данными. Проще говоря, делать резервные копии.
Кроме того, MoneyTrackerServer при должной сноровке и ручном редактировании дал мне возможность объединять расходы членов семьи, которые они ведут на своих устройствах, с моими расходами и доходами :).
Поскольку MoneyTrackerServer в версии 1 не имел окон, я реализовал взаимодействие с ним через иконку в системном трее. Но хочется большего, хочется нормального оконного интерфейса. Поэтому моя вторая версия MoneyTrackerServer использует библиотеку JavaFx. И вторую версию я решил опубликовать на GitHub, чтобы получить опыт работы с этой системой контроля версий.
Ссылка на исходники MoneyTrackerServer 2.0 - https://github.com/rgeta/MoneyTrackerServer.
Компилирую с помощью Eclipse (не обошлось без сложностей при импорте проекта с GitHub), но хочу попробовать ручную сборку, если будет время.

суббота, 21 января 2017 г.

Как в MoneyTracker отследить займы?

Почти каждый из нас занимал или давал деньги в долг друзьям или родственникам. И если вы делали это несколько раз до того, как долг возвращен, то можно запутаться, даже если суммы маленькие. А деньги, как известно, любят счет.
И вот я задумался: "Можно ли в текущей версии MoneyTracker отследить долги?".
Итак, первое, что я делаю, добавляю счет "Долги". В настройках ставлю признак "Вторичный счет", чтобы он разместился в конце списка счетов и выводился блекло. Положительные суммы на этом счете будут означать, что я должен кому-то, отрицательные, соответственно, - что мне должны.
В дальнейшем, если я, к примеру, даю кому-либо в долг или оплачиваю за кого-то покупку (с возвратом стоимости, разумеется), я не добавляю расход с одного из своих денежных счетов, а добавляю перенос на долговой счет. И уже на долговом счете я добавляю расход. Т. е. вместо просто расхода по одному из счетов я делаю перенос на счет "Долги" и уже на нем добавляю расход. Лишнее действие, но зато контроль долгов в рамках имеющегося функционала.
Можно, конечно, сделать разные счета "Я должен" и "Мне должны", но это дело вкуса.

Обновление EnglishClub 1.23

Сделал, наверное, самое незначительное обновление для моего приложения EnglishClub, чтобы попробовать версию English.UK для озвучивания фраз. При тестировании на моем смартфоне британский английский показался звучащим приятнее, не так искусственно. Что же, сейчас проверим.
Кстати, если на устройстве голосовой движок для британского английского не установлен, будет использоваться американский.
Попутно 4 фразы в БД, которые по причине моей невнимательности не попали ни в один урок, расставил по нужным местам.