• Как связанны TaskScheduler и SynchronizationContext в C#?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    TaskScheduler - это низкоуровневая абстракция, предназначенная для постановки задачи в очередь исполнения на потоках.

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

    Говоря простым языком, когда нужно (имеет смысл для десктопных приложений, у которых есть основной поток, исполняющий UI, графический интерфейс), synchronization context запомнит ваше окружение - поток, точку вызова, выполнит асинхронную операцию на другом потоке и продолжит исполнение результатов в заполненном потоке.

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

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

    Но, для winforms / wpf это очень важный механизм, так как любое взаимодействие с интерфейсом возможно только из потока UI.
    Ответ написан
    Комментировать
  • Как заменить отпечатки браузера на C# Selenium?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    > Мне нужно менять User agent, размер экрана, и т.д. и т.п.
    User agent для google chrome:

    var options = new ChromeOptions();
                options.AddArgument("--user-agent=New User Agent");
                var driver = new ChromeDriver(options);


    Для других драйверов способ может отличаться.

    Размер экрана можно выставить через следующую команду:
    driver.Manage().Window
                    .Size = new System.Drawing.Size(width, height)


    Вообще, настройки и взаимодействие с окном (браузера) происходит через:

    driver.Manage().Window
    Ответ написан
    Комментировать
  • Как исправить ошибку авторизации Json rpc?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    один из моих методов обращается на этот адрес для добавления пользователей в систему

    А вы туда передаете свой токен, что передаете, когда обращаетесь на test.ru/api/jsonrpc?
    Судя по всему, не передаете.
    Перед обращением ко второму, нужно взять данный токен из заголовков запроса и передать его дальше, и так - для всех методов, требующих авторизации.
    Ответ написан
  • Как ускорить инсерты в базу sql?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Лучше всего делать пакетную вставку или же конвертировать xml в соответствующий sql (с теми же пакетными вставками) и выполнить его через
    mysql -u username -p password database_name < /path/to/your/file.sql

    Обратите внимание, на -p password, между ними, если мне не изменяет память, нет пробела.

    Для варианта с SQL формируйте вот такое:
    INSERT INTO tbl_name
        (a,b,c)
    VALUES
        (1,2,3),
        (4,5,6),
        (7,8,9);


    Только не три строки, а по 100-500 - думаю подберете соотношение.

    Примерный код формирования, основанный на вашем примере:
    <?php
    $batchSize = 1000;
    $counter = 0;
    $valuesBatch = array();
    
    foreach ($leiLEIobj as $leiLEIs)
    {
        foreach ($leiLEIobj as $leiLEIs)
        {
            $LEI = $leiLEIs->nodeValue;
            $arResult[$LEI][$leiLEIs->nodeName] = $LEI; 
            //$LEIs[$row->nodeName] = $row->nodeValue;
        }
    
        $valuesBatch[] = "($values)";
        $counter ++;
        
        if ($counter==$batchSize)
        {
            $qwery = strtr(
                "INSERT INTO `leis`($fields) VALUES ($values) :text",
                array(
                    ':text' => implode(",\r\n", $valuesBatch)
                )
            );
    
            // Выполнить запрос или записать его в общую переменную-накопитель
            $counter = 0;
            $valuesBatch = array();
        }
    }


    P.S. csv так же можно сформировать нужным образом из XML, дополнив значениями по умолчанию те, которых в xml-строке нет, а дальше что-то подобное вот этому:
    LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (col1, col2, col3, col4, col5...);
    Ответ написан
    9 комментариев
  • Как изменить формат даты публикации в дополнении Articles?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Рекомендую глянуть в "Расширенные настройки" -> "Общее" -> "Articles URL Format", параметр в самом конце.
    Там еще должны быть параметры, точнее сейчас не скажу уже.

    UPD. Вам нужно вот это:
    5c629b9f527e4358149005.png
    Ответ написан
    1 комментарий
  • В какой кодировке сохранить данные excel?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Судя по всему, вы бинарные данные как json обрабатываете.
    Я бы пересмотрел в принципе скачивание отчета - я бы не возвращал данные, но возвращал бы ссылку, по которой можно скачать файл.

    Общими словами, ваш POST-запрос строит excel и сохраняет его в файловую систему. На выходе получается ссылка на нее, она отдается клиенту.
    Клиент переходит по ссылке (редирект тот же, к примеру), файл скачивается и удаляется с сервера.
    Ответ написан
    2 комментария
  • Как прочитать DBF в ASP.net core?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вы вот это смотрели?



    UPD. А вот это не смотрели ?

    1. https://www.nuget.org/packages/System.Data.Odbc/
    2. https://dotnet.myget.org/feed/dotnet-core/package/...


    Как я понял, они есть в .NET Core
    Ответ написан
    3 комментария
  • Как лучше динамически генерировать модели из C# в 1С?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Если честно, не вижу проблемы использовать кириллицу в качестве классов в C#. Это работает, хоть и выглядит не очень (ну и красота - субъективное понятие).

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

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

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

    p.s.
    Опять же, вариант с настройкой на вашей стороне может позволить вам использовать библиотеки вида Automapper, к примеру - но, там, скорее всего, только через кодогенерацию.
    Ответ написан
    1 комментарий
  • Как проверить, изменилось ли поле в сущности?

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

    namespace AppBundle\Entity;
    
    use DateTime;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\HasLifecycleCallbacks
     */
    abstract class EntityBase
    {
    
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @var DateTime
         *
         * @ORM\Column(name="created_at", type="datetime")
         */
        protected $createdAt;
    
        /**
         * @var DateTime
         * @ORM\Column(name="updated_at", type="datetime")
         */
        protected $updatedAt;
    
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * 
         * @return \DateTime
         */
        public function getCreatedAt()
        {
            return $this->createdAt;
        }
    
        /**
         * 
         * @return \DateTime
         */
        public function getUpdatedAt()
        {
            return $this->updatedAt;
        }
    
        public function setId($id)
        {
            $this->id = $id;
        }
    
        public function setCreatedAt($createdAt)
        {
            $this->createdAt = $createdAt;
        }
    
        public function setUpdatedAt($updatedAt)
        {
            $this->updatedAt = $updatedAt;
        }
    
        /**
         *
         * @ORM\PrePersist
         * @ORM\PreUpdate
         */
        public function updatedTimestamps()
        {
            $this->setUpdatedAt(new DateTime('now'));
    
            if ($this->getCreatedAt() == null) {
                $this->setCreatedAt(new DateTime('now'));
            }
        }
    }
    Ответ написан
    Комментировать
  • ASP.NET Core запрос?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Слишком мало данных. Где схемы моделей?
    В теории, как вы можете логировать свои получения, сохраняя сколько и от кого.

    Ну и потом просто подсчитать в нужный момент: сколько и от кого (группировка от кого и сумма по значению, к примеру), и, если ваше условие выполнено, то проставить тем, от кого пришло свои +5.
    Ответ написан
    1 комментарий
  • Работа с большим объемом данных node mysql?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вы не смотрели на 13.2.5.2 INSERT ... ON DUPLICATE KEY UPDATE Syntax ?

    Можно вставлять записи и на конфликте вставки будет делаться UPDATE. Для 50k записей вычислять те, которых нет без предварительной загрузки их БД, как мне известно - не самый быстрый вариант.

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

    UPD. Забыл написать - можно вставлять пачками, подобным образом:

    INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
    ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
    Ответ написан
    3 комментария
  • Как построить запрос на обновление в postgressql?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    update table_name set column_name  = 'city | JACKSONVILLE'
    where id in (select id from table_name where column_name = 'city | (''JACKSONVILLE'',)')


    А вообще, если есть разные сочетания и их много - просто сделайте update по
    where ... like '%JACKSONVILLE%', но обязательно просмотрите, чтобы там не было 'JACKSONVILLE','BLAH2' и т.п.

    Т.о., обобщив, можно сказать, чтобы обновить эти записи, нужно получить их id и просто выполнить запрос вида

    update table_name set column_name  = 'city | JACKSONVILLE'
    where id in (...)
    ,
    где ... - список идентификаторов строк, которые нужно обновить, через запятую, к примеру 1,3,8.
    Ответ написан
    Комментировать
  • Как залогировать каскадное удаление?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Где Вы хотите это фиксировать?

    Каскадное удаление происходит, как известно, за счет того, что у ваших внешних ключей стоит ON DELETE CASCADE. На мой взгляд, тут лучше ON DELETE NO ACTION, что заставит Вас руками удалять предварительно все связанные данные, которые ссылаются на удаляемый объект, что как раз и приведет Вас у полному контролю процесса удаления с фиксацией транзакций, с записью контекстной информации и т.п.

    А вообще, бизнес обычно не разрешает удалять, только отметить как удаленный, с сохранением информации о том, кто, когда. Тут мы делаем просто UPDATE и ставим нужные поля, но, делаем опять же, для всех связанных данных, которые зависят от удаляемого объекта.
    Ответ написан
    2 комментария
  • Как уведомлять о изменении в таблицах sqlserver на delphi?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    А какая версия SQL Server?
    У него есть такая штука, как Service Broker ( https://docs.microsoft.com/en-us/sql/database-engi... ). Он доступен с SQL Server 2008, ЕМНИП и пришел на смену Notification Services.

    Так же, можно почитать на Stackoverflow вот этот вопрос - https://stackoverflow.com/questions/7843019/how-to... , и вот тут: www.sql.ru/forum/1209855/sdac-problema-pri-rabote-...
    Ответ написан
    Комментировать
  • Как исправить проблему с неправильным .htaccess настройкой плагина babel в modx?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Какая ошибка выходит, если открыть версию статьи на английском?
    ЧПУ включен или нет?
    Плагин поставили на OnHandleRequest?

    Плагин должен быть примерно таким:
    <?php
    if($modx->context->get('key') != "mgr")
    {
        /* grab the current langauge from the cultureKey request var */
        $currCultureFromRequest = isset($_REQUEST['cultureKey']) ? $_REQUEST['cultureKey'] : NULL;
        $modx->log(modX::LOG_LEVEL_DEBUG, 'pageRouting: Income context key ' . $currCultureFromRequest);
        switch ($currCultureFromRequest) 
        {
            case 'ru':
            case 'en':
                /* switch the context */
                $modx->switchContext($currCultureFromRequest);
                $modx->log(modX::LOG_LEVEL_DEBUG, 'pageRouting: Context switched to ' . $currCultureFromRequest);
                break;
            default:
                /* Set the default context here */
                $modx->switchContext('web');
                $modx->log(modX::LOG_LEVEL_DEBUG, 'pageRouting: Context switched to web');
                break;
        }
        unset($_REQUEST['cultureKey']);        
    }


    .htaccess для него вот такой (с оговорками, пути от вас зависят):
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(web|en|ru)/assets(.*)$ assets$2 [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(web|en|ru)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
    # остальные Ваши настройки/директивы для apache/php


    Опять же, должны быть установлены контексты, настройки и т.п.

    Официальная ссылка, где все это описано - www.multilingual-modx.com/blog/2011/seo-friendly-m...
    Ответ написан
    2 комментария
  • Почему редактируется файл htaccess?

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

    Что это за код - это похоже на шаблонный .htaccess для modx. \x20 это пробел (www.codetable.net/hex/20). Судя по всему, он генерируется установочным файлом. У вас modx Вы сами ставили или как приложение хостинга, из панели управления?
    Ответ написан
    1 комментарий
  • Как проксировать java-приложение?

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

    server {
        listen jira.orgname.local:80;
        server_name jira.orgname.local;
        location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://jira.orgname.local:8080/;
            client_max_body_size 1000M;
        }
    }


    Так же, у меня есть случаи проксирования через IIS - там я ставил Application Request Routing, URL Rewrite. В общем-то, тоже ничего сложного и военного нет.

    Есть Java веб-приложение, гвоздями прибитое к Windows (работает на локальном Jetty) и доступное по адресу localhost:8080/app


    Оно же доступно по <PC-NAME>:8080/app, где PC-NAME - это имя вашего компьютера ?
    Просто, если оно слушает только Localhost, ему нужно сказать, чтобы оно слушало 0.0.0.0 или какой-то конкретный IP. Или предварительно пробросить на внешний порт, открытый в файрволле.

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

    Попробуйте проверить само приложение, может у него есть что-то, что мешает работе.
    Так же, я бы рекомендовал бы почитать вот тут - https://serverfault.com/questions/824140/nginx-log... . На словах, нужно влючить логирование для proxy_pass и посмотреть, что происходит при ошибке.
    Ответ написан
    2 комментария
  • Как вы пишите дебаг? Какие устоявшиеся методики существуют?

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

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

    Кроме вышеперечисленного, для отладки, а точнее, для того, чтобы быть уверенным, что все идет именно так, как должно идти, пишут тесты. Unit-тесты, интеграционные тесты, тесты UI и т.п. И все это, в совокупности (логирование и исполнение тестов), дает относительно полное понимание, что все идет так как надо, а если не идет - вы видите, что в тесте A все сломалось, а в логах - что сломалось именно.
    Ответ написан
    Комментировать
  • Почему база данных mysql иногда висит?

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

    На быстродействие БД может повлиять все из вышеперечисленных.

    Есть ли настройка в конфигурации БД, чтобы она логировала медленные запросы?
    Что говорит EXPLAIN по данному запросу?
    Возможна ли ситуация, когда данный запрос выполняется разными пользователями?
    Сколько подключений разрешено к БД?
    Ответ написан
    Комментировать
  • Как уменьшить расход памяти в DataGrid у WPF?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Я поддержу совет с постраничным выводом.
    Кроме этого, проверьте, как будет себя вести таблица без использования DataTable, как источника данных.
    Можно сделать класс-контракт, его свойства промаркировать Display-атрибутами. Затем, коллекцию с элементами данного класса использовать как источник данных.

    Сам по себе, DataTable весьма избыточный для простой задачи отображения данных, и, если вы его используете только как источник данных (без использования возможности сортировки, к примеру и т.п.) - он не нужен.
    Ответ написан
    3 комментария