+5.30
Рейтинг
6.57
Сила

Роман

Интерполяция строк в языке C#

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

int x = 18;
Console.Write($"Указанный возраст {x} лет."); // Выводит: Указанный возраст 18 лет.

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

string s = $"223 в шестнадцатиричном формате: {223:X2}"; // X2 - шестнадцатиричное значение из двух знаков.
// В итоге строка будет "223 в шестнадцатиричном формате: DF"


Читать дальше →

Руководство по Python Bottle (Перевод) Часть 6 - Templates (о Шаблонах)

В предыдущей части (Руководство по Python Bottle (Перевод) Часть 5 — Request Data (данные в запросе)) мы рассмотрели основные аспекты относящиеся к передаваемым данным в запросах, в этой части мы вкратце рассмотрим использование шаблонов.

Bottle имеет быстрый и мощный встроенный механизм шаблонов, который называется SimpleTemplate Engine. Для рендеринга шаблона вы можете использовать функцию template() или декоратор view(). Все, что вам нужно сделать, это предоставить имя шаблона и переменные, которые вы хотите передать шаблону в качестве аргументов. Вот простой пример того, как обратиться к шаблону:

@route('/hello')
@route('/hello/<name>')
def hello(name='World'):
    return template('hello_template', name=name)


Данный код загрузит файл шаблона hello_template.tpl и отобразит его с установленной переменной name. Bottle будет искать шаблоны в папке ./views/ или в любой папке, указанной в списке bottle.TEMPLATE_PATH.

Читать дальше →

Руководство по Python Bottle (Перевод) Часть 5 - Request Data (данные в запросе)

В предыдущей части (Руководство по Python Bottle (Перевод) Часть 4 — Создание контента) мы рассмотрели основные аспекты относящиеся к передаваемому контенту, в этой части мы рассмотрим данные передаваемые в запросах.

Файлы Cookie, HTTP-заголовки, поля HTML форм и другие данные запроса доступны через глобальный объект request. Этот специальный объект всегда ссылается на текущий запрос, даже в многопоточных средах, где одновременно обрабатываются сразу несколько клиентских подключений:

from bottle import request, route, template

@route('/hello')
def hello():
    name = request.cookies.username or 'Guest'
    return template('Привет {{name}}', name=name)

Объект request является подклассом от BaseRequest и имеет очень богатый API для доступа к данным. Здесь будут рассмотрены только наиболее часто используемые функции, этого должно быть достаточно для начала.

Читать дальше →

POST запрос application/x-www-form-urlencoded на сервер при помощи WebRequest С#

Пример метода производящего запрос data на сервер и получение ответа res по указанному адресу url:

public static string ServerRequest(string data, string url)
        {
            string res = "";
            try
            {
                // Чтобы не проверял SSL а просто шёл и брал что дают по HTTPS
                System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                    delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                System.Security.Cryptography.X509Certificates.X509Chain chain,
                                System.Net.Security.SslPolicyErrors sslPolicyErrors)
                    {
                        return true; // **** Всегда принимаем
                    };

                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.Method = "POST";
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(data);
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    res = result;
                }
            }
            catch (WebException ex)
            {

                using (var streamReader = new StreamReader(ex.Response.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    res = result;
                }
                Program.Logger.Error(ex, ex.Message);
            }
            Program.Logger.Info(res);
            return res;
        }

Ссылочные локальные переменные в C# 7

Начиная с версии C# 7 в языке появилась возможность, позволяющая объявить локальную переменную, ссылающуюся на элемент массива или на поле в объекте:

int[] simpleArray = {0, 1, 2, 3, 4, 5, 6, 7, 8};
ref int simpleElementRef = ref simpleArray[3];

В примере выше simpleElementRef — ссылка на simpleArray[3]. Изменение simpleElementRef приводит к изменению элемента массива:

simpleElementRef *= 15;
Console.WriteLine(simpleElementRef);      // 15
Console.WriteLine(simpleArray[3]);        // 15

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

Читать дальше →

MSSQL Оконные функции - Пример ROWNUMBER OVER PARTITION BY

Оконные функции — это такие функции которые на основе окна (набора записей) вычисляют скалярное (одиночное) значение. Это значение определяется с помощью инструкции OVER.

Пример:
select regioncode, aolevel, offname,
 rownumber() over(partition by regioncode order by aolevel, offname) as rownum
 from s_adr_fias
order by regioncode, aolevel, offname;


В данном примере будет сделана выборка в которой для каждого regioncode в поле rownum будет нумерация отсортированных значений aolevel, offname.

Руководство по Python Bottle (Перевод) Часть 4 - Создание контента

В предыдущей части (Руководство по Python Bottle (Перевод) Часть 3 — Маршрутизация запросов) мы рассмотрели основные аспекты касающиеся маршрутизации запросов, в этой части будут рассмотрены аспекты относящиеся к передаваемому контенту.

Создание контента


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

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

Читать дальше →

NLog добавление логирования в .NET Core WEB приложение

Пример добавления логирования в WEB приложение на .NET Core на основе NLog.

Первоначально добавляем через Nuget пакет:
NLog.Web.AspNetCore


Затем добавляем в корень проекта файл nlog.config следующего содержания:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="info"
      internalLogFile="internal-nlog.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="logs/nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="logs/nlog-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxLevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>

В данном файле содержатся настройки логирования, куда и как и что сохранять. Обязательно для данного файла необходимо выставить в параметрах свойство Copy to output directory: Copy Always.

Читать дальше →

OFFSET FETCH пример применения в TSQL

Фильтр OFFSET FETCH в языке TSQL интересен тем что в отличии от фильтра TOP позволяет пропускать заданное количество строк ROWS.

Пример:
select regioncode, aolevel, offname from s_adr_fias
order by regioncode, aolevel, offname
offset 100 rows fetch next 50 rows only;


Данный пример демонстрирует выборку из набора отсортированного по условию ORDER BY (по полям regioncode, aolevel, offname) 50 строк данных пропустив первые 100 строк.

!!! Сначала выполняется именно сортировка, и только затем, из отсортированного набора данных берётся необходимый диапазон.

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

Руководство по Python Bottle (Перевод) Часть 3 - Маршрутизация запросов

В предыдущей части (Руководство по Python Bottle (Перевод) Часть 2 — Hello World) мы создали простое Web приложение, с одним единственным маршрутом, вот та часть кода с маршрутизацией из примера «Hello WOrld»:

@route('/hello')
def hello():
    return "Hello World!"

В этом примере декоратор route() связывает URL путь с вызываемой функцией, и добавляет новый маршрут.

Теперь давайте добавим ещё один маршрут:

@route('/')
@route('/hello/<name>')
def greet(name='Незнакомец'):
    return template('Здравствуй {{name}}, как дела?', name=name)

(Не забываем ипортировать необходимые библиотеки: from bottle import template)

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

Читать дальше →