воскресенье, 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, и сможете рассказать любому иностранцу про дом или квартиру вашей мечты!