Поиск по этому блогу

среда, 25 декабря 2013 г.

Android. Получаем Google Account пользователя

Необходимо получить данные об аккаунте (или аккаунтах) пользователя Android устройства. Для этого необходимо использовать класс AccountManager.


1. Добавим необходимое разрешение в файл AndroidManifest.xml

<?xml version='1.0' encoding='utf-8'?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  ..
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
</manifest>

2. Получаем аккаунты всех пользователей

AccountManager accountManager = (AccountManager)getSystemService(ACCOUNT_SERVICE);
Account[] accounts = manager.getAccounts();

3. Получаем только аккаунты, которые email

Pattern emailPattern = Patterns.EMAIL_ADDRESS;
AccountManager accountManager = (AccountManager)getSystemService(ACCOUNT_SERVICE);
Account accounts[] = accountManager.getAccounts();
for (Account account : accounts) {
  if (emailPattern.matcher(account.name).matches()) {
    String accountName = account.name;
    ...
  }
}

4. Получаем только гугловые аккаунты

AccountManager accountManager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account accounts[] = accountManager.getAccountsByType("com.google");
Account account;
if (accounts.length > 0) {
  account = accounts[0];
} else {
  account = null;
}

воскресенье, 22 декабря 2013 г.

Ресурсы для изучения разработки под Android


Указаны в порядке полезности для меня при изучении.

1. Startandroid - полезные уроки от самого начала (для тех кто никогда не писал для Android)

http://startandroid.ru/ru/uroki/vse-uroki-spiskom.html

2. DevColibri - очень много полезных рецептов

 http://devcolibri.com/category/android/

3. Developer.Android - официальное руководство от Google

 http://developer.android.com/training/basics/firstapp/index.html

суббота, 7 декабря 2013 г.

Полезные книги по Web Технологиям

Решил публиковать полезные книги по Web -технологиям. Ведь настоящий мастер всегда должен читать много литературы по своему профилю. Так как последнее время занимаюсь jQuery Mobile, то первая книга это

1. Pro jQuery Mobile

Официальный сайт издательства http://www.apress.com/9781430239666
Год: 2011
Автор: Brad Broulik
Издательство: Apress
Язык: Английский
Количество страниц 268 
Уровень пользователя: От среднего до продвинутого
Доступные форматы: EPUB, MOBI, PDF

пятница, 6 декабря 2013 г.

jQuery Mobile: Обработка динамически добавляемых элементов

В jQuery Mobile при динамическом добавлении элементов на страницу может возникнуть проблема с корректным отображением добавленных элементов. Любой виджет ('элемент) jQuery Mobile может быть динамически обновлен после добавления.

Динамически добавленный список до обновления

Динамически добавленный список после обновления


Кросбраузерный скроллинг с библиотекой iscroll 5


1. Сайт автора  и небольшая инструкция http://cubiq.org/iscroll-5-ready-for-beta-test

2. Ссылка на GitHub https://github.com/cubiq/iscroll

3. Очень интересный пример, в котором добавляется горизонтальная прокрутка при помощи iscroll, но при этом сохраняется нативная вертикальная прокрутка. Такую реализацию удобно использовать, если приложение будет запускаться на мобильном устройстве.

 http://lab.cubiq.org/iscroll5/demos/event-passthrough/


четверг, 5 декабря 2013 г.

Save application data on mobile device in phonegap with WebSQL

Как хранить настройки приложения сделанного в PhoneGap. Например, необходимо чтобы пользователь ввел какие-то настройки в приложении, сохранил их и при следующем запуске программы настройки загрузились и выставились в приложении. Для этого нам понадобится WebSQL.



Сохраняем параметры в базу данных. Открываем соединение с базой и пытаемся добавить данные.
saveSearchSetting: function () {
 
   ... 
 
   var db = window.openDatabase("saved_settings", "1.0", "SEARCH_SETTINGS DB", 1000000);
   db.transaction(page.populateDB, page.errorCB);
 
}

Заполняем базу данных.
populateDB: function (tx) {
  tx.executeSql('DROP TABLE IF EXISTS SEARCH_SETTINGS');
  tx.executeSql('CREATE TABLE IF NOT EXISTS SEARCH_SETTINGS (id unique, paramName, paramValue)');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (1, "fromCity", "' + page.fromCity + '")');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (2, "toCity", "' + page.toCity + '")');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (3, "deviceName", "' + page.deviceName+ '")');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (4, "categories", "' + page.categories+ '")');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (5, "types", "' + page.types+ '")');
  tx.executeSql('INSERT INTO SEARCH_SETTINGS (id, paramName, paramValue) VALUES (6, "pageNumber", "' + page.pageumber+ '")');
}

Загружаем сохраненные настройки. Пытаемся подключится к базе данных.
loadSavedSearchSettings: function () {
  var db = window.openDatabase("saved_settings", "1.0", "SEARCH_SETTINGS DB", 1000000);
  db.transaction(page.queryDB, page.errorCB);
}

Если подключится к базе удалось, тогда пытаемся выполнить запрос к базе данных.
queryDB: function(tx) {
  tx.executeSql('SELECT * FROM SEARCH_SETTINGS', [], page.querySuccess, page.errorCB);
}

Обработчик в случае ошибки при обращении к базе данных.
errorCB: function (err) {
  page.findGeolocation();
}

Если удалось получить данные в результате запроса к базе, то тогда сохраняем эти данные в переменные, которые потом используем для заполнения форм ввода на экране.
querySuccess: function(tx, results)  {
  var len = results.rows.length;
  for (var i=0; i<len; i++){
    if (results.rows.item(i).id == 1) {
      page.fromCity =  results.rows.item(i).paramValue;
    }
    if (results.rows.item(i).id == 2) {
      page.toCity =  results.rows.item(i).paramValue;
    }
    if (results.rows.item(i).id == 3) {
      page.deviceName=  results.rows.item(i).paramValue;
    }
    if (results.rows.item(i).id == 4) {
      var str =  results.rows.item(i).paramValue;
      page.categories = str.split(",");
    }
    if (results.rows.item(i).id == 5) {
      var str =  results.rows.item(i).paramValue;
      page.types = str.split(",");
    }
    if (results.rows.item(i).id == 6) {
      page.pageNumber = results.rows.item(i).paramValue;
    }
  }
  page.fillForm();
}

PhoneGap findGeoLocation script and GeoLocationPlugin

Необходимо было встроить в мобильное приложение определение текущей геопозиции, причем не просто координат, а именно название населенного пункта. Отыскал скрипт, который определяет геокоординаты  и на основании этих геокоординат определяет название населенного пункта. Исходный скрипт был предназначен для работы только в браузере. Функциональность этого скрипта нужно было использовать в нашем мобильном приложении, которое делается с применением технологии Phonegap.


понедельник, 2 декабря 2013 г.

jQuery Post Request with $.ajax

Как передать JSON на сервер с помощью jQuery. Для этого нам понадобится отправить на сервер POST-запрос и прикрепить к нему нужный нам JSON. Допустим надо отправить на сервер JSON следующего вида {"userEmail": "xxx@xx.xx", "password":"xxxx"}. Для этого нам понадобится метод jQuery $.ajax().
1. Указываем тип запроса type: "POST"
2. Указываем тип пересылаемых и принимаемых данных 
accept: "application/json",
contentType:"application/json",
dataType:"json",
3. Формируем JSON, который будем отправлять
data:JSON.stringify({ "userEmail": "xxx@xx.xx", "password":"xxxxxx" })

Клиентская часть на jQuery
$.ajax(
  {
    type: "POST",
    accept: "application/json",
    contentType:"application/json",
    dataType:"json",
    data:JSON.stringify({ "userEmail": "xxx@xx.xx", "password":"xxxxxx" }),
    url:"http://someservice/rest/users/authorize",
    success: function(response) {
    },
    error: function() {
      alert("LOGIN FAIL");
    }
  }
);

Серверная часть на Java
@Path("/users")
public class UserResource extends AbstractCrudResource<User> {
 
  private UserManager manager = UserManager.getInstance();
 
  private UserDao userDao = UserDao.getInstance();
 
  @POST
  @Produces(MediaType.APPLICATION_JSON)
  @Path("/authorize")
  public Response authorize(@Context HttpServletRequest request, 
    UserDTO userDTO) {
    if (userDTO.getUserEmail() != null) {
      User user = manager.retrieveUserByEmail(userDTO.getUserEmail());
      if (user != null) {
        if (user.getPassword().equals(
          userDao.getPasswordMD5Hash(userDTO.getPassword()))) {
 
          ...
 
        }
      }
    }
  }
}

Модель данных JSON которой пересылается 
public class UserDTO {
 
  private Long id;
 
  private String password;
 
  private String userEmail;
 
}

четверг, 28 ноября 2013 г.

jQuery Mobile Remote AutocompleteView. Доделываем и исправляем баги.

Элемент AutoComplete - это поле ввода, в котором после ввода в него определенного количества символов появляется список возможных вариантов. Например, вводим несколько букв из названия города и появляется список возможных городов. Пример на jQuery Mobile можно посмотреть тут.
http://view.jquerymobile.com/1.3.2/dist/demos/widgets/autocomplete/

Пример со списком городов, которые еще и загружаются при помощи вызова удаленного метода здесь.
http://view.jquerymobile.com/1.3.2/dist/demos/widgets/autocomplete/autocomplete-remote.html

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


Задачи

1. По нажатию на элемент списка добавлять этот элемент в поле ввода и закрывать список
2. Устранить баг с выводом пустой строки (Пустая строка выводится в том случае если введено три или более символов но совпадений не найдено)



среда, 27 ноября 2013 г.

Делаем Sprite для jQuery Mobile

Спрайт (в данном случае речь идет о CSS-спрайте) - это рисунок, внутри которого располагаются несколько изображений. Спрайт применяется для ускорения работы приложения, так как нужно будет загрузить только одно изображение и потом уже брать кусочки этого изображения и применять их в своем приложении. Для того чтобы получить необходимый кусочек спрайта необходимо использовать CSS. Я хочу рассказать о том, как создать вот такой спрайт и как его использовать.




суббота, 2 ноября 2013 г.

Какие устройства получат Android 4.4

Android 4.4


31 октября 2013 года в Сан-Франциско корпорация Google представила свою новую мобильную операционную систему — долгожданную Android 4.4 KitKat. Также Google анонсировала смартфон Nexus 5 сделанный совместно с компанией LG. Новый Nexus 5 уже стал доступным для покупки через магазин Google Play. Теперь всех пользователей Android девайсов интересует один вопрос  - какие еще устройства получат обновление до Android 4.4. 





понедельник, 28 октября 2013 г.

Список вопросов на собеседовании Java программиста

У меня вышло приложения для iOS. Называется Java справочник.



I. Основы ООП


1. Основные принципы ООП

2. Что такое инкапсуляция? Пример инкапсуляции на Java

3. Что такое наследование? Как реализовано наследование в Java

4. Что такое полиморфизм? Пример полиморфизма на Java 

5. Что такое абстракция? Пример абстракций на Java

II. Java Core


1. Класс StringTokenizer

2. Разница между final, finally и finalize()

3. Разница между String, StringBuffer и StringBuilder

5. Чем абстрактный класс отличается от интерфейса

6.  Переопределение и перегрузка методов в Java

7.  Что такое рефлексия в Java

8. Клонирование объектов. В чем отличие между поверхностным и глубоким клонированием

9. Что такое сериализация и десериализация

10.  Модификаторы доступа в Java

11. Как работает блок try-catch-finally

12. Что такое Autoboxing

13. Основные методы класса Object. Правила переопределения основных методов класса Object

14. Класс String

15. Разница между & и &&

16. Что такое сборщик мусора? Можно ли его вызвать?

Collection Framework


1. Разница между LinkedList и ArrayList

2. Разница между HashSet и TreeSet

3. Как устроена HashMap

4. Разница между HashMap и Hashtable

5. Разница между Vector и ArrayList

6. Разница между HashMap и TreeMap

7. Разница между интерфейсами Comparable и Comparator?

8. Для чего нужны классы Collections и Arrays?

SQL


Шаблоны проектирования


1. DAO (Data Access Object)

2. DTO (Data Transfer Object)

3. Singleton (Одиночка)


Get it on Google Play


Вопросы на собеседовании Java программиста. Класс StringTokenizer

Класс StringTokenizer предназначен для разбора строки на составные элементы. Используя этот класс можно выделить из строки слова, задав какие разделители находятся между словами.

Конструкторы класса StringTokenizer


1. StringTokenizer tokenizer = new StringTokenizer(String str) - с помощью этого конструктора мы можем создать объект, который позволит нам разбить строку str на слова разделенные пробелами или следующими символами: символ табуляций '\t', символ перевода строки '\n' и символ возврата каретки '\r'.

String str1 = "This is Sparta";
StringTokenizer tokenizer1 = new StringTokenizer(str1);

2. StringTokenizer tokenizer = new StringTokenizer(String str, String delim) - с помощью второго конструктора мы можем задать разделители использую второй параметр конструктора delim. Например, ";:,. " - тут последним разделителем задан пробел, если его не указать, то пробел не будет считаться как разделитель, если мы используем этот конструктор. 

String str2 = "This,is.second;example:of StringTokenizer";

StringTokenizer tokenizer2 = new StringTokenizer(str2, ",.:; ");

3. StringTokenizer tokenizer = new StringTokenizer(String str, String delim, String returnDelims) - используя этот конструктор, можно задать через третий параметр returnDelims, чтобы разделители включались в число слов. Если returnDelims равно true, то разделители будут включены в число слов, если false, то не будут.

String str3 = "This,is.third;example: of that post";
StringTokenizer tokenizer3 = new StringTokenizer(str3, ",.:; ", true);

Методы класса StringTokenizer


Для демонстрации того, как работать с классом StringTokenizer я буду использовать три основных метода этого класса:
1. Метод int countTokens() - возвращает количество слов разделенных заданными разделителями
2. Метод boolean hasMoreTokens() - возвращает true, если в строке есть еще слова, в противном случае возвращает false
3. Метод String nextToken() - возвращает следующее слово

Исходный код программы, показывающей как использовать класс StringTokenizer

import java.util.StringTokenizer;
 
public class StringTokenizerExample {
 
  public static void main(String[] args) {
 
    System.out.println("Example of how work first constructor of StringTokenizer"); 
 String str1 = "This is Sparta";
 StringTokenizer tokenizer1 = new StringTokenizer(str1);
 System.out.println("Count of tokens in string str1: " + tokenizer1.countTokens());
 while (tokenizer1.hasMoreTokens()) {
   System.out.println(tokenizer1.nextToken());
 }
 
 System.out.println();
 System.out.println("*******************************************************"); 
 System.out.println();
 
 String str2 = "This,is.second;example:of StringTokenizer";
 StringTokenizer tokenizer2 = new StringTokenizer(str2, ",.:; ");
 System.out.println("Count of tokens in string str2: " + tokenizer2.countTokens());
 while (tokenizer2.hasMoreTokens()) {
   System.out.println(tokenizer2.nextToken());
 }
 
 System.out.println();
 System.out.println("*******************************************************");
 System.out.println();
 
 String str3 = "This,is.third;example: of that post";
 StringTokenizer tokenizer3 = new StringTokenizer(str3, ",.:; ", true);
 System.out.println("Count of tokens in string str3: " + tokenizer3.countTokens());
 while (tokenizer3.hasMoreTokens()) {
   System.out.println(tokenizer3.nextToken());
 
 }
 
  }
 
}

Результат работы программы



четверг, 24 октября 2013 г.

Продвижение блога через Google Play и Android

Нужны новые клиенты? Оригинальный подход для привлечения новых посетителей на сайт придумали ребята из NewApp (www.newapp.pro).

Они создают мобильные приложения с контентом близким по тематике к материалам сайта.
Добавляют в приложение ссылки на сайт. Публикуют приложения в Google Play. После это народ скачивает интересующие их приложения и автоматически направляется на нужный сайт.
А если учесть, что качают приложения из Google Play днем и ночью, то и поток на сайт будет бесконечным!

Теперь появились мысли использовать их подход для продвижения своего блога ;-)
А NewApp пожелаю дальнейших успехов и побольше интересных решений )




воскресенье, 13 октября 2013 г.

Native JavaScript document.getElementById vs jQuery $()

Разница между нативным JavaScript методом document.getElementById() и jQuery методом $()

Метод document.getElementById() возвращает HTML DOM объект
document.getElementById('contents');

Метод jQuery $() возвращает jQuery объект, который является оберткой над DOM объектом и обеспечивает методы jQuery
var contents = $('#contents');


суббота, 12 октября 2013 г.

Native javascript .appendChild Vs jQuery .append() methods

Разница между нативным javaScript методом appendChild() и jQuery методом append заключается в следующем:
appendChild() - это чистый DOM метод (нативный javaScript метод) для добавления дочернего элемента.
document.getElementById('mainElement').appendChild(newElement);

append() - это метод библиотеки jQuery, позволяющий добавить некоторый контент или HTML к элементу. Также метод append() способен принимать несколько входящих параметров
$('#mainElemnt').append('Some text or HTML');

Как добавить рекламу AdMob в Android PhoneGap приложение

PhoneGap это инструмент, позволяющий разрабатывать приложения на JavaScript и конвертировать их в нативные приложения мобильных платформ (такие как Android и iOS). AdMob это платформа для подключения рекламных баннеров в ваше приложения за просмотры и клики по которым можно получать деньги. Здесь я расскажу, как подключить к Android PhoneGap приложению рекламу от Google AdMob. Для этого понадобится сделать следующее

1. Зарегистрироваться в AdMob и получить Publisher ID для подключения рекламного баннера.
2. Внести изменения в Android проект для отображения рекламного баннера

пятница, 11 октября 2013 г.

Справочник полезных рецептов для CSS3 и HTML5


1. Как сделать текстовое поле не редактируемым (how make input textfield non-editable)

Для того, чтобы сделать текстовое поле не редактируемым не нужно применять классы CSS, достаточно использовать атрибут readonly (можно писать так readonly="readonly" )
<input type="text" value="some text" class="gray_text" readonly>

2. Как сделать указатель мыши как указатель с пальцем при наведении на объект (how to change cursor to finger pointer when a user hovers over a object)

Есть элемент, при наведении на который необходимо менять курсор мыши на указатель.
<div class="menu_general">
  <p><a id="to_account_and_settings" class="ui-link">
    <img src="img/menu/account_settings.png"/>
  </a></p>
 
  <p><a id="to_expansions_extras" class="ui-link">
    <img src="img/menu/expansions_extras.png"/>
  </a></p>
 
  <p><a id="to_how_to_play" class="ui-link">
    <img src="img/menu/how_to_play.png"/>
  </a></p>
</div>

Для того, чтобы менять курсор необходимо описать в классе ui-link следующее cursor: pointer
.menu_general .ui-link {
    cursor: pointer;
}

четверг, 10 октября 2013 г.

Справочник полезных рецептов для jQuery Mobile


1. Как в jQueryMobile динамически поменять у кнопки атрибут data-theme (jQueryMobile changing button data-theme dynamically) 

Есть кнопка, которой задана определенная тема (Пока не все пользователи присоединились кнопка серая). При определенном событии (когда присоединились все пользователи) необходимо менять тему этой кнопки.

<a id="waiting_users" data-role="button" 
data-theme="c" data-inline="false" >Waiting for Players...</a>

Кнопка в исходном состоянии

Для того чтобы поменять тему кнопки напишем метод, в который будем передавать id кнопки и задавать новую тему, которую хотим установить
changeButtonTheme: function (id, theme) {
  var currentTheme = $("#" + id).attr('data-theme');
  $("#" + id).attr("data-theme", theme)
    .removeClass("ui-btn-up-" + currentTheme)
    .addClass("ui-btn-up-" + theme);
}

Вызываем наш метод и передаем в него id кнопки и новую тему
changeButtonTheme("waiting_users", "a");

Кнопка после изменения темы



Справочник полезных рецептов для JavaScript


1. iScroll disable native vertical scroll 
Популярная JavaScript библиотека для скроллинга iScroll4 http://cubiq.org/iscroll-4 позволяет создавать прокручивающиеся экраны в том числе и на мобильных устройствах. Возникает одна проблема - блокируется нативный скрол по вертикали. Для того, чтобы нативный вертикальный скроллинг снова стал работать нужно сделать следующее - в конструкторе scroll объекта переопределить метод onBeforeScrollMove .
screen_scroller = new iScroll('content-scroll-wrapper', {
  snap: true,
  momentum: false,
  hScrollbar: false,
  vScrollbar: false,
  hScroll: true,
  vScroll: false,
  // здесь другие методы                  
  onBeforeScrollStart: function ( e ) {
    if ( this.absDistX > (this.absDistY + 5 ) ) {
      // user is scrolling the x axis, so prevent the browsers' native scrolling
      e.preventDefault();
    }
  }
});

Справочник полезных рецептов для jQuery


1. Как установить атрибут стиля по id.  (jquery set style attribute by id)

Есть кнопка у которой есть id (id = "invite_more"). Кнопке задан стиль с атрибутом display и значением этого атрибута равным none. Необходимо периодически менять значение этого атрибута.
<a id="invite_more" data-role="button" data-theme="c" 
data-inline="false" style="display: none">
Invite more friends</a>

Поменять значение атрибута стиля элемента с определенным id можно с помощью следующей конструкции.
$('#invite_more').css({ "display": 'block'});

2. Как загрузить содержимое HTML-файла в div (jquery load html into div) 

Есть div которому задан класс. В этот div необходимо загрузить HTML из другого файла.
<div class="played_players_vertical_component">

Для это необходимо воспользоваться функцией jquery - .load("имя файла"). Тут мы сначала находим наш div по его классу, а потом загружаем в него содержимое HTML-файла.
$(".played_players_vertical_component")
  .load("components/played_players_vertical.html");

четверг, 22 августа 2013 г.

Валидация с помощью регулярного выражения для плагина jquery.validate

Плагин для валидации полей ввода jQuery Validate не позволяет использовать регулярные выражения для проверки корректности ввода. Поэтому для того чтобы проверить введенный пользователем текст с помощью регулярного выражения необходимо сделать следующее.

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

jQuery.validator.addMethod(
    'regexp',
    function(value, element, regexp) {
        var re = new RegExp(regexp);
        return this.optional(element) || re.test(value);
    },
    "Please check your input." 
); 

2. После чего использовать добавленный метод следующим образом

$('#form').validate({
  rules: {
    reg_password: {
      required: true,
      minlength: 6,
      regexp: '^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$'
    },
    ...
  },
  messages: {
    reg_password: {
      regexp: 'Пароль должен содержать 
        как минимум один числовой символ один буквенный символ'
    }
    ...
  }
});

Regex with at least 1 number and 1 character

Регулярное выражение, которое, например, может подойти для проверки сложности пароля. Такое выражение требует, чтобы пароль содержал как минимум один буквенный символ и один цифровой символ.

'^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$'

понедельник, 19 августа 2013 г.

html5 круговой индикатор процесса

Круговой индикатор процесса который показывает процент заполнения. Установлен интервал в 42 секунды. Данный код можно просто скопировать и вставить себе в html документ, все будет работать.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script
 src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"
 type="text/javascript"></script>
<style>
.timer {
 position: relative;
 font-size: 200px;
 width: 1em;
 height: 1em;
 float: left;
}
 
.timer>.percent {
 position: absolute;
 top: 1.05em;
 left: 0;
 width: 3.33em;
 font-size: 0.3em;
 text-align: center;
}
 
.timer>#slice {
 position: absolute;
 width: 1em;
 height: 1em;
 clip: rect(0px, 1em, 1em, 0.5em);
}
 
.timer>#slice.gt50 {
 clip: rect(auto, auto, auto, auto);
}
 
.timer>#slice>.pie {
 border: 0.1em solid #c0c0c0;
 position: absolute;
 width: 0.8em; /* 1 - (2 * border width) */
 height: 0.8em; /* 1 - (2 * border width) */
 clip: rect(0em, 0.5em, 1em, 0em);
 -moz-border-radius: 0.5em;
 -webkit-border-radius: 0.5em;
 border-radius: 0.5em;
}
 
.timer>#slice>.pie.fill {
 -moz-transform: rotate(180deg) !important;
 -webkit-transform: rotate(180deg) !important;
 -o-transform: rotate(180deg) !important;
 transform: rotate(180deg) !important;
}
 
.timer.fill>.percent {
 display: none;
}
 
.timer.fill>#slice>.pie {
 border: transparent;
 background-color: #c0c0c0;
 width: 1em;
 height: 1em;
}
</style>
<script type="text/javascript">
 var timer;
 var timerCurrent;
 var timerFinish;
 var timerSeconds;
 function drawTimer(percent){
  $('div.timer').html(
          '<div class="percent"></div><div id="slice"'+
   (percent > 50?' class="gt50"':'')+
   '><div class="pie"></div>'+
   (percent > 50?'<div class="pie fill"></div>':'')+'</div>');
  var deg = 360/100*percent;
  $('#slice .pie').css({
   '-moz-transform':'rotate('+deg+'deg)',
   '-webkit-transform':'rotate('+deg+'deg)',
   '-o-transform':'rotate('+deg+'deg)',
   'transform':'rotate('+deg+'deg)'
  });
  $('.percent').html(Math.round(percent)+'%');
 }
 function stopWatch(){
  var seconds = (timerFinish-(new Date().getTime()))/1000;
  if(seconds <= 0){
   drawTimer(100);
   clearInterval(timer);
  }else{
   var percent = 100-((seconds/timerSeconds)*100);
   drawTimer(percent);
  }
 }
    $(document).ready(function(){    
  timerSeconds = 42;
  timerCurrent = 0;
  timerFinish = new Date().getTime()+(timerSeconds*1000);
  timer = setInterval('stopWatch()',50);  
 });
</script>
</head>
<body>
 <div class="timer">
</body>
</html>


воскресенье, 14 июля 2013 г.

Вопросы на собеседовании Java программиста. Разница между final, finally и finalize()

final


final - это ключевое слово в Java

Переменная, обозначенная как final, инициализируется один раз и не может быть изменена. 

//переменная не может быть изменена
private final String str = "HELLO";  

Java класс объявленный как final не может быть унаследован (расширен). То есть класс не может иметь дочерних классов (классов наследников). 

public final class A {...}
// Не поддерживается
public class B extends A{...} 

Метод, объявленный как final не может быть переопределен. 

public final String toString() {  return "NULL"; }

finally


finally - это блок. Блок finally необязательный и используется совместно с блоком try/catch. Блок finally гарантированно всегда выполняется внезависимости от того было выброшено исключение в блок try или нет. Но блок finally полезен не только для обработки исключений, finally может быть использован для закрытия файлов или для освобождения других системных ресурсов таких, как соединения с базой данных. 

FileReader reader = null;
try {
  reader = new FileReader("someFile");
  //какие то вычисления или задачи    
} catch (IOException e) {
  //ловим исключение 
} finally {
  //выполнится всегда даже если случится исключение или ошибка
  reader.close();
}

finalize()


finalize() - это метод. finalize()  вызывается перед тем, как объект будет уничтожен сборщиком мусора. Вам вряд ли придется переопределять его.