Що таке MPPT Сонячної панелі

Вступ

solar-panels
На сьогодні дедалі зростає інтерес до джерел альтернативної енергії. Зі збільшенням рівня свідомості сучасних цивілізацій альтернативні джерела енергії витісняють застарілі, екологічно небезпечні. Акумуляція сонячної енергії – це простий, умоглядний та, найголовніше, сприятливий для довкілля спосіб задовольнити споживацькі потреби. Проте сонячна енергетика зіштовхнулася із досі недостатньо дослідженими властивостями матеріалів, що здатні трансформувати енергію сонця. Експериментально було визначено деякі закономірності роботи сонячних панелей, що надало початок широкому полю методів для їхньої оптимізації.
Перехід на нові засоби електропостачання набуває масової тенденції у високорозвинених країнах світу. Наразі відомо такі шляхи видобутку природної енергії: вітровий, водний, геотермальний та сонячні станції.
У практичному плані використання сонячних електростанцій переважає : їх розташування не має значних обмежень, адже сонячні панелі можна встановити на дахах будь-яких будинків, на поверхні електромобіля, літака, космічної станції або в чистому полі. Саме через це вони стали популярними у всьому світі. Однак різні чинники довкілля впливають на роботу панелі, що не завжди призводить до хороших наслідків. Тому винайшли методи, що зводять ці ризики до можливого мінімуму.

Історія

Властивість деяких матеріалів створювати електричний струм під дією світла відкрив у 1839 році Олександр Едмон Беккерель, батько Анрі Беккереля – першовідкривача радіоактивності. Пройшло тридцять чотири роки, коли два англійських фізика, Вільям Адамс та Річард Дей, створили публікацію, де були записи про експерименти з дією світла на селеновмісні фотоелементи.
first SP

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

Будова сонячної панелі

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

Базові відомості

Фотони, що пройшли крізь склоподібну поверхню фотоелемента і не віддзеркалилися, поглинаються електронами напівпровідникового матеріалу, надаючи їм достатньо енергії, щоб відірватися від атомних орбіталей та стати вільними. Вільні електрони починають рухатися хаотично, що не можна назвати струмом. Тому до верхньої половини напівпровідника додають домішки н-елементів, що збільшує кількість вільних електронів, а до нижньої – р-елементи, які збільшують кількість дірок, тим самим, утворюючи р-н перехід.

Solar panel

  1. З н-елементними домішками
  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< P2 , то точка потужності знаходиться зліва від ТМП, і напругу треба збільшити. Отже, при постійній зміні напруги і перевірці нерівності попередньої та поточної напруги, стан панелі буде близьким до ТМП.

Оптимізація методом лінійної залежності 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-контролер, що включає ШІП.

Джерела

Робота з зображеннями мовою 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;
   }
...

Як зберегти зображення з визначеним розміром

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

...
   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();  //отримання посилань з хтмл коду
         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 клієнт.

...
   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(microsoft)
 
;
        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 в США. Сучасні технології дозволяють розпізнати нетривіальні астрономічні явища і тіла, які неодмінно треба вивчати, – це чорні діри, нейтронні надмасивні зірки, далекі галактики, кластери та суперкластери галактик. Сьогодні найсприятливіші умови для дослідження Всесвіту. Актуальність розроблення теорій, що описують Всесвіт, пояснюється неспроможністю подальшого еволюціонування фізики проведенням експериментів в земних умовах. Також на шляху дослідження завжди присутні неочікувані відкриття.

Всесвіт з точки зору Ньютонiвської фізики

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

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).

formulae

Зобразимо світлову хвилю у просторі: wave

За законом Габбла, довжина хвилі з часом буде змінюватися таким чином: Lambda

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

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

Нехай маса галактики Б дорівнює m. Використаймо
теорему Ньютона та зазначимо, що маса матерії в радіусі X1 дорівнює M. Тоді можна вважати, що 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
α може залежати від часу певним чином: оберненопропорційно, прямопропорційно, степенево тощо. Припустимо, що насправді залежність така:
dependence-one
Підставимо у рівняння:
substitution-two
Тепер ми бачимо, що зліва в знаменнику час у квадраті, справа – у степені . Отже, рівняння матиме сенс тільки якщо виконується 2=3р, звідки р=2/3. Тоді масштабний фактор дорівнює a=ct^(2/3). Підставимо р у рівняння:
substitution-three
Така нелінійна залежність від часу говорить про те, що простір розширюється з прискоренням. Також зазначимо, що у момент часу 0, масштабний фактор теж дорівнює 0. Це відповідає за той початковий стан Всесвіту, коли густина матерії була нескінченна.
Перепишемо формулу сталої Габбла:
substition-four

Тепер припустимо, що кордони області, у яких знаходиться маса М, мають ідеальну пружну поверхню. Тоді тиск, який створюється речовиною на них, дорівнює нулю, бо маса не переміщується в інші елементарні області.

graph

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). Перебудуймо рівняння Фрідмана під нові параметри:
equation-new-params
Щоб рівняння мало сенс, треба 2=4*р. Значить р=1/2:

c-param
scale-factor
new-hubble-constant

graph-radiation

Тепер розглянемо випадок, коли світло поширюється в напрямку осі Х у своєму кубику, який ми наділимо ідеальними кордонами. Тоді сила, що діє на кордони дорівнює: F=dP/dt, помножимо чисельник і знаменник на швидкість світла∶F=(dP*c)/(dt*c)=E/L
waves

Поділимо обидві частини на площу контакта світла з кордоном: 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

notation

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}";  //маска виділяє "hello" з трьома O на кінці та пробілом зліва
...

Зауваження: патерн чи маска це правило обробки текста. Ви можете протестувати свою маску на онлайн тестері.

...
   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"
...

Як створити список виділених рядків з 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?

...
   //міняє місцями "Helooo" на "Howdy"
   string newtext = Regex.Replace(text, pattern, "Howdy");
...

Як ігнорувати letter case в регулярних виразах?

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

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

Зауваження: Можливо встановлювати багато RegexOptions (RegexOptions.IgnoreCase | RegexOptions.RightToLeft | RegexOptions.Compiled).

Як встановити час виконання 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 – це набір інструментів, які використовуються для автоматизації роботи браузера. Існують реалізації керування “селеніумом” для таких популярних мов, як С#, PHP та Java.

Як впровадити Selenium в проект Visual Studio?

Перш за все, необхідно встановити пакети Selenium.Webdriver у проект. За допомогою пакетного менеджера NuGet програміст може встановити їх прямо з вікна проекта.

  1. Перейдіть в Tools/NuGet Package Manager/Manage NuGet Packages for Solution…/ в Visual Studio
  2. У вкладці”NuGet – Solution” перейдіть в Browse
  3. У пошуковому рядку введіть назву пакета – Selenium.Webdriver
  4. Оберіть пакет і натисніть “Встановити”

Далі необхідно завантажити драйвери, відповідповідні до обраних для тестування браузерам і ОС комп’ютера:nuget

  1. Оновіть обрані браузери
  2. Завантажте відповідні драйвери
  3. Розмістіть завантажений(-ні) драйвер(-и) (.exe) в директорію додатка (наприклад, …/bin/debug/)

Останній штрих:
додавання using директив до простору імен Selenium:

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

Зауваження: Webdriver не запрацює у Firefox браузері, якщо не встановлений Firefox: Developer Edition.

Як створити екземпляр WebDriver у мові c#?

Для тестування кожного браузера існує відповідний класс:

  • ChromeDriver
  • FirefoxDriver
  • і так далі

Вони всі успадковують інтерфейс IWebDriver. Екземпляр класу WebDriver можна створити за допомогою конструктора без параметрів (який має декілька перевантажень):

...
   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
   {
      //опрацювати помилку
   }
...

Як передати браузеру аргументи командного рядка?

У випадку створення складних та багатоманітних тестів застосування аргументів командного рядка може бути корисним і необхідним.

...
   ChromeOptions options = new ChromeOptions();
   options.AddArguments(new List<string>() { "аргумент 1", "аргумент 2", "і так далі" });  //додавання списку аргументів

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

Повний список аргументів командного рядка браузера Chrome.

Як встановити безголовий (безвіконний) режим в окні веб-драйвера?

Якщо використання тестів не потребує показу корисної графічної інформації, то логічно вимкнути віконний режим в браузері. Щоб запустити браузер у безвіконному режимі, треба додати аргумент командного рядка:

...
   ChromeOptions options = new ChromeOptions();
   options.AddArguments(new List<string>() { "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-ukДля спрощення логіки програми додамо новий клас 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 для реалізації перетягування.