Позвоночник — судья, выносящий решения по звонку сверху.
Анекдот
Бабушка спрашивает внука: «а как на русский переводится BDSM?»
Внук, немного подумав: «Ебать-колотить!»
Из комментов.
Даешь рубилом по айфонам,
По сотовым всем телефонам,
По куаркодам и те де…
По крысе, что сидит в Кремле!
LGBT-флаг в SVG (Inkscape)
Приснилось. Почти вархаммерское.

Впрочем, нечто похожее приглючилось однажды под веществами, так что, можно сказать, во сне меня посетил эдакий флэшбэк, только несколько более подробный, чем сам глюк.
Меня похитили инопланетяне, впрочем, самих инопланетян я не видел, т.к. находился в изолированном помещении, насколько понимаю, тому ще у них другая атмосфера, непригодная для дыхания землян. Существа, которые называют себя Варкаранаи, оказались сверхцивилизацией, ведущей «оперативную деятельность и военные операции» сразу в нескольких галактиках, в т.ч. и в нашей.
Варкаранаи предложили, впрочем, без особого нажима или угроз (страшно мне вообще не было, наоборот, очень спокойно, как будто к лучшему другу на днюху попал), принять клятву верности и присоединиться к ним. На мой невысказанный вопрос, а нахрена им землянин, который вообще нихрена не на их уровне развития, был получен ответ, что хоть их корабли и управляются искусственным интеллектом метапорядка, но для контроля и принятия окончательных решений, нужно органическое существо с естественным интеллектом. Я согласился стать Варкаранай-Контрактором.
Следующий кадр.
На меня нахлынула какая-то дикая гамма чувств, ярость, любовь, желание убивать и одновременно защищать. Я клялся в верности неведомым Варкаранаям, а также вообще чему-то большему, прочувствовал великое доверие, оказанное мне, и что такое Честь Варкаранай-Контракторв. Как выяснилось, я даже расплакался во сне, а потом меня будто бы нежно обняли, успокоили и обнадежили. И пообещали корабль.
Следующий кадр.
Мне дали довольно небольшой, по их меркам, корабль. Размером, примерно, с Санкт-Петербург. Из живых существ я на нем вообще был один, других членов экипажа не было, тем не менее, я будто бы чувствовал каждый прибор, каждый механизм корабля, и знал, как всем \этим управлять, причем, так кайфово было, что вообще описать сложно.
А потом я вышел в открытый космос, в скафандре, мягком и удобном изнутри. Отчетливо видел фал, удерживающий меня у корабля. Правда, система безопасности ругалась на то, что я выхожу в космос в опасном месте. Впрочем, как я понимаю, если далеко не улетать, то можно и поплавать в невесомости, если не соваться за защитное поле корабля.
И я увидел пульсар! Невероятно красивый ярко-голубой шар, покрытый черной сетью разломов, его «стробоскоп» периодически светил мне в лицо.
Если бы не защитное поле, то меня и корабль уничтожило бы в мгновение. После этой мысли я проснулся.
ЗЫ. Картинка пульсара просто для иллюстрации, то, что видел во сне, так найти и не смог, даже примерно.
C#, вывод цветного текста на консоль и изменение цвета фона консоли.
Делается очень просто, цветом текста управляет свойство ForegroundColor
объекта Console
, а цветом фона — свойство BackgroundColor
, которые принимают значения из перечисления ConsoleColor
.
Например, если установить свойства таким образом:
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.ForegroundColor = ConsoleColor.Green;
то при выводе текста, например, командой:
Console.WriteLine("Demo Text");
мы получим зеленый текст:
Demo Text
на темно-сером фоне.
Всего консоль поддерживает 16 цветов.
Для возврата к цветовой схеме по умолчанию используется метод Console.ResetColor();
Демонстрационный пример на GitHub (выводит все цвета текста и фона)

Браузеры для Pentium II/III для процессоров без поддержки инструкций SSE2

Нашел еще одну подборку браузеров для процессоров без поддержки инструкций SSE2, способных работать на старых компьютерах Pentium III (некоторые должны и на Pentium II) под Windows XP.
Chrome 33 (Standalone Setup)
Firefox Setup 45.9.0 ESR none SSE2
Firefox Setup 48.0.2 none SSE2
Opera 20.0.1387.91 none SSE2
Chromium 35.0.1870.2 portable
Программа для генерации и чтения QR-кодов для Windows
На самом деле достали эти QR-коды и не только «от модной болезни», но и вообще. Лезут таки изо всех щелей. А лопат идиот-фонов я с собой не ношу, во всяком случае в ГОРФ, они мне тут без надобности, благо есть мягенькое креслице и уютный десктоп с полноценной клавой и мышью, ну или, на на худой конец, ноутбук. А телефон должен звонить и принимать СМС (от банка, о поступлениях на счет). Впрочем, преамбула превращается в минутку ворчания…
Итак, как же генерировать и читать QR-коды на десктопе или ноутбуке под Windows?
Нашел программу CodeTwo QR Code Desktop Reader & Generator.

+ Работает полностью оффлайн, не требует соединение с Интернетом.
+ Небольшие системные требования (см. ниже)
+ Бесплатная, как для домашнего, так и для коммерческого использования
+ Может генерировать QR-коды
+ Имеется возможность читать и декодировать QR-код с экрана (захват экрана с выделением области)
+ Из буфера обмена
+ С изображений с веб-камеры
+ Из файла
— Не OpenSource
+ Поддерживает версии Windows от Windows XP SP3 до Windows 10
+ Поддерживаются как x86 (32-разрядные), так и 64-разрядные версии ОС
+ Размер на диске 2,5 Мб
Необходим .NET Framework 4.0 или выше.
— Официальная страница (краткая инструкция на буржуйском, скрины, ссылка на скачивание)
QUEER-CODE
C#, как сделать транслитерацию. Перевод русской строки в latinitsu.
Думаю, что объяснять, что такое транслит, никому не нужно — это написание русских слов latinskimi bukvami, понадобилось сделать это на C#.
Первая проблема, которая возникла, это то, что четкого стандарта транслитерации нет, к сожалению, кто в лес, кто по дрова. Я находил даже стандарты с мерзкой диакритикой, т.е. всякими кракозяблями над буквами. В общем, для своего примера я выбрал какой-то довольно пожилой телеграфный стандарт (нашел в печатной книжке), благо, если кому-то что-то не нравится, всегда можно подправить в исходнике, тут меня больше интересует сам пример.
Русская буква | А | Б | В | Г | Д | Е | Ё | Ж |
Латинская буква или буквосочетание | A | B | V | G | D | E | Yo | Zh |
Русская буква | З | И | Й | К | Л | М | Н | О |
Латинская буква или буквосочетание | Z | I | J | K | L | M | N | O |
Русская буква | П | Р | С | Т | У | Ф | Х | Ц |
Латинская буква или буквосочетание | P | R | S | T | U | F | Kh | Ts |
Русская буква | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю |
Латинская буква или буквосочетание | Ch | Sh | Shch | » | Y | ‘ | E | Ju |
Русская буква | Я | |||||||
Латинская буква или буквосочетание | Ja |
Вторая проблема — этот стандарт проблематично использовать для транслитерации URL или имен файлов, надо что-то делать с пробелом (который в именах файлов и URL смотрится, как говно), так что в другом варианте таблицы, для замены Ъ
, Ь
и пробела
, был выбран знак подчеркивания (_
).
Создаем новый класс Translit
:
public class Translit { }
В класс Translit
добавляем словарь (Dictionary
), который, в качестве ключа, будет использовать тип char
(русскую букву), а в качестве значения string
, содержащий ее латинский эквивалент. Думаю, ясно, почему string
— некоторые русские буквы передаются латинскими буквосочетаниями:
private Dictionary<char, string> TranslitDict = new Dictionary<char,string>();
Теперь надо создать две функции, которые будут заполнять словарь нужными значениями.
Для общего случая:
private void FormDictStandart() { TranslitDict.Clear(); //Заглавные буквы (общий случай) TranslitDict.Add('А', "A"); //часть кода вырезана для экономии места TranslitDict.Add('Ъ', "''"); TranslitDict.Add('Ы', "Y"); TranslitDict.Add('Ь', "'"); TranslitDict.Add('Э', "E"); TranslitDict.Add('Ю', "Ju"); TranslitDict.Add('Я', "Ja"); //строчные буквы (общий случай) TranslitDict.Add('а', "a"); //часть кода вырезана для экономии места TranslitDict.Add('ъ', "''"); TranslitDict.Add('ы', "y"); TranslitDict.Add('ь', "'"); TranslitDict.Add('э', "e"); TranslitDict.Add('ю', "ju"); TranslitDict.Add('я', "ja"); }
И для «режима совместимости»:
private void FormDictCompat() { TranslitDict.Clear(); //Заглавные буквы (режим совместимости) TranslitDict.Add('А', "A"); //часть кода вырезана для экономии места TranslitDict.Add('Ъ', "_"); TranslitDict.Add('Ы', "Y"); TranslitDict.Add('Ь', "_"); TranslitDict.Add('Э', "E"); TranslitDict.Add('Ю', "Ju"); TranslitDict.Add('Я', "Ja"); //строчные буквы (режим совместимости) TranslitDict.Add('а', "a"); //часть кода вырезана для экономии места TranslitDict.Add('ъ', "_"); TranslitDict.Add('ы', "y"); TranslitDict.Add('ь', "_"); TranslitDict.Add('э', "e"); TranslitDict.Add('ю', "ju"); TranslitDict.Add('я', "ja"); //пробел TranslitDict.Add(' ', "_"); }
Теперь необходимо добавить в класс свойство, чтобы переключать режимы и переформировывать словарь. Классически, добавляем внутреннюю переменную compatibility
типа bool
, для хранения текущего значения свойства, и само свойство, при изменении которого, будет вызываться одна из вышеуказанных функций:
private bool compatibility = false; public bool Compatibility { get { return compatibility; } set { if (value) { FormDictCompat(); compatibility = true; } else { FormDictStandart(); compatibility = false; } } }
Добавим простой конструктор класса:
public Translit(bool Compat) { Compatibility = Compat; }
Алгоритм простой: надо проверить, содержится ли переданный в функцию символ в словаре, если да, то выдать соответствующее значение, если нет (т.е. передана латинская буква, знак препинания, цифра, или что-то иное), выдать этот же символ, преобразованный в строку:
public string TranslitChar(char Rus) { if (TranslitDict.ContainsKey(Rus)) { return TranslitDict[Rus]; } else { return Rus.ToString(); } }
Это я уже делал в маленьком примере (копия), так что просто вставлю функции оттуда:
//русские буквы public static bool ContainsRus(string TestString) { return Regex.IsMatch(TestString, @"[а-я]", RegexOptions.IgnoreCase); } //русские буквы и пробелы public static bool ContainsRusOrSpace(string TestString) { return Regex.IsMatch(TestString, @"[а-я]|\s", RegexOptions.IgnoreCase); }
1. Проверяем, содержит ли строка русские буквы или русские буквы и пробел, в зависимости от режима работы.
Примечание: Сильно работу алгоритма это замедлить не должно, а вот ускорить, в случае какой-нибудь гигантской строки может, т.к. Regex
, который используется в функции поверки, работает со строкой напрямую в памяти, средствами .NET.
Если искомого нет — возвращаем оригинальную строку.
2. Проходимся по символам строки, транслитерируем их, возвращаем новую строку.
Примечание: Для формирования новой строки лучше использовать StringBuilder
вместо простой конкатенации, опять же, на случай, если строка может оказаться гигантской. См. подробности в статье на Хабре
public string TranslitString(string Rus) { string sBuf = ""; StringBuilder sb = new StringBuilder(); if (compatibility) { if (!ContainsRusOrSpace(Rus)) return Rus; } else { if (!ContainsRus(Rus)) return Rus; } for (int i = 0; i < Rus.Length; i++) { if (TranslitDict.ContainsKey(Rus[i])) { sBuf = TranslitDict[Rus[i]]; } else { sBuf = Rus[i].ToString(); } sb.Append(sBuf); } return sb.ToString(); }
C#, как присвоить char значение null или его аналог.
Пост из серии спрашивали — отвечаем.
Значение null
переменной типа char
не присвоить никак, т.к. char
относится к «простым» (в другой литературе «базовым») типам, которые не могут принимать значение null
, и обязательно должны быть проинициализированы каким-то значением.
Но иногда надо объявить переменную типа char
, с которой работать будем потом, например, в цикле. Как тогда быть? Можно инициализировать переменную символом с кодом 0
(0x00
). Проще всего сделать это так:
char Chr = '\0';
Но можно и другими способами:
char Chr = char.MinValue;
char Chr = (char)0;
Или даже с извращениями:
char Chr = "\0".ToCharArray()[0];
Или с извращениями, используя большой и тяжелый класс Convert
, который лучше избегать, если он не очень нужен:
char Chr = Convert.ToChar(0);
C#, регулярное выражение для кириллицы.
Понадобилось тут узнать, содержит ли строка кириллицу. Решение через Regexp.
[а-я]
[а-я]|\s
Подключаем System.Text.RegularExpressions
:
using System.Text.RegularExpressions;
Код:
public static bool ContainsRus(string TestString) { return Regex.IsMatch(TestString, @"[а-я]", RegexOptions.IgnoreCase); } public static bool ContainsRusOrSpace(string TestString) { return Regex.IsMatch(TestString, @"[а-я]|\s", RegexOptions.IgnoreCase); }
Анализ и распаковка установщика QTInstaller вручную. С помощью HEX-редактора и такой-то матери.
Понадобилась мне одна программка, которая, почему-то не захотела ставиться на мою систему, причем не захотела без всяких ошибок и вылетаний. Инсталлятор просто висел на 1% и дальше двигаться не хотел. Зная, что поддержка винды у этой софтины зависит исключительно от бодуна разработчиков (то они винду вообще не поддерживали, потом прошлая версия прекрасно ставилась и работала, а тут вдруг опять нет), решил я в софтине поковыряться, небось, софтина-то работает, а инсталлятор кривой. Но о том, как я возился с софтиной, напишу как-нибудь позже. А тут будет такой простенький заметк про реверсинг инсталлятора.
Я уже как-то упоминал (копия), что инсталляторов и упаковщиков есть туева хуча на свете, и для начала надо определить, с каким именно инсталлером мы имеем дело. Для этого воспользуюсь программкой Detect It Easy (DiE), которая по своей базе сигнатур может определять тип экзешника, чем он упакован, чем скомпилирован, а если это инсталлятор — определить и его тип. Программка работает примерно также, как антивирусный сканер, определяя по сигнатурам, с чем мы имеем дело. Благо, почти все упаковщики, компиляторы или сборщики инсталляционных пакетов, так или иначе оставляют свою сигнатуру в файле.
Итак, скармливаю DiE исследуемый инсталлятор.

Видим тип — QT installer.
Естественно, о ней я и подумал сразу же, не изобретать же велосипед, до нас его более умные люди изобрели. А не тут-то было! Автоматического распаковщика не нашел, так что стал думать… Qt проект открытый, значит, скорее всего, они особо не заморачивались, и инсталлятор представляет из себя самораспаковывающийся архив, который по структуре выглядит как-то так, как выглядят самораспаковывающиеся архивы RAR WinZip или 7Zip — в начале файла EXE-модуль, а после него данные, которые EXE-модуль распаковывает:

В принципе, что я иду верным путем, можно было понять из главного окна DiE, тот недвусмысленно сообщал про overlay (оверлей), в котором находятся QT installer data, т.е. данные QT-установщика.
Detect It Easy (DiE):
— На Exe-Lab
— На Mega.nz
qresExtract:
— Binary for Windows x86
— Sources
WinHex 19.9:
Niet, Molotoff, клип от студии Психозмультфильм
Когда-то сто лет назад один из друзей его даже размещал на только что появившемся Ютубе (по просьбе rutopist@lj), но теперь уж не той записи, и того ролика найти нельзя. А вот флешка нашлась — конвертнул в экзешник, кому надо — берите. Песня почему-то без третьего куплета, но это косяк авторов оригинального ролика.

Установка аналога apt-get в Cygwin
У Cygwin есть свой пакетный менеджер, встроенный, собственно, в установщик. Однако, если надо установить что-нибудь небольшое, то выходить из консоли и запускать инсталлятор лень. Можно установить аналог убунтовского apt-get
.
1. В установщике сначала устанавливаем wget, если раньше этого не сделали (в окне мастера со списком пакетов выбираем Full [1]) и в поиске[2] вводим wget. Выбираем последнюю версию в столбце New[3].

2. Скачиваем скрипт apt-cyg
(в консоли Cygwin):
wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
3. Даем скрипту права на исполнение:
chmod +x apt-cyg
4. Перемещаем скрипт в /usr/local/bin
:
mv apt-cyg /usr/local/bin
Пользоваться apt-cyg
так же, как убунтовским apt-get
. Все зависимости от устанавливаемого пакета подтянутся автоматически. Например, можно установить mc
:
apt-cyg install mc
После того, как скрипт отработает, запускаем:
mc

ФАНФАРЫ!
Ошибка при установке Сygwin, Cygwin не видит списка репозиториев.
И не может скачать пакеты с репозиториев.
Оказался я тут недавно на одной винде, без доступа к Linux, а Linux-овое окружение срочно потребовалось, погуглил, решил поставить Cygwin, а не тут-то было. Скачиваю инсталлятор, запускаю, а он не видит списка зеркал:

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

1. Заходим в Свойства браузера (Свойства: Интернет) через Панель управления или Пуск —> Выполнить (Win+R) и вводим и запускаем inetcpl.cpl
.
2. Переключаемся на вкладку Дополнительно
3. Ставим галочки напротив пунктов Использовать TLS 1.1 и Использовать TLS 1.2

Список зеркал:

Список пакетов для установки:

ЗЫ. Пишут, что на некоторых системах не помогает, точнее помогает только после обновления IE и установки кумулятивного обновления для Windows 7 (копия)
Оффлайновые (кумулятивные) обновления для Windows.

Лично я все обновления винды всегда отрубал, отчасти из-за того, что оно часто бывало не совсем лицензионным (от откровенно крякнутых, до кастомных сборок), а отчасти от того, что обновления от M$ «не все одинаково полезны». Некоторые крашили систему, причем внезапно, некоторые делались исключительно для какой-нибудь гадости, как принудительная вакцинация переход с Win7 на Win10
Но, обновления бывают и полезными, от всяких затычек дыр, типа которых (дыр) использовали вирусы WannaCry и NotPetya, до обновления корневых сертификатов.
Так как же получить полезные обновления, но пропустить вредные?
Я уже как-то упоминал сайт Simplix’а. Товарищ аккуратно следит за всеми выходящими обновлениями для Windows и формирует кумулятивные (общие) пакеты обновлений, которые можно накатывать на свежую систему, желательно, с предварительно отключенным автообновлением, чтоб до кумулятивного не попала всякая копирастическая дрянь.
Не реклама. Я сам уже 3 года пользуюсь его пакетами обновлений на нескольких десятках машин, где установлены Windows 7 и даже Windows XP. Сбоев после обновления Simplix еще не бывало.
И еще это бывает полезно там, где интернета нет, или он совсем медленный. Скачал заранее и припер на флешке.
Для XP он уже не формирует пакет обновлений, т.к. обновления окончательно перестал выпускать сам M$, но последний пакет хранится на сайте. Без зазрения совести, его можно назвать Windows XP SP4! Дембельский аккорд уходящей ОС.
Сайт Simplix
Кумулятивные обновления для Windows XP SP3 (новые выходить перестали)
Кумулятивные обновления Windows 7 (обновляются)
Запись из BAT/CMD-файла в STDERR.
Небольшой пост из серии спрашивали — отвечаем.
Примечание: это работает только в версиях Windows, где командный процессор умеет в расширенную обработку команд, т.е., начиная с Windows 2000.
Расширенная обработка команд по умолчанию включена в Windows Server 2003/Windows XP, но может быть отключена через Реестр, так что для совместимости лучше ее включить явно:
SetLocal EnableExtensions
Команда echo
по умолчанию выводит на STDOUT
, т.е., например, команда:
echo I write to STDOUT
Выведет текст I write to STDOUT
на STDOUT
, да на мне капитанская фуражка 🙂
Для вывода текста на STDERR
необходимо использовать переопределение вывода, синтаксис которого похож на аналогичный синтаксис в Linux, т.е. в современных Windows тоже есть три канала ввода/вывода, с номерами, аналогичными Linux, т.е.:
1
— STDOUT
2
— STDERR
3
— STDIN
Переопределяется вывод на STDERR
конструкцией 1>&2
, т.е. команда
echo I write to STDERR 1>&2
Выведет текст I write to STDERR
на STDERR
.
BAT-файл writeto.bat
целиком:
@echo off
SetLocal EnableExtensions
rem This BAT file write in stdout and stderr
echo I write to STDOUT
echo I write to STDERR 1>&2
Для проверки работы BAT-файла можно создать тестовый BAT-файл, который будет вызывать файл writeto.bat
и перенаправлять потоки вывода STDOUT
и STDERR
в текстовые файлы.
Содержимое файла writeto_test.bat
:
@echo off
SetLocal EnableExtensions
rem This BAT file test for writeto.bat
call writeto.bat 1>_stdout.txt 2>_stderr.txt
Данный файл надо создать в каталоге с writeto.bat
.
После запуска файла writeto_test.bat
в текущем каталоге появятся файлы _stdout.txt
и _stderr.txt
со следующим содержимым:
_stdout.txt: I write to STDOUT _stderr.txt: I write to STDERR
ФАНФАРЫ!
HUILO.EXE: Не дай Украине остаться без газа!
Пересобрал в экзешник прикольную старую флешевскую игрушку, как раз на злобу дня.
Правила простые — кидайтесь яйцами в Хуйло, и не забывайте закрывать вентили, которые Хуйло успело открутить (кликом по ним).
