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

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

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

 

 -Статистика

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

Habrahabr/New








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

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

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

[Из песочницы] Почему CRM не работают

Суббота, 09 Сентября 2017 г. 17:55 + в цитатник
BestWebService сегодня в 17:55 Управление

Почему CRM не работают

Это информация для тех, кто уже пробовал использовать или использует CRM-системы и более сложные системы автоматизации бизнес-процессов (далее – системы), но не доволен результатом, однако все еще хочет чтобы:

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

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

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

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

Основная проблема, которая у вас была или есть, вероятней всего возникла из-за выбора системы. Есть два основополагающих варианта. И с каждым из вариантов связанны свои проблемы:

1 вариант: использовать «готовое решение», частично настроив его под особенности своего бизнеса.
2 вариант: разработать систему «под себя».

Первый вариант — это все готовые решения, типа amoCRM, Bitrix24, Мегаплан и др. Это ваш случай? Тогда обсудим проблемы которые могут последовать за этим выбором и как от них избавиться.

Сотрудники частично используют систему

Один из самых неприятных случаев. Потому что вроде используют, а вроде и не полностью. И не понятно что делать.

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

Так откуда же берется это “частично”?

Все просто. Система начинает использоваться частично только тогда, когда у сотрудников для некоторых бизнес-процессов есть свои, более простые решения. Чаще всего такая проблема возникает если вы неправильно выбрали систему из готовых решений или не настроили какой-то бизнес-процесс. Поясню на простом примере. Предположим в системе нет удобно организованного чата. В этом случае сотрудники будут периодически использовать WhatsApp и Telegram, даже при общении по поводу работы и клиентов. В начале кажется что это мелочи. Ну и пусть! Но шаг за шагом это приводит к большим проблемам, к тому, что система все реже и реже используется, а необходимые данные все чаще не попадают в систему. Такая проблема распространена больше для готовых решений. Невозможность идеально связать все бизнес-процессы с системой приводят к тому, что сотрудник, в случае некоторых из процессов, сам находит удобный для себя инструмент, который решает его задачи. Хотя это должна была делать система. И это приводит к все меньшему и меньшему ее использованию.
К слову, забегая вперед, такая проблема существует и для обладателей разработанных “под себя” систем, но только если систему разрабатывал человек, который не понимает как мыслят и действуют сотрудники, например фрилансер.

Что делать?: Грамотно подходить к выбору системы, либо разрабатывать систему «под себя».

Система автоматизирует не все бизнес-процессы

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

Что делать?: Разрабатывать систему «под себя», либо довольствоваться тем, что есть.

Не нашли систему подходящую под свой бизнес

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

Что делать? Искать подходящего разработчика и разрабатывать систему «под себя».

Сотрудники совсем не используют систему

Если это ваш случай, то вы явно очень сильно «намудрили» с выбором системы.
Вероятней всего она настолько сложна что без обучения тут не обойтись. А обучение — это книжка толщиной с «Война и мир». Я конечно утрирую, но суть от этого не меняется. Такой вариант лично мне встречался, когда в компании самостоятельно пытались внедрить облачную версию bitrix24, либо делали из 1С невообразимую конструкцию, которой заставляли пользоваться менеджеров. Менеджеры — не бухгалтеры. У них другие задачи. Повторюсь, потому что это очень важно: любая система будет использоваться настолько, насколько она удобна для сотрудников и насколько помогает решать их задачи. Вы, конечно, можете их заставить использовать ее в приказном порядке. Но эффект от системы будет очень далек от того, что вы бы могли получить при правильном подходе.

Что делать? Грамотно подходить к выбору системы.

Система периодически «глючит»

Самый распространённый вариант для случая, когда «готовое решение» постоянно пытаются доработать и залатать. Это как купить джинсы с дырками, а потом их зашивать потому, что они вам не нравятся. Зрелище печальное. Не поймите меня неправильно, в любом готовом решение есть возможности его дополнить и изменить уже проверенными дополнениями. И они будут отлично работать. Но когда их слишком много и когда вы выходите за их рамки, глюков вам не избежать. Такая проблема может возникнуть и c “под себя” разработанной системой. Но обычно в том случае если вы нанимаете не очень опытного фрилансера.

Что делать? Правильно выбирать и настраивать систему или сразу разрабатывать систему «под себя».

Если резюмировать, то нередко верным решением становится разработка системы «под себя». И не трудно понять почему. Я не думаю, что кому-то нужно объяснять, чем лучше пиджак сшитый на заказ. Но есть и свой нюанс. Для малого бизнеса это невыгодно. А вот для среднего и крупного бизнеса это, пожалуй, лучшее решение. Вы не найдете ни один крупный бизнес, который бы использовал «готовое решение». Так же как вы вряд ли найдете малый бизнес, который разрабатывал систему «под себя». Но прежде чем что-то решать посмотрите на проблемы, с которыми сталкиваются ваши коллеги выбрав изначально второй вариант, а также на их решения.

Второй вариант это разработка системы под “себя”.

Это ваш случай? Тогда начнем.

Вам уже давно разрабатывают систему, но никак не могут дописать

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

Но при этом у меня есть один вопрос к вам. А что вы делали все то время пока вам “якобы” писали систему? На самом деле причина в том, что вы недостаточно контролировали результат. Хотите чтобы все было в срок, требуйте еженедельных отчетов по выполненной работе. А если вам скажут, что это невозможно сделать, меняйте разработчика сразу и бегите от него как от огня. Просто поверьте: за неделю можно написать простую систему. И если вам не могут предоставить даже минимального результата, значит ваше время тратят впустую.

Что делать? Правильно выбирать разработчика и требовать постоянные отчеты по ходу работы.

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

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

Система периодически «глючит»

Эта проблема всегда связана только с выбором разработчика и движка.
Что делать? Правильно выбирать разработчика.

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

1. “Профессиональный” движок лучше самописного. Причем на самом деле под умным словом профессиональный подразумевается платный и универсальный движок. Вот только реальная статистика говорит об обратном. Более 50% процентов всех веб-сервисов и практически любой крупный проект написаны на самописных движках. Почему? Все тот же пиджак сшитый на заказ. У каждого есть свои плюсы и минусы. И это гораздо более глубокий вопрос чем просто ответ что лучше, а что хуже.

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

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

Сейчас можно разработать систему, которая охватит все процессы в компании, будет иметь мобильные приложения и позволит дополнять ее всем необходимым (например, сканерами отпечатков пальцев и т.д.). В случае разработки системы «под себя» ограничений практически нет. Это вопрос только денег.

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

https://habrahabr.ru/post/337546/


Метки:  

Численное решение уравнения свободных колебаний струны для специальных начальных условий на Python

Суббота, 09 Сентября 2017 г. 17:51 + в цитатник
Scorobey сегодня в 17:51 Разработка

Численное решение уравнения свободных колебаний струны для специальных начальных условий на Python



    Введение


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



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



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

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

    Постановка задачи


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

    Особенности программной реализации на Python


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

    Уравнение колебаний струны единичной длины с закрепленными концами::
    Начальные условия:
    Нулевые граничные условия:
    Двумерная сетка:
    Расчётная формула:

    Для решения задачи нужно построить сетку из 11 узлов по x (i = 0, 1,… 10) и провести вычисления для 16 слоев по t (j = 0, 1,… 16). Вычисления выполнить с шагом h по х, равным 0.1 и шагом t по t, равным 0.05.

    Для начальных условий f(x), например, для электромагнитной системы импульсного возбуждения f(x)=x**3-x.
    Листинг программной реализации
    #!/usr/bin/env python
    # -*- coding: utf-8
    import numpy as np
    import matplotlib.pyplot as plt
    h=0.1#шаг по x  
    t=0.05#шаг по t 
    a=1#отношение начального натяжения T к массе единице длинны
    l=(a*t/h)**2#расчётный коэффициент
    n=11#сетка из 11 узлов по x (i = 0, 1, ... 10) 
    m=17#провести вычисления для 16 слоев по t (j = 0, 1, ... 16).
    x=[h*i for i in range(0,n)]# координата x
    U= np.zeros([m,n])# матрица для размещения расчётных значений
    for j in range(0,m):  #внесение условий         
             for i in range(0,n):                  
                      U[0,i]=x[i]*(x[i]**2-1)#начальные условия                                      
                      U[1,i]=U[0,i]#начальные условия    
                      U[j,0]=0#граничные условия   
                      U[j,10]=0#граничные условия   
    for j in range(1,m-1):#внесение решения            
           for i in range(1,n-1):
                    U[j+1,i]=2*(1-l)*U[j,i]+l*(U[j,i+1]+U[j,i-1])-U[j-1,i]
    y0=[];y5=[];y10=[];y16=[]#списки для вывода слоёв 
    for i in range(0,n):
             y0.append(U[0,i])
             y5.append(U[5,i])
             y10.append(U[10,i])
             y16.append(U[16,i])
    plt.title(' Решение задачи на 0ом, 5-см, 10-см и 16-см \n временных слоях', size=12)         
    plt.plot(x, y0, label="слой -0")
    plt.plot(x, y5, label="слой -5")
    plt.plot(x, y10, label="слой -10")
    plt.plot(x, y16, label="слой -16")
    plt.legend()
    plt.grid()
    plt.show()   
    


    Результат




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

    Выводы


    Программная реализация численного решения уравнения колебаний струны совместно с публикациями [1,2,3] образуют единый комплекс учебных и исследовательских программ который я надеюсь будет способствовать популяризации свободно распространяемого языка программирования Python.
    Спасибо всем за внимание!

    Ссылки


    1. От двух камертонов из опытов Лиссажу к одной эллиптической уровнемерной трубке с шагом в столетия и всё на Python.
    2. Модель колебательного звена в режиме резонансных колебаний на Python.
    3. Модель колебательного звена с применением символьного и численного решений дифференциального уравнения на SymPy и NumPy.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337542/


    Метки:  

    Настройка среды разработки Webpack 3 + Angular 4: от сложного к простому

    Суббота, 09 Сентября 2017 г. 16:01 + в цитатник
    maxim1006 сегодня в 16:01 Разработка

    Настройка среды разработки Webpack 3 + Angular 4: от сложного к простому

    • Tutorial
    Всем привет!

    Современное front-end-приложение на Angular должно включать в себя следующие характеристики:

    • Возможность использования типизированного JS — Typescript
    • Обеспечение удобства и производительности разработки с помощью HMR (hot module replacement);
    • Модульность приложений и возможность отложенной загрузки модулей (Lazy Loading);
    • AoT — режим (ahead-of-time), повышающий производительность приложения.

    Существует много вариантов сборки, решающих эти задачи (angular cli, A2 seed и т. д.). Обычно они имеют сложную структуру, плохо настраиваются/расширяются и представляют собой монолит, который невозможно изменить.

    В статье я расскажу, как совместить Angular 2+ с webpack и разобраться со всеми этапами сборки/разработки.

    Вы удивитесь, как это просто.

    Финальное приложение.

    Постараюсь по максимуму осветить тонкие моменты. Итак, поехали.

    1) Создаем проект


    Создаем папку с проектом, чтобы никто не догадался, назовем ее angular-project.
    (Использую Webstorm, однако можете проделывать то же самое в вашем редакторе)



    2) Окружение


    Устанавливаем node.js (npm в комплекте по умолчанию).

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

    package.json
        {
        "name": "angular-project",
        "version": "1.0.0",
        "description": "angular scaffolding",
        "author": "maxim1006",
        "license": "MIT",
        "dependencies": {
            //блок необходимых для Angular модулей
            "@angular/animations": "^4.3.6",
            "@angular/common": "^4.3.6",
            "@angular/compiler": "^4.3.6",
            "@angular/compiler-cli": "^4.3.6",
            "@angular/core": "^4.3.6",
            "@angular/forms": "^4.3.6",
            "@angular/http": "^4.3.6",
            "@angular/platform-browser": "^4.3.6",
            "@angular/platform-browser-dynamic": "^4.3.6",
            "@angular/router": "^4.3.6",
            //модули для hmr
            "@angularclass/hmr": "^2.1.1",
            "@angularclass/hmr-loader": "^3.0.2",
            //polyfills для es5
            "core-js": "^2.5.0",
            //модуль для работы декораторов в браузере 
            "reflect-metadata": "^0.1.8",
             //модуль для работы с реактивным программированием
            "rxjs": "^5.4.3",
             //типизация и доп. возможности для js
            "typescript": "2.3.4",
            //зоны в js, очень интересно, обязательно почитайте
            "zone.js": "^0.8.17"
        },
        "devDependencies": {
            //для сборки AoT (Ahead-of-Time Compilation) angular
            "@ngtools/webpack": "^1.6.2",
            //поддержка типизации, чтобы не ругался typescript
            "@types/es6-shim": "^0.31.35",
            "@types/jasmine": "^2.5.54",
            "@types/node": "^7.0.43",
            //routing в приложении
            "angular-router-loader": "^0.6.0",
            //так как на выходе получится бандл со встроенными темплейтами
            "angular2-template-loader": "^0.6.2",
            //чтобы не писать префиксы в css
            "autoprefixer": "^6.3.7",
            //для оптимизации работы typescript в webpack
            "awesome-typescript-loader": "^3.2.3",
            //если вдруг надо скопировать папку/файл
            "copy-webpack-plugin": "^4.0.1",
            //для работы с css
            "css-loader": "^0.28.5",
            "css-to-string-loader": "^0.1.2",
            //es6 polyfills
            "es6-shim": "^0.35.1",
            //для мобильной разработки 
            "hammerjs": "^2.0.8",
             //чтобы webpack работал с html
            "html-webpack-plugin": "^2.29.0",
            //препроцессор для более удобной работы со стилями
            "less": "^2.7.2",
            "less-loader": "^4.0.3",
            //по завершению сборки сможем вызвать коллбек
            "on-build-webpack": "^0.1.0",
            //вставляет результат работы webpack на страничку
            "raw-loader": "^0.5.1",
            //для работы со стилями
            "postcss-loader": "^1.3.3",
            "style-loader": "^0.17.0",
            //линтер
            "tslint": "^5.7.0",
            //если надо что-нибудь удалить
            "rimraf": "^2.6.1",
            //чтобы вставить картинки в css в виде base64
            "url-loader": "^0.5.8",
            //webpack
            "webpack": "^3.5.5",
            //и его встроенный express сервер
            "webpack-dev-server": "^2.7.1"
        },
    
    //когда введем в терминале эти команды с помощью npm run __command__ (например npm run serve)выполняться соответствующие команды)
        "scripts": {
    //Запускаем сервер. При каждом сохранении в вашем редакторе при работе с файлами проекта страничка будет перезагружаться, и вы будете видеть результат. Расскажем подробнее о команде. Для начала запускаем веб-сервер с данными настройками. Если мы хотим видеть в консоли, что с ним происходит (что бандлится и т. д.), используем (флаг --profile); если хотим, чтобы при сохранении в редакторе webpack автоматически обновлял результат, используем (--watch); ну а если хотим видеть проценты компиляции, можем опционально использовать (флаг –-progress).
            "serve": "webpack-dev-server --config ./webpack.config.js --profile --watch --progress",
            //то же, что и serve, но без перезагрузки страницы 
            "hmr": "webpack-dev-server --config ./webpack.config.js --profile --watch --progress",
            //создаем prod папочку с нашим проектом
            "prod": "npm run aot",
            //посмотреть как наш проект выглядит в prod, мало ли что
            "prodServer": "webpack-dev-server --config ./webpack.config.js --open",
            //очищаем ./dist на всякий случай
            "clean": "rimraf ./dist",
            //нужно, чтобы в webpack.js понять, что мы делаем aot. Делать это необязательно, но для наглядности нужно.
            "aot": "webpack",
            //тесты для приложения
            "test": "karma start"
        }
    }
    



    3) Установка модулей


    Через терминал заходим в папку, где лежит package.json, и вводим команду npm i.


    4) Установка глобальных модулей


    Так как мы используем команды rimraf, webpack и webpack-dev-server в терминале, то придется объяснить их вашему ПК с помощью команды npm i rimraf webpack webpack-dev-server -g

    После этих манипуляций наш проект пополнился папкой node_modules.




    5) README.md


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


    6) Линтер


    Создаем tslint.json, тут не буду останавливаться, так как нет серебряной пули.

    tslint.json
    {
      "rules": {
        "no-unused-variable": true,
        "curly": true,
        "no-console": [
          true,
          "log",
          "error",
          "debug",
          "info"
        ],
        "no-debugger": true,
        "no-duplicate-variable": true,
        "no-eval": true,
        "no-invalid-this": true,
        "no-shadowed-variable": true,
        "no-unsafe-finally": true,
        "no-var-keyword": true,
        "triple-equals": [
          true,
          "allow-null-check",
          "allow-undefined-check"
        ],
        "semicolon": [
          true,
          "always",
          "ignore-interfaces"
        ],
        "variable-name": [
          true,
          "ban-keywords",
          "check-format",
          "allow-leading-underscore"
        ]
      }
    }



    7) PostCss


    Создадим postcss.config.js, чтобы не писать префиксы к стилям

    postcss.config.js
    module.exports = {
        plugins: [
            require('autoprefixer')({
                browsers: [
                    'last 2 versions'
                ],
                cascade: true
            })
        ]
    };
    



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


    8) Настройка Typescript tsconfig.json


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

    tsconfig.json
    {
    //Настраиваем компилятор typescript
        "compilerOptions": {
            "target": "es5",
            "module": "es2015",
            "declaration": false,
            "moduleResolution": "node",
            "sourceMap": true,
            "emitDecoratorMetadata": true,
            "experimentalDecorators": true,
            "removeComments": false,
            "noImplicitAny": false,
            "suppressImplicitAnyIndexErrors": true,
            "skipLibCheck": true,
            "lib": ["es6", "dom"], 
            "outDir": "./dist/",
            "typeRoots": [
                "./node_modules/@types/"
            ]
        },
        "compileOnSave": false,
        "buildOnSave": false,
    //наше приложение будет лежать в папке ./src
        "include": [
            "./src/**/*"
        ],
    //запрещаем typescript обращать внимание на:
        "exclude": [
            "node_modules/*",
            "dist/*",
            "dist-serve/*",
            "node/*",
            "**/*.spec.ts"
        ],
    //настраиваем loader для webpack
        "awesomeTypescriptLoaderOptions": {
            "forkChecker": true,
            "useWebpackText": true,
            "useCache": true
        },
    //нужно для AoT
        "angularCompilerOptions": {
            "genDir": ".",
            "skipMetadataEmit" : true
        }
    }
    



    9) Настройка Webpack


    Самое сложное – дать понять webpack, что мы от него хотим. Для этого создаем webpack.conf.js, без паники, постараюсь все объяснить

    webpack.conf.js
    "use strict";
    
    //это node модули и webpack плагины, которые понадобятся нам в разработке
    const path = require('path');
    const fs = require('fs');
    const webpack = require('webpack');
    const WebpackOnBuildPlugin = require('on-build-webpack');
    const CopyWebpackPlugin = require('copy-webpack-plugin');
    const AotPlugin = require('@ngtools/webpack').AotPlugin;
    
    
    //помните, в package.json были команды serve, hmr, prod и т. д.? так вот, текущую команду (например, если вы введете npm run serve, то команда будет называться ‘serve’) можно получить и обработать вот так:
    const ENV = process.env.npm_lifecycle_event ? process.env.npm_lifecycle_event : '';
    const isStatic = ENV === 'serve';
    const isHmr = ENV === 'hmr';
    const isProd = ENV === 'prod';
    const isTest = ENV === 'test';
    const isAot = ENV.includes('aot');
    const isProdServer = ENV.includes('prodServer');
    //в зависимости от команды, мы будем объяснять webpack что делать
    
    
    //обычно из webpack.conf.js экспортируется функция, возвращающая объект с настройками
    module.exports = function makeWebpackConfig() {
    
        console.log(`You are in ${ENV} mode`); //напомнить что мы запустили
    
        let config = {}; //главный объект с настройками
    
    //если вдруг кто-то выполнит команду npm run prodServer, не выполнив предварительно npm run prod, кидаем напоминалку
        if (isProdServer) {
            if (!fs.existsSync('./dist')) {
                throw "Can't find ./dist, please use 'npm run prod' to get it.";
            }
        }
    
    //подключаем sourcemaps
        if (isHmr || isStatic) {
            config.devtool = 'inline-source-map';
        } else {
            config.devtool = 'source-map';
        }
    
    //обозначаем главный файл, который будет создавать webpack. Этот файл доступен в index.html по пути “./ng-app.js”
        config.entry = {
            'ng-app': './src/app/ng-main.ts'
        };
    
    //специально для AoT режима нужно создать другой файл с другим наполнением, так надо…
        if (isAot) {
            config.entry['ng-app'] = './src/app/ng-main-aot.ts';
        }
    
    // Имя файла, который создаст webpack будет 'ng-app’, так как задали filename: '[name].js', также когда запустим prod сборку, результирующий бандл попадет в папку './dist', это указали с помощью path: root('./dist') 
        config.output = isTest ? {} : {
            path: root('./dist'), //root – всего лишь функция, для создания правильных путей относительно папки, в которой находится webpack.config.js
            filename: '[name].js' 
        };
    
    //в свойстве entry при настройке webpack обязательно нужно задать какой-нибудь файл, иначе возникнет ошибка, но в режиме prodServer нам нужно лишь посмотреть на нашу prod сборку. По этой причине и создаем поддельный файл, чтобы сервер ни на что, кроме статики, не отвлекался. Можно в корень проекта, рядом с webpack.conf.js, положить пустой файл webpack-prod-server.js, чтобы в логи сервера не попадала ошибка, что этого файла нет, хотя и без него сервер будет работать.
        if (isProdServer) {
            config.entry = {
                'server': './webpack-prod-server.js'
            };
            config.output = {};
        }
    
    //указываем расширения файлов, с которыми webpack будет работать
        config.resolve = {
            extensions: ['.ts', '.js', '.json', '.html', '.less', '.svg']
        };
    
    //определяем так называемые loaders: если будут вопросы по ним, отвечу в комментариях. Если коротко, тут готовый пример для превращения ts в js, html вставляем в js бандл, less компилируем в css и вставляем в js бандл, картинки до 10 кб в base64 и вставляем в js бандл.
        config.module = {
            rules: [
                {
                    test: /\.ts$/,
                    use: isAot ? [{loader: '@ngtools/webpack'}] : [
                        {
                            loader: 'awesome-typescript-loader?'
                        },
                        {
                            loader: 'angular2-template-loader'
                        },
                        {
                            loader: 'angular-router-loader'
                        }
                    ].concat(isHmr ? '@angularclass/hmr-loader?pretty=' + !isProd + '&prod=' + isProd : []),
                    exclude: [/\.(spec|e2e|d)\.ts$/]
                },
                {
                    test: /\.html$/, loader: 'raw-loader',
                    exclude: [/node_modules\/(?!(ng2-.+))/, root('src/index.html')]
                },
                {
                    test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                    loader: "url-loader?name=[name].[ext]&limit=10000&useRelativePath=true"
                },
                {
                    test: /\.less$/,
                    use: [
                        {loader: "css-to-string-loader"},
                        {loader: "css-loader"},
                        {loader: "postcss-loader"},
                        {loader: "less-loader"}
                    ]
                }
            ]
        };
    
    
    
    //если работаем не в режиме тестирования, то подключаем webpack плагины
        if (!isTest) {
            config.plugins = [
    //не останавливать webpack warcher при ошибках
                new webpack.NoEmitOnErrorsPlugin(),
    //передать текущий режим в наши .ts файлы, как их получить в .ts файлах увидите чуть позже
                new webpack.DefinePlugin({
                    'process.env': {
                        'STATIC': isStatic,
                        'HMR': isHmr,
                        'PROD': isProd,
                        'AOT': isAot
                    }
                }),
    //сделать что-то по окончании сборки
                new WebpackOnBuildPlugin((stats) => {
                    console.log('build is done');
                })
            ]
    //если работаем в режиме hmr, то подключить плагин для hmr
                .concat(isHmr ? new webpack.HotModuleReplacementPlugin() : []);
        }
    
    
    
    //если вы вызовете команду ‘npm run prod’, то запустите процесс создания prod сборки с AoT
        if (isAot) {
            config.plugins = [
    //нужно для AoT режима
                new AotPlugin({
                    tsConfigPath: './tsconfig.json',
                    entryModule: root('src/app/app.module.ts#AppModule')
                }),
    //Оптимизируем полученный бандл
                new webpack.optimize.UglifyJsPlugin({
                    compress: {
                        warnings: false,
                        screw_ie8: true,
                        conditionals: true,
                        unused: true,
                        comparisons: true,
                        sequences: true,
                        dead_code: true,
                        evaluate: true,
                        if_return: true,
                        join_vars: true
                    },
                    output: {
                        comments: false
                    },
                    sourceMap: true
                }),
    //Копируем нужные нам файлы в ./dist папку (js бандл туда положит сам webpack, а мы перенесем то, что нам понадобится дополнительно)                    
     new CopyWebpackPlugin([
                    {from: 'index.html', context: './src'},
                    {from: 'assets/themes/base/fonts/**/*', context: './src'},
                    {from: 'assets/themes/base/images/other-images/**/*', context: './src'},
                ]),
                new WebpackOnBuildPlugin((stats) => {
                    console.log('build in aot is done');
                })
            ];
        }
    
    
    //Ну и наконец настроим наш webpack-dev-server
        config.devServer = {
    
            contentBase: isProdServer ? "./dist" : "./src",//корневая папка сервера, в prod режиме в ./dist, в режиме разработки в ./src
            headers: {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
                "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
            }, //стандартные заголовки для rest запросов
            historyApiFallback: true, //включаем HTML5 history api, очень удобно 1ой строкой
            compress: true,//включаем gzip
            quiet: false, //ничего лишнего нам выводить в логи не нужно
            inline: isHmr || isStatic || isProdServer, //inline mode
            hot: isHmr, //включаем hmr, если в hmr режиме
            stats: "minimal",
            port: 9000,
    //модное окно смерти при ошибке от Webpack
            overlay: {
                errors: true
            },
    //Опции для webpack warcher 
            watchOptions: {
                aggregateTimeout: 50,
                ignored: /node_modules/
            }
        };
    
        return config;
    };
    
    
    //делаем правильный путь от текущей директории
    function root(__path = '.') {
        return path.join(__dirname, __path);
    }
    



    10) Структура src


    Сейчас наш проект выглядит так, кроме папки src



    Создаем структуру в папке src:



    Пара комментариев: в папке app будет лежать наше angular приложение, в папке assets вспомогательные файлы, index.html просто кладем в src. В assets поддержим темизацию и разобьем папки для удобной работы со шрифтами, картинками, стилями.

    В нашей компании мы используем БЭМ методологию, немного переработанную и более оптимальную, на наш взгляд. base.less – агрегирующий .less файл для base темы:
    base.less
    // Common
    @import "themes/base/styles/common/normalize";
    @import "themes/base/styles/common/colors";
    @import "themes/base/styles/common/common";
    @import "themes/base/styles/common/fonts";
    @import "themes/base/styles/common/vars";
    
    // Blocks
    // (please, add new blocks in alphabetical order)
    @import "themes/base/styles/blocks/app-component";
    



    Заметим, что, на наш взгляд, следует разносить функциональную и стилевую части приложения: это решает ряд проблем как сборки, так и поддержки проекта. Если использовать БЭМ и парадигму один блок – один less файл, то проблем у подхода не обнаруживается. Однако есть куча альтернатив. Более подробно покопаться в assets можно в приложении, к этому посту. Вопросы задавайте в комментариях к статье.


    11) index.hml


    index.html – стал безумно прост в A2+ приложениях

    index.html
    
    
    
     //нужно для A2+ routing
    
    
        
        
    
    
    
    Loading...
    
    
    
    
    
    



    12) Angular app


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

    Создадим структуру в папке app:



    На первый взгляд – ребус.

    Однако если вы прошли хотя бы Angular 2+ Tutorial, то все это вам уже знакомо. Для остальных же краткие комментарии: все приложение разбито на модули, фреймворк даже предоставляет такую сущность – module. Есть главный модуль – app.module.ts, есть дополнительные модули, расширяющие функционал приложения. Большая часть приложений будет иметь home, lazy и shared модули. Названия модулей, разумеется, опциональны, однако при соблюдении правил наименования у вас не возникнет проблем с расширяемостью приложения.

    Про сам фреймворк говорить много не будем, есть отличная документация. Лучше сосредоточимся на тонких моментах:

    ng-main.ts


    С него все начинается

    ng-main.ts
    import './ng-polyfills'; //чтобы работало в ie 9+
    import …
    
    //в настройках webpack мы прокидывали переменные, тут их ловим
    if (process.env.STATIC) {
        //console.log("******************You are in Dev mode******************");
        platformBrowserDynamic().bootstrapModule(AppModule).then(():any => {});
    } else if (process.env.HMR) {
    //нужно для hmr в Angular
       //console.log("******************You are in HMR mode******************");
        bootloader(main);
    }
    
    export function main() {
        return platformBrowserDynamic()
            .bootstrapModule(AppModule)
    }
    



    ng-main-aot.ts для AoT


    Для AoT (Ahead-of-Time Compilation) режима создаем другой главный файл ng-main-aot.ts, так нужно…

    ng-main-aot.ts
    import …
    
    console.log("******************You are in prod mode******************");
    
    enableProdMode();
    
    platformBrowser()
        .bootstrapModuleFactory(AppModuleNgFactory)
        .catch(error=>console.log(error));
    



    HMR, стили, hammerjs


    HMR, стили нашего приложения (на всякий случай оставил пример подключения картинок) и настройки hammerjs для мобильной разработки подключаем в app.module.ts таким образом:

    app.module.ts
    require("style-loader!../assets/base.less"); //так подключаем стили через webpack
    
    import …
    
    //настраиваем  hammer.js
    export class MyHammerConfig extends HammerGestureConfig  {
        overrides = {
            'swipe': {velocity: 0.4, threshold: 20}
        }
    }
    
    @NgModule({
        declarations: [
            AppComponent,
        ],
        imports: [
            BrowserModule,
            HomeModule,
            NgRoutingModule
        ],
        providers: [
        ],
        bootstrap: [
            AppComponent
        ]
    })
    
    export class AppModule {
        constructor(public appRef: ApplicationRef) {}
        hmrOnInit(store) {
            if (!store || !store.state) return;
    
            if ('restoreInputValues' in store) {
                store.restoreInputValues();
            }
    
            this.appRef.tick();
            delete store.state;
            delete store.restoreInputValues;
        }
        hmrOnDestroy(store) {
            let cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement);
            store.disposeOldHosts = createNewHosts(cmpLocation);
            store.state = {data: 'yolo'};
            store.restoreInputValues  = createInputTransfer();
            removeNgStyles();
        }
        hmrAfterDestroy(store) {
            store.disposeOldHosts();
            delete store.disposeOldHosts;
        }
    }
    



    Lazy loading


    Lazy loading модулей подключаем в ng-routing.module.ts

    ng-routing.module.ts
    import …
    
    const routes: Routes = [
        {path: '', redirectTo: '/home', pathMatch: 'full'},
        {path: 'home', component: HomeComponent},
        //так подключаем lazy модули, отдельные .js файлы webpack для них создаст сам   
        {path: 'lazy', loadChildren: './modules/lazy/lazy.module#LazyModule'},
        {path: '**', component: PageNotFoundComponent},
    ];
    
    @NgModule({
        imports: [
            RouterModule.forRoot(routes)
        ],
        exports: [
            RouterModule
        ]
    })
    export class NgRoutingModule { }
    



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

    lazy.module.ts
    import …
    
    const routes: Routes = [
        {path: '', component: LazyComponent},
    ];
    
    @NgModule({
        imports: [SharedModule, RouterModule.forChild(routes)],
        exports: [LazyComponent],
        declarations: [LazyComponent]
    })
    export class LazyModule {}
    



    Хм… ну вот в принципе и все. Покопаться в app папке можно в приложении к данному посту.

    Для разработки с перезагрузкой странички на каждое изменение кода в редакторе, пишем в терминале, находясь папке с package.json: npm run serve
    То же, но без перезагрузки странички: npm run hmr
    Делаем prod сборку с AoT: npm run prod
    Запускаем статический сервер, чтобы посмотреть prod: npm run prodServer
    Почистить ./dist папку: npm run clean

    Всего несколько шагов и у нас работают: webpack сборка с Angular 4, AoT, HMR, Lazy loading. Все, включая шаблоны и стили, аккуратно кладется в бандл и оптимизируется.
    Разумеется, эту конфигурацию можно расширять, улучшать, менять, однако на мой взгляд, ее вполне достаточно, чтобы смело начать разрабатывать с Angular 2+.

    P.S.

    Небольшая реклама АoT: отличный boost к производительности вашего SPA приложения на Angular.



    Спасибо за внимание.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/337540/


    Метки:  

    «Молодые хотят покупать на бирже акции знакомых стартапов »: тренды финансов по мнению основателя сервиса Robinhood

    Суббота, 09 Сентября 2017 г. 15:46 + в цитатник


    Приложение для покупки акций Robinhood позволяет всем желающим торговать на бирже с помощью простого приложения (мы писали о нем здесь). Сейчас финтех-стартап оценивается примерно в $1,3 млрд и насчитывает около 2 млн пользователей. Один из соучредителей компании — Байджу Бхатт — дал интервью Business Insider, в котором рассказал о современном подходе к сбережениям и главной финансовой проблеме человечества. Мы публикуем главные мысли из этого разговора. Читать дальше ->

    https://habrahabr.ru/post/337538/


    Метки:  

    CaptureManager SDK

    Суббота, 09 Сентября 2017 г. 15:20 + в цитатник
    Xirexel сегодня в 15:20 Разработка

    CaptureManager SDK

      Эта статья представляет мой «Hobby» проект — CaptureManager для настольной платформы Windows. Этот проект является простым набором функционала (SDK) для включения поддержки широкого набора видео и аудио источников в разрабатываемое приложение.

      CaptureManager построен на основе Microsoft Media Foundation — нового поколения медиа технологий, заменившем объявленное устаревшем DirectShow. Microsoft Media Foundation была впервые включена в Windows Vista и получила поддержку видео и аудио источников начиная с Windows 7. Достоинством Microsoft Media Foundation является новая модель конвейера обработки медиа данных, оптимальная для многопроцессорных систем, и продолжающееся её развитие, и поддержка со стороны Microsoft.
      В проекте CaptureManager я хотел решить ряд проблем, с которыми столкнулся при написании приложений с использованием Microsoft Media Foundation:
      1. Реализация СОМ функционала. Как-бы странно это не звучало, но с технологией Microsoft Media Foundation корпорация Microsoft отступила от своей-же модели приложений – от СОМ. Конечно, все интерфейсы классов в Microsoft Media Foundation всё также являются производными от IUnknown и связаны с GUID. Но сами классы создаются через прямые «С» вызовы функций из статически линкованных системных библиотек. Это отличается от реализации DirectShow, которая требует вызова CoCreateInstance и обращения через СОМ абстракцию. На мой взгляд, данное решение корпорация Microsoft является недостатком – во-первых, затрудняется интеграция Microsoft Media Foundation в проекты, написанные не на С/С++, к примеру С# проекты, которые, кстати, на Windows взаимодействуют с СОМ объектами практически бесшовно, генерируя требуемые определения интерфейсов из TLB. Во-вторых, повышается риск потери совместимости приложения со следующей версией Windows при миграции функции из одной статически линкованной библиотеки в другую – с Microsoft Media Foundation это уже произошло однажды: Library Changes in Windows 7 — «Starting in Windows 7, certain Media Foundation functions are exported from different DLL files than previous versions.».
      2. На мой взгляд Microsoft Media Foundation черезмерно перегружена функциями и интерфейсами – было-бы неплохо спрятать большинство из них за дополнительным уровнем абстракции для оптимизации задачи захвата и записи видео и аудио данных.
      3. Значительным недостатком, на мой взгляд, является ограничения в поддержке записи видео и аудио в Microsoft Media Foundation. Microsoft Media Foundation предоставляет два механизма работы с медиа данными: через граф-топологию и SourceReader-SinkWriter. Первый предполагает сборку требуемой конфигурации из узлов-преобразователей и позволяет гибко настроить требуемую конфигурацию. Второй предлагает получение порций медиа данных от SourceReader и отправки их в SinkWriter в контексте разрабатываемого приложения. Граф-топология весьма удобна, на мой взгляд, и позволяет легко генерировать требуемую конфигурацию записи по требованию пользователя. Однако, данное решение от Microsoft не позволяет решить задачу записи – дело в том, что объект для создания рабочей сессии записи на базе топологии с интерфейсом IMFMediaSession из функции MFCreateMediaSession оптимизирован для воспроизведения медиа данных, и не выполняет ряд требуемых операций – к примеру, при окончании записи в файл, требуется выполнить расчёт метрик – подсчитать средний скорость потоков и рассчитать длительность воспроизведения – но IMFMediaSession из функции MFCreateMediaSession этого не делает – для задачи воспроизведения операция расчёта метрик бессмысленна. Также существует проблема с таймингом — IMFMediaSession из функции MFCreateMediaSession рассматривает начало воспроизведения с нулевого времени – это логично при воспроизведении медиа файла. Однако, видео и аудио источники, такие как веб-камеры или микрофоны используют текущее системное время – согласно документации Microsoft Media Foundation они должны инициализироваться нулевым значением времени, но они не выполняют данное требование.

      Я полагаю, и думаю многие согласятся, что указанные выше проблемы существенны и было-бы желательно их разрешить. Это и послужило причиной начала проекта CaptureManager (а также задача захвата видео с двух веб-камер и записи этого видео в один медиа файл).
      Вкратце, что из себя представляет CaptureManager:
      1. Полноценный СОМ In-Process Server – или как иногда называют – ActiveX. Он включает TLB и может быть интегрирован в проекты на С++, С#, Python наравне с DirectShow.
      2. CaptureManager связан с библиотеками Microsoft Media Foundation, но использует «отложенное связывание» — библиотеки Microsoft Media Foundation загружаются в коде CaptureManager и связываются с соответствующими функциями во время выполнения приложения. При невозможности найти функцию в библиотеках, она замещается на функцию-пробку, возвращающую код ошибки – E_NOTIMPL. Таким образом, CaptureManager позволяет уменьшить риск аварийного прекращения работы целевого приложения в ситуации миграции функций из одной библиотеки Microsoft Media Foundation в другую.
      3. CaptureManager имеет упрощённый набор интерфейсов. Важной особенностью является генерация данных, описывающих медиа источники, кодеки и медиа контейнеры в формате XML документа – обрабатывать XML документ намного легче, чем многочисленные Variant и PropVariant, особенно на высокоуровневых API, как WPF.
      4. CaptureManager включает в себя ряд видео и аудио источников, отсутствующих в исходном Microsoft Media Foundation: Screen Capture – для захвата изображений с дисплея (или нескольких дисплеев), AudioLoop Capture – для захвата звукового потока с аудио выхода, DirectShow-Crossbar Capture – для захвата видео с карт видео захвата.
      5. CaptureManager включает в себя «аккумулятор кадров», позволяющий получить серию крайних кадров.
      6. CaptureManager включает собственную реализацию IMFMediaSession интерфейса, оптимизированную для задачи записи – т.е. реализован полный отказ от вызова MFCreateMediaSession функции.
      7. CaptureManager включает функционал для изменения параметров видео процессора веб-камеры и параметров камеры (фокус, экспозиция, и т.п.).

      Функционал CaptureManager представлен в демонстрационных программах, доступных на GitHub — CaptureManager-SDK-Demos:
      • CPPDemos:
        1. EVRWebCapViewerViaCOMServer – простое C++ приложение для демонстрации функционала просмотра видео источников через CaptureManager рендерер.
        2. OpenGLWebCamViewerViaCOMServer – простое C++ приложение для демонстрации функционала просмотра видео источников через OpenGL рендерер.
        3. TextInjectorDemo – простое C++ приложение для демонстрации функционала смешивания теста с видео потоком с камеры.
          image
        4. WaterMarkInjectorDemo – простое C++ приложение для демонстрации функционала смешивания изображений с видео потоком с камеры.
          image
        5. EVRVieweingAndRecording – простое C++ приложение для демонстрации функционала записи с видео и аудио источников в один медиа файл.
          image
        6. NativeMediaFoundationPlayer – простое C++ приложение для демонстрации воспроизведения множества видео файлов в общем рендерере.
          image

      • CSharpDemos:
        1. WPFMultiSourceRecorder – простое C# приложение для демонстрации функционала записи с одного, двух и более видео и аудио источников в один общий медиа файл.
          image
        2. WPFMediaFoundationPlayer – простое C# приложение для демонстрации воспроизведения множества видео файлов в общем рендерере.
          image
        3. WPFVideoAndAudioRecorder – простое C# приложение для демонстрации функционала записи с видео и аудио источников в один медиа файл.
          image
        4. WPFIPCameraMJPEGMultiSourceViewer – простое C# приложение для демонстрации функционала захвата видео с нескольких Интернет камер и воспроизведения их в общем рендерере.
          image
        5. WPFMultiSourceViewer – простое C# приложение для демонстрации функционала захвата видео с нескольких нескольких и воспроизведения их в общем рендерере.
          image
        6. WPFViewerEVRDisplay – простое C# приложение для демонстрации функционала интеграции CaptureManager рендерера в WPF приложение.
          image
        7. WPFIPCameraMJPEGViewer – простое C# приложение для демонстрации функционала захвата видео с Интернет камеры.
          image
        8. WPFImageViewer – простое C# приложение для демонстрации функционала захвата изображения из файла.
          image
        9. WindowsFormsDemo – простое C# приложение для демонстрации функционала просмотра и записи видео источников.
          image
        10. WPFWebCamSerialShots – простое C# приложение для демонстрации функционала «аккумулятор кадров».
        11. WPFWebCamShot – простое C# приложение для демонстрации функционала захвата кадров с видео источника.
        12. WPFRecorder – простое C# приложение для демонстрации функционала просмотра и записи видео источников.
          image
        13. WPFWebViewerEVR – простое C# приложение для демонстрации функционала просмотра видео источников через CaptureManager рендерер.
          image
        14. WPFWebViewerCallback – простое C# приложение для демонстрации функционала захвата кадров с видео источника через копирование из потока CaptureManager.
          image
        15. WPFWebViewerCall – простое C# приложение для демонстрации функционала захвата кадров с видео источника через прямой вызов методов CaptureManager.
          image
        16. WPFSourceInfoViewer – простое C# приложение для демонстрации функционала получения информации о доступных видео и аудио источников.
          image

      • PythonDemos:
        1. CaptureManagerSDKPythonDemo – простое Python приложение для демонстрации функционала просмотра и записи видео источников.
          image

      • QtMinGWDemos:
        1. CaptureManagerSDKQtMinGWDemo – простое С++ приложение на Qt для демонстрации функционала просмотра и записи видео источников.
          image

      • UnityDemos:
        1. UnityWebCamViewer — простое приложение для демонстрации функционала работы с видео источником в Unity3D.
          image


      Больше информации о проекте можно найти сайте CaptureManager SDK. На NuGet существует C# оболочка CaptureManager.
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/337190/


      Метки:  

      [Из песочницы] Исправляем 7 распространенных ошибок обработки исключений в Java

      Суббота, 09 Сентября 2017 г. 14:21 + в цитатник
      Привет, Хабр! Представляю вашему вниманию перевод статьи Fixing 7 Common Java Exception Handling Mistakes автора Thorben Janssen.

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

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

      https://habrahabr.ru/post/337536/


      Метки:  

      Учим webworkers хорошим манерам

      Суббота, 09 Сентября 2017 г. 14:18 + в цитатник
      Рано или поздно у каждого кто работал с webworkers возникает ситуация когда код превращается в кашу вроде этого:

      main.js
      const worker = new Worker('test.worker.js');
      worker.onmessage = (data) => {
        if(data.eventName === 'someFuncResult')
          someFunc();
        else if(data.eventName === 'someFunc2Result')
          someFunc2();
      };
      
      worker.postMessage({eventName: 'someFunc'});
      

      test.worker.js
      self.addEventListener('message', (data) => {
        if(data.eventName === 'someFunc') {
          doSomeFunc();
          self.postMessage('someFuncResult');
        }
        
       if(data.eventName === 'someFunc2') {
          doSomeFunc();
          self.postMessage('someFunc2Result');
        }
      })
      


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

      Цели:
      — Читаемость кода
      — Конкурентные запросы
      — Ассинхронные функции
      — Прозрачная обработка ошибок
      — Возможность отправки промежуточных результатов выполнения процедуры

      Читать дальше ->

      https://habrahabr.ru/post/337492/


      Метки:  

      10 лет с Колибри: как это было

      Суббота, 09 Сентября 2017 г. 13:12 + в цитатник
      Обзор в честь моего 10-летия участия в проекте создания операционной системы Kolibri.

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

      image

      Читать дальше ->

      https://habrahabr.ru/post/337532/


      Метки:  

      Использование Akka в Spring-приложении

      Суббота, 09 Сентября 2017 г. 12:32 + в цитатник
      Фреймворк Akka позволяет реализовать многопоточность в Java-приложении, используя концепцию акторов, взаимодействующих посредством посылки друг другу сообщений. Создав несколько копий акторов одного и того же типа, мы можем таким образом распределить нагрузку в приложении между несколькими потоками.

      В данной статье приводится пример использования Akka в Spring-приложении, что представляет некоторую сложность, поскольку в силу ее особенностей, акторов нельзя создавать посредством простого вызова new.
      Читать дальше ->

      https://habrahabr.ru/post/337524/


      Метки:  

      [Из песочницы] Параллелизм против многопоточности против асинхронного программирования: разъяснение

      Суббота, 09 Сентября 2017 г. 11:57 + в цитатник
      Хочу представить вашему вниманию перевод статьи Concurrency vs Multi-threading vs Asynchronous Programming: Explained.

      В последние время, я выступал на мероприятиях и отвечал на вопрос аудитории между моими выступлениями о Асинхронном программировании, я обнаружил что некоторые люди путали многопоточное и асинхронное программирование, а некоторые говорили, что это одно и тоже. Итак, я решил разъяснить эти термины и добавить еще одно понятие Параллелизм. Здесь есть две концепции и обе они совершенно разные, первая синхронное и асинхронное программирование и вторая – однопоточные и многопоточные приложения. Каждая программная модель (синхронная или асинхронная) может работать в однопоточной и многопоточной среде. Давайте обсудим их подробно.
      Читать дальше →

      https://habrahabr.ru/post/337528/


      Метки:  

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

      Суббота, 09 Сентября 2017 г. 11:25 + в цитатник


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

      Такой, как доступ, который даёт API кошелька QIWI. Чтобы как можно больше разработчиков узнал и опробовало возможности автоматизации своих кошельков через наше API, QIWI проводит конкурс приложений для QIWI-кошелька, который завершится в Москве 23 сентября финальным этапом. До 15 сентября будут отобраны 15 команд, которые померяются качеством и оригинальностью своих вариантов автоматизации QIWI-кошелька ради главных призов: поездки на Singapore FinTech Festival и деловой завтрак с генеральным директором QIWI Сергеем Солониным, входящего в список «Форбс» 200 самых богатых бизнесменов России.

      Но даже если вы не разработчик, то помочь участникам хакатона и получить за это свой приз можно будет, дочитав этот пост до конца — мы расскажем, как принять участие в конкурсе самых перспективных идей приложений для QIWI-кошелька.
      Читать дальше ->

      https://habrahabr.ru/post/337522/


      Метки:  

      Охотники за багами: тестировщики АСКОН проходят испытание хитрыми вопросами

      Суббота, 09 Сентября 2017 г. 11:09 + в цитатник
      9 сентября весь софтверный мир отмечает День тестировщика. Мы решили устроить праздничное испытание самим специалистам по тестированию АСКОН и попросили их ответить на целый ряд каверзных вопросов — о себе и о том, как происходит охота за ошибками не только в ПО, но и в обычной жизни. Оказалось, что наши ребята не прочь потестировать космические корабли, компьютерные игры и вина, получают удовольствие от найденных багов, но благосклонно относятся к несовершенствам этого мира, выходят из сложных ситуаций с помощью своей дотошности и одинаково хорошо понимают и разработчиков, и пользователей.


      Осторожно, трафик.
      Читать дальше ->

      https://habrahabr.ru/post/337472/


      [recovery mode] Microservice Architecture — сдвиг мотива на цель

      Суббота, 09 Сентября 2017 г. 09:37 + в цитатник
      В статье Мартина Фаулера и Джеймса Льюиса, в которой описываются достоинства «Microservice Architecture», написано:

      Enterprise приложение — приложение, построенное как единое целое. ЛЮБОЕ изменение в системе приводит к пересборке и равертыванию новой версии серверной части приложения.

      Понятно стремление авторов быть пропагандистами «Microservice Architecture», однако использование таких определений как ЛЮБОЕ, ВСЕГДА, НИКОГДА говорит о слишком эмоциональном отношении к предмету. Налицо попытка увлечь читателя эмоциями, отключить его мозг. Когда авторы используют такие преувеличения, где-то тут должен скрываться чорт. Так где же он, рогатый? Читать дальше ->

      https://habrahabr.ru/post/337526/


      Метки:  

      Практика формирования требований в ИТ проектах от А до Я. Часть 5. Сущности предметной области. Немного о стратегиях

      Суббота, 09 Сентября 2017 г. 08:02 + в цитатник
      С частью 4 можно ознакомиться, перейдя по ссылке

      VIII Определяем сущности предметной области


      Все, что видим мы, — видимость только одна.
      Далеко от поверхности мира до дна.
      Полагай несущественным явное в мире,
      Ибо тайная сущность вещей — не видна
      Омар Хайям


      Определив абстрактные хранилища продукта, мы получаем костяк для построения детальной модели данных. При проектировании структуры сущностей продукта, удобно использовать канонические диаграммы «Сущность-связь» (ERD), логическую диаграмму (Logic Diagram) или диаграмму классов (Class diagram).

      Цель этой группы работ — спроектировать модель хранилищ данных для использования в продукте, а также задокументировать сущности системы и способы их взаимодействия.

      Теория проектирования такого типа диаграмм детально изложена в литературе, описывающей работу с UML. Например, эта тема очень удачно представлена в [11]. Поэтому остановлюсь лишь на некоторых аспектах, интересных на мой взгляд,.
      Читать дальше ->

      https://habrahabr.ru/post/337400/


      PUSH-авторизация в сервисах с помощью мобильного приложения

      Пятница, 08 Сентября 2017 г. 21:10 + в цитатник

      Мы рады представить сообществу сервис PushAuth, который позволяет Вашим клиентам авторизироваться с помощью PUSH-сообщений на мобильном устройстве!



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

      Читать дальше ->

      https://habrahabr.ru/post/337072/


      Метки:  

      Security Week 36: черная дыра в ядре Windows, омограф Adobe атакует, крупнейшая утечка данных в США

      Пятница, 08 Сентября 2017 г. 20:39 + в цитатник
      Исследователи из EnSilo объявили, что нашли баг в ядре Винды, да какой! Он может не позволить антивирусу узнать о загрузке исполняемого файла. Эксплуатация такой дыры напрочь исключает возможность проверки файла при запуске, то есть троянец может фактически обезвредить защитное решение.

      Глюк был найден в PsSetLoadImageNotifyRoutine – функции уведомления, которая вызывается в момент загрузки виртуального образа. Без ее корректной работы контролировать запуск PE-файлов затруднительно, но именно там разработчики Microsoft оставили баг, из-за которого В ОПРЕДЕЛЕННЫХ УСЛОВИЯХ вредоносный файл может быть запущен незаметно для всех, кому это может быть интересно.
      Читать дальше ->

      https://habrahabr.ru/post/337520/


      Метки:  

      [Из песочницы] Как настроить рассылку отчетов из Яндекс. Метрики с помощью R (с нуля)

      Пятница, 08 Сентября 2017 г. 19:37 + в цитатник
      Яндекс.Метрика — отличный инструмент для сбора данных о посещениях сайта, но, к сожалению, бывает так, что в веб-интерфейсе не хватает того или иного функционала – например, автоматической отправки отчета. В этой статье я подробно опишу, как получить статистику по роботности c помощью языка R.

      Преимущества автоматической отправки отчетов:


      • Можно заранее настроить необходимый формат отчетов и не тратить время на выгрузки при приближении дедлайнов;
      • Нет ограничений по формату и периодичности выгрузки

      Читать дальше ->

      https://habrahabr.ru/post/337518/


      Метки:  

      Как мы разрабатывали дашборд для Zabbix и оптимизировали работу дежурных

      Пятница, 08 Сентября 2017 г. 18:54 + в цитатник

      Не так давно в компании, где я работаю, решили перейти на новую систему мониторинга — и выбор пал на Zabbix. Аргументы в пользу данного решения приводить не буду (думаю, что это тема для отдельной статьи). До этого у нас была система мониторинга HP SiteScope, но со временем из-за расширения инфраструктуры и увеличения числа объектов мониторинга она стала слишком дорогой.


      image

      Читать дальше ->

      https://habrahabr.ru/post/337414/


      Метки:  

      Эра IoT: как входить?

      Пятница, 08 Сентября 2017 г. 18:17 + в цитатник
      Сегодня мир стоит на пороге массового внедрения Интернета вещей (IoT) в повседневную жизнь и бизнес. Ожидается, что его серьезное развитие неразрывно связано с новым стандартом мобильной связи 5G, находящегося на завершающих этапах разработки и тестирования. С его помощью человек сможет управлять множеством подключенных к сети «умных» устройств. Впрочем, и сегодня есть девайсы, технические характеристики которых позволяют даже в рамках возможностей существующих сетей администрировать работу IoT-устройств.


      Читать дальше ->

      https://habrahabr.ru/post/337508/


      Метки:  

      40 эффектных ARKit демок, которые вскоре увидят мир

      Пятница, 08 Сентября 2017 г. 17:54 + в цитатник


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

      Итак, перейдем к рассмотрению демоприложений с применением ARKit.
      Читать дальше ->

      https://habrahabr.ru/post/336964/


      Метки:  

      Поиск сообщений в rss_rss_hh_new
      Страницы: 1437 ... 1135 1134 [1133] 1132 1131 ..
      .. 1 Календарь