• Как создавать несколько объектов класса в цикле?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Program.cs
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Text.Encodings.Web;
    using System.Text.Json;
    using System.Text.Unicode;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Чтение JSON из файла и десериализация.
                string pathToFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PartnerData.json");
                string jsonText = File.ReadAllText(pathToFile, Encoding.UTF8);
                var parterAddressesFromFile = JsonSerializer.Deserialize<TriggerData>(jsonText);
    
                // Вывод на консоль.
                Display(parterAddressesFromFile);
    
                // Создание нового экземпляра класса TriggerData и его заполнение данными.
                var data = new TriggerData()
                {
                    PartnerAddresses = new List<PartnerAddress>()
                    {
                        new PartnerAddress()
                        {
                            Type = "Тип 0001",
                            Country = "Страна 0001",
                            Region = "Регион 0001",
                            City = "Город 0001",
                            Presentation = "Представление 0001",
                        },
                        new PartnerAddress()
                        {
                            Type = "Тип 0002",
                            Country = "Страна 0002",
                            Region = "Регион 00021",
                            City = "Город 0002",
                            Presentation = "Представление 0002",
                        }
                    }
                };
    
                // Сериализация.
                var options = new JsonSerializerOptions
                {
                    Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
                    WriteIndented = true,
                };
                var newJsonText = JsonSerializer.Serialize(data, options);
    
                // Вывод на консоль.
                Console.WriteLine(newJsonText);
            }
    
            private static void Display(TriggerData data)
            {
                // Способ 1.
                foreach (var address in data.PartnerAddresses)
                {
                    // Внутри Console.WriteLine будет вызван метод ToString для
                    // экземпляра класса PartnerAddress, у которого этот метод переопределён.
                    // https://source.dot.net/#System.Private.CoreLib/TextWriter.cs,09da57c2c21a3a44
                    Console.WriteLine(address);
                }
    
                // Способ 2.
                //for (int i = 0; i < data.PartnerAddresses.Count; i++)
                //{
                //    Console.WriteLine(data.PartnerAddresses[i]);
                //}
            }
        }
    }


    TriggerData.cs
    using System.Collections.Generic;
    using System.Text.Json.Serialization;
    
    namespace ConsoleApp
    {
        public class TriggerData
        {
            [JsonPropertyName("партнерАдреса")]
            public List<PartnerAddress> PartnerAddresses { get; set; }
        }
    }


    PartnerAddress.cs
    using System.Text.Json.Serialization;
    
    namespace ConsoleApp
    {
        public class PartnerAddress
        {
            [JsonPropertyName("тип")]
            public string Type { get; set; }
    
            [JsonPropertyName("страна")]
            public string Country { get; set; }
    
            [JsonPropertyName("регион")]
            public string Region { get; set; }
    
            [JsonPropertyName("город")]
            public string City { get; set; }
    
            [JsonPropertyName("представление")]
            public string Presentation { get; set; }
    
            public override string ToString()
            {
                return $"{Type}, {Country}, {Region}, {City}, {Presentation}";
            }
        }
    }


    PartnerData.json файл должен быть сохранён в UTF-8 кодировке
    {
      "партнерАдреса": [
        {
          "тип": "тип1",
          "страна": "страна1",
          "регион": "регион1",
          "город": "город1",
          "представление": "представление1"
        },
        {
          "тип": "тип2",
          "страна": "страна2",
          "регион": "регион2",
          "город": "город2",
          "представление": "представление2"
        },
        {
          "тип": "null",
          "страна": "null",
          "регион": "null",
          "город": "null",
          "представление": "null"
        },
        {
          "тип": "тип3",
          "страна": "страна3",
          "регион": "регион3",
          "город": "город3",
          "представление": "представление3"
        }
    ]
    }


    ConsoleApp.csproj (.NET 5 проект)
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net5</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <None Update="PartnerData.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
      </ItemGroup>
    
    </Project>


    61284df6cbd4b767243491.png
    Ответ написан
    Комментировать
  • Как взаимодействовать с iframe google captcha?

    @Ilya12345
    Через селениум случайно получилось так одну из пикч ткнуть, пока делал другую таску, копай в этом направлении или колхозь из ProBrowser.
    $iframe = $driver->findElement(WebDriverBy::xpath('//iframe[@title=\'проверка recaptcha\']'));
    $driver->switchTo()->frame($iframe);
    $driver->findElement(WebDriverBy::xpath('//div[@class=\'rc-image-tile-wrapper\']'))->click();
    Ответ написан
    3 комментария
  • Насколько актуальна информация о производительности данного бенчмарка C# vs Go?

    @12rbah
    Вот само по себе "сравнение производительности" не совсем корректная постановка вопроса,т.к. в некоторых тестах там не самые производительные языки на первом месте, поэтому нужно уточнить контекст сравнения, в какой области, допустимо ли использование стандартных общих функций и т.д.
    По нормальному нужно проверять, что код оптимизирован под определенный язык, если вы напишите похожий на разных языках, не факт, что он будет одинаково оптимизирован. Вот в нескольких тестах я нашел прямой вывод в консоль во время выполнения теста, хоть я не занимаюсь обычно написанием тестов производительности, но такие вещи в тестах это плохо, т.к. фукции вывода в консоль сильно по разному реализованы в каждом языке(//go fmt.Println(prime) //c# Console.WriteLine(prime)). И обычно они разной степени тяжести.
    UPD: в общем я хотел сказать, что в одном языке могут лучше оптимизированы одни функции лучше других, и если вы пишете приложение с использованием определенных стандартных функций, то практически есть смысл сравнивать только эти функции/модули в языках
    Ответ написан
    Комментировать
  • Насколько актуальна информация о производительности данного бенчмарка C# vs Go?

    Оценить сложно, тк для решения задач вполне могут использоваться разные алгоритмы.
    Также я не нашёл настроек рантайма для C#, так что может использоваться не самый производительный профиль.
    Также сам код выглядит подозрительно.

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

    В целом C# и Go тут идут почти на равных, с разницей только в потреблении памяти.
    Ответ написан
    2 комментария
  • Как узнать, достиг ли я уровня Junior Unity Developer?

    NikS42
    @NikS42
    Unity developer
    На позицию джуна этого может и хватить в некоторых командах. Но только в некоторых. Обычно должно быть неплохое теоретическое знание программирования. алгоритмы, структуры данных, то, как работает c#, сборка мусора, система типов. Человек, по примерам людей из интернета что-то собравший, можно считать, ничего и не умеет. Это заслуга разработчиков движков, создавших интуитивно понятный продукт, которым могут пользоваться даже дети. Но пользование движком не имеет никакого отношения к разработке игр, там важны совершенно другие вещи. В некоторых командах, обычно или довольно слабых или наоборот, способных и желающих вырастить себе разработчика с ~~полного нуля~~чистого листа. Джун может тупить, делать не лучшим образом, но ДОЛЖЕН уметь слушать и непрерывно работать над собой. Учиться как надо делать и не спорить. И если не получил до этого, получать теоретические знания, без которых полноценным разработчиком не стать, даже разобрав саму юнити вдоль и поперек. Обычно джун забирает время старших коллег на свое обучение. В ГК обычно джуны не нужны, там предпочтительны люди с опытом от middle, способные взять проект (Обычно, с нетривиальной механикой. Все таки, ГК не первый год существует, и игрока уже надо чем-то удивлять и цеплять. Многие ГК игры сейчас это сложнореализуемая фича в минималистичном окруженим) и выполнить его самостоятельно в короткие сроки.
    Ответ написан
  • Как работают статические поля в C#?

    insighter
    @insighter
    -First time? - Huh? (C#, React, JS)
    У вас, что dial-up интернет или паталогическая лень? :))

    1. Значения констант применимы только на этапе компиляции сборки.
    2. Любые статические поля класса доступны (конечно, если позволяет видимость) всегда
    3. Любые не статические поля класса доступны после создании экземпляра класса

    https://ru.stackoverflow.com/questions/651231/c-%D...

    В чём польза readonly полей в C#?
    https://metanit.com/sharp/tutorial/3.3.php
    Ответ написан
    Комментировать
  • Какие способы существуют по отделению реальных пользователей от роботов, для статистики просмотра страниц?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если речь про легитимные боты, например поисковые то подойдёт эта библиотека
    https://github.com/JayBizzle/Crawler-Detect

    Общий принцип это смотреть на HTTP-заголовки, user-agent как минимум, но подделать можно что угодно.
    Таких "умных" ботов можно вычислять только по поведенческим факторам, например отслеживать частоту запросов, находить определённые шаблоны в запросах и тд.
    Например запросы когда загружается страница, но не идут следом запросы на загрузку ресурсов (картинок, стилей js и тд).

    Можете посмотреть старенький доклад от 2ГИС про то как они защищаются от парсинга api
    https://www.youtube.com/watch?v=pYxnW7kYcbU
    Ответ написан
    Комментировать
  • Расширение таблицы при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В общем, рассказываю про парсинг.

    Код, который видно на странице через инспектор элементов в браузере - это код, который браузер подготовил для пользователя. Открываете сайт - браузер отправлять запрос на сервер. Запрос состоит из метода, пути, заголовков и тела. После первоначального запроса браузер получает от сервера HTML страницу, в которую включено (обычно) множество JS скриптов, которые в процессе выполнения могут создавать дополнительные запросы на сервер для получения дополнительной информации. После выполнения всех действий, пользователь видит в браузере готовый результат, который отличается от первоначального запроса из-за дополнительных джаваскриптов.

    Если элемент (класс, id, и тд) видно в инспекторе браузера - это не означает, что элемент присутствовал при первоначальном запросе. Чтобы увидеть тот код, который браузер получает первоначально (тот самый код, который вы получите через requests, curl итд) - нужно нажать CTRL+U, либо правой кнопкой -> просмотр кода страницы
    Это - тот самый код, который вы получаете, и все данные нужно искать только в нем, это дает гарантию того, что нужный вам элемент будет присутствовать при выполнении запросов через ЯП.

    Если нужного элемента нет на странице, значит он загружен каким нибудь JS скриптом. Здесь будут два варианта:
    1. JS отправляет дополнительный запрос на сервер, получает нужные данные и вставляет их в HTML.
    2. Данные создаются внутри JS скрипта без запросов (очень маловероятно)

    Если данные появляются в результате дополнительного запроса, то нужно просто повторить этот запрос.

    Чтобы понять, что нужно - нужно воспользоваться любым сниффером трафика. Самое простое - встроенный в браузер логгер запросов. F12 -> Network.
    6124fec4cfd69347854863.png
    Обычно достаточно поставить фильтр на XHR.
    Если есть под рукой Fiddler, то тоже сгодится. Ну и Burp / ZAP как вариант (но очень жирно).

    Алгоритм будет примерно таким:
    1. Открываем вкладку Network
    2. Очищаем историю запросов (если есть)
    3. Желательно поставить галочку "Preserve log", чтобы история не пропадала.
    4. Обновляем страницу. Если контент подгружается при прокретке / по нажатию кнопки - крутим / нажимаем и тд.
    5. Теперь можно нажать CTRL+F все в той же вкладке Network и вписать искомый текст (допустим название товара).
    6. Слева будут те запросы, которые содержат эту подстроку. Теперь нужно просто пощелкать по ним, найти нужный, посмотреть из чего он состоит и повторить его через requests.

    Нужно обратить внимание на заголовки и тело запроса. Не редко при загрузке доп. информации в тело запроса так же передается указатель текущей страницы, или индекс элемента, с которого начинается новый список. Так же в заголовки могут добавиться дополнительные. Например, csrf token, либо X-Requested-With. Если повторение запроса не принесло желанный результат - стоит проверить заголовки и тело еще раз. Если сайт загружает данные при нажатии на кнопки, прокрутке страницы и тд - алгоритм тот же.

    Делюсь хорошим сайтом, который увидел тут: https://curl.trillworks.com/
    Копируете свой запрос как CURL
    612500b91076a776091384.png
    Затем вставляете на сайт. Он выдаст готовый код на Python. Но нужно понимать, что это автоматический процесс и он не всегда выдает правильный результат. В частности, преобразование application/json тела довольно неправильно. Но для копипаста некоторых заголовков подходит вполне. В общем сайтом пользоваться можно, но и самому думать тоже нужно

    Из хороших программ - Postman. Позволит легко и быстро составлять запросы, есть экспорт в Python код. Советую, если запросы довольно тяжелые, чтобы составлять их "наживую".

    Краткая выжимка:
    1. Код через инспектор браузера != коду с запроса requests / curl.
    2. Скорее всего нужные вам данные подгружаются доп. запросами, ищутся через любой мониторинг трафика.
    3. Следите за телом и заголовками запроса. Заголовки, даже самые незначительные, могут влиять на конечный результат.
    4. Старайтесь всегда в заголовки добавлять User-Agent

    Если данные грузятся без доп запросов, лежат в неизвестном формате, или просто лень разбираться - используйте Selenium. Он является таким же браузером, но только с возможностью контролировать его работу
    Ответ написан
    3 комментария
  • Как запретить использовать веб приложение с больше одной вкладки в браузере?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Написать Shared Web Worker.
    Подписаться на сообщения от него: он может прислать команду «деактивируйся!» (и «активируйся снова!» – в сложном варианте).

    При старте отправлять в него сообщение, регистрирующее вкладку по уникальному ID. Случайное-уникальное, хранится в скрипте во вкладке, запоминается и в воркере.

    Воркер по такому сообщению принимает новый ID и деактивирует остальные (отправляет им сообщения).
    Принцип «каждый новый побеждает предыдущих».

    Если нужно реализовать возврат полномочий к предыдущей вкладке, когда закрыли «активную» – можно придумать протокол. Воркер может по очереди пинговать ID вкладок: «жив?» – нет (таймаут) – следующий «жив?» – жив — «будешь главным».
    Ответ написан
    Комментировать
  • Как обойти эту капчу selenium c#?

    twobomb
    @twobomb
    АХхаах капча, смешно...
    Всего на сайте 6 капч с символичным названием, думаю не нужно объяснять сколько на какой звездочек....
    https://ru.topkinder.com/img/captcha/7.png
    https://ru.topkinder.com/img/captcha/8.png
    https://ru.topkinder.com/img/captcha/9.png
    https://ru.topkinder.com/img/captcha/10.png
    https://ru.topkinder.com/img/captcha/11.png
    https://ru.topkinder.com/img/captcha/12.png
    https://ru.topkinder.com/img/captcha/13.png

    P.S. Напишите кто нибудь разработчикам чтобы хотя-бы recapcha прикрутили....
    P.P.S. На самом тут вообще нет проверки капчи на сервере, и selenium тут не нужен.
    Банально шлем POST Запрос application/x-www-form-urlencoded , на адрес https://ru.topkinder.com/ankets
    2 поля , captcha указываем 1, id это id участинка, по идее они идут все по порядку, можно всех перебрать. Всё! Голос учтен. Ну они хотя-бы не очень тупые, они добавляют ip голосующего и при следующем голосе на этот же Id он не учтется, а значит нужно найти столько живых проксей сколько мы хотим накрутить голосов....
    Ответ написан
    Комментировать
  • Какой H1 карточки товара будет лучшим?

    PageAuditRU
    @PageAuditRU
    Senior SEO Анализатор
    Главное: определитесь с основным поисковым запросом, под который создаётся/оптимизируется страница.

    Составьте H1, максимально учитывая правила (для Яндекса):
    1. H1 должен содержать слова из запроса в точной форме
    2. H1 не должен содержать повторов слов из запроса
    3. H1 должен содержать все слова из запроса
    4. Слова из запроса должны входить в H1 в том же порядке
    5. H1 не должен содержать только слова из запроса (H1 не должен добуквенно совпадать с запросом)

    Желательно выполнить:
    6. H1 должен состоять из одного предложения
    7. Прямое точное полное вхождение (DEF) запроса в H1 приветствуется
    Ответ написан
    Комментировать
  • Как отправлять сообщения через вебхук в Discord канал?

    GamerDisclaimer
    @GamerDisclaimer
    Scratch Программист XD
    Готовая утилита с решением, снизу код, и тутор
    Ссылка удалена модератором, нарушение п.5.7 Регламента.
    Я довольно долго копался с решением, перерыл пол гугла, потратил несколько часов
    И наконец-то сделал это!
    Автор вопроса, пж отметь ответ за старания:)
    Кстати, довольно интересная тема! я наработки сносить не буду

    И первое, что хочу сказать, это то, что прога написана на Python, так что нам потребуется установленный питон, и библиотека discord.py


    Вот вам краткое обучение:
    Пошаговое создание вебхука

    611cdea27551f113640884.jpeg
    611cdeda67dbe369516144.jpeg
    611cdf354562a461795201.jpeg


    Создаём файл с расширением .py
    Вводим следующий код:

    from discord import Webhook, AsyncWebhookAdapter
    import asyncio
    import aiohttp
    
    
    async def send () :
        URL = input('Введите URL вашего вебхука: ')
        Message = input('Введите ваше сообщение: ')
    
        async with aiohttp.ClientSession() as session:
            webhook = Webhook.from_url(URL, adapter=AsyncWebhookAdapter(session))
            await webhook.send(Message)
    
    
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    asyncio.run(send())


    Сохраняем, запускаем, вводим URL и наше сообщение

    Проверяем. Всё работает
    611cebaa75960288108519.jpeg
    Ответ написан
    3 комментария
  • C# .NET в Линукс. Хочу попробовать. Кто отговорит?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Всё зависит от того насколько кривые у тебя руки.
    Можно сделать тормозное говно, а можно написать прекрасное быстрое приложение практически не потребляющие ресурсы
    Ответ написан
    Комментировать
  • Как перезапускать таймер в setTimeout?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    let leaveTimer;
    
    const startLeaveTimer = (users: any): void=>{
      const callUsersCount = users.length;
      const timeLeaveSeconds = timeLeave.leaveRoom * 5000
    
      clearTimeout(leaveTimer);
    
      leaveTimer = setTimeout(() => {
          if (callUsersCount < 2) {
            alert('hey')
          }
        }, timeLeaveSeconds)
    }
    Ответ написан
    Комментировать
  • Почему css свойство height не анимируется?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Потому что начальное значение - auto. Нужно указывать конкретные значения в начальном и конечном состоянии для высоты. Тогда будет работать.
    Ответ написан
    3 комментария
  • Как перенести объект из JS в другие языки?

    @GrayHorse
    в каком виде CryptoJS принимает в себя инстанс объекта самого себя и что он хеширует, чтобы повторить этот метод используя другие инструменты


    Все криптографические алгоритмы работают с байтами. CryptoJS используется абстракцию в виде класса "WordArray" для представления байтов, т.к. это старая библиотека, написанная, когда не было "ArrayBuffer".

    мне надо чтобы оно НЕ РАБОТАЛО также как и НЕ РАБОТАЕТ в js,

    Оно работает. Причем правильно.

    неужели по Вашему я могу переместиться во времени и пространстве к программисту, который когда-то захешировал слово таким методом и сказать ему "эй, ты хешируешь объект, не надо, хешируй строку" и дать ему этот код?

    На что тот программист бы ответил: "Не неcи чушь".
    И будет прав.

    Т.к. в его случает программа берет байты из строки и хешерует их, потом опять хеширует их же и т.д:
    SHA512(
            SHA512(
                    SHA512("hello".getBytes()) 
            )
    ).toString("hex");

    Для вывода в консоль предстaвляет их в виде хекс строки.

    ---

    Хеши же от вывода якобы той программы на C++:
    SHA512(
            SHA512(
                    SHA512("hello".getBytes()).toString("hex").getBytes()
            ).toString("hex").getBytes()
    ).toString("hex");

    Ничего не смущает? Что здесь cчитается не то же самое.

    ---

    чтобы повторить этот метод используя другие инструменты


    Другие инструменты в виде Java:

    import java.math.BigInteger;
    import java.nio.charset.StandardCharsets;
    import java.security.*;
    
    public class Main {
        public static void main(String[] args) throws NoSuchAlgorithmException {
            byte[] bytesOfMessage = "hello".getBytes(StandardCharsets.UTF_8);
            MessageDigest SHA512 = MessageDigest.getInstance("SHA512");
    
            byte[] digest = SHA512.digest(bytesOfMessage);
            Main.log(digest);
            for (int i = 0; i < 4; i++) {
                digest = SHA512.digest(digest);
                Main.log(digest);
            }
        }
        private static void log(byte[] digest) {
            var hex = new BigInteger(1, digest).toString(16);
            if (hex.length() % 2 == 1) {
                hex = "0" + hex;
            }
            System.out.println(hex);
        }
    }


    Шок! Вывод такой же и у "неправильного" CryptoJS. Банковские приложения в опасносте!

    ---

    Тема — кринж.
    Ответ написан
    1 комментарий
  • Как вывести в console.log букву P и A звёздочками *?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const stars = (n) => {
      for (let r = 4; r >= 0; r--) {
        const shift = r * 5;
        const bits = (n & 31 << shift) >> shift;
        console.log(Array(5).fill('').map((_, i) => bits & 1 << i ? '*' : ' ').reverse().join(''));
      }
    }
      
    stars(0x1e8fa10); // P
    stars(0x457e31); // A

    Вывод
    ****
    *   *
    ****
    *   
    *   
      * 
     * *
    *****
    *   *
    *   *
    Ответ написан
    Комментировать
  • Что выбрать для самописной системы управления складом, PHP или Python?

    @JuniorNoobie
    Сижу в поддержке, пишу мелкие проекты
    Лучше найдите нормального специалиста. Он вам и подскажет какой стек выбрать, и какие плюсы и минусы вас ждут. Не будьте плохим работодателем - не отсекайте себе потенциальных работников.
    П.С. Написание такой системы с нуля влетит в копеечку. Лучше все-таки присмотреться к готовым решениям и, в случае чего, нанять спецов немного подрихтовать систему.
    Ответ написан
    1 комментарий
  • Как из google analytics вывести данные о client id?

    @pilulkayullka Автор вопроса
    нашла решение: добавляем пользовательский параметр "client id" - формируем отчёт по этому параметру с нужными метриками ( в моём случае, интересовали звонки, доход, заявки) - выгружаем отчёт.
    Ответ написан
    4 комментария
  • Как получить ClientID Яндекс.Метрики?

    @marxxt
    понравился ответ - поставь ✔
    Попробуйте так
    <script type="text/javascript">
    window.onload = function(){
      var clientid = yaCounter99999.getClientID();
      console.log(clientid);
    }
    </script>


    Счетчик не успевает инициализироваться, я так думаю
    Ответ написан
    Комментировать