<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>Habrahabr/Sandbox</title>
	<link>http://habrahabr.ru/sandbox/</link>
	<description><![CDATA[]]></description>
	<language>ru</language>
	<pubDate>Mon, 27 Jul 2015 16:55:15 MSK</pubDate>
	<lastBuildDate></lastBuildDate>
		<item>
			<title>Сравнение NanoCAD 7 и AutoCAD 2016 — внешние ссылки</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96125/</guid>
			<link>http://habrahabr.ru/sandbox/96125/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/cad_cam/" class="hub " title="Вы не подписаны на этот хаб" >CAD/CAM</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Лето 2015 — текущими последними версиями программ для работы с чертежами dwg являются NanoCAD 7 и AutoCAD 2016, которые официально стали доступны в 2015 г. Всё больше и больше возникает вопросов у проектировщиков и организаций, работающих в сфере проектирования, в чем же разница между этими продуктами. Сегодня мы поговорим об отличиях функционала этих программ в части работы с внешними ссылками. <br/>
<a name="habracut"></a><br/>
Ниже рассмотрены отличия при вставке внешних ссылок, их удалении и окно «Внешние ссылки», а одинаковый функционал не учитывался. Вставка подложек DWF, DGN не рассматривалась, так как эти форматы очень редко встречаются на практике. Основные отличия при работе с внешними ссылки сведены в таблицу:<br/>
 <table>
<tr>
<td></td>
<th>NanoCAD 7</th>
<th>AutoCAD 2016</th>
<th>Примечание</th>
</tr>
<tr>
<td>Автопанорамирование при вставке dwg или растров</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Всплывающие подсказки у полей в диалогах вставки</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td><strong>Окно Внешние ссылки</strong></td>
</tr>
<tr>
<td>Контекстное меню без выбора ссылки и возможность вставки ссылок</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>Контекстное меню выделенной ссылки dwg</td>
<td><img src="https://habrastorage.org/files/9bb/452/5d3/9bb4525d3ede40c5a556fef9da6cbc4f.png"/></td>
<td><img src="https://habrastorage.org/files/b74/6d5/326/b746d5326cf24d8ca53ed2a473c373ad.png"/></td>
<td></td>
</tr>
<tr>
<td>Управление внешними ссылками </td>
<td>Модальное окно, работа в NanoCAD не возможна</td>
<td>Отдельное перемещаемое окно, возможна работа в AutoCAD</td>
<td></td>
</tr>
<tr>
<td>Сохранённый путь — изменить</td>
<td>Невозможно изменить</td>
<td>Можно изменить в строке или нажав на кнопку “...” в этой строке</td>
<td></td>
</tr>
<tr>
<td>Сохранённый путь — изменить</td>
<td>Можно изменить в строке</td>
<td>Невозможно изменить</td>
<td></td>
</tr>
<tr>
<td>Отдельная кнопка «Выгрузить»</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Отдельная кнопка «Обновить -&gt; Повторить загрузку внешних ссылок»</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>Отдельная кнопка «Открыть из»</td>
<td>+</td>
<td>-</td>
<td>Меняется имя и путь</td>
</tr>
<tr>
<td>Смена типа пути</td>
<td>-</td>
<td>+</td>
<td>Относительный, абсолютный, без пути</td>
</tr>
<tr>
<td>Отдельная кнопка «Сохранить растр»</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Отдельная кнопка «Внедрить растр»</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Открыть ссылку</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>При выделении ссылки – ссылка выделяется в чертеже</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>При выделении внешней ссылки в чертеже – соответствующая ссылка выделяется в окне «Внешние ссылки»</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>При удалении в чертеже ссылки на растр появляется запрос</td>
<td> — (статус: «не используются»)</td>
<td>+ (статус «не используются» или отсутствуют ссылки в чертеже)</td>
<td></td>
</tr>
<tr>
<td>При удалении в чертеже ссылки на dwg</td>
<td>Ссылка остается со статусом «загружено» и начинает отсутствовать после закрытия и открытия чертежа</td>
<td>Ссылка остается со статусом «не используется» и начинает отсутствовать после закрытия и открытия чертежа</td>
<td></td>
</tr>
<tr>
<td><strong>При вставке dwg:</strong></td>
</tr>
<tr>
<td>Предварительный просмотр dwg</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td><strong>При вставке растра:</strong></td>
</tr>
<tr>
<td>Если в чертеже уже есть вставленные ссылки на растры</td>
<td>Появляется окно вставки изображения</td>
<td>Появляется окно выбора растра с диска</td>
<td></td>
</tr>
<tr>
<td>Масштаб по ширине и высоте</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Отображение размера в пикселях, разрешения, единиц измерения AutoCAD</td>
<td>-</td>
<td>+</td>
<td></td>
</tr>
<tr>
<td>Отображение размеров растра на предварительном просмотре</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Переключатель «ПСК»-«Вид»</td>
<td>+</td>
<td>-</td>
<td>Вставка относительно МСК при активной ПСК </td>
</tr>
<tr>
<td><strong>При вставке pdf:</strong></td>
</tr>
<tr>
<td>Возможность зуммирования, масшатаб 1:1, по ширине</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Выбор страниц перечислением в строке</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Кнопки управления переходом между страницами подложки</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Масштаб по ширине и высоте</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
<tr>
<td>Переключатель «ПСК»-«Вид»</td>
<td>+</td>
<td>-</td>
<td>Вставка относительно МСК при активной ПСК </td>
</tr>
<tr>
<td>Информация о размерах выбранной страницы pdf</td>
<td>+</td>
<td>-</td>
<td></td>
</tr>
</table><br/>
Из приведённой таблицы видно, что различий не мало. Есть незначительные различия, а есть и такие, которые доставляют некоторые неудобства в работе с внешними ссылками. Например, стоить отметить, что в NanoCAD окно «Внешние ссылки» является модальным и это делает не доступным работу в nanoCAD на время отображения этого окна, а в AutoCAD это окно отдельное и перемещаемое, что позволяющее работать в этот момент в AutoCAD. В NanoCAD 7 есть дополнительные функции «Сохранить растр», «Внедрить растр», есть «Автопанорамирование», переключатель «ПСК»-«Вид», удобнее и понятнее вставлять pdf. А в AutoCAD удобнее выполнять все действия с внешними ссылками через окно «Внешние ссылки».<br/>
<br/>
В целом можно сделать вывод, что функциональность NanoCAD 7 и AutoCAD 2016 при вставке, удалении внешних ссылок и управление внешними ссылками с помощью окна «Внешние ссылки» практически одинаковая, но со своими особенностями и дополнительными возможностями.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96125/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 27 Jul 2015 13:55:32 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Почему я выбрал платформу Xamarin для разработки мобильных приложений</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96103/</guid>
			<link>http://habrahabr.ru/sandbox/96103/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/mobiledev/" class="hub " title="Вы не подписаны на этот хаб" >Mobile Development</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/csharp/" class="hub " title="Вы не подписаны на этот хаб" >C#</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/net/" class="hub " title="Вы не подписаны на этот хаб" >.NET</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><img src="https://xamarin.com/content/images/pages/branding/assets/xamarin-logo.png" alt="image"/><br/>
<br/>
Разработкой под мобильные устройства сегодня не занимается только ленивый, ну или тот, кто про нее не слышал, или не нуждается в этом. Однако, нельзя отрицать факт, что мобильные устройства с каждым годом поглощают рынок ПК, переводя пользователя от необходимости иметь рабочее место или ноутбук для выхода в Интернет.<br/>
<a name="habracut"></a><br/>
За последний год трафик мобильных устройств увеличился более чем на 20%, что свидетельствует о том, что смартфоны становятся не роскошью, а предметом повседневной необходимости.<br/>
<br/>
На сегодня Xamarin является активно развивающейся платформой, с достаточно большим сложившимся сообществом. Выбор данной платформы был принят после глубокого анализа возможности разработки приложений используя родные средства (Java, Objective C\Swift, Windows Phone Toolkit). Однако, элегантность кросс-платформенного решения все же взяла верх. Тем более, что Xamarin уже достаточно долго на рынке и помимо поддержки iOS, Android, WindowsPhone недавно начали поддерживать WinRT (что собственно и стало последней точкой в принятии решения).<br/>
<br/>
Попробую определить основные «за» и «против», которые стояли на чашах весов при выборе решения для разработки приложений.<br/>
<br/>
Итак, начнем со списка «за»:<br/>
 <ul>
<li>Кросс-платформенное решение, что дает нам наличие общей кодовой базы в проекте, возможность писать код на одном языке, создание common-слоя</li>
<li>Используя активно развивающийся инструмент, сам невольно развиваешься. Xamarin начинает поддерживать Apple Watch\ Android Wear и многое другое; уверен в будущем также будет поддерживать. Создав приложение один раз, невольно сможешь его залить в любой Store спустя время, куда раньше даже и не планировал</li>
<li>Активно развивающееся сообщество и кодовая база. Форум на главном сайте платформы активно посещают как создатели Xamarin так и множество их MVP. Ответы даются в течение 3 часов, что лично я считаю достаточно быстро.</li>
<li>Наличие параллельно развивающихся фреймворков, типа Xlabs\Plugins\Собственного Store других бонусов для разработчиков. Присутствие TestCloud(хоть и с завышенными ценами), University и Insights. (Лично сам не занимался еще последними, ибо пока руки не доходят да и цена кусается).</li>
<li>Собственно сама платформа. Отличное покрытие кода многих сервисов, контроллов необходимых для разработки бизнесс-приложения.</li>
<li>Возможность продолжить вести разработку на любой .Net(С#), со всеми его async\await, LINQ в любимой студии. Да и мне, как WPF разработчику многое стало понятно без дополнительного поиска в гугле. Разработчики Xamarin грамотно построили архитектуру.</li>
</ul><br/>
В списке «против» собрались:<br/>
 <ul>
<li>Цена. Если отбросить Инди-разработчиков, то для обычных фирм по 10-15 человек, цена серьезный минус. Можно было бы и выложить за Business лицензию, но University и Test Cloud не станут доступными и требуют не малых затрат дополнительно. Цена — основной минус как по мне.</li>
<li>Проблемы с производительностью. Да, они есть, ярко выражены на платформе Android, почти не заметны под WinRT. Однако, хочу сказать, что даже Release 4.3, по сравнению с 4.2 стал намного лучше, в плане утечек памяти и постоянно вылетающих OutOfMemory and Unhandled exceptions. Да и железо продолжает страховать. Сегодня мощностью многие смартфоны не уступают нашим первым ноутбукам.</li>
</ul><br/>
Собственно, если перед вами стоит цель — разработать бизнесс-приложение для разных платформ, то Xamarin на мой взгляд является хорошим решением, которое при грамотной разработке позволит получить отличный результат.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96103/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 27 Jul 2015 13:55:31 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Chexbox в bash</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96095/</guid>
			<link>http://habrahabr.ru/sandbox/96095/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/sys_admin/" class="hub " title="Вы не подписаны на этот хаб" >Системное администрирование</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/nix/" class="hub " title="Вы не подписаны на этот хаб" >*nix</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>При моей работе системного администратора, мне, как человеку ранее далекому от написания скриптов, пришлось в короткие сроки узнать сразу очень много чего нового. Накопив немного знаний, я хочу поделиться своим багажом с теми, кто наверняка столкнется с такими же вопросами при своей работе.<br/>
<br/>
Появилась задачка проводить обновление серверов по выбору и не по одному, а сразу пачкой.<br/>
<br/>
Для обновления на нескольких серверах использовал pssh, а вот с около checkbox'ом на bash пришлось повозиться. <br/>
<a name="habracut"></a><br/>
Смотрите как в итоге вышло, пример для команды uptime, но можно сколько угодно команд таким макаром выполнить.<br/>
<br/>
<pre><code class="bash">ip_1=&quot;&quot; ip_2=&quot;&quot;
server1=1.1.1.1
server2=2.2.2.2
PS3='Выбираем сервера для обновления: ' 
while :
do
    echo &quot;Выбранные сервера: $ip_1 $ip_2&quot;
    options=(&quot;Сервер первый ${opts[1]}&quot; &quot;Сервер второй ${opts[2]}&quot; &quot;Очистить&quot; &quot;Выбор&quot;)
    select opt in &quot;${options[@]}&quot; 
    do 
        case $opt in 
            &quot;Сервер первый ${opts[1]}&quot;)
                ip_1=$server1
                break
            ;;
            &quot;Сервер второй ${opts[2]}&quot;)
               ip_2=$server2
               break
            ;;
            &quot;Очистить&quot;)
                ip_1=&quot;&quot; ip_2=&quot;&quot;
                break
            ;;
            &quot;Выбор&quot;)
                break 2
            ;;
        esac
    done
done
pssh -A -H &quot;$ip_1 $ip_2&quot; -l user -i &quot;uptime&quot;
</code></pre>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96095/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 27 Jul 2015 07:55:26 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Волнистые рамочки традиционно без графики</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96091/</guid>
			<link>http://habrahabr.ru/sandbox/96091/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/css/" class="hub " title="Вы не подписаны на этот хаб" >CSS</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><img src="https://habrastorage.org/files/c94/867/6a5/c948676a5cb0455faa9d7323e635cce9.jpg" align="left" width="200"/> Вёрстка хороша тем, что её можно безгранично упрощать, современный веб стремиться к самодостаточности. Большинство задач, для которых раньше требовалось нарезать кучу странных картинок, теперь решаются несколькими строчками HTML и CSS. И это круто, мы возвращаемся к тому с чего всё начиналось: <b>изображения должны нести смысл для всего остального есть CSS</b>.<br/>
<a name="habracut"></a><br/>
Совсем недавно появилась задача заверстать границу блока в виде «волнистых» рамочек. Первая мысль — нарезать картинки — но это не наш метод. Почитав гугл, нашёл интересный <a href="http://codepen.io/yoksel/full/mgakB/">пример</a>.<br/>
<br/>
<h5>На основе примера и был сформирован мой велосипед.</h5><br/>
<pre><code class="css">.box:before {
  content: '';
  
  display: block;
  height: 1em;
  
  position: absolute;
  bottom: -.5em;
  left: 0;
  right: 0;
  
  background-image: radial-gradient(circle, transparent 70%, #f3f0cd 70%);
  background-size: .7em 1em;
  background-position: 0 -.5em;
}
</code></pre><br/>
Возможно, кому-то будет полезно. Пример на <a href="http://codepen.io/AiRiZzz/full/KpGyqb/">Codepen</a>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96091/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 27 Jul 2015 07:55:25 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Нетривиальная попытка срастить карты и социальные сети — проекция ВКонтакте на Google Map</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96085/</guid>
			<link>http://habrahabr.ru/sandbox/96085/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/mobile_testing/" class="hub " title="Вы не подписаны на этот хаб" >Тестирование мобильных приложений</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/android_dev/" class="hub " title="Вы не подписаны на этот хаб" >Разработка под Android</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/geo/" class="hub " title="Вы не подписаны на этот хаб" >Геоинформационные сервисы</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Просмотр социальных сетей, во многом схож с просмотром новостных лент. Тут есть информация. Тут есть хронология, Тут есть источник (участник общения).<br/>
<br/>
Понятно, что Информация является сутью процесса. Этот параметр изменять или исключать нельзя.<br/>
<br/>
Хронология и источник выступают в качестве координат всего этого пространства. Получается двухмерная плоскость… очень удобная для человека со времен изобретения папируса.<br/>
<br/>
Как в это пространство вмонтировать географические координаты? Ведь география это не одна координата, а целых две! И если просто добавить координаты, то получится что информация у нас будет плавать в 4-х мерном пространстве, а такое изобилие осей наше человеческое сознание воспринимает с трудом.<br/>
<br/>
Я выбрал самый простой вариант, выбросил хронологию и добавил координаты. Получилось трехмерное пространство. Как мы ориентируемся в трехмерном на двумерном (экран смартфона)? Ну, конечно же, слоями. Каждый пользователь — это отдельный слой.<br/>
<br/>
Все тривиально:<br/>
— Выбор пользователя;<br/>
— Отображение на карте сообщений и фотографий со стены пользователя.<br/>
<br/>
<a name="habracut"></a> <br/>
<br/>
Пробная версия:<br/>
<br/>
<iframe width="560" height="349" src="//www.youtube.com/embed/1GKcChIxc7U?wmode=opaque" frameborder="0" allowfullscreen></iframe><br/>
<br/>
<a href="https://play.google.com/store/apps/details?id=org.argyn.vkontaktegeo">VKGeo — Геоклиент ВКонтакте</a><br/>
<br/>
Каким образом добавить сюда хронологию? Вот вопрос читателям.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96085/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Fri, 24 Jul 2015 19:25:27 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Игры как инструмент самопознания</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96083/</guid>
			<link>http://habrahabr.ru/sandbox/96083/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/gdev/" class="hub " title="Вы не подписаны на этот хаб" >Game Development</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><img src="https://habrastorage.org/files/789/a7c/a15/789a7ca151db4f60bbcd9cf62d6429e2.jpg"/><br/>
<hr/><br/>
Всё начинается с проблемы, с желания. В центре системы стоит человек со своими интересами, потребностями, стремлениями. Он учится, работает, развлекается, развивается, творит, пытается укрепить своё положение в этом мире, в обществе. Человечество познаёт окружение и создаёт инструменты для выживания и развития.<br/>
<a name="habracut"></a><br/>
На данный момент общее направление развития отношений между человеком и организациями, помогающими получить товар или услугу, перешло от принципа “производитель–продавец–покупатель” к принципу “бренд–аудитория”. Следует заметить, не все стремятся или могут действительно наладить постоянную двустороннюю связь с людьми. Да, разрабатываются методы, инструменты и прочее, но фактически всё это может не использоваться должным образом. В некоторых сферах подобный принцип и не должен работать, но их не затрагиваем.<br/>
<br/>
Аудитория составляется из заинтересованных людей. Сейчас людьми чаще движет желание выделиться, получить что-то уникальное максимально удобным и приятным способом. И, конечно, важен гигантский скачёк дальше и выше. Уникальный опыт или “уникальный” опыт?<br/>
<br/>
<b>Игры и игровой опыт</b><br/>
<br/>
Подходим к видеоиграм, как их развивать, в каких направлениях двигаться? Улучшаются технологии виртуальной реальности, мощности оборудования растут. По моему личному мнению, игры должны оставаться играми, особенно это важно на данном этапе. Сейчас происходит становление виртуальных интерактивных развлечений как действительно культурно важного явления, как в своё время это произошло с кинематографом. Поэтому игры должны занять своё место в мире, а кино должно продолжать развиваться в своём направлении. Их скрещивание напротив может привести к печальным последствиям. Когда мы называем игру “кинематографичной”, мы занижаем уровень одного по отношению к другому. Полезно использовать опыт других индустрий и авторов, но не прямолинейно.<br/>
<br/>
Игры могут давать по-настоящему уникальный опыт каждому человеку. В книгах, музыке, фильмах уникальный опыт — это индивидуальное восприятие общих для всех событий, интерпретация. Игра же может генерировать совершенно разные события в одних и тех же временных рамках, нельзя об этом забывать.<br/>
<br/>
<img src="https://habrastorage.org/files/477/f87/a3a/477f87a3aa624484aacd327a2be678d5.jpg"/><br/>
<br/>
Линейные игры (Half Life, Max Payne, Uncharted), берущие многое от кинематографа по своей сути становятся надстройкой над кино. В них нет той уникальности событий для каждого игрока, а делается ставка на индивидуальность восприятия, зрелищность и взаимодействие с виртуальным окружением. Людей привлекает взаимодействие с окружением или другими игроками внутри виртуального мира.<br/>
<br/>
Игры с открытым миром и “песочницы” (Grand Theft Auto V, TES Skyrim, Far Cry 4, Minecraft) расширяют возможности в плане взаимодействия с миром и вносят некоторое разнообразие. Игроки могут создавать что-то своё индивидуальное и больше влиять на окружение, которое в свою очередь интереснее реагирует на изменения и действия игрока. Поэтому такие игры стали популярными и объединили одни из самых больших аудиторий. Понятно, что игр такого типа становится всё больше, но не многие действительно способны оправдать ожидания аудитории, раздражая однотипностью, тем самым снижая общий интерес.<br/>
<br/>
<b>Что же дальше?<br/>
</b><br/>
Игры должны укрепиться на нескольких уровнях — от развлечения до самопознания.<br/>
<br/>
<img src="https://habrastorage.org/files/0f0/956/4a9/0f09564a990045d593cfcb3c40456ac9.png" alt="image"/><br/>
<i>Игра будущего — инструмент самопознания</i><br/>
<br/>
И сейчас игры могут работать на этих уровнях, существуют потрясающие проекты, но всё же они используют по большей части средства кинематографа, дополняя и усиливая эффект интерактивностью, что очень неплохо только для начального этапа развития. Уже довольно давно существуют игры с системным подходом к дизайну, дающие игроку возможность делать выбор на определённых развилках, с несколькими вариантами концовок сюжетной линии, иногда таких вариантов довольно большое количество относительно полностью линейных. Безусловно, идеи системного подхода далеко не новы, об этом думали много лет назад. И дизайнеры как, например, Уоррен Спектор (Deus Ex, Thief) или Сид Мейер (Civilization) стремятся к этому уже долго.<br/>
<br/>
Важно не отбрасывать предыдущие наработки, но развивать. Многие уже работают над системами и проектами прогрессивного игрового дизайна. Например, <a href="http://www.youtube.com/watch?v=58FWUkA8y2Q">развитие отношений с персонажами и последствий этого</a>. Из переменных блоков формируется развитие событий игры, почти полностью зависящее от решений игрока. Конечно, при отсутствии внятной общей сюжетной линии, ярких событий и завершения истории подобный подход не сработает. Не получится вовлечь эмоционально, игрок потеряет интерес и вдохновение.<br/>
<br/>
Я предлагаю пойти дальше. Все события, задания/миссии/квесты должны быть построены как система с заменяемыми блоками и случайно выбираемыми событиями в рамках определённого общего сюжета, использующая динамические шаблоны для создания ярких ситуаций, но при этом всегда полностью сохраняющая элемент неожиданности.<br/>
<br/>
В недавно показанном отрывке Uncharted 4, что если Нейт сорвётся с верёвки во время погони за братом, но не погибнет? Можем ли мы дать возможность игроку выбрать свой вариант действий и догнать Сэма другим способом, спасти его, справившись с трудной ситуацией?<br/>
<br/>
<img src="https://habrastorage.org/files/432/6c3/d7b/4326c3d7bbc745b2af2ef4af1efcba83.gif" alt="image"/><br/>
<br/>
Другой, грубый и довольно тяжёлый эмоционально пример. Допустим, события разворачиваются в большом городе с тоталитарной властью, где главного героя разыскивает полиция и прочие силы с приказом “найти и уничтожить”. А наша цель — разыскать похищенную любимую жену. В самом начале игры мы пытаемся скрыться от преследователей, во время погони преследователи на броневике случайно разрушают небольшой дом, где жила семья с ребёнком. Родители погибают, ребёнок остаётся в живых, а может быть, в живых остаётся только отец или только мама ребёнка, в зависимости от того, как произойдёт столкновение. Здесь срабатывает шаблон — броневик должен врезаться в дом, но остальное просчитывается динамически и результат сохраняется. Далее по ходу истории нам снова приходится скрываться от полиции. Мы попадаем в заброшенное здание, со всех сторон нас обстреливают, а на пути на первом этаже мы встречаем того самого ребёнка, у которого погибли родители, он забрёл в этот дом, хотел переночевать. Мы можем спасти его, спрятав так, чтобы пули не достали мальчика. Если же выжил только отец, то мы встретим его на крыше здания, он попытается совершить самоубийство, а мы можем спасти его, но можем и не спасать, решает игрок. Если выжила только женщина, мы встретим её в другом месте, она присоединится к сопротивлению против властей, будет мстить за гибель семьи. И мы можем помочь ей. С другой стороны, если бы мы в самом начале выбрали другой путь во время погони, дом не был бы разрушен, все остались бы живы. Или дом обрушился бы не сразу, вся семья смогла бы спастись, тогда позже мы бы встретили их в злачном переулке у костра. Опять же, мы могли бы помочь им. Перестрелка в заброшенном здании в таком случае могла бы происходить вовсе без важных персонажей, а закончиться разрушением всей конструкции. Игроку в таком случае придётся очень быстро выбраться оттуда.<br/>
<br/>
<img src="https://habrastorage.org/files/4e1/bf2/2ee/4e1bf22ee79d49359c147209e3314bc6.png" alt="image"/><br/>
<i>Пример взаимодействия элементов системы</i><br/>
<br/>
Наша основная цель в этом примере — спасти дорогого человека. Все остальные побочные задания не отмечаются на карте, они могут происходить в моменты, определённые шаблонами событий, но для каждого игрока всё происходит по-разному. И случайные события, и побочные миссии так же строятся из блоков, зависящих от результатов событий других систем. Мы не можем предсказать все возможные варианты, всё зависит от действий игрока. Соответственно, мы не можем делать сюжетные ролики, повторяя кино, но мы можем сохранять зрелищность и эмоциональную вовлечённость, оставляя все решения за игроком. При этом должна выстраиваться общая сюжетная линия с только важными для игрока персонажами, чтобы поддерживать концентрированность событий с возможностью исследовать мир игры. При этом у каждого важного персонажа есть свои проблемы, свои стремления и желания.<br/>
<br/>
<blockquote><b>Мы не можем предсказать все возможные варианты, всё зависит от действий игрока</b></blockquote><br/>
<br/>
Добиться общей финальной цели мы можем множеством способов. Всё же персонаж, с которым мы себя ассоциируем, имеет свою предысторию и заранее полученные знания. Он знает, откуда стоит начать поиск жены, но дальше всё зависит от нас. К концу истории мы можем отыскать и спасти её. Например, окажется, что её похитил психически больной сын правителя этого города. Как и почему он это сделал выяснится в процессе поиска. Останется сбежать из города вместе с женой. Но мы можем также поднять восстание в городе, сменить власть и вызволить из плена множество других похищенных женщин и их детей. Можно даже взять управление городом в свои руки или передать кому-то подходящему, кого мы встретим на своём пути в этой истории. Все варианты трудно предсказать, но может произойти многое, включая очень грустные последствия.<br/>
Концовка не выбирается из нескольких линейных вариантов, а формируется на основе всех ранее совершенных игроком действий. Конец истории выстраивается на основе шаблонов (жена спасена, захвачена власть), но учитывается огромное количество факторов, приводящих к уникальному для каждого игрока результату. Таким образом, концовка базируется на модификаторах — принятых решениях и составляется из блоков. Вся система получается масштабируемой, со временем возможных вариации будет всё больше вместе с возрастающими возможностями технологий.<br/>
<br/>
<img src="https://habrastorage.org/files/b24/f41/30a/b24f4130aa024ee8bb4c27c73e6a75b4.jpg" alt="image"/><br/>
<i>Deus Ex Human Revolution. Eidos Montreal</i><br/>
<br/>
Многопользовательский вариант игры с подобной системой будет зависеть от изначальной задумки. Если это кооперативный режим, то мы должны дать возможность игрокам раскрыться в командном взаимодействии, сама история должна быть основана на пути нескольких персонажей, при этом генерируемые события должны быть общими для группы игроков. В режиме подобном deathmatch система позволит добавить глубины во взаимодействие с окружением. А если переплетать одиночный режим с многопользовательским, система должна использовать объединяющие шаблоны — один игрок проникает в историю другого игрока, формируется небольшое ответвление для противостояния или соревнования, влияющее на финал общей сюжетной истории.<br/>
<br/>
С точки зрения затрат ресурсов и экономической целесообразности, каким образом получится реализовать всю эту вариативность? Сколько же нужно потратить сил и денег на всё это?! На самом деле дороже выходит разработка больших линейных игр. Ещё дороже, если там есть развилки с вариантами выбора. Так получается из-за того, что всё приходится прорабатывать заранее, все объекты, все ситуации и все связи. Да, игрок вносит что-то от себя, но этого недостаточно, ведь события для всех одни и те же, и создаются они командами разработчиков. С системным подходом от некоторых затрат можно уйти, хотя бы избежать постоянного увеличения расходов, ведь система сама будет генерировать больш<i>у</i>ю часть происходящего из готовых блоков. Нужно создать эту систему и строительные блоки для неё, дальше всё зависит от игрока.<br/>
<br/>
<b>Заключение</b><br/>
<br/>
При создании игр стоит стремиться не только развлекать и помещать внутрь своё высказывание и мнения. Игра должна быть инструментом, помогающим человеку стать соавтором происходящего и развиваться в направлениях, о которых он раньше не задумывался.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96083/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Fri, 24 Jul 2015 19:25:26 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Подключаем WiFi-адаптер WN727N к Ubuntu/Mint</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96077/</guid>
			<link>http://habrahabr.ru/sandbox/96077/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/sys_admin/" class="hub " title="Вы не подписаны на этот хаб" >Системное администрирование</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/linux/" class="hub " title="Вы не подписаны на этот хаб" >Настройка Linux</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>У меня возникла проблема с подключение WiFi-адаптера wn727n к ubuntu/mint. Я долго гуглил, но решения так и не нашел. Решив проблему, решил написать его сам. Все, что написано ниже, рассчитано на новичков.<br/>
<a name="habracut"></a><br/>
<h6><b>ВНИМАНИЕ! АВТОР СТАТЬИ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ПРИЧИНЕННЫЙ УЩЕРБ!</b></h6><br/>
Но, если вы сделаете все правильно, последствий не будет. Даже если что-то пойдет не так, ничего страшного не произойдет. Начнем.<br/>
<br/>
Первым делом открываем терминал при помощи клавиш Ctrl+Alt+T и вводим такую команду:<br/>
<pre><code class="bash">lsusb
</code></pre><br/>
<img src="https://habrastorage.org/files/eef/b2a/9ad/eefb2a9ad6054dca9b506530e9f30041.jpg"/><br/>
<br/>
Видим наш адаптер Ralink RT7601(выделено). У вас может быть адаптер Ralink RT5370. Драйвера на разные адаптеры устанавливаются по-разному. Я опишу как это сделать для для двух случаев.<br/>
<br/>
<h4>Инструкция для Ralink RT5370</h4><br/>
Переходим по <a href="http://www.mediatek.com/en/downloads1/downloads/">ссылке</a> и выбираем RT8070/ RT3070/ RT3370/ RT3572/ RT5370/ RT5372/ RT5572 USB USB. Скачиваем архив с драйвером.<br/>
<br/>
Открываем папку, в которую сохранили драйвер, и распакуем архив bz2. Для этого кликаем правой кнопкой мыши по файлу и нажимаем “Распаковать сюда” (“Extract here”).<br/>
<br/>
После этого появится архив tar. Еще раз его распаковываем. Нажимаем правой кнопкой мыши по файлу и нажимаем “Распаковать сюда” (“Extract here”).<br/>
<br/>
Далее меняем название папки на что то более короткое, так как нам еще предстоит писать ее путь в консоль. Например я назвал ее Driver.<br/>
<br/>
Заходим в распакованную папку и открываем в текстовом редакторе файл /os/linux/config.mk<br/>
<br/>
Находим следующие строки и изменяем букву n на y:<br/>
<br/>
<i># Support Wpa_Supplicant<br/>
HAS_WPA_SUPPLICANT=y<br/>
 <br/>
# Support Native WpaSupplicant for Network Maganger<br/>
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y</i><br/>
 <br/>
После этого сохраняем файл. Открываем терминал и переходим в распакованную папку. Внимание! У меня имя пользователя sergey. Вы же вводите свое имя пользователя! В дальнейшем меняйте sergey на имя своего пользователя.<br/>
<br/>
<pre><code class="bash">cd /home/sergey/загрузки/driver/
</code></pre><br/>
Далее выполняем команды:<br/>
<pre><code class="bash">sudo make
sudo make install
sudo modprobe rt5370sta
</code></pre><br/>
И все! О, чудо! WIFI работает, пользуйтсь на здоровье.<br/>
<br/>
<h4>Инструкция для Ralink RT7601</h4><br/>
Для того, чтобы завести этот адаптер(Ralink RT7601), вам необходимо иметь ядро версии 3.19 или выше. если необходимо — обновите ядро (если не знаете как — google поможет).<br/>
<br/>
Далее идем по <a href="https://github.com/porjo/mt7601.git">ссылке</a> и скачиваем драйвер:<br/>
<br/>
<img src="https://habrastorage.org/files/f0f/688/733/f0f6887339134d2eba568b874e3707c7.jpg"/><br/>
<br/>
Далее скачанный архив перемещаем в домашнюю папку и распаковываем (клик правой клавишей мыши, «извлечь сюда»). Переименуем получивщуюся папку mt7601-master просто в mt7601.<br/>
<br/>
После этого вводим команду:<br/>
<br/>
<pre><code class="bash">cd mt7601/src
</code></pre><br/>
Теперь мы в нужном каталоге. Можно произвести сборку драйвера, выполняем команду:<br/>
<pre><code class="bash">sudo make
</code></pre><br/>
Система запросит пароль — вводим (пароль не отображается).<br/>
<br/>
Далее вводим команды:<br/>
<br/>
<pre><code class="bash">sudo mkdir -p /etc/Wireless/RT2870STA/
cp RT2870STA.dat /etc/Wireless/RT2870STA/
</code></pre><br/>
И последняя команда, которая включит наш адаптер:<br/>
<br/>
<pre><code class="bash">insmod os/linux/mt7601Usta.ko
</code></pre><br/>
Все!!! Теперь ubuntu видит wifi.<br/>
<br/>
Но это еще не все! Теперь после каждой перезагрузки необходимо вводить последнюю команду, иначе система не увидит адаптер (именно для Ralink RT7601). Но есть выход! Можно создать скрипт и добавить его в автозагрузку. Ниже написано как это сделать.<br/>
<br/>
Первым делом нам надо сделать так, чтобы система не запрашивала пароль при использовании sudo. Для этого вводим команду:<br/>
<br/>
<pre><code class="bash">sudo gedit /etc/sudoers
</code></pre><br/>
Откроется такое окно:<br/>
<br/>
<img src="https://habrastorage.org/files/14c/45b/8f2/14c45b8f204a4a22a78d95b62ae3581d.jpg"/><br/>
<br/>
Ищем строчку:<br/>
<i>%sudo ALL=(ALL:ALL) ALL</i><br/>
<br/>
И меняем ее на:<br/>
<i>%sudo ALL=(ALL:ALL) NOPASSWD: ALL</i><br/>
<br/>
Сохраняем изменения — нажимаем «Сохранить».<br/>
<br/>
Вводи команду:<br/>
<br/>
<pre><code class="bash">sudo cp -R mt7601 /etc/Wireless/RT2870STA/
</code></pre><br/>
После этого вводим команду:<br/>
<pre><code class="bash">sudo gedit /etc/Wireless/RT2870STA/autowifi.sh
</code></pre><br/>
Открывается пустой текстовый редактор. В нем пишем или копируем:<br/>
<i>#!/bin/bash<br/>
insmod /etc/Wireless/RT2870STA/mt7601/src/os/linux/mt7601Usta.ko</i><br/>
<br/>
Нажимаем «Сохранить» и закрываем.<br/>
<br/>
Вводим команды:<br/>
<br/>
<pre><code class="bash">cd /etc/Wireless/RT2870STA/
sudo chmod +x autowifi.sh
</code></pre><br/>
Далее идем в меню Dash и ищем программу как на картинке ниже:<br/>
<br/>
<img src="https://habrastorage.org/files/c54/467/259/c5446725930f4d309e86f4e64f72760e.jpg"/><br/>
<br/>
Открываем ее. Нажимаем «Добавить».<br/>
<br/>
<img src="https://habrastorage.org/files/8e9/372/4dc/8e93724dcdb34ba1be07e308ad5f4663.jpg"/><br/>
<br/>
Откроется окно. Напротив поля «Имя» пишем:<br/>
<i>autowifi</i><br/>
<br/>
Напротив поля «Команда» пишем:<br/>
<i>sudo sh /etc/Wireless/RT2870STA/autowifi.sh</i><br/>
<br/>
Нажимаем кнопку «Добавить» и закрываем программу. Перезагружаемся. После перезагрузки все работает. Теперь можно выбрать сеть в трее.<br/>
<br/>
<img src="https://habrastorage.org/files/eb1/13d/b81/eb113db81b9c418e86cd44d2d1037e82.jpg"/><br/>
<br/>
На этом «небольшая» инструкция для адаптера Ralink RT7601 закончена.<br/>
<br/>
Приятного времяпровождения в сети!

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96077/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Fri, 24 Jul 2015 13:25:31 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Заметки по установке Lighttpd+PHP в Ångström Linux</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96051/</guid>
			<link>http://habrahabr.ru/sandbox/96051/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/webdev/" class="hub " title="Вы не подписаны на этот хаб" >Веб-разработка</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/php/" class="hub " title="Вы не подписаны на этот хаб" >PHP</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><h4>Установка Lighttpd</h4><br/>
Поскольку после установки из коробки на <a href="https://ru.wikipedia.org/wiki/%C3%85ngstr%C3%B6m">Ångström</a> не обнаружилось каких-либо вэб-серверов, то было решено ставить уже многим известный, вэбсервер <a href="https://ru.wikipedia.org/wiki/Lighttpd">Lighttpd</a>. <br/>
<a name="habracut"></a><br/>
В данный момент уже все работает, и команда управления пакетами opkg выдаёт следующий список установленных пакетов:<br/>
<pre><code class="bash">#opkg list-installed lighttpd
</code></pre><br/>
<pre>
lighttpd - 1.4.26-r9.0-arago5.6
lighttpd-module-access - 1.4.26-r9.0-arago5.6
lighttpd-module-accesslog - 1.4.26-r9.0-arago5.6
lighttpd-module-cgi - 1.4.26-r9.0-arago5.6
lighttpd-module-compress - 1.4.26-r9.0-arago5.6
lighttpd-module-dirlisting - 1.4.26-r9.0-arago5.6
lighttpd-module-expire - 1.4.26-r9.0-arago5.6
lighttpd-module-indexfile - 1.4.26-r9.0-arago5.6
lighttpd-module-staticfile - 1.4.26-r9.0-arago5.6
</pre><br/>
<br/>
Для их установки, войдя root-ом, выполняется команда:<br/>
<pre><code class="bash">#opkg install lighttpd lighttpd-module-indexfile lighttpd-module-compress lighttpd-module-expire lighttpd-module-cgi
</code></pre><br/>
Перечислены не все пакеты, т.к. остальные ставятся автоматически при обработке зависимостей. <br/>
<br/>
<h4>Установка PHP</h4><br/>
Помимо этого, для работы PHP, следует установить еще:<br/>
<pre><code class="bash">#opkg install php php-cgi libssl0.9.8
</code></pre><br/>
Пришлось довольствоваться установленным PHP 5.2.13 (cgi-fcgi) (built: Nov 11 2012 09:56:48).<br/>
<br/>
<h4>Настройки</h4><br/>
Имейте в виду, что все странички, по умолчанию, располагаются в директории /www/pages, что не совсем привычно (для меня). И была такая ситуация, что почему-то в настройках /etc/lighttpd.conf домашней директорией прописалась несуществующая /usr/share/matrix-gui-2.0, поэтому, после установки пакетов, пришлось вносить поправки в конфиг:<br/>
<br/>
<pre><code class="bash">#server.document-root        = &quot;/usr/share/matrix-gui-2.0/&quot;
server.document-root        = &quot;/www/pages/&quot;
</code></pre><br/>
<br/>
<h4>Запуск и проверка</h4><br/>
Тут все просто, root-ом стартуем скрипт lighttpd сервиса:<br/>
<pre><code class="bash">#/etc/init.d/lighttpd start
2015-07-21 09:50:13: (log.c.166) server started
</code></pre><br/>
В браузере открывается лаконичная страничка «It works!».

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96051/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Thu, 23 Jul 2015 13:25:32 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>JS-SWITCH или как выключить Javascript</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96045/</guid>
			<link>http://habrahabr.ru/sandbox/96045/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/browser_extensions/" class="hub " title="Вы не подписаны на этот хаб" >Расширения для браузеров</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/javascript/" class="hub " title="Вы не подписаны на этот хаб" >JavaScript</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/firefox/" class="hub " title="Вы не подписаны на этот хаб" >Firefox</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Хочу рассказать вам о своем опыте создания плагина для браузера Firefox. Я являюсь пользователем браузера Firefox. После последнего обновления 39.0 я решил открыть панель настроек, хотя открываю я ее всего один раз, после установки браузера, чтобы настроить его под себя. Так вот полазив по настройкам, я обнаружил, а точнее не обнаружил, опции “Включить Javascript”.<br/>
<br/>
Конечно же, сразу захотелось его выключить, а нельзя; цитата из к/ф “О чем говорят мужчины”:<br/>
<blockquote>Пример: тебе запретили есть вилкой.<br/>
— Кто?!<br/>
— Ну не знаю. Сказали: «Никогда больше не будешь есть вилкой!» Казалось бы, ну и хрен бы с ней, можно ложкой, палочками, руками… Но тебе сказали: нельзя вилкой — и сразу захотелось именно вилкой.</blockquote><br/>
<a name="habracut"></a><br/>
Немного погуглив, я узнал, что выключить его можно, для этого в адресной строке браузера достаточно набрать about:config и нажать Enter. Далее появится загрузится страница с огромным количеством настроек:<br/>
<br/>
<img src="https://habrastorage.org/files/240/694/0c9/2406940c97d34adebf42076c74427291.png"/><br/>
<br/>
Ищем параметр javascript.enabled, он то и отвечает за вкл/выкл Javascript-а. По умолчанию он принимает значение true, что значит, что он включен, конечно, можно его поменять, наведя курсор на параметр и нажав правую кнопку мыши, выбрать “Переключить”:<br/>
<br/>
<img src="https://habrastorage.org/files/d60/7cc/927/d607cc927e994259b8696c9098f2f879.png"/><br/>
<br/>
В рез-те чего значение true измениться на false и javascript выключиться, но делать это через страницу about:config не комильфо. Будет лучше если это можно будет делать при помощи специальной кнопки на панели. А чтобы эта кнопка появилась надо писать плагин. Писать конечно будем на javascript-е (чтобы потом его выключить). Для того чтобы написать плагин для firefox необходим add-on sdk. Скачать его ожно на официальном сайте компании Mozilla, там же можно найти и инструкцию по установке и созданию первого плагина.<br/>
<br/>
Сразу привожу текст моего плагина:<br/>
<pre><code class="javascript">var buttons = require('sdk/ui/button/action');
var preferences = require(&quot;sdk/preferences/service&quot;);

var jsEnabledName = &quot;javascript.enabled&quot;;

var button = buttons.ActionButton({
    id: &quot;jsswitchbutton&quot;,
    label: &quot;Javascript(on/off)&quot;,
    icon: {
        &quot;16&quot; : &quot;./icon-16.png&quot;,
        &quot;32&quot; : &quot;./icon-32.png&quot;,
        &quot;64&quot; : &quot;./icon-64.png&quot;
    },

    onClick: handleClick
});

function handleClick(state) {
    var enabled = preferences.get(jsEnabledName);
    preferences.set(jsEnabledName, !enabled);

    if(enabled)
        button.icon = {
            &quot;16&quot; : &quot;./icon-16-off.png&quot;,
            &quot;32&quot; : &quot;./icon-32-off.png&quot;,
            &quot;64&quot; : &quot;./icon-64-off.png&quot;
        };
    else
        button.icon = {
            &quot;16&quot; : &quot;./icon-16.png&quot;,
            &quot;32&quot; : &quot;./icon-32.png&quot;,
            &quot;64&quot; : &quot;./icon-64.png&quot;
        };
}
</code></pre><br/>
После установки плагина на основной панели появится кнопка JS:<br/>
<br/>
<img src="https://habrastorage.org/files/56e/460/5dd/56e4605dd8374e97b0162c604be67832.png"/><br/>
<br/>
Нажав, на которую Javascript будет выключен и кнопка изменит свой вид на черно-белый:<br/>
<br/>
<img src="https://habrastorage.org/files/e45/f8e/830/e45f8e830efb473aa0ab536352068be9.png"/>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96045/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Thu, 23 Jul 2015 13:25:31 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Аналог Supports для объектов</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96031/</guid>
			<link>http://habrahabr.ru/sandbox/96031/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/delphi/" class="hub " title="Вы не подписаны на этот хаб" >Delphi</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>В рамках непрекращающейся борьбы за качество кода, я, как и многие мои коллеги-программисты, трачу уйму времени рефакторинг существующего кода. В свою чреду попали под раздачу и операторы with. Сначала переписыванию подлежали только уж совсем сложные и запутанные конструкции, затем конструкции с вложенными with-ами, теперь же я морщусь и стремлюсь убить практически любой with. До половины кода, содержащего with-ы, в моем коде приходилось на перекрытые у наследников TPersistent-а методы Assign и AssignTo, по этой причине именно этого быка я и возьму за рога для иллюстраций.<br/>
<a name="habracut"></a><br/>
Итак, старый код, который хочется переписать:<br/>
<pre><code class="delphi">procedure TVar.AssignTo(Dest: TPersistent);
begin
  if Assigned(Dest) and Dest.InheritsFrom(TVar) then
    with TVar(Dest) do
    begin
      VarName := Self.VarName;
      VarType := Self.VarType;
      VarValue := Self.VarValue;
    end
  else
    inherited;
end;
</code></pre><br/>
А вот и новый:<br/>
<pre><code class="delphi">procedure TVar.AssignTo(Dest: TPersistent);
var
  Dst: TVar;
begin
  if Inherits(Dest, TVar, Dst) then
  begin
    Dst.VarName := VarName;
    Dst.VarType := VarType;
    Dst.VarValue := VarValue;
  end
  else
    inherited;
end;
</code></pre><br/>
Процедура Inherits, использованная в новой реализации:<br/>
<pre><code class="delphi">function Inherits(const Instance: TObject; const ParentClass: TClass; 
  out NestedInstance): Boolean; overload;
function Inherits(const Instance: TObject; 
  const ParentClass: TClass): Boolean; overload;

function Inherits(const Instance: TObject; const ParentClass: TClass; 
  out NestedInstance): Boolean;
begin
  Result := Assigned(Instance) and Instance.InheritsFrom(ParentClass);
  if Result then
    Pointer(NestedInstance) := Instance
  else
    Pointer(NestedInstance) := nil;
end;

function Inherits(const Instance: TObject; 
  const ParentClass: TClass): Boolean; 
var
  NestedInstance: TObject;
begin
  Result := Inherits(Instance, ParentClass, NestedInstance);
end;
</code></pre><br/>
Чтобы не возникло впечатления, что эта простая функция полезна только таким with-оненавистникам, как я, уточню, что, конечно, дело не в with-ах. Эту функцию можно использовать всюду:<br/>
<pre><code class="delphi">procedure TMyForm.MyListBoxClick(Sender: TObject);
var
  Obj: TMyObject;
begin
  if (MyListBox.ItemIndex &gt;= 0) and Inherits(MyListBox.Items.Objects[MyListBox.ItemIndex], TMyObject, Obj) then
    MyLabel.Caption := Obj.Information;
end;
</code></pre><br/>
Хорошего кода, коллеги!

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96031/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Thu, 23 Jul 2015 13:25:30 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Современный интернет ушами незрячего — Заголовки</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96027/</guid>
			<link>http://habrahabr.ru/sandbox/96027/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/usability/" class="hub " title="Вы не подписаны на этот хаб" >Usability</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/accessibility/" class="hub " title="Вы не подписаны на этот хаб" >Accessibility</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><h4>Введение</h4><br/>
Доброго времени суток. Я думаю, что accessibility знакомое слово многим IT-специалистам (я не считаю себя специалистом, так как не имею образования в этой сфере, я любитель). Для кого-то accessibility знакомо, как абстрактное понятие доступности. Кто-то с ним работает каждый день, а кто-то его использует каждый день.<br/>
<a name="habracut"></a><br/>
В нашем мире существуют, помимо полноценных физически людей, люди с ограниченными возможностями (инвалиды), чаще называемые обывателями — калеки. Вы можете с ними столкнуться в любом месте. Колясочник, гуляющий в парке или покупающий продукты в большом супермаркете. Незрячий с тросточкой, гуляющий всё в том же парке, следующий на работу по известному ему маршруту. Глухонемой, которого очень часто не отличишь от обычного человека, пока не заговоришь с ним.<br/>
<br/>
Как понятно из заголовка статьи, рассказ ведётся о незрячих. Обыватели привыкли к тому, что незрячие ездят в общественном транспорте, ходят в магазины и гуляют по парку, но для многих людей является невероятной мысль о том, что они используют в своей повседневной жизни компьютеры. Сразу возникает вопрос: а каким же образом они его используют, если они ничего не видят? Как они могут видеть курсор мыши и читать статьи в интернете, как они могут набирать текст, когда они его совсем не видят? Ответ очень простой — на слух.<br/>
<br/>
Я полагаю, что кто-то знает об этом и сегодня таких людей уже довольно много. Хотя бы здесь, на Хабре, уже были статьи в которых упоминается общий принцип взаимодействия незрячего пользователя с компьютером. Чтобы не отнимать драгоценное время, перехожу к сути этой статьи.<br/>
<br/>
Опять же, как ясно из названия статьи, речь сегодня ведётся конкретно об использовании интернета незрячими, а ещё конкретнее, об важном элементе навигации на веб-страницах.<br/>
<br/>
<h4>Лирическое отступление</h4><br/>
Молодые люди, сидящие в общественном транспорте со смартфонами, они горбятся и неотрывно смотрят в экран. Эта картина знакома очень многим людям. Больше половины этих сидящих людей находятся в этот момент во всемирной паутине. Любой современный житель нашей планеты не может обходиться без электронной почты, всевозможных порталов, форумов, других площадок общения — источников информации. Незрячим тоже требуется информация, даже в некоторой степени её требуется больше, чем обычным людям. Незрячие тоже общаются на форумах, читают статьи, задают глупые вопросы Яндексу и Гуглу, смотрят/слушают видео на Ютьюбе, просматривают новостные ленты и электронную почту. Делают множество повседневных операций, к которым привык любой человек, работающий в офисе.<br/>
<br/>
Для незрячего всегда существовала, существует и будет существовать проблема доступа к информации. Сегодня её львиную долю мы получаем из всемирной паутины. Существуют самые разнообразные порталы и ресурсы, которые интересны тем или иным людям. Информация отличается не только своей информативностью и полезностью, но и удобством, доступностью.<br/>
<br/>
<h4>Они не так просты, как кажутся</h4><br/>
Я решил начать рассказ об специфике использования интернета незрячими именно с заголовков, потому что это очень простой, удобный и быстрый способ повысить доступность и удобочитаемость вашего сайта. К моему огромному сожалению, половина страниц Рунета ни имеют заголовков вообще, или имеют, но в виде заголовка всего сайта и не более.<br/>
<br/>
Заголовки придуманы очень давно. Это очень простой и удобный способ выделения блоков информации, на которые нужно обратить внимание. Заголовок на то и заголовок, чтобы что-то «заглавлять», например, начинать эту статью.<br/>
<br/>
Почему же наличие заголовков на сайте так важно для незрячих?<br/>
<br/>
Тут нужно пояснить немного принцип взаимодействия незрячего с веб-страницей в браузере. Главным инструментам для перемещения по элементам страницы служат стрелочки на клавиатуре. Они перемещают курсор. Курсор — это такая рамочка, которую не всегда даже видно. Мышь при этом вообще не двигается.<br/>
<br/>
Общая структура сайта выглядит следующим образом: вертикальное или горизонтальное меню, зона контента, правое меню или зона дополнительных ссылок, подвал. Когда зрячий человек находит нужную страницу в сети, он переходит непосредственно к информации в зоне контента и начинает читать. Незрячий же человек просматривает страницу линейно, от начала до конца, перемещаясь по ней при помощи стрелочек на клавиатуре вверх/вниз. Вообще не интересно читать всё меню сайта, всю информацию в левой колонке, человеку требуется перейти к искомой информации сразу, к статье, которую он желает прочесть. В этом помогают заголовки.<br/>
<br/>
Нажимая определённые клавиши на клавиатуре, можно быстро перемещаться по заголовкам страницы и даже выводить их список в отдельном окне. <br/>
<br/>
Заголовки позволяют быстро перемещаться по статье и по зонам страницы. Это очень удобно и здорово экономит время.<br/>
На многих сайтах визуально присутствуют заголовки, но на самом деле это параграфы оформленные при помощи CSS под заголовки. Параграфы элементы div и span вообще никак не озвучиваются, озвучивается лишь текстовая информация, находящаяся в них. То есть на страницах, построенных на визуальном принципе, где всё оформлено только под вид заголовков, становится невозможно выполнять быструю навигацию. Любому незрячему человеку приходится тратить уйму времени на быстрое пролистывание кучи бесполезной информации. А ещё представьте себе, помимо озвучивания текста, ссылок, кнопок, система озвучивает все поля форм, графику, списки фреймы, и множество других элементов. Всё это множество элементов обозначается голосовыми сообщениями с соответствующей информацией, то есть количество пролистываемой информации возрастает в разы. Очень часто отпадает желание читать искомую информацию на подобных сайтах, потому что пока до неё доберёшься, расхочется вообще что-либо читать!<br/>
<br/>
За очень наглядным примером ходить далеко не требуется. Вот взять эту страницу, нужно нажать лишь одну клавишу, и будет совершён переход к интересной для человека информации, курсор минует верхушку сайта и окажется на заголовке первого уровня, который «заглавляет» эту статью. Дальше стрелочками переходим к тексту и начинаем чтение.<br/>
<br/>
А вот ещё один пример. на страницах этого ресурса, где представлены списки статей, очень много разнородной информации. Это довольно длинные страницы, и представьте себе, если бы заголовки статей на Хабре были бы оформлены только по визуальному признаку! Какой бы это был не удобный ресурс! При весьма внушительных объёмах информации, проходящих через него, его чтение было бы затруднено для незрячих. А когда есть заголовки можно менее чем за минуту ознакомится со всей страницей просто пролистав их, выбрать интересные статьи и прочитать. Если бы тут не было заголовков, на ознакомление с одной страницей уходило бы до получаса, потому что количество элементов на этих страницах переваливает за тысячу.<br/>
<br/>
<h2>Что я хотел сказать</h2><br/>
Этой статьёй я хочу обратить внимание людей, которые занимаются веб-дизайном и вёрсткой сайтов, на необходимость использования заголовков для выделения важной информации, выделения разделов страниц. Это крайне удобное средство навигации для тысяч незрячих пользователей, которые, возможно, составят половину аудитории вашего сайта.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96027/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Wed, 22 Jul 2015 19:25:25 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Эврестический POS-tagging русского языка на js</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/96005/</guid>
			<link>http://habrahabr.ru/sandbox/96005/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/i_am_advertising/" class="hub " title="Вы не подписаны на этот хаб" >Я пиарюсь</a>
</div>Здравствуйте! <br/>
<br/>
Собственно, я кратко расскажу о том, как, на мой взгляд, получился весьма неплохой <s>и почти</s> бессловарный <a href="https://en.wikipedia.org/wiki/Part-of-speech_tagging">POS-tagger</a> на javascript: <br/>
<br/>
<a href="http://pheast.ru/theme/pidginSyntax.js">PidginSyntax.js</a>;<br/>
Применение — «<a href="http://pheast.ru/theme/pidginSyntax.js">КРАСНОРЕЧИЕ</a>».<br/>
<br/>
Код опирается на <a href="https://github.com/fortnightlabs/snowball-js">лемматизатор</a> с алгоритмом <a href="http://snowball.tartarus.org/algorithms/russian/stemmer.html">Snowball</a>.<br/>
<a name="habracut"></a><br/>
pidginSyntax.js работает так:<br/>
<ul>
<li>Каждое слово в тексте разбивается на лемму и «окончание»</li>
<li>Используя список «окончаний», типичных для каждой части речи</li>
<li>Часто употребляемые слова, некорректно определяемые pidginSyntax' ом, выделены в отдельный список — по большей части, его составляют служебные слова</li>
</ul><br/>
pidginSyntax отлично определяет причастия, глаголы и прилагательные и чуть хуже — существительные.<br/>
<br/>
Хуже всего определяются наречия, т.к. «слово» довольно трудно отличить от «ново» лишь по морфемам. Поэтому большинство наречий по умолчанию откатываются в существительные, но используя частотный словарь, выделены некоторые предпоследние буквы, типичные для наречий — «ш», «в», «х». Это значительно повышает точность различия pidginSyntax' ом наречий.<br/>
<br/>
Также, код предусматривает игнорирование возвратного суффикса «ся».<br/>
<br/>
Этот код можно использовать для работы, в которой приемлема точность в 70-90% и необходим легкий POS-tagger. Он занимает в 100 раз меньше места, чем корпусные POS-tagger'ы (<a href="http://nlp.stanford.edu/software/tagger.shtml#Download">например</a>) и работает в 5-20 раз быстрее оных.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/96005/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Wed, 22 Jul 2015 13:25:30 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Настройка Email оповещения пропущенных звонков Астериск PBX</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95997/</guid>
			<link>http://habrahabr.ru/sandbox/95997/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/Asterisk/" class="hub " title="Вы не подписаны на этот хаб" >Asterisk</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><habracut/><br/>
Будучи главным инженером по Asterisk столкнулся с задачей по настройке e-mail оповещений в случае пропущенных звонков и т. д. В связи с чем написал инструкцию, которую представляю ниже.<br/>
<br/>
<b>1. Задача:</b><br/>
1.1. Обеспечить возможность отправки Email оповещения о пропущенных звонках на Астериске с помощью sendmail relay через учетную запись gmail.com.<br/>
<br/>
<b>2. Исходная система:</b><br/>
2.1. Установленна система Ubuntu 12.04 LTS Server;<br/>
2.2. Имеется логин и пароль от учетной записи root;<br/>
2.3. Установлен астериск.<br/>
<a name="habracut"></a><br/>
<b>3. Этапы решения:</b><br/>
3.1. Установка OpenSSL:<br/>
3.1.1. #apt-get install openssl<br/>
3.2. Установка Sendmail:<br/>
3.2.1. #apt-get install sendmail<br/>
3.3. Создание сертификата с помощью OpenSSL:<br/>
3.3.1. Создаем директорию под сертификаты: #mkdir /etc/mail/certs<br/>
3.3.2. Ограничиваем права на чтение, запись и исполнение суперпользователем. #chmod 700 /etc/mail/certs<br/>
3.3.3. Переходим в нашу директорию #cd /etc/mail/certs<br/>
3.3.4. Начинаем генерировать сертификат #openssl dsaparam 1024 -out dsa1024 -out dsa1024.pem<br/>
3.3.5. #openssl req -x509 -nodes -days 3650 -newkey dsa:dsa1024.pem -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem<br/>
3.3.6. заканчиваем генерировать сертификат #openssl req -x509 -new -days 3650 -key /etc/mail/certs/mykey.pem -out /etc/mail/certs/mycert.pem <br/>
3.3.7. создаем линк #ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem<br/>
3.3.8. меняем права #chmod 600 /etc/mail/certs/*<br/>
3.4. Подготовка конфигов для компиляции конечной конфигурации для Sendmail пакета:<br/>
3.4.1. Создаем папку #mkdir /etc/mail/auth<br/>
3.4.2. Создаем файл и редактируем его #nano /etc/mail/auth/authinfo<br/>
3.4.3. Вбиваем в файл следующую информацию:<br/>
AuthInfo:smtp.gmail.com:587 «U:root» «I:USERNAME@gmail.com» «P:PASSWORD» «M:PLAIN»<br/>
AuthInfo: «U:root» «I:USERNAME@gmail.com» «P:PASSWORD» «M:PLAIN»<br/>
<br/>
Где USERNAME@gmail.com – учетная запись на gmail.com<br/>
PASSWORD – пароль от учетной записи от gmail.com<br/>
<br/>
3.4.4. Конвертируем данный файл:<br/>
makemap hash -r /etc/mail/auth/authinfo &lt; /etc/mail/auth/authinfo<br/>
3.4.5. Добавляем в /etc/mail/sendmail.mc нужную конфигурацию. (Важно: сделать это до первого FEATURE)<br/>
<code>#nano /etc/mail/sendmail.mc
dnl # Smrp relay
define(`CERT_DIR', `MAIL_SETTINGS_DIR`'certs')
define(`confCACERT_PATH', `CERT_DIR')
define(`confCACERT', `CERT_DIR/CAcert.pem')
define(`confSERVER_CERT', `CERT_DIR/mycert.pem')
define(`confSERVER_KEY', `CERT_DIR/mykey.pem')
define(`confCLIENT_CERT', `CERT_DIR/mycert.pem')
define(`confCLIENT_KEY', `CERT_DIR/mykey.pem')
dnl #
dnl # gmail auth
define(`SMART_HOST',`[smtp.gmail.com]')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
define(`confAUTH_OPTIONS', `A p')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
FEATURE(`authinfo',`hash -o /etc/mail/auth/authinfo.db')dnl</code><br/>
3.4.6. Компилируем конфигурацию:<br/>
make -C /etc/mail<br/>
3.5. Создание скрипта на шеле который будет отправлять сообщения о звонках (пропущенных, принятых и т д);<br/>
3.5.1. Создание шелл скрипта #nano /var/lib/asterisk/agi-bin/processEmail.sh<br/>
3.5.2. Вбиваем в данный файл:<br/>
<pre><code>#!/bin/sh
#данный скрипт используется для отправки оповещении о событиях связанные со звонком
#$1  первая переменная принимаемая данным скриптом есть адресс электронной почты куда надо отправить сообщение
#$2  номер телефона звонящего
#$3  имя звонящего
#$4  статус звонка
#$5  статус голосового сообщения
#$6  куда звонили

if [ $# != 6 ]
then exit 1
fi

#Store command line args in nice variables
EMAIL=$1
CALLERIDNUM=$2
CALLERIDNAME=$3
DIALSTATUS=$4
VMSTATUS=$5
EXTEN=$6

DEBUG=0         #Set to 0 for standard operation.  1 will log inputs and mail commands for debugging.
LOGFILE=&quot;/var/log/asterisk/IncomingCalls.log&quot;

SENDMAIL=1      #Set to 1 if you want it to email the alert.  0 is useful for debugging.
EMAILCMD=&quot;/usr/sbin/sendmail -t&quot;
FROMEMAIL=&quot;your_sending@email.net&quot;
SUBJECT=&quot;[PBX] Incoming call for extension ${EXTEN}&quot;

#log mail command
if [ ${DEBUG} -eq 1 ]; then
        echo $1 $2 \&quot;$3\&quot; $4 $5 $6 &gt;&gt; ${LOGFILE}
fi

#Check we have an email address if not quit
if [ &quot;${EMAIL}&quot; = &quot;&quot; ]; then
        exit 0
fi

if [ ${DIALSTATUS} = &quot;CANCEL&quot; ]; then
        BODY=&quot;${CALLERIDNAME} (${CALLERIDNUM}) hung up.&quot;
elif [ ${DIALSTATUS} = &quot;ANSWER&quot; ]; then
        BODY=&quot;${CALLERIDNAME} (${CALLERIDNUM}) was answered by ${EXTEN}.&quot;
else
        BODY=&quot;[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up.&quot;
        #check for hangup in vm menu.  ex call went to vm and user hung up
        if [ ${VMSTATUS} = &quot;USEREXIT&quot; ]; then
                BODY=&quot;[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up on vm.&quot;
        fi
        #check for hangup in vm menu.  ex call went to vm and user hung up
        if [ ${VMSTATUS} = &quot;FAILED&quot; ]; then
                BODY=&quot;[ ${DIALSTATUS} ] ${CALLERIDNAME} (${CALLERIDNUM}) hung up on vm.&quot;
        fi
        #if they left a vm we already would get an email.  Don't need a 2nd
        if [ ${VMSTATUS} = &quot;SUCCESS&quot; ]; then
                exit 0
        fi
fi

#log mail command
if [ ${DEBUG} -eq 1 ]; then
echo &quot;To: ${EMAIL} Subject: ${SUBJECT} ${BODY}&quot; &gt;&gt; ${LOGFILE}
fi

#send email
if [ ${SENDMAIL} -eq 1 ]; then
${EMAILCMD} &lt;&lt;INLINE
To: ${EMAIL}
From: ${FROMEMAIL}
Subject: ${SUBJECT}

${BODY}

Asterisk PBX

INLINE
fi

exit 0
</code></pre><br/>
3.5.3. Меняем права на данный файл:<br/>
#chmod 755 /var/lib/asterisk/agi-bin/processEmail.sh<br/>
3.6. Настройка Asterisk на отправку сообщений о событиях, связанных с обработкой звонка.<br/>
#nano /etc/asterisk/extensions.conf<br/>
И в конце экстеншена на который звонки будут отправляться и оповещения о звонках, которых должны приходить оповещения, добавляем ниже:<br/>
exten =&gt; h,1,System(asterisk-ic «my@email.net» &quot;${CALLERID(num)}&quot; &quot;${CALLERID(name)}&quot; &quot;${DIALSTATUS}&quot; &quot;${VMSTATUS}&quot; &quot;${EXTEN}&quot;)<br/>
где my@email.net – почта куда хотим отправить сообщение о событии связанное со звонком.<br/>
3.7. Перезапускаем сервисы:<br/>
#service sendmail restart<br/>
#servie asterisk restart ( или config reload /etc/asterisk/extensions.conf или dialplan reload в консоли астера)<br/>
3.8. Проверяем.<br/>
<br/>
При создании использовал следующие материалы:<br/>
<a href="http://habrahabr.ru/sandbox/56133/">habrahabr.ru/sandbox/56133</a><br/>
<a href="http://www.phinesolutions.com/sendmail-gmail-smtp-relay-howto.html">www.phinesolutions.com/sendmail-gmail-smtp-relay-howto.html</a><br/>
<a href="http://linuxconfig.org/configuring-gmail-as-sendmail-email-relay">linuxconfig.org/configuring-gmail-as-sendmail-email-relay</a><br/>
<a href="http://www.theschmandts.org/blog/email-notifications-for-missed-calls-in-asterisk">www.theschmandts.org/blog/email-notifications-for-missed-calls-in-asterisk</a>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95997/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Wed, 22 Jul 2015 13:25:29 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Игра про ракету в космосе</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95995/</guid>
			<link>http://habrahabr.ru/sandbox/95995/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/unity3d/" class="hub " title="Вы не подписаны на этот хаб" >Unity3D</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/gdev/" class="hub " title="Вы не подписаны на этот хаб" >Game Development</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Лето — слишком длинное, чтобы не попробовать себя в игрострое. Захотелось сделать небольшую игру, где можно перемещаться между небольшими планетами, перепрыгивая с одной на другую.<br/>
<br/>
Основной фишкой игры является переменчивое притяжения (при приближении к планете, сменяется и притяжение) и соответствующие переходы в управлении. <br/>
<br/>
Игру можно сделать и от первого лица, но тогда будет сложнее ориентироваться.<br/>
<br/>
Если вас заинтересовала реализация этой идеи, прошу под кат<br/>
<br/>
<img src="https://habrastorage.org/files/9e3/f70/3f9/9e3f703f934c4b2c9117bdfce2dc8f6e.jpg"/><br/>
<a name="habracut"></a><br/>
Графика и дизайн всегда решают самую главную роль в любом проекте. Поэтому было принято решение сделать руками модель планеты и бензобака. В связи с нестандартным перемещением по планетам (передвижение ракеты должно быть не параллельно поверхности, а по ней (чтобы ракета всегда была в состоянии старта)), вместо модели ракеты была использована обычная сфера.<br/>
<br/>
<h4>Первые проблемы</h4><br/>
Одной из первых загвоздок стало передвижение по планете. Если сделать так, чтобы по планете можно было идти так же, как и в других играх от третьего лица, то нужно было сделать крайне активную камеру, которая бы учитывала радиусы планет, на которых находится наш персонаж — ракета и перемещение камеры.<br/>
<br/>
Много вычислений, может быть, можно упростить?<br/>
<br/>
И тут на выручку пришла хитрость — камера может перемещаться, но не вращаться. С одной стороны идея провальная, так как не будет видно, что твориться на другой стороне планеты, но с другой стороны это сильно облегчит задачу работы с камерой.<br/>
Чтобы смягчить это было сделано:<br/>
<ul>
<li>во первых — планеты стали вращаться каждая вокруг своих двух осей (скорость по каждой из них регулируется рандомом, потому они всегда разные). <div class="spoiler"><b class="spoiler_title">Как это выглядит</b><div class="spoiler_text"><img src="https://habrastorage.org/files/56e/ddb/9be/56eddb9be6494ae68991dcba444ae315.jpg"/><br/>
<img src="https://habrastorage.org/files/b3a/d8f/cbf/b3ad8fcbfe0e48f5a236548cc089d063.jpg"/><br/>
</div></div></li>
<li>во вторых — перемещение по планете можно было осуществлять только по двум осям (x и y, а ось z отвечает за полет — об этом дальше). <div class="spoiler"><b class="spoiler_title">Реализация</b><div class="spoiler_text"><pre><code class="cpp">		float A = (gameObject.transform.position.x - main.transform.position.x);
		float B = (gameObject.transform.position.y - main.transform.position.y);
		float C = (gameObject.transform.position.z - main.transform.position.z);
		R = Mathf.Sqrt (A * A + B * B + C * C);
/*		float r = Mathf.Sqrt ((gameObject.transform.position.x - main.transform.position.x) * (gameObject.transform.position.x - main.transform.position.x) +
		                      (gameObject.transform.position.y - main.transform.position.y) * (gameObject.transform.position.y - main.transform.position.y) +
		                      (gameObject.transform.position.z - main.transform.position.z) * (gameObject.transform.position.z - main.transform.position.z));
*/		float zn;
		if (Input.GetKey(KeyCode.W))
		{
//			zn=-Mathf.Sign (gameObject.transform.position.z - main.transform.position.z);
			dy=-(C/Mathf.Sqrt (B*B+C*C));
			dz=(B/Mathf.Sqrt (B*B+C*C));
		}
		if (Input.GetKey(KeyCode.S))
		{
			dy=(C/Mathf.Sqrt (B*B+C*C));
			dz=-(B/Mathf.Sqrt (B*B+C*C));
		}
		if (Input.GetKey(KeyCode.D))
		{
			dx=-(C/Mathf.Sqrt (C*C+A*A));
			dz=(A/Mathf.Sqrt (C*C+A*A));
		}
		if (Input.GetKey(KeyCode.A))
		{
			dx=(C/Mathf.Sqrt (C*C+A*A));
			dz=-(A/Mathf.Sqrt (C*C+A*A));
		}

		Vector3 Move = new Vector3 (dx*speed_boost, dy*speed_boost, dz*speed_boost);
		transform.position = transform.position + Move;
</code></pre><br/>
</div></div></li>
</ul><br/>
Перемещение было сделано по отклонению на небольшой угол по радиусу планеты.<br/>
<br/>
<h4>Гравитация</h4><br/>
С гравитацией пришлось слегка побороться, но в основу лёг закон всемирного тяготения, где координаты брались из центра планеты и центра ракеты-сферы.<div class="spoiler"><b class="spoiler_title">Ещё кусочек кода</b><div class="spoiler_text"><pre><code class="cpp">		float r = Mathf.Sqrt ((gameObject.transform.position.x - player.transform.position.x) * (gameObject.transform.position.x - player.transform.position.x) +
		                (gameObject.transform.position.y - player.transform.position.y) * (gameObject.transform.position.y - player.transform.position.y) +
		                (gameObject.transform.position.z - player.transform.position.z) * (gameObject.transform.position.z - player.transform.position.z));

		F = gameObject.GetComponent&lt;Rigidbody&gt;().mass * player.GetComponent&lt;Rigidbody&gt;().mass / (r * r);

		player.GetComponent&lt;Rigidbody&gt;().AddForce (F*((gameObject.transform.position.x-player.transform.position.x)/r),
		                               F*((gameObject.transform.position.y-player.transform.position.y)/r),
		                               F*((gameObject.transform.position.z-player.transform.position.z)/r));

</code></pre><br/>
</div></div><br/>
Для того, чтобы «сменилось» гравитационное поле, его нужно пролететь. Сделать это можно, нажав на пробел. И тогда с почти что постоянной силой (немного шаманства, чтобы с разных планет можно было улететь) ракета летить в противоположную сторону от центра текущей планеты по линии, соединяющей их центры.<br/>
<br/>
<div class="spoiler"><b class="spoiler_title">Как это выглядит</b><div class="spoiler_text"><img src="https://habrastorage.org/files/349/836/e94/349836e9412848bbbbd01be69b01d568.png"/><br/>
</div></div><br/>
<h4>Небольшие фишки</h4><br/>
<ol>
<li>Крайне приятно смотреть на разукрашенные текстуры. Поэтому каждой планете следует сделать свою текстуру </li>
<li>Чтобы было интереснее — нужно ограничить скорость перемещения между планетами. Один из вариантов, это создание ресурса топлива, который медленно восстанавливается и быстро тратиться при отрыве от планет</li>
<li>В качестве стимула можно создать несколько «канистр», которые быстрее восстанавливают этот ресурс</li>
<li>И самое главное. Нужно передать атмосферу того, что дело происходит в космосе. Чем красочнее будет задний фон, тем лучше!</li>
</ol><br/>
<h4>Прокрастинация</h4><br/>
Самой большой проблемой при разработке является именно прокрастинация. Очень сложно, пока ищешь решение своей проблемы, не переключиться на другие прелести интернета. Будь то лекции с ютьюба или же туториалы на официальном сайте<br/>
<br/>
<h4>Типа заключение</h4><br/>
Лето — время реализации всех интересностей, что скопилось за учебный год (если ты студент или школьник). Не потеряйте его впустую!

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95995/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Tue, 21 Jul 2015 19:25:24 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Накладываем текст на пережатую картинку</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95993/</guid>
			<link>http://habrahabr.ru/sandbox/95993/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/webdev/" class="hub " title="Вы не подписаны на этот хаб" >Веб-разработка</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/web_design/" class="hub " title="Вы не подписаны на этот хаб" >Веб-дизайн</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/css/" class="hub " title="Вы не подписаны на этот хаб" >CSS</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>В качестве вступления хочу сказать, что был удивлен не найдя в гугле и на хабре такого способа наложения, а способ обладает одним весомым преимуществом — скрывает сжатие картинки, что весьма положительно влияет на вес сайта т.к можно сильно ужимать полноэкранные картинки. <br/>
<br/>
Вот возьмем для примера фото этого котика:<br/>
<img src="https://habrastorage.org/files/131/170/d21/131170d213b64c7d9cf2748d009d298d.jpg" alt="image"/><br/>
<a name="habracut"></a><br/>
Вес этого котика в разрешении 500х500 — 42,5 кб, мы его ужимаем и получаем это:<br/>
<br/>
<img src="https://habrastorage.org/files/84e/36d/7f4/84e36d7f438b4c4fbec57abdf74e8381.jpg" alt="image"/><br/>
<br/>
Вес всего 9,7 кб, но такое уже стыдно показывать даже в более низком разрешении, ситуацию ухудшает тот факт, что фото светлое: текст наложить проблематично, а если просто просто его затемнить, то выглядеть будет так же похабно. Но можно сделать хитрее: затемнить фото, замостив его маленькими черными полу-прозрачными геометрическими фигурами, проще всего градиентными кругами css:<br/>
<br/>
<img src="https://habrastorage.org/files/e77/d91/7c8/e77d917c88f746d4aab80ad1c155c1fb.jpg" alt="image"/><br/>
<br/>
Получится примерно такой результат, все зависит от фигуры, ее размера, прозрачности, но принцип тот же. Вместо градиента можно использовать маленькую png картинку, что очень удобно на олимпиадах, так как делается еще быстрее чем градиент, и работает в старых браузерах (слава богу в этом году уже не было ie6).<br/>
<br/>
И живой пример на <a href="http://codepen.io/expeerd/pen/ZGMBLj">Codepen</a>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95993/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Tue, 21 Jul 2015 13:25:28 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>По ту сторону баррикад. Тестер играет роль разработчика</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95981/</guid>
			<link>http://habrahabr.ru/sandbox/95981/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/webdev/" class="hub " title="Вы не подписаны на этот хаб" >Веб-разработка</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><h4>Введение</h4><br/>
Курсы по автоматизации qalalab.ru готовились долго. Большая часть подготовки ушла на написание текстов а русском, перевод их на английский язык. Я делал это сам, привлекал к работе профессионального переводчика, занимался редактурой, готовил туториал с кодом на битбакете. Для каждого шага в туториале была подготовлена отдельная ветка, естественно туториал был сначала пройдем автором и подготовлен эталонный код. Много времени ушло на отладку окружения на vagrant.<br/>
<br/>
<h4>Технологии применены</h4><br/>
Этот проект так же являлся первым production-проектом на AngularJS 1.4 — новому для меня фреймворка, изученного с помощью udemy.com совсем недавно. По ходу создания курс сменилась одна мажорная версия Django — с 1.7 на 1.8. Так же впервые для меня был использован Postgresql. <br/>
<a name="habracut"></a><br/>
Использование Angular наложили на определенные ограничения на backend. Таким образом система шаблонов Django нужно было интегрировать с системой шаблонов Angular. Это привело к лучшему разделению данных и представления. Чтобы сделать все еще красивее и лучше, мной был использован Django Rest Framework — так же впервые, так же был изучен в ходе написания проекта. Последнее чтобы было изучено и применено — фреимворк Django hvad для создания двуязычных моделей, чтобы хранить двуязычные статьи. При этом я работал fulltime естественно. Было чему уделить внимание. Я был рад когда все это наконец закончилось. Как только в я закончил вбивать все статьи + переводы на production-окружение, я опубликовал ссылку в facebook и рабочем чатике. О чем пожалел на следующий день. <br/>
<br/>
<h4>Fatal Error</h4><br/>
Написав 24 практико-теоретических беседы о том, что писать тесты нужно, что это ускоряет разработку, как именно это нужно делать, как настраивать окружение, как выстраивать процесс, создал пошаговый туториал, в котором все это применил на практике. При написании своего собственного проекта я полностью это проигнорировал, за что поплатился сразу же. <br/>
<br/>
<h5>Обнаруженные на production critical issues:</h5><br/>
<ul>
<li>При открытии беседы я получал 500 ошибку тк я неправильно кастомизировал миксины в Django Rest Framework для метода retrieve. Это можно было проверить локально элементарно, но это не было сделано по какой-то причине. Я удовлетворился тем что без ошибки смог посмотреть на список статей с introduction-ами </li>
<li> Скроллинг не работал в Safari в iOS. Причем он не работал в двух местах. И проверив и починив в один день в одном месте — в списке всех бесед, я не проверил это в представлении одной статьи. Починил это только на следующий день</li>
<li> Проект не был проверен в мобильных версиях. Вместе с тем гул-аналитика в первый же день показала что у меня не было ни одного захода с десктопных устройств. Может там пару процентов. Соответственно UX для мобильных устройств страдал безбожно. Пришлось увеличивать шрифты, кнопки делать более большими и яркими. В функциональности кроме проблем со скролом в iOS больше не было.</li>
<li>Оказалось что кому-то может захотеться прочитать следующую статью а не закрыть сайт сразу же — добавил кнопки “next” и “prev&quot;</li>
<li>Отформатирован первый раздел — вступление. Всякая философская шляпа</li>
</ul><br/>
<br/>
<h4>Заключение</h4><br/>
По-моему прекрасный кейс, который показывает зачем нужно комплексное тестирование на всех интересующих окружениях. Даже люди, которые этим зарабатывают на жизнь, оказавшись по другую сторону баррикад, игнорируют это. За что платят. Первое впечатление многих людей о моем продукте было безнадежно потеряно.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95981/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Tue, 21 Jul 2015 13:25:27 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Постоянная перезагрузка youtube при чтении и написании комментов</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95965/</guid>
			<link>http://habrahabr.ru/sandbox/95965/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/webdev/" class="hub " title="Вы не подписаны на этот хаб" >Веб-разработка</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/google_chrome/" class="hub " title="Вы не подписаны на этот хаб" >Google Chrome</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Решение для тех, кто так же как и я страдает от этой неведомой тупизны устроенной гуглом. Причина (кто не в курсе) в протоколе http/https, если зайти на страницу скажем: <a href="http://www.youtube.com/watch?v=o-bfZTLnzjY">www.youtube.com/watch?v=o-bfZTLnzjY</a> и попробовать оставить коммент она редиректнится на протокол с https, где такой проблемы уже нет, например здесь проблемы нет: <a href="https://www.youtube.com/watch?v=ZWSvVGzYmHI">www.youtube.com/watch?v=ZWSvVGzYmHI</a>.<br/>
<br/>
Теперь казалось бы какая проблема заходить на youtube по протоколу https, проблемы действительно нет, проблема в том, что в рассылках которые рассылает youtube (на подписанные каналы) ссылки ведут на http протокол, т.е. такая подлянка от компании добра, которая вынуждает меня каждый раз тратить нервные клетки.<br/>
<br/>
В общем решения, их два:<br/>
<a name="habracut"></a><br/>
1. Простое (для пользователей chrome) используем google extension: [https://chrome.google.com/webstore/detail/switcheroo-redirector/cnmciclhnghalnpfhhleggldniplelbg, предназначен для редиректа с одного адреса на другой, прописываем в нем правило: <a href="http://www.youtube.com">www.youtube.com</a> &gt; <a href="https://www.youtube.com">www.youtube.com</a><br/>
все готово, должно работать.<br/>
<br/>
2. Не простое но без использования extension:<br/>
Устанавливаем nginx (если не стоит конечно на комп).<br/>
<br/>
В файле hosts прописываем: <code>127.0.0.1 www.youtube.ru</code><br/>
<br/>
Добавляем конфигурационный файл для nginx следующего содержимого:<br/>
<pre><code>   server {
    server_name  www.youtube.ru;
    rewrite ^(.*) https://www.youtube.ru$1 permanent;
  }
  </code></pre><br/>
Перезапускаем nginx, пробуем. <br/>
<br/>
В общем у меня все работает использую первый способ, второй потестил тоже работает. Удачи.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95965/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 20 Jul 2015 19:10:26 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Самый опасный вирус-шифровальщик</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95963/</guid>
			<link>http://habrahabr.ru/sandbox/95963/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/virus/" class="hub " title="Вы не подписаны на этот хаб" >Вирусы и антивирусы</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>В сети появился опасный вирус-шифровальщик, который меняет формат фотографий, музыки и т.д. на <b>.xtbl</b>, а вместо названия, случайное сочетание букв и цифр.<br/>
<br/>
Вот так это выглядит (мой личный скриншот):<br/>
<a name="habracut"></a><br/>
<img src="https://habrastorage.org/files/db5/84f/16c/db584f16cffc457382fd35265f76247f.jpg"/><br/>
<br/>
<b>Как проверить, есть ли у меня этот вирус?</b><br/>
1.Ну конечно же проверить мультимедийные файлы (фото, видео, музыку)<br/>
2. Зайти на любой диск, и посмотреть наличие<b> txt</b> файлов с названием «README1», «README2» и т.д.<br/>
3. Бывает несколько разновидностей: 1-й, это тупо наличие txt файлов из второго пункта, и непосредственно зашифрованных файлов, 2-й, имеет те же признаки, но и сменяется картинка рабочего стола на эту:<br/>
<br/>
<img src="https://habrastorage.org/files/16f/987/174/16f987174afc40ffaed97b0686e25d3e.png"/><br/>
<br/>
<b>Можно ли расшифровать файлы?</b><br/>
Ответ — НЕТ!<br/>
И не пытайтесь, зря угробите до конца файлы.<br/>
Дешифровщика также нет, ответы от DrWeB и Лаборатории Касперского читайте в конце статьи.<br/>
<br/>
<b>А какая выгода создателям вируса?</b><br/>
О, это хороший вопрос, дело в том, что в тех самых «README.txt», и указано, как расшифровать файлы, а именно, будет указан e-mail и код, который нужно будет отправить туда.<br/>
<br/>
Дальше придут инструкции по дешифровке, а именно, она будет стоить <s>5 тысяч рублей</s>, 2015.03.29 вымогатели увеличили стоимость расшифровки — 15000 рублей!<br/>
<br/>
И то, не факт, что ваши файлы будут расшифрованы, та что, ни в коем случае,<b> не</b> отправляйте деньги!<br/>
<br/>
<b>Как не подхватить вирус?</b><br/>
1. Установите антивирус;<br/>
2. Установите программы, которые блокируют рекламу;<br/>
3. Меньше используйте файлoобменники, по типу turbobit и других, где полно рекламы;<br/>
4. Не заходите на подозрительные сайты.<br/>
<br/>
<b>Ответы от Компаний:</b><br/>
<br/>
Ответ <b>лаборатории Касперского</b>:<br/>
<blockquote>Файлы зашифрованы Trojan-Ransom.Win32.Shade. Для шифрования он использует криптографически стойкий алгоритм, поэтому расшифровка данных, к сожалению, не представляется возможной.<br/>
<br/>
Если нет заранее созданных резервный копий пострадавших файлов, можно попробовать воспользоваться встроенным в Windows механизмом «предыдущие версии файлов»: <a href="http://windows.microsoft.com/ru-ru/windows/previous-versions-files-faq">windows.microsoft.com/ru-ru/windows/previous-versions-files-faq</a></blockquote><br/>
<br/>
Ответ от антивирусной лаборатории <b>Drweb</b>:<br/>
<blockquote>Никаких способов расшифровать такое на данный момент не известно. <br/>
Ведутся исследования. <br/>
Прогноз, к сожалению, плохой: никаких даже путей для разработки декриптора не видно. <br/>
<br/>
Если мы когда-нибудь всё-же получим какую-либо практически полезную для расшифровки вашей информации, мы вам сообщим. <br/>
<br/>
&gt;Какие действия необходимо произвести чтобы данного заражения не происходило? <br/>
<br/>
К сожалению, в мире не существует антивирусов, способных обеспечить 100% зашиту информации от воздействия вредоносных программ, и в частности «энкодеров». <br/>
Это если говорить об антивирусах. <br/>
Но задача обеспечения информационной безопасности не может быть решена одними только антивирусными средствами. <br/>
Как минимум, помимо всего прочего, должно быть организовано резервное копирование данных. <br/>
Бэкап, выполняемый в соответствии с хорошей практикой резервного копирования: <br/>
в каждый момент времени должны существовать минимум две (последняя и предпоследняя) резервных копии; бэкап нельзя хранить в той системе, для которой он создан; и т.д. по учебнику. <br/>
<br/>
Общая рекомендация: обратитесь с заявлением в территориальное управление «К» МВД РФ; <br/>
по факту несанкционированного доступа к компьютеру, распространения вредоносных программ и вымогательства. <br/>
Образцы заявлений, а также ссылка на госпортал («Порядок приема сообщений о происшествии в органах внутренних дел РФ») есть на нашем сайте: <a href="http://legal.drweb.com/templates">legal.drweb.com/templates</a></blockquote><br/>
<br/>
Ответ от <b>Microsoft</b>:<br/>
<blockquote>Отправлять средства на счета злоумышленников не рекомендуется, так как всё равно никто не гарантирует, что после уплаты выкупа ваши файлы будут расшифрованы.<br/>
Вымогательство с применением вирусов–шифровальщиков получило значительное распространение в последние пару лет по всему миру. Последние версии этих вирусов используют стойкие алгоритмы шифрования. Без доступа к серверам злоумышленников получить ключ для расшифровки практически невозможно. Для борьбы с этим видом вымогательства нужны действия, которые выходят за рамки чисто IT-технологий.<br/>
Рекомендую Вам обратиться в территориальное управление «K» МВД РФ по факту несанкционированного доступа к компьютеру, распространения вредоносных программ и вымогательства.<br/>
Образцы заявлений есть на сайте DrWeb на странице, посвящённой этой проблеме.<br/>
<a href="http://legal.drweb.com/templates">legal.drweb.com/templates</a><br/>
<a href="http://st.drweb.com/static/new-www/legal/tmpl_statement_Encoder.doc">st.drweb.com/static/new-www/legal/tmpl_statement_Encoder.doc</a><br/>
Форум по теме вирус-шифровальщик xtbl:</blockquote>

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95963/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 20 Jul 2015 19:10:25 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Как быстро расставить lft и rgt</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95951/</guid>
			<link>http://habrahabr.ru/sandbox/95951/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/php/" class="hub " title="Вы не подписаны на этот хаб" >PHP</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>Встала задача добавить в таблицу, содержащую иерархию поля lft и rgt для более быстрого получения дочерних элементов.<br/>
<a href="http://www.sitepoint.com/hierarchical-data-database-2/">Пример</a><br/>
<br/>
Вся сложность заключается в том, что вам необходимо двигаться рекурсивно не только вниз, но и обратно вверх.<br/>
Был вариант идти рекурсивно от родителя к дочерним и обратно через SQL запросы, но это работало ОЧЕНЬ медленно.<br/>
<br/>
* Лирическое отступление<br/>
<blockquote>Код может быть не красиво оформлен и не оптимизирован и его необходимо расценивать только как альтернатива устоявшемуся способу движения по дереву.<br/>
</blockquote><br/>
<br/>
Для примера возьмем, то что предлагают нам в статье.<br/>
<img src="http://sitepointstatic.com/graphics/table02.gif" alt="image"/><br/>
<a name="habracut"></a><br/>
1. Нам необходим будет массив, в котором мы будем хранить ссылки на какие то участки другого массива.<br/>
<pre><code class="php"># Массив содержания ссылки
$arrayLink = array();

# Массив дерева
$ArrayTree = array();
</code></pre><br/>
<div class="spoiler"><b class="spoiler_title">Алгоритм построения будет следующим</b><div class="spoiler_text"><pre><code class="php">$ArrayExample = array(
    'Ltr'        =&gt; 0, 		# левый указатель
    'Rgt'        =&gt; 0, 		# правый указатель
    'Parent'     =&gt; 0, 		# родитель элемента
    'Child'      =&gt; array() 	# дочерние элементы
  );

  # Перебираем элементы с разбивкой на группы
  foreach( model::All()-&gt;GroupBy(100)-&gt;Elements as $iModelGroup){

  # Перебираем группу
    foreach( $iModelGroup-&gt;Elements as $iModel){

  # Если это корневой элемент
       if( $iModel-&gt;Parent-&gt;Id == 0 ){	
					$ArrayTree[$iModel-&gt;Id] = $ArrayExample;
					$arrayLink[$iModel-&gt;Id] = & $ArrayTree[$iModel-&gt;Id]['Child'];

  # Дочерние
				}else{
				
					$ParentModel = $iModel-&gt;Place;
				       
                    # Проверим на существование родителя
					if( !$ParentModel-&gt;Is ){
						continue;
					}
				
					$ArrayExample['Parent'] = $ParentModel -&gt;Id;
					$arrayLink[$ParentModel -&gt;Id][$iModel-&gt;Id] = $ArrayExample;
					$arrayLink[$iModel-&gt;Id] = & $arrayLink[$ParentModel -&gt;Id][$iModel-&gt;Id]['Child'];
				}
    }
    $iModelGroup-&gt;ElementsFreeMem;
  }
</code></pre><br/>
</div></div><br/>
Как это рабоает<br/>
<pre><code class="php">$arrayLink = array(
   [parent_id [ 1 ] ] +--+
   [parent_id [ 2 ] ] +--|--+
);                       |  |
                 v-------+  |
$ArrayTree = array(         |
   array(                   |
                        &lt;---+
   )
)
</code></pre><br/>
И так далее в глубину. Получаем 2 перелинкованных между собой массива, где мы зная родителя будем добавлять к нему дочерние элементы.<br/>
<br/>
Ltr и Rgt мы будем высчитывать, а Parent и Child нам понадобятся для навигации внутри дерева.<br/>
<br/>
Приступаем к обходу нашего массива и сохранению результата в базу данных.<br/>
<div class="spoiler"><b class="spoiler_title">Код</b><div class="spoiler_text"><pre><code class="php"># Выставляем указатель в 0
		$Pointer = 0;
		
		# Если нужно, то здесь надо выставить начало транзакции
		
		# Начинаем перебирать рекурсивно дерево и будем по нему опускаться и подниматься
		foreach($ArrayTree as $id_elem =&gt; $attrs){
			$Pointer++;
			if( !empty( $attrs['Child'] ) ){
				# Начальные элементы. Опускаемся вниз
				$Model = model::Find($id_elem);
				$Model-&gt;Update(
					array(
						'Lft' =&gt; $Pointer
					)
				);
				$Model-&gt;Save();
                # Опускаемся вниз массива
				self::ReplaceToDownPointer( $ArrayTree[$id_elem]['Child'] , $arrayLink , $Pointer );
			}
			# Поднимаемся вверх по массиву
			self::ReplaceToUpPointer( $id_elem , $ArrayTree[$id_elem]['Parent'] , $arrayLink , $Pointer );
		}
		
		# Если нужно, то здесь надо выставить конец транзакции
</code></pre><br/>
</div></div><br/>
Далее собственно пишем 2 метода <div class="spoiler"><b class="spoiler_title">ReplaceToDownPointer и ReplaceToUpPointer</b><div class="spoiler_text"><pre><code class="php"># Опускаемся рекурсивно
	static function ReplaceToDownPointer( & $array = array() , & $arrayLink = array() , & $Pointer ){
		foreach($array as $id_elem =&gt; $attrs){
			$Pointer++;
			$Model = model::Find($id_elem);
			$Model-&gt;Update(
				array(
					'Lft' =&gt; $Pointer
				)
			);
			$Model-&gt;Save();
			if( !empty( $attrs['Child'] ) ){
				self::ReplaceToDownPointer( $array[$id_elem]['Child'] , $arrayLink , $Pointer );
			}
			
			self::ReplaceToUpPointer( $id_elem , $array[$id_elem]['Parent'] , $arrayLink , $Pointer );
		}
	}
	
	# поднимаемся рекурсивно
	static function ReplaceToUpPointer( $id_elem = 0 , $parent = 0 , & $arrayLink = array() , & $Pointer ){	
		$Pointer++;
		$Model = model::Find($id_elem);
		$Model-&gt;Update(
			array(
				'Rgt' =&gt; $Pointer
			)
		);
		$Model-&gt;Save();
	}

</code></pre><br/>
</div></div><br/>
Примерные результаты на 1000 записей по данному алгоритму<br/>
1.82 сек<br/>
9.17 Mb<br/>
<br/>
По алгоритму с рекурсивным запросом дочерних элементов.<br/>
6.45 сек<br/>
45 Mb<br/>
* Этот код был написан на коленке, так как желания писать одно и то же в рабочее время не особо было.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95951/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 20 Jul 2015 13:10:29 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>Веб-приложения на Clojure</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95949/</guid>
			<link>http://habrahabr.ru/sandbox/95949/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/webdev/" class="hub " title="Вы не подписаны на этот хаб" >Веб-разработка</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div>На Хабре не так уж и много статей о Clojure, и это печально, намерен это исправить. Ниже я расскажу об отличном на мой субъективный взгляд инструменте — языке программирования Clojure и его библиотеках для создания веб-приложений.<br/>
<a name="habracut"></a><br/>
В этой статье не будет сравнения Clojure с другими языками, так как отталкиваясь от скромного опыта сравнивать не с чем.<br/>
<br/>
<h5>Основная информация о Clojure</h5><br/>
Clojure — это мультипарадигмальный язык программирования общего назначения поощряющий функциональное программирование. Основой этого языка и его синтаксиса является Lisp и его S-expressions. В отличие от Lisp'a Clojure включает и другие типы данных (коллекции), такие как: векторы, ассоциативные массивы, множества и очень удобные в использовании ключевые-слова.<br/>
Код компилируется JVM в java байт-код, что позволяет развертывать приложения на большом количестве платформ и само-собой использовать все доступные Java библиотеки.<br/>
<br/>
В интернетах полно информации о структурах Clojure, поэтому я пропущу описание оных.<br/>
<br/>
<h5>Комюнити</h5><br/>
Нельзя не сказать о сложившимся вокруг этого языка программирования сообществе, которое не столь огромно, но очень дружелюбно к новичкам и не только, они с готовностью помогают решать возникшие проблемы. Имеется большое количество видеоматериалов по самым разным аспектам использования Clojure, только вот практически все они на английском языке (рай для самореализации переводчиков). В конце статьи будут ссылки.<br/>
<br/>
<h5>Leiningen</h5><br/>
Альтернатива Maven. Используется для управления зависимостями проекта, настройками библиотек и глобальными настройками проекта. Проекты на Clojure создаются с помощью <br/>
команды:<br/>
<i>lein new &lt;название шаблона проекта (app|compojure|luminus...)&gt; &lt;название проекта&gt;</i><br/>
Это создает каталог с проектом Clojure, имеющую все необходимые файлы и каталоги. И конечно же создает файл project.clj в котором и подключаются все библиотеки и выставляются глобальные настройки: библиотек, проекта, компиляции, repl и т.п…<br/>
<br/>
<h5>Ring</h5><br/>
Ring — представляет из себя слой абстракции над HTTP, предоставляя взаимодействие с ним через простой API. Очень успешно применяется при создании модульных приложений.<br/>
Примеры использования, можно увидеть на их странице github (ссылка в конце статьи). Я же использую еще одну абстракцию над Ring, которая на мой взгляд более упрощает работу с маршрутами Ring и называется Compojure.<br/>
<br/>
<h5>Compojure</h5><br/>
Библиотека для маршрутизации Ring, с её помощью можно удобно упаковывать маршруты и использовать их в handler'e проекта.<br/>
<br/>
Ниже привожу простой пример:<br/>
<pre><code class="lisp">(defroutes auth-routes
  ; Очистка сессии
  (GET &quot;/logout&quot;

       ; Мы можем передать запрос контроллеру
       ; полностью
       request
       (-&gt; logout-controller))

  ; Обработчик авторизации через POST запрос
  (POST &quot;/login&quot;

        ; Или передать определенные параметры
        [login password]
        (login-controller login password))

  ; Авторизация
  ; Указан GET запрос и можно вызвать
  ; представление страницы напрямую
  ; или упаковать все в контроллер 
  ; из которого будет вызвана функция
  ; представления страницы
  (GET &quot;/login&quot;
       request
       (view/login-page)))
</code></pre><br/>
Такое тоже возможно:<br/>
<pre><code class="lisp">(defroutes users-routes

  ; Страница просмотра профиля
  (GET &quot;/profile/:login&quot;

       ; В request в :params уже будет доступно
       ; значение login с ключом указанным выше :login
       request
      
       ; Синтаксический сахар под названием -&gt;
       ; передает первый входящий аргумент
       ; функции обработчику.
       (-&gt; profile-view-controller-GET)))
</code></pre><br/>
Не стану приводить пример request'a так как вы все прекрасно понимаете как он выглядит. На этом о Compojure закончено.<br/>
<br/>
<h5>Buddy</h5><br/>
Библиотека для авторизации и аутентификации пользователей. Упаковывает сессии авторизованных пользователей в HTTP заголовок в свой backend, имеет функции для шифрования паролей и т.п…<br/>
<br/>
Пример шифрования пароля:<br/>
<pre><code class="lisp">(buddy.hashers/encrypt &quot;qwerty&quot;)
</code></pre><br/>
Пример функции авторизации из моего проекта:<br/>
<pre><code class="lisp">(defn login-controller
  &quot;Авторизация пользователя&quot;
  [request]
  (let [
        ; Получить данные из формы
        form {:login (get-in request [:form-params &quot;login&quot;])
              :password (get-in request [:form-params &quot;password&quot;])}
        
        ; Проверить данные на валидность
        validate (bouncer/validate form valid/login-validator)
        
        ; Обработать ошибки
        errors (first validate)
        return-errors (fn [message]
                        (util/return-messages
                         view/login-page
                         :error-message message
                         :data validate))]

    ; Ошибки при валидации
    (if-not errors

      ; Наличие пользователя с указанным логином
      (if (true? (db/user-exist? {:login (:login form)}))

        ; Получить структуру пользователя
        (let [user (db/get-user {:login (:login form)}
                                [:password])]

          ; Соответсвие паролей
          (if (hashers/check (:password form) (:password user))
            (do

              ; Обновить :visited
              (db/update-user
               {:login (:login form)}
               {:visited (util/date-time)})

              ; Создать новую сессию
              (util/create-session request (:login form) &quot;/&quot;))

            ; Если пароли не совпали
            (return-errors &quot;Неверный пароль&quot;)))

        ; Если логин не найден
        (return-errors &quot;Логин не найден&quot;))

      ; Ошибка при валидации
      (return-errors &quot;Проверьте правильность введенных данных&quot;))))
</code></pre><br/>
Так-же позволяет настраивать доступ к страницам в middleware, пример:<br/>
<pre><code class="lisp">(def rules
  [{:pattern #&quot;^/user/edit$&quot;
    :handler authenticated-user}

(defn on-error
  [request response]
  {:status  403
   :headers {&quot;Content-Type&quot; &quot;text/html&quot;}
   :body    (str &quot;Нет доступа к &quot; (:uri request) &quot;.&lt;br&gt;&quot; response)})

(defn wrap-restricted
  [handler]
  (restrict handler {:handler authenticated?
                     :on-error on-error}))

(defn wrap-identity
  [handler]
  (fn [request]
    (binding [*identity* (or (get-in request [:session :identity]) nil)]
      (handler request))))

(defn wrap-auth
  [handler]
  (-&gt; handler
      wrap-identity
      (wrap-authentication (session-backend))))

; И пример middleware base:
(defn wrap-base
  [handler]
  (-&gt; handler
      wrap-dev

      ; Наши правила доступа
      (wrap-access-rules {:rules rules :on-error on-error})

      ; Сама авторизация
      wrap-auth

      ; Сессия
      (wrap-idle-session-timeout
        {:timeout (* 60 30)
         :timeout-response (redirect &quot;/&quot;)})
      wrap-formats
      (wrap-defaults
        (-&gt; site-defaults
            (assoc-in [:security :anti-forgery] false)
            (assoc-in  [:session :store] (memory-store session/mem))))
      wrap-servlet-context
      wrap-internal-error
      wrap-uri))
</code></pre><br/>
<br/>
<h5>Selmer</h5><br/>
HTML шаблонизатор, вдохновленный Django. Позволяет очень гибко работать с данными в HTML шаблонах.<br/>
<br/>
<pre><code class="lisp">(defn registration-page
  &quot;Страница регистрации пользователя&quot;
  []
  (render &quot;registration.html&quot;
        {:foo [1 2 3 4 5]})))
</code></pre><br/>
<br/>
И сам шаблон:<br/>
<pre><code class="html">&lt;ul&gt;
    {% for i in foo %}
    {{i}}
    {% endfor %}
&lt;/ul&gt;
</code></pre><br/>
<h5>Monger</h5><br/>
Библиотека для работы с mongodb, вообще Clojure очень удобный инструмент для работы с базами данных, все благодаря его коллекциям.<br/>
 <br/>
Небольшой пример:<br/>
<pre><code class="lisp">(ns test.users.db
  (:require monger.joda-time
            [monger.collection :as m]
            [expertus.db :refer [db]]))

(def collection &quot;users&quot;)

(defn get-user
  &quot;Найти пользователя&quot;
  ([query]
   (m/find-one-as-map db collection query))
  ([query fields]
   (m/find-one-as-map db collection query fields)))

; Пример использования:
; Вернет нужные нам поля
(get-user {:login &quot;test&quot;} [:first-name :last-name])

; Вернет весь документ
(get-user {:login &quot;test&quot;})
</code></pre><br/>
<h6>Про обилие скобок</h6><br/>
Скобок много, нужно привыкнуть, но внимательный человек обратит внимание, что их не больше чем фигурных скобок в том-же JavaScript.<br/>
<br/>
<h5>Ссылки на описанные библиотеки</h5><br/>
<ul>
<li><a href="http://leiningen.org/">Leiningen</a></li>
<li><a href="https://github.com/ring-clojure/ring">Ring</a></li>
<li><a href="https://github.com/weavejester/compojure/wiki">Compojure</a></li>
<li><a href="https://github.com/funcool/buddy">Buddy</a></li>
<li><a href="http://clojuremongodb.info/">Monger</a></li>
<li><a href="https://github.com/yogthos/Selmer">Selmer</a></li>
</ul><br/>
<br/>
<h5>Дополнительные ссылки</h5><br/>
<ul>
<li><a href="http://www.clojure-toolbox.com/">Список библиотек Clojure</a></li>
<li><a href="http://clojuredocs.org/">Документация к функциям и ядру</a></li>
<li><a href="http://www.braveclojure.com/">Clojure howto</a></li>
<li><a href="http://clojure-doc.org/">Clojure docs</a></li>
</ul><br/>
<br/>
На этом пожалуй все, в дальнейших статьях если к ним проявится интерес я расскажу про каждую библиотеку в отдельности, про замечательный веб-сервер immutant, ни и конечно же про ClojureScript который удобно использовать при разработке front-end приложений и компилируется он javascript. Так-же хотелось бы осветить фреймфорк Luminus, который очень сильно помог мне разобраться с веб-разработкой на Clojure. Надеюсь моя, хоть и не всеобъемлющая статья заинтересует вас просмотреть возможности этого замечательного инструмента. <br/>
<br/>
Благодарю, всего вам лучшего!

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95949/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 20 Jul 2015 13:10:28 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
		<item>
			<title>10 лет «на коленке» и вынужденная эволюция — на заметку молодым</title>
			<guid isPermaLink="true">http://habrahabr.ru/sandbox/95945/</guid>
			<link>http://habrahabr.ru/sandbox/95945/</link>
			<description><![CDATA[<div style="font-size:x-small;padding-bottom:2em;">
		<a href="http://habrahabr.ru/hub/hi/" class="hub " title="Вы не подписаны на этот хаб" >Высокая производительность</a><span class="profiled_hub" title="Профильный хаб">*</span>, 
		<a href="http://habrahabr.ru/hub/api/" class="hub " title="Вы не подписаны на этот хаб" >API</a><span class="profiled_hub" title="Профильный хаб">*</span>
</div><h4>Здравствуйте, присаживайтесь</h4><br/>
Все мы, здесь собравшиеся, регулярно что-то пробуем, экспериментируем, зачастую в контексте «а дай попробую». На выходе получаем эдакий промежуточный результат в виде чего-то функционирующего, но не пригодного для использования в деле. По крайней мере без доведения до ума, о чем и пойдет речь в статье, в завершении которой речь дойдет до полноценного API и связанные воедино утилит, сопровождающих жизнь автора на более промышленном уровне.<br/>
<br/>
В преддверии 28-летия решил непременно затронуть эту тему с оглядкой уже теперь на 10 лет опыта, вспоминая о всех набитых шишках. Тема удостоена внимания ввиду огромного количества времени, которое мы тратим на свое обучение, результат которого зачастую не используем, а ведь можем!<br/>
<br/>
<h4>Делай так, чтобы не краснеть завтра</h4><br/>
Однажды, лежащая на полке поделка становится полезной в работе, но когда мы ее делали, не уделили внимание аккуратности, поделка представляет функциональную ценность, но внешний вид не позволяет вынести на публику — вырезая буратино, держите руки чистыми, чтобы не заляпать.<br/>
<a name="habracut"></a><br/>
<h4>Держите все на готове</h4><br/>
От машины, стоящей во дворе дома со спущенными колесами, пользы нет. Как нет и пользы от забытого, на коленке собранного, проекта, вовремя не доведенного до ума. Когда мы добиваемся интересного и даже полезного результата, мы радуемся и тут же забываем о том, что делали, переключаемся на что-то другое, более интересное, даже не сохранив в заметках минимальную информацию из головы о том, как запустить, краткий принцип работы и информацию для воспроизведения результата.<br/>
<br/>
<h4>Рассказывайте о достижениях своему окружению</h4><br/>
Никогда не обратятся за услугой к тому, об услугах которого ничего не знают. Поэтому, если Вы специалист в какой-то сфере, о Вас должны знать! Как о специалисте — рассказывайте о том, чем живете, чем занимаетесь профессионально, об увлечениях менее профессиональных. Это сравнимо с вывеской ресторана — давайте понять, что к Вам можно обратиться за чем-то конкретным, держите яркой вывеску на своем «фасаде».<br/>
<br/>
<h4>Храните проекты в красивых коробках</h4><br/>
Когда в ресторан приходит посетитель и просит чай, он ожидает приятный напиток — горячий, ароматный, вкусный и с возможностью подсластить по вкусу. Когда к нам обращаются за услугой, мы должны аналогичным способом преподнести ее, предложить дополнительную порцию «сахара» или «десерт» к ней. Отдельно остановлюсь на этом подробнее: в коробочке та самая, на коленке собранная когда-то штуковина, не представлявшая когда-то большого интереса для публики. Но мир так устроен, что все все запоминают и откладывают в подсознании, а когда это «что-то» становится действительно нужно, о Вас непременно вспоминают.<br/>
<br/>
<h4>Когда красивых коробок становится достаточно много</h4><br/>
Собирайте проекты вместе, предлагайте комплекс услуг, выводите на новый уровень все то, что у Вас уже есть за плечами. Все, что сделано с душой и для себя, зачастую очень качественный продукт — продукт, который не сравнится с продуктом больших корпораций по начинке. Ваш продукт — уникальный. Продвигайте его.<br/>
<br/>
<h4>У меня ничего не получится</h4><br/>
Сразу, да, вероятно, не получится, но на 10 раз — обязательно! Каждая итерация происходит в другое время, в другом окружении, в условиях другого времени года, другой экономической ситуации и так далее. Даже просто повторив попытку через год не взлетевшее год назад может рвануть как ракета. Вспомним слоган Nike — «Just do it!».<br/>
<br/>
<h4>Для тех, кто ждал технического блока</h4><br/>
Переходим на более технический язык и давайте посмотрим на все те «коробочки», что они из себя представляют. В моем случае это сервис: по обработке данных, внешним запросам, сопряжению с миром — если коротко. Представьте, что однажды Вы научились парсить программу телепередач телевизионного канала, потому что когда-то очень любили один сериал и предпочитали получать уведомление от скрипта о надвигающейся серии. Или, быть может, Вы настолько умело пользуетесь Arduino и подобными штуками, что телевизор даже сам включался в нужное время, при условии нахождения Вашего телефона в зоне видимости домашнего WiFi. Вроде бы все просто, но потом будет валяться и пылиться…<br/>
<br/>
Но только подумайте, в нашем мире есть компании, продающие услуги цифрового ТВ, все они нуждаются в программах телепередач — искра между извилинами уже проскочила? Спустя годы Ваши пути обязательно пересекутся с теми, кто заинтересован в этой информации и Ваше сотрудничество окажется весьма плодотворным. Это был простейших пример, когда безнадежный скрипт способен принести доход в дальнейшем, и так во всем!<br/>
<br/>
Сколько я читаю о тех, кто разбирает капчу на сайте Почты России для отслеживания отправлений, сколько я видел искренне умилявшихся людей, узнававших о существовании API у самой Почты России — все эти люди изобретали что-то схожее с повторением велосипеда. Когда мое окружение повзрослело вместе со мной, наши взгляды как-то поменялись, то, что мы делали раньше из серии «решить задачу в лоб с помощью лома» теперь делалось с заделом на будущее.<br/>
<br/>
На примере той же Почты России и отслеживания отправлений, задача, стоявшая у друга на работе, теперь не просто реализовывалась его силами для компании, а его силами для его компании и других компаний — тот сервис, что работал бы для одной компании, теперь мог работать для многих компаний, а всего-то разница в том, что более «прошаренный» мозг реализовывал задачу не в контексте частного случая, а выводил на уровень отдельного сервиса, доступ к которому оплатившей реализацию компании становился бесплатным, а суетливый коллектив разработчиков получал возможность заработать на предоставлении этого сервиса и другим без затрат особых ресурсов. Только представьте, сколько раз с подобной задачей сталкивается программист 1С, когда весь мир крутится вокруг одних и тех же данных… сырых данных…<br/>
<br/>
<h4>И что же дальше?</h4><br/>
Твердая почва под ногами, ночи без сна и собирание пазла воедино — это тот путь, который я рекомендую не повторять и по мере появления кусочков пазла вставлять их в общую картину, но расскажу для общего понимания, почему все надо делать сразу и как следует.<br/>
<br/>
<h5>Из стороны в сторону</h5><br/>
Однажды меня занесло в приложения Вконтакте, никогда с ним не работал и не писал чего-то подобного, но нос засунуть был не прочь. Это просто еще один опыт, сказавшийся на выборе дальнейшего вектора развития моей паранойи, но паранойя — это защитный механизм организма, с ним надо считаться, что я и сделал. Так что же там такого страшного было? В принципе — ничего. Ничего, кроме людей: школьников, студентов, которым было интересно что-то поломать, порвать чей-то шаблон и следом еще написать, мол, вот какой я крутой, нашел дырку в приложении. Хотя мне так и не довелось лично столкнуться с такими случаями, но путь развития был выбран особенный.<br/>
<br/>
<h5>А тем временем</h5><br/>
Amazon посетил Москву уже во второй раз с презентацией своих сервисов — AWS. Если коротко, то вся эта «шобла» сервисов позволяет очень гибко построить систему, устойчивую к возрастанию нагрузки. В целом, мозг доразвернулся в правильную сторону и выстроилось понимание того, как все должно быть, с учетом новой информации по техническим возможностям кратковременного привлечения огромных ресурсов для удовлетворения потребностей. К слову говоря, можно на один час арендовать очень мощный сервер и обработать огромную тонну данных, свалившихся, например, в ходе какого-нибудь рекламного мероприятия. Будет очень дешево на фоне статично работающих серверов. Эту возможность я также не хотел упускать и учел при разработке, которая на тот момент уже который месяц затягивалась, словно в ожидании новых вводных данных.<br/>
<br/>
Во второй части речь пойдет о деталях и процессе выработки политики построения API, первых подводных камнях и первом запущенном сервисе на базе новой разработки.

        <div class="clear"></div>
<div style="font-size:x-small;padding-top:2em;">Original source: <a href="http://habrahabr.ru/sandbox/95945/">habrahabr.ru</a>.</div>]]></description>
			<pubDate>Mon, 20 Jul 2015 13:10:27 GMT</pubDate>
			<author>nospam@nospam.com</author>
		</item>
</channel>
</rss>