четвер, 13 лютого 2020 р.

Adapter pattern

Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.

Визначення

Патерн адаптер(Adapter) або ж обгортка (Wrapper) використовується для трансляції інтерфейсу одного класу в інтерфейс іншого. Це означає, що ми можемо зробити так, щоб класи працювали разом, хоча вони мають несумісні інтерфейси. Клас адаптер використовує множинне успадкування (розширяючи один клас і/або реалізуючи один або більше класів), щоб адаптувати один інтерфейс до іншого. Об’єкт адаптер покладається на агрегацію об’єктів.

Де використовується
  • Коли ви хочети використовувати існуючий клас, але його інтерфейс не зіставляється з тим який вам потрібен
  • Коли ви хочете створити повторно використовуваний клас, що взаємодії з непов’язаними або невідомими наперед класами, що є класами, що необов’язково мають сумісний інтерфейс.
  • Коли ви хочете збільшити прозорість класів
  • Коли ви хочете створити вбудовуваний набір.

вівторок, 27 листопада 2018 р.

JAXB: розпаковування та генерування XML документів

JAXB (Java Architecture for XML Binding) дозволяє швидко розпакувати (unmarshall) xml файл у об’єкти та згенерувати/запакувати (marshall) xml із об’єкту. JAXB використовується, зокрема, при розробці RESTtful Веб-сервісів, коли необхідно швидко згенерувати xml у якості відповіді клієнту або розпакувати із http запиту.
Для прикладу є простий XML документ:
<?xml version="1.0" encoding="UTF-8"?>
<Data>
 <id>1</id>
 <name>Галина Мер</name>
 <mobile>+380970000001</mobile>
</Data>

Для того, щоб розпакувати наш xml об'єкт нам потрібен клас із відповідною анотацією.

субота, 3 листопада 2018 р.

Нейронні мережі в R

Із CRAN можна звантажити декілька пакетів реалізацій нейронних мереж на R (nnet, neuralnet, deepnet), крім них доступні пакети в основі яких лежать реалізації на інших мовах. Це такі пакети як MXnet, darch, deepnet, h2o, Keras, TensorFlow.
Простий приклад використання neuralnet:

library("neuralnet")
input<-c(0,1,2,3,4,5,6,7,8,9,10)
output<-c(0,1,4,9,16,25,36,49,64,81,100)
mydata<-cbind.data.frame(input,output)
attach(mydata)
#навчити мережу базуючись на input та output
model=neuralnet(
  formula=output~input,
  data=mydata, #дані
  hidden=10, #кількість нейронів в прихованому шарі
  threshold=0.01 #поріг спрацювання
)
print(model)
#виводимо схему нейронної мережі
plot(model)
#Перевіряємо дані - фактичні та прогнозовані
final_output=cbind(input, output, as.data.frame(model$net.result))
colnames(final_output)=c("Input", "Expected Output", "Neural Net Output")
print (final_output)

Схема виведеної нейронної мережі:

неділя, 28 жовтня 2018 р.

Лінійна регресія в R

Загальний формат для лінійної моделі:
response~op1 term1 op2 term 2 op3 term 3…
де term — об’єкт або послідовність об’єктів, op — оператор, такий як +, -, що вказує як term буде включений у модель. Таблиця нижче включає деякі корисні приклади. Запримітьте, що математичні символи в колонці "Синтаксис" використовуються для визначення моделі, а не в в їхньому нормальному розумінні.

Приймемо, що Y - залежна змінна, A,B,C - незалежні змінні, що можуть впливати на Y. b1,b2, b3 - коефіцієнти моделі, що розраховуються.


Синтаксис
Модель
Коментарі
Y~A
Y=b0+b1A
Пряма лінія із неявно вказаним перетином осі y.
Y~-1+A
Y=b0+b1A+b2A
Пряма лінія без перетину осі y, тобто підігнана лінія проходитиме через (0,0)
Y~A+I(A^2)
Y=b0+b1A+b2A2
Поліномна модель, функція I() – дозволяє в модель включати нормальні математичні символи.
Y~A+B
Y=b0+b1A+b2B
Модель першого порядку, без взаємодії незалежних змінних
Y~A:B
Y=b0+b1AB
Модель, що містить лише взаємодії першого порядку між A та B
Y~A*B
Y=b0+b1A+b2B+b3AB
Повна модель першого порядку, еквівалентний код: Y~A+B+A:B
Y~(A+B+C)^2
Y=b0+b1A+b2B+b3C+b4AB+b5AC+b6AC
Модель, що включає всі явища першого порядку та взаємодії до n-го порядку, де n задається як ()^n. Еквівалентний вираз:
  Y~A*B*C-A:B:C.

Базовий синтаксис для розрахунку моделі в R методом найменших квадратів:
lm(Y~model)
де Y – об’єкт, що містить залежну змінну, що буде прогнозуватися, а model – це формула для вибраної математичної моделі (див. таблицю вище). Одержати сукупну інформацію про модель можна за допомогою функції summary().
mymodel=lm(Y~A)
summary(mymodel)
в результаті буде виведена інформацію про вид моделі та статистичні оцінки моделі.

Перевірити модель на нових даних можна з допомогою функції predict()

Джерело:
* Using R for Linear Regression

вівторок, 17 липня 2018 р.

Дозволи доступу в Android 6 та вище (Android permissions)

В андроїді 6 було переглянуто концепцію надання доступу. Раніше розробник у файлі manifest.xml вказував дозволи на доступ до компонентів мобільного таким чином:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.CAMERA"/>

Цього було досить в попередніх версіях андроїда. Користувач при встановленні програми підтверджував ці доступи і програма отримувала доступ до необхідних засобів. Такий підхід призвів до проблеми пов’язаної із тим, що програми-шпигуни могли без відома користувачів отримувати від них інформацію і передавати стороннім особам. Тож в андроїд 6 та вище необхідно додатково писати код, який би запитував користувача про надання доступу. Зокрема необхідно запитувати дозвіл на доступ до камери, списку контактів, місця розташування тощо. При чому дозволи діляться на групи, якщо ви запитали доступ на читання зовнішньої сховища даних, то вам автоматично дається дозвіл на запис до цього сховища. Крім того самі дозволи діляться на нормальні та небезпечні. Нормальні не несуть небезпеки конфіденційності користувачу.

Для отримання дозволу, які класифіковані як небезпечні, необхідно зробити декілька кроків:
1) Перевірити чи раніше не був даний такий доступ
2) Якщо доступ не надано, то запитати користувача
3) Перевизначити метод onRequestPermissionsResult(), який би перевіряв чи користувач прийняв запит чи відхилив і в залежності від того здійснити подальші дії.

Такі дії необхідно виконувати, якщо targetSdkVersion 23 або вище. Якщо цільова версія нижче 23, то ці програми працюють як раніше на новіших версіях андроїда. Щоправда, гугл плей зараз настійливо рекомендує націлювати програми на останні версії андроїда.

При написанні програми в маніфесті, як і раніше необхідно вказувати відповідні рядки з uses-permission.

Допустимо необхідно написати програму для доступу до контактів та камери користувача. Для цього зробимо просту активність із двома кнопками "Контакти" та "Камера":


субота, 3 лютого 2018 р.

ListView з власним адаптером (Android)

Стандартні адаптери для ListView реалізовані для простих стандартних списків, які складаються або з простих текстових полів, або з текстових полів та якогось перемикача (прапорця або радіокнопки). Якщо необхідно реалізувати, щось інше, то необхідно реалізувати власний адаптер, який би відображав пункти списку в потрібному вигляді.

Завдання
Реалізуймо список, який би відображав телефонну книгу і кожен пункт включав би фото, ім’я та номер телефону. Після натиснення на пункті списку виводитиметься відповідне повідомлення.

Підготовка
Спочатку створюємо проект з пустою активністю ListActivity.java 
У папочку res/drawable необхідно закинути зображення, які будуть використовуватися в якості фото.

Для того, щоб програма запрацювала нам знадобиться чотири файли:
ListActivity.java – головна активність програми
Person.java – клас, що містить інформацію про особу (фото, ім’я та телефон)
activity_list.xml – макет активності ListActivity.java (містить віджети TextView та ListView)
item_list.xml – макет пункту списку, в якому вказується як відображатиметься фото і текст, відображенням його на екран займатиметься адаптер, що буде внутрішнім класом у ListActivity.java.

субота, 27 січня 2018 р.

Простий ListView (Android)

Віджет ListView – часто застосовуваний елемент графічного інтерфейсу користувача в Android. Він дозволяє виводити ряд елементів на екран у вигляді прокручуваного списку. При натисненні на елементі списку, може виконуватися певна дія, наприклад, відкриття нової активності з додатковими деталями списку.

Задача
Вивисте список пристроїв. При натисненні певного пункту виводитиметься відповідне повідомлення.
1. Створюємо нову активність ListActivity