Использование модуля для обработки ошибок

Приложение можно скачать здесь.

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

var __error = window.onerror;
var __es = [];
// дополнительные параметры
var __meta = {
    user: 'test',
    ver: '1.0.0' // указание версии обязательно
};
var __ts = null;
window.onerror = function (msg, url, num, p, err) {
    var str = '';
    if (err && (str = err.stack)) {
        __es.push(str.replace(new RegExp(location.href, 'gi'), ''));
        if (__ts == null) {
            __ts = setTimeout(function () {
                clearTimeout(__ts);
                __ts = null;
                __se();
            }, 500);
        }
    }

    if (__error)
        return __error(msg, url, num, p, err);

    return false;
}
/**
 * отправка сообщений об ошибке
 */
function __se() {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", 'http://localhost:3000/api/error?id=1', true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify({
        m: __meta,
        e: __es
    }));
}

Заменив в нем адрес отправки http://localhost:3000/api/error?id=1 не требуемый. При этом идентификатор приложения (id) можно указать любой.
Так же с клиента можно дополнительно передавать требуемые поля для анализа в объекте __meta.

Серверное приложение имеет три активные ссылки:

  • /api/error — принимает постовые запросы с ошибками
  • /list?id=1&ver=0.0.0 — выводит список ошибок по приложению (id) и версии (ver)
  •  /upload — позволяет загружать на сервер приложения для обработки

Для корректной работы требуется:

  • чтобы в папке public были созданы папки: apps, logs, temp
  • дать права этим папкам на запись

Распознавание текста с изображения

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

Данное приложение можно установить, как на Linux, так и на Windows. Далее будет показан пример работы с данным приложение под Windows.

Скачиваем установочный файл http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.00dev.exe

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

cd /d «C:\Program Files (x86)\Tesseract-OCR»

tesseract.exe «c:\… путь к изображению.png» «e:\text» -l eng -psm 3

где «e:\text» — путь к файлу, где будет «распарсенный» текст,

-l eng — язык распознования (можно указать и rus, но для этого надо загрузить данные)

-psm 3 — параметр по умолчанию

Всю справочную информацию можно получить выполнив команду tesseract.exe —help

Чтобы дополнительно подключить другие языки распознаванию нужно с https://github.com/tesseract-ocr/langdata скачать требуемый файл *.traineddata и перенести его в папку C:\Program Files (x86)\Tesseract-OCR\tessdata

Есть изображение с указанным текстом tesseract «путь к изображению.png» «e:\text» -l eng -psm 3 и в папке e:\ будет файл text.txt в котором будет текст Hello my friend

Запуск node js приложения на iis

Установка Node Js
1.Устанавливаем nodejs https://nodejs.org/en/ (ставить последнюю LTS версию)
2.https://github.com/tjanczuk/iisnode — от сюда устанавливаем расширение для iis (см. Installing for IIS 7.x/8.x)

Настройка IIS

1. https://www.iis.net/downloads/microsoft/url-rewrite устанавливаем расширение для iis

2. Перезагрузить сервер

Статьи:

https://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWindowsAreYouMad.aspx

https://tomasz.janczuk.org/2013/01/hosting-socketio-websocket-apps-in-iis.html

Создание клиента socket.io на c# для nodejs

1. Создаем консольное приложение
2. Install-Package SocketIoClientDotNet

using System;
using Quobject.SocketIoClientDotNet.Client;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var socket = IO.Socket("http://localhost:5000/server.js");
            socket.On(Socket.EVENT_CONNECT, () =>
            {
                socket.Emit("message", "0");
 
            });
 
            socket.On("hi", (data) =>
            {
                Console.WriteLine(data);
                socket.Disconnect();
            });
            Console.ReadLine();
        }
    }
}

Статьи:

https://github.com/Quobject/SocketIoClientDotNet

Отладка в nodejs

Актуально для версии Node JS 8.9.0

Устанавливаем:
npm install —global node-inspect

Выполняем команду: node —inspect-brk [filename].js

Должен открыться chrome для начала отладки

Полезные статьи.

https://nodejs.org/en/docs/inspector

https://nodejs.org/api/debugger.html

https://github.com/nodejs/node-inspect

Sencha cmd — быстрый старт

Создание проекта:

— генерация проекта
sencha -sdk «D:\Install_new\sencha\ext-6.0.0-gpl\ext-6.0.0\» generate app App1 «E:\serp\work\_sencha\App1»
— или
sencha -sdk «D:\Install_new\sencha\ext-6.0.0-gpl\ext-6.0.0\» generate app -modern App1 «E:\serp\work\_sencha\App1»

— дальше перейти в сгенерированный проект
cd /D «E:\serp\work\_sencha\App1»

— запускаем проект, теперь он доступен по адресу http://localhost:1841/
sencha app watch

— билдим
sencha app build modern production
sencha app build modern production «d:/temp»
sencha app build modern testing

— дополнительный действия при билде(build.xml), в примере ниже копирование файла config.json



Как собрать проект под android:

— чтобы cordova была доступна из командной строки
npm install -g cordova

— подготавливаем проект, создает папку cordova и добавляет в app.json «builds»: «native», если builds не был определен

— «builds»: «native» надо будет еще подправить ручками, выбрать «platforms»
sencha cordova init com.iserv.cabinet Cabinet

«builds»: {
«native»: {
«packager»: «cordova»,
«cordova»: {
«config»: {
«platforms»: «android»,
«id»: «com.iserv.cabinet»,
«name»: «Cabinet»
}
}
}
},

— запускает приложение на android
sencha app run native

— билдит мобильную версию. Для android результат кладет в cordova\platforms\android\build\outputs\apk\android-debug.apk
sencha app build native

— установка на android
D:\android-sdk\platform-tools\adb kill-server
D:\android-sdk\platform-tools\adb install -r «cordova\platforms\android\build\outputs\apk\android-debug.apk»

— shell
D:\android-sdk\platform-tools\adb shell
D:\android-sdk\tools\ddms.bat
— какие устройства подключены к компьютеру
D:\android-sdk\platform-tools\adb devices

Запуск тестов Siesta из консоли с помощью PhantomJS

В проект добавлен скрипт run-siesta.js в папку с тестами. Он предназначен для того, чтобы с помощью PhantomJS запускать тесты Siesta. run-siesta.js использует API PhantomJS для запуска страницы c тестами и выводит в консоль и в текстовый файл siesta_log.txt логи, которые формируются на странице index.html.

Также в скрипте index.js изменен Harness.configure — в него добавлены дополнительные обработчики событий: testfinalize, testsuiteend и условие автозапуска autoRun: true.

При завершении тестов run-siesta.js парсит тестовую страницу на общее количество пройденных тестов, выводит общее затраченное время и возвращает соответствующий числовой идентификатор в консоль (0 – успех, 1 — ошибка).

Пример команды в консоли: D:\…\Omnis-ExtJS\Pir\Siesta\phantomjs run-siesta.js http://localhost:62681/Siesta/index.html

Для выполнения команды ‘phantomjs’ нужно установить сам PhantomJS — http://phantomjs.org/download.html, и прописать в PATH системы — путь к исполняемому файлу phantomjs.exe, или скопировать phantomjs.exe в папку с тестами D:\…\Omnis-ExtJS\Pir\Siesta\ и запускать команду: D:\…\Omnis-ExtJS\Pir\Siesta\phantomjs.exe run-siesta.js http://localhost:62681/Siesta/index.html На момент написания использовалась версия PhantomJS 2.0 — http://phantomjs.org/

Sencha CMD. Как правильно подключить собственные библиотеки.

Надо начать с того, что приложение, запущенное с помошью «sencha app watch», работает немного по-другому, чем приложение, собранное с помощью «sencha app build».

В случае «sencha app watch» нет никакого минификатора, загрузка библиотек идет из секции «js», определенной в файле app.json. Единственное, что собирается, это стили css, они кидаются в папку build/temp

В случае «sencha app build» есть минификатор, все библиотеки собираются в один файл. Пути для минификатора прописываюся в секции «classpath» файла app.json. При этом загрузку библиотек из секции «js» тоже никто не отменяет.

Из этого рождаются правила:
•если вы хотите подключить свою библиотеку, поместите ее в один из каталогов, определенный в «classpath», этим мы обеспечим то, что наша библиотека попадет в общий файл при работе минификатора.
•пропишите путь к этой библиотеки в секции «js», это позволит загружать ее при команде «sencha app watch».
•для прописанного пути в секции «js» поставьте «bootstrap»: true. Это нужно для того, чтобы эти пути учитывались только для «sencha app watch», но не попадали в финальный файл конфигурации после команды «sencha app build».

Если что-то сделать неправильно, то Extjs ругнется примерно такими словами: «Failed to resolve dependency It.app.Application…»
Пример подключения библиотеки it.core.js:

"classpath": [
     "app",
     "${toolkit.name}/src"
 ],
 
"js": [
     {
         "path": "app/it.core.js",
         "bootstrap": true
     },
     ...
 ],

setInterval или Ext.direct.PollingProvider

Иногда в приложениях требуется обращение к серверу по определенному интервалу времени. Стандартными средствами JavaScript’a это делается примерно так:

setInterval(function() {
     RPC.util.Format(function() {
           ...
     });
}, 5000);

Но в ExtJS есть более корректный подход, использовать Ext.direct.PollingProvider. Если кратко, то Ext.direct.PollingProvider — это провайдер, который сам запрашивает данные с сервера с помощью direct-функции по таймеру.

PN.RPC.POLLING_API = {
           type: 'itpolling',
           pollFn: 'RPC.util.Format,
           id: 'datePoller',
           interval: 2000,
           listeners: {
               data: function (provider, e, eOpts) {
                    // e.response - здесь хранится результат выполнения
                    var poll = Ext.direct.Manager.getProvider('datePoller');
                    poll.disconnect(); // если хотим завершить запросы
               }
           }
       };
       setInterval()
       // register the polling API to the PollingProvider.
       Ext.Direct.addProvider(PN.RPC.POLLING_API);

Данный способ отлично подходит если, например, нужно запрашивать какую-либо direct — функцию. В руководстве ExtJS type указан как polling, но здесь используется наши itpolling В нем переопределены некоторые методы для работы с нашим itdirect

!!!Внимание. Помните о том что большое количество запросов к серверу могут «положит» пул IIS

Код провайдера

Ext.define('It.direct.PollingProvider', {
    extend: 'Ext.direct.PollingProvider',
    alias: 'direct.itpollingprovider',
    requires: [
        'Ext.Ajax',
        'Ext.util.TaskRunner',
        'Ext.direct.ExceptionEvent'
    ],
    type: 'itpolling',
 
    /*
     * переопределен
     */
    onData: function (opt, success, response) {
        var me = this,
            i, len, events;
        if (success) {
            //events = me.createEvents(response);
            //for (i = 0, len = events.length; i < len; ++i) {
                me.fireEvent('data', me, response);
            //}
        } else {
            events = new (Ext).direct.ExceptionEvent({
                data: null,
                code: Ext.direct.Manager.exceptions.TRANSPORT,
                message: 'Unable to connect to the server.',
                xhr: response
            });
            me.fireEvent('data', me, events);
        }
    },
 
    /*
     * переопределен
     */
    onPollFn: function (result, event, success, options) {
        this.onData(null, success, {
            response: result
        });
    }
}) 

Работа с датами в ExtJS. Меняем локализацию

По умолчинию ExtJS применяет en-локализацию. Чтобы поменять ее на ru выполните следующие действия:

— в app.json добавляем следующие параметры:

"requires": [
    "font-awesome",
    "ext-locale" // пакет с локализациями
],
 
"locale": "ru" // устанавливаем культуру

Полный перечень культур можно посмотреть в папке ext\classic\local\overrides

— после этого запускаем команду app build

— открываем файл ext\classic\local\overrides и добавлем следующие параметры в объект Ext.locale.ru.form.field.Date

 ***
format: "d.m.Y",
dateFormat: "d.m.Y", // формат даты который выводиться в поле
submitFormat: 'm/d/Y H:i:s' // требуется для правильного конвертирования даты на клиенте
  ***

— далее в настройках прокси, для store, требуется указать следующий параметр

Ext.define('PN.store.FS_Service_Groups_FS_ServicesCollection_ListView',
{
    extend: 'Ext.data.Store',
    model: 'PN.model.FS_Service_Groups_FS_ServicesCollection_ListView',
    //autoLoad: true,
 
    remoteFilter: true,
    remoteSort: true,
    remoteGroup: true,
 
    proxy: {
        type: 'itdirect',
        api: {
            read:       PN.Domain.FS_Services.Query,
            create:     PN.Domain.FS_Services.Add,
            update:     PN.Domain.FS_Services.Update,
            destroy:    PN.Domain.FS_Services.Delete
        },
        reader: {
                successProperty: 'success',
                rootProperty: 'records',
            } ,
        writer : {
        dateFormat: "d.m.Y H:i:s" // даты на сервер будут возвращаться именно в этом формате
        }
    }
});