MPPT Солнечной панели

Вступление

solar-panels
На сегодня все растет интерес к источникам альтернативной энергии. С увеличением уровня сознания современных цивилизаций альтернативные источники энергии вытесняют устаревшие, экологически опасные. Аккумуляция солнечной энергии — это простой, умозрительный и, самое главное, благоприятный для окружающей среды способ удовлетворить потребительские нужды. Однако солнечная энергетика столкнулась с еще недостаточно исследованными свойствами материалов, способных трансформировать энергию солнца. Экспериментально было определено некоторые закономерности работы солнечных панелей, которые предоставили широкий спектр методов для их оптимизации.
Переход на новые средства электроснабжения увеличивает масштабы в высокоразвитых странах мира. Известны такие пути добычи природной энергии: ветровой, водный, геотермальный и солнечные станции.
В практическом плане использования солнечных электростанций преобладает: их расположение не имеет значительных ограничений, ведь солнечные панели можно установить на крышах любых зданий, на поверхности электромобиля, самолета, космической станции или в чистом поле. Именно поэтому они стали популярными во всем мире. Однако различные факторы окружающей среды влияют на работу панели, что не всегда несет положительные последствия. Поэтому изобрели методы, сводящие эти риски к возможному минимуму.

История

Свойство некоторых материалов создавать электрический ток под действием света открыл в 1839 году Александр Эдмон Беккерель, отец Анри Беккереля — первооткрывателя радиоактивности. Прошло тридцать четыре года, когда два английских физика, Уильям Адамс и Ричард Дэй, создали публикацию, где были записи об экспериментах с действием света на селеносодержимые фотоэлементы.
first SP

Начальные серии солнечных панелей имели крайне низкие показатели КПД (<2%), но уже в начале второй половины девятнадцатого столетия начали выпускать эффективные панели и модернизировать их, подбирая оптимальные материалы. SP efficiencies
График эффективности различных солнечных панелей с 1976 года (США)

Строение солнечной панели

  1. Фотоэлектрический элемент: неоднородный кристаллический полупроводниковый материал
  2. Фотоэлектрическая ячейка : фотоэлемент с покрытием для нейтрализации потери энергии через отражение света, укомплектован проводниками для передачи электрического тока
  3. Фотомодуль: совокупность фотоэлектрических ячеек, определенным образом подключенных друг к другу .
  4. Солнечная панель: группа соединенных фотомодулей
  5. Солнечная станция: солнечные панели скомпонованы с системами аккумуляторов, приборами для сбора данных из панелей и ее регуляции

Базовые ведомости

Фотоны, прошедшие сквозь стекловидную поверхность фотоэлемента и не отразились, поглощаются электронами полупроводникового материала, предоставляя им достаточно энергии, чтобы оторваться от атомных орбиталей и стать свободными. Свободные электроны начинают двигаться хаотично, что нельзя назвать током. Поэтому к верхней половине полупроводника добавляют примеси n-элементов, которые увеличивают количество свободных электронов, а в нижней — р-элементы, которые увеличивают количество дыр, тем самым, образуя р-n переход.
Solar panel

  1. С n-элементними примесями
  2. С р-элементними примесями
  3. Потребитель тока

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

Вольт-амперная характеристика солнечной панели

Солнечная панель имеет свою вольтамперную характеристику, которая подается в виде нелинейной кривой:
VAC of SP
На верхнем графике изображена ВАХ панели, на нижнем – зависимость мощности от напряжения (P-V).
MPP

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

Что влияет на ВАХ солнечной панели

На ее значение влияет температура, инсоляция и свойства материала панели.

Вплив температури

VAC depends on T
По графику можно установить, что температура негативно влияет на панель: чем она больше, тем меньших значений приобретать ток и напряжение.

Вплив інсоляції

VAC depends on IN
Инсоляция равна количеству энергии, которую получает площадь поверхности от Солнца за единицу времени:[Ін]=A/(t*m2)=W/m2 . По графику понятно, что большие значения инсоляции улучшают ВАХ панели. Значение поглощенной энергии Солнца зависит от количества фотонов, попадающих на панель (это меняется с облачностью), положением Солнца и другими климатическими явлениями. Для получения наибольшего значения поглощенной энергии панель должна стоять перпендикулярно к солнечным лучам.

Запрещенная зона

Эффективность поглощения солнечной энергии, кроме инсоляции, зависит от некоторой характеристики материала фотоэлемента. Дело в том, что в твердых телах существуют значения энергий, которые не могут приобретать электроны. Такой диапазон называется «Запретной зоной». Поэтому бывает ситуация, когда нужно столько энергии, чтобы ионизировать атом и сопрячь электрон-дырка, сколько поглотить запрещено. Тогда происходит полное рассеивание света, что уменьшает эффективность панели. То есть фотоны относительно слишком высоких энергий не могут обеспечить инсоляцию, поскольку попадают в запретную зону.

Оптимизация солнечной панели

MPP Graph
При составлении электрической цепи, где источником тока является солнечная панель, появляется потребность в регулировании напряжения. Ведь ВАХ панели постоянно меняется. То есть, когда круг замыкается, состояние панели соответствует какому-то значению напряжения и тока в ВАХ, соответствующем значению мощности, и постоянно меняется. Сразу непонятно является ли это состоянием максимальной мощности. Поскольку нам известно об общем виде графика ВАХ (преобразованная логарифмическая зависимость) и мощности, можем использовать тот факт, что график P (U) имеет одну точку экстремума, и она является максимумом.

Оптимизация солнечной панели методом производной

SP optimization
Пусть мы запомнили исходное состояние панели(U1 та I1) . Найдем производную мощности при U1 , равной тангенсу угла между касательной к графику в этой точке и положительным направлением абсциссы. Если значение dU1 /dI1 положительное, то точка (U1 , I1) находится слева от точки максимальной мощности (ТМП), как показано на графике. Тогда для оптимизации панели нужно увеличить напряжение в цепи. Однако, если производная отрицательная, то точка находится справа от ТМП (U2 та I2) , и напряжение надо уменьшить. Итак, определяя знак производной, надо увеличивать или уменьшать напряжение до тех пор, пока производная равна нулю или будет близка к нулю по значению.

Оптимизация методом вмешательства и наблюдения

SP optimization second method
Запомним начальное значение тока, напряжения и мощности в кругу панели (U, I и P = U * I). Затем увеличим напряжение на некоторую малую величину. Зафиксируем новые данные (U2, I2 и P2 = U2 * I2). Решающим шагом будет сравнение первого значения мощности и последнего. Если P> P2, то реальная точка мощности находится правее ТМП (см. График), и напряжение надо уменьшить. Соответственно, если P Оптимизация методом линейной зависимости MPP от напряжения на открытом кругу

Этот метод использует примерную линейную зависимость напряжения максимальной мощности от напряжения открытого круга, меняется в зависимости от освещения и температуры: VMPP = k1VOC, где k1 — это константа, зависящая от ВАХ панели при различных показателей освещения и температуры. Для определения константы нужно отключать преобразователь тока от круга, чтобы получить VOC, но это приведет к значительным потерям энергии. Поэтому, используют несколько отдельных фотоэлементов, не питают круг током, а только определяют k1.

Оптимизация методом линейной зависимости тока MPP от тока краткого замыкания

Этот метод использует примерную линейную зависимость тока максимальной мощности от тока короткого замыкания, меняется в зависимости от освещения и температуры: IMPP = k2Isc, где k2 — это константа, зависящая от ВАХ панели при различных условиях освещения и температуры. Как и в предыдущем методе, нужны дополнительные фотоэлементы, чтобы пропускать ток короткого замыкания при различных условиях, для определения k2.

Широтно-импульсный преобразователь (The DC-DC Boost Converter)

Чтобы воплотить различные методы оптимизации панели в действие, надо использовать устройство, которое может изменять внутреннее напряжение круга панели на какое-то минимальное значение или когда известно точное значение желаемого напряжения. Эту функцию может выполнять широтно-импульсный преобразователь. ШИП — это электронное устройство, трансформирует напряжение путем изменения прогальности (т.е. частоты импульсов электрического тока).
Для управления прогальностью (D) используют ее процентное значение:

D= VOC / VMPP (если необходимо уменьшить напряжение);
D= (VOC — VMPP ) / VOC (если необходимо увеличить напряжение);

DC-DC Boost Converter
Vin — напряжение в контуре панели (или массиве панелей), Vout — напряжение на внешнем контуре с нагрузкой , BK Leg (контур для уменьшения напряжения), BST Leg (контур для увеличения напряжения), Q1, Q4 — транзисторы, L1 — катушка индуктивности (аккумулирует энергию тока и передает ее дальше). Когда нужно уменьшить выходное напряжение, осуществляются операции в контуре для понижения напряжения BK Leg так, чтобы частота изменения состояния транзистора (Открытый / закрытый) уменьшалась. Тогда L1 аккумулирует меньшее количество энергии за определенное время и, как следствие, передает меньший ток в контур с Vout. Он будет отвечать меньшему значению напряжения.
То есть, на примере метода Вмешательства и наблюдения, когда по алгоритму нужно уменьшить напряжение, один из транзисторов ШИМ уменьшает частоту изменения состояния на какую постоянную единицу и выполняет нужные преобразования.

MPPT-контроллер

MPPT
MPPT (maximum power point tracking) – поиск точки максимальной мощности. Аппаратным средством для его осуществления является MPPT-контроллер, включая ШИП.

Источники

Простые числа в программировании

numbers

Начнём с определения. Оно не является довольно сложным для восприятия, так что любой из нас может его себе представить в голове. Просто число (англ. prime number) – это такое натуральное число, которое имеет ровно 2 различных делителя – самого себя и единицу. Следовательно, если это условие не выполняется, то число является составным.

Принято считать, что 1 не относится ни к простым, ни к составным числа.

Проверка чисел на простоту

Теорема Вильсона:

«Натуральное число n>1 является простым тогда и только тогда, когда (n-1)!+1 делится нацело на n»

Опубликованная в 1782 году теорема является частным случаем малой теоремы Ферма, в которой также используются простые числа. Но, к сожалению, на практике данная теорема не применяется и носит чисто теоретический характер, так как вычисление факториала больших чисел является проблемой для программирования. Приведем примерный код программы на языке Java:

public static void main(String[] args) {
for(int i = 1;i<20;i++) {
if((factorial(i-1)+1)%i == 0) System.out.println(i);//проверка условия
    }
}

public static long factorial(int n) {
long rezult;
if (n == 0 || n == 1) return 1;
rezult = factorial(n-1)*n; //рекуррентная функция
return rezult;
}

В Java тип данных long позволяет правильно определить значение факториала от 0 до 20 включительно(большинство других языков программирования также позволяют вычислить также в промежутке от 0 до 20). Дальше пользоваться этим алгоритмом не представляется возможным, так как самому посчитать факториал чисел от 21 нереально, а из-за значений переменных программа будет работать некорректно.

 

Решето Эратосфена

История: Эратосфен Киренский (276 – 194 г. д. н. э) был выдающимся учёным в области математики, астрономии, географии и филологии. Нас, в первую очередь, интересуют его достижения в области математики, а именно – способ определения n-ного количества простых чисел.

Также, согласно легенде, этот метод получил такое название благодаря «своеобразному» способу поиска простых чисел: ученый записывал числа на дощечке, покрытой воском, и прокалывал отверстия в тех местах, где были написаны составные числа. Поэтому доска являлась неким подобием решета, через которое «просеивались» все составные числа, а оставались лишь простые числа.

Суть этого метода заключается в том, чтобы «отсеять» значения элементов, которые делятся на какое-то текущее число из массива элементов.

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

  1. Выписать все целые числа от двух до k (2, 3, 4, …, n).
  2. Пусть переменная q изначально равна 2 — первому простому числу.
  3. Зачеркнуть в списке числа от 2q до k считая шагами по q (это будут числа кратные q: 2q, 3q, 4q, …).
  4. Найти первое незачёркнутое число в списке, большее чем q, и присвоить значению переменной q это число.
  5. Повторять шаги 3 и 4, пока возможно.

Оставшиеся элементы и будут искомыми простыми числами.

Eratosphen

Примерный код на Java выглядит следующим образом:

class MyPrimeNum {
private boolean primes[];

public MyPrimeNum(int n){
   primes = new boolean[n+1];
}
public void fillNumbers() {
   Arrays.fill(primes, true);
   primes[0] = false;
   primes[1] = false;
   for (int i = 2; i < primes.length; i++) {
       if (primes[i]) {
            for (int j = 2; i * j < primes.length; j++) {
                 primes[i * j] = false;
            }
       }
   }
}
}

Числа Мерсенна

Это такие числа, которые представлены в виде формулы Mn = 2n – 1, где n – натуральное число.

Было доказано, что для чисел n, таких что n = kl, где n, k, l  > 0, число будет Mn  также составным (разложение 2kl – 1 на множители). Следовательно, если n будет простым, то и Mn также будут простыми. Рассмотрим это на примерах:

M2 = 22 – 1 = 3
M3 = 23 – 1 = 7
M4 = 24 – 1 = 15
M5 = 25 – 1 = 31
M6 = 26 – 1 = 63
M7 = 27 – 1 = 127
M8 = 28 – 1 = 255
M9 = 29 – 1 = 512
M10 = 210 – 1 = 1023
M11 = 211 – 1 = 2047

Как простые числа используются в программировании?

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

  • современных операционных систем
  • защищенных каналов сотовой связи
  • протоколов передачи данных Ethernet
  • протоколах передачи данных приватных компаний

Работа с изображениями на C#

В .Net существует много способов обработки информации.image
В частности с использыванием GDI в приложениях Microsoft Windows. Функционал GDI предоставляется пространством имен System.Drawing.Common в .Net Core и Framework.
С помощью C# Drawing можно:

  • создавать изображения
  • редактировать изображения
  • создавать 2D анимации
  • рисовать математические графики
  • рисовать форматированный текст

Введение в C# Drawing

Подключение пространства имен

В первую очередь необходимо установить System.Drawing.Common. К примеру, из nuget.

using System.Drawing;
using System.Drawing.Imaging;
Некоторые классы
  • Image — абстрактный класс, который предоставляет базовый функционал GDI
  • Bitmap — наследует Image, представляет пиксельное изображение
  • Graphics — наследует Image, представляет поверхность для рисования
Отрыть изображение из файла и сохранить в файл
...
   Image image = Image.FromFile("path");  //отрыть из файла

   image.Save("otherpath");  //сохранить в файл
...
Метод GetEncoder. Codec.
mime typeрасширение
image/apng.apng
image/bmp.bmp
image/jpeg.jpg, .jpeg
image/png.png
image/webp.webp

System.Drawing.Common работает только с изображениями Bitmap. Когда файл изображения открывается, то GDI использует decoder, чтобы превратить его в Bitmap. Когда изображение сохраняется в файл, GDI использует encoder, чтобы превратить его в изображение в нужном формате. Encoder и decoder называются Codec. Если Codec не выбранный, то будет использоваться кодек по умолчанию.

Чтобы получить encoder

...
   public static ImageCodecInfo GetEncoder(string mimetype)
   {
      return ImageCodecInfo.GetImageEncoders().FirstOrDefault(e => e.MimeType == mimetype);
   }
...

Чтобы получить decoder

...
   public static ImageCodecInfo GetDecoder(string mimetype)
   {
      return ImageCodecInfo.GetImageDecoders().FirstOrDefault(e => e.MimeType == mimetype);
   }
...

Как вырезать изображение на C#?

Метод, чтобы вырезать прямоугольник (в точке (x,y), с высотой h и шириной w) из изображения.

...
   public static Image Cut(int x, int y, int w, int h, Image image)
   {
      Rectangle rect = new Rectangle(x, y, w, h);

      using Bitmap target = new Bitmap(w, h);

      using (Graphics g = Graphics.FromImage(target))
      {
         g.DrawImage(image, 0, 0, rect, GraphicsUnit.Pixel);
      }

      image = new Bitmap(target, new Size(target.Width, target.Height));

      return image;
   }
...

Как сохранить изображение в указанном размере на C#

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

...
   public static void Save(string fullpath, int memoryInKb, Image image)
   {
      long qual = 101;

      ImageCodecInfo imagecodecinfo = GetEncoder("image/jpeg");  //метод GetEncoder определён раньше

      System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.Quality;

      using EncoderParameters encoderparams = new EncoderParameters(1);
      double current_size=0;
      do
      {
         qual--;
         EncoderParameter encoderparam = new EncoderParameter(encoder, qual);
         encoderparams.Param[0] = encoderparam;
         
         using MemoryStream mem = new MemoryStream();
         image.Save(mem, imagecodecinfo, encoderparams);
         string text = Convert.ToBase64String(mem.ToArray());
         current_size = Encoding.Default.GetByteCount(text) / 1.333 / 1024;
      }
      while (current_size>memoryInKb);

      image.Save(fullpath, imagecodecinfo, encoderparams);
   }
...

Как изменить расширение файла изображения на c#

...
   public static void ChangeExtension(string originpath,string destinationpath, ImageFormat format)
   {
     using Image image = Image.FromFile(originpath);

     image.Save(destinationpath, format);
   }
...

Как изменить размеры изображения на c#

Метод, который возвращает изображение с указанным размером:

...
   public static Image Resize(Size size, Image image)
   {
     return new Bitmap(image, size);
   }
...

Как пропорционально изменить размеры изображения на c#

...
   public static Image Scale(bool relation, int size, Image image)
   {
      double A = image.Width, B = image.Height;
      if (relation)
      {
         image = Resize(new Size(size, (int)(size * B / A)), image);
      }
      else
      {
         image = Resize(new Size((int)(size / B * A), size), image);
      }
      return image;
   }
...

Как нарисовать прямоугольник на изображении на C#

...
   public static Image DrawRect(Image image, int x, int y, int w,int h)
   {
      using Pen pen = new Pen(Color.Black, 1);
      Bitmap bitmap = new Bitmap(image);
      Graphics graphics = Graphics.FromImage(bitmap);
      graphics.DrawRectangle(pen, x, y, w, h);
      return bitmap;
   }
...

Приложение для создания Sitemap

Исходный код доступен на нашем репозитории. Скачать отдельное приложение можно здесь.

Что такое Sitemap?

sitemap
Sitemap — это набор ссылок на страницы сайта. Владелец сайта должен добавить ссылки на самые значимые страницы с дополнительной информацией (коэффициент приоритета, дата изменения, частота изменения) в Sitemap. Как сказано в описании протокола Sitemap:

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

Как создать sitemap?

Есть такие варианты создания сайтмапа:

  • Добавить ссылки в xml документ вручную
  • Добавить ссылки в xml документ рекурсивно с помощью веб-клиента и html парсера
  • использовать плагин или создать ендпоинт, который возвращает xml документ (на разных веб-платформах по-разному)

Напоследок надо утвердить sitemap в поисковой консоли. Иначе поисковая система не зарегистрирует его.

Приложение для создания сайтмапа в формате xml на .Net Core C#

Приложение дает возможность создать сайтмап для сайта с неограниченным количеством страниц.

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

Структура генератора сайтмапа

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

Менеджер краулинга
  1. перейти на главную страницу, получить ссылки из html кода
  2. сохранить посещенную ссылку, сохранить полученные ссылки (кроме посещенных)
  3. перейти на каждую сохраненную ссылку, получить ссылки из html кода
  4. сохранить посещенную ссылку, сохранить полученные ссылки (кроме посещенных)
  5. продолжать цикл пока исключение посещенных из полученных не равняется пустому списку
...
   List new_urls = new List();
   List visited = new List();
...
   new_urls.Add(BaseUrl);  //первая ссылка
   do
   {
      List hrefs=new List();
      foreach (var url in new_urls)
      {
         string text =await _loader.Get(url);
         if (string.IsNullOrEmpty(text)) continue;

         visited.Add(url);
         List meta=Parser.GetAHrefs(text).Distinct().ToList();  //получение ссылок из html кода
         Parser.Normalize(Domain,url,ref meta);
         if (Exclude)  //option to exclude query from url
             meta = meta.Select(u => u.Contains('?') ? u.Split('?')[0] : u).ToList();
         hrefs.AddRange(meta);
         hrefs = hrefs.Distinct().ToList();
       }
       new_urls = hrefs.Except(visited).ToList();   //исключение посещенных ссылок
    }
    while (new_urls.Count != 0);
...
HTML парсинг

Для HTML парсинга используется HtmlAgilityPack.

...
   public static IEnumerable GetAHrefs(string text)
   {
      HtmlDocument document = new HtmlDocument();
      document.LoadHtml(text);
      var tags=document.DocumentNode.SelectNodes(".//*");
      foreach(var tag in tags)
      {
         if (tag.Name == "a" )
         {
            string href = tag.GetAttributeValue("href", string.Empty);
            if (!string.IsNullOrEmpty(href))
                yield return href;
         }
      }
   }
...
Интерфейс приложения

sitemapgenerator

  • Ссылка на главную страницу сайта
  • Доменное имя сайта
  • Возможность добавить дополнительные данные в сайтмап
  • Убрать параметры запроса из урл

Выводы из доказательства Теории Фридмана (Черные дыры, Радиус Хаббла)

Выводы из доказательства Теории Фридмана.

Радиус Хаббла

universe

У нас нет возможности соорудить космическое судно для далеких длительных путешествий по Вселенной за пределами нашей Солнечной системы, но это не единственная проблема. Человек не сможет добраться до некоторых мест из-за законов природы. Насколько нам известно, ничего не может перемещаться со скоростью большей, чем скорость света. Однако пространство может расширяться быстрее, чем фотон пролетит его, то есть быстрее света. Интенсивность расширения зависит от значения космологического масштабного фактора и расстояния между двумя точками наблюдения. Это означает, что вокруг любого места во Вселенной есть условная сфера, за которую невозможно попасть. Выведем формулу радиуса этой сферы.
Применим уравнение Фридмана-Робертсона-Уолкера для Вселенной в период доминирования вещества:

equation-fpw
equation-fpw2

Умножим обе части на L=x*a:

a’/a * x*a=L*√(8п/3*ρ*G) => x*a’ = L*√(8п/3*ρ*G); x*a’ — скорость, которая равна скорости света по нашему условию. hubble-r

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

Радиус Шварцшильда

Представим наблюдателя в центре черной дыры. Если он решит покинуть черную дыру, то у него ничего не получится. Даже свет не может покинуть это место. Теоретически можно сбежать, если наблюдатель превысит скорость света. Тогда относительно человека в черной дыре все внешние объекты будут двигаться со скоростью, большей или равной скорости света. Значит в этом случае можем использовать формулу L=R=c/√(8п/3*ρ*G), где L – радиус черной дыры или горизонт событий, ρ – плотность черной дыры. Все тела за границами радиуса будто движутся со скоростью света от тел в границах радиуса. Теперь перепишем формулу плотности. Для наблюдателей, что смотрят на дыру снаружи, горизонт событий кажется поверхностью астрономического объекта, потому как нет возможности увидеть его внутреннюю часть. Тогда плотность равна ρ=m/V=m/(4/3 πR^3 ). Возведем в квадрат предыдущее уравнение: R^2=C^2/(8п/3 * ρ*G). Подставим плотность: radius-shv Выразим радиус преобразованиями: radius В космологии это зовется гравитационным радиусом или радиусом Шварцшильда.

Плотность Черной дыры

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

Влияние масштабного фактора на солнечную систему и ее жителей

Значение космологического фактора незначительное, чтобы заметить общий разгон вещества в масштабах галактики и, тем более, солнечной системы. Однако он увеличивается с течением времени. Когда-нибудь влияние расширения пространства приведет к таким эффектам, как разгон галактического вещества , в частности солнечных систем. Вероятно землянам не удастся наблюдать разрушение солнечной системы в следствии быстрого отдаления всей материи, а не взрыва Солнца. Однако, постоянно появляются другие, новые системы из планет и звезд. На некоторых возможна жизнь, что требует благоприятных условий. К примеру, стабильной кругообразной планетарной орбиты и какого-то спутника, как Луна. Чем позже такие системы образуются, тем ближе они к моменту, когда их благоприятные условия пострадают от масштабного фактора.

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

Что такое HTTP клиент с примерами

Что такое HTTP клиент?

В клиент-серверной модели Сервер принимает запросы и отправляет ответы, Клиент отправляет запросы и принимает ответы.
client-server

В общем, Клиент — это программа, библиотека или программный метод, который:

  1. Отправляет запросы с какой-то информацией на сервер
  2. Получает ответные сообщения от сервера

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

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

Зачем нужен HTTP клиент?

На сей день существуют стандарты построения HTTP запросов в клиент-серверной модели. Таким образом разные веб системы общаются друг с другом. Как понятно из RFC документации, есть много правил, информации о том, что такое HTTP и как использовать этот протокол. Обычно у рядового разработчика нету времени на изучение этого всего. К тому же, это не всегда стоит делать.

Клиент разработан так, чтобы соответствовать стандартам протокола, с которым он работает, и архитектуре использования этого протокола (к примеру, REST). В нашем случае HTTP или HTTPS.

Клиент позволяет упростить работу с отправкой и получением данных, поскольку:

  • он учитывает спецификацию протокола передачи данных
  • он оптимизирован на низком уровне и удобен в использования на высоком уровне
  • разработчик не обязан знать, как работает протокол

Методы HTTP запросов

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

  • GET — чтобы передавать информацию в url (https://[site url][parameters]) и получать публичные данные
  • POST — для передачи приватной информации
  • DELETE — для запроса на удаление чего-либо в базе данных
  • PUT — для запроса на обновление чего-то в базе данных
  • и другие

Примеры HTTP клиента

webapplication

.NET C# HTTP Клиент

Пространство имён System.Net.Http предоставляет много классов для работы с вебом. HttpClient это современный и быстрый HTTP .Net Client.

...
   using System.Net.Http;  //добавление пространства имён HTTP
...
   HttpClient _client=new HttpClient();

   string url="http://www.brainbeast.best";  //некоторый url

   string resp = await _client.GetStringAsync(url);  //GET запрос, resp будет содержать html код веб-страницы
...
Javascript HTTP Клиент

В веб-версии JS есть объект XMLHttpRequest, который может отправлять и принимать http запросы, настраивать метод запроса и работать в асинхронном режиме.

...
    function PostRequest() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            
          var resp=this.responseText;  //сообщение ответа

        }
    };
    
    xhttp.open("POST", "http://someurl", true);  //установка метода, url, асинхронного режима (true/false)
    xhttp.send("private data");  //private data to send
}
...
PHP HTTP Клиент

При помощи cURL сервера с установленным PHP могут отправлять запросы. cURL — это не единственный вариант.

...
    $crl = curl_init();

    curl_setopt($crl, CURLOPT_URL,"https://some_url");

    curl_setopt($crl, CURLOPT_POST, 1);

    curl_setopt($crl, CURLOPT_POSTFIELDS,"private post data");

    curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);

    $resp = curl_exec($crl);

    curl_close ($crl);

    echo $resp;
...

Как скачать картинку HTTP клиентом на C#?

...
   HttpClient _client=new HttpClient();
   byte[] buffer = null;
   try
   {       
      HttpResponseMessage task = await _client.GetAsync("https://www.brainbeast.best/wp-content/uploads/2020/05/client-server.jpg");
      Stream task2 = await task.Content.ReadAsStreamAsync();
      using (MemoryStream ms = new MemoryStream())
      {
        await task2.CopyToAsync(ms);
        buffer = ms.ToArray();
      }
      File.WriteAllBytes("C:/client-server.jpg", buffer);  //путь сохранения картинки и её байты
   }
   catch
   {

   }
...

Как установить время ожидания подключения в C# HTTP Client?

...
   HttpClient _client=new HttpClient();
   _client.Timeout = TimeSpan.FromSeconds(300);
...

Как добавить header в HTTP запрос на C#?

...
   HttpClient _client=new HttpClient();
   client.DefaultRequestHeaders.Add("Some header", "some value");
...

Как сделать POST запрос и отправить JSON на C#?

Первый вариант — это установить Microsoft.AspNet.WebApi.Client из Nuget.

...
class Person
{
   public string Name {get;set;}
   public string Surname {get;set;}
}
...
   Person person=new Person {Name ="Andy", Surname="Smith"};  //можно отправить экземпляр любого класса, где есть публичные поля

   HttpClient _client=new HttpClient();

   var response = await client.PostAsJsonAsync("http://endpoint", person);

   var resptext = await response.Content.ReadAsStringAsync();
...

Второй вариант:

...
   HttpClient _client=new HttpClient();

   var values = new Dictionary
      {
        { "username", "andy" },
        { "password", "12345678" }
      };

   var content = new FormUrlEncodedContent(values);

   var response = await _client.PostAsync($"https://some endpoint", content);

   var responseString = await response.Content.ReadAsStringAsync();
...

Доказательство Теории Фридмана с помощью классической физики

Актуальность космологии

До XX века не было возможности создать достоверную (с точки зрения современности) теорию о Вселенной, поскольку не хватало технологий для тщательного, многоуровневого наблюдения. В то время уже изобрели телескоп, но его точности хватало только на описание цвета, формы, траекторий движения ближайших к нам астрономических тел: планет, комет, Луны, Солнца и т.д. Заметить качественные изменения таким образом невозможно. Однако, ученные использовали все существующие средства, так и появилось первое рациональное виденье мира. Его фундаментом стала классическая физика, основанная Йоганном Кеплером, Галилео Галилеем и Ісааком Ньютоном в первой половине XVII ст. Вселенная изображалась совокупностью массивных материальных тел и явлениями над ними, что подчиняются закону Всемирного тяготения. Огромный ряд явлений был необъясненным. Следующим этапом развития мировоззрения стала классическая электродинамика, основанная Джеймсом Максвеллом, Гансом Эрстедом, Жан-Батистом Био, Феликсом Саваром, Майклом Фарадеем, Симеон-Дени Пуассоном и Андре-Мари Ампером на протяжении XIX ст. Объяснение взаимодействия заряженных тел модернизировало тогдашнее мировоззрение: к силе тяготения прибавились еще магнитные и электростатические силы. Их теория предвидела наличие электромагнитных волн, которые распространяются со скоростью света в вакууме. Задумка Альберта Майкельсона и Эдварда Морли проверить это привел к возникновению новой теории или пересмотру старой. Эксперимент Майкельсона-Морли опроверг существование эфира, сквозь который движутся тела. Хендрик Лоренс решил детальнее проанализировать результат их эксперимента, а именно одинаковую скорость света в разных системах исчисления. Таким образом он определил превращения физических параметров, что объясняли эксперимент – переобразования Лоренса. Они стали основой Специальной теории относительности Эйнштейна. Тут и произошел переход от классической физики Ньютона к релятивистской физике Эйнштейна, что усилило точность описания астрономических явлений. Параллельно развивался раздел физики – термодинамика. В основном ее развивали Сади Карно, Джоуль, Гиббс и Больцман с первой половины ХIХ ст. до начала XX ст. Умение разбираться в превращении энергии, что дает термодинамика, окажется полезным в теориях о Вселенной. После всего упомянутого наступает время создания двух решающих теорий мироздания: квантовая теория и общая теория относительности. Следует отдать должное электротехническим наукам, поскольку без них любые теории о строении и развитии Вселенной были бы неполными и неточными.

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

В 2016 году было зафиксировано гравитационные волны на детекторах LIGO в США. Современные технологии позволяют распознать нетривиальные астрономические явления и тела, которые непременно нужно изучать – это черные дыры, нейтронные сверхмассивные звезды, далекие галактики, кластеры и суперкластеры галактик. Сегодня благоприятные условия для исследования Вселенной. Актуальность разработки теорий, что описывают Вселенную, объясняется невозможностью дальнейшего эволюционирования физики проведением экспериментов в земных условиях. Также на пути исследований всегда присутствуют неожиданные открытия.

Вселенная с точки зрения Ньютоновской физики

Теорема Ньютона

NewtonsTheorem

Если существует точка, вокруг которой распределение массы изотропно во всех направлениях, то есть материю можно представить в виде заполненной сферы с центром в т.О, то гравитационная сила, которая бы воздействовала на материальную точку (А) снаружи этой сферы, будет такой же, как если бы вся материя сосредоточилась в т.О.
Newtons Theorem Illustration
Следствие: если точка А будет находиться в этой сфере на расстоянии R2 от О, то гравитационная сила, которая будет воздействовать на точку А, будет такой же, как и если бы её создавала масса в сфере с радиусом R2, сосредоточенная в т.О.

Закон расширения Вселенной (Закон Хаббла)

Euclid space

Рассмотрим пространство Вселенной, которое задаётся Эвклидовой геометрией:

  1. Он равномерно заполнен галактиками (белые точки на синем фоне).
  2. Возьмём галактику А как начало системы отсчёта и проведем ось иксов (А лежит на координатах О).
  3. Зададим еще одну галактику Б на расстоянии Х1 от А.

Тогда расстояние между ними: L=x*a(t).

α – это космологический масштабный фактор (Scale factor), который зависит от времени и характеризует расширение Вселенной.

Из этого найдем скорость разбегания галактик, как производную расстояния: v=L`=x*a`(t), где х не меняется со временем, то есть константа.
В 1929 году Эдвин Хаббл экспериментально обнаружил зависимость между красным смещением далёких галактик и их скоростью разбегания.

Производная масштабного фактора по времениscale factor derivative
Постоянная ХабблаHubble constant
Скорость разбегания галактик на расстоянии хvelocity

Зависимость характеристик света от расширения пространства

Одной из наиболее распространенных частиц в мире является фотон. На данный момент исследования показывают, что на один протон припадает десять фотонов. То есть количественно электромагнитные волны превосходят частички вещества. Основными характеристиками световой волны являются энергия (E), частота (v), длина волны (λ) и скорость света (c).

E=v*h,  где h — постоянная Планка; v=c/λ;

Изобразим световую волну в пространстве: wave

По закону Хаббла, длина волны со временем будет меняться таким образом: Lambda

wave-and-lambda
Тогда частота v ∝ 1/a. Поскольку энергия прямо пропорциональна частоте, то E ∝ 1/a. Это значит, что с течением времени энергия каждого кванта света будет уменьшаться.

Космологическая модель физикой Ньютона

Пускай масса галактики Б равняется m. Используем теорему Ньютона и отметим, что масса материи в радиусе X1 равняется M. Тогда можно считать, что М находится в точке с координатой О. Запишем закон сохранения энергии для замкнутой системы, которой представлена Вселенная:
law of conservation of energy
Первый член – это кинетическая энергия, второй – потенциальная.
Умножим обе части уравнения на 2:
two-times
Константа умноженная на два равняется определенной константе, поэтому const*2=const;
Разделим обе части уравнения на m (поскольку m является константой, то const/m=const):
divide-by-m
Подставим в уравнение расстояние и скорость из формулы, которая выводится из закона Хаббла:
substitution
Теперь представим M, как произведение ρ*V (плотность на объем); Плотность одинаковая во всех точках упрощённой модели Вселенной, а объем расписывается как:second-substitution
Тогда уравнение имеет вид:G-substitution
Плотность не зависит от позиции, но зависит от времени, поскольку пространство расширяется и расстояния между галактиками меняются. α зависит от времени и не зависит от позиции. (4п/3 * G) – константа. Физическая величина x , и соответственно x^2 , зависит от положения и принимает уникальные значения. Ему (x^2) пропорциональна левая сторона уравнения, соответственно правая тоже должна делиться на x^2, поэтому можно упростить: divide-by-x
Это уравнение не зависит от начальной галактики или от положения. Оно зависит от α, которое меняется со временем.
Теперь преобразуем уравнение:

  1. Перенесем второй член с левой части в правую
  2. Поделим все на a^2
  3. Константу, разделенную на a^2, запишем буквой k

result

Уравнение Фридмана-Робертсона-Уолкера

Плотность зависит от времени, поскольку пространство расширяется с его течением. Представим себе область, объем которой равен единице измерения в кубе. Размеры изменяются в зависимости от космологического масштабного фактора, поэтому объем будет равен (1 ед.меры длины*a)^3. Перепишем плотность как константную массу этой области, разделенную на объем: ρ= M/(1*a^3 ) (размерностью х^3 в записи можно пренебречь, но возьмем во внимание). Перепишем уравнение в соответствии с новой формулой :
new-equation

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

Решение уравнения Фридмана-Робертсона-Уолкера

Matter-dominated era. Эра доминирования вещества.

equation
Уравнение правдиво только когда большая часть материи-энергии находится в состоянии вещества, а не в состоянии облучения: фотоны, нейтрино, любые частички, что двигаются с околосветовой скоростью. В обратном случае масса М элементарной области пространства имела бы возможность меняться. Например, фотоны всегда должны перемещаться, их масса покоя равна нулю. Также материальные объекты должны всегда находиться в границах своей области, чтобы М была константной. Поэтому период, который описывает уравнение, назвали «Эрой доминирования вещества». Совокупность решений уравнения зависит от значений неизвестных параметров. Наипростейшее равенство будет при k=0:
zero-k
α может зависеть от времени определенным образом: обратно пропорционально, прямо пропорционально, степенно и т.д. Предположим, что на самом деле зависимость такая:

α = c*tp, тогда a’=c*p*t(p-1)

Подставим в уравнение:
substitution-two
Теперь мы видим, что слева в знаменателе время в квадрате, справа – в степени 3р. Значит, уравнение имеет смысл только когда выполняется 2=3р, от куда р=2/3. Тогда масштабный фактор равен a=ct^(2/3) . Подставим р в уравнение:

substitution-three-ru
Такая нелинейная зависимость от времени говорит о том: что пространство расширяется с ускорением. Так же отменим, что в момент времени 0 масштабный фактор тоже равен 0. Это отвечает за то начальное состояние Вселенной, когда плотность материи была бесконечна.
Перепишем формулу постоянной Хаббла:

substition-four

Теперь допустим, что границы области, в которых находится масса М, имеют идеальную упругую поверхность. Тогда давление, которое создается веществом на них, равно 0, так как масса не перемещается в другие элементарные области.

 

Radiation-dominated era

Microwave Sky

Еще до Эры доминирования вещества существовали такие условия, что большая часть материи-энергии находилась в виде высокоэнергичного облучения, радиации. Об этом свидетельствуют орбитальные наблюдения WMAP – Микроволновой Анизотропии Зонд имени Вилкинсона. Зонд детектирует свет микроволнового диапазона, который соответствует фотонам низкой энергии. Данные объясняются тем, что из-за масштабного фактора энергия высокочастотного облучения, образованного в ранний период эволюции Вселенной, уменьшилась (см. Зависимость характеристик света от расширения пространства). В малом масштабе эти микроволны равномерно заполняют пространства. Их прозвали Реликтовым фоном. Именно этот период назван «Эрой доминирования радиации» (Radiation-dominated era). Ранее мы отметили, что можна рассмотреть элементарный «кубик» пространства объемом Х^3 и массой М. Теперь допустим, что кубики заполнены фотонами. Тогда с течением времени потоки света будут пронзать кубики, но среднее количество частичек в одном будет постоянно. Поскольку длина волны со временем увеличивается, то общая энергия фотонов в кубике не будет константой. Она будет равна какой-то константе, разделенной на масштабный фактор: E ∝ d/a. Найдем плотность энергии фотонов, поделив предыдущее выражение на объем элементарной области (Х*a(t))^3, где Х мы принимаем за единицу : E/V ∝ d/(a^4) . Это значит, что плотность фотонной материи пропорциональна не 1/(a^3), а 1/(a^4). Перестроим уравнение Фридмана под новые параметры: Чтобы равенство имело смысл, необходимо 2=4*р. Тогда р=1/2:

c-param
scale-factor
new-hubble-constant

 

Теперь рассмотрим случай, когда свет распространяется в направлении оси Х в своем кубике, который мы наделяем идеальными границами. Тогда сила, что действует на границы равна: F=dP/dt, умножим числитель и знаменатель на скорость света∶F=(dP*c)/(dt*c)=E/L Разделим две части на площадь контакта света с границей: F/S=E/(L*S) => P=E/V де E/V назовем плотностью энергии и обозначим ρE. На самом деле свет движется не только по оси Х, но и по осям Y и Z. Поэтому общее давление на кубик будет: P2= ρE/3

Dark energy-dominated era

Представим себе одномерной мир, в котором действуют Закон всемирного тяготения и Закон Габбла. Он равномерно заполнен веществом в виде совокупностей галактик, кластеров, звезд и т.д. Изобразим его следующим образом:

galaxies

galaxies-scoped

Жёлтым цветом обозначено материю, которую включает Вселенная. А, Б – галактики. По закону Хаббла расстояние L между галактиками А и Б будет увеличиваться, соответственно плотность вещества будет уменьшаться. Рассмотрим пустое пространство между ними – оно расширяется. Тогда там постоянно появляются определенные абстрактные объекты, из которых состоит непосредственно пространство. Их плотность в любой точке одинаковая и постоянная, то есть не меняется со временем. Такой эффект назвали энергией вакуума или темной энергией. Эта энергия является константной характеристикой Вселенной. Вернемся к предыдущим периодам развития Вселенной.

α (масштабный фактор)P (давление)
ct^(2/3)0
ct^(1/3)P=ρE/3

Попытаемся установить зависимость Р от переменной w: P=w*ρE

Зависимость от αP (давление)w (некоторая переменная)
ρ ∝ 1/(a^3)00
ρ ∝ 1/a^4ρE/31/3

Найдем w для плотности энергии, что не меняется со временем. Перепишем уравнение, когда энергия элементарной области будет уменьшаться при увеличении объема: dE=-PdV. Если E=ρV (ρ-плотность энергии), то переменная энергии будет равна ρdV+Vdρ= > ρdV+Vdρ=-PdV = > Vdρ=-(P+ρ)dV. Поскольку P=w*ρE, то Vdρ=-(w+1)ρdV. Преобразуем уравнение: dρ/ρ=-(w+1)dV/V. Отменим, что dIn(f)=df/f – логарифмическая производная. Тогда: dIn(ρ)=-(w+1)*dIn(V)= >In(ρ)=-(w+1)*In(V)+C=> => In(ρ)=In(1/V^(w+1) ) +C=> ρ ∝ 1/V^(w+1), V=X^3 * a^3 = 1*a^3 => ρ ∝ 1/a^(3(w+1)) Если ρ константа, то w=-1 (a0 =1). Тогда P=-ρE. Это значит, что плотность энергии – отрицательная величина, ведь именно из-за расширения Вселенной давление принимает положительное значение. Перепишем уравнение Фридмана, для постоянного значения плотности: overwrite

 

8п*ρ*G = Λ, где Λ — космологическая постоянная; H= √(Λ/3)

a`=a√(Λ/3). Найдем интеграл a`. Единственная функция, что при дифференцировании переходит сама в себя, это экспонента. Тогда a ∝ exp⁡(Ht). Период существования Вселенной с экспотенциальной зависимостью назвали «Эрой доминирования темной материи»(Dark energy-dominated era).

Выводы

Каждое с трех уравнений имеет смысл в любой период эволюции Вселенной. Практическое влияние у них будет разным. Мы определили, что на характер расширения пространства влияют три вещи: относительно статическая материя в виде вещества, материя в виде облучения и темная материя. Сначала плотность энергии облучения была наивысшей, по этому нужно было учитывать, что a ∝ t^(1/2). Потом по закону Хаббла длина волн облучения уменьшилась, соответственно энергия и плотность энергии облучения тоже. Тогда плотность энергии материи была превалирующей и a ∝ t^(2/3). Когда же материя разбежится так далеко, чтоб её плотность можно было сравнить с плотностью энергии вакуума, темная материя начнет нести наибольшее влияние на масштабный фактор и a ∝ exp⁡(Ht).

Источники

Регулярные выражения с примерами

regex
Регулярные выражения это способ обработки текстовой информации и язык для построения масок. Маска это набор символов и специальных обозначений, представляющих некоторый шаблон, который используется для выделения подстрок для дальнейшей работы с ними (замена, выделение, проверка условий).
Регулярные выражения поддерживаются многими популярными языками: C#, javascript, pyton, php и другие.

Примечание: правила построения масок одинаковы почти во всех случаях.

Как использовать регулярные выражения на C#?

Для работы с регулярными выражениями необходимо выполнить три шага:

  • Создать маску
  • Создать экземпляр класса Regex
  • Обработать текст с помощью Regex
...
   string [email protected]"\sHello{3}";  //mask for catching "hello" with three O in the end and one space in left side
...

Примечание: паттерн или маска это правило обработки текста. Вы можете протестировать свою маску на онлайн тестере.

...
   Regex reg = new Regex(pattern);  //регулярное выражение
   
   string text="Hi, John. Hellooo, Mary. Hello, Gary.";  // текстовая информация

   MatchCollection matches = reg.Matches(text);  //получение коллекции совпадений. В нашем случае будет одно совпадение " Hellooo"
...

Возможно обратиться к совпадению (Match) в коллекции по индексу. В классе Match есть свойства:

  • Value — строка, выделенная маской
  • Index — позиция первого символа захваченной строки в тексте
  • Length — количество символов в захваченной строке
...
   string firstmatch=matches[0].Value; //firstmatch равно " Hellooo"
...

Как игнорировать letter case в регулярных выражениях?

...
   Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); //игнорирует letter case

   Regex regex2 = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.RightToLeft); //игнорирует letter case и обрабатывает текст справа налево
...

Note: Возможно устанавливать много RegexOptions (RegexOptions.IgnoreCase | RegexOptions.RightToLeft | RegexOptions.Compiled).

Как произвести замену с помощью Regex?

...
   //заменяет "Helooo" на "Howdy"
   string newtext = Regex.Replace(text, pattern, "Howdy");
...

Как создать список выделенных строк с Regex?

...
   MatchCollection matches = reg.Matches(text);  //коллекция совпадений из текста

   List resultlist = matches.Select(m => m.Value).ToList();  //используя Linq

   string[] resultarray= new string[matches.Count];  //не используя Linq

   for(int i=0;i<matches.Count;i++)
   {
      resultarray[i] = matches[i].Value;
   }

...

Как установить время выполнения Regex?

...
   Regex regEx = new Regex(pattern, RegexOptions.None, TimeSpan.FromSeconds(10));  //останавливает обработку после 10 секунд
...

Как ускорить работу регулярного выражения?

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

...
   Regex regEx = new Regex(pattern, RegexOptions.Compiled);  //компилируется дольше, но работает быстрее
...

Маска для нахождения электронной почты в тексте

Данная маска поможет обнаружить обычную почту ([email protected]), сложную (с точками и дефисами) ([email protected]) и защищенную от спама (email[at]email.com, [email protected] dot com):

...
   string emailpattern = @"([a-zA-Z0-9_\-\.]+)(@|(\s*\[\s*at\s*\]\s*)|(\s*" + "\"" + @"\s*(at)\s*" + "\"" + @"\s*))([a-zA-Z0-9_\-\.]+)((\.)|(\s+dot\s+)|(\s*\[\s*dot\s*\]\s*)|(\s*" + "\"" + @"\s*(dot)\s*" + "\"" + @"\s*))([a-zA-Z]{2,5})";
...

Маска для нахождения ссылок на веб-странице

...
   string tagPat = @"?<\s*a[^>]*>(.*?)?<\s*/\s*a\s*>";  //маска для тегов А

   string hrefPat = "href *= *(\"(?<url>.+?)\")";  //маска с группой url для атрибутов href
...

Работа с группами в регулярном выражении

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

... 
   string hrefPat = "href *= *(\"(?<url>.+?)\")"; //маска с группой url для атрибутов href
   
   string text = "<a href=\"http://somedomain\"> Domain </a>";

   Regex regex = new Regex(hrefPat, RegexOptions.IgnoreCase);

   string result=regex.Match(text).Groups["url"].Value;  //result будет равен http://somedomain
...

Часто задаваемые вопросы про Selenium на c# с примерами

Selenium это набор инструментов, которые используются для автоматизации работы браузера. Существуют реализации управления «селениумом» для таких популярных языков, как: C#, PHP и Java.

Как внедрить Selenium в проект Visual Studio?

Прежде всего, необходимо установить пакеты Selenium.Webdriver в проект. При помощи пакетного менеджера NuGet программист может установить их прямо из окна проекта.

nuget

  1. Перейдите в Tools/NuGet Package Manager/Manage NuGet Packages for Solution…/ в Visual Studio
  2. Во вкладке «NuGet — Solution» перейдите в Browse
  3. В поисковой строке наберите название пакета — Selenium.Webdriver
  4. Выберите пакет и нажмите установить

Потом необходимо скачать драйверы, которые подходят к выбранным для тестирования браузерам и ОС компьютера:

  1. Обновите выбранные браузеры
  2. Скачайте подходящие драйвера
  3. Расположите скачанный драйвер(ы) (.exe) в директорию приложения (к примеру, …/bin/debug/)

И последний штрих: добавление using директив к пространствам имён Selenium:

...
   using OpenQA.Selenium;
   using OpenQA.Selenium.Chrome;
   using OpenQA.Selenium.Firefox;
...

Примечание: Webdriver не заработает с Firefox браузером, если не установлен Firefox: Developer Edition.

Как создать экземпляр класса веб-драйвера на c#?

Существуют классы веб-драйверов для соответствующих браузеров

  • ChromeDriver
  • FirefoxDriver
  • and so on

Каждый из них наследует интерфейс IWebDriver. Экземпляр класса веб-драйвера можно создать конструктором без параметров (у которого есть перегрузки)

...
   FirefoxDriver firefox = new FirefoxDriver();
   ChromeDriver chrome = new ChromeDriver();
   List<IWebDriver> drivers = new List<IWebDriver>() { firefox, chrome };  //список веб-драйверів
...

Как установить время ожидания загрузки контента в Веб-драйвере?

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

...
   IWebDriver driver = new FireFoxDriver();
   driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); //webdriver будет пытаться выполнить команды над контентом в установленный срок (10 секунд)
...

Как спрятать (убрать) окно консоли Веб-драйвера?

...
   ChromeDriverService chromeservice = ChromeDriverService.CreateDefaultService();
   chromeservice.HideCommandPromptWindow = true;  //спрятать консоль 
   IWebDriver driver = new ChromeDriver(chromeservice);

   FirefoxDriverService firefoxservice = FirefoxDriverService.CreateDefaultService();
   firefoxservice.HideCommandPromptWindow = true;  //спрятать консоль 
   IWebDriver driver = new FirefoxDriver(firefoxservice);
...

Как выполнить джава-скрипт код в окне Веб-драйвера?

Существует два сродных способа инъектировать свой джава-скрипт в страницу, управляемую веб-драйвером:

  • с помощью методов веб-драйвера ExecuteScript или ExecuteScriptAsync
  • с помощью приведения экземпляра веб-драйвера к интерфейсу
...
    FirefoxDriver firefoxdriver = new FirefoxDriver();
    firefoxdriver.ExecuteScript("alert("Привет!");");  //ваш js код
    firefoxdriver.Quit();

    IWebDriver driver= new FirefoxDriver();
    IJavaScriptExecutor executor = driver as IJavaScriptExecutor;
    executor.ExecuteScript("alert("Здравствуйте!");");   //ваш js код
    driver.Quit();
...

Как переместить курсор в заданную точку Веб-драйвером?

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

...
   ChromeDriver driver = new ChromeDriver();
   Actions action = new Actions(driver);

   action.MoveByOffset(5,5).Perform();  //перемещает курсор в точку (5,5)

   action.MoveByOffset(10, 15).Perform();  //перемещает курсор в точку (10,15)
...

Как перейти на веб-страницу веб-драйвером?

...
   driver.Navigate().GoToUrl("https://www.brainbeast.best/");
...

Как установить время на загрузку страницы?

...
   driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);  //время на загрузку страницы
   try
   {
      driver.Navigate().GoToUrl(url);  //если страница не загружена в течении 10 секунд, то будет выброшена ошибка
   }
   catch
   {
      //обработать ошибку
   }
...

Как передать аргументы командной строки в webdriver chrome?

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

...
   ChromeOptions options = new ChromeOptions();
   options.AddArguments(new List() { "аргумент 1", "аргумент 2", "и так далее" });  //добавление аргументов

   ChromeDriver driver = new ChromeDriver(options);
...

Полный список аргументов командной строки браузера chrome.

Как установить безоконный режим в веб-драйвере?

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

...
   ChromeOptions options = new ChromeOptions();
   options.AddArguments(new List() { "headless"});
...

Перетаскивание (drag-and-drop) на c#

working-woman
При разработке приложений для рабочего стола с использованием технологии WPF или WinForm можно наткнуться на потребность в имплементации drag-and-drop эффекта. Это упростит манипуляции с файлами между браузером, файловой системой и вашими приложениями.
Чтобы усвоить материал примера ниже советую знать:

  1. Базовые принципы Объектно-ориентированного программирования
  2. Как создавать WPF или WinForm проекты

Чтобы заставить пример работать нужно уметь работать с Visual Studio.

Drag & Drop в WPF .Net Core/Framework

  1. Создать WPF проект
  2. Добавить элемент ListView на главное окно
  3. Добавить Drop и MouseMove handler в элемент ListView

wpf-project-ru
Чтобы упростить логику программы добавим новый класс FileObject, который будет содержать Name (image.jpeg, essay.txt etc) и Fullname (C:/somefolder/image.jpeg, E:/myessays/essay.txt etc):

...
    class FileObject
    {
        public string Name { get; set; }

        public string FullName { get; set; }

        public FileObject(string name, string fullname)
        {
            Name = name;
            FullName = fullname;
        }

        public override string ToString()
        {
            return Name;
        }
    } 
...

Благодаря следующему коду пользователь сможет:

  • перетаскивать файлы в список
  • перетаскивать файлы из списка

Перетаскивая файлы в элемент ListView, возможно обработать событие перетаскивания и получить полный путь к перетаскиваемому файлу.

...
   public readonly string DirPath = AppDomain.CurrentDomain.BaseDirectory; /*путь к директории исполняемого файла*/

   private void VashElementUpravleniya_Drop(object sender, DragEventArgs e)
   {
     string[] file_pathes = (string[])e.Data.GetData(DataFormats.FileDrop); //массив file_pathes содержит пути к выбранным файлам или папкам при попытке перетащить

     foreach (var path in file_pathes) //добавление каждого файла в список, копируя их в директорию приложения
     {
        string new_path = DirPath+Path.GetFileName(path); //новый путь файла

        File.Copy(path, new_path); //копирование файла

        lv_list.Items.Add(new FileObject(Path.GetFileName(path), new_path)); //добавление в список элемента FileObject (который содержит информацию о файле)
     }
   }
...

Примечание: свойство Items элемента ListView можно наполнить любыми элементами (т.к. Items.Add(obj) принимает параметр типа object). Чтобы вывести список элементов ListView получает их текстовое представление, вызывая виртуальный метод ToString(), который переопределён в FileObject таким образом, что бы возвращать краткое имя файла (без полного пути).

Чтобы перетянуть какой-то файл из списка в какую-то директорию компьютера (или окно браузера и т.д.) нужно выбрать название файла в списке и перетащить его, удерживая левую кнопку мыши.

...
        private void VashElementUpravleniya_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            if (e.MouseDevice.LeftButton==System.Windows.Input.MouseButtonState.Pressed) //Проверка на удержание правой кнопки мыши
            {
                var file = lv_list.SelectedItem as FileObject; //получить экземпляр FileObject выбранного объекта
                if(file!=null) //проверить, что элемент выбран. Иначе file равен null
                DragDrop.DoDragDrop(this, new DataObject(DataFormats.FileDrop, new string[] { file.FullName }), DragDropEffects.Move);/*new string [] {...} - это массив путей файлов, которые скопируются в директорию, выбранную пользователем*/
                lv_list.Items.Remove(file);                   //убрать перетащенный файл из списка
            }
        }
...

Drag & Drop в WinForm .Net Core/Framework

Инструкции почти идентичные с приведенными выше:

  • Создать проект
  • Выбрать элемент Control (ListView, DataGridView, ListBox и т.д.)
  • Добавить обработку Drop и MouseMove в выбранный элемент Control
...
    private void VashElementUpravleniya_DragDrop(object sender, DragEventArgs e)
    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

    private void VashElementUpravleniya_MouseMove(object sender, MouseEventArgs e)
    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { ПутьКПервомуФайлу,ПутьКСледующему }), DragDropEffects.Move);
         }
     ...
    }
...

Примечание: можно применять перетаскивание и к файлам и к папкам. Также можно использовать много других элементов Control для реализации перетаскивания.