вторник, 15 мая 2018 г.

Ошибка подключения к удаленному рабочему столу "CredSSP"

Проблема

При попытке подключения к удаленному рабочему столу на одном из серверов получил такую ошибку

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


Решение

Причина и решеиние достаточно подробно описаны в статье
https://habr.com/company/vps_house/blog/358190/

Помогла служба поддержки хостинга

суббота, 12 мая 2018 г.

Генерация файла sitemap.xml на C# для ASP.NET проекта

Задача

Сгенерировать файл sitemap.xml на C# для ASP.NET проекта

Файлов в проекте нет - контент генерируется динамически

Решение


помог проект https://github.com/aseemgautam/google-sitemap

нашел его в ветке https://stackoverflow.com/questions/13449103/how-to-create-xml-sitemap-programmatically-in-c-sharp


Проект достаточно простой. Я просто интегрировал 3 файла в свой проект (немного переписав неймспейсы)

Идея: создать список объектов SitemapLocation и заслать их в объект SiteMap.
Ниже - 2 примера использования

                  public static string GetSitemap(
            List<SitemapLocation> locations
            )
        {
            Sitemap sitemap = new Sitemap();
            sitemap.AddRange(locations);            
            return sitemap.WriteSitemapToString();
        }

        public static void WriteSitemapToFile(
            List<SitemapLocation> locations,
            string fileName
        )
        {
            Sitemap sitemap = new Sitemap();
            sitemap.AddRange(locations);
            sitemap.WriteSitemapToFile(fileName);            
        }

Сам список локейшенов создается примерно так

            var res = new List<SitemapLocation>();

            res.Add(new SitemapLocation
            {
                ChangeFrequency = SitemapLocation.eChangeFrequency.weekly,
                Priority = 0.5,
                Url = UrlPrefix + "/news",
            });


Для понимания формата файла хорошо помогла статья
XML-формат файла Sitemap

см. также


XML-формат файла Sitemap

Что такое Sitemaps?

How to create XML sitemap programmatically in c#
https://stackoverflow.com/questions/13449103/how-to-create-xml-sitemap-programmatically-in-c-sharp

Как создать карту сайта? Создаем sitemap для Google и Яндекс
https://seoprofy.ua/blog/optimizaciya-sajtov/kak-sozdat-kartu-sajta

Карта сайта (файл Sitemap) от А до Я
http://pr-cy.ru/news/p/5433

Правильный файл sitemap.xml или как создать карту сайта своими руками | Карта сайта для Joomla + VirtueMart с помощью компонента Xmap




понедельник, 30 апреля 2018 г.

Трубка GrandStream DP 720 не перезванивает по списку номеров: пишет User Unknown (Базовая станция Grandstream DP 750)

Ситуация

внедряю IP телефонию на одном из проектов. Базовая станция Grandstream DP 750, трубки Grandstream DP 720.

Проблема

Трубка Grandstream DP 720 не перенабирает номер из списка номеров (Принятых, Пропущенных, Набранных и т.д.)
При попытке набрать номер пишет User Unknown
Очень неудобно, так как менеджерам приходилось переписывать номер на листик и вносить его на клавиатуре трубки.

Решение

Помогла служба поддержки провайдера IP-телефонии Phonet.

В общем решение заключается в том, чтобы внести изменения в настройки конфигрурации базовой станции.

Первая задача: определить ip-адрес базовой станции.

Я использовал программу Advanced IP-Scanner
Подробнее по определению IP-адреса описано в статье.

Смотрите IP-адрес устройства, у которого в графе производитель будет стоять "Grandstream Networks Inc."


Далее заходим в Веб-интерфейс базовой станции.

У меня http://192.168.0.108
(у Вас, скорее всего, последняя цифра будет оличаться)

Стандартный логин/пароль: admin/admin

Далее проверим на каком профиле работает трубка
Меню: DECT/SIP Account Settings



Видим, что у меня трубка работает через первый профиль "Profile 1"
Теперь заходим в профиль: Profiles/Profile 1/Call settings
(не забываем, что у меня профиль первый, у вас - может отличаться)
и ищем поле Dial Plan (его-то нам и нужно будет поменять)




В поле Dial Plan старое значение заменяем на такое

{ x+ | *x+ | \ +x+ | *xx*x+ | x*x+x }


Внимание! тут есть тонкий момент: когда Вы заменяете строку в одном из фрагметнов есть исимвол "\". Он важен, но, видимо, он воспринимается системой как служебный символ и после сохранения значения он исчезает (система его "проглатывает").

После сохранения вы увидите в поле Dial Plan такое значение (уже без \)
{ x+ | *x+ |  +x+ | *xx*x+ | x*x+x }

И если Вы захотите скопипасить его в другой профиль - оно не сработает: сделает вид что сохранило, а на самом деле не сохранит. Поэтому обязательно используйте вариант строки с "\"









Как найти устройство в локальной сети

Вопрос

Как найти IP-адрес устройства в локальной сети

Решение

Скачайте и запустите Advanced IP-Scanner

https://www.advanced-ip-scanner.com/ru/

работает без установки

пятница, 2 марта 2018 г.

Outlook 2016 Moving a data file to another disk

Situation

On a laptop with the first small SSD drive, I want to move the outlook data file to another large disk (to free up more space on the SSD)


Task

Transfer the Outlook 2016 data file to another drive (in general, to another location)


What did not work?

a rough move of the file and the restart of Outlook did not help. Outlook 2016 recreates its file in the old location.


What worked

solution for Windows 10


Creating a symbolic link


Steps:


1. Close Outlook

2. Move the .ost data file (it is usually stored C: \ Users \ (user) \ AppData \ Local \ Microsoft \ Outlook \).

3. Make a symbolic link



mklink "C: \ Users \ (user) \ AppData \ Local \ Microsoft \ Outlook \ (filename) .ost" "D: \ Outlook \ (filename) .ost"



Do not forget to replace

(user) and (filename) to real values



Related links

Moving the ost-file or pst-file of an Outlook.com or IMAP account
(this is about the creation of symbolic links)
https://www.howto-outlook.com/howto/movingostpstoutlookcomimap.htm




Move the ost-file to another disk or folder location
https://www.msoutlook.info/question/463
here it is said that for the Outlook 2016 the file transfer method does not work

Google Cloud Translation API C# code sample

A simple example of implementing the Google Cloud Translation API for C #


Google.Cloud.Translation.V2 library must be installed into the project through the NuGet


public class TranslateServiceGoogle
    {
        public int MaxTextLenght => 4999;

        private readonly string apiKey;

        private TranslationClient _client;
        private TranslationClient Client => _client ?? (_client = TranslationClient.CreateFromApiKey(apiKey));

        public TranslateServiceGoogle(string apiKey)
        {
            this.apiKey = apiKey;
        }        

        public string TranslateText(
            string text,
            string languageFrom,
            string languageTo
            )
        {
            if (string.IsNullOrWhiteSpace(text)) return "";

            CheckTranslatebleText(text);                      

            var res = Client.TranslateText(text, languageTo, languageFrom);

            return res.TranslatedText;
        }

        public string TranslateHtml(
            string text,
            string languageFrom,
            string languageTo
        )
        {
            if (string.IsNullOrWhiteSpace(text))
                return "";

            CheckTranslatebleText(text);
            
            var response = Client.TranslateHtml(text, languageTo, languageFrom);

            return response.TranslatedText;
        }

        public void CheckTranslatebleText(string text)
        {
            if (text.Length > MaxTextLenght)
            {
                throw new ArgumentOutOfRangeException($"Text length exceeds ({text.Length} symbols)!");
            }
        }
    }


суббота, 24 февраля 2018 г.

Google Cloud Translation API пример кода на C#

Простой пример реализации сервиса перводов Google Cloud Translation API на C#

Для работы коду нужно устанвоить в проект через NuGet библиотеку Google.Cloud.Translation.V2


public class TranslateServiceGoogle
    {
        public int MaxTextLenght => 4999;

        private readonly string apiKey;

        private TranslationClient _client;
        private TranslationClient Client => _client ?? (_client = TranslationClient.CreateFromApiKey(apiKey));

        public TranslateServiceGoogle(string apiKey)
        {
            this.apiKey = apiKey;
        }        

        public string TranslateText(
            string text,
            string languageFrom,
            string languageTo
            )
        {
            if (string.IsNullOrWhiteSpace(text)) return "";

            CheckTranslatebleText(text);                      

            var res = Client.TranslateText(text, languageTo, languageFrom);

            return res.TranslatedText;
        }

        public string TranslateHtml(
            string text,
            string languageFrom,
            string languageTo
        )
        {
            if (string.IsNullOrWhiteSpace(text))
                return "";

            CheckTranslatebleText(text);
            
            var response = Client.TranslateHtml(text, languageTo, languageFrom);

            return response.TranslatedText;
        }

        public void CheckTranslatebleText(string text)
        {
            if (text.Length > MaxTextLenght)
            {
                throw new ArgumentOutOfRangeException($"Недопустимый размер текста ({text.Length} символов) в блоке!");
            }
        }
    }


см. также
Сравнение сервисов облачных переводов Microsoft Azure Translator Text API и Google Cloud Translation API