среда, 9 ноября 2016 г.

Список android приложений на мой вкус 2


Для работы
Google keep - заметки с синхроницацией - можно посмотреть на компе
WPS Office - аналог Microsoft Office
Яндекс.Почта 
Exchange Calendar Sync - возможность подключиться к почте типа Microsoft Outlook без необходимости подтверждать права на удаления любой информации с телефона при подключении через стандартное приложение почты
Google Календарь
Диктофон - (стандартный)
Google Chrome - браузер
UC Mini - браузер с возможность выкачать только текст или сжимать картинки, удобно там где плохой инет
Калькулятор ++ - многофункциональный калькулятор

Связь
Skype - для видеозвонков
Viber - для аудио и текст общения
JusTalk - для видеозвонков - попробовать
True Phone - телефон
Textra SMS
Pasteasy - общий буфер между телефоном и компом по wifi
CopyCopy - общий буфер между телефоном и компом через аккаунт в инете
Kopy - общий буфер между телефоном и компом через аккаунт в инете с возможностью создавать временные сессии без регистрации
Фильтр SMS - блокирует смс (другое название Черный список)
Unified Remote - управление мышкой и клавиатурой и плеером
Wifi File Transfer -  ftp server
PC Remote - управление мышкой и клавиатурой и плеером, чуть полегче.
Оффлаин бекап контактов - ???

Город
Транспорт Самары - аналог Прибывалки
Яндекс.Такси
Яндекс.Карты - для России
Google карты - для заграницы
Семейный Локатор - альтернативы Life360GeoZilla, Местоположение, KidControl
Яндекс.Метро
Геотрекер - запись GPS треков
MAPS.ME - оффлайн карты
Афиша - развлечения в вашем городе
Почта России - слежение за посылками
Навител Навигатор - навигатор

Развлечения
YouTube - заменить
ВКонтакте
Rutor Parser  - скачивание торрентов с Rutor
Volume Booster - куча рекламы, но увеличивает звук в поезде\самолете
Мой Коктейль Бар - отличная программа для подбора коктейлей по ингредиентам и наоборот
MyShows - каталог сериалов, с возможность отмечать просмотренные и видеть расписание новых серий
MX Player - неплохой видео проигрыватель
VLC for Android - для нестандартный видео кодеков
Fire Place HD - костер на телефоне
Pi Music Player - отличный аудио проигрыватель
Flud - торрент-скачиватель
Earbits - каталог музыки

Другое
Галерея - (стандартная) для просмотра фото
ClockSync
Play Market - установка приложений для андройд
Фонарик - (стандартный)
Dormi - радионяня через wifi
Мировое время - виджет
Зеркало - (стандартный)
FM-радио - (стандартный)
Скриншот Легкий - программа делает скриншоты экрана телефона
Barcode Scanner - сканер QR кодов
KeePassDroid - хранитель паролей
SyncMe Wireless - синхронизация телефона с компом без проводов
TeamViewer - удаленный доступ к ПК
Яндекс.Переводчик - возможность делать перевод оффлайн.
Text Fairy - распознаватель текста по картинке
Musice Romantica - романтическая итальянская музыка
Тексты песен для Android - автоматически находит тексты песен

Чистильщики
CCleaner
Fast Task Killer - отлично чистит ОЗУ
Droid optimizer - устанавливать раз в год - отлично ищет логи которых за год набирается более 100 md
All-In-One Toolbox - чистильщик ОЗУ, ПЗУ, autorun


Инструменты для измерения
Ampere - можно измерить ток при зарядке и выкинуть старые провода\адаптеры
Sensor Box - разные датчики
Шумомер (Sound Meter)
Handy Tools - линейка, уровень и др.
GPS Test - более детальная информация о GPS спутниках, ее долгое включения помогает быстрее перенастроить спутники
Wifi Analyzer - проверка загруженности канала wifi
AnTuTu Benchmark - скорость телефона

Root программы
SuperUser - программа по раздачи прав разным приложениям (ставится через Kingo ROOT или др. подобных приложениях)
Kingo ROOT - программа для root телефона (см, например см. Root ZTE Blade X5)
Root Booster - ускоряет работу системы
Tegrak Overclock - разгон процессора, если, как для всех подобных приложений, есть поддержка со стороны ядра
Statrup manager - менеджер автозагружаемых приложений - лучше All-In-One Toolbox
Менеджер приложений Root - возможность удалить системные приложения, пернести приложения на карту памяти
L Speed - много твиков, но в расширенном режиме можно сломать систему.
Seeder - ускоряет обновление пула рандомных чисел

VR
Cedar Point VR - американские горки
HYUNDAI VR+

понедельник, 7 ноября 2016 г.

Root ZTE Blade X5

Несколько раз пытался сделать рут на своем ZTE Blade X5, но что-то не выходило. Однако недавно вышло. На всякий случай опишу как, может ком пригодится.
1) Отключить пароли при блокировке телефона.
2) Включить режим разработчика - в настройках 7 раз кликнуть на версию андройд, подробнее см.:
 3) В меню разработчика включить пункты:
  • отладка по usb;
  • заводская разблокировка.
4) Установить kingo root apk - см. https://www.kingoapp.com/root-tutorials/how-to-root-zte.htm 
5) Запустить установку, оставив все галочки по молчанию
6) После установки можно удалить приложения типа доктор батареи и др. главное оставить приложение SuperUser для последующей раздачи root прав приложениям.

PS: рут позволил мне удалить много логов, пару системных приложений, и отключить автозагрузку, что неожидано освободило 100mb оперативной памяти и место под установку десятка приложений, а также позволило установить пару твиков (см. статью, раздел Root программы). Это убрало заторможенность и повысило в антуту перформанс с 23к до 28к попугайчиков.

вторник, 25 октября 2016 г.

Rutor Parser

Предисловие
В интернете часто ходят слухи, что можно легко зарабатывать на мобильных приложениях. Где-то я видел статистику 100$ за 10 000 активных пользователей. Вот я и решил попробовать написать приложение, тем более что, наконец, нашлась нереализованная, на мой взгляд, идея, причем нужная мне самому.
Идея
Я иногда скачивают торренты на мобильный телефон, но заходить на сайт и пытаться там попасть в магнет-ссылку, а еще надоедливая реклама. Я залез в google play но там не было удобных приложения для rutor и rutracker (для rutracker появились некоторое время назад удобные приложения). Поэтому я решил написать такое приложение – парсер формы поиска rutor с большими кнопками для скачки. Естественно для самого скачивания нужно пользоваться торрент-клиентами типа Flud, utorrent и др.

Девелопмент
Разработка была сделана по принципу – быстро вывести проект на рынок, т.к. если гнаться за прекрасным, с точки зрения инженера, то можно надолго засеть за кодингом, а ведь еще есть работа\семья\отдых.
Пользователь нажимает на кнопку поиска. Загружаем html через библиотеку Jsoup. Запрос происходт на урл search для rutor с сортировкой по убыванию сидов. Делаем это в отдельном треде, чтобы не лочился экран (требование гугла). Далее парсим html – выкусываем магнет-ссылки и описание. Затем результат кладем в WebView. Причем результат оформлен в виде простой верстки. Благодаря WebView магнет-ссылки положенные в тег <a> отлично распознаются сторонней программой торрент-клиентом и после нажатия на ссылку открывается программа с запросом на скачивание.
Подробнее см. исходный код (код несколько устарел) – здесь.

Все технические вопросы легко решались поиском в интернете. Единственно, что не очень понятно это описание как сделать приложение signed и подключить рекламу – пришлось внимательно читать, что написано.

Перечислю некоторые сложности и их решения.
  1. Обычно для того чтобы отобразить html используется WebView#loadData, но это метод не понимает русский язык, поэтому нужно пользоваться WebView#loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
  2. Чтобы получить русский язык из EditText нужно делать такой финт String searchText = new String(searchEditText.getText().toString().getBytes(), "UTF-8");
  3. Компиляция программы вызывала ошибку, когда я пытался анализировать DOM-дерево в главном треде. Решение простое – использовать AsyncTask
  4. Прежде чем выложить приложение его нужно подписать иначе google play его не позволить выложить. Решение этой проблемы можно прочитать здесь.
  5. Выкладывание приложения происходит не мгновенно - решение - просто нужно подождать. Обычно в течение часа, но на выходных у меня было ожидание 1 день.
Цифры
Я потратил суммарно 16mh (man hour):
  • 1h – дизаин
  • 7h – билд
  • 3h – регистрация на сервиса google
  • 2h – на написание этой статьи
  • 3h – багофикс по фидбеку от коллег\друзей + ожидание из-за не многовенной публикации на google play   

Планы
Есть много планов на добавление новой функциональности: поддержки топ вкладки, rutracker, планшетного режима; рефакторинг кода. Ну и проверить, сколько субективно для меня дает заработать реклама от google. И конечно жду вашего фидбека.

четверг, 1 сентября 2016 г.

Мои вопросы для собеседования

Как то раз пришлось вести собеседования и я решил подготовить для себя список вопросов, точнее ответов, чтобы не сесть в лужу. Вот что получилось. Заранее скажу не претендую на "правильность" вопросов, т.к. я не профессиональный собеседователь.

General

So you are going to work for us?

Spring

Will it work or not?

@Controller class MySpringBean {
    @Autowire MyAnotherBean field;
}
@Controller class MyAnotherBeanA extends MyAnotherBean {}
@Controller class MyAnotherBeanB extends MyAnotherBean {}

Ways to handle exception without try-catch

@Service class MySevice {
    @ExceptionHandler(RuntimeException.class) void handle() {}
}
@Controller class EH implements HandlerExceptionResolver {
    resolveEx() {}
}
@ControllerAdvice class GlobalEh {
    @ExeptionHandler()
    resolveEx() {}
}
@Controller class EHInterceptor implements HandlerInterceptor {}

Null view

class MyController implements Controller {
    ModelAndView handlerequest(req, res) {
        return null;
    }
}
Also ask what spring will do if we return normal ModelAndView – it will resolve view and put data to response

Java

  • == VS equals
  • String s1 = “a1”, s2=”a2”; s1==s2
  • Object o1 = null; o2 = new SomeClass(); o1.equals(o2), o1==o2; o2=null, o1==o2//true
  • Sort array
  • Public MyClass {void make(){}} – what visibility level does method have without any access modifiers?
  • Find max in array - O(?)
  • HashMap#get – O(?) //O(1) – O(n)
  • Class MyR implements Runnable {}
  • (new MyR()).run() VS (new Thread(new MyR())).start()
  • SPI (Service provide interface)? //loader = ServiceLoader(MyClass.class); loader.iterator()
  • Statefull VS stateless

Servlet/JSP

  • Servlet VS Jsp
  • 1xx, 2xx, 3xx, 4xx, 5xx http codes?
  • What does browser do with 302 code? //Location
  • GET VS POST? Else? //PUT, DELETE

Servlet registration

<servlet>
  <servlet-name>register</servlet-name>
  <servlet-class>…</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>register</servlet-name>
  <url-pattern>/blue/</ url-pattern>
</servlet-mapping>

Right way of catching exception in filter

class MyFilter implements Filter {
    void init() {}
    void doFilter(req, res, chain) throws ServletException {
        try {
            chain.doDilter(req, res)
        } catch (ServletException e) {
            throw e;
        } catch (Exception) {
            throw new ServletException(e);
        }
    }
}

Order of filters

<filterMapping/>

Forward VS Redirect

Forward – on a server, servlet forward, same request to different URL without browser notification
Redirect – via 302 using browser, new request is created so we cannot access to data from first request

SQL

  • Find max in table column
  • Joins definition (eiler circles)
  • Make join //select * from Person inner join City on Person.CityId = City.Id

Html/Css

  • Fixed VS absolute
  • do we have these tags in html4?
  • Link js only for ie? <!—[if IE]>
  • Ccs hack for ie? .style{_background:#F00}
  • Graceful degradation?
  • Visibility:hidden VS display:none //not occupy space

JS

  • ‘use strint’; x = 5; //error in ff44, chrome48, ie10
  • == VS ===
  • sourceMaps
  • private method in JS
(function() {
  function my() {
    alert(‘hello’);
  }
  window.myAPI = my;
})(); //js closure
  • Show alert with vertical scroll value
var timeout
function my scroll() {
  clearTimeout(timeout)
  timeout = setTimeout(function() {
    alert(document.body.scrollTop);
  }, 500);
}
  • Write program with text and button on button click the text should appear
  • localStorage? //setItem
  • XSS/ CSRF protection way //recheck your knowledge
  • Cross domain ajax call? //yes if server provide x-domain or proxy

GWT

  • Acess to js
static native void method() /*-{
       $wnd.alert(‘q’);
}-*/;
  • EventBus
  • Can we use 2 super dev mode simultaneously //-codeServerPort 9901
  • Simple task to write panel, label, button and click on button
  • UIBinder
  • If we have a lot of data what type of widget should we use //Cell Tablem cell widget
  • GWT.create(MyInterface.class) what we need to do to create interface?

JQuery 

  •  <div class=’somename’/> //$(‘.somename’);
  •  <div class=’some.name’/>  //$(‘.some\\.name’);
  • $(selector).toogle();
  • .position() VS .offset() //relative to parent, to document

Patterns

MVC

MVC is complex pattern. It consists from Observer (Model notifies View) and Strategy (View chooses Controller)

Strategy


Observer

Singelton

Complex variant:
public class Singelton {
    private static Singelton INSTANCE = null;
    public static Singelton getSingelton() {
        if (INSTANCE == null) {
            synchronized (INSTANCE) {
                if (INSTANCE == null) {
                    INSTANCE = new Singelton();
                }
            }
        }
        return INSTANCE;
    }
}

пятница, 5 августа 2016 г.

Как сделать бесплатный screencast

Если вы захотите записать screencast то можете столкнуться с проблемой, что многие бесплатные программы: добавляют водяные знаки, не дают записывать больше N минут, при записи происходит рассинхрон звука и видео. Пройдя через более 15 программ я вынес для себя следующий процесс записи screencast’а.
Для начала запишем видео. Для этого воспользуемся Free Screen Video Recorder
Здесь в опциях выберем наиболее качественную картинку и аудио. Лучше записывать в максимальном разрешении, т.к. если записывать в 720p, то на 1080p экране видео будет смотреться не очень. Но даже в этой программе после 5 минут может начаться рассинхрон.
Далее записанное видео нужно перегнать из mp4 в avi, т.к. следующим шагом будет использоваться Window Movie Maker, а он плохо работает с mp4. Для конвертации воспользуетмся программой Any Video Converter.
Важная деталь – качество видео должно быть не меньше, чем в исходном файле, иначе качество картинки может значительно упасть, даже при понижении на несколько битрейтов. Чтобы узнать битрейт нужно посмотреть свойства видео файла.
Далее видео нужно закинуть в Movie Maker. Тут можно нарезать и склеить видео, добавить эффекты, фото и музыку. При склейке видео стоит увеличить звук на максимум, т.к. обычно звук от стандартного микрофона не очень громкий.
Затем сохраним видео.
Для этого выбере создание своих параметров видео. Но не забывайте, что нужно использовать оригинальные зарактеристика размера картинки и не меньший битрейт.
Следующий шаг можно пропустить, но у меня как выяснилось, что на большинстве наушников был тихий звук. Для решения этой проблемы воспользуемся Format Factory
Для повышения звуку выберите +12dB в настройках.
Нужно обязательно сделать конвертацию в mp4 с видео кодеком H264 и аудио MP3\ACC, т.к. в противном случае могут быть проблемы при выкладывании видео в тег <video>, если же вы выкладываете видео в видео сервис типа youtube, то в них есть встроенные конверторы, которые смогут распознать большинство распространённых видео.
И в заключении можете выложить видео к себе на сайт, например при помощи тега <video>:
    <video width="600" controls="controls">
        <source src="video.mp4">
    </video>