Эксперты призывают готовиться к криптоапокалипсису



На прошедшей в Лас-Вегасе конференции Black Hat с особым заявлением выступили четверо исследователей кибербезопасности: Алекс Стеймос, Том Риттер, Томас Птачек и Джавед Сэмюель. Суть их просьбы сводилась к следующему: существующие алгоритмы, лежащие в основе современной криптографии, могут находиться в опасности прогресса решения математических задач, поэтому всем нам следует отказаться от существующих SSL-сертификатов в пользу более новых методов криптографии.

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

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

Наиболее распространённые асимметричные алгоритмы — алгоритм Диффи — Хеллмана, RSA, DSA — полагаются на сложность двух задач: факторизации целых чисел и дискретного логарифмирования. Современная математика не располагает простыми решениями, выполняемыми за полиномиальное время, однако в сравнении с десятилетиями медленного продвижения вперёд резкая активность в этой области последнего полугода очень подозрительна.

Были получены быстрые алгоритмы дискретного логарифмирования, имеющие ограниченное применение. На данный момент не существует известных способов использования этих наработок в практической криптографии, но даже эти математические достижения пугают криптографистов. Исследователи проводили аналогии с атаками на SSL вида BEAST, CRIME и BREACH. Использованные для этих атак особенности асимметричной криптографии точно так же долгие годы считались сугубо теоретическими и не имеющими практического применения, но всё вышло иначе.

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

Стоит помнить, что пострадать от полиномиальных алгоритмов общего применения факторизации целых чисел и дискретного логарифмирования может не только SSL, но и другие протоколы и методы шифрования данных: SSH, PGP и т. д. Под угрозой будут обновления с новыми методами криптографии для операционных систем и прикладного ПО: поскольку программы опираются на цифровые подписи, быстро появятся поддельные пакеты обновлений. Хотя эта катастрофа может произойти не скоро, а может, и вовсе не произойдёт никогда, поскольку будет доказана невозможность решения соответствующих математических задач за полиномиальное время, нам следует обезопасить себя развертываением альтернативных методов криптографии, считают исследователи.

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

Поддержка же эллиптической криптографии имеет свои проблемы. Большая часть технологии запатентована компанией BlackBerry, и патентные проблемы заставили некоторых производителей отказаться от поддержки технологии. Использующие эллиптическую криптографию протоколы (к примеру, последняя реализация технологии SSL — TLS 1.2) пока ещё не поддерживаются достаточно широко. Виновны в этом также сертификационные центры, пока что почти не предоставляющие сертификатов эллиптической криптографии.

В общем и целом исследователи призывают индустрию информационных технологий начать поддерживать эллиптическую криптографию уже сегодня, а также удостовериться в защищенности систем, использующих криптографию: они не должны полагаться на устаревшие алгоритмы и протоколы. Программное обеспечение должно быть легко обновляемым, позволяя держать паритет с математическим прогрессом и техническими достиженями отрасли. Криптоапокалипсис может и не случиться, но готовность к нему обязательна уже сейчас.
По материалам Ars Techica. Фотография пользователя lyudagreen.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Северокорейский планшет на основе Android

Побывавший в одной из самых закрытых стран мира турист поделился с IDG News Service информацией об интернет-планшете, который он приобрёл на родине идеологии чучхе. Технические характеристики и предустановленное программное обеспечение лишний раз напоминают про политический курс изоляции КНДР.

Устройство под названием «Самиийон» (вероятно, название дано в честь одноименного города) — уже третий планшет, выпущенный в Северной Корее. Скорее всего, он производится за пределами страны, технические возможности КНДР не позволяют выпускать потребительскую электронику, хотя государство в состоянии готовить для закупленного «железа» собственный софт. Впервые он был продемонстрирован на промышленной выставке в Пхеньяне в сентябре прошлого года. Говорили о нём и по северокорейскому телевидению, но мало кто из зарубежных туристов мог видеть его вблизи.

История приобретения была предельно проста: турист, предпочитающий называться лишь именем Майкл, заметил устройство в магазине подарков в ресторане и был немало удивлён этому. Скучающий в ожидании курящей части группы Майкл спросил, может ли он сфотографировать устройство. Шутя, он даже задал вопрос, не продаётся ли планшет. К его удивлению, ответ был положительным, цена составила всего 200 долларов США. (Для сравнения: средняя зарплата гражданина КНДР составляет менее 100 долларов. Для обычного жителя «Самиийон» представляет предмет роскоши.)

Технические характеристики устройства скромны: здесь есть семидюймовый экран разрешением 1024?768 пикселов, 2-мегапиксельная камера, процессор с тактовой частотой 1.2 Ггц. Куда больший интерес представляет программное обеспечение планшета: он работает под управлением кастомизированной версии Android 4.0.4 Ice Cream Sandwich. Майкл описывает планшет как удивление простой в использовании: интерфейс работает без подтормаживаний, а камера инициализируется настолько же быстро, насколько быстро это происходит во флагманских моделях крупнейших производителей мира. Майкл играет в «птиц» без лагов графики и управления.

Среди предустановленных программ нет сервисов «Гугла»; на планшете нет приложений YouTube и Gmail, требующих лицензирования, но все обычные иконки на месте. В их числе галерея изображений, калькулятор, камера и интернет-браузер. Интернет недоступен большей части населения КНДР, хотя у многих есть доступ во внутреннюю сеть страны, в которой есть жёстко контролируемые сервисы электронной почты и видео-стриминга.

Любопытно, что на планшете установлены некоторые программы, разработанные на Западе, в том числе и Angry Birds. Среди северокорейских приложений: словарь терминов сферы информационных технологий, мультиязычный словарь, приложение с историей Кореи, корейские шахматы и набор книг для изучения идеи чучхе, национальной идеологии КНДР.

В браузере есть четыре предустановленные закладки: это главное новостное агенство Северной Кореи, главная ежедневная газета, обслуживаемый Корейским компьютерным центром портал и государственное телевидение. Лишь первые три ресурса доступны из обычного Интернета, в закладках «Самиийона» используются на внутренние сайты корейского интранета. Несмотря на наличие браузера и закладок, Майклу не удалось выйти в сеть. По конфигурационным файлам далеко внутри системы удалось заключить, что планшет может иметь модуль WiFi, но либо он не установлен, либо сконфигурирован на работу лишь в некоторых сетях.

Государственные СМИ хвалят «Самиийон» как устройство, полезное для студентов. Действительно, в нём есть несколько учебных приложений, одно из них предоставляет виртуальную книжную полку с книгами о музыке, компьютерах, математике, а также помогающих в изучении революции (биографии национальных лидеров и т. п.)

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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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

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

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

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

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

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

  1. Volley автоматически составляет все сетевые запросы. Volley будет принимать на себя все сетевые запросы вашего приложения выполнять их для извлечения ответа или изображения с веб-сайтов.
  2. Volley обеспечивает прозрачность дискового кэширования и кэширования в памяти.
  3. Volley обеспечивает мощное API для отмены запроса. Можно отменить один запрос или установить несколько запросов для отмены.
  4. Volley предоставляет мощные возможности изменения.
  5. Volley предоставляет инструменты отладки и трассировки.

Как начать?

  1. Клонируйте проект Volley.
    <code class="bash">git clone https://android.googlesource.com/platform/frameworks/volley
    </code>
  2. Импортируйте код в ваш проект.

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

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

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

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

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

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

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

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

volley as a library project

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

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

Including volley library in Android project

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

<code class="xml"><uses-permission android:name="android.permission.INTERNET"/></code>
Шаг 5:
5.1 Создайте объект класса RequestQueue

<code>RequestQueue queue = Volley.newRequestQueue(this);</code>
5.2 Создайте JSONObjectRequest с response и error listener.

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

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

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

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

  }
 });</code>

5.3 Добавьте ваш request в RequestQueue.
<code class="java">queue.add(jsObjRequest);</code>
Весь код файла MainActivity.java
<code class="java">package com.technotalkative.volleyexamplesimple;

import org.json.JSONObject;

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

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

public class MainActivity extends Activity {

 private TextView txtDisplay;

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

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

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

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

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

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

   }
  });

  queue.add(jsObjRequest);

 }

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

}</code>


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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



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

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


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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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

Что такое и для чего OpenDNSSEC есть информация в сети. Подробной информации на эту тему немного и в основном на английском. Попробую восполнить пробел. Сам не являюсь специалистом в этой области, было интересно, захотел, сделал.

Статья писалась одновременно с установкой/настройкой OpenDNSSEC. В общей сумме ушло около месяца. Процедура выполнялась дважды. Сначала был установлен OpenDNSSEC 1.3. Зоны подписаны, якоря у регистратора домена(РД) прописаны, цепочка доверия выстроена, о чём сообщалось в личном кабинете регистратора домена(РД), в общем всё получилось. Спустя полгода, в результате очередного ручного обновления портов, порт OpenDNSSEC 1.3.x был автоматически обновлён на 1.4.1, а там много чего по другому. Но всё, разумеется, продолжало работать без каких-либо намёков на проблему. Обнаружил случайно, когда в DNS зону потребовалось внести изменения. И началось…

Предполагаем, что NSD DNS сервер настроен, несколько лет работает, всё в порядке.

Версию 1.4 долго не получалось настроить, не появлялись ключи, зоны не подписывались. Пакет устанавливался с поддержкой MySql55. На официальном сайте, при перечислении официально поддерживаемых OS для 1.4 была заявлена FreeBSD 9.0. Вряд ли в этом была причина(причина и была не в этом), но на всякий обновился с FreeBSD 8.2 до 9.1. От незнания нюансов даже предположил, что мешала уже выстроенная цепочка доверия. Поэтому в личном кабинете РД разорвал цепочку доверия. И настроил NSD на работу с неподписанными зонами. Пробовать конвертировать существующую базу SQLite2 в SQLite3 не стал. Решено было всё заново сделать и использовать MySql55, как было рекомендовано.

В целом, картина выглядит скорее всего так: NSD как обслуживал зоны, так и обслуживает. Между собой NSD и Opendnssec никак и ничем не связаны. Opendnssec является удобной примочкой для автоматизации процесса подписи зон. Opendnssec берёт существующие, неподписанные файлы зон NSD сервера и производит их подпись/пере подпись с заданной периодичностью. После автоматической пере подписи Opendnssec перезапускает NSD. Далее NSD использует уже подписанные файлы зон. Причём DNSSEC в NSD включается автоматически. NSD сам распознаёт подписанные файлы зон. Остался не понятен один момент: в личном кабинете у РД (регистратор домена) нужно прописывать некоторые ключи, так называемые якоря. Нужно ли их будет править вручную в дальнейшем, когда произойдёт автоматическая пере подпись зон новыми ключами? Предположу конечно, что проблем не будет.

Забегая вперёд: c MySql OpenDNSSEC настроить не удалось. Точно выяснил, что проблема связана с базой данных, или с взаимодействием между базой данных и OpenDNSSEC. OpenDNSSEC может работать как с SQLight, так и с MySql. Вернулся на SQLight3 там всё пошло сразу и без вопросов. На официальном сайте SQLight3 рекомендуется только для тестовых применений. Предположу, что MySql рекомендуется, если файлов зон и записей в них много, тысячи. Для случая тестового сервера решил использовать SQLight. Таким образом, всё нижеописанное, относящееся к MySql не используем. Но на всякий эту информацию оставил. Ниже приводится схематичная картинка, описывающая происходящее. Картинка взята с официального сайта документации OpenDNSSEC.

image

Вторичные сервера DNS не требуют над собой никаких действий, однако нужно убедиться, что вторичный сервер также поддерживает DNSSEC. У РД, у которого в своё время было заказано два вторичных DNS, всё поддерживается.

Предусмотрено 2 пары ключей:
Первая пара – ZSK используется для подписи зонного файла.
Вторая пара – KSK используется для подписи ключа ZSK и формирования DS-записей, которые передаются администратору родительской зоны (в текущем случае РД). Менять KSK рекомендуется раз в год, ZSK вплоть до раза в месяц.

Перекликается установка как 1.3, так и 1.4 версии OpenDNSSEC. При использовании SQLight2 и 3 баз данных проблем не было. С MySql55 настроить не получилось. После того, как всё заработало с SQLight3, поиск причин, почему же возникли проблемы с MySql, был отложен до следующего раза. Повторюсь, SQLight рекомендуется только для тестирования.

Привожу всё, как было, поэтому сначала желательно посмотреть, чем закончилось, а потом повторять. Да, при установке только OpenDNSSEC 1.4.1 статья получилась бы раза в два короче. Но считаю, что избыточность информации лучше поможет разобраться, если возникнут нюансы. Как говориться, подарок рерайтерам. Если у Вас автоматически было обновление OpenDNSSEC со старой до 1.4.1 версии, то желательно OpenDNSSEC перенести в резервную папку и заново установить. Файлы конфигураций будут отличаться. А старые новыми, по понятным причинам, не затираются.

При установке порта opendnssec не делаем make clean, понадобятся некоторые файлы для настройки.

# cd /usr/ports/dns/opendnssec
# make
===> opendnssec-1.3.13 is marked as broken: does not work with ruby 1.9.
*** Error code 1

Устанавливаем порт /usr/ports/lang/ruby18, т.к. с 1.9 у opendnssec порта проблемы совместимости, а именно ошибка возникает при включённом флаге AUDITOR.
В общем устанавливаем/переустанавливаем порт ruby18.
Далее смотрим файл /usr/ports/UPDATING, там сказано кой чего по поводу ruby1.8 и 1.9. В общем, для использования 1.8 версии нужно в /etc/make.conf файл добавить следующие строки:
#
# Keep ruby 1.8 as default version.
#
RUBY_DEFAULT_VER=1.8

Перезагружаемся и далее повторная попытка установки:
# cd /usr/ports/dns/opendnssec
# make config –убеждаемся, что все флаги отмечены
# make && make install && make clean
[x] AUDITOR Build with Auditor
[ ] MYSQL MySQL database support
[x] SOFTHSM Build/update SOFTHSM as well

В OpenDNSSEC 1.4.1 этой проблемы не возникает, там больше не используется AUDITOR, который использовал ruby. Ruby вообще не используется. Из 2х опций предлагаемых при установке выбрана одна MySql. Повторюсь, что с MySql не завелось, для OpenDNSSEC 1.4.1 выберем соответственно вторую галку из двух.

В файле /usr/local/etc/nsd/nsd.conf меняем:
zonesdir: “/usr/local/var/opendnssec/signed”
и все записи zonefile:
zonefile: "/usr/local/var/opendnssec/signed/zone1.ru"
zonefile: "/usr/local/var/opendnssec/signed/zone2.ru"

zonefile: "/usr/local/var/opendnssec/signed/zoneN.ru"

Создаём ссылки:
# cd /usr/local/etc/nsd
# ln -s /usr/local/var/opendnssec/unsigned.
# ln -s /usr/local/var/opendnssec/signed.
Копируем существующие, рабочие, неподписанный файлы зон NSD сервера из /usr/local/etc/nsd/zones/master в /usr/local/etc/nsd/~unsigned.
# chown -R opendnssec:opendnssec /usr/local/var/opendnssec/unsigned

Инициализация SoftHSM базы данных с меткой “OpenDNSSEC” используя SO PIN <пин код> и USER PIN <такой же пин код>
Если отсутствует по каким-либо причинам папка /usr/local/var/lib/softhsm то устанавливаем/переустанавливаем порт:
# cd /usr/ports/security/softhsm
# make && make install && make clean
Устанавливаем права на папку softhsm, по умолчанию они 700:
# chmod 0755 /usr/local/var/lib/softhsm

Придумываем/вводим/запоминаем 2 PIN кода. Пускай будут одинаковыми:
# softhsm --init-token --slot 0 --label «OpenDNSSEC»
The SO PIN must have a length between 4 and 255 characters.
Enter SO PIN:
The user PIN must have a length between 4 and 255 characters.
Enter user PIN:
The token has been initialized.
В файле /usr/local/etc/opendnssec/conf.xml удаляем строку
<code class="xml"><PIN>1234</PIN></code>
Пин код будем вводить вручную. Или оставляем, пин код будет подставляться автоматически.
Должно получиться так:

image

Для 1.4.1 Устанавливаем MySql55 server и client. SQLite3 рекомендуется использовать только в тестовых целях.
После установки MySql55 необходимо, в зависимости от предполагаемой нагрузки на сервер, выбрать один из конфигурационных файлов, находящихся в /usr/local/share/mysql, и скопировать его в /var/db/mysql. И соответственно в /etc/rc.conf должно быть:
nsd_enable=«YES»
opendnssec_enable=«YES»
mysql_enable=«YES»

Для автоматического создания нужной структуры базы данных используем файл:
/usr/ports/dns/opendnssec/work/opendnssec-1.4.1/enforcer/utils/database_create.mysql

# mysql
> create database kasp;
> CREATE USER 'ksuser'@'localhost' IDENTIFIED BY 'password';
> GRANT ALL PRIVILEGES ON kasp.* TO 'ksuser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
> flush privileges;
> quit

Если после flush privileges; будет ошибка
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
Пробуем так, здесь с вводом пароля:
# mysqlcheck --check-upgrade --all-databases --auto-repair -p
Enter password:
И затем
# mysql_upgrade --force -p
Enter password:
В своё время это помогло.

Настраиваем созданную базу данных.
# mysql kasp < /usr/ports/dns/opendnssec/work/opendnssec-1.4.1/enforcer/utils/database_create.mysql

# mysql
> USE kasp;
> SHOW TABLES;
+-----------------------------+
| Tables_in_kasp |
+-----------------------------+
| INT_KEYALLOC_VIEW_FOR_MYSQL |
| KEYALLOC_VIEW |
| KEYDATA_VIEW |
| PARAMETER_LIST |
| PARAMETER_VIEW |
| categories |
| dbadmin |
| dnsseckeys |
| keypairs |
| parameters |
| parameters_policies |
| policies |
| securitymodules |
| serialmodes |
| zones |
+-----------------------------+
15 rows in set (0.01 sec)

>quit

В /usr/local/etc/opendnssec будут дефолтные конфигурационные файлы, созданные при установке.

В /usr/local/etc/opendnssec/conf.xml правим:
<code class="xml">
<Datastore>
	<MySQL>
<!--
		<Host port="1213">dnssec-db</Host>
-->
		<Database>database</Database>
		<Username>kaspuser</Username>
		<Password>mysqlpassword</Password>
	</MySQL>
</Datastore>
</code>

<Host -имя системы, где установлена база данных. Параметр опциональный, если не указан, то база данных ассоциируется с системой, где установлен OpenDNSSEC. Port понятно какой. Параметр опциональный, по умолчанию 3306.
<Database База данных.
<Username Пользователь базы данных.
<Password Соответственно пароль.

В /usr/local/etc/opendnssec/conf.xml должно быть:
<code class="xml">
<Repository name="SoftHSM">
              <Module>/usr/local/lib/softhsm/libsofthsm.so</Module>
              <TokenLabel>OpenDNSSEC</TokenLabel>
              <Capacity>1024</Capacity>
              <RequireBackup/>
              <SkipPublicKey/>
</Repository>
</code>

Проверяем, чтобы было так:
<code class="xml">
<Signer>
	<NotifyCommand>/usr/local/bin/opendnssec-nsd-reload</NotifyCommand>
</code>

Для секурности пин код тут не прописан. Будет вводиться вручную, хотя проще оставить его на месте.

Обращаем внимание на запись:
<code class="xml">
<Module>/usr/local/lib/softhsm/libsofthsm.so</Module>
</code>

Вносим данные конфигурационных файлов в базу данных
# ods-ksmutil setup
*WARNING* This will erase all data in the database; are you sure? [y/N] y
zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.
kasp filename set to /usr/local/etc/opendnssec/kasp.xml.
Repository SoftHSM found
Capacity set to 1024.
RequireBackup set.
INFO: The XML in /usr/local/etc/opendnssec/conf.xml is valid
INFO: The XML in /usr/local/etc/opendnssec/zonelist.xml is valid
INFO: The XML in /usr/local/etc/opendnssec/kasp.xml is valid

Перед запуском OpenDNSSEС нужно ввести ранее заданный пин код(если он был удалён), тот который вводили при запросе команды softhsm --init-token.

Файлы зон пока ещё не добавляли.
Вносим пин код:
# ods-hsmutil login
Enter PIN for token SoftHSM:
The tokens are now logged in.

В /usr/local/etc/opendnssec/conf.xml строка с дефолтным пин кодом 1234 должна быть удалена. Если внесли какие-либо изменения в крнфигурационные файлы, то судя по всему нужно запускать # ods-ksmutil update all.

OpenDNSSEC состоит из двух демонов, ods-signerd и ods-enforcerd запускаем:
# ods-control start
Starting enforcer…
OpenDNSSEC ods-enforcerd started (version 1.4.1), pid 39528
Starting signer engine…
OpenDNSSEC signer engine version 1.4.1
Engine running.

Всё работает.
# ods-control stop

Добавляем зоны:
# ods-ksmutil zone add --zone zone1.com
# ods-ksmutil zone add --zone zone2.com

Судя по всему, всё, что делает эта команда –это добавление текстовой информации о путях размещения файлов зон в файл /usr/local/etc/opendnssec/zonelist.xml. Вводимое имя зоны должно совпадать с именем файла зоны, который будет скопирован в /usr/local/var/opendnssec/unsigned. В общем чтобы руками не редактировать zonelist.xml

# ods-ksmutil update all

Всё, что касается политики работы с зонами можно посмотреть в официальной документации. Использовал дефолтную политику. С зонами закончили.

Формируем ключи:

<code class="xml">
В файле /usr/local/etc/opendnssec/kasp.xml policy: default смотрим параметр <Policy name="default"> <Keys> <KSK> <Lifetime>P3M</Lifetime> Это означает 3 месяца. В общем в параметре –interval указываем время, на которое нужно на генерировать ключей. Предположу, что достаточно сформировать количество ключей на максимально заданное время, а дальше оно само. Если указываем интервал 1M и менее, то для <ZSK> <Lifetime>P1M</Lifetime> и <KSK> <Lifetime>P3M</Lifetime> и 2х зон будет сформировано 2 KSK и 2 ZSK. Если --interval 1Y при тех же параметрах 2 зоны, то будет сформированно 6 KSKs (2048 bits) and 20 ZSKs (1024 bits).
</code>

Собственно формируем ключи:

# ods-ksmutil key generate --policy default --interval 1Y
Key sharing is Off
Info: converting 1Y to seconds; M interpreted as 31 days, Y interpreted as 365 days
HSM opened successfully.
*WARNING* This will create 4 KSKs (2048 bits) and 16 ZSKs (1024 bits)
Are you sure? [y/N] y
Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.
Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.
Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.
Created KSK size: 2048, alg: 8 with id: … in repository: SoftHSM and database.
Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.
Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.
Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.
Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.

Created ZSK size: 1024, alg: 8 with id: … in repository: SoftHSM and database.
NOTE: keys generated in repository SoftHSM will not become active until they have been backed up
all done! hsm_close result: 0

# ods-hsmutil info
Repository: SoftHSM
Module: /usr/local/lib/softhsm/libsofthsm.so
Slot: 0
Token Label: OpenDNSSEC
Manufacturer: SoftHSM
Model: SoftHSM
Serial: 1

# ods-hsmutil list SoftHSM
Listing keys in repository: SoftHSM
20 keys found.
Repository ID Type
— — — SoftHSM … RSA/1024
SoftHSM … RSA/1024

SoftHSM … RSA/1024
SoftHSM … RSA/2048
SoftHSM … RSA/2048
SoftHSM … RSA/2048
SoftHSM … RSA/2048

Back up ключей можно делать только при остановленном OpenDNSSEC. Иначе есть вероятность генерации нового ключа в течении выполнения операции back up. Ключи помечаются как bsck up. На всякий пока убрал опцию <RequireBackup из /usr/local/etc/opendnssec/conf.xml

Запускаем:
# ods-control start
Starting enforcer…
OpenDNSSEC ods-enforcerd started (version 1.4.1), pid 51678
Starting signer engine…
OpenDNSSEC signer engine version 1.4.1
Engine running.

# ods-ksmutil key list --verbose
MySQL database schema set to: somedatabase
MySQL database user set to: user
MySQL database password set
Keys:
Zone: Keytype: State: Date of next transition (to): Size: Algorithm: CKA_ID: Repository: Keytag:

И видим, ключей нет. Плохо.
# ods-signer sign --all
С MySql Ключей так и не увидел.

В общем не получилось настроить с MySql55. Переустанавливаем OpenDNSSEC:
[ ] MYSQL MySQL database support
[x] SOFTHSM SoftHSM cryptographic store for PKCS #11 interface

Переустанавливал, после резервного перемещения всего, что связано с OpenDNSSEC в другую папку.

Здесь в /usr/local/etc/opendnssec будут дефолтные конфигурационные файлы, созданные при установке. В общем в папке должны быть файлы: conf.xml, kasp.xml, zonefetch.xml, zonelist.xml. Если их нет, то нужно переименовать файлы с расширением sample в этой-же директории.

Теперь инициализация OpenDNSSEC базы данных:
Импорт conf.xml, kasp.xml и zonelist.xml в базу данных. Удаление текущих настроек, включая любые ранее установленные ключи.
# ods-ksmutil setup
*WARNING* This will erase all data in the database; are you sure? [y/N] y
Error: database in config file does not match libksm
Если видим такое, то нужно в /usr/local/etc/opendnssec/conf.xml файле. Подправить путь:
<code class="xml">
<Module>/usr/local/lib/softhsm/libsofthsm.so</Module>
</code>
При установке OpenDNSSEC с MySql путь уже исправлен.

# ods-ksmutil setup
*WARNING* This will erase all data in the database; are you sure? [y/N] y
fixing permissions on file /usr/local/var/opendnssec/kasp.db
zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.
kasp filename set to /usr/local/etc/opendnssec/kasp.xml.
Repository SoftHSM found
No Maximum Capacity set.
RequireBackup NOT set; please make sure that you know the potential problems of using keys which are not recoverable
/usr/local/etc/opendnssec/conf.xml validates
/usr/local/etc/opendnssec/kasp.xml validates
Policy default found
Info: converting P1Y to seconds; M interpreted as 31 days, Y interpreted as 365 days

Появится файл /usr/local/var/opendnssec/kasp.db

Проверяем конфигурационные файлы:
# ods-kaspcheck
/usr/local/etc/opendnssec/conf.xml validates
/usr/local/etc/opendnssec/kasp.xml validates

В /etc/rc.conf добавляем opendnssec_enable=«YES»

На версию 1.3.13 не обращаем внимания, у Вас будет 1.4.1

# ods-control start
Starting enforcer…
OpenDNSSEC ods-enforcerd started (version 1.3.13), pid 55019
Starting signer engine…
OpenDNSSEC signer engine version 1.3.13
Engine running.
# ods-ksmutil zone add --zone zone1.com
zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.
Imported zone: zone1.com
# ods-ksmutil zone add --zone zone2.ru
zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.
Imported zone: zone2.ru

И т.д. добавляем все Ваши файлы зон.

# ods-ksmutil update zonelist
zonelist filename set to /usr/local/etc/opendnssec/zonelist.xml.
kasp filename set to /usr/local/etc/opendnssec/kasp.xml.
Zone zone2.ru found
Policy set to default.
Zone zone1.com found
Policy set to default.
Notifying enforcer of new database…

На всякий:
# ods-ksmutil update all

Проверяем, что всё в порядке, должен быть выведен список ключей:
# ods-ksmutil key list --verbose
SQLite database set to: /usr/local/var/opendnssec/kasp.db
Keys:
Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:
zone2.ru KSK publish 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863
zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817
zone1.com KSK publish 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918
zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180

Если видим такой вывод, значит всё настроено правильно.
SQLite база данных: /usr/local/var/opendnssec/kasp.db

Попробуем проверить запрос DNSSEC:
# dig +norec dig xx.yy.zz.ss -t ANY zone2.ru

; <<>> DiG 9.6.-ESV-R3 <<>> +norec dig xx.yy.zz.ss -t ANY zone2.ru
;; global options: +cmd
;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 53654
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 13

;; QUESTION SECTION:
;dig. IN A

;; AUTHORITY SECTION:
. 2574 IN NS d.root-servers.net.
. 2574 IN NS a.root-servers.net.
. 2574 IN NS g.root-servers.net.
. 2574 IN NS h.root-servers.net.
. 2574 IN NS c.root-servers.net.
. 2574 IN NS i.root-servers.net.
. 2574 IN NS b.root-servers.net.
. 2574 IN NS f.root-servers.net.
. 2574 IN NS j.root-servers.net.
. 2574 IN NS k.root-servers.net.
. 2574 IN NS l.root-servers.net.
. 2574 IN NS e.root-servers.net.
. 2574 IN NS m.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net. 2574 IN A 198.41.0.4
a.root-servers.net. 1398 IN AAAA 2001:503:ba3e::2:30
b.root-servers.net. 60 IN A 192.228.79.201
c.root-servers.net. 3425 IN A 192.33.4.12
d.root-servers.net. 2482 IN A 199.7.91.13
d.root-servers.net. 92 IN AAAA 2001:500:2d::d
e.root-servers.net. 2482 IN A 192.203.230.10
f.root-servers.net. 2482 IN A 192.5.5.241
f.root-servers.net. 2574 IN AAAA 2001:500:2f::f
g.root-servers.net. 2482 IN A 192.112.36.4
h.root-servers.net. 2482 IN A 128.63.2.53
h.root-servers.net. 2574 IN AAAA 2001:500:1::803f:235
i.root-servers.net. 2482 IN A 192.36.148.17

;; Query time: 1 msec
;; SERVER: 192.168.45.64#53(192.168.45.64)
;; WHEN: Sun Jun 2 00:50:27 2013
;; MSG SIZE rcvd: 488

;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NXDOMAIN, id: 23363
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;xx.yy.zz.ss. IN ANY

;; AUTHORITY SECTION:
. 3274 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2013060101 1800 900 604800 86400

;; Query time: 1 msec
;; SERVER: 192.168.45.64#53(192.168.45.64)
;; WHEN: Sun Jun 2 00:50:27 2013
;; MSG SIZE rcvd: 107

;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 5213
;; flags: qr ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;zone2.ru. IN A

;; ANSWER SECTION:
zone2.ru. 3135 IN A xx.yy.zz.ss

;; AUTHORITY SECTION:
zone2.ru. 579 IN NS ns8-l2.xxx.ru.
zone2.ru. 579 IN NS ns4-l2.xxx.ru.
zone2.ru. 579 IN NS ns1.zone2.ru.

;; ADDITIONAL SECTION:
ns1.zone2.ru. 579 IN A xx.yy.zz.ss
ns4-l2.xxx.ru. 2596 IN A a.b.c.d1
ns8-l2.xxx.ru. 2596 IN A a.b.c.d2

;; Query time: 1 msec
;; SERVER: 192.168.45.64#53(192.168.45.64)
;; WHEN: Sun Jun 2 00:50:27 2013
;; MSG SIZE rcvd: 154

Всё в порядке. DNS по прежнему, и спустя некоторое время работает. Но DNSSEC пока не функционирует, в выводе нет строк с ключами.

Нужно произвести экспорт открытых KSK ключей для каждой из зон. Экспортировать можно только KSK в состоянии ready.
Ниже приведённые команды для экспорта ключей пока не выполняем:
ods-ksmutil key export --zone example.com [--keystate READY]
ods-ksmutil key export --zone example.com --ds [--keystate READY]

Первая пара – ZSK для подписи зонного файла.
Вторая пара – KSK для подписи ключа ZSK и формирования DS-записей, которые передаются администратору родительской зоны.
Выясняем DNSKEY и DS записи из KSK:
# ods-ksmutil key list --verbose
SQLite database set to: /usr/local/var/opendnssec/kasp.db
Keys:
Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:
zone2.ru KSK publish 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863
zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817
zone1.com KSK publish 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918
zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180

# ods-ksmutil key ds-seen -z zone1.com -x 6918
Found key with CKA_ID f73f605125a7e59e3f3108680255d84e
Key f73f605125a7e59e3f3108680255d84e made active
Notifying enforcer of new database…
# ods-ksmutil key ds-seen -z zone2.ru -x 41863
Found key with CKA_ID 4962a716093d3973bc2cbcd0312a2e90
Key 4962a716093d3973bc2cbcd0312a2e90 made active
Notifying enforcer of new database…

статус KSK поменялся с publish на active:
# ods-ksmutil key list --verbose
SQLite database set to: /usr/local/var/opendnssec/kasp.db
Keys:
Zone: Keytype: State: Date of next transition: CKA_ID: Repository: Keytag:
zone2.ru KSK active 2013-06-02 13:29:18 4962a716093d3973bc2cbcd0312a2e90 SoftHSM 41863
zone2.ru ZSK active 2013-07-01 23:29:18 0696ec624c7baba98062d4fc32064b46 SoftHSM 5817
zone1.com KSK active 2013-06-02 13:29:18 f73f605125a7e59e3f3108680255d84e SoftHSM 6918
zone1.com ZSK active 2013-07-01 23:29:18 31e08389f3a59397dce1f22fa67df8a8 SoftHSM 2180

Теперь нужно сообщить провайдеру о вашем открытом ключе и DS записях для каждой из зон. У провайдера на сайте в личном кабинете есть/должна быть форма заполнения с примером. У моего была.
При экспорте после ключа –e нужно установить текущее состояние (state) ключа KSK publish, active…

# ods-ksmutil key export -z zone2.ru -e active -x 41863
;publish KSK DNSKEY record:
zone2.ru. 3600 IN DNSKEY 257 3 8 Aw…dk2= ;{id = xxxx (ksk), size = 2048b}

для размещения DNSKEY у РД, прямо всё, полученное через ods-ksmutil key export что есть копируем в текстовое поле ввода на сайте в личном кабинете, через некоторое время введённые данные автоматически будут подправлены до вида как в примере. Имеется в виду пример заполнения на веб странице личного кабинета РД. Т.е. всё, что после ;publish KSK DNSKEY record: прописываем в поле DNS Key: в личном кабинете РД.

Теперь выясняем DS записи для домена:
# ods-ksmutil key export -z zone2.ru -e active -x 41863 --ds
;publish KSK DS record (SHA1):
zone2.ru. 3600 IN DS 57062 8 1 2a…34df
;publish KSK DS record (SHA256):
zone2.ru. 3600 IN DS 57062 8 2 e3fa…d492

Соответственно копируем полученные DS записи в соответствующее поле ввода в личном кабинете xxx. Проделываем соответствующую операцию для всех доменов.

И последний штрих –автоматический перезапуск NSD сервера, при перегенерации ключей:
В файле /usr/local/etc/opendnssec/conf.xml нужно рас комментировать или добавить строку в секции
<code class="xml">
<Signer>…</Signer>:
</code>
<code class="xml">
<NotifyCommand>/usr/local/bin/opendnssec-nsd-reload</NotifyCommand>
</code>
В /usr/local/bin/ создаём файл opendnssec-nsd-reload со следующим содержимым:
{
#!/bin/sh — # @(#)(CAcert) $Id: reload-nsd,v 1.1 2013/06/02 23:49:50 root Exp $
# reload-nsd — script invoked by opendnssec to trigger nsd to reload zonefiles
# logging
# echo $0 $*
# ignore %zone and %zonefile arguments since nsd cannot use them…
/usr/local/sbin/nsdc rebuild
/usr/local/sbin/nsdc reload
}

# chmod 0555 /usr/local/bin/opendnssec-nsd-reload

Или копируем соответствующий файл из папки установки OpenDNSSEC.

Для остановки opendnssec можно использовать комманду
# ods-control stop
Если были сделаны изменения в kasp.xml, то нужно выполнить команду:
# ods-ksmutil update kasp
Если производятся изменения в неподписанных зонах –зоны оригиналы скопированные из /usr/local/etc/nsd/zones/master в /usr/local/var/opendnssec/unsigned директорию, то нужно выполнить команду:
# ods-signer sign example.com для каждой зоны, в которой были произведены изменения.

Перезапускаем NSD, для чтения подписанных файлов зон:
# nsdc rebuild
# nsdc reload
# nsdc notify

Проверка: в конечном итоге должны получить следующее:
Выведет стандартный ответ DNS сервера без dnssec
# dig site.com

; <<>> DiG 9.6.-ESV-R3 <<>> site.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 43618
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;site.com. IN A

;; ANSWER SECTION:
site.com. 1111 IN A xxx.yyy.zzz.aaa

;; AUTHORITY SECTION:
site.com. 1111 IN NS ns4-l2.xxx.ru.
site.com. 1111 IN NS ns8-l2.xxx.ru.

;; ADDITIONAL SECTION:
ns4-l2.xxx.ru. 1276 IN A a.b.c.d1
ns8-l2.xxx.ru. 1276 IN A a.b.c.d2

;; Query time: 1 msec
;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)
;; WHEN: Mon Jun 3 18:00:40 2013
;; MSG SIZE rcvd: 123

Выводим dnssec ответ от DNS сервера:
# dig xxx.yyy.zzz.aaa site.com +retry=1 +dnssec +multiline

; <<>> DiG 9.6.-ESV-R3 <<>> xxx.yyy.zzz.aaa site.com +retry=1 +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NXDOMAIN, id: 12671
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;xxx.yyy.zzz.aaa. IN A

;; AUTHORITY SECTION:
. 2235 IN SOA a.root-servers.net. nstld.verisign-grs.com. (
2013060300; serial
1800; refresh (30 minutes)
900; retry (15 minutes)
604800; expire (1 week)
86400; minimum (1 day)
)

;; Query time: 1 msec
;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)
;; WHEN: Mon Jun 3 18:52:31 2013
;; MSG SIZE rcvd: 107

;; Got answer:
;; ->>HEADER<< — opcode: QUERY, status: NOERROR, id: 53116
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;site.com. IN A

;; ANSWER SECTION:
site.com. 1835 IN A xxx.yyy.zzz.aaa
site.com. 1835 IN RRSIG A 8 2 3600 20130609232905 (
20130602143424 39964 site.com.
IM+aCUZHZekNnQhjxngyIXUrBUkgCjAxc8o4UuoqvMUu
F1W3L7ge4HVHdWkfmEf/Gk+o8hu7B2MGgP1P9L89/l3c
gCyVYvIrpR3viVFP7uNtbaoiVdo3bRgtHyFH6QmlTCCW
NrmBHY5sKh/NItAqp1bagQCMYqy71o07oNsNeOU= )

;; AUTHORITY SECTION:
site.com. 1835 IN NS ns4-l2.xxx.ru.
site.com. 1835 IN NS ns8-l2.xxx.ru.
site.com. 1835 IN RRSIG NS 8 2 3600 20130610191139 (
20130603121736 39964 site.com.
ceIOophlVR8zLydk0hVWdtIx/OSLO+kdqQg0opthF5pF
O4NRYgKfkl2tSLGHozzQq0CqzZ0s9rGiE2hnq7M2jJby
Mg9wm1BmHVnmogSat463kpG29Di2U1Yj+AAY8WJ0Gtvv
iYG/atnToDAsLoXgaLfbaYvRCRirCym7LoXjn3Q= )

;; ADDITIONAL SECTION:
ns4-l2.xxx.ru. 1866 IN A a.b.c.d1
ns8-l2.xxx.ru. 1866 IN A a.b.c.d2

;; Query time: 1 msec
;; SERVER: xx1.yy1.zz1.aa1#53(xx1.yy1.zz1.aa1)
;; WHEN: Mon Jun 3 18:52:31 2013
;; MSG SIZE rcvd: 472

В приведённом выводе видим наличие ключей.

И последняя проверка, поскольку всё делалось для регистратора xxx, заходим в личный кабинет, и производим онлайн-тестирование DNS.

image

Всё в порядке, осталось убедиться, что по истечению установленного срока действия ключей, зоны будут пере подписаны автоматически. Видим запись, в личном кабинете РД “Выстроена цепочка доверия”.

Если кто укажет на возможные нюансы настройки c MySql, опробую и подкорректирую статью.
Много информации есть на официальном сайте.
Статью планируется корректировать, для правки настроек, связанных с MySql.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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

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

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

Stream


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

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

Для последовательного режима:
<code class="java">List <Person> people = list.getStream.collect(Collectors.toList());</code>

Для параллельного режима:
<code class="java">List <Person> people = list.getStream.parallel().collect(Collectors.toList());</code>

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

Обработка в параллельном режиме выглядит так:
<code class="java">List originalList = someData;
split1 = originalList(0, mid);
split2 = originalList(mid,end);
new Runnable(split1.process());
new Runnable(split2.process());
List revisedList = split1 + split2;</code>

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

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

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

Functional Interfaces

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

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

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

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

Lambda

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

Старый стиль:
<code class="java">button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
      System.out.println(“Action Detected”);
    }
  }
);</code>

Новый стиль:
<code class="java">button.addActionListener(e -> {
        System.out.println(“Action Detected”);
    }
);</code>

И еще один пример.
Старый стиль:
<code class="java">Runnable runnable1 = new Runnable() {
@Override
public void run() {
        System.out.println("Running without Lambda");
    }
};</code>

Новый стиль:
<code class="java">Runnable runnable2 = () -> { System.out.println("Running from Lambda"); };</code>

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

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

Java time

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

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

Nashorn

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

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

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

Accumulators

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

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

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

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

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

TLS SNI

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

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

Заключение

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

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

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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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

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



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

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

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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Custom Tree v2 jQuery plugin

На днях решил вернуться к перепиливанию одного своего старенького Open Source проекта.
В процессе обдумывания решил, что предыдущий компонент с деревом в его нынешнем виде меня больше не устраивает.

Хотелось чего-нибудь более Event Driven, с понятным и простым API.

Сейчас решил, что оно уже готово для Public.

Берите, пользуйтесь.
Или посмотрите на example в рамках GH-pages.

Под катом краткий перевод краткой документации по API.

UPD: в комментариях мой код для организации перетаскивания.


Исполнено оно в виде jQuery плагина.

Пример конфига, т.е. того, что передаётся когда вы «создаёте» дерево:

<code class="javascript">$('#tree_content').customTree({

	root : 'top',
	init : {
		callback : function (controller, tree) {
			info('Init callback.');
		}
	},

	// for leaf callbacks
	handlers : {
		added : function (leaf, controller, tree) {
		},
		loaded : function (leaf, controller, tree) {
		},
		parsed : function (leaf, controller, tree) {
		},
		open : function (leaf, controller, tree) {
		},
		close : function (leaf, controller, tree) {
		},
		hover : function (leaf, controller, tree) {
		},
		unhover : function (leaf, controller, tree) {
		},
		focus : function (leaf, controller, tree) {
		},
		beforeblur : function (callback, leaf, controller, tree) {
		},
		blur : function (leaf, controller, tree) {
		},
		deleted : function (leaf, controller, tree) {
		},
		dblclick : function (leaf, controller, tree) {
		}
	},

	listeners : {
		// click, dblclick, contextmenu up the element Label
		contextmenu : function (leaf, controller, tree, event) {
		},
		dblclick : function (leaf, controller, tree, event) {
		}
	},

	storeLoaded : false,
	focusParentOnClose : true,
	// focusByDblClick: true,
	// blurFromContainerClick : false,
	// blurFromContainerDblClick : false,

	labelsBreak : {
		by : 50,
		expandOnHover : false,
		expandOnSelect : true
	},

	loader : function (path, callback) {
		// ... your code for nodes loading
	}

});

</code>

В рамках кода используется строгое соглашение по параметрам ноды, приходящей на Parsing\Rendering, поэтому привожу пример единичной ноды (leaf):

<code class="javascript">{
	// – должно быть уникальным в рамках текущего узла,
	'unique_naming_string' : {

		// – опционально, используется для представления,
		text : 'string',

		// – опционально, указывает на то, является ли данный leaf папкой,
		folder : [true || false],

		// – опционально, указывает на то, нужно ли "открыть" папку
		open : [true || false]
		
		// любые другие свойства могут быть дополнительно переданы, вы сможете их использвать
		
	}
}


</code>

Объяснения {

  • root – имя для root пути узла
  • init – опции начальной загрузки

<code class="javascript">// то, что будет использовано для загрузки root
init : {
	
	// отсрочка в миллисекундах или null
	delay : null,
	
	// имя класса установленное на root во время первоначальной загрузки
	// если не будет установлено, то preloader не будет индицирован
	preloader : 'preloader',
	
	// function (controller, tree) будет вызван после загрузки
	callback : null,
	
	// jQuery метод, который будет использован для "показа" root
	method : 'fadeIn',
	
	// если true (default), то загрузка произойдёт сразу после delay
	auto : true,
	
	// путь узла, который нужно focus после загрузки
	focus : null

}


</code>

handlers ( leaf, controller, tree ) – предустановленные обработчики событий.

Все принимают текущий узел, контроллер и объект дерева.

Но beforeblur принимает ещё и callback как первый параметр.

Если Вам, допустим, нужно проверять, можно ли blur текущий узел.
Если «да», тогда этот callback нужно вызвать.
Иначе просто не вызывайте его, тогда blur не произойдёт.

Если blur должен был быть произведён, потому, что нужно было сделать focus для другого узла, то если не вызвать этот callback, ни blur текущего ни focus нужного произведён не будет.

Естественно, эти манипуляции с callback для beforeblur будут возможны только если вы вообще передадите в конфиг handler.beforeblur.

loader ( path, callback ) – то, к чему контроллер будет обращаться для загрузки leaf.

Принимает ['tree.root', 'leaf.name'] в качестве path.

Должен вернуть JS Object!

listeners – стандартыне jQuery .on( callbacks для текстового элемента узла.
Т.е., если, допустим, нужно contextmenu или кастомный click, то нужно использовать listeners.

theme – CSS PREFIX_ для классов при рендере

cls – набор CSS классов при рендере:

<code class="javascript">cls : {

	// для root
	root : 'tree_root',

	// для места, где плюс и минус
	control : 'tree_control',
	
	// для места, где текущий статус, например "загружается"
	status : 'tree_leaf_status',
	
	// для текстового поля
	text : 'tree_leaf_text',

	// для "папок"
	folder : 'folder',
	
	// для выделенного по focus()
	selected : 'selected',
	
	// когда мышка над текстом
	hover : 'hover',

	// когда загружается текущий узел
	loader : 'loader',
	
	// когда папка открыта
	open : 'open',

	// для всего контейнера
	container : 'container',

	// когда не нужно позволять выделение текста
	supressLabelTextSelection : 'unselectable',
	supressTreeTextSelection : 'unselectable'

}


</code>

html – HTML тэги для рендера:

<code class="javascript">html : {

	// root container
	tree : '<UL>',
	
	// leaf container
	leaf : '<LI>',
	
	// то, где будут children узла
	children : '<UL>',

	// где хранится текст и контролы +\- status
	heading : '<DIV>',
	
	// то где +\-
	control : '<SPAN>',
	
	// то, где статус
	status : '<SPAN>',
	
	// то, где текст
	text : '<SPAN>',

	// сам контейнер
	container : '<DIV>'

}

</code>

control – строки, использованные для +\-:

<code class="javascript">control : {
	close : '+',
	open : '–'
},

</code>

storeLoaded: true || false – сохранять «свёрнутые» узлы, или перезагружать каждый раз

focusParentOnClose: true || false – выделить родительский элемент, если его потомок имел focus

focusByDblClick: true || false – выделять по двойному щелчку

blurFromContainerClick: true || false – blur когда щелкают root

blurFromContainerDblClick: true || false – blur когда дважды щелкают root

labelsBreak: – текстовые caption узла могут быть длинными, опции для «обрезки» если нужны:

<code class="javascript">labelsBreak : {

	// на какое количество символов делать перенос строк
	by : 0,
	
	// чем переносить 
	str : '\n',
	
	// всегда полностью отображать все строки
	expandAlways : false,
	
	// отображать все, когда hover
	expandOnHover : false,
	
	// отображать все, когда focused
	expandOnSelect : true
}

</code>

Controller API
  • getPath ( leaf ) – возвращает URL ARRAY для Leaf Object: [ 'top', 'leaf_name', 'child_name'… ]
  • refresh ( leaf, callback, andOpen ) – перезагружает переданный 'leaf',
    'callback' используется по завершении,
    pass 'andOpen' если нужно развернуть свёрнутый узел
  • blur ( leaf ) – делаем blur узлу
  • focus ( leaf ) – делаем focus узлу
  • x – текущий конфиг
  • x.current – текущий выделенный узел
  • init – если config.init.auto == false, здесь будет функция вызова init дерева

Надеюсь, что кому-нибудь это всё пригодится.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Видеообзор ноутбука Acer Aspire V5-572G


Ноутбуки Acer Aspire V5-572G — это портативные и высокопроизводительные ноутбуки от Acer, которые наряду с компактными размерами несут в себе хороший потенциал мощности, которого хватит даже для современных видеоигр. Новинка оснащается матовым IPS дисплеем с разрешением FullHD (также есть модели на TN матрицах или с сенсорным дисплеем). Работают ноутбуки на низковольтных процессорах Intel Core третьего поколения (i3 / i5 / i7) а за графику отвечают видеокарты NVIDIA GeForce GT 750M (либо GT 720M).

Толщина ноутбуков составляет всего 2 см, а вес — около 2 кг. Корпус аппаратов выполнен из матового пластика, а клавиатура оснащается регулируемой светодиодной подсветкой. Эти модели хорошо подойдут тем, кто хочет получить мобильный аппарат с возможностью вытягивать современные игры (пусть и не на высоких настройках графики) по умеренной цене.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Особенности игрового рынка в Китае — часть 2

Многие инвесторы отказываются инвестировать в игровые стартапы из-за характера рынка игр — никогда не уверен, взлетит игра или нет, заработаешь ли ты, вернешь инвестиции или уйдешь в минус. «Индустрия игр завязана на хитах, это не бизнес, это удача», — часто приходится слышать от ИТ-инвесторов и бизнес-ангелов.

Действительно, рынок игр, а точнее, рынок мобильных казуальных игр развивается стремительно и быстро, появляются новые типы геймеров, меняются потребности и желания игроков, двигаются тренды игровой механики. И все же у опытных разработчиков и паблишеров получается понимать рынок, своего пользователя, выпускать новые всеми любимые хиты (маркетинговые бюджеты… маркетинговые бюджеты… ну да, не без них…). Но это на Западе…

Китайский рынок отстает от западного (например, казуалки только-только входят в моду, и это в Китае, где молодежь каждый свой шаг документирует в социальной сети!), но, кажется, собрался пройти знакомые западному миру шаги эволюции в 2-3 раза быстрее, что-то пропуская, где-то эволюционируя по-свому…

«Рынок еще развивается, важно время выхода, скорость итераций, критически важно время разработки», — объясняет Аллен Фу, глава Unity Technologies China, — «держатели платформ знают своих пользователей, видят статистику, они заинтересованы в максимальной монетизации, они тебе говорят, что им надо, и ты обязан им это предоставить „завтра“, иначе они обратятся к другому».



Китай — это территория Android, в него верят операторы, Android-девайсами пользуется большинство геймеров. Доля iOS составляет 12.9% на рынке Китая, по данным iiMedia Research, Android — 65%.

Следующая цифра от Китайского центра информации сети интернет — по состоянию на конец 2012 года в Китае зарегистрировано более 420 миллионов устройств с выходом в интернет. При этом, 68% или порядка 286 миллионов владельцев этих устройств играют в игры.

Важное отличие от западного рынка — доля Google Play и Apple AppStore вместе взятых составляет всего 16%, и почти 60% у альтернативных порталов, таких как 360.cn, 91.com и d.cn.

В итоге, между разработчиком игр и пользователем находятся операторы игрового контента, платформы для скачивания игр, платформы раскрутки игр, мобильные операторы, производители устройств, операторы биллинга… Становится понятно, что прийдется играть по особым правилам и щедро делиться доходами от игры (про это — в следующий раз).

Из-за обилия контента и всеобщей практики копирования всего и вся, без фичеринга и маркетинга на какой-либо успех своего приложения надеяться не стоит. Даже так: выпуск игры в Китае в принципе имеет смысл только если заручиться поддержкой сильного местного игрока.



В Unity Games China мы держим постоянно обновляемый каталог игр, который доступен нашим партнерам. Наша внутренняя команда отбирает игры на Unity, которые могут понравиться китайскому пользователю и показывает их партнеру. Если партнеру нравится игра, он выдвигает список предложений по адаптации данной игры и предлагаемый вариант маркетинга.

Адаптация игры, как правило, включает изменение монетизации (часто радикальное), добавление актуального для Китая контента (панду и храм!), урезание игры до заданного размера (выкидываются все интро, «лишние» анимации, аудио, жестоко сжимаются текстуры и т.д.). Иногда приходится переделывать игру для запуска на слабых Android-девайсах.

Всем этим занимается внутренняя команда Unity Games China, иногда, при поддержке разработчика игры. Процесс важно завершить в течение нескольких дней после приглашения оператора. Обычную мобильную игру мы переводим и переделываем за 5-8 дней. Дней, друзья, дней, иначе твое место в хайлайте у оператора займет кто-то другой.

Примеры из недавнего прошлого — Ballistic и Critter Escape. Локализация, портирование с iOS на Android и встраивание платежной системы заняли у нашей команды 6 дней для Ballistic и 8 дней для Critter Escape.



Недавно мы заключили договор с Qihoo 360 (www.360.cn, ~250 млн пользователей),
91 Mobile (www.91.com, ~200 млн пользователей) и China Mobile Games (g.10086.cn, ~ 80 млн пользователей), согласно которому в магазинах приложений данных провайдеров появится отдельный раздел игр на Unity — Unity Games Zone.

Продолжение следует…

Особенности игрового рынка в Китае — часть 1
Мой блог на инглише (в том числе про Китай и ChinaJoy)

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Сравнение электронных стабилизаторов напряжения зарубежного (китайского) и Российского производства

    В настоящее время вопрос необходимости и выбора стабилизатора напряжения становится все сложнее. На рынке появились недорогие On-line ИБП, способные отчасти заменить функции стабилизатора (работают в широком диапазоне напряжений, достаточно хорошо переносят перегрузки). Однако зачастую наши бытовые и промышленные сети губят даже ИБП из-за перенапряжений и других факторов. Поэтому применение стабилизаторов напряжения для защиты оборудования (и тех же ИБП) все еще довольно актуально.
    В качестве обзорной продукции были выбраны образцы довольно распространенных релейных стабилизаторов РЕСАНТА, китайский стабилизатор TDR-10000 малоизвестной фирмы, купленный на “алибабе” и стабилизатор российского производства серии СКм. Другие типы стабилизаторов (тиристорные, мотор-приводные и проч.) для сравнения не брались, поскольку, во-первых, сравниваем то, что есть на руках, а во-вторых, их сравнение может перерасти в очередной “холивар”. У каждого типа стабилизаторов есть и свои преимущества, и свои недостатки. Выбор всегда является компромиссом.
    То, что стабилизаторы выполняют свою основную функцию не подвергаем сомнению, иначе они и не продавались бы – все они поддерживают выходное напряжение в заданном диапазоне. Поэтому критерии сравнения выберем следующие: замечания по параметрам; внешний вид; качество монтажа и комплектующих; защиты, электробезопасность и пожаробезопасность, дополнительные функции.

1. Стабилизатор напряжения РЕСАНТА АСН-8000/1.

Замечания по параметрам:
    Параметры стабилизаторов можно найти на сайте РЕСАНТА.
    Первое, на что бросается в глаза при прочтении инструкции по эксплуатации это нагрузочная характеристика. Оказалось, что, например, для нашего стабилизатора АСН-8000/1 при напряжении менее 200 В линейно снижается допустимая выходная мощность с 8 кВА до 4 кВА. Это неприятно удивило (причем, в соответствии с инструкцией по эксплуатации, производитель навязывает потребителю выбор заведомо более мощного стабилизатора, иначе он снимается с гарантии). Ведь по стандарту (п.5.2 ГОСТ 13109-97), предельно допустимое отклонение сетевого напряжения от номинального составляет 10% (198-242 В). Т.е. при напряжении больше 200 В стабилизатор не особо и нужен (можно обойтись силовым защитным реле). А при напряжении менее 200 В, нужно учитывать допустимую мощность, которая ниже максимальной. В руководстве это объясняется возрастанием входного тока стабилизатора. Единственное чем это можно объяснить на самом деле — намеренное завышение выходной мощности в рекламных целях, поскольку эта проблема решается увеличением типоразмера автотрансформатора – а это лишние габариты и деньги.
    Второе – это время регулирования. Хитрые производители указывают время регулирования как время перелета контактов реле, да и то, указанные 5 мс никак не соответствуют действительности. Реальное время переключения реле (от момента подачи напряжения на катушку до замыкания контактов) не менее 7 мс для реле лучших фирм-производителей: Omron, Tyco, Hongfa, TTI (одно время я ускорял с 15 мс до 4,5 мс переключение поляризованных реле GRUNER подачей повышенного напряжения управления в начале включения — но это крайне губительно сказывается на сроке службы реле), плюс время реакции системы управления — для управление по действующему значению напряжения это не менее 3-5 мс (четверть волны сетевого напряжения).

Внешний вид:
    Внешний вид стабилизаторов практически не отличается он китайских собратьев, что наводит на мысль об их происхождении (на фото стабилизатор предыдущей версии — еще с электромеханическими стрелочными вольтметрами).


Качество монтажа и комплектующих:
    Внутри стабилизаторы выглядят довольно приемлемо и аккуратно (о, этот незабываемый запах китайской резины… аж передергивает, и через час начинает болеть голова), за исключением крепления печатной платы в двух точках и электролитических конденсаторов, которые как всегда в китайских изделиях стоят “кто в лес, кто по дрова” (российские ОТК такого монтажа не допустили бы).

    Подкачал также монтаж проводников к реле. Монтаж произведен пайкой, не совсем аккуратно, но главное – работает.

    Реле в стабилизаторе установлены JQX-40F. Производитель на корпусе не указан, но такие реле делаю многие производители. Реле рассчитаны на 40А, что вполне достаточно для 8 кВА нагрузки.

Защиты, электробезопасность и пожаробезопасность:
    В стабилизаторах имеется термозащита от перегрева автотрансформатора, что не может не радовать.
    Цепей измерения тока в стабилизаторах обнаружено не было. Из чего можно сделать вывод, что автоматическая защита от перегрузки отсутствует – надежда только на встроенный автоматический выключатель и защиту от перегрева. Кроме того, остается неизвестным принцип коммутации реле — при переходе через ноль тока, ноль напряжения или в произвольный момент времени — от этого зависит ресурс работы реле.
    Защита выхода от превышения входного напряжения заявлена производителем на уровне 260 В. Хотя остается неясным предельное значение напряжения, при котором сам стабилизатор не выйдет из строя.
    При дальнейшем осмотре внутренностей, установлено что стабилизаторы не содержат вообще никаких элементов фильтрации и защиты от импульсных перенапряжений (ГОСТ Р 51992-2002).
    В мощных стабилизаторах применено принудительное охлаждение (не особо эффективное, но достаточное). С одной стороны это облегчает режимы работы компонентов стабилизатора, а с другой – это включенный и шумящий вентилятор, который со временем потребует обслуживания.

Дополнительные функции:
    Из дополнительных функций можно выделить наличие в более мощных моделях переключателя обводной цепи, который позволит питать нагрузку напрямую от сети при выходе стабилизатора из строя.
    Кроме того, стабилизаторы отображают значение напряжение на входе и выходе (стрелочными приборами в предыдущих моделях и цифровыми индикаторами в текущих, представленных на рынке).

    Подводя итоги, можно отметить основные особенности (как положительные, так и отрицательные) стабилизаторов РЕСАНТА:
      1) Покупать стабилизаторы нужно не менее чем с 40% запасом по мощности
      2) Стабилизаторы имеют в составе основные элементы пожаробезопасности и защиты
      3) Стабилизатор вероятней всего защитит подключенное оборудование от длительных перенапряжений, хотя и сам при этом может выйти из строя.
      4) В стабилизаторе отсутствуют элементы фильтрации сетевого напряжения и элементы защиты от импульсных перенапряжений.
      5) Стабилизаторы невероятно дешевы. В России один только трансформатор на ту же мощность, что и стабилизатор РЕСАНТА стоит в половину его цены.

2. Стабилизатор напряжения TDR-10000 китайского производителя.

    Стабилизатор был куплен в Китае и доставлен службой EMS (такие же стабилизаторы можно найти и в России). Стоимость на 30% меньше стабилизатора РЕСАНТА.

Замечания по параметрам:
    Отсутствуют, хотя данных по зависимости выходной мощности от входного напряжения нет.

Внешний вид:
    Неплохой внешний вид, за исключением того, что при транспортировке автотрансформатор погнул днище корпуса (тонкое оно и не рассчитано на такие нагрузки).



Качество монтажа и комплектующих:
    При вскрытии кожуха удивлению не было предела (на фото вид стабилизатора так, как он прибыл).

    Видимо, проводов от трансформатора не хватило, плюс днище утянуло.
    Крепление печатной платы и монтаж конденсаторов аналогичны стабилизаторам РЕСАНТА.
    При дальнейшем обследовании выяснилось, что в стабилизаторе установлены “no-name” реле, аналогичные TR90 (TTI) или HF2150 (HONGFA) на номинальный ток 30А. Т.е. максимальная коммутируемая мощность реле 6600 ВА, ни о каких заявленных 10000 ВА речи быть не может.
    Поэтому дальнейшее описание стабилизатора бессмысленно.
    Стабилизатор включили, посмотрели как показывает входное и выходное напряжения (довольно точно), выключили и убрали подальше.

Вывод — не надо гнаться за дешевизной.

3. Стабилизаторы напряжения российского производства СКм.

    В наличии был стабилизатор СКм-6000, поэтому разговор пойдет о нем.

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

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


Качество монтажа и комплектующих:
    Монтаж стабилизатора выполнен в соответствии с ГОСТ и ОСТ. Все проводные соединения разъемные, с применением кабельных наконечников различного типа. Плотность монтажа довольно высокая, свободного места в корпусе практически нет.

    Реле в стабилизаторе установлены фирмы TycoElectronics серии RMC с номинальным током 30 А, что вполне достаточно для коммутации 6 кВА нагрузки.

Защиты, электробезопасность и пожаробезопасность:
    В отличие от рассмотренных выше, в стабилизаторах СКм имеется встроенный узел контроля тока нагрузки. Благодаря этому, кроме встроенного входного автоматического выключателя, реализована функция автоматического контроля перегрузки. А главное, коммутация реле стабилизатора осуществляется в момент перехода тока нагрузки через ноль – это позволяет максимально уменьшить образование дуги на контактах реле. Следовательно, ресурс реле увеличивается в разы.
    Стабилизатор автоматически выключает выход при достижении входного уровня 304 В. При этом, сам стабилизатор выдерживает длительно напряжение до 420 В (т.е. при случайной подаче линейного напряжения на стабилизатор или “отгорании нуля”, он не выйдет из строя, при этом защитив нагрузку).
    Стабилизатор имеет встроенную электронную термозащиту, которая позволяет автоматически отключать стабилизатор при перегреве и производить повторное включение после его остывания.
    Стабилизаторы СКм разрабатывались для электропитания в том числе средств связи, поэтому имеют в своем составе высокочастотный фильтр (на фото — под клеммными блоками) и модули защиты от импульсных перенапряжений (на фото — слева от клеммных блоков).


Дополнительные функции:
    Стабилизаторы оснащены светодиодной индикацией. Видимо, производитель решил, что потребителю не зачем знать какое напряжение на входе и выходе, а стабилизатор звуковой и световой сигнализацией известит, если что-то будет не в норме.
    Для особо любопытных пользователей есть исполнение стабилизаторов с разъемом RS-232 для подключение к компьютеру, где с помощью специального ПО можно просмотреть текущие параметры сети, выхода, а также журнал событий.
    Кроме того, стабилизатор, аналогично стабилизаторам РЕСАНТА, оснащен встроенной обводной цепью.

Итого, обозначим положительные и отрицательные особенности стабилизаторов СКм:
1) Стабилизаторы держат заявленную номинальную мощность во всем диапазоне входных напряжений
2) Стабилизаторы имеют в составе основные элементы пожаробезопасности и защиты, а также дополнительные электронные средства обеспечения защиты.
      3) Стабилизатор защитит подключенное оборудование от длительных перенапряжений, при этом не выйдет из строя при напряжении сети до 420 В.
      4) Специальный алгоритм переключения реле увеличивает срок службы стабилизаторов.
      5) В стабилизаторе установлены элементы фильтрации сетевого напряжения и защиты от импульсных перенапряжений.
      6) Имеются исполнения стабилизаторов с портом RS-232 для обеспечения локального мониторинга, или встраивания его в сеть глобального мониторинга.
      7) Достаточно высокая стоимость – в разы выше “китайских” стабилизаторов и сопоставима со стоимостью стабилизаторов российских фирм-производителей (Энергия, Интепс, Штиль). Причины кроются в обеспечении выполнения требований ГОСТ, достаточно высокой стоимости рабочей силы, а также общего положения малой промышленности в России, где стоимость комплектующих намного выше, чем в Китае.

    В свете вышесказанного, нужно отметить что, покупая стабилизатор переменного напряжения нужно не только гнаться за большей мощностью за меньшие деньги, точностью стабилизации или широким диапазоном рабочих напряжений (на примере РЕСАНТА можно видеть работу маркетинга), но и учитывать остальные важные параметры, которые могут не и выставляться на передний план.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Решение задачи кластеризации методом градиентного спуска

Привет. В этой статье будет рассмотрен способ кластеризации данных, используя метод градиентного спуска. Честно говоря данный способ носит больше академический характер, нежели практический. Реализация этого метода мне понадобилась в демонстрационных целях для курса по машинному обучению, что бы показать как одинаковые задачи можно решить различными способами. Хотя конечно если вы планируете осуществить кластеризацию данных, используя дифференцируемую метрику, для которой вычислительно труднее найти центроид, нежели подсчитать градиент на некотором наборе данных, то этот метод может быть полезным. Итак если вам интересно как можно решить задачу k-means кластеризации с обобщенной метрикой используя метод градиентного спуска, прошу под кат. Код на языке R.



Данные

В первую очередь давайте обсудим множество данных, на котором мы будем тестировать алгоритмы. Для тестирования используется множество данных с датчиков смартфонов: всего 563 поля в 7352 наблюдений; из низ 2 поля выделены для идентификатора пользователя и типа действия. Множество создано для классификации действия пользователя в зависимости от показаний датчиков, всего 6 действий (WALKING, WALKING_UPSTAIRS, WALKING_DOWNSTAIRS, SITTING, STANDING, LAYING). Более подробное описание множества вы можете найти по вышеприведенной ссылке.

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

Код
<code class="matlab">m.proj <- ProjectData(m.raw, e$eigenVectors[, c(1, 3)])
plot(m.proj[, 1], m.proj[, 2], pch=19, 
     col=rainbow(6)[unclass(as.factor(samsungData$activity))], 
     xlab="first", ylab="third", 
     main="Two components; actions")
</code>




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

Функция стоимости алгоритма k-means

Введем следующие обозначения:
  • — множество центроидов соответствующих кластеров
  • — исходное множество данных, которое необходимо кластеризировать
  • — k-ый кластер, подмножество исходного множества

А теперь рассмотрим функцию стоимости классического алгоритма k-means:

т.е. алгоритм минимизирует суммарное квадратичное отклонение элементов кластера от центроида. Другими словами, минимизируется сумма квадратов Евклидова расстояния элементов кластера от соответствующего центроида:
, где f — в данном случае является Евклидовым расстоянием.

Как известно для решения этой проблемы существует эффективный алгоритм обучения основанный на алгоритме expectation-maximization. Давайте взглянем на результат работы этого алгоритма, используя встроенную в R функцию:

Код
<code class="matlab">kmeans.inner <- kmeans(m.proj, 3)
plot(m.proj[, 1], m.proj[, 2], pch=19, 
     col=rainbow(3)[unclass(as.factor(kmeans.inner$cluster))],
     xlab="first", ylab="third", 
     main=paste(k, " clusters; kmeans \n cost = ", kmeans.inner$tot.withinss/2, sep=""))
</code>




Градиентный спуск

Сам алгоритм градиентного спуска довольно таки прост, суть в том что бы двигаться небольшими шажками в сторону обратную направлению градиента, так например работает алгоритм обратного распространения ошибки, или алгоритм contrastive divergence для обучения ограниченной машины Больцмана. Перво-наперво необходимо рассчитать градиент целевой функции, или же частные производные целевой функции по параметрам модели.

, раз уж мы вышли из секции про классический k-means, то и f может быть в принципе любой мерой расстояния, не обязательно Евклидовой метрикой

Но тут есть проблема, мы не знаем на данном этапе каково разбиение множества X на кластеры. Давайте попробуем переформулировать целевую функцию так, что бы записать ее в виде одной формулы, что бы легко было продифференцировать: сумма минимальных расстояний от каждого элемента множества до одного из трех центроидов. Эта формула выглядит следующим образом:



Теперь давайте найдем производную новой целевой функции:



Ну что ж, осталось выяснить чему равна производная минимума, но тут оказывается все просто: в случае если a-ый центройд это действительно тот, до которого расстояние минимально от текущего элемента множества, то производная выражения равна производной квадрата расстояния по элементу вектора, в противном случае равна нулю:



Реализация метода

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

Функции расстоянияФункция расстояния

<code class="matlab">HalfSqEuclidian.distance <- function(u, v)
{
  # Half of Squeared of Euclidian distance between two vectors
  #
  # Args:
  #   u: first vector
  #   v: second vector
  #
  # Returns:
  #   value of distance
  return(sum((u-v)*(u-v))/2)   
}
</code>

Функция вычисления частной производной
<code class="matlab">HalfSqEuclidian.derivative <- function(u, v, i)
{
  # Partial derivative of Half of Squeared of Euclidian distance 
  # between two vectors
  #
  # Args:
  #   u: first vector
  #   v: second vector
  #   i: index of part of second vector
  #
  # Returns:
  #   value of derivative of the distance
  return(v[i] - u[i])
}
</code>


Метод градиентного спуска
<code class="matlab">
KMeans.gd <- function(k, data, distance, derivative,
                      accuracy = 0.1, maxIterations = 1000, 
                      learningRate = 1, 
                      initialCentroids = NULL, showLog = F)
{
  # Gradient descent version of kmeans clustering algorithm
  #
  # Args:
  #   k: number of clusters
  #   data: data frame or matrix (rows are observations)
  #   distance: cost function / metrics
  #   centroid: centroid function of data
  #   accuracy: accuracy of calculation
  #   learningRate: learning rate
  #   initialCentroids: initizalization of centroids
  #   showLog: show log
  
  n <- dim(data)[2]
  c <- initialCentroids
  
  InitNewCentroid <- function(m)
  {
    c <- data[sample(1:dim(data)[1], m), ]
  }
  
  if(is.null(initialCentroids))
  {
    c <- InitNewCentroid(k)
  }
  
  costVec <- vector()
  cost <- NA
  d <- NA
  lastCost <- Inf
  for(iter in 1:maxIterations)
  {
    g <- matrix(rep(NA, n*k), nrow=k, ncol=n)
    
    #calculate distances between centroids and data
    d <- matrix(rep(NA, k*dim(data)[1]), nrow=k, ncol=dim(data)[1])
    for(i in 1:k)
    {
      d[i, ] <- apply(data, 1, FUN = function(v) {distance(v, c[i, ])})
    }
    
    #calculate cost
    cost <- 0
    for(i in 1:dim(data)[1])
    {
      cost <- cost + min(d[, i])
    }
    if(showLog)
    {
      print(paste("Iter: ", iter,"; Cost = ", cost, sep=""))
    }
    costVec <- append(costVec, cost)
    
    #stop conditions
    if(abs(lastCost - cost) < accuracy)
    {
      break
    }
    lastCost <- cost
    
    #calculate gradients
    for(a in 1:k)
    {
      for(b in 1:n)
      {
        g[a, b] <- 0
        for(i in 1:dim(data)[1])
        {
          if(min(d[, i]) == d[a, i])
          {
            g[a, b] <- g[a, b] + derivative(data[i, ], c[a, ], b)
          }
        }
        
      }
    }
    
    #update centroids
    for(a in 1:k)
    {
      for(b in 1:n)
      {
        c[a, b] <- c[a, b] - learningRate*g[a, b]/dim(data)[1]
      }
    }
  }
  
  labels <- rep(NA, dim(data)[1])
  for(i in 1:dim(data)[1])
  {
    labels[i] <- which(d[, i] == min(d[, i]))
  }
  return(list(
    labels = labels,
    cost = costVec
  ))
}
</code>


Тестирование
<code class="matlab">KMeans.gd.result <- KMeans.gd(k, m.proj, HalfSqEuclidian.distance, 
                              HalfSqEuclidian.derivative, showLog = T)
plot(m.proj[, 1], m.proj[, 2], pch=19, 
     col=rainbow(k)[unclass(as.factor(KMeans.gd.result$labels))],
     xlab="first", ylab="third", 
     main=paste(k, " clusters; KMeans.gd \n cost = ", KMeans.gd.result$cost[length(KMeans.gd.result$cost)], sep=""))
</code>


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



А так выглядит динамика значения функции стоимости от итерации у обоих алгоритмов:



Заключение

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

Взглянем на сложности алгоритмов при кластеризации используя Евклидово расстояние, рассмотрим только одну итерацию (анализ же количества итераций является совсем не тривиальной задачей). Обозначим за k — количество кластеров, n — размерность данных, m — количество данных (k <= m). В экстремальном случае k = m.
  • EM версия:
  • GD версия:

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

Весь код вы можете найти здесь.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


GameJam и музыка на Chaos Constructions 2013

image

Всего неделя осталась до фестиваля компьютерного творчества «Chaos Constructions», который будет проходить в клубе А2 на Медиков, 3.

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

Так, уже ставший популярным геймджем от GeekParty.ru состоится на фестивале! За 24 часа предлагается создать игру на объявленную тему. Приходите с уже сформированной командой, найдите себе единомышленников прямо на пати или творите волком-одиночкой от геймдева. Используйте свои движки и наработки кода или разрабатывайте все с нуля прямо на пати.

Приветствуются Flash, HTML5, HaXe, Unity и любые другие технологии, позволяющие запускать твое творение в браузере. Подробности смотри на geekparty.ru

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

В этом году пати начнется уже в пятницу вечером, 9-ого августа некоммерческий нет-лейбл BleepLove откроет своим 8-bit, Chiptune безумием компьютерный фестиваль Сhaos Constructions 2013!

Для вас в ночь с пятницы на субботу выступят лучшие 8-битные музыканты страны: AlexOgre, Kosmopop2, VRUMZSSSR, Reboot Me, Twistboy, GameGate, Daletune!

Конкурсная программа фестиваля также будет разбавлена выступлениями известных музыкантов и чиптюн диджедаев.

В субботу и воскресенье для вас также выступят: SkweeeRRL, China Toy, Michael Draw, Twistboy, Rezolom, Gasman^AY Riders.

Подробная информация – на сайте фестиваля: 2013.chaosconstructions.ru. Спешите купить билеты по льготной цене на сайте клуба A2!

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] Аналитика по российскому рынку книжных сканеров

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

Для начала давайте разберемся на каких типах и видах сканеров можно оцифровать книги. Это:

  • Планшетные сканеры;
  • Планетарные: мобильные, классические и фото-сканеры;
  • Автоматические книжные сканеры.
Планшетные книжные сканеры
Планшетные книжные сканеры очень напоминают обычные планшетные сканеры, с которыми многие сталкиваются в рабочей жизни или используют в домашних условиях. В отличие от своих планшетных собратьев, на которых книгу можно отсканировать полным разворотом, на книжных сканерах книга сканируется постранично. Причем один край сканирующей плоскости – узкий. Это позволяет сканировать страницу максимально близко к корешку. В результате одна половина книги прилегает к плоскости сканирующей поверхности, а другая свешивается за край сканера. Эта технология также позволяет избежать искажения текста в области переплета, возникающее при сканировании книги на обычном (планшетном) сканере. Наиболее яркие представители этой ниши — сканеры производителей Plustek и Avision.
Планшетный книжный сканер Plustek OpticBook 3800


Планшетный книжный сканер Avision FB2280E

У Plustek существует целая линейка сканеров под названием OptiсBook. Со слов производителя эта серия разработана специально для крупных организаций, библиотек, университетов и государственных учреждений. Сканеры Plustek используют собственную технологию SEE (Shadow Elimination Element), одна из особенностей которой – специальная конструкция лампы. Благодаря ей элемент сканирования охватывает всю страницу целиком. Это позволяет даже на неплотно прилегающих страницах, в местах, близких к корешку книги, получать изображения высокого качества. Работая с изданием, можно либо попеременно сканировать левые и правые страницы, либо последовательно все левые, а затем все правые. А с помощью ПО, поставляемого со сканером, можно предварительно настроить необходимый угол, на который следует поворачивать те или иные страницы. В конечном результате вы получите все страницы правильной ориентации, что сэкономит вам время при последующей обработке изображений.

Компания Avision предлагает похожую платформу собственной разработки, которая позволяет получать четкие изображения в пределах 2 мм от корешка книги, а также избежать затемнения и искажения текста.

Подводя промежуточный итог, стоит отметить, что планшетные книжные сканеры — неплохое решение по доступной цене. Они, как правило, позволяют сканировать издания формата А3+, имеют хорошую скорость сканирования и оптическое разрешение до 1200dpi, просты в эксплуатации и подойдут для небольших помещений и небольших объемов сканирования. Однако, несмотря на то что такой сканер адаптирован для сканирования книг и других нерасшитых документов, не исключается вероятность повредить хрупкое ценное издание.

Стоимость:
  • Plustek OpticBook 3800: 11 300 руб.
  • Avision FB2280E: 16 800 руб.
Преимущества:
  • цена
  • относительная простота и привычность использования
  • высокое качество сканирования
Недостатки:
  • невысокая скорость сканирования книги в целом за счет постоянного поднятия и переворачивания книги
  • неудобство перелистывания документов
Рекомендации:
  • Для небольших объемов сканирования, с максимальным качеством, при ограниченном бюджете.
Говоря о планшетных сканерах, хочется рассмотреть такой экземпляр как SMA Scan Master. SMA – это устройство на стыке планшетного и планетарного сканера. От планетарного Scan Master перенял традиционную колыбель, а от планшетного — непосредственно сканирующее устройство в виде перевернутого планшетного сканера. Книга располагается лицевой стороной вверх на выдвижной колыбели и раскрывается на 180 градусов. Абсолютно плоская, на первый взгляд, колыбель, состоит из двух половинок, каждая из которых регулируется по высоте в зависимости от толщины каждой из половин книги. Далее колыбель задвигается, поднимается и прижимается к сканирующей поверхности. Оператору остается лишь перелистывать страницы. Закрытая конструкция сканера и светодиодная система подсветки делают такой сканер полностью независимым от внешнего освещения. Модельный ряд представлен сканерами формата от А0+ до А3+, что позволяет подобрать необходимую модель под конкретные нужды. Правда, если придется сканировать издание, имеющее ограниченный допустимый угол раскрытия, в области корешка образуется излишнее напряжение, которое может привести к повреждению книги.

Книжный сканер SMA ScanMaster 2



Планетарные (орбитальные, оверхед-) книжные сканеры
Планетарный (англ. planetary), он же орбитальный (англ. orbital), он же оверхед- (англ. overhead) сканер — это устройство, где сканирующий механизм расположен над книгой, на некотором от нее расстоянии. Сканеры могут комплектоваться автоматическими колыбелями, компенсирующими толщину книги с сохранением горизонтального положения разворота книги, прижимными стеклами, встроенными экранами для просмотра результатов, собственными элементами освещения или без таковых.

Планетарные книжные сканеры можно разделить на три категории:

  • Мобильные
  • Классические
  • Фото-сканеры
Яркий представитель категории мобильных планетарных сканеров — компактный сканер SCEYE. Его отличают небольшие габариты и вес, которые позволяют положить его в сложенном состоянии в рюкзак или сумку и взять с собой, например в командировку. В состоянии, когда сканер готов к работе, его конструкция напоминает настольную лампу.

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

Плоская поверхность (например, стол) размером 40х40см и сам сканер, который устанавливается за несколько движений — и можно смело приступать к работе. Достаточно расположить документы в области сканирования и сканер сам сделает снимок, при необходимости повернет или обрежет изображение и передаст данные через USB-порт. В области сканирования можно сразу расположить несколько документов, если они имеют небольшой размер и не выходят за обозначенную область. В таком случае для сканера не составит труда сделать один снимок, а после выделить и поместить каждый идентифицированный документ в отдельный файл.

Сканеры SCEYE в основном предназначены для сканирования документов, не превышающих формата А4, однако, в линейке присутствует и модель охватывающая формат А3. Такая модель стоит дороже и требует чуть больше рабочего пространства.

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

Тренд последнего времени — появление новой группы устройств, предназначенных для мобильного захвата (англ. mobile capture). Например, Scandock, новинка от компании ATIZ, дает возможность быстро получить качественные снимки документов. В роли сканирующего устройства выступает смартфон. Можно использовать стандартные функции фотографирования или скачав специально разработанное бесплатное приложение, доступное для платформ iOS и Android, на лету создавать электронные книги.
Сканер SCEYE


Сканер Scandock


Стоимость:
  • SCEYE: 50 000 руб. за модель формата А4
  • Scandock: на данный моменты сканеры Scandock на российский рынок еще не поставляются. Цена, заявленная производителем, составляет $399.
Преимущества:
  • мобильность
  • компактность
  • простота и удобство использования
  • относительно невысокая стоимость
Недостатки:
  • качество, производительность и скорость сканирования недостаточны для целей сканирования книг
Рекомендации:
  • предназначены для организаций и лиц, которым необходимо отсканировать небольшие объемы документов, в случае, когда приоритетным является компактность и мобильность устройства, а не высокое качество изображения.

Говоря о классических планетарных сканерах, стоит обратить внимание на таких производителей как Image Access GmbH, Zeutschel, i2s, Book2Net и другие. Стоимость таких устройств на российском рынке может достигать миллиона рублей, что делает их весьма дорогостоящими и доступными только для финансово обеспеченных организаций. Тем не менее, качества и характеристики этих сканеров делают их достойными пристального внимания, они зарекомендовали себя как производительные, высококачественные и надежные.

Классические книжные сканеры Book2Net: Spirit и Kiosk Production



Стоимость:
  • Сканер Bookeye 4 формата A2+ от компании Image Access на европейском рынке будет стоить примерно $26000. Большинство компаний-поставщиков по понятным причинам не публикует стоимость таких сканеров в открытом доступе. Цены, как правило, предоставляются по запросу.
Преимущества:
  • высокая производительность
  • высокое качество сканирования
Недостатки:
  • высокая стоимость самих сканеров и их обслуживания
  • отсутствие мобильности, громоздкость и хрупкость
  • любые перемещения и перевозки сопряжены с последующей необходимостью юстировки и настройки оборудования
Рекомендации:
  • для стационарного использования, сканирования больших объемов и высоких требований к качеству получаемого изображения
Закрывают наш список планетарных книжных сканеров «фото-сканеры». Как понятно из названия, в роли сканирующей головки планетарного сканера выступает цифровая фотокамера (ЦФК). Идея закрепить фотокамеру на некотором расстоянии от книги и произвести «сканирование» страницы — не нова, и, более того, подобное устройство несложно соорудить в домашних условиях. Однако, компания ATIZ, в свое время, совершила прорыв в области книжного фото-сканирования, оснастив свои сканеры V-образной колыбелью, угол раскрытия которой – 120 градусов. Съемка одновременно ведется двумя фотокамерами.
Книжный фото-сканер ATIZ


Книжный фото-сканер Optima-V


Вопросы, связанные с книжными фото-сканерами, и проблемы их выбора мы рассмотрим в другой раз, а пока лишь обратим внимание на существующие на рынке решения в этой области. Книжные сканеры ATIZ появились в России в 2006 году и стали наиболее распространенными фото-сканерами. Российские производители создали многочисленные реплики и копии, но единицы смогли выйти на промышленное производство. Значительных успехов добилась иркутская компания «Байкал Композит», разработавшая оригинальную модель книжного сканера под названием Optima-V с одним фотоаппаратом и системой зеркал, а также возможностью механизированного прижима стекла.

Стоимость:
  • ATIZ BookDrive Mini: 516 250 руб.
  • Optima-V формата A3: 395 000 руб.
Преимущества:
  • цена (от 350 до 700 тыс. руб., в зависимости от производителя, модели и комплектации)
  • простота установки и использования
  • модернизация сканера за счет замены фотокамер на более совершенные
  • производительность
Недостатки:
  • сканеры на основе цифровых фотоаппаратов не предназначены для решения узкоспециализированных задач оцифровки, как, например, создание страхового фонда, где сканы должны быть высочайшего качества и должна быть передана даже структура бумаги. Этот аспект профессионалы часто ставят в вину фото-сканерам. Однако для решения 99% остальных задач оцифровки такие сканеры вполне подходят.
Рекомендации:
  • для финансовых и страховых организаций, государственных учреждений и компаний, где существует постоянная потребность в оцифровке больших объемов документов без возможности расшивки.
Автоматические книжные сканеры
К категории автоматических книжных сканеров можно отнести лишь те сканеры, которые самостоятельно перелистывают страницы. Так, например, сканер Optima-V таковым не является, в нем автоматизирован лишь процесс прижима стекла.

ScanRobot от компании Treventus был представлен российской публике в 2009 году на конференции-выставке Docflow компанией ЭЛАР. V-образная колыбель имеет угол раскрытия в 60 градусов (с возможностью регулировки и максимальным углом в 100 градусов). Толщина изданий, которые способен оцифровать этот сканер, может достигать 15см. Заявленная производителем скорость сканирования составляет 2500 стр.\час в автоматическом режиме. Сканирующий элемент размещен в призме, опускающейся сверху в разворот книги. Сканирование происходит при подъеме призмы, обе страницы разворота вакуумно прижимаются к сканирующим линейкам, заодно очищая книгу от пыли. Переворачивание производится струей воздуха.
Автоматический книжный сканер ScanRobot


Автоматический книжный сканер Quidenus Mastered


Другой известный производитель автоматических книжных сканеров — компания Quidenus. В зависимости от модели, сенсоры с разрешением от 12 до 36, а в некоторых случаях и до 40 мегапикселей, в сочетании с первоклассными линзами Carl Zeiss позволяют получать изображения высокого качества. В основе всех моделей лежит V-образная колыбель, с возможностью автоматического изменения угла наклона. Автоматический сканер Quidenus Robotic для перелистывания страниц использует запатентованную технологию «Bionic Finger». Так называемый «Бионический палец» создан по образу и подобию человеческого указательного пальца. Напоминая движения человеческой руки, бионический палец переворачивает страницы книги.

Стоимость:
  • стоимость автоматических книжных сканеров, анонсированная на различных выставках и конференциях, составляет порядка 5 млн.руб. Информация о точной стоимости компанией производителем и дистрибьюторами в открытом доступе не указывается и предоставляется только по запросу.
Преимущества:
  • минимальное участие человека непосредственно в процессе сканирования
  • высокое качество получаемых изображений
  • высокая производительность
Недостатки:
  • очень высокая цена
  • отсутствие мобильности (например, ScanRobot весит целых 260 кг.)
  • любые перемещения и перевозки сопряжены с последующей необходимостью юстировки и настройки оборудования
  • настраивать такое оборудование придется также долго, если вы просто решите оцифровывать книги другого – большего или меньшего — формата
  • многие специалисты, работающие со старыми фондами изданий, не доверяют оцифровку таким устройствам из-за боязни повредить ценные издания
  • техническая сложность: в случае если сканер выйдет из строя или сломается какая-то деталь, процесс ее замены и доставки из-за границы может затянуться на недели и даже месяцы, поскольку чаще техническая поддержка в России не осуществляется
Рекомендации:
  • со слов производителей автоматических книжных сканеров, такие устройства предназначены для библиотек, архивов и больших компаний, которым нужно реализовать проекты по массовой оцифровке. Если организация имеет возможность потратить около 5 млн.руб. Рублей на одну единицу оборудования, автоматический сканер рекомендован к приобретению!
Подведем общий итог
Учитывая большое разнообразие сканеров и их функциональности, мы рекомендуем:

  • Предварительно обследовать книжные фонды, требующие оцифровки
  • Сформировать функциональные требования к сканерам
  • Оценить финансовые возможности своей организации, с учетом стоимости сканеров и их дальнейшей поддержки
  • Провести тестирование предлагаемого на рынке оборудования
  • Ознакомиться с отзывами текущих пользователей
  • Узнать условия технической поддержки и возможности получения консультаций по технологиям и методикам сканирования

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Выдуманная история открытия собственного дела с печальным концом

Вечер, пятница. Почему бы не почитать одну историю с печальным концом? На Хабре ведь не приняты такие?

На днях мной был оставлен комментарий, в котором я в двух словах написал, что мой бизнес уничтожили в зачаточном состоянии. Судя по вопросам в личку на Хабре и в vk тема актуальная. Что-ж, попробую написать о том, как все было, хотя точности не обещаю. Писать о том, что я Д'Артаньян, а все негодяи — не буду, ведь вам нужна поучительная история, а не история-оправдание еще одного неудачника.

Сразу оговорюсь, я не помню о каком городе/районе идет речь, и в каком государстве это происходило, если было. Также не могу вспомнить имен и точных должностей. А потому любые совпадения случайны и не имеют никакого отношения ни к какой власти — официальной и неофициальной.

Начну с предыстории, не имеющей никакого отношения к теме топика. Тем не менее, эта предыстория — хороший пример того, почему можно ненавидеть нашу власть. В 2009 году мы переехали с семьей в Ульяновскую область и встали в очередь на лес для ремонта жилья. Очередь была небольшой, лес был, но до нас дело не доходило. Тем не менее лес выделялся регулярно для «нуждающихся», а получали его несколько человек, которые рубили срубы на продажу. Прошел год, очередь так и не дошла, а меня послали по третьему кругу кабинетов. В один момент я плюнул, попросил дать официальный отказ, с которым обращусь в Москву. Меня послали в достаточно грубой форме. Надо сказать, что в силу того, что населенный пункт небольшой — руководящих должностей меньше, и все они заняты знакомыми людьми, которые действуют согласованно. Эдакие царьки. В-общем я написал письмо в Москву о махинациях Администрации с ксерокопиями документов. Через 2 недели мне пришла отписка, что письмо передано на рассмотрение в Ульяновск. Еще через 2 недели пришла отписка из Ульяновска, что письмо передано на рассмотрение в местную Администрацию… Еще через неделю пришло письмо от тех, на кого я писал жалобу, в котором было приложено мое письмо, и ответ в духе «ждите очереди», в котором определенно чувствовался сарказм. Вот такая предыстория. Власть прикрывает власть. Жаловаться (не красивое слово, да?) некому.

А теперь к теме топика. В предыдущих своих статьях я лукавил. Я не сказал ни слова о том, что был директором. Нет, не так. На тот момент, когда я устроился на текущую работу, в городе работали 3 интернет-провайдера:

— Первый. Самый старый провайдер. Вообще, они предоставляют телефонию, но начали предоставлять и интернет, хотя с ним не клеилось. В прошлом году активно зашевелились, т. к. начали сдавать позиции. Т.к. предоставляют телефонию — зона покрытия максимальная.

— Второй провайдер. Тут все сложно. Абсолютное превосходство в количестве абонентов. Самый раскрученный провайдер. Владельцы компании не те, кто числится ну бумаге. Отсюда и множество проблем. Работают только в многоквартирном секторе, частный сектор не интересен.

— Третий провайдер. Тот, куда устроился я. Предоставляют интернет и в квартирах и частном секторе, абонентов меньше всех.

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

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

Пожалуй я отвлекусь. Хочу, чтобы вы погрузились в мою жизнь, и поняли, почему я делал так, а не иначе, к чему шел, чего хотел. Как бы это нагло не звучало, но я отношу себя к категории умных, мыслящих людей, и вижу что их не так много. Чем меня и притянул Хабр, так это помимо троллей (ну как без них) сообществом ребят, которые живут идеей, делают безумные ненужные вещи ради фана, ищут себя. Представляете, DI HALT, публикации которого я читал еще году эдак в 2005, когда работал в ремонте сотовых, находится здесь же и мы можем обсуждать какие-то темы, которые интересуют обоих. Когда я говорю про умных людей, то не подразумеваю отличников, которые зачастую оказываются больше хитрожопыми (да простит меня НЛО), нежели умными. Речь и не о тех, кто открыл бизнес благодаря своему упрямству (примеры блондиночек, наращивающих ногти на дому, а потом открывающих салоны красоты приводить?).

Так вот, я отношу себя к этой категории и потому окунулся в работу с головой. Железо, программирование, телефония, карты, езда с навигатором и рисование домов в osm, было интересно все. А самое главное — простор для работ, сделать надо было десятки и сотни задач. Есть над чем работать, не то что прошлые работы, где за несколько месяцев узнаешь все, и можешь рассказать чем будешь заниматься через год-три-десять на этом же месте. Здесь все было не так. Мелкие провайдеры скупались, сети перестраивались, скрипты писались. Спасибо моей супруге и дочке, за то что терпели эти мои бесконечно длинные рабочие дни. Года за полтора вместе спать мы не легли не разу, за исключением наверное нескольких дней во время отпуска, в который также приходилось брать ноутбук и роутер с usb-свистком.

Но в то же время, на мне висела и должность начальника технического отдела. Где-то с полгода назад я начал писать пост с заголовком «Ты не начальник, парень, брось это», но плюнул. Так вот, когда приходишь в устоявшийся коллектив, и видишь, нет реально видишь, что часть сотрудников — бараны, с этим надо что-то делать. Нынешний руководитель, один из оставшихся создателей этой фирмы, брал в свое время на работу просто знакомых, не обращая внимания на их знания. Хочу сказать, что уважаю нашего бывшего директора и сейчас прекрасно понимаю, почему он ушел. Так вот, была проблема. Он по натуре — человек мягкий, а так как все работники — знакомые, то им постоянно все сходило с рук. Регулярные опоздания на 15-30 минут — обычное дело. Пришлось идти на конфликт с двумя сторонами, стал штрафовать за опоздания, за это штрафовали меня. Тем не менее, цель была достигнута — стали приходить вовремя. Мы распрощались с частью монтажников, которые отказались переучиваться. Что говорить, если у человека, который настраивает подключения, дома даже компьютера нет и все что он знает, это стандартные “меню пуск->сетевые подключения..”. Какие там виланы… Хотя было весело, регулярные корпоративы. Тем не менее руководитель отдалялся, собеседования с новыми сотрудниками проводил я, он все реже появлялся на работе. Как правило это полчаса-час в день с утра. Так, в мае прошлого года он ушел.

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

Совершенно вылетело из головы. Когда нас выкупил более крупный провайдер, новым руководством было принято решение — 1 числа такого-то месяца все абоненты должны перейти с подключения через трафик инспектора на впн. С первого числа они договор с магистральщиками разрывали и переводили нас на свой канал. Так вот, практика показала, что из 2 с небольшим тысяч абонентов на новое подключение перешло около 200-300. И вы представляете, что произошло 1 числа? Толпы народа, разъяренного народа хлынули к нам. 1300 абонентов — цена, которую компания заплатила за это. Люди не стали ждать в очередях новых настроек, они не стали ждать, когда же освободятся монтажники, чтобы приехать к ним. Представляете? Люди купили компанию с 2300 абонентов, и своими действиями потеряли 1300. Сказать, что репутация была испорчена — не сказать ничего. Это было в 2010 году.

Так вот, вы должны понимать, что позиция наша — лидерство на рынке, а для этого требовалось загладить тот случай, сломать сложившееся впечатление о компании качеством предоставляемых услуг, тарифами (которые нельзя корректировать, помните да?). И пришел этот бывший военный. К сожалению не записывали его фраз, но вы представляете — военные тупые фразочки в провайдерском представлении без понимания слов, которыми оперирует человек. Длилось его руководство около 2 месяцев, за это время монтажники, переданные под его руководство начали снова опаздывать на работу, обедать по 2 часа, врать, смеяться над ним в открытую, на глазах у абонентов. Человек перебивал общение кассиров с абонентами, влезал с комментариями, что им надо купить черную коробочку (роутер), и войти в него через яндекс и там найти поле ячейки интернет… В-общем он не понимал ничего, и все попытки обучить хоть чему-то оканчивались провалом. Кросс=оборудование конкурентов. Пожалуй не многие меня сейчас поймут, но когда ты живешь фирмой, болеешь за каждый негативный отзыв в нашу сторону, находишь действительно классных спецов, и все это рушится о дебила-руководителя, начинает бесить одно его появление. Так случилось, что на его долю выпала проверка СвязьНадзора. Вы знаете, что он нес, это даже в предложение собрать невозможно, как ему это удавалось? Он делал тупое лицо и смеялся одобряюще над каждой шуткой проверяющего, начинал бубнить какую-то чушь, когда ему задавали вопросы. Проверяющие посматривали на меня и в глазах читался вопрос — что он несет? Ответственным за сдачу назначили меня, сеть сдали (не без косяков конечно). Но дело в том, что меня интересовали на тот момент более глобальные задачи, а не трата времени на филиал. Тем временем мы снова начали терять клиентов, директор одной школы обратился с просьбой перенести точку включения из класса информатики на чердак или они отключатся, он дал добро на отключение… Т.е. задачи, которые стоят перед руководителем, он не исполнял совершенно. В-общем, эти два месяца перевернули в какой-то степени мою жизнь. Мы начали ездить на совещания в другой город вместе, вопросы в-основном задавались мне, он откровенно лгал (по всей видимости не понимая, что количество подключений, потраченных материалов и прочего — фиксируется).
Создавались все предпосылки к его уходу и моему назначению. Собственно, к этому мы и пришли. Двое из трех учредителей поддерживали мою кандидатуру, третий сомневался, но одобрил и он, правда с небольшими вводными инструкциями при личном общении. Друзья поддержали, так я был назначен на должность исполняющего обязанности директора с испытательным сроком в 3 месяца. Надо сказать, что в первый год работы зарплата вырастала до 40k, и сейчас была достигнута договоренность о том, что в случае успешного назначения будет прибавка в 10k и дальнейшая зарплата зависит от количества абонентов, точнее от их прироста.

Директором я стал досрочно, через полтора месяца. Успевал и кодить, и по утрам раздавать задания. На тот момент у нас был администратор, работающий с железом и с меня эти обязанности сняли. Поэтому на мне висело только программирование, руководство филиалом и дежурство сутки через 5 за всей сетью. Расписывать все не стану, скажу лишь, что поработав в этой компании, я абсолютно точно выстроил модель правильного директора — это глупое безропотное существо, не имеющее собственного мнения, ставящее подписи во всех бумагах, в которых требуется и абсолютно точно не являющееся основным звеном в работе провайдера, более того, это одна из наиболее низших должностей. Может где-то это не так, но в моем случае это так. Через полгода такой жизни я начал понимать, что я постоянно срываюсь на родных, мне худеть некуда, а я худею. Хотя учредители были довольны. Ну как же, я ведь вдвойне директор. На совещаниях только я, и учредитель-связист могли говорить о технической составляющей обсуждаемых вопросов и обсуждать сроки реализаций нового функционала. Ближе к декабрю прошлого года пришло окончательное понимание, что дальше нам не по пути. Когда лидеры компании, являющиеся для тебя фигурами недосягаемыми, окунаются в мат на совещаниях, в шутки относительно родителей сотрудников, когда они лгут, фигуры эти падают в грязь и их цели с ними.

Дальше произошла череда событий, связанная с нашими конкурентами. Второй провайдер объявил о том, что они проданы и со дня на день включат скорости 10 МБит/350 рублей. Надо сказать, что нам на тот момент удалось отбить назад часть абонентов. Было даже при встрече с владельцем одного из конкурентов он отметил, что с моим приходом в компанию они заметили изменения в лучшую сторону. Так вот, по городу пошел слух о невероятных скоростях за малые деньги, моим руководством было принято решение о том, что мы включаем аналогичные тарифы (которые технически реально мы можем дать, но не даем из-за того, что в любой момент в ответ на это стоимость аренды опор поднимется с 25 рублей до 1000 за опору, помножьте на 600 и решите, о каких суммах идет речь). Тем не менее решение было принято, мы врубили новые тарифы, народ повалил к нам. Сделка с покупкой второго провайдера сорвалась (причины неизвестны), начались звонки… В-общем второй провайдер попытался предоставить ситуацию так, что утку о слиянии они не пускали, это моя выдумка, а мы нарушили договоренности. Все объявления они убрали. И лишь только местный форум, который админили не они, сохранил сообщения с их объявлениями. Свое имя перед учредителями я отстоял, но сам факт того, что мои слова ставятся под сомнение окончательно поставили точку в этой истории. Мы неоднократно разговаривали о моем будущем (что, собственно удивительно, я неоднократно видел, как расстаются с другими), рисовали перспективы покупки этого провайдера и назначения меня на руководство обоими. Весной я ушел. Привел вместо себя другого человека, и ушел. Кто-то сказал что я дурак, те кто знают кухню изнутри, поддержали. Это неважно. Мы сошлись на понижении зарплаты с 50k до 30k и моей дальнейшей работе только удаленно. С меня сняли дежурства, общение с монтажниками. В-общем все, кроме разработки.

Возможно я не все рассказал, да это и невозможно, поэтому задавайте вопросы, если информация не секретна, отвечу.

Все, что со мной происходило, все больше подталкивало к мысли об открытии собственного дела. Понимаете, в моем понимании бизнес должен строиться несколько иначе. С одной стороны ценный специалист должен приносить доход и уделять максимум внимания работе и бизнес должен оградить человека от бытовых проблем (это в пример тем, с кем приходится общаться по работе — “Вы к нам переезжайте”. Нет уж, вы мне квартиру снимите, дочке в нормальном садике место предоставьте, и тогда я смогу погрузиться в работу с головой). С другой стороны, бизнес обязательно должен эволюционировать согласно интересов сотрудников. Мы же все сталкивались с тем, что человек, нужный в этой компании уходит, просто потому, что в компании дальше расти некуда. Т.е. знания и опыт превышают необходимые задачи. Так надо развивать новые направления и держать человека, он расти должен здесь, а не отпускать его и брать кого попало. Таких примеров в моей практике — несколько десятков.

В-общем мы с товарищем долго обдумывали открытие еще одного провайдера. Это было действительно взвешенное решение. Иллюзий насчет стоимости открытия, затратной части, денежных котлет нужным людям мы не строили. В нашем случае ситуация была такова — есть частный сектор в черте города и еще больший по размеру за городом. Будучи руководителем провайдера, я прекрасно знал востребованность Интернета в частном секторе. Это будущее. Кусок, который не поделен. Все эти квартиры — чушь, они поделены, их там пилят-пилят акциями, а существенных перетяжек одеяла нет. Несколько десятков туда-сюда кочуют и все. Планы трех провайдеров известны. Какие-то взгляды на него были только у моего провайдера, но там один из учредителей наотрез отказался финансировать покрытие частного сектора, и потому уже порядка полутора лет подключений нет. В-общем предварительная оценка рынка показала, что мы не затрагиваем не чьи интересы. Была достигнута договоренность, о том, что родственник кое-какого человека вливается в учредители нашей фирмы. Зная реальную расстановку сил в городе, можно смело говорить о том, что это 100, нет даже 1000% решение всех наших возможных проблем. Не могу сказать не должность, ни имя, ни фамилию. Просто поверьте на слово. Мы получили добро, думаю здесь есть люди с подобным опытом, которые подтвердят, что сначала необходимо получить неофициальное добро на деятельность. Пошла работа. Получение 2х лицензий, тесное общение с СвязьНадзором, с магистральщиками, открытие офиса (сделали классный ремонт, хотелось чтоб человек заходя к нам, понимал, что он в современной компании находится). Нам сказали — пишите заявление на подвес кабеля, через месяц добро получите. А пока приступайте к работе. И мы приступили, раскидали листовки (несколько тысяч листовок), купили сервера (пока без цисок, но и так для начала с запасом мощностей), оптику, коммутаторы, вытянули 5 км магистраль, сварились, подключились к магистральщику. Купили Элтексовскую gpon-башку с терминалами, ftth, быстрые коннекторы, сплиттера, муфты, крюки подвесные с запасом. Ну в-общем должны были 1 июня начать работу. Все было хорошо. А потом бац. Отказ по столбам. Тот, кто должен был влиться в состав учредителей отстранился. Без объяснений. Пошла череда встреч с попыткой решить этот вопрос. Подключались погоны различных структур, криминалитет, депутаты, бизнесмены. Решить не удалось. Эту историю можно расписать более обширно, но тогда станут ясны имена людей, причастных ко всем этим событиям, а я этого не хочу. Вопрос пытались решить через областной центр, и даже через Москву. Но те, кто сказал — нет, на порядки выше тех, кто старался помочь. В одном из топиков мы общались на эту тему и мне посоветовали дать взятку Администрации. Да, это работает. Да, достигаются договоренности на прокладку кабеля еще во время строительства домов. Все так. Проходили. В этом случае вопрос не стоял, сколько мы должны отдать. Вообще. Ни о каких средствах речь на шла, просто нет. Сколько бы людей не подключалось за это время, людей, которые решают достаточно серьезные вопросы, они все оказывались бессильны. Причин такому исходу по всей видимости несколько. Первая, которую нам озвучили — все работающие сегодня провайдеры в городке видят в нас сильных конкурентов. Вроде как нам может показаться мало частного сектора и мы шагнем в квартиры, хотя таких целей нет 100% (за исключением двухэтажек, единично встречающихся в частном секторе). Более того, мы сами не рискнули бы лезть в этот распил (достаточно нервов потрепал себе), что там делить, в этих квартирах? Мы и цели-то другие ставили, интернет, далее видеонаблюдение и попытаться поработать над различными вариациями умного дома.

И вторая причина, по всей видимости, самая реальная, это учредители компании, в которой работаю я. Мы встречались дважды. Помимо того, что в свой адрес я услышал вполне реальные угрозы, нам предложили подарить фирму со всем оборудованием им. В чем наш просчет мы так и не поняли. Частный сектор как не включал никто, так и не включают. Знаю, что первый провайдер начал осваивать gpon за городом, про который я им рассказывал в тот момент, когда мы как-то по душам разговаривали, и их директор говорил какая обуза этот частный сектор. Вот так. Не знаю кому мы дорогу перешли. В-общем кабель сняли, офис закрыли, спасибо компании Элтекс, что приняли оборудование назад. Вот такой исход. ООО пока не закрыто, есть предложения строительства сети в других населенных пунктах, с их финансированием, но честно сказать — желания пока нет. Мы так до конца и не смогли понять основной причины этого провала. Один большой вывод можно сделать, и надеюсь я донес его до вас, не верьте никому. Людей, с которыми договаривались, знаю не один год, и если они обещают, то делают. Но не в этот раз. Поэтому сначала бумаги. Пока нет бумаг — не слушайте пустые обещания, не вкладывайте деньги. Вообще, в процессе открытия и общения с возможными инвесторами я понял, что такие ситуации случались с каждым, с каждым.

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

P.S. Просьба не рассуждать на тему в каком городе это происходило, иначе в черновики перенесу.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] Пишем приложения для Google Glass

Несколько дней назад я имел возможность основательно попрактиковаться в разработке приложений для Google Glass. Полученный опыт растеряется со временем, так как пока разрабатывать что-то ещё под “очки” не планирую. Чтобы поделиться пока ещё свежими впечатлениями решил написать этот топик.
Думаю, всем кто интересуется Google Glass известно, что представляет собой программная “начинка” этого гаджета. Да, это Android 4 с адаптированным launcher-ом. Да, в “очках” вполне можно запускать обычные android-приложения, установив их туда через adb. Известно вам наверняка и про Mirror API, который до недавнего времени считался единственным способом официально предоставить свой сервис пользователю Google Glass. Ниже я немного расскажу о использовании этого инструмента. Но главное, о чём хотелось бы рассказать — как писать под Google Glass полноценные android-приложения, используя пока ещё не официальный Glass Development Kit.

Итак, для начала, сделаем себе Google Glass
Если вы не попали в число избранных обладателей революционного гаджета, не отчаивайтесь. Почти настоящий Google Glass вы сможете сделать из своего android-смартфона или планшета, установив на него launcher и несколько сопутствующих apk отсюда. Вы получите полноценный интерфейс с timeline-карточками, нормально работающее распознавание голосовых команд, bluetooth, кое-как работающую камеру (удалось нормально запустить только на Nexus 7) звук и Hangouts в придачу. С навигацией как-то не сложилось, но возможно у вас получится лучше. При первом запуске launcher запросит доступ к вашему аккаунту как обычное приложение. Даём ему права и становимся почти настоящим Glass Explorer-ом. По крайней мере вы сможете себе отправлять timeline-карточки через Mirror API.

Почему Goggle даёт Mirror API только владельцам Google Glass?
Что сделает нормальный программист, получив доступ к новому инструменту? Конечно же, начнёт писать код. Затем — тестировать. А когда багов вроде бы не останется — опубликует так или иначе своё детище. Это нормально везде, только не в Google Glass. На этой платформе пользователь не переключает внимание между реальным и виртуальным миром. Google Glass в этом смысле — уникальный инструмент. Не пользующийся “очками” программист скорее всего не сможет сделать своё приложение достаточно ненавязчивым и одновременно функциональным, особенно поначалу. Пользовательский опыт Glass Explorer-а в полной мере гайдлайнами не заменяется. Вероятно для того чтобы оградить пока ещё крошечное сообщество “носителей” Google Glass от тонны неприятных и навязчивых приложений Google и “прячет” Mirror API.

Но, допустим, доступ у вас есть. Что мы можем делать с его помощью?

Публикуем и подписываемся без гарантии сроков доставки
Основная парадигма интерфейса Google Glass — это Timeline. Справа от “домашнего” экрана с часами и голосовым вводом — бесконечная лента карточек уходящих в прошлое. Все приложения, использующие Mirror API публикуют туда свои карточки в хронологическом порядке и могут подписываться на события, которые с этими карточками происходят.

События пользователь генерирует с помощью элементов меню, привязанных к карточке. Карточка может содержать как предопределённые элементы меню, например “Delete” или “Share” а также определённые приложением. Карточка может содержать вложенные карточки. Схема организации таких “пакетов” достаточно примитивна и не позволяет делать многоуровневые конструкции. Мы назначаем серии карточек один и тот же bundleId а той карточке, что должна быть “обложкой” устанавливаем isBundleCover=true. При этом меню “обложки” становится недоступным. Использовать его снова пользователь сможет только если удалит все вложенные карточки.

Карточки могут располагаться и слева от “домашнего” экрана. Это “закреплённые” карточки. Вы можете попытаться добавить такую карточку через Mirror API, установив свойство isPinned=true но у вас, скорее всего, ничего не выйдет. Mirror API всё равно свалит вашу карточку в общую ленту. Впрочем, решение есть: добавляем в опции меню с action TOGGLE_PINNED и пользователь сам, если сочтёт нужным, закрепит вашу карточку. карточки уже не будет влиять на её состояние — она так и останется закреплённой пока вы или пользователь не удалите её или пользователь не сделает ей UnPin той же опцией в меню.

Это, понятно, не всё, что вы можете делать с помощью Mirror API. Вы можете добавить пользователю “контакт” вашего приложения, давая тем самым возможность ему шарить вам фото или видео. Карточки могут включать вложения. Есть куча особенностей в формировании внешнего вида этих самых карточек. Оставлю тут только на пару полезных ресурсов, где всё это вы можете попробовать.APIs Explorer даст вам возможность тренироваться в общении с Mirror API, а playground позволит “подизайнить” карточки.

Важно же данном случае другое: вы НИКАК не сможете сделать с помощью Mirror API интерактивное приложение. Пользователь может что-то сделать в вашем “интерфейсе” но вы не можете быть уверены в том, когда это событие вам доставит Google. Вы можете что-то показать пользователю. Но вы никак не сможете предвидеть, когда пользователь получит ваше “послание”. Большинство великолепных идей приложений просто принципиально не реализуемы с помощью Mirror API. Это надо понимать. И с этим надо смириться.

Как же сделать что-то интерактивное?
И тут нам на помощь приходит Glass Development Kit. Официально он уже разрешён, хотя ещё не опубликован. Google призывает использовать обычный Android SDK. Можно и так, но не стоит забывать о весьма необычных свойствах Google Glass в плане “пользовательского ввода”. У нас нет кнопок. Нет touch-панели в привычном нам смысле. То, по чему Glass Explorer-ы “тапают” и “свайпают” понимает только жесты. OnTouch на нём поймать не получится. У нас нет возможности перехватить долгое нажатие а жест сверху вниз зарезервирован и ловится в приложении как onBackPressed. Выручают, как ни странно, сенсоры. Кивок и поворот головы для этого устройства — вполне достойная замена кнопкам. С голосовым вводом, который должен заменять всё, пока не так хорошо как хотелось бы. По крайней мере у меня пока не получилось добавлять свои команды и получать события при их распознавании. Но, возможно, я недостаточно старался и у вас получится лучше.

В общем, делается это как-то так
Находим какое-нибудь нативное приложение для Google Glass, например это. Берём оттуда glasslib.jar, который, предположительно и есть подобие того, что потом будет опубликовано как GDK. Добавляем его в свой проект и получаем возможность манипулировать timline-карточками так же, как и через Mirror API. Только есть два существенных преимущества. Никаких задержек и никаких ограничений. Если вы теперь сделаете карточке isPinned(true), то она послушно станет слева от “домашнего” экрана без всякого участия пользователя. Работаем с Timline через TimlineHelper и обязательно из сервиса. Обычная схема такая: у приложения есть только одно Activity, которое стартует Service при старте и завершается. Также не помешает подписаться на событие загрузки устройства и из BroadcastReceiver-а опять-таки поднимать наш сервис. В Service проверяем есть ли у пользователя карточка нашего приложения (для этого хорошо бы хранить её Id в SharedPreferences) удаляем старую и добавляем новую, опять же сохраняем её Id.

<code class="java">import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.preference.PreferenceManager;
import com.google.glass.location.GlassLocationManager;
import com.google.glass.timeline.TimelineHelper;
import com.google.glass.timeline.TimelineProvider;
import com.google.glass.util.SettingsSecure;
import com.google.googlex.glass.common.proto.MenuItem;
import com.google.googlex.glass.common.proto.MenuValue;
import com.google.googlex.glass.common.proto.TimelineItem;

import java.util.UUID;

public class GlassService extends Service {

    private static final String HOME_CARD = "home_card";

    @Override
    public int onStartCommand(Intent intent, int flags, int startid){
        super.onStartCommand(intent, flags, startid);
        GlassLocationManager.init(this);
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String homeCardId = preferences.getString(HOME_CARD, null);
        TimelineHelper tlHelper = new TimelineHelper();
        ContentResolver cr = getContentResolver();
        if(homeCardId != null){
            // find and delete previous home card
            TimelineItem timelineItem = tlHelper.queryTimelineItem(cr, homeCardId);
            if (timelineItem!=null && !timelineItem.getIsDeleted()) tlHelper.deleteTimelineItem(this, timelineItem);
        }
        // create new home card
        String id = UUID.randomUUID().toString();
        MenuItem delOption = MenuItem.newBuilder().setAction(MenuItem.Action.DELETE).build();
        MenuItem customOption = MenuItem.newBuilder().addValue(MenuValue.newBuilder().setDisplayName("Custom").build()).setAction(MenuItem.Action.BROADCAST).setBroadcastAction("net.multipi.TEST_ACTION").build();
        TimelineItem.Builder builder = tlHelper.createTimelineItemBuilder(this, new SettingsSecure(cr));
        TimelineItem item = builder.setId(id).setText("Hello, world!").setIsPinned(true).addMenuItem(customOption).addMenuItem(delOption).build();
        cr.insert(TimelineProvider.TIMELINE_URI, TimelineHelper.toContentValues(item));
        preferences.edit().putString(HOME_CARD, id).commit();
        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent){
        return null;
    }
}
</code>

Как видно выше, наша карточка снабжена меню из двух пунктов: Delete и Custom. И если первый обрабатывает система, послушно удаляя карточку, то второй бросит нам broadcast, который мы можем поймать и обработать.
Чтобы не останавливаться на банальном «Hello, world» я сделал небольшой проект. Можете использовать его как более расширенный материал для изучения особенностей «нативной» работы с Google Glass. Ну, и, само собой, я всегда готов ответить на вопросы.

Конечно, никто не заставляет нас использовать TimeLine в качестве интерфейса для своего приложения. Мы вполне можем поднять Activity с простенькими элементами управления, научить пользователя обходиться с ними… Для графически насыщенных приложений, например игр, это вообще будет единственным выходом. Но, что касается обычных приложений, их, по-моему, стоит выполнять в “родном” стиле для этой необычной платформы. Тогда они смогут рассчитывать на гораздо более тёплый приём у пользователей.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


«Ростелеком» начал предоставлять услуги мобильной связи в Санкт-Петербурге

С 1 августа Ростелеком начал предоставлять услуги мобильной связи в Санкт-Петербурге. Как сообщается на сайте компании, стандарт 3G обеспечивает скорость до 21Мбит/сек. Проверим.


Новые SIM-карты от Ростелеком


В офисе Ростелекома, скорости обслуживания не придается большого значения, но если спешить некуда, то 15 минут на клиента вполне нормально. Естественно, желающих было довольно много. Если я не ошибаюсь, в продаже есть SIM-карты разных размеров. Но мне не предложили, и обычные mini-SIM меня вполне устроили. Номера на выбор, но из списка все красивые номера типа 0012345 были убраны. Золотые номера по 1000 рублей, платиновые по 5000.


Рисунок на SIM-карте

К сожалению, сети не было. Аппарат подключился к мегафону.
Оказалось, в настройках я отключил 3G, когда был в отпуске. А у моего предыдущего оператора, 3G отсутствовал. А без включенного 3G в настройках, симка не активировалась. К сети Ростелекома подключился: RTK-SPB.

Качество голосовой связи хорошее, уровень сигнала у меня дома средний. Так что, пришло время проверить скорость передачи данных.
Сначала скорость была менее 1Мбит/сек, потом немного увеличилась.

С устройства скорость получения более 5Mбит/сек, передачи около 3Mбит/сек.

speedtest.net

С компьютера при использовании телефона в качестве Wi-Fi модема результат соизмерим.

speedtest.net


Зона покрытия (кликабельно)

:
Новость на сайте Ростелекома
Зона покрытия
Тарифы

PS: К Ростелекому, никакого отношения не имею, сегодня впервые стал их клиентом.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Стартап Happy Farm — Advice Wallet привлек инвестиции в размере $300 тысяч

Социальная программа лояльности Advice Wallet получила $300 тыс. инвестиций от российского венчурного фонда Imperious Group.

image

До этого украинский стартап привлек инвестиции на сумму $95 тыс. ($70 тыс. от инкубатора и $25 тыс. от ангела). Advice Wallet — финалисты конкурса лучших стартапов Европы на Login 2013 Tech Conference. Также они входят в десятку самых перспективных стартапов Украины по версии Forbes Украина. Бизнес-инкубатор Happy Farm оценивает компанию в $2,5 млн.
Advice Wallet — это социальная программа лояльности для привлечения, удержания и понимания клиентов. Программа работает так: клиенты устанавливают мобильное приложение и при каждом посещении сканируют QR-код, чтобы заработать баллы (играючи: нужно потрясти телефон, чтобы узнать их количество). В обмен на баллы заведения предлагают вознаграждения.
Клиенты вовлечены в игру — они чаще посещают любимые заведения, накапливают баллы и получают подарки; при этом следят за активностью друзей, делятся с ними своими вознаграждениями и комментариями.
Также клиенты заинтересованы в привлечении новых посетителей — своих друзей в соцсетях. Бонусные баллы положены за каждого, кто посетит заведение по рекомендации клиента.
Аудитория Advice Wallet — активные молодые люди, регулярно пользующиеся смартфонами
и соцсетями, для которых отдых и развлечения связаны с посещением различных заведений.
По словам создателей, ценность программы для заведений не только в увеличении продаж, но и возможности строить с клиентами долгосрочные отношения на основе взаимной дружбы и любви.
Для подключения к сервису и создания своей программы лояльности, заведения проходят онлайн-регистрацию. Им также доступна рассылка персональных уведомлений, посещаемости и эффективности вознаграждений, информация о клиентах и их активности. Первый месяц подключения бесплатный.
Получив инвестиции, Advice Wallet запускают программу в странах СНГ и Европы. Следующая цель — привлечь еще $4 млн. инвестиций и покорить американский рынок.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


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

Ни для кого не секрет, что за 6 лет с момента вступления в силу Федерального закона РФ «О развитии малого и среднего предпринимательства в Российской Федерации» бизнес – сообщество сделало огромный рывок вперёд, и совершило своеобразную революцию в направлении стартапов. И прежде всего это касается сегмента IT рынка, который долгое время оставался загадкой как для российского потребителя, так и для руководителей компаний. Сегодня мы можем наблюдать обратную картину, молодые российские предприниматели не только освоили рынок IT технологий и мобильных приложений, но и способны конкурировать с зарубежными компаниями. Популярность мобильных приложений, как инструмента продвижения бизнеса и как собственно базы для стратапов демонстрирует интерес со стороны крупных инвесторов к этим проектам, а так же рост количества профильных конференций и форумов разработчиков мобильных приложений. Дайджест самых ярких и успешных мероприятий в России за прошедший год мы предлагаем читателю портала Хабрахабр.


ПЕРВАЯ САНКТ-ПЕТЕРБУРГСКАЯ ПРАКТИЧЕСКАЯ КОНФЕРЕНЦИЯ И ФЕСТИВАЛЬ МОБИЛЬНЫХ РЕШЕНИЙ «TOP MOBILE 2012»
г. Санкт-Петербург, 18 ДЕКАБРЯ 2012

Специалисты отрасли обсудили новейшие тенденции в области мобильных технологий и привели примеры успешных приемов реализации мобильных стратегий. При этом наиболее дискуссионными стали вопрос мобилизации и неразрывно связанная с ним концепция BYOD (Bring Your Own Device). Кроме того, были продемонстрированы передовые достижения компаний-поставщиков мобильных услуг и разыграны призы от компаний-участников конференции.

Международная конференция Cloud & Mobility 2013
Москва, Центр «Digital October», 19 марта 2013 года

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

Третий международный форум разработчиков Apps4All
Москва, Центр «Digital October», 5 апреля 2013 года

В основе деловой программы форума были четыре дискуссионные панели, в которых приняли участие российские разработчики, эксперты, всемирно известные производители мобильных устройств и обсудили ключевые тенденции в создании и распространении мультиплатформенных приложений. В качестве спикеров выступили: Игорь Агамирзян (Генеральный директор «Российской венчурной компании»), Игорь Боровиков (Председатель совета директоров «Softline»), Михаил Вакуленко (Стратегический директор «VisionMobile») и другие.

Традиционно форум поддержали такие компании как LG, Qualcomm, Softline, VisionMobile, Google, Microsoft, а так еж авторитетные общественные организации «Опора России» и «Фонд развития венчурного инвестирования города Москвы».

SOFTWARE PEOPLE 2013
г. Москва, 11-12 АПРЕЛЯ 2013

Темой этого года стал — «Путь самурая». Во-первых, потому что приглашенным спикером являлся Эдвард Йордон, книгу которого «Death March» когда-то перевели на русский в японском стиле «Путь камикадзе», но самое главное — чтобы привести проект к успеху, принимаемые решения, как правило, требуют самурайского мужества и самоотверженности. Традиционно были представлены доклады, прошли мастер-классы и панельные дискуссии, посвященные темам разработки ПО и управления разработкой, человеческого фактора в разработке ПО, процесса, методологий и технологий, архитектуры и управления требованиями, мобильной разработки, а также UX и юзабилити ПО.

Ежегодная международная мобильная конференция #MBLT13
Москва, Digital October, 15 мая 2013

Главной темой конференции в этом году стало использование мобильных технологий в различных областях бизнеса. Цель #MBLT — предоставить актуальный взгляд на мобильные технологии, которые меняют нашу повседневную жизнь, а так же оказывают влияние на поведение и мышление потенциальных клиентов.

MOBILE APPS & TECHNOLOGY EXPO
(MATE)

г. Москва, ARTPLAY, 30-31 мая 2013

Выставка мобильных приложений и технологий (MATE) — это мероприятие, посвященное индустрии разработки и внедрения приложений для всех существующих мобильных устройств и тех, что находится в активной стадии разработки: смартфонов и коммуникаторов, карманных и планшетных ПК, GPS-навигаторов и ГЛОНАСС, автомобилей, Smart TV, приложений для Google Project Glass и т.п. Конференция призвана объединить на одной площадке как ведущих экспертов, профессионалов и разработчиков, так и энтузиастов, стремящихся углубить и расширить свои компетенции в области разработки приложений.

IX МЕЖДУНАРОДНЫЙ БИЗНЕС-ФОРУМ «МИР МОБИЛЬНОГО КОНТЕНТА
МОСО2013»

г. Москва, пл. Европы, д. 2, Гостиница Рэдиссон Славянская

4-5 июня в Москве проходил IX Международный Бизнес-форум «Мир Мобильного Контента • МоСО 2013». Мероприятие в очередной раз показало необходимость для участников рынка собираться вместе для обсуждения существующих трендов и развития индустрии в целом. За два дня форум посетило более 400 участников. На одной площадке собрались представители сотовых операторов, контент-провайдеры, правообладатели, разработчики мобильных приложений и представители бизнеса.

Конкурс стартапов IBM SmartCamp в Москве
Digital October, Россия, Москва, Берсеневская наб. 6 строение 3, 18 июня

IBM SmartCamp – международная инициатива компании IBM, направленная на расширение бизнес-экспертизы стартап-компаний, проекты которых поддерживают концепцию IBM «Разумная планета». В сферу интересов IBM SmartCamp входят ИТ-решения в области аналитики, облачных вычислений, социальных и мобильных сервисов для потребителей в таких отраслях как энергетика, банки, здравоохранение, телекоммуникации, розничная торговля, городское хозяйство. Участники IBM SmartCamp представили проекты, реализация которых предусматривает использование технических устройств (например, сенсоров, датчиков, видеокамер), сетей связи и средств аналитики. Особое внимание уделялось потенциалу развития проекта на глобальном рынке, наличие прототипа или демонстрацию предлагаемого решения.

Конференция по мобильным разработкам Geek Apps
Санкт-Петербург, Елагин остров,3 августа 2013

Geek Apps – традиционная конференция по мобильным разработкам, которая прошла в рамках Geek Picnic и послужила площадкой для обсуждения таких тем:
1) Дистрибуция мобильных приложений на примере Яндекс.Store
2) iPhone как внешняя эволюция человека
3) Почему я сделал и запустил приложение в App Store
4) Проблемы отображения rich html содержимого и реализации оффлайн-режима в мобильных приложениях
5) Игры, в которые играют люди: думы об интерфейсах
6) Процесс разработки мобильной игры

Это лишь немногие форумы и конференции, которые были отобраны нами из колоссального числа интереснейших специализированных мероприятий для IT аудитории. Завершить дайджест хотелось бы ещё одним событием, привлекших наше внимание нестандартным форматом и внушительным списком спикеров — гуру IT бизнеса. Это конференция разработчиков мобильных приложений Apps4All Summer Fest, которая состоится в Москве 17 августа. По данным организаторов более чем 300 экспертов, представителей всемирно известных производителей мобильных устройств и компаний, занимающихся развитием передовых мобильных технологий, соберутся на борту 3-х палубного теплохода «Гжель». Во время прогулки по Москве-реке участники Apps4All Summer Fest смогут обсудить достижения и актуальные проблемы мобильного рынка, поделиться секретами разработки и продвижения лучших приложений и платформ,, весело и приятно провести время в отличной компании. В рамках конференции Apps4All Summer Fest все гости получат возможность посетить секции партнёров проекта Apps4All, среди которых будут Google, Yandex, Mail.ru, Microsoft, Intel, Samsung, Huawei, а так же принять участие в дискуссионных клубах «Social Media» и «E-commerce». планируется интересные форматы connect live и розыгрыш призов от партнеров.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Создание IT-бизнеса с нуля

Меня всегда занимал вопрос, как создаются компании и организации, как образуются те центры самоорганизации, на которые осаждаются сотрудники и ресурсы из совсем даже не насыщенного «раствора» внешней среды.

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

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

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

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

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

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

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

Мне повезло наткнуться на совершенно свободную нишу, в которой у меня совершенно не было конкурентов. Заказчиков там, правда, тоже не было — чудес ведь не бывает, но со временем они начали появляться без каких-либо расходов на рекламу, холодных звонков, тендеров, откатов и прочих ужасных вещей, которыми приходится заниматься многим компаниям. Разумеется, на меня играл статус официального партнера по данному продукту (тоже далеко не бесплатный), а так же репутация одного из лучших русскоязычных экспертов по нему, которая образовалась как побочный эффект от попыток популяризировать Moodle в России. Думаю, это ключевые факторы того, что мне не пришлось «свернуть лавочку» еще много лет назад.

В какой-то момент нам удалось накопить на счету «целых 500 тысяч» и мне показалось, что пора обзавестись офисом и штатом. Мой оптимизм поубавился, когда 100 тысяч ушло на одну только офисную технику, но тем-не-менее, я нанял двух программистов и секретаршу и снял офис неподалёку от дома. Следующие полтора года были ужасающими, особенно первые 6 месяцев. Сам удивляюсь, как мне удалось избежать инфаркта. Каждый месяц мог оказаться последним, но каким-то чудом в последний момент удавалось находить деньги, чтобы заплатить зарплату, аренду и налоги.

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

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

Для исключения меня из цикла обработки заявок была внедрена CRM и внутренний форум, где инженер мог задать мне вопрос, если не знал, что ответить на заявку клиента. Со-временем это позволило разгрузить меня хотя бы от типовых вопросов и начать контролировать сроки обработки заявок. Сроки были ужасными и с этой проблемой удалось справиться только наймом ассистента, в задачи которого входило ежедневно просматривать просроченные заявки и напоминать о них исполнителю. Никакие автоматизированные списки и напоминалки не действовали, только «живое слово».

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

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

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

Как удалось выяснить опытным путём, стабильная компании возможна при достаточной ритмичности обработки заказов. Для этого месячный оборот должен быть хотя бы на порядок больше единичного заказа. Если вы выполняете единственный заказ целый год, а затем ищете следующий — ни о какой стабильности и не мечтайте: клиенты не будут ждать, пока вы освободитесь, а когда освободитесь — не сможете быстро найти новый заказ. По этой причине пришлось отказаться от участия в тендерах и заказов, требующих объемного проектирования: мы просто слишком малы, чтобы этим заниматься. Такое могут позволить себе крупные компании, а наша компания просто загнется, если я позволю себе 2 месяца заниматься только написанием проектной документации под один заказ.

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

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

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

И, напоследок, совет начинающим предпринимателям, который бы мне очень помог 8 лет назад: «Не делайте этого!»

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Перевод] Обзор важнейших фич Postgres 9.3: материализованные представления

PostgreSQL 9.3 выйдет с довольно-таки крутой фичей, называющейся материализованные представления. Фича была разработан Кевином Гриттнером и не так давно закоммичена:

commit 3bf3ab8c563699138be02f9dc305b7b77a724307
Дата: Воскресенье 4 Марта 18:23:31 2013 -0600
Автор: Кевин Гриттнер

Добавлены материализованные представления

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

Реализована минимальная функциональность, но и она может быть полезной во многих случаях. В настоящее время данные загружаются только “по требованию” инструкциями CREATE MATERIALIZED VIEW и REFRESH MATERIALIZED VIEW. Ожидается, что в будущих релизах будут добавлены инкрементальные обновления данных с различными настройками времени обновления, и будет дано более четкое определение самому понятию “свежие” данные. В какой-то момент даже запросы смогут использовать материализованные данные вместо данных самих таблиц, но это требует реализации описанного выше функционала в первую очередь.

Большая часть работы по составлению документации проделал Robert Haas. Ревью: Noah Misch, Thom Brown, Robert Haas, Marko Tiikkaja. Ревью по вопросам безопасности, включающее решение о том, как лучше реализовать sepgsql, ожидается от KaiGai Kohei.
Что такое материализованное представление? Если коротко, то это мутант таблицы и обычного представления. Представление это проекция данных с помощью заданного отношения, не имеющее хранилища. Таблица это… таблица!

Материализованное представление лежит где-то посредине – это проекция табличных данных, имеющее собственное хранилище. Оно использует запрос для получения своих данных, как представление, но данные хранятся как в обычной таблице. Материализованное представление может быть обновлено свежими данными с помощью повторного выполнения запроса, использованного на этапе его создания. Кроме того, оно может быть очищено (truncated). В последнем случае оно остается в состоянии, не допускающем сканирования. Также, так как материализованное представление имеет свое собственное полноценное хранилище, оно может использовать табличные пространства (tablespace) и свои собственные индексы. Обратите внимание, на то, что оно может быть беспротокольным (unlogged) (прим. перев.: то есть данные не пишутся в write-ahead log).

Вместе с данной фичей вводятся 4 новые SQL-команды:

CREATE MATERIALIZED VIEW
ALTER MATERIALIZED VIEW
DROP MATERIALIZED VIEW
REFRESH MATERIALIZED VIEW

CREATE, ALTER и DROP – в данном случае это привычные DDL-команды для манипулирования определением представления. Наиболее же интересна команда REFRESH (по поводу ее названия были долгие споры внутри комьюнити). Эта команда может быть использована для обновления материализованного представления свежими данными повторным запуском сканирующего запроса. Обратите внимание на то, что REFRESH также может быть использован для очистки данных (truncate), хотя и не настоящей, с помощью запуска с опцией WITH NO DATA.

Материализованные представления имеют множество преимуществ в различных ситуациях: быстрый доступ к данным, которые должны быть получены с удаленного сервера (чтение файла на сервере postgres через file_fdw, и т.д.), использование периодически обновляемых данных (система кеширования), проекция данных с ORDER BY из больших таблиц, периодическое выполнение дорогих “JOIN”-ов в фоне и т.д.

Я уже могу представить себе несколько замечательных комбинаций из процедур обновления данных и фоновых воркеров. Кто вообще сказал, что автоматическое данных в материализованных представлениях невозможно?

А теперь, давайте посмотрим как это работает:

postgres=# CREATE TABLE aa AS SELECT generate_series(1,1000000) AS a;
SELECT 1000000
postgres=# CREATE VIEW aav AS SELECT * FROM aa WHERE a <= 500000;
CREATE VIEW
postgres=# CREATE MATERIALIZED VIEW aam AS SELECT * FROM aa WHERE a <= 500000;
SELECT 500000
Размеры по каждому из отношений:

postgres=# SELECT pg_relation_size('aa') AS tab_size, pg_relation_size('aav') AS view_size, pg_relation_size('aam') AS matview_size;
tab_size | view_size | matview_size
----------+-----------+--------------
36249600 | 0 | 18137088
(1 row)
Материализованное представление использует хранилище (в данном случае, 18Мб) в объеме, необходимом для хранения данных, выбранных из родительской таблицы (размером 36Мб) во время выполнения запроса на создание представления.
Обновление полученного представления осуществляется очень легко.

postgres=# DELETE FROM aa WHERE a <= 500000;
DELETE 500000
postgres=# SELECT count(*) FROM aam;
count
— 500000
(1 row)
postgres=# REFRESH MATERIALIZED VIEW aam;
REFRESH MATERIALIZED VIEW
postgres=# SELECT count(*) FROM aam;
count
— 0
(1 row)
Изменения в родительской таблицы отразились на материализованном представлении только после выполнения команды REFRESH. Обратите внимание, что на момент написания этой статьи, REFRESH использовал эксклюзивную блокировку (эх…).
Материализованное представление может быть переведено в несканируемое состояние с помощь опции WITH NO DATA команды REFRESH.

 postgres=# REFRESH MATERIALIZED VIEW aam WITH NO DATA;
REFRESH MATERIALIZED VIEW
postgres=# SELECT count(*) FROM aam;
ERROR: materialized view "aam" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
Появилась новая системная таблица matviews, которая содержи информацию о текущем состоянии материализованных представлений.
postgres=# SELECT matviewname, isscannable FROM pg_matviews;
matviewname | isscannable
-------------+-------------
aam | f
(1 row)
Над материализованным представлением нельзя осуществлять DML-запросы, поскольку данные представления могут не соответствовать текущему значению родительской таблицы. Обычные представления же, наоборот, выполняют соответствующий им запрос каждый раз, когда это необходимо, поэтому через них возможна модификация родительских таблиц (updatable views).

postgres=# INSERT INTO aam VALUES (1);
ERROR: cannot change materialized view "aam"
postgres=# UPDATE aam SET a = 5;
ERROR: cannot change materialized view "aam"
postgres=# DELETE FROM aam;
ERROR: cannot change materialized view "aam"
 
Сейчас несколько слов об улучшении и ухудшении производительности, которое вы можете получить с использованием материализованных представлений (с учетом того, что вы можете манипулировать и их индексами). Например, можно очень легко улучшить производительность запросов на выборку в материализованных представлениях, совершенно не беспокоясь о схеме данных в родительской таблице:

postgres=# EXPLAIN ANALYZE SELECT * FROM aam WHERE a = 1;
QUERY PLAN
--------------------------------------------------------------------------------------------------
Seq Scan on aam (cost=0.00..8464.00 rows=1 width=4) (actual time=0.060..155.934 rows=1 loops=1)
Filter: (a = 1)
Rows Removed by Filter: 499999
Total runtime: 156.047 ms
(4 rows)
postgres=# CREATE INDEX aam_ind ON aam (a);
CREATE INDEX
postgres=# EXPLAIN ANALYZE SELECT * FROM aam WHERE a = 1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Index Only Scan using aam_ind on aam (cost=0.42..8.44 rows=1 width=4) (actual time=2.096..2.101 rows=1 loops=1)
Index Cond: (a = 1)
Heap Fetches: 1
Total runtime: 2.196 ms
(4 rows)
Обратите внимание на то, что индексы и ограничения (материализованные представления могут иметь constraints!) родительской таблицы не копируются в материализованные представления. Например, быстрый запрос сканирующий первичный ключ таблицы может закончиться смертельно долгим последовательным перебором, будучи запущенным на материализованном представлении.

postgres=# INSERT INTO bb VALUES (generate_series(1,100000));
INSERT 0 100000
postgres=# EXPLAIN ANALYZE SELECT * FROM bb WHERE a = 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Index Only Scan using bb_pkey on bb (cost=0.29..8.31 rows=1 width=4) (actual time=0.078..0.080 rows=1 loops=1)
Index Cond: (a = 1)
Heap Fetches: 1
Total runtime: 0.159 ms
(4 rows)
postgres=# CREATE MATERIALIZED VIEW bbm AS SELECT * FROM bb;
SELECT 100000
postgres=# EXPLAIN ANALYZE SELECT * FROM bbm WHERE a = 1;
QUERY PLAN
---------------------------------------------------------------------------------------------------
Seq Scan on bbm (cost=0.00..1776.00 rows=533 width=4) (actual time=0.144..41.873 rows=1 loops=1)
Filter: (a = 1)
Rows Removed by Filter: 99999
Total runtime: 41.935 ms
(4 rows)
Такие анти-паттерны безусловно не рекомендованы к применению на промышленных системах!
В целом, материализованные представления – замечательная фича, особенно для применения в приложениях, требующих кеширования. Наслаждайтесь!

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


MEGA выпустили собственный SDK

К сожалению, не нашел соответствующей новости на хабре и решил, что данный факт незаслуженно обошли вниманием. Приношу извинения если ошибся.
8 июля в блоге ресурса повяилась новость о запуске С++ SDK для работы с MEGA API, которое «позволит разработчикам использовать функциональность MEGA API, без необходимости внедрения тысяч строк низкоуровневого кода».
Также было сообщено о запуске партнерской программы для разработчиков, которая позволит монетизировать свой аккаунт в MEGA, посредством разработанного приложения.
Сам SDK доступен для скачивания зарегистрированным пользователям.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] «Краник», или алгоритм для поиска цифр числа Пи

Привет, Хабр! Недавно столкнулся с задачей подсчёта числа Пи до знака, номер которого будет выбирать пользователь. Сразу полез на Википедию, почитать, что за зверь такой, это Пи, и как его находить с заданной точностью. Формул, описывающих число Пи, уйма. Но для решения моей задачи всё в этих формулах упирается либо в точность и длину базовых типов языка (я выбрал Java), либо (для решения предыдущей проблемы) в длинную арифметику, которую мне реализовывать не очень-то хотелось. Хотелось найти какой-то алгоритм, позволяющий найти число Пи вплоть до заданного знака, причём ровно до этого знака, а не находить длиннющее число, а потом обрезать его, чтобы отдать пользователю то, что он просил.

И я нашёл такой алгоритм, тот самый алгоритм «краника». Слово краник звучит здесь странно, но я не нашёл лучшего способа перевести название этого алгоритма с английского, как перевести дословно. Вообще, в оригинале это звучит как «A Spigot Algorithm for the Digits of Pi». Авторами алгоритма и его нарицателями являются американские математики Стенли Рабинович (Stanley Rabinowitz) и Стен Вэгон (Stan Wagon). Создали свой алгоритм для нахождения цифр числа Пи эти два товарища в 1995 году. Сама же идея алгоритма вышла из-под пера некого Сейла (Sale) ещё в 1968 году, и предназначался тот алгоритм для нахождения цифр числа e.

Вообще, англо-русские словари дают перевод слова spigot как “втулка”. Этот перевод ясности не даёт никакой. Поэтому я перевёл это слово как «краник», так как spigot в английском языке описывается как механизм, регулирующий поток жидкости. Идея же алгоритма в том и заключается, что за одну итерацию мы получаем ровно одну цифру числа Пи и потом её не используем. То есть цифры как бы вытекают из алгоритма, как вода из крана.

Теперь сам алгоритм. Я не буду вдоваться во всю математику (чего я, собственно, и не делал, разбирая алгоритм), подробнее о нём вы можете почитать здесь. К слову, по этой ссылке, есть и реализация алгоритма для поиска 1000 цифр числа Пи на Паскале, которой я по своей лени и решил сразу же воспользоваться. Переписал на Java, ан нет — не заработало. Выводило какую-то непонятную мне белиберду. Я это дело и бросил, так как отлаживать код, которого не понимаешь, сами знаете, как тушить горящее масло водой. Поэтому решил-таки разобраться с алгоритмом самолично.
Для нахождения n знаков числа Пи, понадобится массив длиной [10 * n / 3]. Причём целых чисел. Особенность алгоритма в том, что используется только целочисленная арифметика. Инициализируем все ячейки массива числом 2.

image

Далее, чтобы найти одну цифру числа Пи, необходимо пройтись по всем ячейкам массива с конца к началу и выполнить несложные действия. На примере таблицы, рассмотрим всё по порядку. Допустим, мы хотим найти 3 цифры числа Пи. Для этого нам необходимо зарезервировать 3 * 10 / 3 = 10 ячеек целого типа. Заполняем их все числом 2. Теперь приступим к поиску первой цифры…

Начинаем с конца массива. Берём последний элемент (под номером 9, если начинать счёт с 0. Этот же номер будем называть числителем, а тот, что под ним в таблицу – знаменателем) — он равен 2. Умножаем его на 10 (2 * 10 = 20). К получившемуся числу 20 прибавляем число из ячейки «Перенос» – число, которое переносится из более правой операции. Разумеется, правее мы ничего не считали, поэтому это число равно 0. Результат записываем в «сумму». В «остаток» записываем остаток от деления суммы на знаменатель: 20 mod 19 = 1. А сейчас считаем «перенос» для следующего шага. Он будет равен результату деления суммы на знаменатель, умноженному на числитель: (20 / 19) * 9 = 9. И записываем полученное число в ячейку с «переносом», стоящую левее от текущего столбца. Проделываем те же действия с каждым элементом массива (умножить на 10, посчитать сумму, остаток и перенос на следующий шаг), пока не дойдём до элемента с номером 0. Здесь действия немного отличаются. Итак, посмотрим, что у нас в таблице. Под нулём – элемент массива, равный 2, и перенос из предыдущего шага, равный 10. Как и в предыдущих шагах, умножаем элемент массива на 10 и прибавляем к нему перенос. В сумме получили 30. А сейчас делим сумму не на знаменатель, а на 10 (!). В итоге получаем 30 / 10 = 3 + 0 (где 0 – остаток). Полученное число 3 и будет той заветной первой цифрой числа Пи. А остаток 0 записываем в отведённую ему ячейку. Для чего были остатки? Их нужно использовать в следующей итерации – чтобы найти следующую цифру числа Пи. Поэтому разумно сохранять остатки в наш изначальный массив размером 10 * n / 3. Таким образом, видно, что возможности алгоритма упираются именно в размер этого массива. Поэтому число найденных цифр ограничивается доступной памятью компьютера либо языком, на котором вы реализуете алгоритм (конечно, языковые ограничения можно обойти).

Но это не всё. Есть один нюанс. В конце каждой итерации может возникать ситуация переполнения. Т.е. в нулевом столбце в «сумме» мы получим число, большее, чем 100 (эта ситуация возникает довольно редко). Тогда следующей цифрой Пи получается 10. Странно, да? Ведь цифр в десятичной системе счисления всего от 0 до 9. В этом случае вместо 10 нужно писать 0, а предыдущую цифру увеличивать на 1 (и стоящую перед последней, если последняя равна 9, и т.д.). Таким образом, появление одной десятки, может изменить одну и больше найденных ранее цифр. Как отслеживать такие ситуации? Необходимо найденную новую цифру первоначально считать недействительной. Для этого достаточно завести одну переменную, которая будет считать количество недействительных цифр. Нашли одну цифру – увеличили количество недействительных цифр на 1. Если следующая найденная цифра не равна ни 9, ни 10, то начинаем считать найденные ранее цифры (и помеченные как недействительные) действительными, т.е. сбрасываем количество недействительных цифр в 0, а найденную новую цифру начинаем считать недействительной (т.е. можно сразу сбрасывать в 1). Если следующая найденная цифра равна 9, то увеличиваем количество недействительных цифр на 1. Если же следующая цифра 10, то увеличиваем все недействительные цифры на 1, вместо 10 записываем 0 и этот 0 считаем недействительным. Если эти ситуации не отслеживать, то будут появляться единичные неверные цифры (или больше).

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

<code class="java">public static String piSpigot(final int n) {
    // найденные цифры сразу же будем записывать в StringBuilder
    StringBuilder pi = new StringBuilder(n);
    int boxes = n * 10 / 3;	// размер массива
    int reminders[] = new int[boxes]; 
    // инициализируем масив двойками
    for (int i = 0; i < boxes; i++) {
        reminders[i] = 2;
    }
    int heldDigits = 0;    // счётчик временно недействительных цифр
    for (int i = 0; i < n; i++) {
        int carriedOver = 0;    // перенос на следующий шаг
        int sum = 0; 
        for (int j = boxes - 1; j >= 0; j--) {
            reminders[j] *= 10;
            sum = reminders[j] + carriedOver;
            int quotient = sum / (j * 2 + 1);   // результат деления суммы на знаменатель
            reminders[j] = sum % (j * 2 + 1);   // остаток от деления суммы на знаменатель
            carriedOver = quotient * j;   // j - числитель
        }
        reminders[0] = sum % 10;            
        int q = sum / 10;	// новая цифра числа Пи
        // регулировка недействительных цифр
        if (q == 9) {
            heldDigits++;
        } else if (q == 10) {
            q = 0;
            for (int k = 1; k <= heldDigits; k++) {
                int replaced = Integer.parseInt(pi.substring(i - k, i - k + 1));
                if (replaced == 9) {
                    replaced = 0;
                } else {
                    replaced++;
                }
                pi.deleteCharAt(i - k);
                pi.insert(i - k, replaced);
            }
            heldDigits = 1;
        } else {
            heldDigits = 1;
        }
        pi.append(q);	// сохраняем найденную цифру
    }
    if (pi.length() >= 2) {
        pi.insert(1, '.');	// добавляем в строчку точку после 3
    }
    return pi.toString();
}
</code>

Ради интереса провёл тест производительности алгоритма в зависимосты от величины n (количество цифр, которые нужно найти). Получился вот такой :

image

Для нахождения миллиона цифр понадобилось больше восьми с половиной часов. Тесты я проводил без печати результатов и использовал не StringBuilder, а байтовый массив.

Итак, подытожим. Главными достоинствами алгоритма являются его простота (посчитать можно без проблем и руками), а также использование только целочисленной арифметики, что ускоряет процесс вычислений и добавляет точности. Главным же недостатком я считаю ограниченность алгоритма (памятью).

http://en.wikipedia.org/wiki/Pi
http://en.wikipedia.org/wiki/Spigot_algorithm
http://www.mathpropress.com/stan/bibliography/spigot.pdf
http://www.pi314.net/eng/goutte.CL_Prefix_php

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] Серверная платформа SuperMicro SYS-5017A-EF или виртуализация на атоме (Часть 1)



Я давно являюсь поклонником энергоэффективных и компактных решений на платформе Mini-ITX и Barebone систем, на этот раз я решил перевести все домашние подсистемы на выделенный сервер. Выбор пал на новый атомный SoC процессор S1260 для серверов. Две недели ушло на поиск поставщика в Тюмени, т. к. единственный сервер на этом процессоре официально в Россию ещё не поставляется. И вот, примерно две недели назад мне пришла замечательная платформа от Supermicro на первом Atom cерверной линейки с поддержкой аппаратной виртуализации, VT-x и VT-d. Материнская плата обладает встроенным IPMI2.0 контроллером с выделенным Ethernet портом и управлением через iKVM. Сервер заказывался в следующей конфигурации:

КомпонентМодельЦена
Платформа SuperMicroSYS-5017A-EF18860 р.
Крепеж для вентилятораMCP-320-81302-0B275 р.
Шасси для жёсткого диска 2х2.5 (2 шт.)MCP-220-00044-0N275 р.
Память оперативная TranscendTS1GSK72V3H-I6000 р.
Серверный жёсткий диск Western DigitalWD20NPVT6676 р.
Серверный SSD диск OCZD2CSTK251A20-00604329 р.

Итого весь сервер обошёлся в символическую сумму 36690 деревянных. Время ожидания — 7 недель и приехала память, ещё неделя — сам сервер с потрохами. Жёсткого диска пришлось ждать ещё три недели, хотя в Тюмени он был в то же время что и сервер. Поставщики заартачились с доставкой.

Основная цель покупки домашнего сервера — перенос функционала хостинга, телефонии, файловой помойки и интернет шлюза с сетевого хранилища DS411Slim на выделенные виртуальные машины, с целью повышения производительности и последующего масштабирования (GSM шлюз для Asterisk, полноценное LVM окружение, управление ресурсами и т. д.).

Традиционно привожу фотографии распаковки (unboxing) сервера (кликабельны). Прошу извинения за качество некоторых фотографий, т. к. фотограф из меня аховый, а супруга на момент распаковки была в Сургуте.

Платформа в коробке:



Содержимое коробки: Инструкция по сборке и установке, два кабеля питания — евро и американка, стяжки и набор крепёжных болтов для серверной стойки. Рельсы не заказывались, т. к. установка сервера будет настенной. Сам корпус сервера половинной глубины (HalfDepth) и весит всего 4.5 килограмма в сборе.


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


Индикация крупным планом — индикатор сервера в стойке (включается через IPMI), индикаторы сетевой активности, жёсткого диска, питания и две кнопки — сброса и включения соответственно.


На задней панели мы видим единственный вентилятор блока питания, RS232, два порта USB3.0, три 1gE сетевых порта, один из которых зарезервирован для IPMI и DSUB видеовыход.


Сам сервер в сборе выглядит довольно компактно. Нет той мешанины воздуховодов и штабелей вентиляторов, которые мы привыкли видеть в серверах HP, охлаждение пассивное, что и следовало ожидать от процессора с TDP 8.5 ватт. И да, питание на материнскую плату заводится 20и пиновым ATX разьёмом, не 24+4 как на классических атомных платах.
На материнской плате присутствует впечатляющее количество джамперов для тонкой настройки, с помощью них можно включать и отключать такое оборудование, как например VGA контроллер. Вообще Supermicro постарались сделать платформу так, чтобы можно было снизить потребление сервера до минимума, оставив только необходимый функционал.


Все комплектующие сервера — крепёж для вентилятора, память, шасси, и SSD диск. Крепёж для вентилятора брался на всякий случай, если придётся охлаждать жёсткие диски (их всего четыре, два террабайтных диска перекочевало с сетевого хранилища).


Несмотря на марку Transcend и промышленный класс памяти я не избежал брака — ошибка работы в верхнем сегменте (стабильное зависание сервера при тесте памяти в области 6-8 гигабайта).


SSD диск от OCZ Deneva 2 позиционируемый для серверов имеет объём 60 гигабайт (именно гига, в гибибайтах он значительно меньше), выполнен по технологии Asynchronous MLC и официально обеспечивает скорость передачи данных 500 мегабайт/с. Реально показатель составляет около 480 мегабайт/с на чтение/запись, что довольно неплохо. Диск планируется использовать в качестве кэша на аппаратном контроллере с технологией HyperDUO.


Жёсткий диск для серверов от Western Digital класса Green, специально предназначен для файловых хранилищ и серверов с пассивным охлаждением. Он отличается низким уровнем шума и тепловыделением при большой ёмкости, и скорости работы, обеспечивая скорость чтения/записи 135 мегабайт/с, при объёме 2 террабайта. За такие характеристики приходится платить повышенной толщиной жёсткого диска. Из за толщины 15мм в ноутбуки такой жёсткий диск установить не представляется возможным, даже в MacBook в который влазят его террабайтные и полуторатеррабайтные собратья.


Блок питания сертифицирован согласно классу Gold Plus и обладает суммарной выходной мощностью 200 ватт. К слову переферийное оборудование может подключаться до 50и ватт, но реальное потребление платформы не превышает 16и ватт под нагрузкой при использовании жёсткого и SSD диска, согласно американским тестам.

В заключение: На текущий момент сервер проработал две недели, в ходе эксплуатации были выявлены периодичные зависания сервера под нагрузкой. Прогон тестов показал зависание на тесте памяти в области 6-8 гигабайта (заводской брак Transcend), тестирование проводилось разными версиями memtest, включая 5.0RC. В связи с заменой памяти, виртуальные машины переведены на домашний комп под управлением Core2Duo E7500, субьективно виртуалки работают тормознее чем на атоме, может быть из за используемой памяти DDR2.

Как приедет новая память — выложу результаты тестов UnixBechmark и Phoronix Test Suite на физическом и виртуальном окружении.

Любые вопросы и критика приветствуются.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Qt 5.1 и корректный deployment в Windows

Добрый день!
Для меня он вышел не очень добрым, 10 часов из жизни потрачено в поисках решения на простой вопрос, но в конечном счете я его нашел, и сейчас поделюсь с вами.
Итак, краткая предыстория.
Один мой заказчик попросил разработать kiosk-mode приложение на Qt. И для начала, сделать версию для POS-терминала с ОС Windows XP.
Ok, за неделю я что-то сверстал по приложенным макетам и попробовал отдать версию заказчику. Приложив Qt5Core.dll, Qt5Gui.dll, ну и прочие .dll используемых модулей Qt.
«Failed to load platform plugin „windows“» сказала японскаяфинская бензопила.

Ага, идем в гугл.
Во-первых, официальная документация:
qt-project.org/doc/qt-5.0/qtdoc/deployment-windows.html
Она не очень помогла, пошел читать форумы на qt-project.org. Вот предлагаемые решения:
1) скопировать /qtbase/plugins/platforms/qwindows.dll в папку приложения в каталог platforms или platform
попробовал, не работает
2) скопировать /qtbase/plugins/platforms/qwindows.dll в папку приложения в каталог plugins/platforms, plugins/platform
не работает
3) выставить переменную окружения QT_QPA_PLATFORM_PLUGIN_PATH, указать в ней путь до папки с qwindows.dll
заработало. Но: я не хочу модифицировать переменные среды при установке на компьютер пользователя. Во-первых, пользователь может удалить ее — а так как приложение падает при загрузке, проверить ее наличие я даже и не смогу без костылей. Во-вторых, пользователь может установить приложение с другой версией Qt — и привет, глюки и несовместимости.
4) решение из официальной документации. При инициализации приложения в функции main() добавить строчку вида:
<code class="cpp">qApp->addLibraryPath("C:/customPath/plugins");
</code>
qApp это наш QApplication. Не заработало.
5) использовать аргумент командной строки "-platformpluginpath \«путь_к_папке_с_qwindows.dll\»"
проверил. работает. Вуаля! Вот решение! (что оказалось неправдой)

Правим скрипт innosetup, вот так:

<code class="css">[Files]
...
Source: "..\build\deploy\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\TryumPosWin.exe"; Parameters:"-platformpluginpath \"{app}\platforms\"" ; WorkingDir: "{app}";
</code>

отдаем заказчику, радуемся.
Рано радуемся, не работает sqlite. подкладывание в plugins\sqldrivers, просто sqldrivers не помогло — не видит и не загружает, вот такой код:
<code class="cpp">    if (QSqlDatabase::isDriverAvailable("QSQLITE")){
        qDebug("QSqlite driver found.");
    } else {
        qFatal("QSqlite driver NOT found!");
    }
</code>
выпадал с ошибкой. Ни переменной среды, ни аргумента командной строки для sql плагинов я не нашел.
Вернулся к официальной документации и подумал. А собственно почему статический метод мы вызываем из экземпляра?
А раз он статический, может его можно вызвать до создания экземпляра?

Вот такой код наконец работает:
<code class="cpp">int main(int argc, char *argv[])
{
    Q_INIT_RESOURCE(resources);

    QStringList paths = QCoreApplication::libraryPaths();
    paths.append(".");
    paths.append("imageformats");
    paths.append("platforms");
    paths.append("sqldrivers");
    QCoreApplication::setLibraryPaths(paths);

    QApplication a(argc, argv);

    a.setQuitOnLastWindowClosed(false);

    QDbc::init();

    MainWindow w;
    w.showFullScreen();

    a.exec();

    QDbc::finalize();
}
</code>
Кстати, встречал еще вот такой способ задания пути:
<code class="cpp">paths.append(QCoreApplication::applicationDirPath() + "/plugins");
</code>
но он работает некорректно, так как QCoreApplication::applicationDirPath() выдает warning, если экземпляр QApplication еще не создан.

И собственно секция «Files» в InnoSetup выглядит так:

<code class="css">[Files]
Source: "..\build\deploy\icudt51.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\icuin51.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\icuuc51.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\libEGL.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\libGLESv2.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\msvcp100.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\msvcr100.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\Qt5Core.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\Qt5Gui.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\Qt5Network.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\Qt5Sql.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\Qt5Widgets.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\build\deploy\imageformats\qico.dll"; DestDir: "{app}\imageformats"; Flags: ignoreversion
Source: "..\build\deploy\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion
Source: "..\build\deploy\sqldrivers\qsqlite.dll"; DestDir: "{app}\sqldrivers"; Flags: ignoreversion
</code>

Статья не претендует на всеобъемлющее исследование, но корректного работающего решения я не нашел и поэтому решил опубликовать свое.
Спасибо за внимание!

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Вероятностные модели: борьба с циклами и вариационные приближения

В четвёртой серии цикла о графических вероятностных моделях (часть 1, часть 2, часть 3) мы продолжим разговор о том, как справляться со сложными фактор-графами. В прошлый раз мы изучили алгоритм передачи сообщений, который, правда, работает только в тех случаях, когда фактор-граф представляет собой дерево, и в каждом узле можно без проблем пересчитать распределения грубой силой. Что делать в по-настоящему интересных случаях, когда в графе есть большие содержательные циклы, мы начнём обсуждать сегодня – поговорим о паре относительно простых методов и обсудим очень мощный, но непростой в использовании инструмент – вариационные приближения.




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


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

Однако в реальной жизни далеко не все полезные вероятностные модели описываются графами-деревьями. Один такой пример мы уже рассматривали в нашем цикле статей – это модель LDA (latent Dirichlet allocation), которая очень полезна для автоматического анализа текстов (text mining) и в виде байесовской сети выглядит так:

Напомню, что модель, изображённая на этой картинке, генерирует новый документ длины N так:
  • выбрать вектор — вектор «степени выраженности» каждой темы в документе;
  • для каждого из N слов w:
    • выбрать тему по распределению ;
    • выбрать слово с вероятностями, заданными в ?.

Картинка выглядит так просто, потому что использует так называемые «плашки» (plates) – каждый прямоугольник на самом деле подразумевает несколько копий всего, что в нём изображено. Например, если полностью нарисовать фактор-граф LDA, скажем, для двух документов, в одном из которых два слова, а в другом три, уже на этом этапе получится довольно внушительная структура (чтобы не загромождать картинку окончательно, я не стал подписывать функции):


Как видите, циклов здесь много, и они происходят от того, что одни и те же параметры? и? используются многократно для получения разных наблюдений. Такая ситуация, естественно, встречается очень часто – собственно, это и есть основная постановка задач в машинном обучении: в предположении, что параметры распределения одни и те же, оценить их или предсказать последующие наблюдения. Поэтому циклы в графических моделях – не баг, а фича. И мы сейчас попробуем поговорить о том, как эту фичу реализовать. Сразу предупреждаю, что наше повествование постепенно заходит во всё более математически сложные области; уже сегодня я буду больше махать руками, чем что-то доказывать, а дальше мы уже будем переходить к конкретным примерам. Желающим изучить материал подробнее рекомендую посмотреть отличную книгу Бишопа о байесовском выводе, книгу Hastie et al. о машинном обучении, курс по графическим моделям на Coursera и другие источники – в наше время в источниках уже нет недостатка.

А мы будем потихоньку справляться с циклами. Сегодня я рассмотрю несколько методов, которые позволяют справиться с циклами в некоторых случаях, и, когда они работают, обычно удобнее и вычислительно проще их и использовать. А в другой раз мы поговорим о более общем методе, связанном с сэмплированием по Гиббсу (точнее, сэмплированием, основанным на цепях Маркова – Markov chain Monte Carlo).

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


Как мы уже знаем, он означает, что в разложении встречается


В большинстве случаев такой треугольник можно безболезненно заменить новой функцией

и цикл пропадёт:


Недостаток этого метода понятен – с ростом числа аргументов у функции вычисления, как правило растут экспоненциально (если не растут, то и задача маргинализации особой сложности не представляет, так что не надо и городить огород с графическими моделями). Поэтому справиться так можно только с маленькими циклами. А в практически важных задачах циклы как раз часто очень большие, проходящие по всему диаметру графа: посмотрите хотя бы на циклы в модели LDA, проходящие от? до? и обратно. Поэтому это «игрушечный» метод, в реальности он, как правило, неприменим – точнее, модели обычно сразу строят так, как будто бы его уже применили во всех возможных случаях.

Алгоритм передачи сообщений
Первый практически важный метод, которым можно воспользоваться, если алгоритм передачи сообщений неприменим – это, естественно, алгоритм передачи сообщений. :) Конечно, для циклов он, формально говоря, не работает – неоткуда начать, нет листьев. Поэтому здесь используют модификацию алгоритма передачи сообщений, известную как loopy belief propagation:
  • отправить из каждой вершины-переменной в каждую вершину-функцию сообщение, тождественно равное 1;
  • дальше использовать обычный алгоритм передачи сообщений.
Конечно, такое издевательство над алгоритмом передачи сообщений проходит не вполне безболезненно. Во-первых, он из точного становится приближённым; если раньше достаточно было прогнать сообщения по каждому ребру по одному разу в каждую сторону, то теперь сообщения пересылаются сразу по всем рёбрам и постепенно меняются; мы надеемся, что со временем эти сообщения перестанут меняться (сойдутся к некоторым значениям), и тогда мы возьмём эти значения как ответ.

Во-вторых, даже эта надежда не всегда оправдывается. Легко построить пример, в котором алгоритм передачи сообщений не сможет никуда сойтись – например, он может осциллировать между двумя фиксированными состояниями (оставим это как упражнение читателю, построить такой пример не очень сложно). С другой стороны, он может всё-таки сойтись, но сойтись к неправильному ответу (здесь нетривиальные примеры уже более технически сложные, давайте я дам вам слово джентльмена, что они существуют). Однако есть ряд работ, в которых даны условия, при которых loopy belief propagation сходится куда надо; эти условия часто выполняются, да и когда они не выполняются, алгоритм часто на практике работает как надо.

Отмечу здесь на будущее: loopy belief propagation выглядит очень похоже на сэмплирование по Гиббсу, которым мы займёмся в следущий раз; однако на самом деле между методами есть принципиальная разница. Главная разница заключается в том, что loopy belief propagation – детерминированный алгоритм, и если вам с ним не повезло, то ничего сделать уже не получится. А методы сэмплирования принципиально рандомизированы, и даже если один из запусков сэмплера приводит к неверным результатам, в большинстве других запусков дело, скорее всего, наладится. Но об этом позже.

Вариационные приближения
Последний метод борьбы с чрезмерно сложными моделями, о котором я хотел поговорить сегодня, – это вариационные приближения. Скорее всего, если у вас физическое или матфизическое образование, вы лучше меня понимаете, что такое вариационное приближение; но я всё равно попробую объяснить на пальцах. Суть метода такова: мы пытаемся добавить новых степеней свободы к исходной задаче и представить её в виде задачи оптимизации (по новым, искусственно введённым параметрам).

Чтобы понять, что это всё вообще значит, рассмотрим классический простейший пример – представим функцию логарифма в вариационном виде:

(это равенство легко проверить, просто взяв производную по? – проверьте!).

Теперь это семейство линейных функций, каждая из которых даёт верхнюю оценку на логарифм (иными словами, логарифм – огибающая этого семейства), и если удастся хорошо выбрать ?, то получатся хорошие оценки в интересующей нас области. Выглядит это примерно так (картинка из статьи [Jordan et al., 1999]):


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

Она не выпуклая и не вогнутая, но она лог-вогнутая, т.е.

является вогнутой функцией от x. Поэтому для g(x) можно найти линейные оценки:

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

В частности, мы получаем семейство верхних оценок:

и чем лучше мы выберем ?, тем лучше оценим. Графически это выглядит так (картинка из статьи [Jordan et al., 1999]):


При чём же здесь графические модели? А вот при чём. Напомню, что мы занимаемся решением задачи маргинализации: по данной модели и, возможно, значениям некоторых переменных найти маргинальное распределение вероятностей

где X и Y – подмножества переменных (обычно Y – маленькое подмножество, часто одна интересующая нас переменная). Пусть просуммировать совместное распределение в лоб не получается (в частности, когда мы рисуем фактор-граф, в нём получается много циклов). Если мы сможем найти вариационные оценки для совместного распределения, мы получим оценку

где? – вариационные параметры. Здесь предполагается, что мы, конечно, были не дураки и выбрали их специально так, чтобы теперь суммирование было провести легко. Тогда в результате получается функция от относительно небольшого числа переменных, Y и ?, и исходная задача маргинализации превращается в задачу минимизации этой функции по ?, что часто сделать гораздо проще.

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

Минусов здесь два: во-первых, ответ получается приближённый, т.к. даже при хорошем решении задачи оптимизации не всегда вариационные оценки так удачно касаются нужной функции, как на картинках выше, иногда остаётся зазор (т.е. класс простых распределений заметно отстоит от нужного сложного распределения). Но это не так страшно, никто и не ожидает точного решения в сложных случаях. Более важная проблема в том, что вариационные методы – это всегда «ручное» решение, их не автоматизируешь: надо найти удачную форму вариационной оценки, которая легко суммируется и которую потом можно оптимизировать. Такие формы найдены для некоторых классов моделей, но в общем для каждой серьёзной модификации научный поиск начинается заново (хотя, конечно, не с нуля).

Так, например, в разработанной схеме вариационного приближения для модели LDA, графическая модель из изображённой выше (в первом разделе статьи) превращается вот в такую (картинка из статьи [Blei, Jordan, Ng, 2003]):


Как видите, никаких циклов тут уже не осталось, и задача маргинализации получила приближённое решение, которое сводится к задаче оптимизации по вариационным параметрам? и?..

Однако для LDA есть и довольно простая схема сэмплирования по Гиббсу; разница здесь в том, что сэмплирование по Гиббсу – это в данном случае очень простой и прямолинейный метод, его легко понять и запрограммировать (точнее говоря, легко понять, как он работает, а вот почему он работает – это уже чуть более тонкий вопрос), а вариационный метод сложнее, но алгоритм получается в результате эффективнее. В результате, как правило, статьи о различных расширениях LDA делятся на два класса: если авторам удаётся найти вариационное приближение, они дают схему такого приближения и соответствующий алгоритм вывода; если не получается – ограничиваются схемой сэмплирования по Гиббсу, которая, как правило, для любых расширений получается более-менее автоматически.

В следующий раз мы продолжим знакомство с методами вывода в сложных вероятностных моделях и поговорим как раз о сэмплировании – на данный момент наиболее универсальном инструменте приближённого вывода.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[recovery mode] Jiayu G3S работа над ошибками

Внимание! Ахтунг! attention!
  • Статья не является рекламным материалом, и выражает лишь субъективное мнение автора.
  • Заранее прошу прощенье за возможные ошибки, сообщите мне о них, если таковые буду замечены.
  • Если возникнут вопросы, смело задавайте их в комментариях.

image

Производители смартфонов Поднебесной не перестают радовать покупателей современными и качественными устройствами с очень недурственным набором характеристик, и что немало важно ценной, намного ниже, чем у брендированных участников рынка, таких как Samsung, HTC, Sony,LG. Уже давно прошли времена «Ноклы», организовался «костяк» китайских брендов, качество устройств которых не вызывает или сомнений и брезгливого отторжения. К ним можно отнести такие бренды как: Zopo, JiaYu, ThL, UMI и конечно же OPPO и MEIZU.

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


Ниже приведены характеристики устройства:
  • Поддержка двух SIM (2G/GSM и 3G/WCDMA)
  • ОС Android 4.2.1 JB (есть русский)
  • Экран: 4,5 дюйма, матрица IPS, разрешение 1280 х 720 точек, защитное стекло Gorilla Glass 2, мультитач до 7 касаний
  • Четырехъядерный процессор: MTK6589 (Cortex A7 quad core, 1.2GHz)
  • Графический процессор:Imagination Power SGX544
  • Оперативная память (RAM): 1 Гб
  • Внутренняя (ROM): 4 Гб, плюс поддержка карт памяти Micro SD до 32 Гб
  • Две камеры: передняя 2 Мп и задняя 8 Мп с подсветкой и автофокусом
  • Встроенный GPS & A-GPS
  • Bluetooth with EDR & A2DP
  • Wi-Fi IEEE 802.11 b/g/n
  • Интерфейсы: micro USB 2.0, стандартный аудиовыход 3,5 мм
  • Датчики: гравитации, освещения, приближения
  • Габариты: 135 x 65 x 10,8 мм
  • Масса: 168 г
  • Аккумулятор 2750 мАч

Но и что интересно цена при таких характеристиках составляет примерно 190$(1500 Грн.,6000 руб.), что относительно недорого.

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



" Комплектация:
  • 1хСмартфон
  • 1х Аккумулятор (2750 mAh)
  • 1х USB – кабель
  • 1х Зарядно у-во (1А)
  • Макулатура (Инструкция и гарантийный талон)
  • 1х Чехол – бампер* (*не входит в официальную комплектацию, был куплен отдельно, цена примерно 5$)


Комплектацию нельзя назвать богатой, в нее включено только все необходимое, это можно смело отнести к минусам устройства, хотя часто интернет-магазины дарят покупателям разного рода подарки. Очень жаль, что в комплекте не идут наушники, но понимая какого бы качества они были, не жаль. Качество аксессуаров не вызывает нареканий. Чехол был куплен подарен магазином, очень приятное дополнение к покупке. Всего есть 4 цвета бамперов (черный, синий как у меня, коричневый, салатовый), очень высокое качество бампера, даже немного удивило, все отверстия идеально совпадают, чехол закрывает качелю громкости и кнопку включения, при этом усилие нажатие на кнопки не сильно уволилось, сел чехол с первого раз, достаточно плотно.











Отдельный абзац думаю, стоит посвятить аккумулятору (одной из причин покупки данного девайса). Он большой, реально большой и в габаритах и объеме. 2750 mAh, это вам не шутки. Полного объёма хватает на 3 дня активного использования (Интернет-серфинг 1-3 часа, 1-2 музыки, 1-2 игр, пару звонков), если сократить время сидения в интернете и не слушать музыку, то думаю, протянет все 5 дней, а может и больше. (Подсветка экрана примерно на 75%, Wi-Fi включен). Так что можно смело сказать, что заявленный объём честно реализован в данном аккумуляторе.



Дизайн и эргономика
«На вкус и цвет все фломастеры разные» (А.С.Непушкин)
Дизайн очень понравился (это вторая причина покупки). Не секрет что дизайн смартфона чем-то схож с HTC One. По определенным причинам я не хотел покупать его, кому интересна причина, могу указать ее. Не хотел покупать я даже копию HTC, не люблю подделки. А этот смартфон выглядит самобытно, и в то же время очень стильно.

Шасси корпуса выполнено из метала, как я указывал ранее. На передней панели имеются 2 вставки которые по аналогии тоже выполнены из метала, и имеют грубую но приятную душе текстуру. Экран покрыт стеклом Gorilla Glass второго поколения (и это третья причина покупки), «не те ощущения с пленкой» вынудили покупать смартфон именно с закаленным стеклом. В итоге тыл защищает чехол, фронт стекло, что немаловажным образом скажется на долговечности внешнего вида. Экран маркий, а с другой стороны, у кого он не маркий?

По габаритам устройство явно ошиблось годом, хотя в принципе, куда изволите запихнуть такую емкую батарею? Да и с другой стороны я давно являюсь фанатом кирпичной промышлености и счастливым обладателем Nokia 5230 (толщина 14,5 мм), SE Xperia X8 (толщина 15.0 мм), так что для меня он даже тонковат (всего 10,8 мм ).

К эргономике претензий нет, аппарат удобно лежит в руке, даже с чехлом, хоть экран и не маленький, пальцев одной руки вполне хватает для управления, происходящего на нем. В нижней части разместились три сенсорные кнопки с подсветкой, наверху кнопка включения и 3,5мм джек, на правом торце качеля громкости, на нижнем торце USB и микрофон, левый торец свободный как герой песни Валерия Кипелова. Лично для меня кнопка блокировки размещена не на самом удобно месте, я очень привык к тому, как она удобно реализована в Nokia 5230, внизу правого торца, к минусам я это не отнесу, потому что это чисто субъективное мнение. Вверху на металлической вставке поселились: голосовой датчик, датчики освещения и приближённости, а также световой индикатор оповещений и камера (2 Мп).
Дизайн задней части смартфона тоже не хромает, выглядит лаконично и практично. Двигаясь сверху в низ можно обнаружить: камеру (8 мегапикселей), вспышку, логотип яблоко трава, надпись с названием производителя, динамик, забегая на перед скажу, что он достаточно громкий, но разбалованный непревзойденным качеством звучания слух не позволяет поставить ему оценку выше 4 из 5. Крышка устройства сидит плотно (хотя у некоторых на этой модели бывает неравномерное защелкивание), она не очень маркая, можно сказать в меру маркая. Камера на миллиметр или выступает за пределы корпуса, но поскольку одет чехол, это не проблема.



Под крышкой находятся слоты для 2-х сим-карт и флешки micro-SD.



Аппаратная часть

Ну а теперь «самое вкусное». Аппарат построен на базе четырехъядерного процессора MTK6589, который хорошо себя зарекомендовал в других устройствах, не только китайского происхождения. Имеет 4 ядра, работающие на частоте 1.2 Ггц, с архитектурой Cortex A7.

Видеоускоритель Imagination Power SGX544, тут комментарии излишни, ведь таким же оснащён один из флагманов рынка Samsung galaxy S4, правда там таких 3 и частота их повыше, раза в 2. Но проблем в играх даже с одним видеоускорителем не возникало, идет все, точнее летит все, Asphalt, Modern combat, GTA, и др

Оперативной памяти 1 Гб, пользователю доступно 500мб. Это конечно не 2гб, но у меня ни разу не было ощущения, что памяти не хватает. На сегодняшний день 1Гб хватит с головой для 95% задач. Встроенной памяти 4 Гб, пользователю доступно 2.5 Гб. Внешнюю память можно дополнить до 32 Гб. Что интересно, без карты памяти телефон отказывается делать многое, например, фотографировать, это стоит учесть при покупке.

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



В качестве телефона JiaYu G3S может предложить поддержку двух сим-карт, одна из которых может работать с сетями 3G. Стоит учесть что телефон оснащен только одним радиомодулем. Прием сигнала хороший, проблем со связью не возникало, качество связи на высоком уроне, собеседника хорошо слышно, меня тоже. К сожалению, нет фотографий с теста Wi-Fi и GPS, но на словах, Wi-Fi поддерживает стандарты b/g/n. Через 3 бетонных стены сигнал был устойчив, скорость была высокой, насколько не знаю, но видео на YouTube в 720 грузилось быстро и не тормозило. GPS пользовался пока только раз, и то в помещении, для теста. За минуту словил 8 спутников, и продолжал искать.

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

Пару слов про экран. Тач отзывчивый, мягкий, покрытие экрана нисколько не мешает скольжению пальца по поверхности, матрица великолепна, цветопередача отличная, углы обзор очень близки к нулю. HD разрешение (320 dpi) еще больше усугубляет картину. Нареканий к ней у меня нет, лучшая матрица из всех устройств которые у меня были.







Камера

Камере думаю, стоит посвятить целый раздел (это четвертая причина покупки). Камер в JiaYu G3S две: задняя 8 Мп и портретная 2 Мп, последнюю можно использовать для общения по скайпу, качество на уровне камеры ноутбука, вполне юзабельна. С задней камерой не все так хорошо как казалось, качество на 7-8 из 10. Не могу сказать, что я ей не доволен, но в устройство такого класса можно было бы поставить что-нибудь лучше. Я хотел сделать тестовые фото на улице, но погода решила иначе, поэтому пока могу показать фото, сделанные в помещении, днем. (Как сделаю другие фото, обновлю)











Сравнение с JiaYu G3
Основные изменения по сравнению с предыдущей моделью коснулись аппаратной части. В модели S установлен более мощный четырехъядерный процессор MTK6589 взамен, старого, менее мощного двухъядерного MTK 6577, корпус-шасси из метала вместо пластика. Можно сказать, что был проведен апгрейд аппаратной части, а поскольку корпус идеален и не нуждается в усовершенствовании в остальном устройство отлично себе показало, было решено не вносить изменения в этот элемент конструкции.

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

Плюсы:
  • Объёмный аккумулятор 2750 mAh
  • HD, IPS, матрица покрытая стеклом Gorilla Glass 2
  • Мощный процессор MTK6589
  • Корпус-шасси из метала
  • Дизайн устройства
  • Цена
Минусы:
  • Бедная комплектация
  • Не лучшая камера
  • Среднее качество динамика
Итог
Если отталкиваться от соотношение цена/качество, то JiaYu G3S будет мало равных. Стильный дизайн и отличная эргономика, приправленные отличными характеристиками и ценной, делает покупку данного устройства очень оправданной. Была проведена над ошибками с моделью JiaYu G3, поэтому проблемы и косяки этого устройства почти отсутствуют, но, по сколько это «китаец», аудитория будет относиться к нему более предвзято, чем к именитым аппаратам.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] Как я писал фикс широкоэкранных разрешений для FlatOut


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



Что требуется
Для создания полноценного фикса, который легко устанавливается и не требует замены файлов игры, я использовал: IDA, Cheat Engine, Visual Studio, универсальный ASI Loader(об этом чуть ниже), а для запуска исследуемой игры в окне — D3DWindower.

Разбор ресурсов
Заглянем в папку с установленной игрой, чтобы узнать, с чем придется работать. В данном случае, интерес представляет всего лишь один файл — «flatout.exe». В некоторых играх могут присутствовать дополнительные DLL, к примеру в Max Payne для исправления пропорций изображения я делал инжект в e2mfc.dll, а не в исполняемый файл. Flatout.exe пропатчен до v1.1, но официальный патч от российского дистрибьютора — компании «БУКА», содержит три разных EXE:



Я выбрал flatout,3.exe(2 822 144 байт) для исследования, так как IDA дизассемблирует его во вполне читабельный вид.

Опыты
Открыв flatout,3.exe в IDA, первым делом начинаю искать константы. Судя по моему предыдущему опыту, большинство старых игр используют для отображения интерфейса и 3D изображения одни из этих: 640.0, 480.0, 1.3333, 0.0015625 = 1.0/640.0, 0.00208333333 = 1.0/480.0 и т.п. Первым делом вбиваю в поиск 0.0015625, так как вторые по популярности константы 640.0 и 480.0 обычно находятся неподалеку. IDA находит искомое по адресу 0x667CE4:



Теперь можно запускать игру и попробовать изменить значение по этому адресу памяти. Вот так выглядит интерфейс FlatOut в разрешении 1280х720:

  

Запускаю параллельно Cheat Engine, присоединяюсь к процессу. Кнопкой «Add address manually» добавляю в таблицу адрес 0x667CE4:



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

  

Теперь осталось найти, как исправить растягивание 3D изображения. Константу так называемого aspect ratio, 4:3 или 1.3333 я не нашел, поэтому решил попробовать поменять все числа 480 на 360. Этот метод я применял ранее в Max Payne, подумал, что он может помочь в поиске и здесь. В Cheat Engine устанавливаю следующие настройки и нажимаю «First Scan»:


 
Среди найденных адресов, добавляю в таблицу только отмеченные зелёным цветом. Зелёный цвет означает, что данные адреса принадлежат диапазону flatout.exe, а остальные нам попросту не нужны.


 
Меняю все найденные значения на 360:


 
Изображение игры пропадает, потом появляется ошибка. Опытным путём выясняю, что вылет происходит из за изменения двух адресов — FlatOut.exe+1069C3(0x5069C3) и FlatOut.exe+107CCB(0x507CCB). Перехожу по адресу 0x5069C3 в IDA, посмотреть, почему же вылетает:


 
480 здесь — смещение, а не константа, поэтому данная функция интереса не представляет, но внимание привлекает функция ниже, по адресу 0x5069D0, которая при небольшом преобразовании получает такой вид:


 
Пробую менять константы 4.0 и 3.0 на 16.0 и 9.0 соответственно:

 
C удивлением обнаруживаю что это и есть то самое aspect ratio, на разрешении 1280х720 картинка сразу обрела правильные пропорции(как было/как стало):


  
  

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

C++

Открываю Visual Studio, создаю новый проект Win32, тип приложения — библиотека DLL. В свойствах проекта устанавливаю следующие опции:
  • Конфигурация — Release
  • Набор символов — Использовать многобайтовую кодировку
  • Библиотека времени выполнения — Многопоточная (/MT)
  • Уровень предупреждений — Level1 (/W1)
  • Конечное расширение — .asi
  • Выходной каталог — E:\Games\FlatOut\FlatOut
Для работы с памятью я использую специальный класс CPatch.

Dllmain:
<code class="cpp">#include "stdafx.h"
#include "CPatch.h"

HANDLE HndThread;

int* g_Width = (int *)0x6B0D88;
int* g_Height = (int *)0x6B0D8C; 

int g_CameraAspectRatio_x = 0x5069DA;
int g_CameraAspectRatio_y = 0x5069E0;
int g_hud_stretch_x = 0x667CE4;

#define screen_width (float)*g_Width
#define screen_height (float)*g_Height


float hud_stretch_new = 0.0;

int Thread()
{
	while (!screen_width)
	{
		Sleep(0);
	}

	hud_stretch_new = 1.0/(480.0*(screen_width/screen_height));

	CPatch::SetFloat(g_CameraAspectRatio_x, screen_width);
	CPatch::SetFloat(g_CameraAspectRatio_y, screen_height);
	CPatch::SetFloat(g_hud_stretch_x, hud_stretch_new);
		
	return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
    if(reason==DLL_PROCESS_ATTACH)
    {
		HndThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&Thread,NULL,0,NULL);
    }
    return TRUE;
}
</code>

Чтобы моя ASI-библиотека загружалась вместе с игрой, нужно установить универсальный ASI Loader, скопировав dsound.dll из архива в папку с игрой. ASI — это всего лишь переименованная DLL, а dsound.dll загружает ASI в процесс любой игры, которая использует DirectSound. Возможна загрузка из подпапки scripts.

Результат
Это только первая версия плагина, и скорее всего она еще не раз обновится. Есть определенные недоработки, например главное меню. Также в случае несовместимости можно добавить поддержку других EXE, например steam-версии.


 

 

 
Скачать плагин можно с github.
Установка проста — распаковать архив в папку с игрой.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Домашний 3D-принтер окупается за 1 год


57% деталей для изготовления RepRap можно напечатать на таком же принтере

Многие не могут придумать, что конкретно они будут печатать на 3D-принтере в случае его покупки. Но уже после покупки у людей обычно такого вопроса не возникает, для принтера находится сама собой: это различные ручки, зажимы, игрушки, подставочки, корпусы, вазочки, колечки, ремешки, другие детали. Достаточно зайти на сайт MakeXYZ или Thingiverse, чтобы расширить кругозор.

По расчётам экономистов из Мичиганского технологического университета, домашний 3D-принтер обеспечивает возврат инвестиций от 40% до 200% и экономит домашнему хозяйству от $300 до $2000 в год.

Расчёт назван «экстремально консервативным» и сделан исходя из предположения, что за весь год 3D-принтер напечатал всего 20 деталей из более чем 60 000 объектов в репозитории Thingiverse (список деталей см. ниже).

Количество объектов для печати в репозитории Thingiverse как функция от времени


Учтены стоимость пластика и электроэнергии.

Затраты электроэнергии на грамм продукции


Дешевый open-source принтер вроде RepRap окупается в домашнем хозяйстве США в срок от четырёх месяцев до двух лет. RepRap — относительно простая модель, которая печатает методом послойного направления (FDM) и может использовать разные виды пластика.

Результаты расчёта показаны в таблицах. В первой таблице — характеристики печати, номер объекта в каталоге Thingiverse, время печати, количество потраченной электроэнергии и пластика.



Во второй таблице — сравнение себестоимости производства детали на 3D-принтера, включая стоимость электроэнергии и пластика, с её розничной стоимостью.



Авторы исследования ожидают бурного роста «распределённого производства товаров» с использованием технологий 3D-печати, распространения этой технологии в большинстве домашних хозяйств и переход к потреблению с учётом жизненного цикла товаров. Побочными эффектами являются рост рынка коттеджной застройки и возвращение популярности инженерной профессии, считают учёные. По их мнению, о «третьей индустриальной революции» говорить пока рано, но существенная трансформация экономических моделей неизбежна.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Landing Page: результаты эксперимента

Навеяно темами: "Создаем landing page: чек-лист для новичков" и "Landing page, которая работает".

Предыстория

Несколько лет я работаю с фабрикой мебели «Астрон», для которой веду 4 сайта (по направлениям ее производства). Основным является интернет-магазин.

С апреля по июль 2013 года продажи фабрики резко упали. Это касается не только интернет-магазина, но и представителей компании в регионах (около 140 салонов и магазинов). Мы проанализировали ситуацию, получилось, что продажи упали практически у всех мебельщиков.

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

Как показал эксперимент, мы нашли действительно эффективный способ.

Решение

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

Например, Яндекс – это и поиск, и почта и информационный портал, но воспринимают его все равно как поисковую машину. Или Mail.ru – есть и поиск и новости и еще куча других сервисов, но ассоциируется он именно с почтой.

Итог: решили обратиться к новомодным «промо-страницам», а точнее, одностраничным сайтам, которые презентуют один товар с возможностью заполнения и отправки данных из формы обратной связи или звонка по телефону.

Из всего многообразия изделий фабрики (более 1 500 возможных модулей и товаров) мы выбрали очень узкую нишу – кровати с подъемным механизмом, т.к. конкуренция в этом сегменте относительно небольшая, а спрос – вполне приличный.

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

Но мы сосредоточились на том, что пользуется популярностью больше всего по данным статистики Я.Wordstat – двуспальной кровати определенного размера. Это дало возможность показать всего один товар и одну цену, чтобы не путать покупателя.

Привлечь внимание и удержать

Вместе с дизайнерами и технологами мы определили 9 основных особенностей кровати, которые отличают ее от других подобных товаров (а так же кроватей, у которых есть выдвижные ящики).

Вот тот первоначальный суровый список:
  • Продуманный дизайн и функциональность
  • Срок поставки для кровати под матрас 1600?2000 мм — 3 дня
  • Несколько вариаций цветового исполнения
  • Кровать открывается плавно и практически без усилий благодаря немецким газовым пружинам
  • Долговечность и надежность обеспечиваются качественной импортной фурнитурой
  • Полезный объем в среднем в 1,5 раза больше по сравнению с выдвижными ящиками
  • Вертикальное открывание позволяет установить кровать в малогабаритной спальне
  • Отсутствие пыли на хранимых вещах
  • Прочный поддон кровати позволяет хранить тяжелые вещи
И 2 дополнительных момента:
  • Множество вариантов ширины кровати: 900, 1200, 1400, 1600, 1800 мм
  • Дополнительные аксессуары: комод, тумбочки, туалетный столик

После этого мы отобрали несколько фотографий, которые показывают кровать во всей ее красе (фабрика делает фото в своем собственном съемочном павильоне):



Разработав первый лайаут мы столкнулись с тем, что страница получилась скучной. Перебрав несколько десятков удачных вариантов промо-страниц известных брендов, мы сделали 3 варианта дизайна, из которых выбрали вот этот:


Суть его в том, чтобы сосредоточиться на основном – качественных фотографиях, а особенности визуально объединить в 3 блока, подкрепленных детальными фотографиями:
  • Надежность и легкость
  • Удобство хранения вещей
  • Возможность выбора из нескольких вариантов цветов и размеров

Что получилось: http://astron-mf.ru/singlepage2/

Где взять посетителей

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

Мы отобрали около 20 ключевых фраз и отсекли ненужные (например, «дешево», «недорого» и «своими руками»), а в объявлениях сосредоточились на двух основных преимуществах:
  • Срок выполнения заказа 3 дня
  • Легкость использования и надежность конструкции

Итоги

  • Срок проведения кампании – 2 недели
  • Число посетителей страницы – около 800 человек
  • Затраты – всего 6 000 рублей
  • Суммарное число звонков и заявок по электронной почте в отдел продаж – 40
  • Число покупателей – 6
  • Конверсия звонков и обращений в покупателей – 15%
  • По всем фразам, используемым в объявлении было минимум 3 захода посетителей

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

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

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

Надеюсь, эта заметка поможет не только мебельным компаниям, но и всем тем, кто занимается выведением нового товара на рынок.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Dell Latitude E6420 ATG – рамный ноутбук для понимающих

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

Герой этого поста, ноутбук Dell Latitude E6420 ATG сошел с конвейера довольно давно, прибыл ко мне без упаковки и, по всем признакам, владелец относился к нему без особого пиетета. Тем не менее, я взялся за с большим интересом. Ведь это самый настоящий ноутбук путешественника – и по задумке, и по сути. По задумке – потому что электронная начинка находится в магниевом противоударном корпусе. А по сути – потому что принадлежит ноутбук Ивану Дементиевскому, известному фотографу, путешественнику и журналисту. Вместе с Иваном этот экземпляр Dell Latitude E6420 ATG совершил восхождение на Гималаи, и после завершения экспедиции у меня была возможность осмотреть ноутбук снаружи и внутри.

image

Стоит уточнить, что Иван Дементиевский – путешественник настоящий, а не их тех, кто один раз в жизни съездил на мото-сафари вокруг египетского отеля и был напуган диким верблюдом. Нет, Иван действительно чуть ли не с рождения мотается по разным уголкам планеты, и ради хорошего кадра готов пренебречь и комфортом, и даже безопасностью. Родился он в Катманду, вместе с родителями, работавшими в министерстве иностранных дел, объехал чуть ли не полмира, и в 1989 году осел в Москве. Но тяга к путешествиям не исчезла, так что по достижению совершеннолетия он снова принялся активно перемещаться в пространстве. Сахалин, Онега, Северная Карелия, Камчатка, Таганай, Итуруп, Лагонаки, Непал, Киргизия, Испания, Армения, Таджикистан, Нагорный Карабах – вот далеко не полный список его поездок. О путешествиях Иван пишет в блоге, и всегда привозит превосходные фотографии. Они действительно очень хороши и часто публикуются в СМИ. Кстати, Дементиевский относится к относительно немногочисленной группе профессиональных фотографов Nikonианской веры, и на сайте японской компании можно прочитать интересные интервью с ним.

image

Когда речь идет о выборе ноутбука для путешественника-отпускника, особых проблем не возникает. Вес поменьше (чтобы не перегружать рюкзак), батарея помощнее (кино в самолете смотреть), жесткий диск побольше (для фотографий и видео!), остальное – по вкусу. Ивану стандартный вариант не подходил, потому что ездит он порой на не очень комфортном транспорте, сумки регулярно жестко соприкасаются с различными поверхностями, а перепады давления способны напугать даже человека с абсолютно здоровым сердцем. Так, перевал Renjo Pass, который Иван преодолел с ноутбуком Dell, находится на высоте 5375 метров над уровнем моря.

image
Типичный для Ивана способ передвижения

Наряду с прочностью от ноутбука требовалась и довольно серьезная производительность. Размер одного снимка составляет около 30 Мбайт. За одну поездку их делается по несколько тысяч. Очевидно, что основная часть обрабатывается уже дома, но кое-что хочется выложить сеть прямо во время поездки, а перед этим – как следует рассмотреть, отобрать и обработать. Так что чем мощнее процессор – тем лучше. Да и память лишней не будет.

Так давайте же посмотрим – насколько этим требованиям отвечает Latitude E6420 ATG. В том, что он действительно был полноценным спутником Ивана в поездках, у меня сомнений нет. Перед тем, как отдать его для обзора, владелец произвел зачистку содержимого дисков стандартными средствами Windows 8, но в укромных уголках все же остались данные об установленных приложениях (Иван отдает предпочтение продуктам Adobe для обработки снимков) и регулярном просмотре фильмов и прослушивании музыки («Наутилус Помпилиус» в Гималаях – отличный выбор!).

Первое, что бросается в глаза – внушительная ручка, за которую ноутбук можно носить безо всяких чехлов.

image
image

Защита содержимого обеспечивается уже упомянутым магниевым корпусом с порошковым напылением (в Dell даже запатентовали его конструкцию под маркой Tri-Metal), влагостойкой клавиатурой и специальными заглушками на всех портах. Заглушки не обеспечивают полной герметичности, и нырять с ноутбуком в прорубь все же не стоит. Однако от пыли, песка и даже падения в снег они уберегут (в официальном описании упоминается соответствие стандартам MIL-STD 810G и IP5X).

image
Так угол ноутбука выглядит с защитной заглушкой...

image
… а так без нее

Я не стал долго рассматривать ноутбук снаружи и при поддержке мастера Александра Левченко стал потихоньку разбирать его до основания. Первым делом извлекли SSD. Действительно, при всем уважении к классическим жестким дискам, в ноутбуках такого класса лучше использовать твердотельные накопители. 256 Гбайт, в принципе, достаточно даже для очень плодотворной поездки, но если вдруг станет мало – всегда можно сделать апгрейд, благо и разъемы, и гнездо абсолютно стандартные, а в BIOS нет никаких ограничений на марку и объем накопителя.

image
Рядом с SSD можно заметить разъем для док-станции. Несмотря на очевидную самодостаточность данной модели, ее можно превратить в совсем уж полноценный десктоп

Клавиатура большая, удобная, и, наряду с тачпадом, снабжена характерной «пимпочкой», за которую мы любим ноутбуки другого производителя. В данном случае она довольно полезна: в перчатках управлять ноутбуком с тачпада почти невозможно, а вот при помощи «джойстика» – вполне. Справа притаился сканер отпечатков пальца для быстрой идентификации владельца. Правда, сквозь перчатку он не работает, я проверял. А если в путешествии возникнут проблемы с освещением, можно включить подсветку клавиш и без опечаток пожаловаться на это в Twitter’е.

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

Обычно после снятия клавиатуры ты сразу оказываешься лицом к лицу с электронной начинкой. Но только не в случае с Latitude E6420 ATG: здесь нас ждет еще один слой металла. Это особенность конструкции, за которую мы с мастером стали называть ноутбук «рамным». Забегая немного вперед, скажу, что корпус весь цельный, и в нем предусмотрены ниши для различных компонентов. Этим обеспечивается дополнительная фронтальная и боковая защита каждому элементу, а удары поглощаются не отдельным фрагментом, но всем корпусом сразу.

image

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

image
Производитель системы охлаждения — компания Sunon. Судя по вскрытиями в последние пару лет, она чуть ли не монополист на этом рынке.

image
Задняя крышка снаружи...

image
… и изнутри

Объем оперативной памяти составляет 8 Гбайт. Чипы не распаяны на материнской плате, так что, при необходимости, ОЗУ можно удвоить. Впрочем, по личному опыту, 8 Гбайт для дорожного ПК вполне достаточно.

image
Обратите внимание, как много места занимает не такой уж и необходимый оптический привод. Чуть ниже мы узнаем — как можно использовать это пространство более эффективно.

Наряду с модулями Wi-Fi и Bluetooth в Latitude E6420 ATG есть модуль 3G. Правда, не разбирая его, почти невозможно догадаться о расположении слота для SIM-карты. Мои коллеги изучали ноутбук со всех сторон, приподнимали каждую заглушку – и сдавались. А слот прячется за батареей. Это, наверное, небезупречно с точки зрения эргономики, но зато симка ни за что не вывалится и контакты не забьет пылью.

image
Слот для стандартной сим-карты (справа)

image
За каждую беспроводную сущность отвечает отдельный адаптер. И это очень правильно!

Мы все ближе подбираемся к процессору, отвинчиваем какой-то болтик рядом с ним, и вдруг CPU оказывается у меня в руке. Вот это да! Неужели что-то сломали? Мастер Левченко успокаивает: все в порядке, так задумано. Оказывается, какой бы дешевой и удобной ни была пайка, от хорошего удара один из многочисленных контактов может отойти, и ноутбук перестанет работать. В классической комбинации «ножки+зажим» такое невозможно в принципе. Ноутбук можно колотить как угодно, и даже когда другие компоненты откажут, процессор сохранит работоспособность. Честно говоря, я уж думал, что о такое надежное крепление уже не применяется, ан нет – у Intel есть сокеты G2 и заменяющий его G3, куда можно воткнуть даже новые Haswell. Так что перед нами ноутбук, где можно апгрейдить процессор. Как же мне этого не хватает в ультрабуке…

image

В Latitude E6420 ATG процессор мощный (Core i7- 2640M, два ядра, штатная частота 2.8 ГГц, в режиме Turbo-Boost до 3.5 ГГц), но не очень новый. Он относится ко второму поколению Intel Core, известному по кодовому названию Sandy Bridge. Да, конечно, и третье, и особенно четвертое поколения в мобильных компьютерах работают гораздо быстрее, но мощности Sandy Bridge тоже вполне достаточно. У меня самого в большом домашнем ноутбуке стоит собрат этого CPU, и если меня что слегка раздражает в нем, так это мощность дискретного графического чипа GeForce 555, но никак не самого процессора. Кстати, в исследуемом ноутбуке стоит чип NVIDIA Quadro NVS 4200M, способный под нагрузкой разгоняться аж до 810 МГц. И память у него своя, объемом 1 Гбайт. Шина, правда, всего лишь 64-битная, но для мобильного компьютера это еще недавно было довольно мощным сочетанием. Ивану, видимо, ее хватает, а для тех, кто любит побыстрее, Dell уже выпустила модель Latitude E6430 ATG. Там все очень похоже, но процессор относится к третьему поколению Intel Core, а графический чип заменен на более холодный и чуть более быстрый NVS 5200M.

image
Как же давно мне не приходилось видеть материнскую плату с таким сокетом. А в ноутбуке — и вовсе никогда.

Latitude E6420 ATG и его наследник предназначены не только для тех, кто путешествует по велению сердца, но и для людей, не вылезающих из деловых поездок. Именно для них добавлен ридер смарт-карт. Мы сначала предположили, что это терминал для платежей с кредитных карт, оборудованных чипом, но реальность оказалась чуть прозаичнее – в Dell озаботились соответствием самым суровым стандартам корпоративной безопасности. Еще один модуль мы приняли за беспроводную зарядку, но по продуктовому номеру опознали в нем беспроводной считыватель все тех же смарт-карт и RFID-меток. Как поется в еще не написанной песне, «Первым делом, первым делом безопасность, ну а глупости – а глупости потом».

image

Диагональ экрана составляет 14 дюймов, а разрешение 1366х768 точек. По нынешним меркам вроде бы маловато, но в Dell считают иначе. Ведь даже в более новой модели E6430 ATG разрешение осталось прежним. С другой стороны, может быть четкость и не запредельная, но зато все элементы в Windows 7 и Windows 8 в режиме Рабочего стола можно хорошо разглядеть. Не стоит забывать и о том, что экран вообще не блекнет на солнце, и на ноутбуке можно комфортно работать хоть в Африке, хоть в Гималаях.

От стандартной 6-ячеечной батареи наш ветеран горных походов работает 6 часов 20 минут в режиме просмотра FullHD-видео со встроенного накопителя. Примерно столько же он продержится и в режиме обработки фотографий, что для ноутбука на Sandy Bridge очень приличный результат. Если времени автономной работы не хватает, есть два способа его увеличить. Первый – приобрести расширенную 9-ячеечную батарею, которая доведет время работы до 9 с нелишним часов. Второй – купить 3-ячеечную батарею, устанавливаемую рядом со штатной вместо оптического привода. Последний все равно не очень-то нужен, а время работы вырастает все до тех же 9 часов, и из корпуса ничего не торчит. Наконец, если автономность очень критична, можно прибегнуть к двум вариантам одновременно, и тогда Latitude E6420 ATG будет работать 12 часов, как 13-дюймовый MacBook Air нового поколения. Правда, и вес существенно перевалит за 3-килограммовую отметку (по умолчанию он равен 2.7 кг), но можно успокаивать себя синхронным ростом уровня брутальности. Кстати, если ни батарея, ни привод не нужны, в свободное место можно поставить дополнительный жесткий диск или еще пару портов USB.

image
Громкие динамики ноутбука очень хороши для русского рока.

image
Так выглядит корпус Latitude E6420 ATG. Каждому компоненту нашлось защищенное место.

image
И это не пластик, а магниевый сплав.

Итого

Я не очень люблю использовать заезженные штампы, но Dell Latitude E6420 ATG, равно как и обновленная модель, это настоящий мужской ноутбук. Его можно таскать как угодно, швырять на разные поверхности, открывать об него пиво. Можно уронить со стола. Если клавиатура запылится, можно просто промыть водичкой.

У меня язык не повернется назвать этот ноутбук универсальным. Особенно с учетом весьма сурового ценника – под 3000 долларов, из которых две трети уходят на эту самую защищенность (модель без аббревиатуры ATG в конце стоит чуть ли не втрое дешевле!). Но если регулярно оказываетесь в местах, еще не причесанных скучной цивилизацией, этот Dell будет надежным спутником.

А для Ивана Диментиевского он им уже стал. Ноутбук пробыл у меня несколько дней, и после разборки и аккуратной сборки вернулся обратно к владельцу, чтобы уехать в новое путешествие. Если верить блогу Ивана, они с Latitude E6420 ATG сейчас затерялись где-то среди карельских озер и рек.

P.S. Автор благодарит Александра Левченко (www.tech-town.ru) за помощь в подготовке фотоматериалов


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


API доступа к КЛАДР

image

Создание форм с вводом произвольного адреса часто ставит разработчиков в тупик, заставляя придумывать «костыли» и «велосипеды». Хотя, казалось бы, что сложного в создании простой и удобной формы ввода адреса?


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

Если Вы сталкивались с подобной задачей, то первое, что приходит на ум — это использовать базу КЛАДР, что мы и сделали. К слову, нам приходилось работать с КЛАДР и ранее, но задачи были проще, и мы обходились усеченной версией КЛАДРа, сохраненной в нашей базе, с простым поиском собранным «на коленке».

Мы хорошо запомнили проблемные места базы КЛАДР, например, ее прекрасную схему данных и, углубляясь в задачу с головой, выявили дополнительный ряд проблем:
  • Поиск по базе и выдача результата должны быть максимально быстрые, иначе будут заметны лаги в выпадающих списках с подсказками.
    При этом, количество населенных пунктов, улиц и других объектов достаточно велико.
  • На клиенте требуется адекватная сортировка населенных пунктов.
    Если пользователь вводит «мос», то сперва он должен увидеть Москву, затем города поменьше, потом села и деревни.
  • Показать клиенту сразу все возможные варианты по ряду запросов мы не можем, так как вариантов очень много, поэтому результаты выборок надо сужать. Но при этом нельзя допустить, чтобы при таком сужении пользователь не смог в принципе найти какой-либо населенный пункт.
  • Проблемы еженедельного обновления данных в базе.
  • Кеширование данных как на сервере, так и на клиенте.

Естественно, нам не хотелось раздувать проект функционалом, который бы решал все описанные сложности, а так же дополнительно нагружать наши сервера. Нам хотелось иметь решение, которое бы позволило забыть о проблемах КЛАДРа, легко подключать к любым нашим проектам без каких-либо дополнительных нагрузок на сервера.

Так и родилась идея сервиса «КЛАДР в облаке».

Мы взяли наши горячо любимые MongoDB и PhalconPHP, переработали базу КЛАДР, создали простой API доступа к базе, а потом долго и скрупулёзно оптимизировали базу, сервер и клиента, пока не добились быстрого ответа. После чего всё залили на Amazon EC2 и внедрили в наши проекты.

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

Доступны модули интеграции:

В плане стоит .Net провайдера и интеграция с другими .

Пример работы с jQuery плагином. Создание поля с подсказкой ввода города
<code class="javascript">$( "input" ).kladr({
        token: '51dfe5d42fb2b43e3300006e',
        key: '86a2c2a06f1b2451a87d05512cc2c3edfdf41969',
        type: $.ui.kladrObjectType.CITY
});
</code>


Пример получения списка всех населённый пунктов, название которых начинается на «Арх»
<code class="">// Инициализация api, в качестве параметров указываем токен и ключ для доступа к сервису
$api = new Kladr\Api('51dfe5d42fb2b43e3300006e', '86a2c2a06f1b2451a87d05512cc2c3edfdf41969');

// Формирование запроса
$query = new Kladr\Query();
$query->ContentName = 'Арх';
$query->ContentType = Kladr\ObjectType::City;
$query->WithParent = true;
$query->Limit = 2;

// Получение данных в виде ассоциативного массива
$arResult = $api->QueryToArray($query);
</code>


Примеры и документация.

На данный момент сервис находится в «бета-режиме», и на этот период полностью бесплатен. После завершения бета режима (по плану не позднее 1 ноября 2013) мы введем небольшую плату за пользование с приятными скидками для партнеров, сугубо для поддержки и оплаты серверов.

Немного интересной статистики.
  1. Количество населённых пунктов: 209 795
  2. Количество улиц: 981 489
  3. Самое распространённое название нас. пункта: «Новоселки», встречается 115 раз.
  4. В стране 8591 улиц, площадей, переулков и бульваров Ленина
  5. Количество строений ~ 5 000 000


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Организация сети в облаке и сетевая связность с облаком

Организация сети в облаке и сетевая связность с облаком

Здравствуйте, дорогие любители cloud computing.

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



Итак, для начала: если вы берете виртуальную машину у нас в облаке, то автоматически вам выдается внешняя маршрутизируемая сеть с маской /29. Это значит, что у вас сразу появляется не два, не три, не четыре, а целых 5 БЕЛЫХ АДРЕСОВ! Один адрес остается за нами для использования его на маршрутизаторе. А вот дальше начинается кастомизация под клиента. Это значит, что мы можем:
?
  1. выдать внешнюю маршрутизируемую сеть с б? льшим количеством адресов
  2. выдать изолированную сеть для связи между виртуальными машинами
  3. комбинировать различные варианты предоставления этих сетей
  • выдать одновременно внутреннюю и внешнюю сети
  • выдать 2 и более внешних сетей или внутренних сетей.
Все ограничивается вашей фантазией и желанием работать у нашей службы технической поддержки. Остановимся подробнее на каждом случае.

Случай 1 (легкий):
Вы приобретаете услугу по размещению в облаке своей виртуальной машины. Мы создаем пул ресурсов и выделяем вам сеть с 5 адресами. Вы настраиваете виртуальную машину в соответствии с полученными инструкциями и (ТАДАМ!) она работает (кто бы сомневался?).

image
image

Вам захотелось сэкономить и вы вместо того, чтобы взять еще одну машину для нового сайта, просто повесили алиасом еще один адрес. И (ТАДАМ!) – он тоже работает.

image

Случай 2 (еще проще, потому как мне еще не встречался):
Вы – разработчик. Причем такой разработчик, которому удобно работать в консоли VMware. Вам нужно организовать тестовый стенд, чтобы проверить очередной HelloWorld-проект. Отлично! Загружаем свои машины в облако (которое уже арендовано), подключаем их к выделенной внутренней сети, включаем и проверяем все, что хотим. Бонус: можно использовать любую адресацию внутри такого VLANа.

image

image

Случай 3 (запарный, но не сильно, т.к. требует примерно на 5 кликов мышкой больше, чем в 1 случае):
Вы пошли на поводу у «системы» и решили не выбиваться из общей массы тех, кто пользуется frontend/backend топологией. Например, у вас есть web-сервер с каким-то важным контентом и база данных, к которой этот самый сервер обращается. База данных должна быть недоступна со стороны интернета, потому как он наводнен всякими маргиналами, пытающимися эту самую базу украсть / взломать / допишите сами. Самый простой вариант защиты – оградить ее (базу, сервер баз данных) от общения с беснующимся Интернетом на 2 уровне сетевой модели OSI. И это тоже по силам нам. Мы выдаем 2 сети: богатую (целых 5 IP адресов) внешнюю сеть и безразмерную внутреннюю. WEB-сервер мы подключаем к этим двум сетям разными адаптерами (ДА, ТАКОЕ ТОЖЕ ВОЗМОЖНО!), сервер баз данных подключаем только ко внутренней сети. Получится примерно такая топология:
Организация сети в облаке: изолированный VLAN
image

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

Случай 4:
Есть у VMware продукт под названием vShield manager. Вкратце: это обычный firewall / router, реализованный в виде виртуальной машины. Помимо всего этого – его интерфейс интегрируется с vCloud и управлять настройками (правилами, маршрутизацией, IPSec и т.п. вещами) можно прямо из облака. Чем-то напоминает случай 3. Однако теперь вы сможете добавлять NAT и настраивать политики firewall под себя из графического интерфейса:

Настройка политик firewall из графического интерфейса

Случай 4a:
Этот случай очень напоминает предыдущий вариант, но в отличие от него в качестве маршрутизатора / брандмауэра используется не vShield, а другое решение (например MS TMG, Vyatta, либо специальным образом настроенный дистрибутив с opensource системой). Т.е. мы так же выделяем организации в облаке 2 сети: внутреннюю и внешнюю, и подключаем их к этому маршрутизатору.

Теперь я расскажу немного о том, как можно настроить безопасные подключения к своим облакам. Как вы уже догадались – существует 2 варианта подключения: на уровне 2 модели OSI и на уровне 3 той же модели.

Подключение на 2 уровне: вы либо тянете провод в наш ЦОД, либо арендуете VLAN у своего провайдера, который представлен в нашем ЦОДе. Мы пробрасываем этот линк в ваше облако и вуаля.

Подключение на 3 уровне осуществляется через общедоступную сеть Интернет при помощи туннелирования. Это самый простой способ. Реализуется он также на базе vShield, либо любого другого специализированного дистрибутива. vShiled предоставляет только IPSec туннели. Ниже пример действующего туннеля одного из наших клиентов:
image

Теперь вы знаете, как работают сети в облаке ИТ-ГРАД; как подключиться к своему облаку и что для этого нужно. Если вы реально заинтересованы – задавайте свои вопросы, я постараюсь помочь.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Мобильная типографика



При разработке дизайна необходимо учитывать корректность его отображения не только на больших экранах, но и на мобильных устройствах. И в первую очередь это касается читаемости контента. Поэтому необходимо уделять особенное внимание типографике, которая является основой веб-дизайна. На эту тему есть полезная статья шестилетней давности — Web Design is 95% Typography (автор Oliver Reichenstein).

Для начала рассмотрим основные моменты веб-типографики с примерами на мобильных устройствах.

Размер

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

В целом, размер шрифта на страницах может полностью менять внешний вид и привлекательность сайта. Modular Scale Calculator — калькулятор от Тима Брауна (Tim Brown), который поможет подобрать размеры шрифтов для сайта, в том числе в «золотой пропорции» (1:1.618).

Пример сайта с соотношением размеров шрифтов 16/24/72:


Контраст

Любой текст на сайте должен контрастировать с фоном, как при просмотре на десктопе, так и на мобильном устройстве. Этим, вроде бы простым и очевидным, правилом часто пренебрегают, поэтому случается видеть красный текст на фиолетовом фоне или желтый на голубом.

Кстати, есть даже сервис, который проверяет контрастность цветов на сайте — checkmycolours.com. Ниже представлены несколько сайтов с хорошим контрастом контента.





Отступы

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





Выбор шрифта

Выбрать шрифты, которые будут корректно отображаться на любом устройстве и любой ОС, — задача не простая. Очень важно учитывать, как шрифт будет рендериться на различных девайсах, например:



Эту проблему помогут решить специальные веб-: Web Font Specimen, Typecast app и Typekit’s font browser. Иногда целесообразно использовать разные шрифты для разных размеров экранов. Такое практикует, например, сайт A List Apart.

Кроме того, не стоит использовать нестандартные шрифты в неподходящих местах. Вот так, например, выглядит League Script, читать невозможно:



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

Изменение размера шрифта

На большинстве сайтов используются px или em для того, чтобы задать размер шрифта. Em предпочтительнее, потому что позволяет пользователю менять размер шрифта в браузере. Но есть и недостаток — размер в em зависит от font-size родительского элемента. Поэтому лучше использовать rem: размер шрифта будет зависеть от корневого элемента — html:

<code class="css">html { font-size: 62.5%; } 
body { font-size: 1.4rem; } /* =14px */
h1   { font-size: 2.4rem; } /* =24px */
</code>
Пример с media queries:

<code class="css">@media (max-width: 640px) { body {font-size:1.2rem;} } 
@media (min-width: 640px) { body {font-size:1rem;} } 
@media (min-width:960px) { body {font-size:1.2rem;} } 
@media (min-width:1100px) { body {font-size:1.5rem;} } 
</code>

Отступы и длина строк

Согласно исследованию Baymard Institute, оптимальная длина строки для удобного чтения — от 50 до 75 символов. Непросто добиться автоматического соответствия этому правилу на любом устройстве. Например, размер шрифта девайса по-умолчанию — 16 px, а мы хотим использовать 20 px. Получается, что наш шрифт должен быть размером 1.25 rem. Блок текста делаем шириной 675 px, тогда в строке будет помещаться 60 символов:

<code class="css">@media (min-width: 950px) { .container {width:675px;} } 
</code>
Таким образом можно прописать контейнеры для экранов с любыми размерами. Для лучшей читаемости на больших экранах можно еще разместить контент в две колонки:

<code class="css">@media (min-width:1140px) { .content { -webkit-column-count: 2; -webkit-column-gap: 1em; -moz-column-count: 2; -moz-column-gap: 1em; column-count: 2; column-gap: 1em; } } 
</code>
При ширине более 1140 пикселей текст будет разбит на два столбца.

Хорошие примеры мобильной типографики










Полезно почитать


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Швейцарские учёные разработали искусственный фасеточный глаз

Фасеточные глаза, состоящие из множества узких светочувствительных конусов, называемых омматидиями, характерны для насекомых и ракообразных. Хотя они имеют меньшее разрешение, чем глаза позвоночных, у них есть ряд преимуществ — они менее инерционны (некоторые насекомые способны воспринимать мелькания с частотой до 300 Гц ), не требуют фокусировки и могут различать не только цвет, но и направление поляризации света. Команда учёных из Федеральной политехнической школы Лозанны (EPFL) создала прототип искусственного фасеточного глаза, который использует преимущества такой конструкции.



Искусственный глаз, который учёные назвали CurvACE (CURVed Artificial Compound Eyes), состоит из 630 «омматидиев», каждый из которых представляет собой светочувствительный элемент и микролинзу, фокусирующую на него узкий пучок света. Глаз имеет угол обзора 60 градусов в вертикальной и 180 — в горизонтальной плоскости. По вертикали углы зрения разных омматидиев заданы формой микролинз, а по горизонтали — изгибом подложки, на которой расположен глаз. Такая форма продиктована технологией изготовления — светочувствительные элементы формируются на твёрдом кристалле, который затем разрезается на узкие полоски.



Глаз имеет объём всего 2,2 кубических сантиметра и весит 1,75 грамма. При промышленном производстве современный уровень техники позволит уменьшить его размеры как минимум вдвое. Основное назначение глаза — системы визуальной навигации для роботов. Глаз обладает высокой чувствительностью и динамическим диапазоном — каждый омматидий может индивидуально приспосабливаться к уровню освещённости. Такой глаз нельзя ослепить солнечным бликом. В сочетании с высоким быстродействием (прототип может выдавать до 1500 кадров в секунду), малыми размерами, отсутствием искажений по краям поля зрения и возможностью относительно просто добиться кругового или даже сферического обзора это делает его идеальным инструментом для определения положения робота в пространстве, детектирования препятствий и предотвращения столкновений.


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

Собственно электронная начинка и составляет большую часть массы и объема глаза — сам массив CMOS-сенсоров с микролинзами имеет толщину 1 мм и весит 0,36 грамма. Возможность придавать фасеточной камере любую форму и отсутствие больших линз открывают множество возможностей: такие «глаза» можно встраивать в стены помещений, в одежду или мебель для использования в системах умного дома или видеонаблюдения. Комбинируя омматидии разного типа в одном сенсоре, можно создать камеру, которая будет видеть одновременно в разных диапазонах.

Разработка CurvACE ведется с 2009 года. Общий бюджет проекта — 2,73 миллиона евро. Статья с подробным описанием проекта доступна по этой ссылке.


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Как ускорить сборку 1000 VisualStudio C++ проектов

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

До изменений:
Полная сборка (clean) занимала около 4.5 часов
Инкрементальная сборка (continuous) занимала около 30 минут.
После изменений:
Полная сборка — около 40 минут.
Инкрементальная сборка — 2-3 минуты


Входные данные:
Железо (dedicated builder machine): Intel Xeon E5430@2.66Hz, 4 GB RAM
Среда разработки: Windows XP, 2003, 7, 2008. VisualStudio 6, 2005, 2008, 2012.
Сборка включает в себя около 1000 C++ проектов: ~3MLN LOC

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

Что было поменяно:
  • Замена дисков на SSD (до этого были неплохие HDD диски от WD)
  • Интеграция IncrediBuild в сборочный скрипт. Incredibuild мы установили на 4 компа. (тривиальное изменение, если у вас уже есть сборочный скрипт)
  • Компиляция одного огромного solution с прописанными зависимостями. Solution генерируется автоматически на основании списка проектов и файла зависимостей для каждого проекта
  • Еще одно существенное ускорение процесса сборки, хотя и не имеющее отношение к скорости компиляции, нам дал перехед на svn 7 (только client). Особенно сильно это сказывается на инкр. сборке, когда надо сделать update огромной working copy. С svn 7, время упало с 10 минут до 1 минуты.
Сразу замечу, что, к сожалению, я не могу описать точный эффект от каждого изменения, так как все было поменяно за один раз.
По-ощущениям, каждое изменение ускорило сборку в 2-3 раза.

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

Надеюсь, что кому-нибудь наш опыт может показаться полезным.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Интернет-пираты превращают маленьких детей в коррупционеров


Кликабельно

— Эвоно как!.. — подумал Петрович и попытался выстроить логическую цепочку превращений. Идею с укусами он отмел сразу, как антинаучную.

— Иинтернет-пираты приучают детей к воровству, а потом из них вырастают коррупционеры.
— Коррупционеры вызывают неприязнь у взрослых, а потом из этих взрослых них вырастают оппозиционеры.
— Оппозиционеры объясняют людям кто в действительности является вором и как в наше время присваиваются звания деятелям культуры.
— Деятели культуры клеймят интернет-пиратов...

©

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

— Что-то здесь не так… не договаривают они чего-то…

Поискав глазами Большую Советскую Энциклопедию Петрович нашел нужную полку и открыл массивную стеклянную дверь самого правого книжного шкафа. За БСА стройным рядом, по росту, стояли всевозможные словари.

Было уже 9 вечера, двор и детскую площадку Петрович подмел еще в 7, чтобы возвращающихся с работы граждан встречала перед домом успокаивающая чистота. Поэтому до 4 утра он мог позволить себе читать и думать. В этом возрасте бессонница уже основательно давала о себе знать.

Петрович начал перебирать словари по порядку.

Толковый словарь Ушакова. Д.Н. Ушаков. 1935-1940.
ПИРА? Т, пирата, муж. (греч. peirates). Морской разбойник.

— Ммм… не то…

Толковый словарь Даля. В.И. Даль. 1863-1866.
ПИРАТ, муж., греч. морской разбойник; корсар иногда означает то же, но это и морской партизан, грабящий только неприятеля.

— Хм… тоже не совсем то. Ну да, в 66м году этого и не могло быть…

Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949-1992.
ПИРА? Т, -а, муж. Морской разбойник, а также (перен.) вообще разбойник, грабитель. Средневековые пираты. Нападение пиратов на прогулочный катер. Воздушные пираты (об угонщиках самолётов). Пираты видеорынка (лица, незаконно тиражирующие и распространяющие видеокассеты с записями).

— О! Похоже…

Большой толковый словарь русского языка. — 1-е изд-е: СПб.: Норинт. С. А. Кузнецов. 1998.
ПИРА? Т -а; м. [греч. peirates — грабитель, разбойник]
1. Морской разбойник. Корабль пиратов. Флаг пиратов. Требования пиратов.
2. (с опр.). О том, кто ведёт себя подобно пирату; разбойник, грабитель. Воздушные пираты (об вооруженных угонщиках самолётов).
3. Тот, кто извлекает прибыль, незаконно используя чужую интеллектуальную собственность (в издательском деле, компьютерных программах и т.п.).
? Пира? тский, -ая, -ое. П. флаг. П-ое судно. П. набег. П-ое нападение. П-ие действия, поступки. П-ая копия видеофильма (сделанная для нелегальной продажи). По-пира? тски, нареч.

— Вот!… тот, кто извлекает прибыть! Так… во всех четырех случаях первым определением указывают разбойника. Посмотрим, что же такое разбойник. — тихо бормотал себе под нос Петрович.

Он взял с полки еще несколько словарей и с книгами подмышкой переместился в мягкое удобное кресло. На столике рядом стоял уже остывший чай в стакане с резным подстаканником. Петрович любил старую посуду. Этот чайный стакан помнил еще бабушку Петровича, а ему самому напоминал о шальном деревенском детстве, без телевизоров, интеренетов и поначалу даже без радио. Тогда почитать «свежею» газету месячной давности было у мужиков неким ритуалом у завалинки, преисполненным достоинства, а ребятишки облепляли это групповое «достоинство» и жадно слушали, что происходит в большом мире, в столице и на окраинах, и пытались разглядеть в черных закорючках на желтоватой хрупкой бумаге произносимые фамилии и названия. Читать, как правило, ребята учились очень рано. Быть необразованным было перед сверстниками стыдно, таких могли обидно дразнить или даже наподдать или не взять за брусникой за Дальний Холм.
Но Петрович был слишком поглощен своим исследованием и совсем забыл про чай.

Большой толковый словарь русского языка. — 1-е изд-е: СПб.: Норинт. С. А. Кузнецов. 1998.
РАЗБО? ЙНИК -а; м.
1. Тот, кто занимается разбоем, грабежом. Р. с большой дороги (также: отъявленный негодяй).
2. Разг. О том, кто совершает насилие, грубо притесняет, вымогает и т.п. Фашистские разбойники. / Употр. как бранное слово. Разбойники пера (о продажных, беспринципных журналистах, писателях).
3. (обычно в обращении, иногда ласк.). Сорванец, сорви-голова, негодник Ах, р., что же ты наделал!
? Разбо? йница, -ы; ж. Разбо? йничий, -ья, -ье. Р. притон. Р. атаман. Р-ья шайка. Р-ье лицо (как у разбойника). Разбо? йнический, -ая, -ое. (1-2 зн.). Р-ие приёмы. Р-ое нападение.

— Странно… только «вымогает».

Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000.
разбо? йник
I м.
1.
Тот, кто занимается разбоем [разбой 1.].
2. перен.
Тот, кто совершает насилие, грубо притесняет, обманывает.
II м.
1. разг.
Сорванец, шалун, баловник (о мальчике).
2.
Употребляется как порицающее слово.

— О-б-м-а-н-ы-в-а-е-т.

Толковый словарь русского языка Дмитриева. Д. В. Дмитриев. 2003.
разбо? йник
сущ., м., употр. сравн. часто
Морфология: (нет) кого? разбо? йника, кому? разбо? йнику, (вижу) кого? разбо? йника, кем? разбо? йником, о ком? о разбо? йнике; мн. кто? разбо? йники, (нет) кого? разбо? йников, кому? разбо? йникам, (вижу) кого? разбо? йников, кем? разбо? йниками, о ком? о разбо? йниках; сущ., ж. разбо? йница
1. Разбойником называют того, кто добывает деньги, материальные ценности грабежом.
Разбойник с большой дороги. | Морской разбойник. | На кого-либо напали разбойники.
2. Разбойником в шутку, в сердцах называют того, кто совершает, совершил дурной поступок.
Ах, разбойник, что же ты наделал! | Вот разбойник! Как напьётся, так и пошёл крошить всё, что ни попало.
• разбо? йнический прил.
Разбойническое нападение.
• разбо? йничий прил.
Разбойничья шайка. | Разбойничье лицо.

— А-га. Разбойником называют того, кто добывает деньги, материальные ценности грабежом.… Добывает деньги и ценности…

Малый академический словарь русского языка
разбойник
-а, м.
1.
Тот, кто промышляет разбоем, грабежом.
— Тут, где-то на этом кряже ---, когда-то во время оно разбойники напали на караван с золотом. Чехов, Счастье.
От бабушки я знал много сказок о разбойниках, которые грабили богатеев, раздавали деньги бедноте. Арамилев, В лесах Урала.
|| перен.
Тот, кто причиняет физический и материальный ущерб кому-л.; насильник, угнетатель.
— Пока ты не станешь для рабочих добросовестным хозяином, а не разбойником, — прости за резкость, — я не с тобой, а против тебя. Шишков, Угрюм-река.
Разразилась война — нужно было стать рядовым бойцом на фронте литературы в напряженные дни великой борьбы с фашистскими разбойниками. Гладков, Повесть о детстве.
2. Разг.
Употребляется как бранное слово.
Тут только увидел герой наш, что Петрушка был, как говорится, мертвецки пьян и едва на ногах держался. — Бездельник ты этакой! — закричал господин Голядкин. — Разбойник ты этакой! Достоевский, Двойник.
3. Разг. шутл.
Сорванец, сорвиголова.
— И скажи, пожалуйста, весь класс из разбойников состоял, из сорвиголов, но, понимаешь ты, великодушны были! Чехов, Накануне поста.

— Эвоно как.… грабили богатеев и раздавали деньги бедноте… Хм…

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

— Как же так получается? — думал Петрович. — Ведь в книгах уже давно все написано. Ведь нужно просто взять с полки и прочитать.

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

Но и без компьютера Петрович прекрасно понимал, что пират ворует в первую и основную очередь ради своей собственной наживы. А того, кто крадет ради безвозмездной передачи награбленного неимущим, согласно прочитанным Петровичем книгам, еще со времен короля Ричерда называли не иначе как Робин Гудом. А Робин Гуд хоть и был разбойником, но был благородным разбойником, он был героем.

Петрович задумался. — А что такого ценного в том, что ворует и передает другим интернет-пират?

Получалось, что единственная ценность, это информация, знания. Будь то аудио или текстовая книга, фильм или музыкальный альбом, в любом случае, человек, ставший обладателем этой информации станет чуточку умнее от прочитанного, увиденного или услышанного.
А кто же выигрывает на этом процессе? Кто обогащается? Только сам народ. Народ обогащается духовно! Материальной наживы здесь нет ни у кого!

Петрович откинулся на спинку кресла. Ему стало неуютно и зябко от сделанных им же самим выводов. Но здравый смысл был неумолим. Петрович вспомнил, что еще задолго до начала развития интернета рынки, переходы и просто тротуары настолько заполнились лоточниками с видео-кассетами, а потом и с DVD-дисками, что просто плюнуть было не куда. А ведь это все был контрафакт!
И где они сейчас! Где они, те, кто реально наживали свое богатство за счет продажи нелегальной продукции — настоящие пираты, разбойники?! Нет их! Их бизнес стал нерентабельным. А все почему? А потому, что нет никакого смысла платить за контрафактный диск, когда можно загрузить в интернете тот же фильм, альбом или книгу.

— Мда… — подумал Петрович. — А как же быть с бесплатной загрузкой? Вроде и хорошо, вроде информация, делающая человека умнее, лучше, совершеннее и должна распространяться свободно. И государство вроде как должно быть заинтересовано в высоком IQ своего народа. А с другой стороны вроде как и производителю информации надо заплатить, ведь он же старался, писал, сочинял. Хотя, внук вроде говорил, что за интернет-трафик приходится платить в любом случае, независимо от того, легальный это контент или нет.
… Замкнутый круг.

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

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

Петрович хмыкнул и взял стакан с чаем.
— Хм… Нужно заварить новый. — и Петрович не спеша побрел на кухню, тихо шаркая благородной старостью.
Скоро ему идти на работу, чтобы невыспавшихся и хмурых граждан, перед еще одним тяжелым рабочим днем, встретила у подъезда успокаивающая чистота.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


ORANGEMAN: новости о раздаче серверов. Развитие инициативы

Привет!

Инициатива по раздаче оборудования Orangeman развивается дальше. И Оранжмен уже далеко не одна компания и не один человек. И инициатива уже не просто наша, а НАША в очень широком смысле. Наша, т.е. общая, открытая и доступная всем вам.

image

С публикации предыдущего поста прошло две недели. За это время случилось столько всего, что даже не верится. Не может быть, что все это происходит с нами прямо сейчас!

Если коротко, то раздача мега-серверов СКБ Контур успешно завершилась (и у нас даже есть фото!), наши сообщества в вконтакте и фейсбуке заработали на полную мощность, закончилась сборная раздача оборудования от Энтузиастов с большой буквы, появился сайт инициативы, о наших идеях написали самые разные сми, а сегодня мы при поддержке компании Лол из Хабаровска запускаем следующую раздачу серверов!

Интересно? Читайте дальше :)



От многих ко многим.

image
Первая раздача серверов была единичной акцией в формате от одного к многим, когда Русоникс передал серверы другим людям и организациям. Естественно, у нас просто не хватило бы ресурсов делать это постоянно от своего имени. И момент превращения Оранжевого чувака в Orangeman был для нас очень пугающим и сложным.

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

Сначала к нам присоединился СКБ Контур из Екатеринбурга с невероятными по размерам и мощности серверами. Потом среди множества написавших нам людей, нашлось четверо смелых. Эти люди, настоящие оранжмены, решили отдать свое собственное старое оборудование. А сегодня у нас состоится новая раздача от компании Лол из Хабаровска.

Мы движемся дальше и надеемся, что к нам присоединятся другие компании и энтузиасты для продолжения раздач. Как говорится, keep the ball rolling. Нам нельзя останавливаться.

Поделитесь идеями Orangeman с друзьями и знакомыми! Прямые контакты с людьми, отвечающими за железо в самых разных компаниях нам очень пригодятся!

Итоги раздачи серверов СКБ Контур.

image

СКБ Контур — федеральный разработчик программного обеспечения с 1988 года. В компании работает больше 2000 специалистов, которые умеют находить практичные решения самых сложных задач.

Головной офис компании находится в Екатеринбурге, а серверы, которые парни из Контура решили раздать, были размещены в московском дата-центре.

Заявки на получение серверов мы принимали на страницах в сообществах: пост в ВК, пост в ФБ.

В результате отбора заявок, были определены новые хозяева железок:

1. РХТУ им. Менделеева
Шасси с блейд-серверами: HP BladeSystem c7000 Enclosure (16 x Сервер ProLiant BL460с Xeon E5345 QuadlCore)

image

Многие спрашивают: «По каким критериям принимается решение о передаче оборудования?» Ответ прост: получателя выбирает тот, кто отдает. Кому как не хозяину железа, лучше знать, для чего оно может быть использовано?

А вот и мнение специалистов СКБ Контур:

Павел Зимарев, руководитель службы поддержки серверов: "Выбор победителей был обусловлен несколькими факторами: «Во-первых, проект должен быть общественно полезен. Поэтому выбрана заявка Российского химико-технического университета имени Менделеева. Во-вторых, СКБ Контур давно помогает вузам, например, спонсирует чемпионаты по программированию. Передача blade-сервера – это еще один способ показать, что исследовательская в вузах – это важное и полезное дело. И конечно, сервер должен выполнять адекватную своей мощи работу, а сложные математические вычисления – это как раз то, что нужно».

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

2. Кадастровая палата Московской области
Сервер HP rx8640, 16core HP Bundle Montecito 1.6GHz/18MB (Itanium), 128GB RAM

image

Что касается сервера на процессорах Itanium, то тут выбрать было проще. «Это особый сервер в плане архитектуры и габаритов. Новый обладатель должен понимать, как с ним обращаться. Нельзя не поощрить желание Кадастровой палаты Московской области иметь резервный сервер».

Сборная раздача оборудования от энтузиастов

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

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

1. Владимир Чернюк из Киева, Украина. Отдал компьютер.
image

2. Дмитрий Яковлев, Красногорск, Московская область. Отдал компьютер.
image

3. Константин Ерохин, Москва. Отдал коммутатор Cisco 2900XL и сервер HP RX162.
image

image

4. Антон Галкин, Москва. Отдал сервер IBM eServer xSeries 345.
image

Фото-отчет с раздачи будет выложен в наших сообществах чуть позже.

Пожалуйста, присоединяйтесь и вы! Мы будем делать большую сборную раздачу оборудования в середине августа и ждем информацию о старых компьютерах и серверах, которые вы готовы передать на нужные дела. orangeman@rusonyx.ru. Спасибо!

НОВАЯ РАЗДАЧА

Наши коллеги, отличные парни из компании Лол, решили присоединиться к инициативе Orangeman. Благодаря им новая раздача серверов проходит в Хабаровске! Дальний Восток с нами и это просто супер!

image

Лол — один из ведущих веб-разработчиков Дальнего Востока: сайты, интранет, интеграция с asterisk.
Сайт компании: www.lol.su

Оранжмены из Лола хотят передать на хорошие дела…

1. Сервер IBM eServer 330 86744BJ, CPU 2 x Pentium 3 1.4 Ghz, RAM 768 MB, HDD 2 x SCSI 160MB/s 35 GB, IBM ServeRAID RAID1, 200 W, 1U, рельсы в комплекте

image

2. Сервер Appro 1224Xi, CPU 2 x Xeon 0f25h 3.2 Ghz, RAM 4 GB, HDD 3x 80GB, 460 W, 1U, рельсы в комплекте

image

3. Коммутатор Allied Telesyn CentreCOM 8224SL 24 порта Ethernet 10/100, управляемый

4. Коммутатор Cisco Catalyst 4912G, 12 портов GBIC, управляемый

5. Маршрутизатор Cisco 1812, 10 портов Ethernet 10/100

6. Медиаконвертер Allied Telesyn AT-MC1008/GB

7. KVM Dell 71PXP, 8 портов D-SUB PS/2, комплект кабелей в комплекте

image

И по мелочи, для тех, кто понимает :)

8. GBIC, 2 штуки
9. DVB-карта SkyStar 2.6D, 6 штук
10. DVB-карта Kworld DVB-S 100, 1 штука
11. ADSL-модемы, 2 штуки

Раздача размещена на страницах Orangeman в ВК и ФБ:

Раздача в Фейсбуке

Раздача в Вконтакте

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

Благодарности

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

Ура! :)

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Эдвард Сноуден получил временное убежище в России

Эдвард Сноуден, бывший сотрудник ЦРУ и АНБ, который передал в СМИ многочисленные доказательства слежки спецслужб за населением, сегодня получил временное убежище в России.



«По нашей информации, он уже покинул территорию аэропорта», — сказал РИА Новости представитель «Шереметьево».

Российский адвокат Сноудена сообщил, что он покинул аэропорт на обычном такси сегодня примерно в 15:30 по московскому времени, в одиночестве. По другой информации, его постоянно сопровождает представительница Wikileaks Сара Харрисон.

Эдвард Сноуден с 23 июня размещался в транзитной зоне аэропорта «Шереметьево», в местной гостинице. Документы ФМС позволяют ему находиться на территории России в течение года. Главный вопрос остаётся в том, куда направится Сноуден, где он будет жить? Адвокат говорит, что эта информация интересует все мировые СМИ, но из-за «явной угрозы безопасности Эдварду Сноудену» он не имеет права разглашать такие сведения. Документы ФМС позволяют Сноудену выбрать любое место жительства в любом городе РФ или в ненаселённой местности.


Эдвард Сноуден с начала 2000-х общался на форумах и IRC-канале Ars Technica под псевдонимом TheTrueHOOHA, фото сделано в 2006 году

В то же время Комитет по ассигнованиям Сената США (Senate Appropriations Committee) неделю назад единогласно проголосовал за введение торговых или других санкций в отношении любой страны, которая предоставит убежище Эдварду Сноудену.

Эксперты расходятся во мнениях, как повлияет решение российских властей на американо-российские отношения.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


SMS сервер GoIP для Asterisk (часть 1)

В этой статье я расскажу, об одной из реализации, использования сервера SMS рассылки – GoIP, с телефонной платформой Asterisk.
image
Перепробовав множество GSM шлюзов, могу с уверенностью ответить, что шлюзы GoIP являются самыми лучшими, особенно по соотношению цена/качество. Как пример, они отлично, работают на одном из колл-центров Беларуси, отрабатывая порядка 100 каналов GSM, и принимая в сутки около 3000 вызовов. Плюс ко всему, очень порадовала поддержка сервисных инженеров из Китая, очень оперативно.
Немалым достоинством этого шлюза является свой SMS сервер, умеющий производить SMS рассылки, снимать баланс и многое другое. Локализованную версию сервера и более подробную версию статьи, можно найти на моем сайте.
Локализованная версия GoIP SMS сервера расположена на этой странице, либо можно скачать оригинальный сервер, с сайта производителя. В качестве платформы Asterisk я использовал дистрибутив Elastix. Установка модуля выполняется в несколько шагов:
cd /usr/src
tar xvfz goip_install-ru-v1.15.1.tar.gz
cd goip_install
./goip_install.sh
/etc/init.d/httpd restart
При установке указать пароль базы данных.
Переходим по 192.168.1.35/goip

image

Пароль логин администратора: root root. Попадаем в панель администрирования SMS сервера.
Первое что необходимо сделать это создать транки на SMS сервере и шлюзе GoIP.
Переходим во вкладку добавления провайдера:

image

Прописать SMS Sender на GoIP и SMS cервере.

image

Для каждой сим карты свой.

image

После того как транки залогинились на шлюзы можно осуществлять cvc рассылку используя API или XML файл.
В следующей части я расскажу, про модуль рассылки на модемах Huawei E1550.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Bootstrap CSS Sprite: синтаксический сахар для &lt;img /&gt;

Что это?

В один прекрасный день я отчётливо понял, что устал писать длинные ссылки на файлы изображений, каждый раз задавать им ширину и высоту, заботиться о том, чтобы это всё не прыгало при загрузке и не мигало при наведении мышкой. И я решил автоматизировать всю эту рутину. Так появился Bootstrap CSS Sprite — библиотека, которая позволяет работать со всеми вашими изображениями, как с одним спрайтом. При этом доступ к тайлам спрайта осуществляется в стиле Twitter Bootstrap.

Приведу пример: у нас есть файл изображения cat.png. Чтобы показать это изображение надо использовать тег <i>, указав для него CSS-класс img-cat, как мы делаем это в Twitter Bootstrap:

<code class="html"><i class="img-cat"></i>
</code>


Преимущества

  • Вместо множества файлов с изображениями мы получаем один и, как следствие, всего один запрос к серверу вместо множества.
  • Смена изображения при первом наведении мышкой (hover) без мигания и подёргиваний.
  • Больше нет нужды указывать ширину и высоту для каждого изображения в HTML-шаблонах — библиотека сделает это за нас в сгенерированном CSS-файле.
  • Меньше HTML-кода:
    <code class="html"><i class="img-cat"></i>
    </code>
    вместо
    <code class="html"><img src="<?=$this->theme->baseUrl?>/images/cat.png" style="width: 64px; height: 64px;" />
    </code>
    Думаю, это будет действительно экономить время!

Как использовать

Давайте рассмотрим самый простой способ использования библиотеки. Для генерации спрайта надо указать, где и какие файлы надо брать. В нашем случае берём jpg, jpeg, gif и png из директории /path/to/images/source. Затем указываем путь к файлу спрайта — /path/to/images/sprite.png — в него будут объединены все исходные изображения. Также будет сгенерирован CSS-файл — /path/to/css/sprite.css, который содержит классы для всех обработанных изображений. Эти классы определяют ссылку на изображение, его размеры, а также поведение при наведении мышкой.
<code class="">$sprite = new BootstrapCssSprite(array(
    'imgSourcePath' => '/path/to/images/source',
    'imgSourceExt'  => 'jpg,jpeg,gif,png',
    'imgDestPath'   => '/path/to/images/sprite.png',
    'cssPath'       => '/path/to/css/sprite.css',
    'cssImgUrl'     => '/url/to/images/sprite.png',
));
$sprite->generate();
</code>
Генерацию надо запускать только при добавлении новых изображений.

Также уже готова реализация в виде компонента для . Работа с ним будет полностью аналогична. Надо просто скопировать файл YiiBootstrapCssSprite.php в /extensions/ и добавить его в конфиг:
<code class="php">'components' => array(
    ...
    'sprite' => array(
        'class'         => 'ext.YiiBootstrapCssSprite',
        'imgSourcePath' => '/path/to/images/source',
        'imgSourceExt'  => 'jpg,jpeg,gif,png',
        'imgDestPath'   => '/path/to/images/sprite.png',
        'cssPath'       => '/path/to/css/sprite.css',
        'cssImgUrl'     => '/url/to/images/sprite.png',
    ),
    ...
)
</code>
После чего генерируем спрайт:
<code class="php">Yii::app()->sprite->generate();
</code>

:hover

Для того, чтобы менять картинку при наведении мышкой, достаточно всего лишь положить файл изображения cat.hover.png рядом с cat.png. И это всё! Если же надо изменять картинку при наведении мышкой на её родительский элемент (а не на саму картинку), тогда придётся попотеть и добавить CSS-класс hover-img к этому элементу:
<code class="html"><button class="btn hover-img"><i class="img-cat"></i> My Cat</button>
</code>
Также есть возможность вручную эмулировать событие наведения:
<code class="javascript">$('.img-cat').addClass('hover');
</code>

Планы на будущее

Планов по развитию довольно много. Из основного:
  • Реализовать генерацию спрайта с использованием разных графических библиотек (сейчас есть реализация только с GD lib).
  • Оформить библиотеку в виде компонента (бандла, etc.) для основных PHP-фреймворков (Yii, Zend, Symfony).
  • Портировать библиотеку на другие веб-ориентированные языки (Ruby, Python, .Net, Java, etc.).
Надеюсь, что после публикации статьи, планы на будущее значительно расширятся, а радость веб-разработчиков всех стран и народов повысится. Жду ваших комментариев и пулл реквестов :)

UPD maximw высказал хорошую идею: заменить тег <i> на <div>. Можно будет сделать этот тег конфигурируемой опцией. А SelenIT2 дал очень дельное уточнение о том, что заменить лучше не на <div>, а на <span>, дабы не порвать DOM при вставке в строчные элементы.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Видеоролики в MMO. Развитие жанра или вид искусства?

Меня зовут Дмитрий Астапкович, я являюсь руководителем команды кат-сцен Allods Team. В данный момент мы занимаемся созданием видеороликов для проекта Skyforge. В свое время я работал над большим количеством различных проектов: American Chopper 2, Biker Mice from Mars, Coded Arms: Contagion, Hot Brain, Insecticide и Prime World. В этой статье я расскажу о различных типах роликов и трудностях, с которыми сталкиваются разработчики в процессе создания кат-сцен.

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



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

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

И тут в игру вступают они…

Современные игры трудно представить без красочных внутриигровых видеороликов. Кат-сцены впервые появились в далеком 1985 году в игре Portopia Renzoku Satsujin Jiken от Enix и с тех пор прошли огромный путь в своем развитии. Изначально подобные видео были прерогативой сингл-игр, но время шло, и сегодня не найти качественной MMO-игры без подобных видео.

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

Правильный выбор

Однозначно сказать, какой ролик лучше, невозможно. Для решения разных рабочих задач мы можем выбирать разные типы роликов. В каких-то случаях ролики хорошо работают на сюжет, в большей степени развивая его «в обход» основного игрового контента. Или даже полностью берут на себя его изложение – как в Angry Birds, например.

image

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

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

Неигровые ролики: дорого, долго, кинематографично

Неигровые ролики – это отдельное видео, никак не связанное с игровыми ассетами, т.е. игра работает как видеопроигрыватель. Такие ролики производятся в программах для создания спецэффектов в кино (Maya, 3ds Max, Houdini и т.д.). По сути, это мини-фильмы с полностью кинематографическим подходом к рабочему процессу и, как следствие, совершенно кинематографическим результатом. Основной плюс такого способа производства – качество полученного видеоконтента. Себестоимость конечного продукта смело можно отнести к его очевидным минусам – затраты на подобные ролики исчисляются сотнями тысяч долларов.

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

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

Но…

И все же неигровые ролики пользуются у разработчиков неизменной популярностью: временные и финансовые затраты на их производство хоть и велики, но достаточно точно предсказуемы. Кроме того, нередко удается находить недорогие и удачные решения, позволяющие сделать ролик относительно быстро и в приемлемом качестве. Например, ролик к игре League of Legends, который вышел в 2010 году:


Это демонстрация способностей некоторых героев в сочетании с условным сюжетом, основанным на геймплее. Игроки понимают, что это скорее вариация на тему игры, чем точный показ игровых персонажей, и не ищут полного соответствия. При этом ролик набрал более 14 миллионов просмотров и получил порядка 75 000 лайков? довольно красноречивый показатель того, насколько он понравился игрокам. Нельзя не отметить, что в 2013 году появился новый ролик про эту же игру, который за 2 дня показов набрал уже 6 миллионов просмотров и более 150 тысяч лайков:


Хороший способ снизить затраты на производство ролика – сделать его в стилистике комиксов. Помимо того что комиксы дешевле в производстве, в них легко можно добавить взаимодействие с игроком. Например, нажимать на кнопку «Далее» или выбирать варианты действия персонажа на некоторых экранах. Яркий представитель игр такого рода? первая часть Max Payne, в которой при помощи очень стильных, но недорогих в производстве комиксов была рассказана непростая история главного героя. Этот прием достаточно успешно применяют, есть и тенденция к определенному качественному развитию. Например, в третьей части Max Payne стилизация под комиксы перешла уже в игровые кат-сцены, о которых речь пойдет ниже.

Стоит сказать, что сейчас неигровые ролики делают не только в программах для производства спецэффектов. Растущее качество графики в играх позволяет делать красивую, почти киношную картинку. Проблема только в том, что цена этого качества – время визуализации кадра, которое даже на очень мощных машинах не позволит посмотреть видео в реальном времени, т.е. на скорости 30 кадров в секунду. Поэтому иногда разработчики используют игровой редактор в качестве программы для получения исходных данных для видео. После этого происходит обработка данных в монтажных программах и получаются ролики отличного качества. Примером подобного решения может служить видео для игры Warface:


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

Кат-сцена требует жертв

Теперь можно перейти к игровым роликам – тем, которые игра визуализирует в реальном времени прямо на компьютере игрока. Эти ролики (их также могут называть кат-сценами: от англ. cutscene) выглядят у пользователя так же, как игра, хорошо связаны с ней по смыслу, выполнены в той же стилистике. И это, безусловно, плюс. Как обычно, существует и обратная сторона: максимальное качество подобных роликов можно оценить только на самых «топовых» машинах. Если же у игрока недостаточно мощный компьютер, то ролик, возможно, будет «тормозить», в нем не сработают спецэффекты или какой-то сложный шейдинг. Например, если на «слабом» компьютере не работает глубина резкости, кадр выглядит значительно беднее и менее собранным. Ведь изначально глубина резкости – это способ создать для зрителей определенную точку фокуса, соответствующую режиссерскому замыслу. Получается, что разработчик не может заранее знать, как конкретно будет выглядеть ролик у конечного пользователя, и вынужден ориентироваться на некоторую среднюю конфигурацию, для которой доступны не все возможности игры. Правда, подобная проблема характерна только для компьютеров, на консолях в этом плане все достаточно стабильно и предсказуемо.

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


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

Есть контакт!

Неоспоримое преимущество игровых роликов заключается в том, что их, в отличие от видео, можно по-разному вставлять в игру. Например, полностью прерывать процесс игры, рассказывая сюжет между игровыми миссиями, как это сделано в StarCraft. Или вставлять ролики прямо в геймплей, забирая управление у игрока на короткое время. Такой подход типичен для многих игр вроде Gears of War: игрок выбегает из какой-то закрытой области на открытую площадку, после чего управление отбирается и камера летит к новому противнику, которого нужно победить. Противник проигрывает свою отдельную анимацию, возможно, какой-то спецэффект, после чего игроку возвращают камеру, как бы говоря при этом: «Давай, действуй! Теперь ты знаешь, кто твой противник и как он выглядит вблизи». Этот прием часто используется для различных подсказок: «тебе бежать вот сюда», «нажми вот эту штуку» или «вот здесь появились твои враги, что-то с ними нужно сделать».



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

Другой вариант: у игрока полностью забирают управление персонажем, оставляя ему управление камерой. Допустим, его сажают в какую-то тележку, повозку, самолет, автомобиль и т.д. Игрок едет по фиксированной траектории и самостоятельно передвигаться в текущий момент не может. По дороге между собой ведут разговор NPC, сидящие рядом, или поблизости происходят какие-то события, раскрывающие сюжет. Узнаваемо? Это очень хороший и весьма распространенный способ рассказать игроку какую-то вводную историю. Например, в Call of Duty 2 именно на таких минималистических сценках подается почти весь сюжет, и незамысловатый отстрел нацистов выглядит уже намного более осмысленным.

Есть и более мягкие варианты – с частичной потерей управления. Например, игрок нажимает какую-нибудь кнопку – «подобрать что-то» или «открыть сейф». А дальше аватар начинает проигрывать какую-то сложную анимацию, взаимодействуя с окружением: тянет какой-то рычаг, потом что-то открывается, кто-то выбегает и т.д. В принципе, нельзя сказать, что это полноценная кат-сцена, скорее некий полностью заскриптованный кусочек, в котором игрок принял участие. В современных играх такие кусочки стараются встраивать в игру максимально плавно, чтобы не было заметно переключений состояния игры. Это очень хорошо видно в новых шутерах, например у Battlefield:


Это очень дорогой и, пожалуй, самый сложный вариант внедрения, потому что, во-первых, таких сцен нужно много. Во-вторых, они должны очень плавно входить в игру. При этом крайне важно, чтобы игрок их не пропускал. Ведь если мы оставляем пользователю управление камерой, он может отвернуться и в нужный момент посмотреть вовсе не в ту сторону, где разворачивается мини-сюжет, стоивший в производстве не одну тысячу долларов. О подобных проблемах рассказывали разработчики проекта Uncharted пару лет назад на GDC. Им приходилось очень долго экспериментировать на некоторых локациях, чтобы точно выверить место для зоны, при входе в которую, например, приезжает грузовик с новой партией врагов. Его появление полностью кастомное: анимация подъезжающего грузовика, выпрыгивающих из него людей и т.д. Но игрок в этот момент может быть в любом месте локации и просто не увидит этого, вполне обоснованно решив, что 10 человек появились из воздуха у него за спиной, как это было принято в старых играх. Чтобы этого не произошло, требуется очень большое количество итераций. Нужно настроить геймплей так, чтобы одновременно и не отбирать у игрока возможность управления камерой и персонажем, и при этом рассказать сложную историю, в которой он же и участвует. По сути, придумать такие приемы, которые заставят действовать игрока определенным, ожидаемым образом. Собственно, это и есть самая дорогая часть производства игрового ролика – время, количество которого сложно оценить даже очень опытным разработчикам.

Есть и еще один, более простой вариант вживления такого рода сцен в игру? так называемые quick time events. Например, аватар игрока падает в пропасть, а игрок должен успеть нажать правильную кнопку, чтобы вовремя схватиться за выступ скалы, то есть переключиться на нужное действие в нужный момент. Последовательность таких мини-сценок может давать очень хороший результат, что неоднократно было доказано играми из серии God of War:


Специфика кат-сцен в MMO-играх

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

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

Такие моменты — это самая жестокая вещь, которая есть в MMO, так как именно из-за них могут приниматься некоторые решения на уровне «давайте всем персонажам делать огромные текстуры». Тут же стоимость всех ассетов взлетает до небес, а нужно нам это для пятиминутного ролика.

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

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

Чтобы игрок не потерял своего персонажа и увидел кат-сцену, в некоторых играх отключают отображение других игроков. Но и здесь свои нюансы. Стоишь на площади полной людей, начинаешь диалог и, вдруг, все исчезают. Немного странно получается. Игроки часто даже не осознают в чем именно проблема, просто чувствуется неправильность происходящего. Говорят, что плохую анимацию может заметить и пятилетний ребенок, он просто увидит, что что-то не так. Но только крутой аниматор, скажет, что именно не так. В нашем проекте мы отказались от кат-сцен в крупных городах и других местах скопления людей. Основные ролики мы перенесли в инстансы, в которых одновременно находится только сам игрок и его группа.

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

О самом главном

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

Грамотный подход к созданию игры охватывает множество различных аспектов, перечислять которые можно очень долго. Мы стараемся прорабатывать даже те вещи, которые на первый взгляд кажутся незначительными. Производство нашей игры в итоге занимает немало времени, однако результат стоит того. Я рассказал только о кат-сценах, но мы планируем еще немало интересных статей о процессе разработки MMORPG на примере Skyforge.

Остальные наши статьи о различных аспектах работки игр можно почитать на нашем сайте и в нашем сообществе Вконтакте.

Если вы хотите узнать о каких-то определенных вещах – пишите в комментариях.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Новая версия ipLex.Профи — «мобилизация» украинских юристов

В июле 2013 года вышла новая версия профессионального приложения для юристов Украины ipLex.Профи 3.1.
Новая версия вышла для ПК на базе Windows, Linux, MacOS и для смартфонов/планшетов Android, iOS.

Главной особенностью новой версии ipLex.Профи стали улучшенный дизайн и структура интерфейса, предоставляющая карту всех информационных ресурсов, сервисов и служб системы. В режиме полного доступа добавились новостные «Новые поступления» и «Изменения законодательства». Отдельно выделен функционал управления личным данными пользователя «Мой кабинет». Для повышения надежности введена в действие резервная линейка серверов.

ipLex.Профи — это единственная в Украине коммерческая мобильная правовая система. Работает в режиме платной подписки, причем логин/пароль пользователя действителен для всех его устройств и платформ. Своя база избранных документов тоже синхронизирована для всех платформ. В результате ipLex.Профи меняет саму модель деятельности юриста: начал работу в офисе на макбуке, продолжил в дороге на смартфоне, доработал дома на планшете.

Если Вы хотите познакомиться с новой версией, заполните эту заявку до 25 августа 2013 года.
Мы предоставим Вам логин/пароль на 2 недели бесплатного доступа к ipLex.Профи.

image

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Новые возможности Hyper-V 2012 R2

Добрый день, уважаемые коллеги и энтузиасты!

Давненько я не писал в хабр, было как-то много дел, все не доходили руки, да поводов совсем интересных не было.
Но время не стоит на месте, как и наш продуктовый цикл (смайл).
На дворе лето, выпущены preview-версии нашего Windows Server 2012 R2 и System Center 2012 R2.
Так что нового у нас теперь хватит на ближайшее время для интересных статей и рассказов.
Обращу ваше внимание на то, что preview и Windows Server, и System Center выходят одновременно, что планируется и для финальных RTM-версий этих продуктов — а значит, наконец-таки (даже я этому сильно лично радуюсь), линейки синхронизированы между собой, что избавляет от множества конфузов, которые возникали ранее.



Сегодня же я хотел бы обратить внимание и поговорить (а точнее — рассказать) про новшества в области нашего гипервизора, Hyper-V, который уже заканчивает доростать до версии 2012 R2.



А какой версии твоя ВМ?..

Наверное, одним из основных новшеств, стоит назвать появление виртуальных машин 2-го поколения, или 2-nd generation VM.
Но что же нового заключается в появлении нового поколения ВМ, в чем же соль?

Во-первых, ВМ 2-го поколения полностью избавлены от виртуального железного хлама, коим являются всякие COM-порты, драйверы виртуальных клавиатуры и мыши, в настройках виртуальных машин. Виртуальный -контроллер также можно отнести к архаизмам — что автоматически означает появление возможности загрузки с виртуальных SCSI-дисков, т.к. SCSI контроллер — теперь единственный.



Рисунок 1. Свойства виртуальной машины второго поколения и мастер создания ВМ.

Стоит отметить что в качестве гостевых ОС для ВМ 2-го поколения подойдут только WS2012 и Windows 8. Также появляется возможность автоматической активации гостевых серверных ОС, Windows Server, — без подключения, без наличия KMS-сервера, все что нужно — это активированная хостовая ОС Windows Server 2012 R2 Datacenter.

Также виртуальные машины 2-го поколения избавлены от старого-доброго BIOS'а...
Теперь ему пришел на замену UEFI, со всеми вытекающими — безопасная загрузка Secure Boot, загрузку с синтетических сетевых адаптеров (Legacy-то всё, канул в Лету).



Рисунок 2. Свойства загрузки прошивки виртуального UEFI.

С точки зрения производительности эти изменения (и не только они) влекут за собойболее быструю установку ОС внутрь ВМ (на 50% быстрее) и более быстрый запуск ВМ (20% прибавки в скорости).

Также стоит отметить факт изменения настройки виртуализации сети на хостах с WS2012 R2.
Если раньше, на Windows Server 2012, требовалось залезать в свойства сетевого адаптера или сетевого агрегата включать специальный драйвер, то теперь эта функция автоматом переехала в Virtual Switch.



Рисунок 3. Сравнение настройки виртуализации сети на WS 2012 (слева) и WS 2012 R2 (справа).

Квартирный вопрос или переезд виртуальных машин

Изменения в Hyper-V 2012 R2 также касаются и переезда, а точнее миграции виртуальных машин.
Хорошая новость для тех. кто сразу задумался о миграции ВМ с существующего WS2012 на WS2012 R2.
Поддерживается живая миграция без общего хранилища со старой версии сервера на новую, но не наоборот.
Хосты же можно бесстрашно апгрейдить на живую, с ВМками, даже если у них есть снимки и Saved State'ы.
Также к простой живой миграции добавились еще и механизмы сжатия данных при передаче, что, естественно приводит к уменьшению объема передаваемых данных, а следовательно и к сокращению времени миграции.
Также в качестве катализатора процесса переезда служат механизмы RDMA и многоканального SMB (SMB-Multichannel).
Также появилась возможность экспортировать снимки виртуальных машин в отдельные ВМ с определенным статусом, состоянием.



Рисунок 4. Экспорта ВМ из снимка.

Также стоит добавить, что к фишкам экспорта добавилась и возможность экспорта ВМ целиком, вместе с состоянием памяти. Даже в том случае, когда ВМ включена, что наводит на мысле о возможности создания клонов работающих ВМ — что абсолютно справедливо, так сделать теперь тоже можно!

Когда пингвину холодно?..

что касается пингвина, то я сомневаюсь, что ему бывает сильно холодно — он в общем-то создан природой для того, чтобы жить в холоде. Ну а что касается поддержки ОС «пингвин-категории», то тут тоже появилась пачка новшеств:

1) Так как в 2012 R2 можно без остановки ВМ менять размер работающего VHDX-диска, то это справедливо не только для Windows, но и на linux ВМ.
2) Появилась полноценная поддержка динамической памяти для ВМ с гостевыми ОС Linux.
3) Улучшенный видеодрайвер для ядра Linux.
4) Поддержка резервного копирования ВМ с Linux наживую, в том числе и во время миграции ВМ.

Кластер гостевой, кластер домашний… Кластер резервный

Если вспомнить про изменения, касающихся виртуальных дисков, то здесь есть важное новшество:
появилась возможность создавать общие виртуальные жесткие диски (правда, на физически общем хранилище) — что позволяет говорить о создании гостевых виртуальных кластеров, а с точки зрения SC VMM 2012 R2 (ой, забегаю в тему следующей статьи, но не могу удержаться), можно и кластеры из шаблонов сервисов создавать! Вот это автоматизации и сила облака! Ну и, естественно, WS 2012 R2…

Ну а если мы говорим про кластер, то здесь, конечно же, очень важную роль играет производительность дисковой подсистемы.
Тут у нас появилась возможность создания уровней, тиров производительности дисковой подсистемы. Также система обладает достаточным интеллектом для определения типа диска, будь он SATA, SAS или SSD.

Ну и напоследок, улучшения в области репликации виртуальных машин.
Впервые этот механизм появился в WS 2012, и предназначался он, как нетрудно догадаться, для решения катастрофоустойчивых сценариев или сценариев резервирования с использованием резервного ЦОДа.
В WS2012 R2 этот механизм эволюционировал и теперь у нас появилась возможность:

1) Задавать интервал репликации ВМ между основным хостом и резервным — интервалы могут быть 30 секунд, 5 минут и 15 минут.
2) Возможность многошаговой репликации, т.е. настроить репликацию ВМ с хоста A на хост B, а с хоста B на хост C.

Happy end?.. Happy beginning!

Ну что же, сегодня мы с вами познакомились с новшествами которые появились в Hyper-V Server 2012 R2, в WS 2012 R2 в области виртуализации.
Надеюсь вам было полезно и интересно ознакомиться со списком новинок, они вас заинтересовали. Вы всегда можете скачать evaluation-версию предварительного выпуска Windows Server 2012 R2 с нашего сайта для того, чтобы самостоятельно проверить как работают новые функции нашей серверной ОС.

С уважением,
Человек-огонь

Георгий А. Гаджиев

Эксперт по информационной инфраструктуре
Microsoft Corporation


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


7-я международная IT HR конференция «нАйТи ответ!»

Компания IT-Доминанта 18-19 октября 2013 г. проводит в Санкт-Петербурге 7-ю международную конференцию посвященную взаимодействию с айтишниками«нАйТи ответ! #7».



Основные темы:
  • Хантинг / Анти-хантинг
  • Геймификация
  • Построение работы удаленных сотрудников / отделов
  • Тайный поиск своего предназначения (кризис работы)
  • Обесценивание понятия «»
  • Опыт коллег из зарубежья
  • Обучение персонала
  • HR фейлы
Формат конференции:
  • Два параллельных потока докладов
  • Третий (дополнительный) поток «мастерская» (мини-тренинги и мастер-классы)
  • Также будут круглые столы и обсуждения
Конференция будет интересна:
  • Административным и техническим руководителям и менеджерам IT компаний
  • Директорам по персоналу, менеджерам по персоналу, рекрутерам IT компаний
  • Рекрутерам-фрилансерам и представителям рекрутинговых компаний, подбирающих IT персонал
  • Представителям СМИ
К участию приглашаются спикеры!
Программный комитет 7-ой международной IT HR конференции «нАйТи ответ!» приглашает к участию профессионалов-практиков, желающих выступить в качестве спикеров и поделиться своим опытом и знаниями.

Возможные форматы участия:
  • Секционный доклад: 45 мин. выступление + 15 мин. на обсуждение (дает право на 100% скидку)
  • Блиц доклад: 15 мин. выступление + 5 мин. на обсужение (дает право на 50% скидку)
Для подачи доклада необходимо заполнить анкету и прислать её на эл. почту denis@it-dominanta.ru или anastasia@it-dominanta.ru.



Регистрация;
Для участия необходимо зарегистрироваться на сайте «Айти-Событие.рф»



Мы в социальных сетях:
Вконтакте / Twitter / Facebook / Linkedin



Наши Google Сalendar'и:
Все города / Москва / Санкт-Петербург / Киев / Минск / Новосибирск / Екатеринбург / Нижний Новгород

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Абоненты МГТС GPon под угрозой взлома, новые сети – новые проблемы


1. Введение

В столице нашей необъятной Родины идет беспрецедентный по масштабу проект внедрения технологии Gpon от компании МГТС под эгидой борьбы против медных проводов и за доступную интернетизацию населения. Число абонентов МГТС по городу Москва превышает 3.5 миллиона человек, предполагается, что охвачены будут все.
Идея замечательная – оптика в каждую квартиру, высокоскоростной интернет, бесплатное подключение и Wi-Fi роутер в подарок (правда официально без права его перенастройки, но об этом далее). Реализация же такого масштабного проекта (подобное устройство ставится в каждую квартиру, где есть хотя бы городской телефон от МГТС) как обычно не обошлась без дыр в планировании, которые могут дорого обойтись конечному пользователю. Наша компания заинтересовалась вопросами информационной безопасности клиентов столь масштабного проекта и провела экспресс-исследование, результаты которого мы и предлагаем общественности для информирования о существующих угрозах и мерах борьбы с ними в домашних условиях.


2. Жизнь на ладони

Угрозы оказались вовсе не иллюзорными и малозначительными, а системными и потенциал риска трудно переоценить. Я хочу предостеречь счастливых абонентов МГТС от угрозы их приватности, таящейся не только в роутере ZTE ZXA10 F660, любезно принудительно подаренном провайдером (впрочем, менее уязвимый Huawei HG8245, также устанавливаемый абонентам все равно никак не защищен от «настроек по-умолчанию»), но и в самой организации подключения абонентов к новым линиям связи.
Вот так выглядят варианты устанавливаемого оператором оборудования:

Менее опасный Huawei HG8245



Куда более «дырявый» ZTE ZXA10 F660



Проблем тут несколько разной степени опасности, какие-то решить можно своими силами, на какие-то можно лишь обратить внимание. Давайте перечислим основные моменты, которые помогут злоумышленнику взломать вашу домашнюю сеть (при условии, что вы таки являетесь абонентом МГТС по услуге Интернет):
  • Пароль на WiFi – это ваш номер телефона (в ходе исследования встречались ленивые монтажники, которые оставляли паролем MAC-адрес роутера без первых 4-х знаков).
    Это означает, что взломать Wi-Fi техникой перебора хэндшейка по маске 495?d?d?d?d?d?d?d не потребует много времени, речь идет о считанных минутах и для этого вовсе не обязательно все время находиться возле объекта взлома. Достаточно перехватить момент соединения беспроводного устройства абонента(смартфона, планшета, ноутбука) с роутером, а остальное уже можно спокойно сделать на домашнем компьютере. Этот просчет оператора на уровне организации подключения — зияющая дыра, открывающая домашние сети миллионов абонентов для атаки злоумышленников. Эту проблему можно решить только локально — самостоятельно поменяв пароль точки доступа на более безопасный, однако следующая уязвимость куда серьезнее, так как на нее эффективно повлиять абонент самостоятельно просто не в силах.
  • Речь идет об уязвимости технологии беспроводной настройки WPS, которая включена по-умолчанию на роутерах ZTE ZXA 10 F660. И если в случае с организационным просчетом, подставившим сети пользователей на уровне паролей злоумышленник не может массово взламывать абонентов, занимаясь каждым по-отдельности, то при эксплуатации WPS-уязвимости роутера этой модели взлом сетей может быть поставлен на поток. Технология работает следующим образом — для WPS-соединения используется пин-код, состоящий из 8 цифр. При получении правильного пинкода роутер отдает реальный Wi-Fi пароль. Мало того, что этот пин-код может быть взломан с использованием известного инструмента Reaver куда эффективнее и быстрее сложного WPA2 пароля, но главная проблема — он единый для всех роутеров ZTE ZXA10 F660! Более того, его легко можно найти за 10 минут в интернете. Повторяю — зная этот пин-код(который нельзя ни поменять, ни выключить) в течении 3 секунд получается реальный Wi-Fi пароль любой сложности и типа шифрования, либо производится прямое подключение к сети абонента. Таким образом «счастливые» обладатели именно этой модели оборудования (а их у оператора всего 2, так что шанс 50/50) даже установив невозможный ко взлому пароль на беспроводную сеть все равно из-за несовершенства технологии будут взломаны менее, чем за 5 секунд.

3. Чем чреват для владельца взлом WiFi?

Опустим банальности вроде «бесплатного интернета», сейчас не 90-е и на интернет людям с гаджетами обычно хватает. Так что за угрозы? Перечислим самые очевидные:
  • Перехват траффика абонента, кража паролей от почтовых служб, социальных сетей, программ обмена сообщениями и других конфиденциальных данных
  • Атака на компьютеры владельца точки с целью получения доступа к файлам пользователя, просмотра веб-камер, установки вирусов и шпионских программ (как правило домашние ПК куда более уязвимы для атак изнутри, чем корпоративные машины, здесь и традиционно слабые пароли и нерегулярные обновления и открытые ресурсы)
  • Прослушка телефонных разговоров. (Да, с переходом на незащищенный sip это стало проще, чем когда-либо). Теперь не только спецслужбы, но и любопытный сосед (а может и не сосед) может записывать ваши разговоры по городскому номеру ввиду того, что новая технология телефонии работает по незащищенному протоколу SIP. Для оперативного перехвата и записи разговоров которого давно существуют в открытом доступе все необходимые инструменты.
  • Кража телефонного номера — незначительно изменив программное обеспечение роутера злоумышленник может выяснить пароль от SIP-аккаунта и использовать его для звонков от лица взломанного абонента. Это не только потенциал прямого убытка владельцу номера, но и возможность нанесения куда более серьезного ущерба путем использования номера ничего не подозревающего гражданина для шантажа, террористических контактов или же с целью подставить владельца — например с этого номера сообщив в полицию о заложенной бомбе
  • Создание большого ботнета (число абонентов МГТС в г. Москва — 3 504 874) с потенциалом каждого соединения в 100мбит\с. Да, для этого потребуется армия леммингов, но как всем хорошо известно – на разного рода «чанах» постоянно обитают орды биологических ботов, которых регулярно привлекают заинтересованные лица к разнообразным интернет-акциям, как правило вредительского толка.
  • Использование случайной (или не случайной) сети для анонимной загрузки в Интернет запрещенных материалов (Догадываетесь, в чью дверь постучат?).

4. Меры защиты

Что можно предпринять, как защитить свою приватность в такой ситуации? Сделать самому можно немного, но это обязательные действия для каждого, кто не хочет стать жертвой плохо продуманной кампании оператора.
Нам понадобятся пароли от роутера, которые легко гуглятся в Интернете, записывайте:
  • Доступ к вэбинтерфейсу роутера ZTE ZXA10 F660 – login: mgts, Password: mtsoao
  • Доступ к консоли по протоколу Telnet – login: root, password: root
  • для Huawei HG8245:
    адрес по умолчанию — 192.168.100.1
    login: telecomadmin, password: admintelecom
  • Через вэбинтерфейс обязательно меняем пароль на точку доступа и ее имя (MAC-адрес все равно выдаст принадлежность к клиентам МГТС, но переименование точки снизит вероятность сопоставления конкретного Wi-Fi сигнала конкретной квартире)
  • Владельцам ZTE ZXA F660 следует отключить Wi-Fi функционал кнопкой на устройстве. На данный момент это единственный способ защититься от WPS-взлома.

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

5. Вывод

Какие выводы можно сделать из всего вышесказанного? Самые неутешительные – масштабнейший проект внедрения GPON(повторюсь – речь идет о 3.5 миллионах абонентов!) обошелся без консультаций со специалистами по информационной безопасности, либо эти консультации были полностью проигнорированы в ходе самого внедрения. Пароли-телефоны, не отключаемый WPS с единым ключом, незащищенная SIP-телефония, извлекаемые из WEB-интерфейса пароли — есть результат слабой организационной составляющей и полного игнорирования элементарных норм информационной безопасности. Уверен, МГТС далеко не уникальны в подобных просчетах, многие более мелкие операторы сетевых услуг попадают в такие же ситуации в области защиты данных своих абонентов, но масштаб проблемы на этот раз превосходит все мыслимые границы

6. Официальная реакция ОАО МГТС

Мы, как добропорядочные исследователи безопасности, заинтересованы в скорейшем решении озвученных выше проблем. К сожалению наше беспокойство не нашло отклик в сердцах сотрудников пресс-службы ОАО МГТС, на которых мы пытались выйти, используя все имеющиеся каналы. Отзыв получили лишь один — через Facebook, сотрудник пресс-лужбы заверил нас, что мы можем с чистой совестью опубликовать имеющийся материал, а они потом отвечая на вопросы прессы заверят всех в том, что абоненты в безопасности, а данные их — конфиденциальны.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Бенчмарк графических библиотек для PHP

image
В проекте который мы сейчас разрабатываем много работы с фотографиями, в результате чего скорость графической библиотеки является фактически главным фактором при оптимизации сайта. Не секрет что ImageMagick давно стал стандартом разработки на , хотя уже некоторое время его оттуда сталкивает форк под названием GraphicsMagick. Мне стало интересно насколько сильно они отличаются и сколько форы могут дать старому доброму GD. К счастью как раз недавно вышел графический модуль для CL_Prefix_PHPixie который поддерживает все три библиотеки, что и позволило мне провести достаточно интересные тесты.


В духе самого фреймворка экспериментировать будем на фее которая справа ( взята с девиантарта http://j-scott-campbell.deviantart.com/ ). Если кому-то покажется что в ней слишком много иннуендо, то посмею напомнить что уже больше 20 лет стандартным рисунком тестирования графических алгоритмов является Lenna из плейбоя.

Сейчас следует короткое описание тестов и выходные рисунки. В конце статьи будет сам бенчмарк скорости работы одной таблицей.

Простое масштабирование
Итак сначала попробуем уменьшить ее до 100 пикселей по ширине.
<code class="php">$pixie->image->read($dir.'fairy.jpg')
			->resize(200)
			->save($dir.'resize.jpg');
</code>

image

Разницы особой на первый взгляд незаметно, но например ее глаз на GD версии не имеет того ярко выраженного зеленого цвета как у Imagick и Gmagick.

Создание квадратной аватарки
Чтобы сделать автарку квадратной ее нужно сначала масштабировать по меньшей стороне а затем обрезать по большей. На PHPixie это делается довольно просто:

<code class="php">$pixie->image->read($dir.'fairy.jpg')
			->resize(200, 200, false)
			->crop(200, 200)
			->save($dir.'crop.jpg');
</code>
image
Очевидно что выглядеть они будут идентически предидущим.

Написание текста и создание пустого изображения
Теперь попробуем создать белый рисунок и написать текст фиолетовым цветом используя TTF шрифт.

<code class="php">$pixie->image->create(300, 70, 0xffffff, 1)
			->text("Hello World", 50, $dir.'/Sofia-Regular.ttf', 10, 50, 0x5B43AA)
			->save($dir.'text.jpg');
</code>

image

Тут результаты немного подраматичней. GD почему-то сделала цвет текста темней и гораздо хуже сработал антиалиасинг, в результате чего края текста немного размыты. У обеих Magick-ов текст получился гораздо лучше.

Разбиение текста на строки
Текст на строки разбивает сама PHPixie, но для этого она использует информацию о метрике текста от графической библиотеки. Так как приходится считать размер каждого слова это может быть довольно дорогим процессом. Итак попробуем поместить на пустую страницу кусочек песенки.
<code class="php">
$text = "When I closed my eyes to the shimmering light ".
           "all memory faded and I could see ".
           "that a mushroom circle of red and white ".
           "and myriad fairies surrounded me. ";

$pixie->image->create(300, 180, 0xffffff, 1)
			->text($text, 20, $dir.'/Sofia-Regular.ttf', 10, 50, 0x5B43AA, 1, 300)
			->save($dir.'wrap.jpg');
</code>

image

На меньшем шрифте недостатки не так заметны но если присмотреться к изгибам то довольно легко можно отличить. Но надо заметить что Imagick потратил намного больше времени, прежде всего из за пересчитывания метрики шрифта на каждом слове (ведь приходится наново считывать шрифт с диска каждый раз) в то время как GD и Gmagick были намного быстрее.

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

<code class="php">
$canvas = $pixie->image->create(400, 200);
	$fairy = $pixie->image->read($dir.'fairy.jpg')
				->resize(200, 200, false)
				->crop(200, 200);
	$canvas	->overlay($fairy, 0, 0)
			->overlay($fairy->flip(true, true)->rotate(90), 200, 0)
			->save($dir.'overlay.jpg');
</code>

image

Скорость работы

А вот и сам бенчмарк. По горизонтали слева-направо проведенные тесты, по вертикали среднее время исполнения ( каждый тест прогонялся 100 раз).

image

Вывод, лучше всего таки использовать Gmagick, если его нет то Imagick. Над GD можно задуматься только в случае если надо будет писать много текста и то не очень замысловатым шрифтом.

Кстати отдельно замечу насколько сильно мне понравился интерфейс самой PHPixie в этом плане, в особенности наличие функций для множества стандартных действий (тот же самый враппинг текста) для которых раньше приходилось качать отдельные классы.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Дыхание Земли



Американский дизайнер, занимающийся визуализацией данных, Джон Нельсон (John Nelson) создал интересную анимацию «Дышащая Земля» («A Breathing Earth»), которая наглядно демонстрирует погодные изменения на нашей планете. За основу взяты данные NASA из проекта Visible Earth archive. Всего использовано по 12 изображений Земли (по одному на каждый месяц года), которые собраны в анимированные GIF-файлы.

Анимация завораживает. Наша планета — дышащий живой организм:



Большая версия (1,4 Мб), очень большая версия (3,7 Мб)



Большая версия (3 Мб), очень большая версия (8,9 Мб)

PS В блоге дизайнера можно найти еще множество великолепных примеров визуализации данных.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Из песочницы] Поиск кратчайшего пути в транспортном графе (концепт) + исходники

Был как-то проект у меня, который был связан с картой города. И возникла идея, что раз есть карта с маршрутами и соответствующими остановками городского транспорта, то почему бы не сделать поиск пути из пункта А в пункт Б на ней.

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

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

Первое что сделал это запарсил с сайтов маршруты транспорта. Далее принялся за граф.
Это оказалась не сложная задача, берем каждую остановку маршрута и смотрим, нет ли остановок любого другого маршрута в заданном нами радиусе. Радиус взял 600м (в последней версии 400м) – предполагаемое расстояние, которое человек может пройти безболезненно пешком от одной остановки до другой в случае необходимости пересадки. Вероятно, это расстояние можно сократить, скажем, до 200м, так как расстояние от одной остановки до другой на перекрестке не превышает эту дистанцию.

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

Качество видео ужас, но как сделать получше я так и не обнаружил.


Усредненное время, затрачиваемое на выполнение шагов:

gpt — 0.009с, найти ближайшие остановки к точке клика
grt — 0.001с, найти кратчайший путь от маршрута к маршруту
apt — 0.0001с, добавляем остановки и точки поворота к нашему маршруту
all — 0.01c, суммарное время выполнения поиска пути


Данные:


Мы имеем некую карту города, с нанесенными на нее маршрутами городского транспорта (90 маршрутов) и координатами соответствующих остановок, принадлежащие этим маршрутам.

На карте маршруты выглядят так:



Скучное описание структуры базыДанные представлены в виде следующих таблиц:

<code class="sql">	route(
		id, 
		name, 
		color,
		route_type_id
	) // информация о маршруте
	
	route_type(
		id, 
		name
	) // тип маршрута - трамвай, троллейбус, автобус, метро, маршрутка
	
	route_points(
		id, 
		marker_description_id,
		route_id, 
		marker_order
	) // точки, которые принадлежат маршруту
	
	marker(
		id,
		x,
		y,
		address
	) // геокординаты
	
	marker_category(
		id, 
		name
	) // точка поворота или остановка
	
	marker_description(
		id,
		name,
		marker_category_id,
		marker_id
	)
</code>
Что бы каждый раз при поиске маршрута не тратить время на вычисления расстояния между остановками (в рамках 1 маршрута) посчитаем его заранее и запишем в соответствующую таблицу.
Получим таблицу расстояний:

<code class="sql">	route_distance(
		route_id,		//ид машрута
		roite_point_from_id,	//ид остановки откуда едем
		roite_point_to_id,	//ид остановки до которой едем
		distance		//сколько потребуется времени что бы доехать между остановками
	)
</code>
Далее построим мета-граф переходов, то есть мы найдем те остановки маршрута, в радиусе которых есть остановки из других маршрутов. Как уже отмечал, я выбрал радиус 400 метров.
Результат обработки запишем в таблицу:

<code class="sql">	route_cross_points(
		route_from_id,		//маршрут с которого пересаживаемся
		route_to_id,		//маршрут на который пересаживаемся
		route_point_from_id,	//остановка с которой пересаживаемся
		route_point_to_id,	//остановка на которую пересаживаемся
		distance		//затраты едениц времени
	) //таблица, которая содержит пересадки
</code>

Выгрузка данных в


Все мои программные реализации, построенные на базе MYSQL были очень медленные. Я решил отойти от базы. Я выгрузил данные в массив и решил работать через сокет. В моем случае, выгруженные данные занимают объем порядка 19MБ оперативной памяти.
Основным массивом является у нас массив $graf. Это трехмерный массив ключи у которого:
  • 1-й ключ маршрут с которого пересаживаемся
  • 2-й ключ на который пересаживаемся
  • 3-й точка пересадки
<code class="php">	$r = $this->db->query('
		select
			routeFrom rf,
			routeTo rt,
			markerFrom mf,
			markerTo mt,
			distance d
		from
			route_cross_points RCP
	');
	$kf = 0;
	foreach($r as $k => $v)
	{
		$this->graf[(int)($v['rf'])][(int)($v['rt'])][] = array((int)($v['mf']), (int)($v['mt']), (float)($v['d']));
	}
    
	$graf[$idFrom][$idTo] = array(
        0 => $v1, //с какой остановки, на какую пересаживаться и  веса пересадки
        1 => $v2 //с какой остановки, на какую пересаживаться и оценка веса пересадки
        .....
    );
</code>
Так как остановка одного маршрута может попасть между 2-мя остановками другого или маршруты соприкасаются в более чем 1 точке, то мы получим множество вариантов пересадок. Итак, $v1, $v2 и являются этими пересадками.

Также в памяти лежит массив с расстояниями внутри маршрута, то есть массив вида:
$routeDistance[$idRoute][$pFrom][$pTo] = (float);
Где:
  • $idRoute – ид нашего маршрута,
  • $pFrom — остановка с которой ехать,
  • $pTo — остановка куда ехать,
  • (float) – значение пути в абстрактных еденицах.
<code class="php">	$rt = $this->db->query('
		select
			route_id rni,
			POINT1 p1,
			POINT2 p2,
			distance d
		from
			route_distance
	');
	foreach($rt as $k => $v)
	{
		$this->routeDistance[(int)($v['rni'])][(int)($v['p1'])][(int)($v['p2'])] = (int)($v['d']);
	}
</code>

Поиск пути


Что бы начать поиск нам нужно найти остановку, с которой мы будем ехать и куда. После того как мы нашли ближайшие остановки откуда($idFrom) и куда($idTo) ехать, установили принадлежность остановок маршрутам, попробуем найти путь.

Чтобы найти путь с 1 пересадкой:

<code class="php">	if(isset($graf[$idFrom][$idTo]))
	{
		//Это значит что можно пересесть с 1 маршрута на другой.
	}
</code>
Поиск пути, например, с 2 пересадками реализуется вот так:

<code class="php">	foreach($graf[$idFrom] as $keyOne => $one)
	{
		if(isset($graf[$idTo][$keyOne]))
		{
			//Это означает что у маршрута с которого мы едем, и у маршрута, куда мы едем есть пересадка на общий маршрут.
		}
	}
</code>
Соответственно, чтобы найти путь, например, с 3 пересадками пишем следующим образом:

<code class="php">	foreach($graf[$idFrom] as $keyOne => $one) //Тут мы выбираем все маршруты на которые можно пересесть с маршрута откуда едем 
	{
		foreach($graf[$idFrom] as $keyTwo => $two)//выбираем все маршруты на которые можно пересесть из точки куда едем
		{
			if(isset($graf[$keyOne][$keyTwo])){	}
		}
	}
</code>

После этих операций мы получаем набор маршрутов вида $id1 -> $id2 -> $id3 -> $id4. Где $id* — ид маршрута.
Далее нам нужно понять какой путь самый быстрый. У нас есть остановка старта($pStart) и остановка конца($pEnd). Так же по таблице $graf мы знаем точки пересадок(откуда, куда и расстояние) это наши значени $v1, $v2.
Распишу для $id1 -> $id2. Добавляем к ним данные по всем пересадкам:

<code class="php">	$id1($pStart, $v1['from']) -> $id2($v1['to'], $pEnd)
	$id1($pStart, $v2['from']) -> $id2($v2['to'], $pEnd)
	$id1($pStart, $v3['from']) -> $id2($v3['to'], $pEnd)
</code>
Немного очевидного, чтобы оценить маршрут нужно все сложить:

<code class="php">	$routeDistance[$id1][$pStart][$v1['from']] + $v1['distance'] + $routeDistance[$id2][$v1['to']][$pEnd];
	$routeDistance[$id1][$pStart][$v2['from']] + $v2['distance'] + $routeDistance[$id2][$v2['to']][$pEnd];
	$routeDistance[$id1][$pStart][$v3['from']] + $v3['distance'] + $routeDistance[$id2][$v3['to']][$pEnd];
</code>
$routeDistance[$id1][$pStart][$v1['from']] – расстояние внутри маршрута.
$v1['distance'] – сколько времени тратится на пересадку, так же в абстрактных единицах.

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

Пример


Для удобства выберем несколько маршрутов:



Сворачиваем маршруты в точки и получаем граф:



Предположим, что нам нужно доехать от 2 до 5 маршрута.
По нашему графу мы получим такую выборку путей:



Далее мы работаем с полученными маршрутами. Нам нужно узнать какой из маршрутов самый «быстрый».

Вычисление значения «привлекательности» маршрута:
  1. Берем остановку старта маршрута и все возможные остановки пересадки на другой маршрут. По таблице route_distance находим длину пути от остановки старта в рамках маршрута до остановки пересадки.
  2. Теперь нужно учесть время на пересадку. Добавляем к вычисленной длине в соответствии с таблицей route_cross_point длинны между остановкой с которой пересаживаемся и остановкой, на которую пересаживаемся.
  3. Повторяем для каждого маршрута.

Возьмем первую строку из нашей выборки



$routeDistance[2][p.1][ p.3] + d1 + $routeDistance[3][p.5][ p.6] + d3 + $routeDistance[5][p.7][ p.8] = (float)
$routeDistance[2][p.1][ p.4] + d2 + $routeDistance[3][p.5][ p.6] + d3 + $routeDistance[5][p.7][ p.8] = (float)
$routeDistance – расстояние в рамках маршрута.
d* — время на пересадку.
p.1 – остановка откуда едем.
p.8 – остановка куда едем.
d1 – расстояние между p.3 и p.5

Минимальное число это и есть лучший путь.

Чего не хватает и как можно развивать:


— пока в алгоритме не учитывается существующая сеть дорог и не прокладывает пешеходный маршрут от точки А до остановки транспорта и соответственно от последней остановки городского транспорта из полученного маршрута до точки Б;
— конечно же, можно в дальнейшем считать и стоимости маршрутов и при необходимости вводить опционально выбор критерия, по которому выбирать маршрут (минимум стоимости, времени, пересадок и пр.), пока по умолчанию считаем целевым критерием минимум пересадок;
— если бы ввели тарифы на проезд, зависящие от длины пути, то также в алгоритме не так много нужно было бы добавить;

Исходники скачать. Распаковать. Путь не должен содержать русские символы.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


to be or not to be? Книга по Java EE

Добрый день, хабровчани.
В нашем издательстве возник вопрос стоит ли сделать книгу по Java EE, поэтому мы решили спросить мнение специалистов. Оставьте, пожалуйста, в комментариях ваш отзыв.
Недавно вышла вот такая замечательная книга — Beginning Java EE 7.



Аннотация:

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java.
Книга, о которой мы хотим рассказать, представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. с ними продемонстрирована на практических примерах. В этой фундаментальной книге также используется новейшая версия инструмента GlassFish, применяемого для развертывания и администрирования примеров кода.

Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP). В ней вы найдете максимально ценную информацию, изложенную с точки зрения эксперта по технологиям Java для предприятий.

Чему вы научитесь:
  • Познакомитесь с новейшей версией платформы Java EE.
  • Исследуете и научитесь использовать API EJB и JPA – от компонентов-сущностей, компонентов-сеансов до компонентов, управляемых сообщениями и многого другого.
  • Откроете для себя API для разработке на веб-уровне — в частности, JSF, Facelet и Expression Language.
  • Научитесь обращаться с веб-сервисами SOAP и RESTful, а также с другими службами, доступными в новейшей версии Java EE.
  • Создавать динамические пользовательские интерфейсы для корпоративных и транзакционных Java-приложений.

Для кого предназначена эта книга:

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

Содержание:

1. Экосистема Java EE 7
2. Внедрение контекста и зависимостей
3. Валидация компонентов
4. Java Persistence API
5. Объектно-реляционное отображение
6. Управление постоянными объектами
7. Корпоративные Java-компоненты
8. Обратные вызовы, таймер и авторизация
9. Перехватчики и транзакции
10. JavaServer Faces
11. Обработка и навигация
12. XML и JSON
13. Работа с сообщениями
14. Веб-сервисы SOAP
15. Веб-сервис RESTful

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Сервис и приложение для заметок Catch закрывается

Закрытие популярных сервисов становится в последнее время неприятным трендом. Вот такую картинку можно наблюдать с сегодняшнего дня на сайте Catch.com:

Напомню, что сервис Catch.com, а также одноименные приложения для Android и iOS платформ, являлись цифровым блокнотом с возможностью облачной синхронизации своих заметок — текстовых, фото, аудио и видео, списков и напоминалок.
Приложение было отличной альтернативой аналогичным сервисам, типа Evernote или SpringPad. Здесь неоднократно появлялись обзоры этого сервиса (Есть ли жизнь в мире PostPC? Часть 5: ищем альтернативу Evernote, Видеообзор приложений и игр для Android — kedDroid, kedDroid – S03E02. Видеообзор софта для Android).
Я пользовался Android-версией приложения более двух лет. Приложение регулярно обновлялось и ни разу меня не подводило.
Что ж, позвольте поблагодарить создателей за то время, что мы были вместе и пожелать им скорейшего решения их проблем.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


3G Модем и MikroTik

Все началось с того, что дома пропал интернет. У меня подключены два проводных оператора и оба стали недоступны. Позже оказалось, что в соседнем доме выключили электричество. Поскучав час другой без интернета, я вспомнил о 3G модеме ZTE MF112. Подключил к компьютеру, но этого было мало, хотелось еще и рабочий Wi-Fi в квартире. По этой причине я его подключил к своему MikroTik RouterBoard 951g-2hnd. Вот об этом я и расскажу.
image

Настройка модема

У MikroTik RouterBoard 951g-2hnd один USB порт. Для удобства я подключил 3G модем через маленький USB удлинитель и приступил к настройкам:

Смотрим какие устройства нам доступны по USB:
system resource usb print

# DEVICE VENDOR                               NAME                              SPEED                             
1 1:2 ZTE,Incorporated ZTE WCDMA Technologies MSM 480 Mbps

В WinBox`еimage

Смотрим порты, а главное количество каналов (3 канала от 0 до 2):
port print 

Flags: I - inactive 
# NAME CHANNELS USED-BY BAUD-RATE

0   usb1                                  3                                9600     
В WinBox`еimage

Теперь подключимся к модему и настроим его работу (канал выбираем перебором, ожидая на ввод команды AT ответ OK. У меня получилось с 1 и 2 каналом.):
system serial-terminal port=usb1 channel=1

[Ctrl-A is the prefix key]

AT
OK


Сначала сбросим к заводским настройкам:
AT&F
OK


Посмотрим на наш модем:
ATI
Manufacturer: ZTE CORPORATION

Model: MF112
Revision: BD_MF112V1.0.0B01

IMEI: 35***********54
+GCAP: +CGSM,+DS,+ES

OK

Проверим блокировку сети/SIM
AT+ZSEC?

+ZSEC: 3,0
OK


тут +ZSEC: N,X
N — Статус блокировки сети:
0 Инициализация шифрования (Незначительные SEC_ITEMS)
1 Network Lock ошибки. (Незначительные SEC_ITEMS)
2 Сетевая блокировка
3 разблокирована или исправить MCC/MNC

X — Статус блокировки SIM:
0 Нет действий
1 Сеть Lock
2 (U) SIM-карты Блокировка
3 Сеть Lock и (U) SIM-карты Блокировка

Уровень сигнала:
AT+CSQ
+CSQ: 17,99

OK

В децибелах (X = 17): -113 + X * 2 = -113 + 17 * 2 = -79 дБ

Узнать SIM IMSI номер:
AT+CIMI

25***********56
OK


Далее отключаем виртуальный CDROM:
AT+ZCDRUN=E
Enter download mode result(0:FAIL 1:SUCCESS):1

OK

AT+ZCDRUN=8

Close autorun state result(0:FAIL 1:SUCCESS):1
OK


Выбираем режим работы:
AT+ZSNT=0,0,0 (Авто) — по умолчанию
AT+ZSNT=0,0,1 Автоматический выбор сети: GSM+WCDMA, предпочтение GSM
AT+ZSNT=0,0,2 Автоматический выбор сети: GSM+WCDMA, предпочтение WCDMA
AT+ZSNT=1,0,0 Автоматический выбор сети: только GSM
AT+ZSNT=2,0,0 Автоматический выбор сети: только WCDMA
AT+ZSNT=0,1,0 Ручной выбор сети: GSM+WCDMA
AT+ZSNT=1,1,0 Ручной выбор сети: только GSM
AT+ZSNT=2,1,0 Ручной выбор сети: только WCDMA

Я выбрал Автоматический выбор сети: GSM+WCDMA, предпочтение WCDMA:
AT+ZSNT=0,0,2
OK


Все теперь сохраняем данные в текущем профиле:
AT&W
OK


Жмем Ctrl-A
[Q - quit connection]      [B - send break]
[A - send Ctrl-A prefix] [R - autoconfigure rate]


и Q
Welcome back!
В WinBox`енет возможности работать с serial-terminal

Настройка подключения

Для этого нам нужны следующие исходные данные (пример на операторе MTS):
  • APN: internet.mts.ru
  • Phone: *99#
  • User: mts
  • Password: mts

Кроме того:
  • порт к которому подключен модем: usb1
  • номера data и info каналов: 2 и 1 (подобрал перебором)

В интерфейсах должно появится новое соединение ppp-out1:
interface print

Flags: D - dynamic, X - disabled, R - running, S - slave 
# NAME TYPE MTU L2MTU MAX-L2MTU MAC-ADDRESS

12  X  ppp-out1                            ppp-out   

Настроем его:
image
image

и подключим:
image

Получение/Отправка SMS

Интерне есть, но за него надо платить, а для этого нужно следить за балансом. Для этого я воспользовался SMS-помощником.
У MTS, чтобы получить SMS с балансом нужно отправить сообщение на номер 111 с текстом 11. Делается это так (канал выбран перебором):
tool sms send usb1 phone-number=111 message=11 channel=1


Далее читаем входящие сообщения и ждем наше (secret равен любой строке):
tool sms set channel=1 port=usb1 keep-max-sms=10 receive-enabled=yes secret=blabla
tool sms inbox print

В WinBox`еimage

Получаем пустое сообщение от 111. Дело в том что Mikrotik может работать только с текстовыми SMS сообщениями, а вот с PDU нет.
Необходимо заставить SMS-помощника присылать сообщения в текстовом виде. Для этого достаточно отправить SMS на номер +79126313431 с текстом Eng (Это для оператора MTS):

tool sms send usb1 phone-number=+79126313431 channel=1 message=Eng

Смотрим:
tool sms inbox print

# PHONE           TIMESTAMP                      MESSAGE      
0 +79126313431 Jul/30/2013 14:08:40 GMT +6 Now you are a default language user

1 111             Jul/30/2013 14:07:33 GMT +6

Пробуем еще раз получить баланс:
tool sms send usb1 phone-number=111 message=11 channel=1

Смотрим:
tool sms inbox print

# PHONE           TIMESTAMP                      MESSAGE      
0 111 Jul/30/2013 14:09:20 GMT +6 Vash balans:117,5 rub. sms

1 +79126313431    Jul/30/2013 14:08:40 GMT +6    Now you are a default language user
2 111 Jul/30/2013 14:07:33 GMT +6


Теперь мы можем принимать SMS сообщения.

Тариф

Я опишу лишь MTS т.к. его SIM карта была у меня (собственно как и модем — но это исправимо)

Тариф: Супер МТС и главное это опция «МиниБИТ», которая позволяет платить за интернет, только в тот день, когда он нам необходим. Минус это суточная квота в 5 Мбайт, далее скорость падает до 32Кбит/с.

Если кто знает более выгодные подобные тарифы/опции, то поделитесь пожалуйста.

Вот так вот я организовал аварийный интернет-канал на всякий случай.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


NFC Кольцо Всевластья

Натолкнулся на очень интересный проект на Кикстартере — NFC Ring. Кольцо позволяет открывать двери, разблокировать мобильный телефон и передавать данные.

В кольце имеется две NFC зоны. Одна — для частных данных. С её помощью можно открывать замки с поддержкой технологии NFC, разблокировать смартфон. И одна — для публичных. В неё можно записать ссылку на сайт-визитку или номер телефона, который можно передать собеседнику на его мобильное устройство путем легкого прикосновения к его гаджету.





Плюсы:

  • Кольцо не имеет батареи и не требует подзарядки, так как работает в пассивном режиме. В этом режиме Целевое устройство может вытягивать свою рабочую мощность из предоставленной Инициатором электромагнитной области, таким образом делая Целевое устройство ретранслятором.
  • Самое интересное в этом проекте — Open Source. Есть специальное приложение на Apache Cordova, которое позволит снабдить ваше кольцо собственным новым функционалом.
  • Вообще у компании очень хороший подход: не только софтина в публичном доступе, но и исходники конструкции кольца. Можно на 3Д принтере напечатать любой каркас на свой вкус, и это очень радует.

Минусы

  • Кольцо на пальце может проворачиваться, а каждая NFC зона имеет свой функционал. Поэтому кольцо всегда должно быть в одном положении.
  • В России вообще маловато NFC-понимающих устройств
  • Есть баги при взаимодействии с Nexus 7
  • Если у вас Samsung S4 или Z10 — вам придется брать более толстое кольцо, так как стандартному образцу не хватает диапазона.

Очень хорошо все плюсы и минусы видны в ролике


О ходе проекта:

  • За 11 дней собрано ?124,658 из необходимых ?30,000
  • Проект поддержало 4,366 человека
  • О проекте написали такие гиганты, как Washington Post, gizmodo, techcrunch.com и многие другие.
  • Согласно динамике сборов проект может достигнуть отметки в ?300,000
  • Уже разблокированы такие цели, как цветные кольца(белый, черный, черный карбон, серебряный, дерево), приложения под Андроид и Винду, тонкий форм-фактор, титановый обод.
  • Если компания перевалит за ?300,000, то каждый бэкер получит второе бесплатное кольцо


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Перевод] Шоу UXtra — выпуск 1: интерфейсы мечты

На днях в iTunes появилось новое шоу от создателей Метрики – UXtra. UXtra – англоязычный подкаст о пользовательских впечатлениях и интерфейсах, сервис-дизайне и бизнесе, созданный при участии компании UIDG и альянса юзабилити компаний UXalliance (мировой лидер в области изучения пользовательских впечатлений и интерфейсов). Специально для аудитории Хабра создатели подкаста подготовили его транскрипт на русском языке.




Замечание автора: Мы решили убрать вступительные слова, рекламные вставки и немного отредактировали текст оригинала для лучшей восприимчивости на русском языке.

В первом эпизоде хотелось бы поприветствовать всех неравнодушных к темам UI и UX. Я с радостью учту ваши комментарии, пожелания и отзывы на шоу. Итак, после того, как мы разделались со вступительной частью, можно приступать и к основной теме сегодняшнего выпуска. Готовясь к шоу, я задумался о том, какие мысли посещают каждого, кто приступает к реализации нового проекта – вы решаете, каким путем он будет развиваться, вы пытаетесь заглянуть в будущее и понять, во что выльется тот или иной аспект вашей работы, задаетесь новыми целями. На мой взгляд, очень важно при этом не терять общей картины происходящего, картины, которая простирается далеко в будущее и позволяет вам объединить ваши знания, а также опыт работы коллег и предшественников для того, чтобы задать правильные цели проекта, четкие и выполнимые.

Поэтому в этом выпуске шоу я решил поговорить о футуристических интерфейсах (FUI, Futuristic User Interface). Я имею в виду те интерфейсы, которые мы видим в кино, о которых читаем и которые придумываем. Я убежден, что, несмотря на небезосновательные разговоры о практической применимости футуристических интерфейсов, именно они вдохновляют нас, если рассмотреть вопрос не с точки зрения конкретной истории или ее персонажей, а с точки зрения элементов, поддерживающих сюжет, определяющих его своего рода технологическую привлекательность и покоряющих наше воображение – воображение сегодняшних пользователей.

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

Один из таких сборников – Access Main Computer File – блог с бесконечной прокруткой скриншотов из фильмов «Чужой» (1979), «Луна 2112» (2009), «Я, робот» (2004), «Особое мнение» (2002) и серии фильмов о Железном Человеке. Создатели блога говорят о своей подборке как об исследовании компьютерных пользовательских интерфейсов в кинематографе.


«Ронин» (1998)

Похожая коллекция изображений доступна и в блоге Barnorama.

Однако, интересно проследить и шаги эволюции футуристических интерфейсов, и в этом может помочь сайт Noteloop, создатели которого собрали, на мой взгляд, одну из лучших библиотек того, что можно назвать фантастическими / выдуманными / несуществующими интерфейсами из популярных фильмов и телешоу. Большая их часть – не настоящие программы, а анимация, проигрывающаяся на экранах в нужный момент съемки или добавленная впоследствии при монтаже. Как правило, подобная анимация создается в Adobe Illustrator, Adobe After Effects и Maxon Cinema 4D. Так что Kit FUI от Noteloop – это база данных о таких интерфейсах, наподобие IMDb. Однако ребята, сделавшие ее, включили туда не только популярные фильмы и сериалы, но также рекламу, видеоконцепты, кроткометражки, а также информацию о дизайнерах, придумавших все это.


«Континуум» (сериал, 2012)

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

В журнале Pushing Pixels я отыскал интересное интервью с Джейсом Хансеном (Jayse Hansen), который рассуждает о работе создателя графики для экранов и пользовательских интерфейсов в кино. Статья датируется первым июня 2012, но не потеряла актуальности и сейчас – от дизайнера, придумавшего интерфейс для шлема Железного Человека, можно узнать немало интересного. Мне нравятся такие статьи, потому что они позволяют понять, что движет человеком и как Джейс, чье воображение в детстве поражали эпизоды из «Звездных Войн» и «Назад в Будущее», в итоге стал экспертом в таких масштабных проектах, как Железный Человек.


«Железный Человек 2» (2010)

Интервью позволяет глубже изучить процесс создания FUI – ведь Джейс принимал участие в работе над многими интерфейсами для героев хай-тек блокбастеров, начиная с идей и скетчей и заканчивая потрясающей графикой. Ему стоит доверять хотя бы потому, что специалистов подобного рода и уровня в кинематографе сравнительно немного. Именно он проводит базовые исследования перед началом работы, которые основываются на общем описании картины или части сценария. В частности, над картиной «Восстание планеты обезьян» потребовала от Джейса создать PDF-портфолио для порядка 20 различных пунктов сценария. Так что в профессии создателя футуристических интерфейсов есть время и для серьезной бумажной работы.


Материалы для подготовки «Восстания Планеты Обезьян» (2011)

Однако, разработкой футуристических интерфейсов вплотную занимаются не только в киноиндустрии, но и в крупнейших ИТ-компаниях. Среди подобных концепций: Apple iLens, EEG brainwaves, видение продуктивности будущего (Productivity Future Vision) от Microsoft, будущее шоппинга от Cisco и предложения от мобильных «старичков» – эксперимент TAT Open Innovation, OmniTouch, Samsung Flexible AMOLED, BlackBerry Empathy, Mozilla Seabird Mobile Phone, а также несколько недавних (июль 2013) демо-роликов Interactive Air Screen:


Возвращаясь к фильмам: есть среди хай-тек блокбастеров одна картина, о которой нельзя не упомянуть в разговоре про футуристические интерфейсы. Это, разумеется, «Особое мнение». Я нашел о ней неплохую статью Кристиана Брауна (Christian Brown) от 25 февраля 2013, где автор высказывает критику по поводу пользовательского интерфейса из фильма.

Фильм «Особое мнение» вышел на экраны в 2002 году, когда технология тачскринов уже существовала, однако главной задачей было создание для этой технологии практичных, дружественных пользователю продуктов. В своей статье Кристиан рассказывает читателям о целой плеяде технических экспертов и футуристов, которые разрабатывали для фильма Спилберга мир 2054 года, основанный на том, что в 2002 было новой прорывной технологией. И что? Использовались ли эти знания при проектировании UI? Скорее всего нет, поскольку Кристиан называет многие из интерфейсов смехотворными. Он говорит о тех моментах, когда, например, чтобы увеличить объект, нужно расположить одну руку перед другой или о ситуации, когда при рукопожатии все файлы сваливаются в угол. Кристиан называет это абсурдом.


«Особое мнение» (2002)

Еще более неестественной кажется ему идея изменять положение трехмерного объекта, нажимая на него одной рукой и поворачивая другой – Кристиан указывает на видение Productivity Future Vision от Microsoft, как на гораздо более логичный пример работы с объектами в пространстве, и надеется, что однажды наступит день, когда создатели фильма перестанут путать работу с компьютером и дирижирование оркестром.

Следующая статья по теме – материал из Smashing Magazine от 1 марта 2013 года. Ее автор, Кристофер Ноэссель (Christopher Noessel) проанализировал «интерфейс Особого мнения» и сделал два важных вывода, о которых стоит упомянуть:
  • Вывод 1. Качественная демонстрация может скрыть множество недостатков. Разумеется, все знают, что Тому Крузу требовались продолжительные перерывы между съемками сцен с компьютерным интерфейсом, поскольку они были физически изматывающими. Такие перерывы оказались крайне полезны, хотя и не отражали реального положения вещей – что показывает, как неэффективное решение можно удачно продемонстрировать, опустив некоторые детали.
  • Вывод 2. Интерфейс, использующий жесты, должен учитывать цели пользователя. Речь снова идет о том самом моменте, когда Андертон отрывается от работы, чтобы пожать руку Уитверу. Компьютер воспринимает жест Андертона, как команду, и едва не уничтожает всю его работу.








4 фрагмента из фильма «Особое мнение» (2002)

Этот момент заставляет Кристофера отметить, что такая система определенно должна предусматривать различные режимы работы: режим, когда действия пользователя значимы для системы, и когда они незначимы.

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

  1. Провести рукой, чтобы активировать. В фильме «День, когда Земля остановилась», чтобы активировать интерфейс космического корабля, нужно было просто провести ладонью перед полупрозрачной панелью активации, а в «Джонни Мнемонике» чтобы открыть воду в ванной, необходимо было провести рукой.


    «Джонни Мнемоник» (1995)

  2. Толкните, чтобы сдвинуть. Мы видели это в «Особом мнении» и снова заметили в «Железном человеке 2», например, в том моменте, где Тони передвигает проекцию тематического парка своего отца.


    «Железный Человек 2» (2010)

  3. Поверните для разворота. Мы видели это в эпизоде «Ариэль» из сериала «Светлячок» в 2002.


    «Светлячок» (сериал, 2002)

  4. Смахните, чтобы отменить. В «Джонни Мнемонике» энергично махнув тыльной стороной ладони вверх можно было отменить видеозвонок, а в «Железном Человеке 2», движением «смахивание справа налево», Тони отсеивал неинтересные изображения.


    «Джонни Мнемоник» (1995)

  5. Укажите или прикоснитесь, чтобы выбрать. В «Районе №9» Кристофер Джонсон выбирал элементы на объемном дисплее, прикасаясь к ним.


    «Район №9» (2009)

  6. Раскройте ладонь, чтобы выстрелить. Так появлялся энергетический пучок из ладоней Синдрома из «Суперсемейки» и аналогичные пучки энергии из ладоней «Железного человека».


    «Железный Человек 2» (2010)

  7. Сожмите или разведите пальцы для масштабирования. И то и другое Тони Старк использует, рассматривая модели во втором «Железном человеке».


    «Железный Человек 2» (2010)


Кристофер подчеркивает, что список этот неполон, что представляет большие перспективы для дальнейшего анализа других примеров. И отмечает, что одной из наиболее важных вещей тут является следующее: «Интерфейсы, использующие жесты, привлекательны и позволяют быстро взаимодействовать с виртуальными объектами в «реальном» формате, но вне рамок базовых примеров манипуляции объектами жесты сложны, малоэффективны и трудны для запоминания. Для более абстрактных запросов дизайнеры должны предлагать альтернативные способы взаимодействия, такие как голосовой ввод».
На этом все. Помимо всех материалов, упомянутых выше, я добавлю ссылку на последние работы Джозефа Косински (Joseph Kosinski) и Crater Lake Productions для фильма «Обливион», интервью с Шоном Юэ (Shaun Yue), участвовавшим в создании интерфейсов для «Прометея» и «007: Координаты «Скайфолл», и еще больше интерфейсов из «Железного человека».


Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Настройка OpenVPN шлюза в интернет на Debian, который на OpenVZ

Итак господа, приближается первое августа, поэтому задумался я над тем чтобы заиметь себе ip страны, в которой попроще с законодательством в сфере p2p, а именно Нидерландов. После достаточно долгих поисков нашел провайдера, который обещал два ядра от E3-1230, пару гигов памяти, 460 гигов винта и прекрасный нелимитированный(специально связывался с саппортом по этому вопросу — уверяют что канал не режут и после сотни терабайт) гигабитный канал за какихто 40 с копейками баксов. Единственное но — виртуализация OpenVZ — обычно я настраивал OpenVPN на XEN или KVM, поэтому все прошло не так гладко как обычно и поэтому я решил поделиться полученными знаниями.

Дистрибутив ОС — 6
Итак начнем:

Устанавливаем OpenVPN и dnsmasq

<code class="bash">aptitude install openvpn udev dnsmasq
</code>

Далее копируем скрипты генерации ключей
<code class="bash">cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
</code>
Потом нам обычно предлагают поправить файл /etc/openvpn/easy-rsa/2.0/vars, но если шлюз делается «для себя», то этот пункт совершенно необязателен. Если же хочется красоты то в конце вышеуказанного файла правим следующее:
<code class="bash">export KEY_COUNTRY="XX"
export KEY_PROVINCE="XX"
export KEY_CITY="City"
export KEY_ORG="MyCompany"
export KEY_EMAIL="habr@habr.ru"
</code>

После правки vars генерируем корневой сертификат

<code class="bash">cd /etc/openvpn/easy-rsa/2.0/
. /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all
. /etc/openvpn/easy-rsa/2.0/build-ca
</code>

Далее генерируем сертификаты сервера и клиента\клиентов(вместо cli1,cli2 можно придумывать удобные для себя названия)

<code class="bash">. /etc/openvpn/easy-rsa/2.0/build-key-server server
. /etc/openvpn/easy-rsa/2.0/build-key cli1
. /etc/openvpn/easy-rsa/2.0/build-key cli2
</code>

Потом генерируем параметры Диффи-Хеллмана
<code class="bash">. /etc/openvpn/easy-rsa/2.0/build-dh
</code>

Раскладываем ключи, на клиентскую сторону нужно отдать файлы ca.crt cli1.crt cli1.key, а в директорию /etc/openvpn положить файлы ca.crt ca.key dh1024.pem server.crt server.key

<code class="bash">cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn
</code>

Теперь скопируем в директорию /etc/openvpn пример конфига, который поставляется вместе с ПО.
<code class="bash">cd /usr/share/doc/openvpn/examples/sample-config-files
gunzip -d server.conf.gz
cp server.conf /etc/openvpn/
</code>

Чтобы наш впн сервер раздавал интернет своим клиентам в/etc/openvpn/server.conf допишем
<code class="bash">push "redirect-gateway def1"
push "dhcp-option DNS 10.8.0.1"
</code>

Далее включаем ip-forwarding

в файле /etc/sysctl.conf раскомментируем строку
<code class="bash">net.ipv4.ip_forward=1
</code>
а в консоли выполним
<code class="bash">echo 1 > /proc/sys/net/ipv4/ip_forward
</code>
чтобы изменения применились без перезагрузки.

Далее настраиваем iptables.
Если у Вас выделенный сервер, или виртуальный на Xen или KVM, то в консоли пишем
<code class="bash">iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
</code>
Если виртуализация OpenVZ, то обычный NAT работать не будет, и надо использовать SNAT, для этого в консоли пишем
<code class="bash">iptables -t nat -A POSTROUTING -o venet0 -j SNAT --to <b>a.b.c.d</b>
iptables -A FORWARD -i venet0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -o venet0 -j ACCEPT
</code>
Вместо a.b.c.d соответственно внешний ip вашего сервера

Чтобы iptables применялись при загрузке ОС, пропишем их в /etc/rc.local, туда же, после применения правил iptables добавим перезагрузку dnsmasq. Пример файла /etc/rc.local после внесения изменений —
для dedicated\Xen\KVM:

<code class="bash">#!/bin/sh -e
#
# [...]
#

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

/etc/init.d/dnsmasq restart

exit 0
</code>

для OpenVZ:

<code class="bash">#!/bin/sh -e
#
# [...]
#

iptables -t nat -A POSTROUTING -o venet0 -j SNAT --to <b>a.b.c.d</b>
iptables -A FORWARD -i venet0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -o venet0 -j ACCEPT

/etc/init.d/dnsmasq restart

exit 0
</code>

Далее настроим dnsmasq, для этого откроем файл /etc/dnsmasq.conf и раскомментируем\поправим две строки
<code class="bash">listen-address=127.0.0.1,10.8.0.1
bind-interfaces
</code>

На этом настройка сервера закончена, можно перезапускать сервисы и начинать настраивать клиентов.
<code class="bash">service openvpn restart
service dnsmasq restart
</code>

В моем случае все клиенты были на Windows 7, поэтому расскажу только про настройки клиентов на винде.

Скачиваем софт — OpenVPN, устанавливаем, в случае с Windows 7 запускаем от имени администратора «Пуск\OpenVPN\OpenVPN Gui»
Далее создаем файл %имя%.ovpn со следующим содержимым

<code class="bash">push "redirect-gateway def1"
client 
dev tun 
proto udp 
remote <b>a.b.c.d</b> 1194 
resolv-retry infinite 
nobind 
persist-key 
persist-tun 
ca ca.crt 
cert <b>cli1.crt </b>
key <b>cli1.key</b> 
comp-lzo 
verb 3 
</code>
Вместо a.b.c.d — адрес сервера.

Складываем файл %имя%.ovpn и ранее полученные ca.crt cli1.crt cli1.key вC:/Programm files(x86)/OpenVPN/config
Вот и все, в трее правой мышью по значку OpenVPN -> Connect и нас переносит в другую страну.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


test.it — тестирование JavaScript или мой велосипед с вложенностью и подробным выводом

Картинка для привлечения внимания:
test.it habrahabr
Я — начинающий веб-разработчик. И не так давно мне захотелось научиться работать так, как это делают настоящие программисты.
Под этим я понимал 3 основных элемента:
  1. Использование системы контроля версий.
  2. Грамотное комментирование кода.
  3. TDD или хотя бы простое юнит-тестирование кода.
Для первого пришлось освоить азы git, и создать свой первый репозиторий на github. Для второго выбрал JsDoc, из-за которого пришлось перебраться с notepad++ на sublime text (только там был соответствующий плагин).
А вот с третьим, неожиданно для меня, возникли серьёзные трудности.


Так как я очень уважаю jQuery (кстати первый свой репозиторий я как раз и открыл для написания плагина для jq) выбор фреймворка для юнит-тестирования пал на Qunit что оказалось роковой ошибкой. И столкнулся со следующим:
  • Сбивается основная вёрстка из-за того что для работы Qunit надо вставлять немаленький кусок HTML кода на страницу. И все результаты тестов отображаются там же. Да это можно исправить костылями с position:absolute, opacity:.5 и подобными, но я не хочу бороться с фреймворком, я хочу им пользоваться
  • Тесты неоднозначны. Я несколько раз натыкался на случай, когда, нажимая F5, получал разное количество пройденных и проваленных тестов. А у меня в коде ни асинхронности, ни работы с куки, ни аякс-запросов. Если я правильно понимаю то это из-за киллер-фичи изменения последовательности тестов, в зависимости от предыдущего результата — проваленные тесты проверяются в первую очередь.
  • Fail тестов чрезвычайно ненагляден. qUnit практически всегда выводит toString() одного из переданных аргументов, игнорируя второй. Изредка выводит и второй, а бывают ситуации, когда правильно сработает diff. Я понимаю что diff — очень сложная функция, и стоит радоваться тому что она хоть иногда срабатывает, но что мешает Qunit выводить аргументы при каждом fail — для меня загадка.
Мне всё это весьма не нравилось, но осознание того, что большие дяди и тёти так работают, не давало мне опустить руки. Я надеялся, что когда завершу разработку своего плагина, мне откроется какой-то сакральный смысл всего того, с чем мне приходилось сталкиваться во время его тестирования. Неделю я кололся, плакал, но продолжал есть кактус, сражался с тяжёлой формой болезни я-знаю-как-надо. Но мои нервы не железные и, в конце концов, я расплакался как маленькая девочка сдался и написал свой велосипед.

А теперь о нём поподробнее
test.it — фреймворк для тестирования JavaScript кода.
Для тех, кому текст не интересен — ссылка на репозиторий на github: test.it
Основные особенности:
  • Для отображения результата используется консоль.
  • Последовательность тестов не изменяется.
  • В результаты всех тестов включён массив полученных аргументов.
  • Поддерживается группировка тестов без ограничений на уровень вложенности.
  • При возникновении ошибки внутри группы (например, в одном из тестов), она отлавливается и отображается в результате, не нарушив работу остального кода.
Последнее я подглядел у Qunit, в этом они, конечно, молодцы.

На текущий момент реализованы тесты на:
  • Равенство двух аргументов. Аналог ok из Qunit.
  • Не-ложный результат аргумента (не NaN,Null,undefined,0,false,[],'') другими словами — прохождение if(). Близкий аналог equal из Qunit.

Простое начало
Для того что бы подключить фреймворк — достаточно всего лишь добавить строку
<code class="html"><script src='path/to/testit.js'></script></code>
куда вам вздумается в конец тега <body>.

А начать использование можно, очевидно, с первого теста:
<code class="javascript">test.it('first test');</code>
Тест — функция (метод объекта test) которая проверяет выполнение какого-либо условия.
Функция test.it(entity) проверяет существование entity и не-ложность его значения.
Открыв консоль (Firebug или Chrome, как обладающие максимальной поддержкой данного API) мы увидим следующее:
пустая консоль
Не густо (:
А всё потому, что мы не завершили тест вызовом test.done(). Сделаем это. Теперь наш код выглядит так:
<code class="javascript">test.it('first test');
test.done();</code>
А в консоли соответственно:
root - pass
Что означает, что все тесты пройдены.

root — корневой элемент, или группа тестов нулевого уровня. Он обладает теми же свойствами что и любая другая группа, но о них будет подробнее чуть позже.
Если раскрыть элемент root мы увидим статистику прохождения всех тестов внутри него, и время их выполнения.
root
Очевидно что:
  • pass — количество пройденных
  • fail — количество проваленных
  • error — количество завершившихся ошибкой выполнения
Статистика разделена на тесты и группы. Но наверняка в ближайших релизах она упроститься, и это разделение пропадёт.

Последняя строка: pass: no comment — наш тест. Развернём его и посмотрим подробнее:
first test
Первым делом идёт метка о том, что тест пройден. Вообще они бывают трёх видов:
  • pass — пройден
  • fail — провален
  • error — завершился ошибкой, которая не повлекла за собой сбоя работы остального кода
    (например было передано 0 или >2 аргументов)
Далее no comment — комментарий, который мы ещё не задали. Чуть ниже рассмотрим, как это можно сделать.
Следующая строка «argument exist and not false» — описание того, что необходимо для прохождения теста.
И напоследок массив полученных аргументов, в нашем случае из одного элемента ?first test?

Что бы не видеть больше этого неприятного no comment, добавим к нашему тесту комментарий.
<code class="javascript">test.it('first test');
    test.comment('Простая проверка');
test.done();</code>
Теперь результат выглядит так:
простая проверка

Но все что мы только что писали, в принципе, ничего особо не тестировало. Давайте исправим ситуацию и добавим настоящий тест.
<code class="javascript">test.it('first test');
    test.comment('Простая проверка');
var Me = {name:'Titulus',lastName:'Desiderio'};
test.it(Me);
    test.comment('Я существую?');
test.done();
</code>
Теперь в консоли:
2 теста

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

Предыдущие тесты были успешно пройдены, давайте поставим задачу посложнее.
<code class="javascript">test.it('first test');
    test.comment('Простая проверка');
var Me = {name:'Titulus',lastName:'Desiderio'};
test.it(Me);
    test.comment('Я существую?');
test.it(Me.habr);
    test.comment('Хабр?');
test.done();
</code>
fail
Как вы заметили, проваленный тест, и соответствующая проваленная группа (root) были раскрыты по умолчанию.
Кстати, благодаря массиву аргументов, мы сразу видим, почему тест был провален — переданный аргумент не определён.

Теперь осталось исправить ситуацию:
<code class="javascript">test.it('first test');
    test.comment('Простая проверка');
var Me = {name:'Titulus',lastName:'Desiderio'};
test.it(Me);
    test.comment('Я существую?');
Me.habr = 'Хабрахабр!';
test.it(Me.habr);
    test.comment('Хабр?');
test.done();</code>
И вновь старая картина!
root - pass

Давайте ещё усложним задачу. Вместо проверки на существование и не-ложность, проверим на правильность значения.
<code class="javascript">test.it('first test');
    test.comment('Простая проверка');
var Me = {name:'Titulus',lastName:'Desiderio'};
test.it(Me);
    test.comment('Я существую?');
Me.habr = 'Хабрахабр!';
test.it(Me.habr);
    test.comment('Хабр?');
test.it(Me.habr,'habrahabr.ru');
    test.comment('адрес хабра');
test.done();
</code>
функция test.it(entity1, entity2) — проверяет равенство между entity1 и entity2.
Посмотрим в консоль:
Хабрахабр! != habrahabr.ru
Тест провален, чего и следовало ожидать. Глядя на результат, причина провала вполне очевидна. Исправив
<code class="javascript">Me.habr = 'Хабрахабр!';</code>
на
<code class="javascript">Me.habr = 'habrahabr.ru';</code>
Мы опять получаем
root - pass

Need to go deeper
Разберёмся в упомянутых ранее группах.
Группа
  • набор тестов (или групп);
  • метод объекта test который этот набор создаёт;
  • собственно сам этот набор в виде JavaScript-объекта.
    Помимо массива тестов и групп он несёт в себе статистику пройденных, проваленных и вызвавших ошибку тестов (или групп), а так же время, потраченное на их выполнение.

Рассмотрим следующий код:
<code class="javascript">test.it(2>1);
    test.comment('Работают ли тут законы математики?');
test.group('первая группа',function(){
    test.it(2>1);
        test.comment('А тут?');
});
test.done();</code>
С test.it(2>1); и так всё понятно, но что делает test.group?
Функция test.group(groupname, fun) — создаёт новую подгруппу для тестов, других групп и прочего кода. Имя берётся из аргумента groupname. А функция fun будет пытаться выполниться, и если внутри неё произойдёт ошибка — это не прервёт работу остального кода. Ошибка будет помещена в поле error данной группы.

Раскроем root:
группа
Вот она наша группа первая группа, оформлена так же как root, только имя то — что мы задали.
Раскроем и её.
первая группа
Никаких особых отличий от root нет и быть не должно.
Тут стоит только обратить внимание на статистику в root и в нашей группе.
! Важный момент: статистика отображает только результаты на данном уровне. Пусть у нас и написано 2 тест, но у root в статистике тестов виден только один пройденный.

Добавим туда ещё пару-тройку тестов.
<code class="javascript">test.it(2>1);
    test.comment('Работают ли тут законы математики?');
test.group('первая группа',function(){
    test.it(2>1);
        test.comment('А тут?');
    test.it(1, Number(1));
        test.comment('равна ли еденица самой себе');
    test.it(h.a.b.r);
        test.comment('А что ты сделаешь с несуществующим аргументом?');
    test.it(2+2,4);
        test.comment('проверим на знание школьного курса');
});
test.it(1<2);
    test.comment('А теперь?');
test.done();</code>
И увидим
ошибка
что тест на 2+2=4 даже не был запущен, потому что предыдущий с h.a.b.r не был выполнен из-за ошибки ReferenceError, которая была аккуратно выведена под статистикой, до тестов. Но при этом последний тест на 1<2 — проходит, потому что он был вне группы, с ошибкой.

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

И последний момент касательно групп. Многоуровневая вложенность!
need to go deeper
<code class="javascript">test.group('need',function(){
    test.group('to',function(){
        test.group('go',function(){
            test.group('deeper',function(){
                test.it('bye habr');
                    test.comment('bye bye');
            });
        });
    });
});
test.done();</code>
многоуровневая вложенность

Под капотом
Весь код доступен на github, так что можете его читать, комментировать, форкать, предлагать пуллреквесты и т.п. Лицензия MIT, хотя подумываю о переходе на WTFPL.

Хотел остановиться подробнее на test.root — объект соответствующий группе нулевого уровня. Именно его заполняют тесты, а потом уже _printConsole() его парсит и наводит всю эту красоту.
test.root для первого примера с группами:
<code class="javascript">{
    "type": "group",
    "name": "root",
    "status": "pass",
    "time": 7,
    "result": {
        "tests": {
            "passed": 1,
            "failed": 0,
            "error": 0,
            "total": 1
        },
        "groups": {
            "passed": 1,
            "failed": 0,
            "error": 0,
            "total": 1
        }
    },
    "stack": [
        {
            "type": "test",
            "status": "pass",
            "comment": "Работают ли тут законы математики?",
            "description": "argument exist and not false",
            "time": 0,
            "entity": [
                true
            ]
        },
        {
            "type": "group",
            "name": "первая группа",
            "status": "pass",
            "time": 1,
            "result": {
                "tests": {
                    "passed": 1,
                    "failed": 0,
                    "error": 0,
                    "total": 1
                },
                "groups": {
                    "passed": 0,
                    "failed": 0,
                    "error": 0,
                    "total": 0
                }
            },
            "stack": [
                {
                    "type": "test",
                    "status": "pass",
                    "comment": "А тут?",
                    "description": "argument exist and not false",
                    "time": 0,
                    "entity": [
                        true
                    ]
                }
            ]
        }
    ]
}</code>

Кстати да. мне очень стыдно, но есть часть стороннего кода — функция deepCompare() не доступная извне. Она сравнивает два аргумента любых типов. Взял её тут.

И большой спасибо mkharitonov за подсказку в реализации многоуровневой вложенности.

Обратная сторона медали
Конечно, есть недостатки. Некоторые серьёзные, некоторые не очень. Надеюсь, раз код opensource, сообщество поможет мне их минимизировать, или превратить в достоинства.
Ключевые:
  • Не кроссбраузерно. Console API толком поддерживают только Google Chrome (и прочие на основе chromium) и плагин Firebug под firefox. Говорят ещё Safari, но у меня нету устройств Apple для проверки.
  • Нет возможности запустить отдельно одну группу тестов.
    Есть костыль — ставить test.done() не в конце всего кода, а в конце той группы, которую надо протестировать. Но это костыль, и он не обладает всем необходимым функционалом.
    решаемо
  • На текущий момент нету diff, и это решаемо.
  • Нет тестов на ajax, и это опять же решаемо.

Что дальше?
А дальше будут названные выше изменения вывода статистики.
Улучшения обработки и вывода ошибок.
Улучшения вывода тестов — добавятся нумерация и подсказки для проваленных тестов.
Добавятся новые тесты test.them, test.type, test.types, test.time. О них подробнее можете прочитать в README.
Будут исправляться недостатки, названные в предыдущем разделе.
И, конечно же, оптимизация.

Ещё раз ссылка на репозиторий на github: test.it

P.S. Пост будет перенесён в хаб «Я Пиарюсь», как только наберу достаточно кармы.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Роспотребнадзор хочет банить сайты самостоятельно

Нынешняя система блокировки «опасных» сайтов в Рунете действует не слишком эффективно, считает Федеральная служба по надзору в сфере прав потребителей и благополучия человека (Роспотребнадзор). Например, после 1 ноября 2012 года блокировано 2038 ресурсов, содержащих информацию о способах самоубийствах либо призывы к совершению самоубийства. Но ситуация с вредоносным контентом в интернете «существенным образом не изменена», признаёт Роспотребнадзор.

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

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

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

Существующая система предполагает лишь работу по обращениям граждан, поступающим через интернет-портал (http://zapret-info.gov.ru/feedback/). Таким образом, ответственность за наличие сайтов суицидальной направленности в сети Интернет возлагается исключительно на гражданское общество, что абсолютно недопустимо с точки зрения целей и задач государства, реализуемых органами государственной власти – защиты прав граждан, в том числе на жизнь и здоровье. В связи с этим, необходимо внести изменения в действующие правовые акты, и дать возможность уполномоченным органам осуществлять полноценный надзор — самостоятельно выявлять запрещенную информацию, принимать решения о запрете к ней доступа.

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

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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Коротко о новом: Samsung запускает в массовое производство первые модули памяти LPDDR3 объемом 3 ГБ

Добрый день, Хабр!

Samsung поставила на поток производство модулей памяти LPDDR3 для мобильных устройств, которые обладают самым большим объемом (3 ГБ) среди конкурентов на рынке. Это стало известно на прошлой неделе: компания вновь оказалась «впереди планеты всей» в техническом и технологическом плане. В серийную штамповку ушли первые в индустрии трехгигабайтные образцы маломощной мобильной DRAM-памяти третьего поколения с удвоенной скоростью передачи данных. До настоящего времени самые современные смартфоны и планшеты базировались на 2 ГБ модулях… что ж, настало время для очередного рывка и смены стандартов.



В основе новых модулей мобильной DRAM-памяти лежат шесть 4-гигабитных LPDDR3 чипа, созданные по 20-нм тех. процессу и собранные воедино в симметричной структуре двух сетов по три чипа в каждом. Общая толщина получившейся «пачки» составляет всего 0,8 миллиметра. Новая ультратонкая память, несомненно, позволит будущим мобильным устройствам и дальше продолжать «худеть», освобождая больше места, например, под аккумулятор, ресурса которого вечно не хватает. Скорость передачи данных новой памяти при этом доходит до 2133 Мбит/сек на контакт.

Увеличение мощности мобильной DRAM позволит в полной мере развернуться в таких ресурсоемких процессах, как просмотр видео высокой четкости, многозадачность, игры и прочие медиа-радости. Кроме того, столь впечатляющие показатели скорости обработки данных новых модулей LPDDR3 внушают веру в то, что передовые стандарты мобильной связи 4G и LTE-A получат полноценную поддержку.

Новая 3-гигабайтная LPDDR3 DRAM соединяется с мобильным процессором приложений при помощи двух симметричных каналов передачи данных, каждый из которых подключен к части хранилища объемом 1,5 ГБ. Симметричная структура не только позволяет избежать потерь производительности, которые могут наблюдаться в несимметричных потоках данных, но и максимизировать производительность на системном уровне.

Учитывая, что емкость DRAM-памяти среднестатистического домашнего ПК составляет 4 ГБ, столь серьезный рывок в производительности мобильной оперативки позволит значительно сократить разрыв между возможностями ПК и мобильных устройств недалекого будущего.

Таким образом, Samsung теперь может предложить самый широкий спектр DRAM-памяти емкостью от 1 до 3 ГБ. Новые чипы памяти станут использоваться в самых современных смартфонах уже во втором полугодии 2013. С 2014 года они станут применяться в более широком перечне мобильных устройств.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Функция LIPA в сетях LTE

Добрый день
В данной статье я хочу рассказать о функции LIPA.

Введение

LIPA (Local IP Access) — это новая функция, которая появилась в 3GPP Release 10. Эта функция связана с работой так называемых Home eNodeB — LTE фемтосотами. Основной идеей функции LIPA является предоставление возможности мобильной станции подключаться к HeNB и получать доступ к ресурсам локальной/корпоративной сети без необходимости передавать пакеты по сети оператора

Без использовании функции LIPA, пользовательский трафик идет по этому маршруту (пользовательский трафик обозначен пунктиром)
image
При использовании функции LIPA, трафик пойдет по этому машруту
image

На этой схеме, как вы видите, появился новый элемент — LGW (Local Gateway), который необходим для реализации LIPA функционала. Перед тем, как перейти к описанию процедуры подключения с использованием LIPA, еще немного теории.

Home eNodeB
HeNB — LTE фемтосота, которая подключается к MME (S1-MME интерфейс), SGW (S1-U интерфейс) и LGW.

HSS
Для каждой APN в подписке мобильной станции в HSS добавляется параметр — LIPA_Permission, который имеет следующие значения:

  • LIPA-Prohibited (0) — для данной APN функция LIPA запрещена
  • LIPA-Only(1) — этот APN используется только для LIPA сессий
  • LIPA-Conditional (2) — этот APN может использоваться для активации, как обычных, так и LIPA сессий

Local Gateway (LGW)
Дополнительное устройство, которое подключается к HeNB для реализации LIPA функционала. Этот элемент представляет собой упрощенную версию PGW и выполняет следующие функции:

  • Выделение IP адреса мобильной станции
  • Функции DHCPv4 и DHCPv6 сервера
  • Функция проверки пакетов (Packet Screening)
  • Функции, которые описаны в RFC 4861

Также LGW должен уметь буферизовать DL пакеты для мобильной станции, которая находится в состоянии ECM-IDLE (Network Initiated Service Request) и создавать GTP туннель между собой и HeNB для передачи данных.
Как видно из схемы, LGW подключается к SGW (S5 интерфейс), к HeNB и к внешней сети (SGi интерфейс)

Процедура активации LIPA сессии

Рассмотрим процедуру активации LIPA сессии. Всю процедуру подключения я описывать не буду, а только остановлюсь на моментах, характерных для LIPA.

  1. Мобильная станция шлет в сторону HeNB запрос на подключение (Attach Request)
  2. HeNB обрабатывает этот запрос и ретранслирует его в MME через S1-MME интерфейс. При этом если HeNB подключен к LGW (а это необходимо для LIPA), то он в запрос помимо остальных полей добавляет поле GW Transport Layer Address, в котором указывает адрес Local GW для S5 интерфейса.
  3. MME получает запрос на подключение от HeNB и отправляет запрос в HSS. HSS присылает данные подписки абонента. MME проверяет наличие поля LIPA_Permission для APN, к которой хочет подключиться абонент. Если этого поля нет или его значение равно LIPA-Prohibited, то MME считает, чтобы мобильная станция активирует обычную сессию. Если поле LIPA_Permission = LIPA-Only, то MME «понимает», что мобильная станция хочет активировать LIPA сессию. Есть еще третье значение — LIPA-Conditional. Это значение обрабатывается по следующему алгоритму: если в запросе от HeNB указано поле GW Transport Layer Address, то данная сессия будет обрабатываться как LIPA сессия. В противном случае — обычная сессия
  4. Следующим этапом — это выбор SGW и PGW, которые будут использоваться для данной сессии. SGW выбирается при помощи DNS на основе данных о текущем местоположении абонента (MNC, MCC, TAC). PGW выбирает на основе APN, к которой подключается мобильная станция. В случае активации LIPA сессии в качестве адрес PGW используется адрес LGW, который прислал HeNB (см. п. 2)
  5. MME отправляет SGW сообщение Create Session Request, в котором помимо остальных полей, указывает адрес PGW = адресу LGW.
  6. SGW получает сообщение, выполняет необходимые операции и ретранслирует это сообщение PGW, т.е LGW, подключенному к HeNB.
  7. LGW обрабатывает запрос и отправляет SGW ответ, который содержит IP адрес, который необходимо присвоить мобильной станции.
  8. SGW ретранслирует этот запрос MME. MME выполняет необходимые операции, и отправляет сообщение Initial Context Setup Request в сторону HeNB, в которое добавляет специальное поле Correlation ID, которое содержит идентификатор LIPA сессии. Обычно, в качестве Correlation ID используется идентификатор GTP туннеля на стороне LGW.
  9. HeNB получает это сообщение, присваивает этот идентификатор текущему подключению мобильной станции и создает GTP (или PMIP) туннель между собой и LGW.
  10. Далее идут стандартные операции для E-UTRAN Initial Attach.

Теперь мобильная станция начинает генерировать трафик. Пакеты попадают в HeNB, который, видя, что данной сессии соответствует определенный Correlation ID, транслирует пакеты не в сторону SGW (как при обычной LTE сессии), а в сторону LGW, который в свою очередь передает их во внешнюю сеть. Тем самым мобильная станция может обмениваться данными с внешней сетью без необходимости передавать пакеты через всю EPC сеть оператора.

Стоит отметить, что на данный момент LIPA имеет следующие ограничения:

  • Отсутствие интерфейса между LGW и PCRF
  • Отсутствует поддержка «мобильности»: т.е если мобильная станция хочет подключиться к другой базовой станции или фемтосоте, то текущее соединение удаляется полностью, и мобильная станция вынуждена заново повторить процедуру подключения. Если при этом у мобильной станции были активные сессии, то они будут закрыты
  • Не поддерживаются Dedicated Bearers

Спасибо за внимание



Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Анонс вебинара. Разработка Windows Phone/.NET приложений на платформе «Backendless»

Backendless позволяет разрабатывать приложения в два раза быстрее, предлагая сервисные АПИ и отказоустойчивую, масштабируемую серверную инфраструктуру, готовую к работе с самого старта.


Вебинар посвящен АПИ Backendless, которые доступны для Windows Phone и .NET клиентов. Разработчики, создающие Windows Phone или .NET приложения, увидят подробный функциональности платформы и способы ее применения в .NET разработке.

Приглашаем каждого на одночасовой вебинар, на котором мы покажем на конкретных примерах как бесплатно запустить свой готовый бэкенд для мобильного или десктопного приложения. В обзоре:
• поддержка версионности приложения;
• управление (+ аутентификация) пользователями;
• реляционные данные;
• push-уведомления (+ publish/subscribe сообщения);
• хранилище контента;
• гео-локация;
• и многое другое.

Дата и время: вторник — 6 августа, 22:00 по Московскому времени. Регистрация здесь.

(Для подключения используйте ссылку, которая к вам придет после регистрации.)

Убедитесь, что разрабатывать приложение можно без скучных задач, заранее скачав и проверив СДК для WinPhone/.Net. Ждем всех на вебинаре с подготовленными вопросами.

Запросы по теме (и не по теме) оставляйте в комментариях или присылайте на community@backendless.com.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Привлечение аудитории — партнерская программа своими руками

image
Привет, Хабр! Эта статья — первая в нашем буручном блоге.

Мы делаем метапоиск авиабилетов buruki.ru с человеческим лицом. Здесь мы будем делиться техническими и психологическими открытиями, которые мы совершаем каждый день в работе над проектом.

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


Зачем вообще нужна партнерская программа моему сервису?

Этот вопрос особенно актуален на Хабре, здесь подавляющее большинство аудитории — технари, слабо разбирающиеся в тонкостях маркетинга и душевной организации покупателей.

В крутой стартап не всегда можно с первого дня взять маркетолога, рекламщика, пиарщика и т.д. Зато запустить свою партнерскую программу и отдать вопрос привлечения аудитории профессионалам или самим пользователям — легко. Именно так поступили ребята из Dropbox — за каждого приведенного друга вы получали 500 Мб дополнительной квоты и это работало на партнерской программе, принципы которой описаны ниже.

Благодаря активной ПП, вы приобретаете дополнительный источник трафика, который не только приводит целевых посетителей, но и положительно влияет на все стороны жизни проекта:
  • фидбек от тех, кто привлекает посетителей;
  • фидбек от самих посетителей (некоторые категории вы, возможно, сами бы не нашли);
  • положительное влияние различных источников трафика на ранжирование в поисковиках.

Что должно быть в партнерской программе?

В движке любой ПП есть четыре основных модуля:
  • система учета пользователей, назначение кук и разделение источников;
  • биллинг — все, что связано с деньгами (или другими бонусами пользователям);
  • сбор и представление статистики;
  • промо-материалы для партнеров, позволяющие эффективно продвигать ваш продукт.
Разберем каждую систему отдельно.

Учет пользователей
Задача этой подсистемы — точно разделять пользователей, понимать источники трафика, относить каждый переход к определенному партнеру и следить за тем, чтобы куки не протухали.

Учет пользователей должен работать максимально „высоко“ в системе. До того, как начнется бизнес-логика вашего приложения, вы уже должны точно знать, что это за пользователь — пришел он с поисковика или с партнерского сайта.

buruki.ru сделаны на Django, поэтому мы используем отдельную middleware, которая отвечает за обработку любого входящего запроса. Middleware проверяет, был ли уже пользователь у нас на сайте, пришел ли он по реферальной ссылке, есть ли у ссылки дополнительные параметры и т.д.

Определяем, кто на этот раз привёл посетителя
<code class="python">ref = request.GET.get('ref')

if not ref:
    # Если ref пустой, создаём или забираем из базы
    # фейкового реферера на основе хоста.
    http_referer = request.META.get(
        'HTTP_REFERER',
        'http://direct.com'
    ).replace('http://www.', 'http://')

    ref_host = urlparse(http_referer).hostname

    referer = get_object_or_None(Referer, ref_code=ref_host)
    if referer is None:
        if not ref_host:
            # Если ref_host пустой, то возьмём реферера
            # с ref-кодом “direct.com”, который уже лежит в базе.
            ref_host = 'direct.com'
        else:
            # Если ref_host есть, то создаём нового реферера.
            # Указываем время жизни кук.
            Referer.objects.create(
                name=ref_host,
                ref_code=ref_host,
                activated=True,
                cookie_lifetime=30
            )
    ref = ref_host

# Забираем из базы реферера по ref-коду,
# который к этому моменту или взят из GET-параметра,
# или из HTTP_REFERER, или равен “direct.com”.

try:
    # Если всё прошло как надо, то получаем объект реферера.
    referer = Referer.objects.get(ref_code=ref, activated=True)
except Referer.DoesNotExist:
    # Если его вдруг не оказалось, то логируем это и выходим
    # из middleware.
    log.warning('Referrer is not found: ref_code=%s' % ref)
    return
</code>

Минимальный набор информации, который необходимо хранить о каждом пользователе:
  • user_id — уникальный id;
  • created — время создания пользователя (+ выставление кук, минимум протухания для ПП — 15 дней, обычно 30);
  • referer_url — Источник перехода (мы сохраняем полный URL первого и последнего захода на сайт);
  • referer_id — партнерский аккаунт, с которого перешел пользователь (определяется по ref-параметрам ссылки). Сразу можно завести фейковые referer’ы, чтобы считать эффективность собственных источников трафика ( контекстная , конкурсы, статьи на Хабре :-) );
  • label — произвольная строка, которую ваши партнеры будут задавать в ссылке, чтобы самим разделять свои источники трафика и видеть в статистике эффективность разных подходов (например, так можно узнать что лучше работает — баннер в шапке блога или в сайдбаре);
  • ua_string — user-agent пользователя — будет полезен в статистике;
  • user_ip — eсли возможно — IP (должно быть прописано в политике конфиденциальности).
Когда вы будете реализовывать подобный middleware для вашего проекта — обязательно столкнетесь с вопросом — если один и тот же пользователь пришел от разных referer’ов — кому отнести этого пользователя? Ответ на этот вопрос зависит от специфики проекта. Мы для себя выбрали ответ — «кто последний, тот и папа». Referer, который последним довел пользователя до покупки, тот и получает вознаграждение.
Определяем, что же всё-таки делать с посетителем
<code class="python">visitor = get_object_or_None(Visitor, pk=visitor_id)

# Создаём нового визитора если, ...
create_visitor = (
    # ... visitor_id не пустой, но в базе посетителя нет.
    # Ненормальная ситуация.
    visitor is None

    # ... пользователя привёл новый реферер,
    # и старый при этом неактивен, или новый реферер — настоящий.
    # Ненастоящий реферер — это, например, Гугл или Яндекс.
    or (visitor.referer != referer and (referer.real or not visitor.referer.activated))

    # ... куки протухли.
    or (visitor.referer_expire and visitor.referer_expire < datetime.now())
)

# Если not create_visitor, то обновляем старую запись.
</code>

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

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

Сбор и предоставление статистики
Статистика — is a king. Статистика нужна вам, чтобы понимать как работает ваш проект, как работает партнерская программа. Статистика необходима партнерам, чтобы приводить к вам максимально эффективный трафик, экспериментировать с источниками, пробовать разные стратегии.

Статистика должна давать вам и партнерам точный ответ на главный вопрос — сколько стоит (или какой доход приносит) каждый приведенный посетитель, совершивший целевое действие.

В зависимости от специфики вашего проекта, целевые действия могут быть такими:
  • регистрация (самое простое);
  • продажа или отложенная продажа (когда заказ трансформируется в продажу через какой-то промежуток времени; экстремальный случай — наложенный платеж через Почту России. Почта России — всегда экстрим);
  • достижение какой-то цели на сайте. (например, уровень прокачки героя в онлайн игре, приобретение премиум аккаунта, отправка анкеты).
Статистика должна предоставлять большое кол-во информации, максимально охватывая воронку конверсии.

В нашем случае мы показываем партнеру всю информацию о пользователях:
  • Количество привлеченных пользователей;
  • Количество поисков авиабилетов;
  • Количество переходов в бронирование;
  • SPV — кол-во поисков на посетителя;
  • СPV — кол-во переходов в бронирование на посетителя;
  • CPS — кол-во переходов в бронирование на один поиск;
  • Кол-во сделанных и оплаченных бронирований (общее и в процентах);
  • Наверное, самое главное — на одного посетителя, на один поиск, на один переход в бронирование (EPV, EPS, EPR).
Цифр действительно много, естественно, многие из них связаны математически. Но мы убедились на своём опыте, что необходимо показывать все возможные значения. Не редко, изменения на сайте влияют на несколько параметров и статистика сразу дает полную картину.

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

Еще раз — статистика, это очень, очень важно. И для вас и для партнеров.

Промо-материалы
Промо материалы — это то, чем партнеры будут завлекать пользователей к вам.

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

Основные виды промо, большинство из которых мы уже реализовали:
  • ссылки и deeplinks (ссылки на конкретные продукты, лендинги, разделы). Самый простой инструмент, подходит для большинства задач. Если у вас длинные ссылки — не забудьте дать возможность использовать сокращалку;
  • баннеры — обычные и флеш. Основные форматы — 240x400, 460x60, 200x200;
  • — интерактивные блоки с вашими предложениями, результатами работы сервиса. Быстрая доставка самых ценных предложений;
  • whitelabel — возможность установить всю или часть функциональности вашего сайта на внешний сайт. Мы, например, специализируемся на авиабилетах, а отельную составляющую берем от HotelsCombined — hotels.buruki.ru. Кстати, HotelsCombined, пожалуй, лучший метапоисковик отелей — сделан нашим бывшим соотечественником;
  • из новенького — для привлечения трафика из соц. сетей полезно иметь генераторы подборок. То, что может заинтересовать пользователей. У нас это подборки низких цен на различные направления перелетов;
  • API — для крутых перцев. Максимальный доступ к функционалу вашего сервиса.
Важно не забыть, что урлы, с которых вы отдаете виджеты или фреймы на сторонние сайты, не должны учитываться в статистике. Иначе все посетители внешнего сайта могут быть ошибочно зачтены как привлеченные пользователи.

Итого

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

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[RSS-пост] Прощание с Ильёй Сегаловичем

Несколько дней назад скончался основатель и директор по технологиям Яндекса, автор первой версии поисковика и слова Yandex Илья Сегалович.

Прощание состоится завтра, 1 августа, на Троекуровском кладбище с 10:00 до 13:00. Для всех, кто хочет проститься с Ильёй, будет организован трансфер от метро «Славянский бульвар»: автобусы начнут ходить по маршруту с 9:30. В вестибюле станции и рядом с метро вы увидите волонтёров в футболках Яндекса — они подскажут, как пройти к автобусам.

Мест для парковки около кладбища не будет, поэтому просим вас пользоваться этими автобусами.

Во время церемонии просим воздержаться от фото- и видеосъёмки в зале прощания..

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Перевод] Кто такой этот продакт-менеджер?

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

Основной обязанностью продакт-менеджера является: Помогать своей команде (и компании) доставлять необходимый продукт своим потребителям.

Если разбить этот процесс на более мелкие составляющие:

1. Помогать своей команде

Лучшие продакт-менеджеры тратят все свое время на самые приоритетные вещи, которые помогают работе их команды.

Главным образом, это касается: (а) координации – необходимо убедиться в том, что команда эффективно планирует, принимает решения и работает сообща с четко поставленными целями и задачами; а также (б) взаимодействия – заботы о том, чтобы каждый понимал, что происходит, когда и почему, особенно сейчас, в условиях неизбежных перемен.
Сноска«Под «командой» я подразумеваю определенное количество людей, работающих совместно как над разработкой самого продукта, так и всех остальных, участвующих в его продвижении, включая дизайнеров, инженеров, работников по обеспечению качества и отвечающих за техническую документацию, а также отделы маркетинга, развития клиента, технической поддержки, юридический т.д.
Многие считают, что продакт-менеджер это исполнительный директор или тот, кто «пишет» спецификацию; однако я думаю, что подобное мнение искажает влияние и полномочия продакт-менеджера. Лучшие команды создают такие рабочие условия, при которых команда ощущает свою причастность к проекту, и где каждый вносит свой вклад и имеет возможность озвучить свои предложения и идеи. Лучшие продакт-менеджеры координируют принятие ключевых решений задействовав каждого члена команды, они несут ответственность за выявление разногласий, устранение простоев, и нахождение общего решения (или по крайней мере убедиться в том, что все вовлечены в процесс). Это вовсе не означает, что нужно делать то, что продакт-менеджер считает правильным. Я не хочу сказать, что у продакт-менеджеров не должно быть собственных хороших идей, но цель заключается не в том, чтобы найти команду, которая просто выполняет, что им было сказано. Вместо этого, лучшие продакт-менеджеры строят процесс на основе совместного принятия решений, в котором задействованы все члены команды.

С тактической точки зрения, помощь вашей команде часто заключается в том, чтобы записывать и резюмировать заметки после долгого совещания, или написание спецификации, которая отражает в письменной форме согласованные и запланированные командой действия. Частенько замечал, что написание хорошего отчета может занять больше времени, чем само совещание. И, зачастую, работать вместе с людьми из вашей обширной команды означает собирать фидбеки, делиться планом действий, делать все, чтобы никакие препятствия или ловушки не позволяли команде сворачивать с намеченного пути — доставлять продукт потребителю. В Twitter’е мы называли это «вовлеченность всех групп в расширенную команду «ACT SOLID»
ACT SOLIDСокращение от Аналитика (Analytics), Коммуникации (Communications), Надежность/доверие (Trust), отделы Поддержки (Support), Операций (Ops), Юридический (Legal), Международный (International), Дизайнерский (Design).
В то время, как инженеры пишут код, а дизайнеры разрабатывают внешний вид и графику, продакт-менеджеры не придают осязаемых характеристик конечному продукту. Однако, в конечном счете, я верю, что успех команды и продукта зависят от эффективности продакт-менеджеров.

2. (и компании)

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

3. доставлять

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

4. необходимый продукт

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

Что еще важнее, как только доставка состоялась, лучшие продакт-менеджеры могут выяснить, является ли доставленный продукт «тем самым». Они должны тесно взаимодействовать с командой с тем, чтобы убедиться в измеримости основных характеристик продукта, а также в том, что можно получить ответы на нелегкие вопросы о том, пользуются ли люди на самом деле продуктом или нет. После того, как продукт доставлен, они тщательно изучают полученные данные и помогают команде выяснить, какие части работают, а какие нет; затем совместными усилиями быстро разрабатывают план по улучшению и дальнейшим испытаниям.

5. своим потребителям

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

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

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

Кто разделяет основные принципы, изложенные в данной статье, — напишите в личку. Нам нужны такие люди в команду Яндекс.Браузера.

Перевод выполнен в рамках летней школы стартапов Tolstoy Summer Camp и проекта MetaBeta.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Идея и реализация простого средства контроля расхода энергии аккумуляторов

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

Отмечу сразу, что разговор пойдет о методе контроля расхода ампер-часов путем интегрирования по времени мгновенного тока разряда, а методы контроля, связанные с измерением ЭДС или напряжения батареи под нагрузкой, вместе со всеми их достоинствами и недостатками, оставим за скобками.

Еще однин момент — идея была реализована несколько лет назад, когда еще не было простой возможности заказать на ebay приборы контроля состояния силовой установки (например, для электромобилей). Сейчас они существуют и могут быть заказаны на ebay или aliexpress, но пока еще достаточно дороги. В то время выбора у меня не было, поэтому решил сделать устройство сам.

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

И тут меня осенило — существует готовый прибор, способный сильно упростить задачу — велокомпьютер! Действительно, стоит лишь преобразовать ток в частоту импульсов (в воспринимаемом велокомпьютером диапазоне), как вместо мгновенной скорости (км / ч) мы получаем текущий ток потребления (А), а вместо пройденного пути (км) — как раз расход в А * ч — то есть, то, что нам нужно! Остальные функции большинства велокомпьютеров нам не сильно нужны, но, например, время в поездке может пригодится и в лодке, а максимальная скорость соответствует пиковому потреблению тока (так, для любопытства). В итоге — подключаем полностью заряженный аккумулятор к лодочному мотору, сбрасываем на велокомпьютере путь за поездку — и вперед! Смотрим на пробег в км — когда он начинаем приближаться к половине заявленной емкости батареи — значит, пора назад.

Возможность использовать готовые средства интегрирования и индикации меня настолько воодушевили, что я немедленно наваял преобразователь напряжение-частота на тогда еще популярном ATTiny15. В качестве измерительного шунта выступал отрезок провода с сопротивлением 1 миллиом. С учетом разрешающей способности встроенного в tiny АЦП (включая подключаемый программно дифференциальный предусилитель) устройство получило возможность измерять токи с дискретностью в 0.5А в диапазоне 0-50 Ампер, причем без всяких внешних схем (кроме стабилизатора питания 5V). Устройство быстро собрал в подвернувшемся корпусе и плате от датчика удара какой-то сигнализации: image

Коэффициент преобразования устройства был запрограммирован как 1Гц/А. Для того, чтобы велокомпьютер учитывал ампер-час, как пройденный километр, его нужно было запрограммировать на такую длину окружности колеса, чтобы 3600 его оборотов (то есть импульсов с преобразователя) давали путь в 1000 метров. То есть, на 278 мм.

Грубая калибровка устройства производилась изменением точки подпайки измерительного вывода к шунту, а точная — изменением расчетной длины окружности колеса в велокомпьютере. Идея была проверена при катании на лодке на озере, оказалась полностью работоспособной, но со временем электрические прогулки (я не рыбак) с необходимостью тащить мотор и аккумулятор, уступили место простым весельным, и устройство было заброшено. Вспомнил же я о нем по просьбе друга, недавно купившего прекрасный полнораздядный Li-Fe-Po аккумулятор к своему лодочному электромотору.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[recovery mode] MakeCloud: что нового

Провели ряд обновлений IaaS-платформы в сервисе Make Cloud, внедрили новые фичи и исправили ошибки.
Что мы сделали:

• Сократили время создания виртуальной машины на *nix ОС до минуты и до 5 минут на MS Windows Server с помощью внедрения продвинутой системы кэширования и использования технологии copy-on-write.

• Внедрили гибкую настройку маршрутизации. Настройка осуществляется с помощью выбора бесклассовых маршрутов для подсети, далее сервер по dhcp получает IP-адрес и вместе с ним прописывает маршруты. Маршрутизацию можно прописать как при создании подсети, так и при редактировании существующей Обновление адресов происходит раз в 2-3 минуты.
image
• Внедрили возможность переноса виртуальной машины «на горячую» между подсетями, путём изменения настроек в форме редактирования сетей сервера.
image
image
• Установили новую версию распределённой файловой системы, что позволяет повысить скорость работы и бэкапирования. Заодно новая версия кластерной ФС позволила исправить ошибки, которые в некоторых случаях могли привести к зависанию ВМ.
• Обновили базовую ОС и систему виртуализации.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Электронная визитка

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


Что есть сейчас...

Есть обычные визитки, к которым мы все привыкли. Бумажный(в некоторых случаях пластиковый) прямоугольник с контактной информацией.
В последнее время на визитках стали появляться QR-коды, которые ускоряют обработку визиток, но судьба практически у всех визиток одна — все они в конечном итоге попадают в мусор — их теряют, забывают, выбрасывают за ненадобностью.
Цель у всех визиток одна — быстрый минимумом контактной информации, чтобы в дальнейшем продолжить общение.

Визитки кончились, что дальше...

Итак, визитки кончились, контактами обменялись на клочке бумаги, который неудобно хранить, трудно обрабатывать, легко случайно потерять(так как не похож на «важный документ»). Но если все визитки попадают в мусор, то зачем их вообще раздавать? Зачем тратить бумагу? Почему бы не сделать «электронную визитку»?
Выбор сразу почему-то остановился на RFID-картах, причём на именно на картах Mifare. Хотя конечно не сразу и не почему-то, а были следующие размышления:
1. Удобный обмен данными с мобильными устройствами, телефоны с поддержкой NFC, в дальнейшем визитку может заменить сам телефон;
2. Карта позволяет хранить информацию на карте, не только ID-, но и другую (Mifare Classic может хранить 1Kb информации);
3. Традиционно, визитка — это прямоугольник с контактами, и наверное он таким и должен оставаться какое-то время, просто необходимо немного поменять способ обмена информацией;
4. Технология NFC набирает обороты, и всё больше устройств появляется с поддержкой NFC;
5. Стоимость карточки Mifare Classic невысокая.
Итак, получаем прямоугольную карту, на которую:
1. Можно нанести визуальную информацию, как и на традиционную визитку (в том числе и QR-код);
2. Внутрь карты можно записать контактную информацию, которая будет быстро считана и обработана устройстом, и саму карту нет необходимости отдавать;
Из недостатков:
Пока небольшое распространение устройств с NFC.

Первые эксперименты

Приобретя карту Mifare Classic? очень быстро получилось записать на неё необходимую информацию (так как была под рукой Arduino + NFC Shield, то делал через него).
Ввёл определённое тэгирование информации:
image
Возможно защитить карту от записи, что не позволит злоумышленникам быстро «испортить» карту.
Нанёс на карту изображение. Визитка готова.

Ближайшие планы

Сейчас пишу приложение под Android, которые будет считывать информацию с карты и заносить эту информацию в контакты телефона.
В ближайших планах сделать приложение под Windows, для удобной записи и проверки информации с карты.
Продумать обмен информацией без карточки, просто между двумя телефонами, при этом используя опять же NFC для унификации решения.

В качестве заключения

Что думаете по поводу идеи?
Насколько это будет удобно?

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Win64/Expiro – кроссплатформенный файловый инфектор

Файловые уже хорошо известны и давно изучены, но подобные инфекторы, в абсолютном большинстве случаев, нацелены на модификацию 32-битных файлов. Одно из таких семейств — Expiro (Xpiro) было обнаружено достаточно давно и мало чем может удивить сегодня. Однако недавно нашей антивирусной лабораторией была обнаружена новая модификация Expiro, которая способна заражать 64-битные файлы. Кроме того, тело этой модификации является универсальным и полностью кроссплатформенным, так как может заражать 32-битные и 64-битные файлы (и наоборот, т. е. из зараженных 32-битных файлов заражать 64-битные). В нашей системе именований получил название Win64/Expiro.A (aka W64.Xpiro или W64/Expiro-A). При этом 32-разрядные зараженные файлы обнаруживаются как Win32/Expiro.NBF.

Инфектор нацелен на получение максимального деструктивного профита и выполняет заражение исполняемых файлов как на локальных, так и на сетевых дисках. В полезную нагрузку этой вредоносной программы входит установка расширений для браузеров Google Chrome и Mozilla Firefox. Вредоносный код похищает хранимые на компьютере цифровые сертификаты и пароли браузера Internet Explorer, Microsoft Outlook, FTP-клиента FileZilla. Такие расширения служат для перенаправления пользователя на вредоносные URL, а также похищение различной конфиденциальной информации. Вирус отключает ряд сервисов на скомпрометированном компьютере, включая Windows Defender и центр обеспечения безопасности (Windows Security Center), а также может завершать ряд процессов.

Инфектор

Само тело вируса, в 64-битном зараженном файле, представляет из себя добавленную в конец исполняемого файла новую секцию .vmp0 размером 512 000 байт (на диске). Для передачи управления на основное тело вирус вставляет вредоносный стартап-код размером 1269 байт на место точки входа. При этом оригинальные байты переносятся в начало .vmp0 секции. Этот стартап-код представляет из себя распаковщик для основного кода, который располагается в секции вируса. Ниже на скриншоте представлен шаблон стартап-кода, который будет записан на место точки входа 64-битного файла при заражении.



При формировании этого кода для заражения, часть данных инструкций будет перезаписана, таким образом обеспечивается уникальность данных оригинальной секции .vmp0. При этом изменению подвергаются инструкции типа add, mov или lea, в которых фигурируют непосредственные смещения (immediate). В конце кода добавляется инструкция перехода к распакованному коду секции .vmp0.



Аналогичный код стартапа для 32-битных файлов также располагается в секции .vmp0 и имеет вид.



Что в 32-битном варианте выглядит так:



Размер этого стартап кода в 64-битном варианте равен 1269 байт, а в 32-х 711 байт.

Вирус заражает исполняемые файлы, проходя рекурсивно по директориям логических дисков, при этом заражение исполняемого файла происходит с применением создаваемого .vir-файла, в котором вредоносный код формирует новое содержимое файла, а затем записывает его в инфицируемый файл блоками по 64K. Если вирус не может открыть файл на чтение/запись, он пытается изменить у него дескриптор защиты и информацию о владельце (owner).

Не являются исключением для заражения и подписанные исполняемые файлы. После заражения такого файла, он перестает быть подписанным, так как вирус записывает свое тело после последней секции, где в оригинальном файле располагается оверлей с цифровой подписью. Кроме этого, вирус корректирует значения поля Security Directory в Data Directory, выставляя поле RVA и Size в 0. Соответственно, в дальнейшем, такой файл также может быть исполнен, поскольку лишен любой информации о цифровой подписи. Ниже показаны различия в оригинальном и зараженном 64-битном файле, который снабжен цифровой подписью. Слева в модифицированной версии видно, что на месте оверлея начинается секция .vmp0 и оригинальные байты точки входа.



С точки зрения завершения security-процессов, Expiro не оригинален и использует подход на основе получения их списка с использованием API CreateToolhelp32Snapshot и последующим завершением с использованием OpenProcess/TerminateProcess. Expiro завершает следующие процессы в системе: «MSASCui.exe», «msseces.exe» and «Tcpview.exe».



Для поддержания своего присутствия в системе, Expiro создает два мьютекса с именем gazavat.

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



В теле вируса используется обфускация при вызове различных API и передачи им значений, смещений строк и прочего. Например, в следующем коде, при передаче аргумента SERVICE_CONTROL_STOP (0x1), в функцию в API advapi32!ControlService, которая используется для отключения сервисов, используется арифметика из зарезервированных констант.



Этим кодом вирус пытается отключить следующие сервисы: wscsvc (Windows Security Center), windefend (Windows Defender Service), MsMpSvc (Microsoft Antimalware Service), NisSrv (часть Microsoft Antimalware).

Полезная нагрузка

В качестве полезной нагрузки вирус пытается установить расширения для браузеров Google Chrome и Mozilla Firefox. Манифест-файл для устанавливаемого расширения Chrome выглядит следующим образом:



В директории с расширениями, каталог этого плагина будет называться dlddmedljhmbgdhapibnagaanenmajcm. Расширение использует для своей работы js-срипты background.js и content.js. После деобфускации шаблон background.js имеет вид.



В переменной HID сохраняется идентификатор системы, с ее версией и Product ID. Переменная SLST содержит список доменов, которые используются для перенаправления пользователя на вредоносные ресурсы, часть из них перечислена в переменной SLST.



Манифест расширения для Mozilla Firefox выглядит следующим образом.



Часть кода из скрипта content.js, которая отвечает за парсинг элементов форм.



С точки зрения бота, Expiro умеет выполнять следующие действия:
  • изменять список URL управляющих серверов;
  • исполнять команды в интерпретаторе cmd.exe;
  • загружать и исполнять плагины;
  • загружать файлы из сети и сохранять их в %commonapddata%\%variable%.exe;
  • осуществлять DoS-атаку TCP flood;
  • перечислять файлы по маске \b*.dll в директории %commonappdata% и исполнять код из них;
  • запускать прокси-сервер (SOCKS, HTTP);
Вредоносный код осуществляет похищение учетных данных программы FileZilla, используя файл %appdata%\FileZilla\sitemanager.xml. При похищении паролей, хранимых в Internet Explorer используется специальный COM-объект. Если загруженный код обнаруживает форму ввода данных кредитной на веб-странице, он пытается скопировать данные оттуда. При этом выполняется проверка вводимых данных кредитных карт на соответствие формату «VISA»/«MasterCard» и отображает окно с сообщением:

«Unable to authorize.\n %s processing center is unable to authorize your card %s.\nMake corrections and try again.»

Заключение

Метод заражения исполняемых файлов является очень эффективным вектором распространения вредоносного кода. Описанная модификация Expiro представляет из себя серьезную угрозу как для домашних пользователей, так и для работников компаний. Поскольку вирус заражает файлы и на локальных дисках, съемных устройствах и по сети, эпидемия может принять довольно серьезные масштабы. В случае с Expiro дело ухудшается тем, что если в системе остается хотя бы один зараженный файл, который будет исполнен, процесс тотального заражения дисков начнется снова. С точки зрения доставки полезной нагрузки файловый инфектор является также довольно предпочтительным вариантом именно в виду активности распространения своего тела.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Перевод] Как NASA управляет МКС для избежания столкновений с космическим мусором

Находящаяся на орбите примерно в 400 километрах над нами Международная Космическая Станция — это один из наиболее сложных и дорогих инженерных проектов за всю историю человечества. Станция весит около 400 метрических тонн, а размеры ее немного превышают размеры поля для американского футбола. Для ее сборки потребовались десятки и десятки запусков со стороны России и США (включая 37 полетов шаттлов), а так же более 155 выходов космонавтов и астронавтов в открытый космос — а это вдвое больше, чем общее количество выходов в открытый космос на тот момент.


Сравнение размеров МКС и поля для американского футбола

Постройка и запуск МКС обошлась человечеству примерно в 150 миллиардов долларов и 13 лет работы. И в этот самый момент, где-то там, высоко над нашими головами, шесть человек работают в космосе. Конечно, станция не просто висит там без движения. Сама по себе орбита МКС имеет тенденцию к снижению из-за сопротивления атмосферы — скорость этого снижения составляет около 2 километров в год — поэтому станцию нужно время от времени подталкивать, чтобы помочь ей оставаться на необходимой высоте. Более того, вся эта огромная структура является довольно мобильной — ее можно двигать, поворачивать и наклонять в трех измерениях для того, чтобы избежать возможных столкновений с космическим мусором. Так как же удается переместить 400 тонн довольно хрупкой МКС в случае, если на нее, к примеру, движется астероид?



Ground control to Major Tom


Комната управления МКС

Для того чтобы выяснить как двигать станцию по орбите, я прокатился в Космический Центр Джонсона и встретился с Джошем Пэррисом (Josh Parris). Пэррис — один из людей, сидящих за консолью в комнате управления полетом МКС. На самом деле его должность называется TOPO — руководитель операций с траекторией (Trajectory Operations Officer). Как это и было с первых дней пилотируемых полетов, люди, занимающие подобные должности, имеют большой опыт и обширный набор знаний — Пэррис и его сослуживцы потратили годы на обучение, чтобы заслужить право сидеть «за штурвалом» МКС.


Josh Parris

«Мы отвечаем за то, где в данный момент находится станция и желающие с ней состыковаться корабли, где они будут через определенное время, а так же за то, чтобы они ни с чем не столкнулись», — объясняет Пэррис. На высоте орбиты МКС (400 км) не так много спутников, но там вдоволь космического мусора. За последние пару лет были получены сотни сообщений радаров о возможных столкновениях станции с обломками. Только в 2013 году таких потенциально опасных ситуаций было 67.

«Что же представляют из себя эти обломки?» — поинтересовался я, — «Это из-за китайских экспериментов по уничтожению спутников?»
«В значительной степени да», — отвечает Пэррис, — «Помимо этого, большое количество обломков осталось после столкновения спутников Космос и Iridium. Заметьте, что все эти обломки — это то, что уже спустилось на высоту нашей орбиты. На более высоких орбитах тоже полно всякого мусора, который может спуститься к нам».
«И кто же все это отслеживает? У вас есть большая сгенерированная компьютером карта с красивой графикой, как показывают в кино?»
«Этим занимаются ребята из USSTRATCOM [Стратегическое командование вооруженных сил США, — прим.пер.] на авиационной базе Ванденберг», — объясняет Пэррис. «Они поддерживают каталог всех известных кусков космического мусора, и примерно три раза в день они сравнивают траекторию МКС с данными из каталога. Так что именно они оповещают нас о опасных сближениях»

Опасное сближение? Звучит страшновато. Я попросил Пэрриса рассказать поподробнее, и он объяснил, что вокруг МКС существует «защитный периметр» в форме коробки для пиццы размером в четыре километра в высоту (по 2 километра вверх и вниз от станции), и 25 километров в длину и ширину. Если один из обломков попадает в этот периметр, USSTRATCOM уведомляет об этом NASA.


Основной дисплей, отображающий положение и траекторию МКС, и основные наземные станции, которые обслуживают ее

Операторы следят за всем, что попадает внутрь этой «коробки для пиццы», и рассчитывают вероятность столкновения для каждого из отслеживаемых объектов. Каждый объект при этом получает класс опасности, основываясь на вероятности столкновения. Объекты с шансом столкновения от 1/10000 до 1/100000 получают «желтый» уровень. полетов предписывают перемещать станцию в случае появления подобных объектов, если только этот маневр не повлияет на текущие программы — например если из-за маневра будет потеряна возможность вовремя запустить Союз. Красный уровень опасности объявляется для любого объекта, вероятность столкновения с которым составляет от 1 (100%) до 1/10000. Для таких случаев правила более строги — станция должна быть обязательно перемещена, если только перемещение не является более опасным, чем сам кусок мусора (например, если на МКС имеется поврежденное оборудование, а маневр перемещения станции еще более повредит его).

Ускорители и гиродины


МКС, для своего размера и хрупкости, довольно подвижна. Она оснащена четырьмя гиродинами (Control Momentum Gyros — CMG), которые позволяют ей менять ориентацию в пространстве. За гиродины отвечает человек, чья должность называется ADCO (Attitude Determination and Control Officer), и который помогает TOPO принять решение о том, как наилучшим способом избежать столкновений с мусором.


Рабочее место ADCO. Обратите внимание на бейсбольную биту — для регулировки ориентации

В дополнении к этому, у станции есть несколько наборов ускорителей, позволяющих ей перемещаться и поворачиваться. Сервисный модуль Звезда укомплектован ускорителями; также ускорители есть на пристыкованных к станции кораблях (например, на Прогрессах). Для типичного маневра уклонения станции обычно необходима величина дельта-V порядка 1 м/с.

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

«То есть они не сидят там с джойстиками, руля станцией?»
«Нет», — смеется Пэррис, — «Все полностью контролируется с Земли».

В бой!

Итак, когда какому-то куску обломков присваивается желтый или красный код, приходит время действовать. За 28.5 часов до момента наибольшего сближения со станцией, операторы начинают процесс планирования маневра уклонения. Но почему именно 28.5 часов? На вид это довольно странное число. «Поворот будет осуществлять российский сегмент станции», — объясняет Пэррис. «Учитывая разницу во времени между Хьюстоном и российским ЦУПом, 28.5 часов — это вполне достаточно, чтобы специалисты в России составили так называемую циклограмму — точную последовательность действий, необходимых для совершения маневра, которую передают на станцию. Ну и к тому же такой запас оставляет нам больше времени на отслеживание мусора.»

TOPO совместно со специалистами по баллистике из России определяет параметры, достаточные для уклонения, включая величину дельта-V. Затем они связываются с USSTRATCOM для того чтобы убедиться, что запланированный маневр позволит увернуться от опасного обломка, но в то же время не выведет их на траекторию движения какого-нибудь другого объекта. Когда сам маневр наконец приводится в исполнение, за него отвечают компьютеры станции, а специалисты на Земле только следят за ходом процесса. Так что на самом деле невозможно просто схватиться за баранку и «порулить» МКС — все ее перемещения осуществляются после тщательного планирования, и запуск любых двигателей всегда происходит только автоматически, в соответствии с программой.

Худший сценарий

Если вам кажется что описанный выше процесс чрезмерно сложен, то вспомните, что на кону стоят человеческие жизни. «Если мы столкнемся с одним из отслеживаемых объектов, то это может привести к потере станции», — заявляет Пэррис. «МКС перемещается с такой большой скоростью [около 7,6 км/с, — прим.пер.], что любое столкновение будет катастрофой». Нижний предел размера отслеживаемого космического мусора составляет 10 сантиметров. И да — «потеря станции» это именно то, о чем вы подумали. Достаточно большой кусок мусора может не только повредить оборудование станции, но и привести к смерти экипажа.

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

Стараясь не выглядеть слишком мрачным, я поинтересовался, что же произойдет в наихудшем случае — если NASA узнает, что МКС грозит непредвиденное столкновение. Чаще всего сотрудники USSTRACOM дают NASA трехдневное предупреждение о возможных столкновениях, но иногда они могут что-то пропустить. «Обычно мы можем найти способ облететь что-то о чем мы заранее знаем», — объясняет Пэррис. Но если у него нет нужных нам 28.5 часов для того, чтобы совместно с коллегами из России составить маневр уклонения, они могут осуществить так называемый PDAM — Предрассчитанный Маневр Уклонения от Обломков (Predetermined Debris Avoidance Maneuver). Это заранее записанный маневр, проходящий с дельта-V порядка 0.5 м/с, который может быть выполнен очень быстро. Наконец, если даже он не может быть приведен в исполнение — например, если это вывело бы МКС на траекторию какого-либо другого куска мусора — то экипаж станции садится в пристыкованный корабль Союз и ждет столкновения, в полной готовности к эвакуации, если это будет необходимо. С момента, когда на станции появился первый человек, эту процедуру приходилось проводить трижды.


Конфигурация станции на май 2013 года. Показаны пристыкованные корабли Союз и Прогресс

На самом деле, маневр PDAM был разработан после инцидента 2011 года. Тогда NASA слишком поздно получила предупреждение о возможном столкновении, и экипажу станции пришлось укрыться в Союзе. Закончилось это тем, что обломок разминулся с МКС на расстоянии около 725 метров. NASA надеется, что с разработкой PDAM подобные ситуации больше не повторятся.

День за днем

Если TOPO не занимается расчетом положения станции относительно какого-нибудь космического мусора, он занят сотней других вещей. «Если мы не отслеживаем никакие обломки — сейчас, кажется, как раз такое затишье — у нас есть ряд задач на каждый день недели, которые мы должны выполнять. Я уже говорил, что мы отслеживаем точное положение станции, так что мы работаем с различными ЦУПами, особенно с центром динамики полетов в Годдарде». Пэррис объяснил, что TOPO снабжают людей в Годдарде информацией о точном местоположении станции, чтобы различные системы слежения NASA могли точно позиционировать свои антенны.


Пэррис на своем рабочем месте

В целом, за исключением планирования маневров уклонения, TOPO заключается в основном в пассивном мониторинге. На своем рабочем месте Пэррис и его коллеги работают за тремя мониторами. «На первом мониторе — наши наземные данные GPS. Слева, там где вы видите три столбца, мы сопоставляем данные на земле с данными телеметрии станции». Это необходимо для сравнения того, где, по мнению МКС, она находится, с тем где она находится по мнению наземных станций слежения. Средний монитор также отслеживает пространственное положение МКС. «Графики показывают разницу между различными источниками данных. Обычно они все выглядят как одна ровная линия», — объясняет Пэррис.

На правой части среднего монитора, за графиками сравнения, находится окошко которое показывает состояние того оборудования станции, которое необходимо TOPO. Наконец, на правом мониторе находится ПО, которое NASA использует для расчета эфемерид. «Сверху вы видите список векторов движения станции, а снизу — каталог всех эфемерид, которые у нас есть для МКС». Пэррис также подчеркнул, что если бы TOPO был в процессе работы над маневром уклонения, то на экранах был бы совершенно другой набор приложений. Сами компьютеры — это обычные PC, работающие под управлением Linux (в комнате управления полетом есть также компьютеры на Windows 7, но основные контрольные мониторы работают на Linux). Это является следствием тех давних дней, когда каждая консоль была уникальна, и ее переконфигурация занимала часы, если не дни.

Что в итоге?

Комната управления МКС находится на втором этаже здания 30 Космического Центра Джонсона, и занимает одно из двух помещений, которые когда-то использовалось в качестве комнаты управления миссий Аполло (вторая комната, на третьем этаже, была восстановлена в примерно то же состояние, что и вовремя миссий Аполло, и вы можете посетить ее как часть экскурсии в Космический Центр Джонсона). Когда я уходил, Пэррис уже занял свое рабочее место, изучая параметры станции, летящей сквозь космическое пространство, и внимательно наблюдая за возможными столкновениями. Это работа которая никогда не заканчивается, и которая требует постоянной бдительности.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


iPXE загрузка установщика Debian по HTTP

В этой статье хочу рассказать быстрый и удобный способ установить на виртуальную машину через iPXE.
Такой вариант мне нравится больше всего, т.к. не требует скачивания каких-либо ISO образов или дополнительной настройки DHCP и TFTPсерверов. Вся загрузка пойдет по HTTP через Интернет.

image

Будем считать, что у нас есть виртуальная машина, с ipxe (в случае с qemu, ipxe загружается по умлочанию)
Мы хотим загрузить debian wheezy или squeeze


Приступим

Загрузка виртуальной машины начинается примерно так:
SeaBIOS (version pre-0.6.3-20120507_233324-palmer)


iPXE (http://ipxe.org) 00:03.0 C900 PCI2.10 PnP PMM+3FFC9200+3FF89200 C900
Press Ctrl-B to configure iPXE (PCI 00:03.0)...


Успеваем, жмем Ctrl-B
Получаем консоль iPXE:

iPXE (PCI 00:03.0) starting execution...ok
iPXE initialising devices...ok



iPXE 1.0.0+ -- Open Source Network Boot Firmware -- http://ipxe.org
Features: HTTP iSCSI DNS TFTP AoE bzImage COMBOOT ELF MBOOT PXE PXEXT

iPXE>


Смотрим сетевые интерфейсы.
В моем примере один интерфейс.

iPXE> ifstat
net0: 52:54:00:75:a6:01 using virtio-net on PCI00:03.0 (closed)
[Link:up, TX:0 TXE:0 RX:0 RXE:0]


Настраиваем интерфейс через dhcp
При этом, никаких особых настроек на DHCP сервере.
Получаем только адрес, маску, шлюз и DNS.

iPXE> dhcp net0
DHCP (net0 52:54:00:75:a6:01)...... ok 


Если нет dhcp, не проблема.
Можно настроить руками.

iPXE> config net0


Получаем удобный текстовый интерфейс

iPXE configuration settings - net0

../
dhcp/
busid.......... 01:1a:f4:10:00
mac............ 52:54:00:75:a6:01
gateway........ 192.168.1.1
netmask........ 255.255.255.0
ip............. 192.168.1.6
domain......... <not specified>
dns............ 192.168.1.1
filename....... <not specified>
next-server.... <not specified>
root-path...... <not specified>
initiator-iqn.. <not specified>
skip-san-boot.. <not specified>
keep-san....... <not specified>
...
net0.dhcp/netmask:ipv4 - Subnet mask
http://ipxe.org/cfg/netmask

Ctrl-X - exit configuration utility



Далее нам понадобится указать путь до ядра и до initrd образа для загрузки.
Чтобы не писать полный путь руками (а у Debian он длинный), воспользуемся автоматическим скриптом загрузки и разместим его на HTTP сервере. Поднимать ради этой задачи веб сервер — не нужно. Можно воспользоваться готовыми решениями.
Например pastebin.com

Для загрузки текущей стабильной версии Debian, размещаем текст следующего содержания:
<code class="bash">#!ipxe

kernel http://mirror.yandex.ru/debian/dists/stable/main/installer-i386/current/images/netboot/debian-installer/i386/linux
initrd http://mirror.yandex.ru/debian/dists/stable/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz
boot
</code>

Получаем ссылку для обращения к raw тексту: pastebin.com/raw.?i=j2rHY5h0
Даем команду загрузчику:

iPXE> chain http://pastebin.com/raw.php?i=j2rHY5h0


Пошла загрузка по HTTP

http://pastebin.com/raw.php?i=j2rHY5h0... ok
http://mirror.yandex.ru/debian/dists/stable/main/installer-i386/current/images/netboot/debian-installer/i386/linux... ok
http://mirror.yandex.ru/debian/dists/stable/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz... 57%


Далее идет загрузка установщика debian.
Задача выполнена.

П.С.

1. Есть еще замечательный ресурс www.netboot.me/
Но часть записей на нем уже не работает, а создание кастомных записей требует регистрации.

2. Подобным способом можно загружать и реальное оборудование.
Например загрузив iPXE с USB flash boot.ipxe.org/ipxe.usb (400K)
Либо другого носителя. См.: www.ipxe.org/
Готовые образы: boot.ipxe.org/



Источник: habrahabr.ru,
получено с помощью rss-farm.ru


CodedUI или Ranorex? Автоматизация функционального тестирования .NET приложений

Автор статьи — Татьяна Курносова, но она поехала покорять горы Киргизии. Поэтому честь опубликовать этот пост выпала мне.

В компании 2ГИС помимо известных Desktop, Mobile и Online-приложений, разрабатывается множество внутренних Enterprise-продуктов. Эти продукты скрыты от глаз пользователей, однако, именно с их помощью выполняется колоссальная по обеспечению всей инфраструктуры 2ГИС картографическими и справочными данными. Обработка этих данных трудозатратна и требует безошибочных расчётов, поэтому перед «приёмом на работу» все продукты тщательно тестируются.

В этой статье я расскажу, как мы выбирали инструменты, как анализировали их технические возможности, чтобы они вписывались в нашу инфраструктуру, и на чём остановились.



В своё время перед нами встала задача выбора пакета, подходящего для тестирования пользовательского интерфейса используемых продуктов. Всё, что поддаётся автоматизации, мы покрываем автоматизированными тестами, и GUI — не исключение. Для этого, как известно, существуют инструменты, позволяющие имитировать действия пользователя.

С учётом того, что тестируемые продукты реализованы на .NET, а их тестировщики знакомы с языком программирования С#, было принято решение разрабатывать тесты также на языке C#. Из большого набора инструментов, представленных на рынке, мы остановились на двух. Первый — CodedUI, который поставляется с активно используемой нами Microsoft Visual Studio. Второй — Ranorex, так как он совместим с Visual Studio, имеет удобный интерфейс и положительные отзывы тестировщиков.

Coded UI является одним из решений, поставляемых вместе с Microsoft Visual Studio Premium/Ultimate, предоставляет доступ к библиотекам для разработки тестов.

Ranorex Automation Tools — это полноценная среда разработки, а также набор инструментов и библиотек для написания тестов.

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

Критерии сравнения
Мы сформулировали основные критерии, по которым сравнивали пакеты:
  1. Поддержка динамически генерируемых графических элементов управления (контролов)
  2. Настраиваемая система поиска контролов
  3. Простая поддержка тестов, основанных на данных (Data Driven Testing)
  4. Возможность разрабатывать свои (фреймворки) и использовать их при разработке тестов на C#
  5. Поддержка запуска тестов на сервере Continuous Integration (TeamCity)
  6. Генерация информативных отчетов по результату прогона тестов
  7. Возможность интеграции тестов с тест-кейсами системы тест-менджмента (TMS)
  8. Простота изучения и использования тестировщиками
Тестовый макет
Для сравнения возможностей было разработано тестовое приложение с GUI на базе на Windows Presentation Foundation (WPF). Оно содержало все ключевые элементы GUI, которые в будущем могут учавствовать в тестировании реальных продуктов.

Сравнение продуктов по критериям
1. Поддержка динамически генерируемых контролов
CodedUI
CodedUI предоставляет объект класса UIMap, который реализует доступ ко всем UI-элементам приложения. Можно динамически получить любой элемент интерфейса, зная его название, или путём прохождения по цепочке вложенных элементов, например:

«Первое текстовое поле на первой вкладке»
<code class="cs">this.UIViewmodeltitleWindow.UIItemTabList.Tabs[0].GetChildren()[1].GetChildren()[1]
</code>
Однако, такую запись можно сформировать только непосредственно в коде теста.

Ranorex
В Ranorex аналогом UIMap служит GUI Object Repository. Для доступа к элемнтам используется язык XPath, поэтому выбрать элемент можно сгенерировав с помощью встроенного рекордера соответствующий запрос.

«Первое текстовое поле на первой вкладке»
<code class="xml">/form[1]/tabpagelist[1]/tabpage[1]/element[@classname='CardEditView']/text[4]
</code>
CodedUI
Ranorex
По данному критерию предпочтительнее выглядит Ranorex, так как имеет более простую (легко осваиваемую) систему работы с контролами.

2. Гибкая и настраиваемая система поиска контролов
CodedUI
В CodedUI по умолчанию не предусмотрена работа с XPath для поиска контролов, но можно подключить специальную библиотеку.

Ranorex
В Ranorex XPath выражения называются RanoreXPath. Если элемент не имеет уникального названия, то обратиться к нему можно в одно действие, зная XPath выражение для него (см. предыдущий пункт).

CodedUI
Ranorex
Дополнительный балл в пользу Ranorex за поддержку XPath по умолчанию.

3. Простая поддержка Data Driven Testing
Data Driven Testing — это подход автоматизации тестирования, основанный на использовании тестовых наборов данных, расположенных в отдельном от исходного кода тестов хранилище.

CodedUI
При разработке CodedUI-тестов, для организации самой тестовой структуры и запуска теста используется фреймворк MSTest, который содержит функционал для создания Data Driven-тестов. Любой тест можно привязать к наборам данных из CSV-, XML-файла или выборки базы данных.

Ranorex
В Ranorex также есть возможность разрабатывать Data Driven-тесты, но исключая формат XML для данных. Видимо, разработчики Ranorex посчитали его достаточно сложным для тестировщика.

CodedUI
Ranorex
По данному критерию перевес на стороне CodedUI, так как в наших продуктах формат XML очень распространён, и во многих случаях тестировщику удобней работать именно с ним.

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

В перспективе, выбранный нами инструмент мы собираемся использовать в рамках такого фреймворка. Фреймворк инкапсулирует работу с CodedUI или Ranorex, необходимых для обращения к элементам управления пользовательского интерфейса, и предоставляет набор методов, которые можно ассоциировать с пользовательскими действиями, например, «Открыть карточку», «Заполнить форму». Любой UI-тест состоит из набора вызовов таких методов и проверок корректной обработки данных тестируемого приложения.

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

CodedUI
При использовании, CodedUI-тесты разрабатываются в Visual Studio на языке C#. Тесты можно расширять, дорабатывать, рефакторить до бесконечности традиционным способом, привлекать разработчиков.

Ranorex
Ranorex предоставляет свою IDE — Ranorex Studio, которая основана на SharpDevelop и потому имеет очень схожий с Visual Studio интерфейс и принцип работы. У Ranorex удобный инспектор элементов и возможность создавать тесты практически только кликами мышки. Кроме этого, есть возможность разрабатывать дополнительные програмные модули, которые затем будут использованы для создания более сложных тестовых сценариев.

Однако, если модуль разрабатывает не тестировщик, а программист, или специалист по автоматизации (как в нашем случае), ему удобнее использовать Visual Studio, поскольку она имеет более приспособленную систему отладки, ReSharper и пр.

CodedUI
Ranorex
фреймворка — это, в целом, не задача тестировщика, поэтому и инструмент нужен более подходящий для разработки. В целом, Ranorex Studio по этому показателю уступает CodedUI.

5. Поддержка запуска тестов на CI-сервере
Тестируемые приложения развёрнуты на сервере Continuous Integration (Build-сервере), в качестве которого выбран TeamCity. По командным соглашениям, все тесты коммитятся в репозиторий тестируемого продукта. Это позволяет нам использовать совместный код, одновременно обновлять и собирать код приложения и тестов на Build-сервере. Для GUI-тестов должна остаться та же схема работы.

CodedUI
TeamCity позволяет без труда подключить тесты, разработанные с использованием фреймворков MSTest, NUnit.

Ranorex
Ranorex, в свою очередь, умеет компилировать Test Suit’ы в исполняемый файл, который затем можно просто запустить как отдельную задачу сборки TeamCity.

CodedUI
Ranorex
По данному критерию инструменты удобно использовать в равной степени.

6. Генерация информативных отчетов по результату прогона
CodedUI
MSTest печатает результаты в формате TRX. Это XML-документ, однако невооружёным глазом его читать достаточно сложно, да и не нужно, так как TeamCity после прогона тестов предоставляет тот же отчёт в формате CSV.

Ranorex
IDE Ranorex предоставляет прекрасные отчёты с иллюстрациями и пояснениями. Однако, для этого тесты необходимо запускать из самой Ranorex Studio. Скомпилированные же тесты после прогона возвращают отчёт Ranorex XML, который затем можно сконвертировать в xUnit.

CodedUI
Ranorex
Оба случая не дают окончательного желаемого вида тестового отчёта. Однако, у нас уже реализована утилита, которая умеет создавать тестовые прогоны в нашей системе тест-менджмента (TMS) и импортировать результаты пройденных автоматизированных тестов. Причём исходный формат отчёта может быть как xUnit, так и CSV. В TMS отчёт выглядет наглядно, человекопонятно и демонстрирует общую картину тестирования на текущий момент.

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

Как это происходит:

Тестировщик разрабатывая автоматизированный тест пишет пошаговое описание непосредственно в коде тестового класса, используя специальные атрибуты. Также с помощью атрибутов указывает какому сьюту и секции пренадлежит данный кейс. Затем, при помощи специальной утилиты, импортирует все кейсы тестового проекта в соответствующий проект TMS. Импорт можно выполнять вручную или в рамках задачи сборки TeamCity. На вход этой утилите подаётся DLL-файл тестового проекта.

Эту возможность нам хотелось бы использовать и при разработке GUI-тестов. А значит, нужна возможность подключения своих библиотек и редактирования тестов.

CodedUI
В Visual Studio есть возможность просмотреть и отредактировать код CodedUI-теста, даже если он записан с помощью встроенного рекордера. Это даёт возможность проставить нужные атрибуты для синхронизации с TMS. А тестовый проект по умолчанию собирается в DLL-библиотеку, которую затем можно использовать для импорта кейсов.

Ranorex
В Ranorex Studio тестовый проект собирается в exe-файл. То есть, при текущей реализации нашей утилиты нет возможности использовать его в качестве источника тест-кейсов.

CodedUI
Ranorex
Таким образом, используя CodedUI, нам будет проще привязать нашу систему интеграции к новым тестам.

8. Простота изучения и использования тестировщиками
CodedUI
1. После создания нескольких примеров на нашем тестовом приложении сразу выявились проблемы при записи встроенным рекордером действий, связанных с сознанием динамических контролов. При повторном запуске теста название контрола менялось и тест проваливался. Чтобы этого избежать и сделать тесты более универсальными, приходилось править код теста вручную.
2. Разрабатывать тесты с использованием CodedUI можно только в среде Visual Studio. Но VS для НЕпрограммиста очень сложный и громоздкий инструмент.

Ranorex
Ranorex специально создан как среда тестировщика. С его помощью удобно создавать, запускать и просматривать результаты тестов. Кроме того, после разработки нами нескольких примеров для тестового приложения, проблем с поиском динамических элементов ни разу не возникало. Ranorex также успешно работал с приложениями на .NET WinForms, для которых CodedUI нам не удалось запустить.

CodedUI
Ranorex
Ranorex имеет более дружелюбный для тестировщика интерфейс и систему работы с элементами.

Вывод
В качестве вывода приведу сводную таблицу по описанным выше критериям:
возможность реализована
возможность не реализована
возможность реализована и удобна в использовании
КритерийCodedUIRanorex
Поддержка динамически генерируемых контролов
Настраиваемая система поиска контролов
Простая поддержка Data Driven Testing
Возможность разрабатывать свои модули
Поддержка запуска тестов в TeamCity
Генерация информативных отчетов по результату прогона тестов
Возможность интеграции тестов с тест-кейсами TMS
Простота изучения и использования тестировщиками
По выбранным нами критериям сравнения Ranorex был оценён выше, главным образом за счёт удобства.

В процессе анализа мы привлекали тестировщиков к разработке небольших тестовых сценариев и работать с Ranorex им показалась значительно удобней и наглядней.
Если вы тестировщик и вам необходимо тестировать Windows-приложение с нуля и вы выбираете между покупкой лицензии на использовании Visual Studio с поддержкой CodedUI или Ranorex, то выбрать Ranorex было бы логичнее.

Что же касается наших проектов.
Приступая к тестированию проекта, мы условно разбиваем продукт на независимые части, которые можно тестировать по отдельности. Например, приложение имеет интерфейс, который обрабатывает данные БД через API, сервисы интеграции синхронизируют данные с другими продуктами, а хранимые процедуры на уровне БД отрабатывают по расписанию и расчитывают значения некоторых полей. И для каждой такой части разрабатывается свой набор тестов как отдельное приложение (тестовый проект = тестовый фреймворк, адаптированный под нужды тестирования продукта + множество тестов, объединённые в тестовые наборы). Все тестовые проекты являются частью решения всего тестируемого продукта.
В эту структуру нам необходимо было добавить тестирование GUI.
Так как у Ranorex и CodedUI по критичным для нас параметрам оценки не сильно различались, мы подумали о перспективе развития тестов.

В конечном счёте выбор стоял между инструментом, в котором тестировщики отдельно от продукта и разработчиков будут писать GUI-тесты, и временем, потраченным на разработку всего необходимого (фреймворка, документации) для быстрой и удобной разработки тестов с использованием CodedUI.

Поскольку во втором случае такую систему можно сделать более универсальной, мы выбрали CodedUI. Да, это больше часов разработки, но при этом у нас появлялось некоторое универсальное решение для автоматизации функционального тестирования GUI всех Enterprise-продуктов компании.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Интеллектуальное извлечение данных. Основы web data extraction

Мы (да и не только мы) уже рассказывали на хабре пару раз о проекте интеллектуального извлечения данных Convextra. Но предыдущие статьи это, по сути, обзоры сервиса, и его функциональности, а сегодня я хотел бы затронуть теоретическую и технологическую сторону вопроса извлечения данных. В русскоязычном сегменте очень немного информации, посвященной данной теме, и почти полностью отсутствует статьи о механизмах полуавтоматического или автоматического (интеллектуального) извлечения данных. Так как data extraction имеет непосредственное отношение к таким актуальным темам как data mining и Big Data, то, думаю, восполнение «информационного пробела» будет интересно довольно широкой аудитории. Намеренно постараюсь излагать на простом языке, поближе к этой самой «широкой аудитории». А извращенцев любителей матана ждут на источники внизу статьи, пройдя по которым, можно удовлетворить себя формулами, дифурами, матмоделями и строгим математическим описанием некоторых вопросов.



В сегодняшней статье речь пойдет о проблеме интеллектуального извлечения данных с веб-страниц (web data extraction), и, если тема окажется интересной, я продолжу цикл постов.

Data extraction
Извлечение данных (или, как еще называют, извлечение информации) — это процесс получения структурированных данных из слабоструктурированных или неструктурированных источников. В приложении к вебу, классическими задачами извлечения данных являются сбор информации о товарах интернет магазинов, результатов выдачи поисковых систем или получение списка всех статей какого-либо сайта. Важно понимать разницу между понятиями data extraction и data mining, чтобы не путать их. Задачей data extraction является сбор и систематизация данных, в то время как data mining занимается извлечением знаний из данных. Чаще всего, результат извлечения данных является входом для какого-либо дальнейшего анализа, включая data mining. Поэтому задача извлечения данных иногда сводится к переводу человекопонятных данных в машиночитаемые (например, парсеры переводят человекопонятные веб-страницы в машиночитаемые таблицы).
Условно, способы извлечения данных можно разделить на три группы:
  • Ручной. Например, в некоторых агентствах недвижимости аналитики регулярно просматривают появившиеся на рынке предложения и вручную заносят их в свою базу.
  • Полуавтоматический. К этому типу относятся решения, которые, после некоторой настройки пользователем, способны автоматизировать процесс извлечения данных. В вышеуказанном примере с агентствами недвижимости, роль полуавтоматического приложения извлечения данных может выполнять программа, в которой указано, с каких сайтов и по каким правилам нужно собирать объявления. Также к этой части относятся любые специализированные парсеры. Очевидным недостатком таких систем является зависимость от верстки целевых страниц и сложность подключения новых источников данных (чтобы подключить новый сайт нужно составить сложные регулярных выражений, XPATH или указать данные явно, используя визуальный интерфейс). Наиболее распространенными универсальными коммерческими приложениями для полуавтоматического извлечения данных являются Mozenda и Visual Web Ripper
  • Автоматический (интеллектуальный). Качественным отличием систем данного типа является возможность автоматического распознавания данных и их структуры. В примере с недвижимостью это означает, что система способна автоматически распознавать объявления на любом сайте без предварительной настройки пользователем. Вряд ли существуют и в ближайшее время будут существовать универсальные технологии интеллектуального извлечения данных любого рода, но наиболее близкими к данному типу являются технологии поисковых гигантов и больших аналитических агентств.

Очевидно, что в сфере все нарастающего интереса к Big Data и data mining, наибольшую ценность представляют системы именно автоматического извлечения данных.

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

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

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

Проблема навигации (Navigation problem)
Чтобы извлечь данные с веб-страниц, нужно, для начала, эти страницы получить. Но современный веб устроен так, что получение страниц с интересующей вас информацией превращается в совершенно нетривиальную задачу. К сожалению, протоколами не предусмотрено кнопки «скачать все интернеты» или, хотя бы, «скачать весь сайт». Кнопки «скачать авито» мы тоже не найдем, поэтому проблему придется решать каким-либо другим способом. Вариантов решения множество: написание своего велосипеда, использование возможностей краулера wget (да, он умеет ходить по ссылкам), сторонние библиотеки, использование результатов поисковых систем вроде гугла и т.д. На практике, несмотря на кажущуюся простоту, вы столкнетесь с огромным количеством подводных камней, таких как исполнение Javascript и AJAX навигация, ограничения по IP, авторизация страниц, капча, данные во флеш, отправка форм, определение логических дубликатов страниц… Короче говоря, полностью решить задачу очень затруднительно, поэтому, чаще всего, просто достигается результат, приемлемый для конкретного случая. Для avito подойдет самый простой сетевой паук, хотя бы тот же wget.

Проблема распознавания данных (Data extraction problem)
Хорошо, допустим мы получили все необходимые страницы. Но ведь нам нужны только данные (в случае с авито — объявления), а не все страницы целиком. Здесь мы плавно подходим к одной из главных проблем интеллектуального извлечения данных — распознаванию. Зайдя на любую из страниц авито, мы увидим примерно следующую картину:



Человеку сразу понятно, что здесь является релевантными данными для извлечения, но нужно научить этому машину (помните, выше мы говорили о переводе из человекопонятного в машиночитаемый?).Так вот, в случае с web data extraction, задача распознавания чаще всего (но не всегда) сводится к задаче поиска повторяющихся структур данных. Если мы научим алгоритм находить часто повторяющиеся структуры данных, то, с большой вероятностью, это и будет то, что человек считает «релевантными данными». Для авито это список объявлений, для яндекс маркета — каталог товаров, для соцсети — карточка пользователя, для сайта кинотеатра — расписание фильмов. То есть, указав системе какой-либо сайт, мы получим его «полезное содержимое». На этом хорошие новости заканчиваются :) Реализация алгоритма определения повторяющихся структур данных — это тема отдельных научных работ (ссылки на некоторые из них приведены в конце поста) и все существующие (опубликованные) алгоритмы даже в довольно простых случаях много ошибаются.

Существует несколько концептуально разных подходов к реализации алгоритма определения повторяющихся структур данных:
  • Основанный на текстовом содержимом страницы
  • Основанный на семантичности html разметки (ищется, например, наибольшая таблица в теге <content>)
  • Основанный на определении занимаемого места в DOM дереве (ищется элемент, содержащий наибольшее количество дочерних элементов)
  • Основанный на построении некоторого хеша для каждого из элементов DOM дерева и группировке элементов с похожими хешами
  • Основанный на визуальной картинке веб-страницы (грубо говоря, берется скриншот страницы, визуально анализируется, а результаты анализа обратно преобразуются в место элемента в исходном html коде).
В чистом виде эти подходы применяются редко, чаще используется комбинированное решение. Сама по себе тема алгоритмов очень интересна, и, возможно, ей будет посвящена отдельная статья.

Проблема поиска общей структуры данных (Structure synthesis problem)
Следующим шагом для извлечения данных является определения их структуры. На практике очень редко встречаются ситуации, когда все элементы набора данных имеют одинаковые свойства (атрибуты данных). Например, на авито некоторые объявления могут содержать адрес или информацию о продавце, а другие — нет. Проблема усложняется, если в качестве поставщика данных используются разные источники и тогда одни и те же атрибуты могут иметь разное представление. Как вы уже догадались, задача нетривиальная и универсального решения не существует. Чаще всего используется комбинированное решение в виде лексического анализа данных и анализа структуры DOM.

Проблема сопоставления атрибутов извлекаемых данных (Data mapping problem)
На предыдущем шаге мы получили некую «сетку атрибутов» наших данных (в простейшем случае она одномерная и может быть выражена просто их списком) и теперь необходимо каждый элемент из набора данных разложить по этой сетке. На данном этапе происходит нормализация атрибутов и обеспечивается однородность извлекаемых данных. Например, на avito дата объявления представляется в разных форматах: «Сегодня 11:42», «5 часов назад» или «21 июня». Для обеспечения однородности все такие атрибуты приводятся к общему формату (дата переводится в какой-либо абсолютный формат времени, адреса и станции метро тоже могут нормализоваться).

Проблема объединения данных (Data integration problem)
Последним этапом является объединение данных с разных страниц (одного или нескольких сайтов). Для чего это необходимо? Во-первых, информация об одном и том же элементе может находиться на разных страницах (на авито — в списке объявлений краткая информация, а на отдельной странице уже подробная). Во-вторых, как мы говорили выше, одни и те же данные из разных источников могут иметь разную структуру и ее придется приводить к общему виду. На этом шаге также выявляются логические дубликаты данных и отсеиваются элементы, не удовлетворяющие каким-либо исходным критериям (осуществляется пост-обработка данных).

Как это использовать?
С теорией, в общих чертах, мы разобрались. Но как это все можно применять на практике? Несмотря на то, что пока технологии интеллектуального извлечения данных по большей части применяются в закрытых узкоспециализированных решениях, сфера их применения очень широка. Наиболее очевидная область — создание разного рода агрегаторов и поисковых систем. К примеру, можно создать аналог ЯндексМаркета, который не будет нуждаться в предоставлении от магазинов специального файла с каталогом товаров (технология интеллектуального распознавания данных автоматически сможет получить всю необходимую информацию о товарах). Более интересным применением, на мой взгляд, является создание поисковых систем. Например, введя в такую поисковую систему «Эйфелева башня» можно будет на выходе получить всю информацию об этом объекте: высота, время работы, количество смотровых площадок, годовую аудиторию, вес, географические координаты и так-далее — все, что где-либо когда-либо было описано. Такую информацию не умеют предоставлять современные поисковики (хотя, и гугл и яндекс делают шаги в этом направлении), а использование технологии интеллектуального извлечения данных позволяет сделать такой поисковик благодаря механизму распознавания атрибутов данных. В качестве менее глобальных примеров применения технологии можно привести задачи разового парсинга данных (например, импорт товаров в свой интернет магазин с других сайтов) и разного рода конечные решения. Например, становится возможным реализовать сервис сравнения цен различных интернет магазинов, где все, что требуется от пользователя — ввести адреса сайтов.

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

Ozone.ru: результат
Avito.ru: результат
Ebay.com: результат

Поиграться с парсером можно здесь. Просто вводите URL и на выходе получаете данные сайта. Количество загружаемых страниц с сайта — не более ста. Парсер очень ресурсоемкий, поэтому, скорее всего, хабраэффекта не выдержит. Просьба более 2-3 сайтов не вводить, чтобы остальные тоже могли попробовать :)

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

Литература
1. Retrieving and integrating data from multiple information sources. International Journal of Intelligent and Cooperative Information Systems (Y. Arens, C.Y. Chee, C-N. Hsu, and C.A. Knoblock.)

2. Template-baaed information mining from html documents. In Proceedings of the Fourteenth National Conference on Artificial Intelligence. (J.Y.-J. Hsu and W.-T. Yih)

3. Information extracting for semistructured documents. In Proceedings of the Workshop on Management of Semi-Structunzd Data. (D. Smith and M. Lopez.)

4. An XML-enabled data extraction toolkit for web sources. (Ling Liu, Calton Pu, Wei Han)

5. Web data extraction based on structuralsimilarity. (Zhao Li, Wee Keong Ng, Aixin Sun)

Найти эти и некоторые другие статьи, посвященные web data extraction вы можете, например здесь.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Мои финансы – с защитой танцы

Вам встречались люди с торчащим кусочком фольги из кошелька? Нет? Совсем скоро вы их увидите во всех городах страны! Кто эти люди? Самые обычные граждане, которые волнуются за свои финансы. Причина их беспокойства — бесконтактные платежные технологии PayWave и PayPass.

Бесконтактные банковские карты – это уже знакомые и привычные для нас кусочки пластика, с той лишь разницей, что в них есть антенна для передачи информации по радиоканалу. Самыми распространёнными их видами являются VISA PayWave и MasterCard PayPass. Отличить такие карты можно по соответствующему символу в виде волны в углу и названию бесконтактной технологии рядом с логотипом платежной системы. Для оплаты покупки всего лишь надо поднести такую карту к платёжному терминалу, оснащенному специальным радиоприемником. И всё — платеж осуществлен. Никаких вводов паролей и оставления «автографов». Скорость увеличивается – очереди сокращаются.

Но как во всем прекрасном, так и в бесконтактных платежах есть свои спорные моменты. Увидев, как работают карты данного типа, возникает вопрос: если продавец может получить с карты данные, необходимые для проведения транзакции, что мешает злоумышленнику просканировать карту и снять с нее деньги? Безопасно или нет носить в кармане бесконтактную банковскую карту?

Немного истории
Впервые вопрос о безопасности банковских карт возник вначале 70-ых годов ХХ века, когда банки столкнулись с острой нехваткой рабочих рук. Операционисты не успевали обрабатывать вал бумаг, которыми сопровождались запросы на кредиты и их одобрение.

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

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

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

EMV – это стандарт, созданный совместными усилиями компаний Europay, MasterCard и Visa с целью повышения уровня безопасности банковских платежей. Вскоре после его создания Europay и MasterCard слились в одну компанию, но название документа уже менять не стали.
Итак, за счет чего повысился уровень безопасности?

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

Второй фактор безопасности — использование динамических данных. Для каждой банковской транзакции EMV-чип генерирует индивидуальный код подтверждения. В связи с этим, перехват данных, передаваемых при платеже, становится бессмысленным.

В-третьих, появление предметной верификации держателя. При использовании магнитной карты для подтверждения платежа Вам необходимо поставить свою подпись, которую в большинстве случаев никто не сличает с оригиналом. А о том, что необходимо так же сверить имя владельца «пластика» с удостоверением личности его держателя, и говорить не стоит. При использовании чиповой карты подтверждение каждого платежа происходит путем введения PIN-кода.

Хоть EMV-чип стал серьезной альтернативой магнитной полосе, тем не менее, и у него есть ряд недостатков. Самый главный из них – это необходимость обеспечивать совместимость с гигантской инфраструктурой магнитной полосы. Для решения данной проблемы банки выпускают гибридные карты, предоставляющие оба варианта доступа к платежу. Но при обслуживании такой комбинированной карты по магнитной полосе, вновь встает вопрос безопасности. Снова появляется угроза скимминга.

Стоит отметить, что копирование данных все-таки возможно и с чипа. Со смарт-карт, выпущенных до 2008 года (MasterCard) и до 2009 года (Visa), можно считать информацию достаточную для изготовления соответствующей магнитной полосы, а именно: номер, срок действия, служебный код, информация о банке. Для карт, выпущенных позднее указанных дат, такой проблемы уже не существует.

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

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

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

О бесконтактных технологиях
В качестве физической основы механизма бесконтактных банковских платежей используется технология NFC. NFC (Near Field Communication — «коммуникация ближнего поля») — это беспроводная высокочастотная связь малого радиуса действия, которая дает возможность обмена данными между устройствами, находящимися на расстоянии около 10 сантиметров. По сути, это простое расширение стандарта бесконтактных карт (ISO 14443) RFID, объединение интерфейса смарт-карты и считывателя в единое устройство. Технология NFC в области банковских приложений позволяет заменить устаревшую, но привычную магнитную полосу на более современное решение, не ограничиваясь при этом банковскими картами. Оплата может производиться и иными платежными инструментами, будь то сотовый телефон или RFID-стикер, наклеенный на любой удобный предмет.

В бесконтактных картах информация, необходимая для проведения транзакций, хранится на чипе карты. Существует два типа таких карт.

Для первого варианта исполнения характерно наличие только бесконтактного интерфейса, размещенного на карте c магнитной полосой. Данный вид предназначен, в основном, для США. Фактически бесконтактный модуль является статическим и дублирует информацию, хранящуюся на магнитной полосе.

Второй вариант является более защищенным, чем первый. В такой карте обязательно наличие двух интерфейсов, взаимодействующих с чипом: контактного (впаянного элемента, напоминающего SIM-карту) и бесконтактного (RFID-метка). Карты данного типа соответствуют стандарту EMV. Они не только сохранили преимущества своих «чипованных собратьев», но и стали более удобными:

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

— По бесконтактным картам, с целью увеличения скорости обслуживания, разрешены платежи без дополнительной аутентификации. Для России эта сумма составляет 1 000 рублей, для Украины – 200 гривен, а, например, для Таиланда – 700 тайских бат. Это не значит, что нельзя совершить бесконтактную оплату покупки, чья стоимость превышает данную сумму, просто в этом случае Вам придётся пройти процедуру аутентификации.

Совершение платежей на небольшие суммы без авторизации стало возможным благодаря тому, что международные платежные системы взяли курс на повышение скорости оплаты. Так Visa установила максимально допустимое время для проведения транзакций равным 30 секундам. С этой же целью Visa запустила программу Visa Easy Payment Service, по которой все точки продаж не должны требовать удостоверения личности у клиентов при покупке на сумму менее 1 000 руб.

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

А как же безопасность?
В картах PayPass и PayWave используется RFID чип, работающий на частоте 13,56 МГц. Именно благодаря ему происходит данными между картой и терминалом. Однако, злоумышленник может легко перехватить эти сведенья с помощью альтернативного RFID-сканера.

Производители бесконтактных карт решением проблемы называют тот факт, что радиус действия RFID-меток составляет 3-5 см. Но данный аргумент является весьма спорным, т.к. уже существуют дальнобойные считыватели с радиусом действия более 30 см. Пока они имеют в своем составе достаточно большие антенны, что не умаляет факта их существования.

Таким образом, имея RFID-сканер можно сформировать запрос на транзакцию и провести атаку на карту. Безусловно, этих данных недостаточно для создания клона, но ряд фишинговых атак может оказаться вполне успешным.

Между тем, и законодатели, и платежные системы в этом вопросе поддерживают держателя денежных средств. Сумма платежей до 1 000 рублей, оспариваемая владельцем карты возвращается без дополнительного расследования и в кратчайшие сроки. Во многом это связанно с заинтересованностью в развитии микроплатежей и постоянном увеличении денежных оборотов. На это явно указывает и один из самых обсуждаемых принятых законов – 161-ФЗ «О национальной платежной системе». Если ранее при махинациях с банковскими картами свою невиновность приходилось доказывать владельцу скомпрометированной карты, что в российских судах чаще всего ничем хорошим не заканчивалось, то с 1 января 2014г. ситуация кардинально меняется. В соответствие со статьей 9 упомянутого закона банк обязан возместить клиенту сумму операции, совершенной без его согласия, после получения уведомления о несанкционированном переводе денежных средств. И уже только после этого приступать к расследованию инцидента. Современные системы фрод мониторинга тем не менее не дадут злоупотреблять клиентам банков правом постоянно оспаривать операции. Желающих нажиться на ложных обращениях, можно оперативно выявить.

Так стоит ли пользоваться бесконтактными банковскими картами или нет? Скорее всего, стоит. Это не только удобно, это практически безопасно. Но если сомнения в безопасности передачи данных вашей карты по радиочастотному каналу всё-таки остаются, то экранирование карты конвертом из фольги решит этот вопрос. И нам все чаще будут встречаться люди с торчащим уголком фольги из кошелька.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[RSS-пост] На Яндекс.Диске теперь можно купить дополнительное место

Сегодня около 12 миллионов человек хранят свои файлы на Яндекс.Диске. Любой пользователь может бесплатно получить до 20 ГБ облачного пространства, однако у многих людей одна только фотоколлекция наверняка занимает больше места — особенно если в ней хранятся оригиналы цифровых фотографий. А если вы, к примеру, занимаетесь съёмкой и монтажом видео, то ваши рабочие файлы вряд ли уместятся и в 100 ГБ.



Теперь пользователи, которым не хватает 20 ГБ, могут купить больше места на Яндекс.Диске. Можно приобрести дополнительные 10 ГБ за 30 рублей в месяц, 100 ГБ — за 150 рублей, а при желании даже 1 ТБ места — это будет стоить 900 рублей в месяц. Дополнительное место можно купить на несколько месяцев или на год — со скидкой. Принимаются банковские и Яндекс.Деньги. Подробнее о тарифах читайте на странице Диска.

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


Новый алгоритм Disney Research способен превращать 2D фотографии в 3D-модели

imageВ Disney Research было разработано приложение, способное строить 3D-модели из обычных фотографий. Благодаря оригинальному алгоритму, программа способна из нескольких сотен изображений строить трехмерные модели сложных сцен прямиком из реальной жизни, и поэтому обещает стать полезным средством для создания фильмов, игр и моделей для 3D-принтеров.

Само построение 3D-модели из нескольких двумерных изображений, которые запечатлели объект с разных ракурсов, уже давно не в новинку, — но вот создание высоко детализированных окружений в большом разрешении оказалось трудной задачей из-за необходимости обрабатывать большое количество данных. Заслуга Disney Research в том, что созданный ими алгоритм умеет эффективно распоряжаться подобными масштабами данных, обрабатывая их без необходимости держать все данные в памяти одновременно.
image
Сейчас многие 3D-модели получаются методом лазерного сканирования. В случае сложных окружений, один лазер может просто не справиться с количеством деталей из-за того, что одни объекты будут заслонять другие. Метод обработки обычных фотографий позволяет проще «захватить» сцену с нескольких ракурсов, но построение 3D-моделей из них до последнего времени было весьма затруднительным делом.

Авторы алгоритма продемонстрировали его работу на сложных сценах внешних и внутренних пространств, которые были воссозданы в 3D на основе снимков, сделанных 21-мегапиксельной зеркальной цифровой камерой. Для сравнения — до этого все техники реконструкции умели обрабатывать только изображения разрешением 1-2 мегапиксела. Для создания каждой из моделей потребовалось 100 снимков.

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


Исследование опубликовано в отчете "Scene Reconstruction from High Spatio-Angular Resolution Light Fields".

Источник: www.3ders.org

Источник: habrahabr.ru,
получено с помощью rss-farm.ru


[Перевод] Не верьте своему мозгу



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

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

То, что важно для вас, не всегда важно для вашего мозга
В книге The Happiness Hypothesis психолога Джонатана Хейта (Jonathan Haidt) из Университета Вирджинии объясняется, почему так происходит:
Наша эмоциональная часть — это слон, а рациональная — его наездник. Кажется, что наездник управляет слоном, но его контроль очень слабый. В любой момент шеститонный слон может пойти, куда ему заблагорассудится.
Поэтому сложно пойти в спортзал вместо того, чтобы съесть мороженое. Все из-за слона.

Мозг не любит новое
Некоторые люди любят делать что-то новое и опасное, получая в процессе много неож