almaria's Friends
 
[Most Recent Entries] [Calendar View] [Friends View]

Below are the most recent 25 friends' journal entries.

    [ << Previous 25 ]
    Thursday, October 17th, 2019
    hex_laden
    12:25a
    C# Всплывающая форма над областью уведомлений, над NotifyIcon
    Спрашивают, как можно сделать всплывающую форму над областью уведомлений, там где "часики" и иконки запущенных в фоне программ. Ну типа как это делается в мессенджерах при получении нового сообщения.

    Вот, нашел вам готовый код. Выглядит вполне симпатично.



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

    Потом расскажу, как самому сделать что-то подобное, пусть и не такое симпатичное.

    Исходный код


    У автора
    У меня

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/16/c-vsplyvayushhaya-forma-nad-oblastyu-uvedomlenij-nad-notifyicon/
    Wednesday, October 16th, 2019
    hex_laden
    11:05p
    Фразочка
    Выбросил в фукуяму.

    Блин, жалко Лейбов свой генератор заголовков не поддерживает, неплохо бы смотрелось что-то типа: "В ходе зачистки аула Херсов-Мурда лидер Антимиайдана Залдостанов выбросил в фукуяму народного мэра Луганска"

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/16/frazochka-31/
    hex_laden
    10:16p
    C#, скрыть (убрать) курсор (каретку) из TextBox
    Чтоб два раза не вставать, начну сразу с нескольких простейших манипуляций с курсором из TextBox.

    Снятие выделения и управление местоположением курсора (каретки)


    Иногда текст в многострочном TextBox'е автоматически выделяется.



    И это выделение обычно не нужно. Благо снять его легко, достаточно переместить курсор.

    Установка курсора в начало или конец текста


    Для установки курсора в начало текста устанавливаем свойство SelectionStart в 0. Т.е. устанавливаем курсор перед первым символом текста:

    //ставим курсор в начало текста
    txtSampleText.SelectionStart = 0;


    Установить курсор в конец текста тоже проблем не представляет:

    //ставим курсор в конец текста
    txtSampleText.SelectionStart = txtSampleText.Text.Length;


    Выделение исчезнет, а курсор будет в начале или конце текста.

    Скрытие курсора переводом фокуса


    Для того, чтобы визуально скрыть текстовый курсор в TextBox, можно перевести фокус на другой объект формы. Например, далее переведем фокус на кнопку btnClose, находящуюся рядом с TextBox:



    //убираем курсор (сменой фокуса на другой элемент формы)
    btnClose.Select();


    Но смена фокуса иногда влечет за собой нежелательные последствия, например текст нельзя будет прокручивать колесиком мышки. Если нужно, чтобы фокус оставался в TextBox, а каретка (текстовый курсор) не отображалась, стоит воспользоваться WinAPI.

    Использование WinAPI для скрытия текстового курсора (каретки)


    Сначала экспортируем WinAPI функцию:

    public frmHideCaret()
    {
        InitializeComponent();
    }
    
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool HideCaret(IntPtr hWnd);
    
    //...


    Потом вызываем ее в обработчике события Shown (если вызвать, например в Load не сработает, надо чтобы форма появилась):

    private void frmHideCaret_Shown(object sender, EventArgs e)
    {
        HideCaret(txtSampleText.Handle);
    }


    Весь пример на GitHub


    Смотреть в репозитарии

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/16/c-skryt-ubrat-kursor-karetku-iz-textbox/
    hex_laden
    8:53p
    C#. Удаление HTML-тегов из текста.
    Т.е. остается только текст между тегами, например из:
    <b>жирный текст</b> <a href="http://example.org">Это ссылка куда-то</a>
    должно получиться
    жирный текст Это ссылка куда-то

    Регулярное выражение для HTML-тега


    По счастью, оно совсем простое:

    <[^>]+>

    Пример


    Не забываем подключить соответствующее пространство имен:
    using System.Text.RegularExpressions;
    //...
    string htmlText = "<html><head><title>tolik-punkoff.com</title></head> <body>Welcome to Tolik Punkoff blog!</body></html>";
    OutputText = Regex.Replace(htmlText, "<[^>]+>", string.Empty);

    //Содержимое OutputText:
    //tolik-punkoff.com Welcome to Tolik Punkoff blog!


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

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/14/c-udalenie-html-tegov-iz-teksta/
    Monday, October 14th, 2019
    hex_laden
    2:32a
    Завтра в школу не пойдем.
    Ну такое, о глобальных потепляторах...



    https://www.youtube.com/watch?v=6r6J7IqOlks

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/11/zavtra-v-shkolu-ne-pojdem/
    Friday, October 11th, 2019
    hex_laden
    2:40a
    Замечательные опечатки
    Квантовый Скачек

    Прямо какой-то чех Шредингера, то ли чех, то ли словак.

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/06/zamechatelnye-opechatki-7/
    Sunday, October 6th, 2019
    hex_laden
    8:38p
    Просмотр изображений под DOS, видеообзор


    https://youtu.be/zSxVOH1rt3k

    Просмотровщик
    Тестовые файлы

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/05/prosmotr-izobrazhenij-pod-dos-videoobzor/
    Saturday, October 5th, 2019
    hex_laden
    3:18a
    EEE PC 2G SURF драйвера и программы


    Принесли тут в починку (причем уже второй) такой вот недобук. Убил полдня на него, пришлось делать отдельный дистрибутив XP, из которого было выкинуто почти все лишнее, чтоб влез.

    А вот архив для него с родными дровами, софтом и всем прочим. На всякий случай, мало ли кому надо будет.

    Скачать с mega.nz

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/04/eee-pc-2g-surf-drajvera-i-programmy/
    Friday, October 4th, 2019
    hex_laden
    4:33a
    PRESS Неизвестный уральский архиватор.
    Разгребая старые архивы обнаружил неизвестный архиватор производства СКБ "Контур", г. Екатеринбург. Написано, что 1995 года. Довольно продвинутый для того времени (RAR, насколько понимаю, тогда еще не существовал). Неплохо сжимает, во всяком случае тот же RAR не смог (на максимуме) сжать архивы PRESS (с расширением .PRS) с каким-либо выигрышем.

    Умеет в многотомность, сжатие с подкаталогами, можно включить псевдографический интерфейс (правда, управление все равно с командной строки).

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

    Единственное что, расковыривание формата задача скорее не для меня, а для [info]ketmar, но может когда-нибудь и расковыряю.

    Впрочем, кому интересно, может поковыряться сам:

    Примеры архивов PRS
    Архиватор
    Файлы, добавленные в архивы

    Архивы сделаны в двух экземплярах: с обычной и максимальной (имя архива заканчивается на m) степенью сжатия.

    Содержимое архивов:

    VIM-LNT.PRS, VIM-LNTM.PRS - "Война и мир" в TXT в UTF-8
    SMALL-EN.PRS, SMALLENM.PRS - текстовый файл с английским алфавитом строчными буквами (одна строка).
    ENX10.PRS, ENX10M.PRS - английский алфавит повторенный 10 раз (10 строк)
    ALLFILEM.PRS, ALLFILES.PRS - все из предыдущих архивов + несколько картинок в разных форматах.

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/03/press-neizvestnyj-uralskij-arhivator/
    Thursday, October 3rd, 2019
    hex_laden
    11:40p
    Делаем свое расширение для Firefox. Содержание.
    Делаем свое расширение для Firefox. Часть I. В которой мы все подготавливаем.
    Делаем свое расширение для Firefox. Часть II. В которой работаем с пользовательскими настройками аддона.
    Делаем свое расширение для Firefox. Часть III. Работа с запросами.
    Делаем свое расширение для Firefox. Часть IV. Background, сборка, публикация.

    Копия на lj.rossia.org:

    Делаем свое расширение для Firefox. Часть I. В которой мы все подготавливаем.
    Делаем свое расширение для Firefox. Часть II. В которой работаем с пользовательскими настройками аддона.
    Делаем свое расширение для Firefox. Часть III. Работа с запросами.
    Делаем свое расширение для Firefox. Часть IV. Background, сборка, публикация.

    Страничка расширения на tolik-punkoff.com
    Страничка расширения на lj.rossia.org

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/02/delaem-svoe-rasshirenie-dlya-firefox-soderzhanie/
    hex_laden
    12:02a
    External IP Geo IP
    Это небольшое расширение к браузеру Firefox, который находится в виде кнопки на панели браузера и показывает вам флаг страны, согласно вашему внешнему IP-адресу, т.е. ваше географическое положение, определенное по IP.

    Для определения страны, к которой принадлежит IP, расширение по умолчанию обращается к сервису https://api.myip.com, однако предусмотрена возможность обращения и к другим сервисам, главное чтоб формат данных был таким же, как и у https://api.myip.com. В исходниках проекта есть PHP-скрипт, который можно разместить на любом хостинге, поддерживающем PHP, а во всплывающей панели расширения можно поменять адрес, который расширение будет опрашивать.

    Скриншоты





    Кнопка на панели браузера



    Отображение IP и дополнительной информации


    Получение IP-адреса


    Реакция на ошибку сети


    Страница расширения на mozilla.org


    https://addons.mozilla.org/ru/firefox/addon/external-ip-geoip/

    Исходники и дополнительные материалы


    Репозиторий на GitHub
    PHP-скрипт для своего сайта
    Скачать расширение с GitHub

    Статья о том, как расширение было написано


    На tolik-punkoff.com
    На lj.rossia.org

    В PDF с Mega.nz
    В PDF с Google.Drive

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/external-ip-geo-ip/
    Wednesday, October 2nd, 2019
    hex_laden
    10:46p
    Делаем свое расширение для Firefox. Часть IV. Background, сборка, публикация.
    Делаем background


    Теперь делаем специальный модуль ip_background.js, который будет выполнять всю работу нашего аддона, во время работы браузера.

    Создаем файл ip_background.js и копируем из файла ip_popup.js все содержимое, кроме строк с addEventListener, т.к. слушатели событий в background будут другие. Функцию doRequest пока оставим в покое, ей займемся чуть позже.

    Из функции onGot(item) удаляем строку document.getElementById("script").value = curAddr;, т.к. никаких текстовых полей в бэкграунде нет и не предвидится, менять элементы нам тут не надо.

    Еще я переименовал функцию bodyLoad в listinerRun, она у нас будет одна, на все три обрабатываемых события.

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

    Так, начало положена, у нас есть "болванка" нашего background-скрипта, сохраняем ее и модифицируем manifest.json

    Модификация manifest.json


    В manifest.json следует добавить секцию "background", где перечислить в массиве "scripts" скрипты, запускаемые браузером во время работы нашего расширения. Понадобятся два скрипта, собственно ip_background.js и библиотека JQuery jquery-3.4.1.min.js:

    "background": {
        "scripts": [
          "jquery-3.4.1.min.js",
          "ip_background.js"
        ]
      }


    Новый manifest.json на PasteBin

    Далее под катом )

    Дополнительно


    Внешний скрипт на PHP, который можно использовать, как замену api.myip.com (копия)
    На GitHub

    Скачать


    Страница дополнения на mozilla.org
    Исходники на GitHub
    Скачать подписанный xpi с GitHub
    Этот мануал в PDF + весь код в одном архиве:
    С Mega.nz
    С Google.Drive

    Предыдущая часть
    Содержание

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/02/delaem-svoe-rasshirenie-dlya-firefox-chast-iv-background-sborka-publikatsiya/
    hex_laden
    10:41p
    Делаем свое расширение для Firefox. Часть III. Работа с запросами.
    Работа с запросами


    До того, как мы будем выполнять запросы к внешним ресурсам, надо внести изменения в manifest.json, дав соответствующее разрешение "<all_urls>" в permissions.
    Все разрешения для нашего аддона:

    "permissions": [
        "activeTab",
        "tabs",
        "storage",
        "<all_urls>"
      ]


    Внимание! Если разрешение "<all_urls>" не дать, то при попытке обращения к внешнему ресурсу произойдет ошибка:

    Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на https://api.myip.com/. (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).

    Почему-то ссылка на пояснение к ошибке на сайте Мозиллы ведет не совсем на то, что нужно, а в поиске, тоже неизвестно почему, информация о том, что нужно просто дать разрешение "<all_urls>" в manifest.json не всплывает. Сам еле догадался, практически методом научного тыка устранил данный глюк.

    Небольшое отступление от программирования


    После долгого ковыряния в отладке и интернете я решил немного отдохнуть, и дополнить дизайн расширения.

    Фактически, у запроса есть три состояния:

    - запрос выполняется
    - запрос выполнен успешно
    - запрос завершен с ошибкой

    Обо всем этом можно и нужно сообщать пользователю, и симпатичнее всего это сделать, меняя иконку. Нарисовал и сохранил в каталог flags.

    - запрос выполняется (1working.png)



    - запрос завершен с ошибкой (2error.png)



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

    - страна неизвестна (3unknow.png)



    Подключение JQuery


    GET-запрос к сайту оказалось проще всего сделать с помощью библиотеки JQuery.
    Скачиваем библиотеку и сохраняем ее в каталог с ip_popup.html. В самом ip_popup.html подключаем ее (перед скриптом ip_popup.js):

    <script src="jquery-3.4.1.min.js"></script>

    Далее под катом )

    Предыдущая часть
    Продолжение

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/02/delaem-svoe-rasshirenie-dlya-firefox-chast-iii-rabota-s-zaprosami/
    hex_laden
    10:34p
    Делаем свое расширение для Firefox. Часть II. В которой работаем с пользовательскими настройками адд
    Сохранение настроек


    function saveSettings()
    {
    	var scriptAddr = document.getElementById("script").value;
    	scriptAddr = scriptAddr.trim();
    	
    	if (scriptAddr != "")
    	{
    		if (window.confirm('Save script address ' + 
                        scriptAddr + '? Are you sure?'))
    		{
    			browser.storage.local.set({
    				server_settings: {script_addr: scriptAddr}
    			});
    			window.alert('Settings saved!');
    		}
    		else
    		{
    			document.getElementById("script").value = curAddr;
    		}
    	}
    }


    Что тут делается:

    1. Сначала в переменную scriptAddr записывается значение текстового поля с id=script, т.е. того поля, куда можно ввести адрес скрипта.
    2. Функцией trim() обрезаем начальные и конечные пробелы, вдруг их пользователь навводит.
    3. Если scriptAddr не пустая строка, то запрашиваем у пользователя подтверждение сохранения функцией window.confirm() Функция выведет на экран окошко с текстом, заданным в качестве ее аргумента и кнопками "Да" и "Нет". Если нажата "Да", функция вернет true, если "Нет" - false.



    Подробности: "Взаимодействие: alert, prompt, confirm"

    4. Если отвечено да, то пользуемся API Firefox'а, а именно функцией browser.storage.local.set(object), которой, в данном случае, передается объект, содержащий объект server_settings, содержащий единственный параметр script_addr. Значение script_addr устанавливаем из переменной scriptAddr. Далее сообщаем пользователю, что настройки сохранены (window.alert('Settings saved!');)

    Подробности и примеры работы с локальным хранилищем: StorageArea.get()

    5. Если было отвечено "Нет", то восстанавливаем значение текстового поля:

    document.getElementById("script").value = curAddr;

    В конце js-файла, после всех функций, подключаем обработчик события (слушатель) для события "click" кнопки с id == save:

    document.getElementById("save").addEventListener("click", saveSettings);

    Внимание! Функции addEventListener имя функции-обработчика передается без круглых скобок

    document.getElementById("save").addEventListener("click", saveSettings()); //неправильно

    Если добавить скобки, то код функции saveSettings просто однократно выполнится, когда дойдет очередь до addEventListener

    Да, ошибка детская, но искать потом концы довольно муторно.

    Далее под катом )

    Начало
    Продолжение

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/02/delaem-svoe-rasshirenie-dlya-firefox-chast-ii-v-kotoroj-rabotaem-s-polzovatelskimi-nastrojkami-addona/
    hex_laden
    10:27p
    Делаем свое расширение для Firefox. Часть I. В которой мы все подготавливаем.
    Преамбула


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

    IP и страну будем получать с https://api.myip.com/, который выдает нужную информацию в виде JSON:

    {"ip":"162.247.73.193","country":"United States","cc":"US"}


    Подготовка структуры каталогов.


    Создадим где-нибудь в удобном месте каталог, например, deoip, он будет корневым каталогом нашего плагина, а в нем 2 подкаталога icons и flags

    Иконки и флаги стран.


    Плагину требуется как минимум одна иконка 48x48 для отображения в менеджере дополнений, и желательна еще одна 96x96 пикселей. В Мозиловском примере говорится, что можно сделать иконку в формате SVG, но я не стал экспериментировать и сделал две PNG-шки.



    Флаги стран, которые будут отображаться на кнопке панели, должны иметь размер 32x32 пикселя, а имена файлов соответствовать двухбуквенному ISO-коду страны. Я использовал готовые иконки из коллекций плюс еще одну иконку по умолчанию (0none.png).



    manifest.json


    manifest.json - это главный файл расширения, содержащий основные опции плагина.

    Пока он выглядит так:

    {
      "manifest_version": 2,
      "name": "External IP GeoIP",
      "description": "Display you external IP and IP country",
      "version": "0.0.1",
      "icons": {
        "48": "icons/48.png",
        "96": "icons/96.png"
      },
      "browser_action": {
        "default_icon": "flags/0none.png",
        "default_title": "External IP GeoIP"
      },
      "permissions": [
        "activeTab",
        "tabs",
        "storage"
      ]
    }


    Сначала идут обязательные опции manifest_version и name - имя расширения, далее дополнительные, но желательные description и version, соответственно, краткое описание и версия. В секции icons указываются пути к иконкам для менеджера дополнений (все пути должны быть относительными, относительно, собственно manifest.json). В секции browser_action описывается кнопка на панели браузера и привязанные к ней действия, пока действий у нас никаких (потом добавим выплывающее меню), а задача просто отобразить кнопку на панели. Поэтому добавляем опцию default_icon - путь к иконке по умолчанию, и всплывающую подсказку default_title (появится, если к кнопке подвести указатель мыши).
    Далее интересная секция permissions. Это разрешения для нашего плагина. Я уже примерно прикинул какие разрешения нам понадобятся: доступ к вкладкам (tabs), к активной вкладке (activeTab) и хранилищу, которое используется для сохранения настроек плагина (storage).

    Подготовка Firefox к тестированию плагина


    Особая подготовка не требуется, но я рекомендую все-таки сделать отдельный пустой тестовый профиль. Набираем в адресной строке about:profiles, жмем Enter, попадаем на страницу профилей, создаем отдельный профиль test и жмем "Запустить еще один браузер с этим профилем"

    Первый запуск


    В браузере с новым профилем набираем в адресной строке about:debugging, слева выбираем "Этот Firefox", и жмем кнопку "Загрузить временное дополнение" и выбираем наш manifest.json. Теперь идем в меню "Инструменты --> Дополнения" или набираем в адресной строке about:addons, и если все сделано правильно, то видим наше дополнение в списке дополнений, а если откроем просто пустую вкладку, то увидим и кнопку.




    Делаем всплывающую панель )

    Продолжение

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/10/02/delaem-svoe-rasshirenie-dlya-firefox-chast-i-v-kotoroj-my-vse-podgotavlivaem/
    hex_laden
    3:42a
    Скрипт, выдающий страну и внешний IP в JSON-формате
    Скрипт выдает IP, страну и ISO-код страны в формате JSON, как https://api.myip.com.

    Скрипту требуется два внешних файла (должны лежать в каталоге со скриптом): БД SxGeoCountry (SxGeo.dat) и iso.csv

    Посмотреть, как работает
    Исходники на GitHub

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/26/skript-vydayushhij-stranu-i-vneshnij-ip-v-json-formate/
    Thursday, September 26th, 2019
    hex_laden
    11:47p
    Каганов грибами хвастается.
    Я, пожалуй, тоже похвастаюсь. Метров 300 от дома отошел, почти в городе.



    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/26/kaganov-gribami-hvastaetsya/
    hex_laden
    11:02p
    Коллекции значков. Флаги всех стран.
    Коллекция #1


    Коллекция флагов стран в двух исполнениях
    Flat - обычные плоские значки и Shiny - слегка выпуклые, с отблеском

    Разрешения:
    -16x16
    -24x24
    -32x32
    -48x48
    -64x64

    Форматы:
    -PNG
    -ICO
    -ICNS

    Наименования отдельно:
    -По названию страны
    -По коду ISO

    Дополнительно:
    Есть флаги некоторых непризнанных республик и международных организаций.

    Скачать с Mega.nz
    Скачать с Google.Drive

    Коллекция #2


    Иконки плоские

    Разрешения:
    -32x32
    -128x128

    Форматы:
    -PNG

    Наименования:
    -По коду ISO

    Скачать с Mega.nz
    Скачать c Google.Drive

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/23/kollektsii-znachkov-flagi-vseh-stran/
    Monday, September 23rd, 2019
    hex_laden
    1:33a
    Calyx.net. Еще один бесплатный VPN


    На этот раз от некоей научной конторы Calyx Institute, изначально заточенный под использование клиента Bitmask, но ключи и сертификаты также можно выкачать скриптом из предыдущей заметки (копия)

    Конфиг


    На PasteBin

    Архив с конфигом и сертификатами


    На Mega.nz
    На Google.Drive

    Ссылки


    Calyx.net
    Calyx Institute

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/22/calyx-net-eshhe-odin-besplatnyj-vpn/
    Sunday, September 22nd, 2019
    hex_laden
    5:18a
    Скрипт для обновления ключей для VPN RiseupVPN без Bitmask и клиента Riseup
    Преамбула


    Единственная проблема, которая возникает с Riseup VPN - пользовательские ключи периодически протухают (они обновляются примерно раз в 3-4 месяца). Уж не знаю, для чего это сделано, но факт остается фактом. Клиент Bitmask, понятно что, обновляет ключи автоматом, но работает только на астероиде с конкретным давлением и гравитацией. А нам такое не надо.

    Сам клиент Bitmask на самом деле реализует SRP-авторизацию для последующего получения пользовательского сертификата VPN, однако, админ сервера может выдавать и анонимный ключ, без использования авторизации. С riseup.net несказанно повезло, что гайдам от разработчиков Bitmask, они все-таки (пока) последовали не до конца, и спокойно выдают ключ без авторизации и регистрации.

    Так что Bonafide можно реализовать частично, опустив шаги регистрации пользователя и всю работу с SRP-авторизацией. Соответственно, остальное без проблем делается с помощью средств shell/bash и нескольких дополнительных утилит.

    Ремарка про сам Bitmask


    Такое ощущение, что проект медленно дохнет. Из 4 провайдеров, работающих через клиент Bitmask, осталось только два: Riseup, который даже сделал свой отдельный клиент по образу и подобию, и calyx.net, не очень понятный проект от какой-то мелкой американской научной конторы https://www.calyxinstitute.org/, впрочем, тоже предоставляющий бесплатный VPN. А вот колумбийский VPN (всегда мечтал попробовать что-нибудь колумбийское) и единственный платный Codigosur сдохли. И самое печальное, что сдох демо-сервер от самого Bitmask. Который позволялось использовать для отладки своих клиентов под Bitmask-протокол.

    Немного про алгоритм скрипта


    1. Нам необходимо выкачать из корня сайта провайдера файл provider.json. Там содержится основная информация о провайдере.
    2. Далее вытаскиваем из provider.json "api_uri" и "api_version". Два этих значения (api_uri + api_version) составляют API_BASE, т.е., например, для Calyx "api_uri": "https://api.calyx.net:4430" и "api_version": "1", соответственно API_BASE будет https://api.calyx.net:4430/1
    3. Выгружаем себе корневой сертификат провайдера (самоподписанный) из "ca_cert_uri" (для Calyx будет https://calyx.net/ca.crt)
    4. Получаем его fingerprint из "ca_cert_fingerprint". Отпечаток сертификата SHA256 (у всех двух виденных именно такой)
    5. Считаем отпечаток скачанного сертификата с помощью openssl:

    openssl x509 -in $WORKDIR"/"$CACRTFILE -noout -fingerprint -sha256 -inform pem

    - делаем необходимые строковые преобразования:

    openssl x509 -in $WORKDIR"/"$CACRTFILE -noout -fingerprint -sha256 -inform pem|awk -F = '{print tolower($2)}'|tr -d ':'

    и сравниваем то, что получили из сертификата с прочитанным из provider.json должно совпадать.

    6. Теоретически, с этого момента вся работа с дальнейшим API должна вестись с этим сертификатом, но для простоты можно все запросы делать curl с параметром --insecure.

    7. Можно выкачать список конфигов сервиса, оформив GET-запрос на адрес API_BASE/configs.json. Список выглядит примерно так:

    {
      "services":{
        "soledad":"/1/configs/soledad-service.json",
        "eip":"/1/configs/eip-service.json",
        "smtp":"/1/configs/smtp-service.json"
      }
    }


    8. На самом деле из интересного здесь только параметр "eip", это ссылка на конфиги VPN. Обычно перечисляются сервера и какие-то критичные параметры конфига. Так, например, выглядит текущий eip-service.json для Riseup:

    На PasteBin

    9. Теперь пора получать пользовательский сертификат (и ключ), который будет использоваться для авторизации в VPN, и для этого вообще-то надо логиниться по SRP, но два оставшихся провайдера - Riseup и Calyx, позволяют запрос сделать так.

    Делаем POST-запрос (пустой) к API_BASE/cert.

    10. Сохраняем результат.

    Для парсинга JSON из консоли используется jq, установите для своего дистрибутива, если у вас еще нет.

    Параметры запуска скрипта


    Use bminfo <-p> <provider> [KEYS]

    Обязательных параметра 2 - первый ключ (-p) и провайдер VPN (riseup.net, например).

    Остальные параметры ([KEYS]):

    --getinfo - получить только provider.json
    --clear - очистить рабочий каталог
    --getconfigs - получить provider.json, configs.json и eip config
    --providerkey - получить корневой сертификат провайдера VPN (cacert.pem)
    --userkey - получить сертификат пользователя (openvpn.pem)
    --copy - скопировать сертификаты и файлы json в каталог из $OUTDIR/<provider>
    --check - скопировать только файлы, которые были изменены

    Можно использовать в сочетании друг с другом все ключи, кроме --clear.

    Примеры:
    Получение всей информации и всех ключей

    bminfo -p calyx.net --getconfigs --providerkey --userkey

    Получение только пользовательского ключа:

    bminfo -p calyx.net --userkey

    Код скрипта


    На GitHub

    Полезные ссылки


    riseup.net
    SRP-6: аутентификация без передачи пароля
    Bonafide. Secure user registration, authentication, and provider discovery.

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/22/skript-dlya-obnovleniya-klyuchej-dlya-vpn-riseupvpn-bez-bitmask-i-klienta-riseup/
    hex_laden
    3:38a
    Бесплатный VPN RiseupVPN, обновление.
    Новости


    Новости, правда, не первой свежести, но все же. О бесплатном анархо-VPN от riseup.net мы писали ранее копия.

    С тех пор многое поменялось.

    + Клиент для Windows. Да, пользователи 7 и 10 Windows могут радоваться. Никакого шаманства, настроек и ужасов. Скачал клиент и пользуйся. Клиент, на самом деле, форк проекта Bitmask, все настраивает сам, скачивает необходимые ключи, запускает Openvpn, которую даже скачивать отдельно не надо, обрезанная версия идет в комплекте и ставится вместе с клиентом. Регистрация тоже не нужна.




    Британия вместо Франции потому что я себе БД SxGeo не обновил, у них там в связи с брекзитом черт ногу сломит


    + Добавилось серверов. Кроме старых голландского, канадского и штатовского сервера добавились 4 французских, еще один штатовский и гонконгский.

    В общем, проект живет и развивается, здоровья ребятам и творческих успехов.

    - На момент написания заметки голландский сервер что-то глючил. Соединение есть, а толку нет (да, я перепроверил конфиги и настройки раз 10 - остальные работают, этот соединяется, но ни бе ни ме ни кукареку). И да, он взял и сменил IP
    - Опять обидели пользователей других дистрибутивов линукс. RiseupVPN is currently tested on the Ubuntu LTS and Debian Stable. If you have a different release, it may or may not work. Хотя, может и не обидели. Поскольку у "клиента" внутри один хрен неонка OpenVPN, то главное - написать правильные конфиги и скачать ключи, благо качаются они без всякого геморроя, в следующей заметке будет скрипт по выкачиванию и обновлению сертификатов.
    - Немного сменились конфиги. Дело поправимое.
    - У пользователей официального клиента нет возможности выбора конкретного сервера. А алгоритм выбора сервера от OpenVPN оставляет желать лучшего (ИМХО, его там нет вообще).

    Конфигурационные файлы для OpenVPN


    На mega.nz
    На Google.Drive

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/19/besplatnyj-vpn-riseupvpn-obnovlenie/
    Thursday, September 19th, 2019
    hex_laden
    11:46p
    Калькулятор пропорций
    Писал вместе со знакомым школьником, и для его же задания по информатике. А ведь сам давно хотел подобную программу, ибо пропорции последнее время приходится считать часто (химия и проценты всяческие), а с арифметикой я абсолютно не дружу, то и подвигло к освоению компьютера - ему объяснил, как считать, и самому можно не заморачиваться.

    Особо каких-то отдельных вещей в программе нет (ввод чисел в TextBox объяснял ранее). Но тем не менее, может еще кому пригодится.

    Скриншоты




    +3 )

    Исходники


    Репозиторий на GitHub

    Скачать


    Готовую программу
    Установщик

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/18/kalkulyator-proportsij/
    Wednesday, September 18th, 2019
    hex_laden
    3:19a
    C# Ввод отрицательных чисел в TextBox
    Преамбула


    Продолжаем разговор о вводе чисел в TextBox. Сегодня будем вводить отрицательные числа, тобишь к числу (точнее строке) надо будет пририсовывать знак "минус".

    Главное


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

    Позицию курсора можно вытащить из свойства TextBox.SelectionStart, посему сохраним его перед началом всех действий с текстом в отдельную переменную:

    int pos = txt.SelectionStart;

    Теперь можно вводить знак числа.

    Ввод знака числа


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

    //ввод минуса
    if (e.KeyChar == '-')
    {                
        if (txt.Text.StartsWith("-"))
        {
            txt.Text = txt.Text.Substring(1);
            txt.SelectionStart = pos - 1;
        }
        else
        {
            txt.Text = "-" + txt.Text;
            txt.SelectionStart = pos + 1;
        }
    
        e.Handled = true;
        return;
    }


    Дополнительно. Добавление лидирующего ноля.


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

    //ввод точки (запятой)
    if ((txt.Text.StartsWith(".")) || (txt.Text.StartsWith(",")))
    {
        // добавление лидирующего ноля
        txt.Text = "0" + txt.Text;
        txt.SelectionStart = pos + 1;
    }
    
    if ((e.KeyChar == '.') || (e.KeyChar == ','))
    {                
        if (txt.Text.Contains(".") || txt.Text.Contains(","))
        {
            e.Handled = true;
            return;
        }                
    
        return;
    }


    Вся функция целиком


    На PasteBin

    Дополнительно


    1. Ввод в текстовое поле только цифр Копия
    2. Ввод дробных чисел в текстовое поле Копия

    Общий пример для всех заметок


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

    На GitHub

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/18/c-vvod-otritsatelnyh-chisel-v-textbox/
    hex_laden
    1:55a
    Устранение глюка с find
    Преамбула


    Оказалось, в моей функции create_list() копия был обнаружен малозаметный и посему дико поганый баг. А баг был с командой find. Например, если запустить ее в любом каталоге с параметрами

    find /home/smallwolfie/openvpn/configs -maxdepth 1 -iname *.ovpn, то она найдет все файлы *.ovpn

    Но вот если команду запустить в каталоге с файлами (/home/smallwolfie/openvpn/configs), то она упадет:

    cd /home/smallwolfie/openvpn/configs
    find /home/smallwolfie/openvpn/configs -maxdepth 1 -iname *.ovpn


    Вывод:

    find: paths must precede expression: riseup-nl.ovpn
    Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]


    Решение


    Заключить маску файла в кавычки:

    find /home/smallwolfie/openvpn/configs -maxdepth 1 -iname "*.ovpn"

    Вывод:

    /home/smallwolfie/openvpn/configs/vpnbook-pl226-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-de4-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-us1-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-us2-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-ca222-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-ca198-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-fr1-tcp80.ovpn
    /home/smallwolfie/openvpn/configs/riseup-ca.ovpn
    /home/smallwolfie/openvpn/configs/riseup-nl.ovpn
    /home/smallwolfie/openvpn/configs/riseup-us.ovpn
    /home/smallwolfie/openvpn/configs/vpnbook-fr8-tcp80.ovpn


    Обновленная функция целиком


    Пример из файла скрипта для соединения с определенным VPN-сервером

    create_list() #$1 - dir, $2 - file mask
    {
        FOUNDLST=""
        echo "Find in $1"
        for FLE in $(find $1 -maxdepth 1 -iname "$2"|sort); do
    	if [ -n "$FLE" ]; then
    	    FOUNDLST="$FOUNDLST"`basename $FLE`"\n"
    	fi
        done
    }


    Обновленный скрипт


    На GitHub

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/17/ustranenie-glyuka-s-find/
    Tuesday, September 17th, 2019
    hex_laden
    2:21a
    C#. Ввод в TextBox чисел с дробной частью.
    Т.е. нам необходимо ограничить ввод в текстовое поле (TextBox) только цифрами и одной точкой (и/или одной запятой). Далее пример кода (обработчика событий KeyPress), который позволяет вводить цифры и одну точку (или одну запятую).

    private void txt_KeyPress(object sender, KeyPressEventArgs e)
    {
        //ввод только цифр с одной точкой (запятой)
        if ((e.KeyChar == '.') || (e.KeyChar == ','))
        {
            TextBox txt = (TextBox)sender;
            if (txt.Text.Contains(".") || txt.Text.Contains(","))
            {
                e.Handled = true;
            }
            return;
        }
    
        if (!(Char.IsDigit(e.KeyChar)))
        {
            if ((e.KeyChar != (char)Keys.Back))
            {
                e.Handled = true;
            }
        }
    }


    На PasteBin

    Дополнительно


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

    using System.Globalization;
    //...
    
    public static double ToDouble(string Number)
    {
        Number = Number.Replace(',', '.');
        NumberFormatInfo format = new NumberFormatInfo();
        format.NumberDecimalSeparator = ".";
        return Convert.ToDouble(Number, format);
    }


    На PasteBin

    Класс Convert, к сожалению, зависит от языковых настроек системы, и если в качестве разделителя дробной и целой части в системе указана запятая, а в числе будет точка (или наоборот), то Convert.ToDouble(<число>) свалится с ошибкой.

    Всех сопричастных с Днем программиста (и с Пятницей 13)!

    Это репост с сайта http://tolik-punkoff.com
    Оригинал: http://tolik-punkoff.com/2019/09/13/c-vvod-v-textbox-chisel-s-drobnoj-chastyu/
    [ << Previous 25 ]
About LJ.Rossia.org