• Возможно ли создать универсальный парсер html на .net?

    tomnolane
    @tomnolane
    профессиональный разработчик
    если вы под
    универсальный парсер новостей на c #
    подразумеваете: написать код один раз и дальше его использовать для разных новостных сайтов, то нет
    если написать код сразу под конкретные сайты, то "почти" да, возможно. Но могуть быть миллион и одна проблема в архетиктуре самого сайта, к примеру:
    достаточно попробовать пропарсить сайт госзакупок и сразу поймете о чем я.
    Или к примеру собрать БД по автомобилям: чтобы под каждую категорию, версию, модели, комплектации авто были все данные.

    Возможно ли чтобы он работал на большинстве сайтов

    НЕТ, работать будет если под каждый сайт делать свой парсер, либо будет "много мусора" собираться: реклама, отзывы, соседние блоки, либо браться часть контента, либо браться совсем не то...
    Ответ написан
    9 комментариев
  • Какой формат динамической UTM метки в Facebook?

    tomnolane
    @tomnolane Автор вопроса
    профессиональный разработчик
    на момент 29.05.2018, динамических utm меток у facebook рекламы нету
    Ответ написан
    Комментировать
  • Где получить список IP адресов мобильного оператора YOTA?

    tomnolane
    @tomnolane Автор вопроса
    профессиональный разработчик
    Обратился сюда (личным сообщением) и мне дали список. Всех благодарю за ответы
    Ответ написан
    Комментировать
  • Секундные подвисания Windows 10?

    tomnolane
    @tomnolane
    профессиональный разработчик
    совсем недавно у меня тоже был ноутбук фирмы ASUS и в нём была аналогичная проблема, разве что на меньшее количество секунд подвисало (до 5 сек). (прим. только на Windows, на Linux вроде норм было). Поставил основным SSD, стало лучше, но каждый раз, когда активно использовался HDD проблема повторялась, хотя было подвивание не совсем "обычное": не полностью блокировалось всё (т.е. я мог двигать мышкой и делать простейшие операции но с (если сравнивать) fps примерно 4-6 ). Проблему решил просто: ноутбук отдал сестре, себе взял thinkpad
    Ответ написан
    Комментировать
  • Как правильно дождаться выполнения всех потоков, созданных в цикле?

    tomnolane
    @tomnolane
    профессиональный разработчик
    оффтоп
    люди подписались чисто поглазеть или поржать?

    вы уверены, что вам нужен Thread?
    Task или Thread в C#.NET 4.0 WPF? ( Павел Елизарьев доступно описал разницу в ответе)
    я бы использовал Task для начала, т.к. есть такая замечательная штука, как пулл потоков (подзабыл как на английском называется) который лучше обычного программиста (автоматически) понимает, когда и кто закончил, сколько есть свободных, сколько нужно и что с ним дальше делать. И нужно у вас в коде делать акцент не на блокирование/синхронизацию потоков (оставьте их в покое - чем быстрее сделают, тем лучше), а использовать вот такую простую штуку: Оператор lock
    а зависание происходит потому, что вы и основной поток блокируете.
    Ключевое слово lock не позволит ни одному потоку войти в важный раздел кода в тот момент, когда в нем находится другой поток. При попытке входа другого потока в заблокированный код потребуется дождаться снятия блокировки объекта.
    Ответ написан
    1 комментарий
  • Как скрыть загрузку css?

    tomnolane
    @tomnolane
    профессиональный разработчик
    я делаю так: (на php)
    <?php
    echo '<style>';
    require 'css/bootstrap.min.css';
    echo '</style>';
    ?>

    и этого вполне достаточно. Google Page Speed перестаёт ругаться.

    upd
    для django наверно вот так:
    <style>{% include "/static/css/style.css" %}</style>
    Ответ написан
  • Доступ к компьютеру c windows по ssh?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Есть разные программы, но стразу встречается проблема - это динамический IP адрес, который выдаёт провайдер вашего интернета. Сегодня у вас один IP, завтра другой.. и как вы найдёте компьютер на просторах интернета?
    К счастью, есть решение, которое я лично сам использую (в т.ч. и главный вирусный аналитик Лабаротии Касперского) - это LogMeIn Hamachi - он преобразует динамический IP в статический (он бесплатен) + Remote Manipulator System (сокращенно RMS) - и программа для управлением компьютером/ами (тоже бесплатно и легально, в отличии от teamviewer). Пользуюсь уже не один год, доволен, очень удобно.
    P.S. можно управлять хоть через командную строку, хоть визуально

    upd
    скриншот 1
    скриншот 2
    скриншот 3
    Ответ написан
  • Адекватный хостер VPS в России?

    tomnolane
    @tomnolane
    профессиональный разработчик
    использую majordomo с 2012 года. Питерская компания, ей около 20 лет. Доволен. Бывают маленькие недостатки - пишешь в тех поддержку, оперативно делают (как правило, проблемы очень редко бывают). Цены очень приемлемые. Лично я доволен всем, менять или искать альтернативу не планирую
    Ответ написан
    Комментировать
  • Как в C# выполнить JavaScript-код и вернуть результат (без браузера)?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Ответ написан
    Комментировать
  • Зачем подделывать и как защититься от чужой рассылки писем от моего домена?

    tomnolane
    @tomnolane Автор вопроса
    профессиональный разработчик
    ответ от сервиса, предоставляющие массовую рассылку
    Сообщаю. была найдена в блочном редакторе XXS уязвимость. У нас работает Wallarm https://wallarm.com/ и мы платим им постоянно за его работу.
    Произошла SQL инъекция, и Wallarm ее не заметил.
    Злоумышленник смог добавить в свой аккаунт через нее подтвержденные адреса ( и на вашем домене в том числе) и поставить себе большой кредитный лимит, а так же изменил уровень попадания на модерацию до full trust ( то есть мы не проверяем никогда, кроме spam trap адресов ).
    В ночь, когда работает только один сотрудник ( так как больше не требуется ) злоумышленник зарегистрировал аккаунт на сервисе esputnik , там разместил html файл с редиректом на сайт vsegdaplus.ru . Потом он зашел в свой аккаунт с не его подтвержденными адресами и включенным огромным кредитным лимитом и малыми партиями всю ночь до утра слал письма, всего ушло 1,9 млн трафика от 5ти разных доменов. Все одной тематики.

    Как мы "залатали": уязвимость найдена и закрыта.
    В перечне действий по такому ручному внесению адреса в подтвержденные не для staff аккаунтов установлен блокиратор + уведомление аларм на группу админов.
    В Wallarm открыт кейс на расследование по инциденту, так как это их работа выявлять и закрывать нас от таких взломов.
    Полученные данные по IP адресам взлома, по домену, на котором располагался вредоносный код и который был использован для инъекции, и другие данные - все поданы в юридический отдел для соответствующей подачи заявления в киберполицию.
    Ответ написан
    Комментировать
  • Можно ли делать рассылку с помощью facebooke бот?

    tomnolane
    @tomnolane
    профессиональный разработчик
    можно, но очень не долго...
    спойлер

    сразу, после того как вы нажимаете кнопку "опубликовать", ваша публикация проходит почти 100 000 тестов и проверок (от безопансти, до определения спама, копипаста, оригинальности, религиозной и политической принадлежности и т.д.) и такие "штуки" давно уже успешно банятся, причём очень быстро...
    Ответ написан
    Комментировать
  • Настройка Visual Studio Code?

    tomnolane
    @tomnolane
    профессиональный разработчик
    самые основные:
    Auto Close Tag - авто закрытие тегов
    Auto Rename Tag - переименование парных тегов
    Beautify - разжатие кода (из minify в стандартный вид)
    highlight-mathing-tag - подсвечивание парных тегов (нужно настроить в конфиге, чтобы поярче было)
    html snippets - сниппеты как в сублайме
    insert <br> tag - вставка тега новой строки через шифт+enter
    PHP Debug - деббагер для php (нужно настраивать)
    Debugger for Chrome - JS дебаггер
    vscode-icons - иконки для VSC
    minify - сжатие кода
    css auto prefix - автопрефиксы
    Insert Numbers - полезное расширения для вставки чисел определенного формата во множество мест с инкрементом
    ================
    ещё некоторые, которые я добавил и пользуюсь:
    apache Conf (для подсветки .htaccess)
    AutoFileName - дополнение пути (например для "requere" в node.js)
    Bookmarks - делать закладки в коде
    Bracket Pair Colorizer - подсвечивать парные скобки (квадратные, фигурные, прямоугольные, круглые) очень удобно
    gitignore - добавляет .gitignore файл под проект (node.js, docker, yii2, laravel и т.д.)
    GitLens — Git supercharged - показывает гит-коммиты в коде (и автора коммита, удобно в командной разработке)
    HTML Class Suggestions
    Live Server - открывает браузер, где в режиме "онлайн" видишь изменения в html
    Markdown Preview Enhanced - тоже самое, что и Live Server, но только для страниц с markdown разметкой
    Material Icon Theme - для красоты VSC)
    Monokai Dark Soda - моя любимая тема разработки
    MySQL Syntax - для подсветки синтаксиса sql
    PHP Intellisense -
    Quick gitignore - добавляет файл/директорию в gitgnore
    Regex Previewer - помогает в регуляркой
    SQL Server (mssql) - для работы с sql server
    SVG Viewer - просматривать SVG картинки
    Todo Tree - делать заметки, удобно
    Remote FS - для удаленного подключения по FTP (удобно, если несколько серверов), пример конфига:
    { 
        "remotefs.remote": {"site": {
            "scheme": "ftp",
            "host": "1************01",
            "username": "ad**********ain",
            "password": "Lv************xF",
            "rootPath": "/"
          },
          "site2": {
            "scheme": "ftp",
            "host": "17**********1",
            "username": "a*****************m",
            "password": "************O",
            "rootPath": "/"
          },
          "moy-yandex": {
            "scheme": "ftp",
            "host": "a***********u",
            "username": "a***************mone",
            "password": "1***************W",
            "rootPath": "/"
          }
      }


    UPD
    Есть ещё хорошее приложение: Gremlins. Он подсвечивает невидимые символы в коде. Но его нужно немного "допилить", чтобы показывал невидимый символ юникод u+feff (образуется часто, когда кодировка страницы UTF-8 with BOM)
    собственной как допилить я сам же описываю в своем вопросе: тут

    что касается сннипетов для php: бывает такое, что они не срабатывают и тут две причины: пользователь достаточно быстро жмет TAB (VSC не успевает ещё понять, что пользователь закончил ввод) и когда достаточно долго работаешь в VSC без перезагрузки последнего.

    ИМХО: рано или поздно эта проблема решиться. VSC стремительно развивается и такая проблема будет решена (до этого чтобы быстрее было - лучше написать сюда об этом)
    Согласен с Artem , с тем, что Brackets имеет некоторые вещи лучше и оптимизированнее, чем VSC, и я для Front-end чаще работаю в Brackets (в большей части из-за возможности видеть online изменения тут же в браузере). Но главный минус Brackets от VSC - при большой кол-во плагинов он очень-очень тупит, также мне не нравится работа Brackets-ftp.
    Послесловие:
    VSC ещё учится и становится лучше. Рано или поздно он обгонит и Sublime, Atom и другие IDE - это вопрос времени, потому что: 1) он open source 2) финансирует и ведет разработку Microsoft 3) бесплатен!!! и последнее камень в огород всем крупным IDE
    Ответ написан
    2 комментария
  • Есть адекватная альтернатива Visual Studio?

    tomnolane
    @tomnolane
    профессиональный разработчик
    увы... (если про шарп)
    Ответ написан
    Комментировать
  • Как подделать HTTP_HOST?

    tomnolane
    @tomnolane
    профессиональный разработчик
    Ответ написан
    Комментировать
  • Как получить *.mdf файл из Access?

    tomnolane
    @tomnolane
    профессиональный разработчик
    добавляем в rerefences библиотеку из COM: Miscrosoft ADO Ext.6.0 for DLL and Security
    59dd1c9316f57094123256.png
    далее рабочий код:
    using System;
    using ADOX;
    using System.Data.OleDb;
    using System.Data;
    using System.IO;
    
    namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                CreateMdb("toster_ru.mdb");
                string fileNameWithPath = Environment.CurrentDirectory + "\\toster_ru.mdb";
    
                CreateTableInToMdb(fileNameWithPath);
                InsertToMdb(fileNameWithPath);
                UpdateToMdb(fileNameWithPath);
    
                var myDataTable = new DataTable();
                using (var conection = new OleDbConnection("Provider = Microsoft.JET.OLEDB.4.0;  Data Source = " + fileNameWithPath))
                {
                    conection.Open();
                    var query = "Select info From my_table";
                    var adapter = new OleDbDataAdapter(query, conection);
                    adapter.Fill(myDataTable); 
                    Console.WriteLine(myDataTable.Rows[0][0].ToString()); //output: toster2.ru
                    Console.ReadKey();
                }
            }
    
            static void CreateMdb(string fileNameWithPath)
            {
                if (File.Exists(fileNameWithPath))
                    return;
    
                Catalog cat = new Catalog();
                string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Engine Type=5";
                cat.Create(String.Format(connstr, fileNameWithPath));
                cat = null; 
            }
    
            static void InsertToMdb(string fileNameWithPath)
            {
                var con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileNameWithPath);
                var cmd = new OleDbCommand();
                cmd.Connection = con;
                cmd.CommandText = "insert into my_table (ID, [Info], [text])  values (@ID, @Info, @text);";
                cmd.Parameters.AddWithValue("@ID", 1);
                cmd.Parameters.AddWithValue("@Info", "toster.ru");
                cmd.Parameters.AddWithValue("@text", "blabla");
                con.Open(); 
                cmd.ExecuteNonQuery();
                con.Close();
            }
    
            static void UpdateToMdb(string fileNameWithPath)
            {
                var con = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileNameWithPath);
                var cmd = new OleDbCommand();
                cmd.Connection = con;
                cmd.CommandText = "UPDATE my_table SET [Info] = ?, [text] = ? WHERE ID = ?;";
                cmd.Parameters.AddWithValue("@p1", OleDbType.VarChar).Value = "toster2.ru";
                cmd.Parameters.AddWithValue("@p2", OleDbType.VarChar).Value = "blabla2";
                cmd.Parameters.AddWithValue("@p3", OleDbType.VarNumeric).Value = 1;
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
    
            static void CreateTableInToMdb(string fileNameWithPath)
            {
                try
                {
                    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + fileNameWithPath);
                    myConnection.Open();
                    OleDbCommand myCommand = new OleDbCommand();
                    myCommand.Connection = myConnection;
                    myCommand.CommandText = "CREATE TABLE my_table([ID] NUMBER, [Info] TEXT, [text] TEXT)";
                    myCommand.ExecuteNonQuery();
                    myCommand.Connection.Close();
                }
                catch { }
            }
        }
    }


    UPD
    MDF
    Ответ написан
  • Как сделать возвращение к началу программы?

    tomnolane
    @tomnolane
    профессиональный разработчик
    есть три варианта:
    1) использовать метку
    M:
    if (att == 1) {
    //или тут M:
    Console.WriteLine ("Вы использовали обычную атаку");
    Console.WriteLine ("Урон: " + attack);
    Console.WriteLine ("У врага осталось: " + (ehp - attack) + "хп");
    Console.WriteLine ("Враг вас убил, попробуйте еще раз")
    goto M; //(Здесь должен быть банальный рестарт программы.)
    }

    2) сделать функцию отдельно (рекурсию)
    private void MyFunc(bool stop = false;)
    {
    if(stop) return;
    if (att == 1) { 
    Console.WriteLine ("Вы использовали обычную атаку");
    Console.WriteLine ("Урон: " + attack);
    Console.WriteLine ("У врага осталось: " + (ehp - attack) + "хп");
    Console.WriteLine ("Враг вас убил, попробуйте еще раз")
    MyFunc(); //(Здесь должен быть банальный рестарт программы.)
    }
    }

    3) использовать цикл for (бесконечный)
    int damage = 100;
    for(;;)
    {
    if (att == 1) { 
    Console.WriteLine ("Вы использовали обычную атаку");
    Console.WriteLine ("Урон: " + attack);
    Console.WriteLine ("У врага осталось: " + (ehp - attack) + "хп");
    Console.WriteLine ("Враг вас убил, попробуйте еще раз") 
    }
    hp < damage  ? break : continue; //(Здесь должен быть банальный рестарт программы.)
    }


    upd
    На свой лад накидал в некоторых местах условия выхода из метода/цикла. Поскольку по вашему коду не понятно, в каком случае должно всё это прекратится, поэтому условие, когда всё должно закончится - сами подкорректируйте. Главное, выше три способа, полностью отвечают на ваш заданный вопрос.
    Ответ написан
    5 комментариев
  • Лучшие ресурсы по многопоточности в C#?

    tomnolane
    @tomnolane
    профессиональный разработчик
    быстрее всего будет на youtube чтобы понять основу:
    (очень понятно, по русски, наглядно и доходчиво)
    тык (часть 1)
    тык (часть 2)
    тык (часть 3)
    и т.д. ...
    когда освоите и поймете, юзайте книги
    Ответ написан
    Комментировать
  • Можно ли сделать так и на сколько это будет правильно???

    tomnolane
    @tomnolane
    профессиональный разработчик
    не думаю, что удачный вариант. я не создавал CMS'ки. Но пользовался в своё время wordpress и joomla (потом отказался от их использования).
    Объясняю почему не удачна мысль: у вас блок может иметь 5000 строк кода. Эта куча текстовой информации которая хранится в БД + проблема будет с SQL инъекциями, т.к. экранировать не получится вводные данные (либо слишком геморройно всё это добавить).
    Может проще - в БД хранить (условно) id блока. Например, если выбран id = 1, то в Landing Page загружается файл example.php с этим кодом. Если id = 2, то example2.php. А непосредственно править нужно в самом php файле... вроде так работают большинство CMS.... не думаю, что есть вариант получше...

    html код нужно хранить в файлах, не в БД
    Ответ написан
    5 комментариев
  • Как можно получить список у кого я в бане в вк?

    tomnolane
    @tomnolane
    профессиональный разработчик
    увы...
    либо использовать это. в fields использовать blacklisted, blacklisted_by_me
    но это "костыль".
    Ответ написан