Обновление пакетного конвертера текстовых файлов.
Благодарим всех, кто сообщил о багах.
+ Изменения в алгоритме поиска файлов
+ Поправлен баг с сохранением конфигурации (масок файлов)
Обновление пакетного конвертера текстовых файлов.
Благодарим всех, кто сообщил о багах.
+ Изменения в алгоритме поиска файлов
+ Поправлен баг с сохранением конфигурации (масок файлов)
Когда-то уже говорил (копия) что стандартная функция C# Directory.GetFiles(); неправильно ищет файлы по маске. И даже сделал на скорую руку кривофикс, но кривофикс действительно оказался именно что криво. Во-первых, срабатывал только для некоторых масок, а во-вторых, оказался чувствительным к регистру имен файлов. Делаем более прямое исправление.
Заведем вспомогательную функцию, которая будет добавлять конечный слэш (\) к имени директории. Оно не особо надо, но пусть будет для порядка.
private static string AddSlash(string st)
{
if (st.EndsWith("\\"))
{
return st;
}
return st + "\\";
}
И функцию, получающую имя файла из полного пути. Конечно, можно было бы воспользоваться классом FileInfo из System.IO, но тут операция совсем уж простая, а FileInfo может сгенерировать ненужный Exception. Проще получить имя файла с помощью строковой операции:
private static string GetNameOnly(string FullName)
{
int LastSlash = FullName.LastIndexOf("\\");
if (LastSlash == -1) return FullName;
return FullName.Substring(LastSlash + 1);
}
Да, я таки решил воспользоваться нелюбимыми регекспами. Впрочем, маска файла и есть регулярное выражение, только с упрощенным синтаксисом.
1. В имени файла могут встретиться символы, считающиеся служебными в регулярном выражении (.,^,$,{,},[,],(,),+), их необходимо экранировать, чтоб они воспринимались обработчиком регулярных выражений, как обычные, а не служебные символы.
//точка в маске файла должна быть точкой в регулярном выражении
//экранируем
Mask = Mask.Replace(".", "\\.");
//^,$,{,},[,],(,),+ в regexp служебные, в именах файла допустимые
//экранируем
Mask = Mask.Replace("^", "\\^");
Mask = Mask.Replace("$", "\\$");
Mask = Mask.Replace("{", "\\{");
Mask = Mask.Replace("}", "\\}");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("(", "\\(");
Mask = Mask.Replace(")", "\\(");
Mask = Mask.Replace("+", "\\+");
2. * — в маске файла это любой символ, или их отсутствие. В регулярном выражении этому соответствует комбинация .*, заменяем:
Mask = Mask.Replace("*", ".*");
3. ? в маске файла — любой существующий символ. В регулярном выражении это символ . (точка), заменяем:
Mask = Mask.Replace("?", ".");
4. Осталось ограничить работу регулярного выражения началом и концом строки, строкой будет являться имя (маска) файла. Начало строки обозначается символом ^, конец символом $. Добавляем:
Mask = "^" + Mask + "$";
Функция целиком:
private static string Mask2Reg(string Mask)
{
//точка в маске файла должна быть точкой в регулярном выражении
//экранируем
Mask = Mask.Replace(".", "\\.");
//^,$,{,},[,],(,),+ в regexp служебные, в именах файла допустимые
//экранируем
Mask = Mask.Replace("^", "\\^");
Mask = Mask.Replace("$", "\\$");
Mask = Mask.Replace("{", "\\{");
Mask = Mask.Replace("}", "\\}");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("[", "\\[");
Mask = Mask.Replace("(", "\\(");
Mask = Mask.Replace(")", "\\(");
Mask = Mask.Replace("+", "\\+");
//* - любое количество любого символа,
//в regexp любой символ - точка, любое количество *
Mask = Mask.Replace("*", ".*");
//? - любой символ, в regexp любой символ - точка.
Mask = Mask.Replace("?", ".");
//добавляем начало и конец строки к имени файла.
Mask = "^" + Mask + "$";
return Mask;
}
В модифицированную функцию поиска передаются такие же параметры, как и в функцию Directory.GetFiles(); т.е. маска файла, путь до каталога и перечисление SearchOption, которое может принимать два значения: SearchOption.AllDirectories — поиск с подкаталогами и SearchOption.TopDirectoryOnly — поиск только в текущем каталоге.
Внутри функции:
1. Преобразуем маску файла в регулярное выражение:
string MaskRegStr = Mask2Reg(sMask);
2. Добавляем слеш к пути поиска (на всякий случай):
sPath = AddSlash(sPath);
3. Заводим List<string>, куда будем складировать отфильтрованные файлы из найденных (на то, как криво работает Directory.GetFiles() есть ссылки в начале заметки).
List<string> FoundFiles = new List<string>();
4. Создаем обработчик регулярных выражений с опцией RegexOptions.IgnoreCase, чтобы игнорировать регистр входной строки (в нашем случае — имени файла).
Regex MaskReg = new Regex(MaskRegStr, RegexOptions.IgnoreCase);
5. Вызываем функцию поиска из System.IO:
string[] files = Directory.GetFiles(sPath, sMask, SO);
6. Фильтруем вывод на предмет лишних файлов (см. подробнее по ссылке в начале заметки). Фильтрация производится путем сравнения имени файла с ранее сгенерированным регулярным выражением. Если имя файла соответствует регулярке, оно добавляется в List:
foreach (string filename in files)
{
if (MaskReg.IsMatch(GetNameOnly(filename)))
{
FoundFiles.Add(filename);
}
}
7. Результат возвращается в виде строкового массива:
return FoundFiles.ToArray();
Функция целиком:
public static string[] Find(string sPath, string sMask, SearchOption SO)
{
string MaskRegStr = Mask2Reg(sMask);
sPath = AddSlash(sPath);
List<string> FoundFiles = new List<string>();
Regex MaskReg = new Regex(MaskRegStr, RegexOptions.IgnoreCase);
string[] files = Directory.GetFiles(sPath, sMask, SO);
foreach (string filename in files)
{
if (MaskReg.IsMatch(GetNameOnly(filename)))
{
FoundFiles.Add(filename);
}
}
return FoundFiles.ToArray();
}
Вроде бы в этот раз все предусмотрел, и глюкоопцию встроенной функции поправил, и в регулярке нигде не наебался.
Вспомнилась детская, почти крипи-стори. Итак, прикиньте, начало 90-х, по телеку идут 600 секунд и передача «НЛО — Необъявленный Визит» с Мягченковым. И вот, в садике я долго объяснял одногруппнику что НЛО существуют, и даже песня про них есть. Ее по радио передают.
Я даже сходил к воспитательнице и спросил, кто такая кавалер-барышня, поскольку в те годы транс было транспортным агентством, а трап — деталью от корабля, воспитательница мне рассказала историю про кавалерист-девицу, которая прикинулась парнем, чтобы пойти служить. Вот тут-то у меня все в голове окончательно сложилось, песня про НЛО:
Крутится-вертится шар голубой
Крутится-вертится над головой (НЛО же, иначе хуле ему вертеться)
Крутится-вертится, хочет упасть (приземляется)
Кавалер-барышню хочет украсть (хочет унести для исследований нетипичную девушку, которая хочет служить в армии).
Такие дела.
Наконец, все сфоткались. Или нашли подходящие фотографии 🙂 А то аж с 2017 года собраться не могли.
Диклеймер №1. Автор не призывает к употреблению наркотиков в любом виде, записи были сохранены исключительно для целей научного исследования для специалистов-наркологов. Если Вы не являетесь врачом-наркологом, пожалуйста, не читайте эти тексты. Наркотики вредят вашему здоровью.
Диклеймер №2. Специально для Администрации LJ.Rossia.Org
Пост не содержит активных ссылок и скрытой рекламы, или же продакт-плейсминга. Пост создан исключительно в научных целях, сам архив с записями сохранен на другом ресурсе, поставщика описанных марок не уже существует.
Примечание: Архив защищен паролем, пароль указан в комментарии архива. Формат архива RAR5, формат текстов TXT. Кодировка: Windows 1251 и UTF-8.
Раз уж речь зашла о фотках. Пока я тут отдыхаю, в нашем офисе (который нам таки с концами достался) делают ремонт. Там и до этого была политически правильная стена (копия), а теперь еще и парень, который нашего аффтара фотографировал, и Отаву (флаг Ухтинской Республики) дорисовал.

За странное сочетание цветов говном не кидайтесь, фотки были с разных фотоаппаратов, а я попытался типа панораму сделать, т.к. единым кадром вся стена в кадр не помещалась. В общем, вениаминожаба получилась 🙂
По клику по изображению — крупный вариант.
Полы ребята, кстати, классно сделали. Сняли краску и покрыли в 3 слоя паркетным лаком, и светло, и текстура дерева видна. А то в ГОРФ, как и в совке — пол особо ничем не покрасить, во всех магазинах есть три цвета — темно-поносный, поносный и светло-поносный. Так что сошлись на паркетном лаке, ибо заказывать стойкую краску для пола из Голландии я не одобрил, 8 000 с доставкой.
Покупайте наших полов!
Пока я тут отдыхаю, нежась в тепле, наш автор таки вышел с фонариком.
Ничего страшного пока не случилось, но глазки и нашивку на рабочей куртке парня мы таки закрыли.


Такие дела.
Заметка началась с небольшой просьбы, найти сигнатуру ярлыка (shortcut) Windows, т.е. LNK-файла, а вылезло несколько интересных вещей, которые стоит оставить, как зарубку на память.
Отвечаю на поставленный вопрос. Любой файл LNK начинается с четырех байт (hex):
4C 00 00 00
Так вот, почему ярлык шпиона? Да потому что ярлык, кроме указания пути к файлу, на который он ссылается, рабочего каталога и типа окна открытого файла (программы) сохраняет странные и непонятно для чего нужные метаданные:
— исходный путь файла и его временные метки (полный путь, время доступа к целевому файлу (UTC), время создания целевого файла (UTC), время изменения целевого файла (UTC)).
— тип тома, с которого файл был открыт (съемный носитель, обычный том, виртуальный том)
— серийный номер тома (серийный номер привода)
— метка тома
— NetBIOS-имя устройства (сетевое имя компьютера)
— MAC-адрес устройства. Впрочем, MAC-адрес устанавливается по какому-то странному алгоритму, на машине с несколькими сетевыми картами оно получается несколько рандомно. Не совсем понял, как это устроено, кто знает — напишите в комментариях.
— размер целевого файла (байт) — размер файла, с которым ассоциирован ярлык
Зачем это делается, не совсем понятно.
Почитать подробнее можно по следующим ссылкам:
— Токсичные ярлыки в Windows: старый артефакт, не забытый хакерами, но частично забытый криминалистами (копия в PDF)
— Какую информацию можно получить из ярлыка? (копия в PDF)
В первой статье анализ проводился платными программами для расследования инцидентов кибербезопасности, но кое-что можно посмотреть и бесплатно, программой Windows File Analyzer, описана во второй статье, не буду повторяться, оставлю ссылки на скачивание:
— С сайта разработчика
— Копия на Mega.nz
Известно, что Office и некоторые другие программы хранят ярлыки последних сохраненных документов в специальных каталогах для того, чтобы потом показывать пользователю список открытых документов. Так вот, решил провести эксперимент — создать файл с каким-нибудь красноречивым компрометирующим именем, а потом изменить свойства ярлыка и посмотреть, что получится.
Итак, создаем пустой файл с именем, например, PutinBombaVzryvChechency.doc и создаем ярлык. Смотрим содержимое ярлыка в шестнадцатеричном редакторе (красным выделил сигнатуру файла LNK):

Создаем файл kotik.doc и пытаемся поменять ярлык через «Свойства ярлыка», на несуществующий файл ссылку стандартным способом сделать нельзя, потому делаем на существующий файл:

Проверяем, открывая измененный ярлык в HEX-редакторе.

Пробуем изменить ярлык программно, с помощью класса vbAccelerator.Components.Shell, через WinAPI (копия заметки):
string lnkname = @"C:\Temp\PutinBombaVzryvChechency.doc - Ярлык.lnk";
ShellLink lnk = new ShellLink();
lnk.Open(lnkname);
lnk.Target = "X:\\NoFile.doc";
lnk.WorkingDirectory = "X:\\";
lnk.Save();

Проверяем в HEX-редакторе:

Все еще хуже.
Подробной гипотезы о том, почему оно так работает, у меня нет, но к определенным мыслям это приводит. Например, при удалении ярлыков последних документов их лучше всего удалять безопасным удалением (т.е. с полной перезаписью содержимого файла LNK). Конечно, можно разобраться в формате файла (тем более, он опубликован), но мало ли что MS добавит туда в будущем. А в целом, ситуация дискомфортная, даже если и ложечки найдутся, осадок останется, т.к. обычно мало кто обращает внимание на такую незначительную мелочь, как ярлык, а восстанавливаются (если они были удалены стандартным образом) они достаточно просто, сигнатурным поиском по диску.
Заметка по мотивам онлайн-консультации и больше от склероза, так что скринов будет мало, а кое-где могу что-то забыть, если что — пишите в комментарии. Задача — вернуть на Sony Vaio (SVT1111Z9RS) Windows 7, которая там стояла изначально, вместо Windows 10, которую туда кто-то зачем-то запихал.
Переустановка несколько нетривиальная, так что лучше перед началом все необходимое скачать заранее.
— Дистрибутив Windows 7
— Driver Pack Solution (у товарища была полная оффлайн-версия), как минимум нужна Driver Pack Offline Network
— Кумулятивное обновление Windows 7 от Simplix
— NET Framework 4.0
— Драйвера для видеокарты (Intel HD Graphics 4000)
Копия (драйвера Intel HD Graphics 4000 + .NET Framework 4)
Поделить диск можно как угодно, сработают и Arconis и, например, System Rescue CD.
Но первый сюрприз поджидает уже тут, на машине USB 3.0, потому если устанавливать оригинальный дистрибутив с флешки, то установщик перестанет ее видеть. Потому нужно или искать дистрибутив Windows 7 с поддержкой USB 3.0, или если лень искать, то можно установить Windows 7 через установочное окружение Windows 8 (копия), товарищ сделал все еще проще, загрузился с System Rescue CD и скачал все перечисленное выше с сервера на заранее подготовленный раздел жесткого диска, и запустил установку Windows с жесткого диска из Windows PE на базе Windows 7, например, такой или такой. Естественно, на HDD копируем распакованный из ISO-образа дистрибутив, а не сам ISO.
Секунда ненависти и ворчания. Sony — откровенные гондоны, пидары и козлы. Теперь все фильмы, произведенные этими мудоебищами, буду смотреть исключительно ворованные, т.к. эти уроды убрали с официального сайта все драйвера для старых ноутбуков:
Обращаем ваше внимание, что с 1 января 2021 г. Sony больше не будет предоставлять драйверы и программное обеспечение для компьютеров Sony VAIO, поставлявшихся со следующими предустановленными операционными системами Microsoft Windows и перечислены все ОС, в т.ч. и Windows 7.
Но у нас есть Driver Pack Solution, так что:
1. Запускаем Driver Pack Solution, переключаемся в режим эксперта, убираем все, кроме драйверов для LAN и устанавливаем их.
2. Перезагружаем компьютер.
3. После перезагрузки опять запускаем Driver Pack Solution, опять переключаемся в режим эксперта и устанавливаем все остальные драйвера, кроме драйвера видеокарты. С ним лучше повременить, объясню ниже.
4. Перезагружаем компьютер.
Если прямо сейчас попытаться установить драйвер видеоадаптера, то Windows начнет ругаться на отсутствие цифровой подписи, видеодрайвер не заработает, а в диспетчере устройств у видеодрайвера будет отображаться восклицательный знак, в свойствах указана ошибка 52 "Не удается проверить цифровую подпись драйверов".

Не знаю, с чем точно это связано, но подозреваю с тем, что в чистой Windows 7 SP1 нет нужного нового сертификата Intel, а оригинальный драйвер с сайта Sony был или более старым, чем теперешний, или с драйвером поставлялось обновление сертификата (и ведь не проверишь, горите в аду пиздоглазые анальные проушины из Sony). Вот тут и пригодится кумулятивное обновление от Simplix.
Итак, решаем проблему:
1. Устанавливаем обновление от Simplix:
1.1 В каталоге со скачанным пакетом (на момент написания заметки, файл называется UpdatePack7R2-21.1.15.exe) создаем BAT-файл update.bat со следующим содержимым:
UpdatePack7R2-21.1.15.exe /IE11
1.2 Запускаем update.bat
1.3 Следуем инструкциям на экране, в процессе установщик предложит перезагрузиться, перезагружаемся, дожидаемся окончания установки.
2. Устанавливаем .NET Framework 4
3. Устанавливаем видеодрайвер (с сайта Intel)
Родная ОС возвращена.
ФАНФАРЫ!
Задача довольно простая, имеется ключ в разделе Реестра Windows, необходимо удалить оттуда все значения (values).
Реестр — иерархическая база данных, хранящая основные настройки системы и программ.
Корневой ключ (в некоторых источниках просто ключ или раздел Реестра), это один из основных ключей Реестра. Обычно присутствуют следующие:
HKEY_CLASSES_ROOT (HKCR) — Зарегистрированные типы файлов, объекты COM и ActiveX
HKEY_CURRENT_USER (HKCU) — Настройки текущего пользователя, в данный момент вошедшего в систему.
HKEY_LOCAL_MACHINE (HKLM) — Общие настройки для всех пользователей данного компьютера.
HKEY_USERS (HKU) — Профили всех пользователей данной машины.
HKEY_CURRENT_CONFIG (HKCC) — Профили оборудования, информация о драйверах.
Подключ/Subkey (иногда Ключ, если корневой раздел называется корневым разделом или корневым ключом) Реестра — путь в Реестре, аналогичный пути к каталогу (папке) файловой системы. Обычно каждый подключ хранит или настройки для конкретного случая. Например, настройки конкретной программы или профиль конфигурации оборудования. Выглядит примерно так: Software\TestKey (в полном виде, вместе с корневым ключом, например: HKEY_CURRENT_USER\Software\TestKey).
Подключ может содержать как и другие подключи, так и значения (values), представляющие собой поименованные переменные, содержащие значения конкретного параметра

Обзорная статья про Реестр Windows на Википедии
Для тестирования создадим тестовый ключ, который не будет влиять на какие либо программы и компоненты ОС. Это можно сделать, как вручную, с помощью программы Regedit, так и в автоматическом режиме, с помощью reg-файла, например, такого:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\TestKey]
"value0"="text0"
"value1"="text1"
"value2"="text2"
"value3"="text3"
"value4"="text4"
"value5"="text5"
Можно создать и reg-файл для удаления тестового ключа из Реестра, если что-то пойдет не так:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\TestKey]
1. Подключаем пространство имен Microsoft.Win32:
using Microsoft.Win32;
2. Создаем переменную с именем подключа Реестра и переменную типа RegistryKey. Этот объект и будет рулить нужной веткой Реестра:
string subkey = "Software\\TestKey";
RegistryKey key = null;
3. Любые операции с Реестром могут привести к ошибкам, потому их как и операции ввода-вывода желательно оборачивать в try..catch:
try
{
//тут будет код.
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message);
}
4. Открываем (под)ключ Реестра:
key = Registry.CurrentUser.OpenSubKey(subkey, true);
Внимание! Если необходимо писать в ключ Реестра, обязательно устанавливаем второй параметр функции OpenSubKey в true, т.к. в противном случае, мы получим ошибку UnauthorizedAccessException: Не удалось выполнить запись в раздел реестра.

5. Получить список значений в (под)ключе можно функцией GetValueNames(), которая выдает строковый массив с именами значений Реестра.
6. Получаем имена всех значений и в цикле удаляем их с помощью функции DeleteValue(имя_параметра);
foreach (string valname in key.GetValueNames())
{
Console.WriteLine("Delete value: " + valname);
key.DeleteValue(valname);
}
7. Закрываем (под)ключ Реестра.
key.Close();
Все получилось:

Итак, требуется написать программу, которая генерирует заданное количество файлов с определенным содержимым. Содержимое задается или в качестве байтового паттерна (т.е. если программе указать 0xFF, то файл будет заполнен указанным количеством байт со значением 0xFF) или случайных байт. Файлам также можно задать расширение, или сделать и имя файла случайным.
Выполнена в виде консольной программы, запускаемой со следующими параметрами:
Использование: filegen.exe <количество_файлов> <размер>[K|M|G] <расширение|/R> [байтовый_паттерн|/R]
<количество_файлов> - количество файлов
<размер> - размер:
по умолчанию - байты K - килобайты M - мегабайты G - гигабайты
<расширение> - расширение файла или /R - случайное имя файла
[байтовый_паттерн] - байтовый паттерн (HEX): от 0x00 до 0xFF, по умолчанию 0x00 или /R случайные байты
1. С#, Заполнение массива одним значением. (копия)
2. C#, заполнение массива случайными числами. (копия)
3. C#, Количество цифр (разрядов) числа. (копия)
4. C#. Перевод кило- мега- и гигабайтов в байты. (копия)
Простая учебная задача, но почему-то до моего решения долюбились, в конце объясню, почему долюбились, и почему, в случае C#, это зря было.
И так, задача состоит в том, чтобы всякие кратные единицы перевести в байты (кому надо обратную задачу, либо все во все — пишите в комментарии). Для этого достаточно сделать следующую функцию, исходя из того, что 1 Кб == 1024 Б, 1 Мб = 1024 Кб, 1 Гб = 1024 Мб. В функцию добавим некую переменную-модификатор, для консольного приложения было проще сделать строковую, в ином случае, может и есть сделать отдельный Enum для единиц, но я обошелся строковой.
Переменная-модификатор (modificator) принимает строковые значения G(g), M(m) и K(k), соответственно для гига- мега- и килобайта.
Функция получается такая:
public static ulong ToBytes(ulong bytes, string modificator)
{
ulong Ret = 0;
switch (modificator)
{
case "":
{
Ret = bytes;
} break;
case "K":
case "k":
{
Ret = bytes * 1024;
} break;
case "M":
case "m":
{
Ret = bytes * 1024 * 1024;
} break;
case "G":
case "g":
{
Ret = bytes * 1024 * 1024 * 1024;
} break;
default:
{
throw new ArgumentException("Wrong modificator ["
+ modificator + "]. Set K(k), M(m), G(g)");
}
}
return Ret;
}
Задача была очень простая, чисто учебная. Консольная программа принимает в качестве одного параметра число с единицей без пробела, т.е. команда вида program.exe 10G, должна вывести количество байт. Надо ли Enum городить, ну красиво было бы, но до Enum‘ов они не добрались 🙂
В основной программе надо отрезать последний символ из параметра, проверить ли является он нужной буквой (K/M/G) и пересчитать. Если буквы нету, а только цифры — значит оно уже сразу байты.
В функции Main() отрезаем последний символ от первого параметра командной строки, если он K/M/G, считаем, что все остальное число, отрезаем его, а все остальное пытаемся сконвертировать в ulong (Int64) и передать функции ToBytes() с отрезанным символом, как модификатором для расчета. Если нет — просто считаем, что вся строка число, пытаемся конвертировать, а функции передаем пустой модификатор.
Ошибки конвертации ловим try/catch:
string size_s = args[1];
try
{
string mdf = size_s.Substring(size_s.Length - 1, 1);
if ((mdf != "K") && (mdf != "k") && (mdf != "M") && (mdf != "m") &&
(mdf != "G") && (mdf != "g"))
{
mdf = "";
//in parameter only numbers or param wrong...
}
else // remove modificator
{
size_s = size_s.Substring(0, size_s.Length - 1);
}
BytesCount = ToBytes(Convert.ToUInt64(size_s), mdf);
}
catch (Exception ex)
{
Console.WriteLine("Wrong <size> parameter!");
Console.WriteLine(ex.Message);
Console.Write("Press Enter...");
Console.ReadLine();
return 2;
}
За вот эти вот конструкции:
Ret = bytes * 1024;
Ret = bytes * 1024 * 1024;
Ret = bytes * 1024 * 1024 * 1024;
Типа «ну тут числа, ты бы их сначала перемножил, результат записал , а потом на переменную помножил».
Дебилы, бля, как говорил Лавров. В интерпретируемых языках или старом Трупопоскакале под DOS, может это и какой-то рояль играет, но в C# компилятор перемножает константы до сборки экзешника, а 1024*1024*1024 для компилятора константы, во время компиляции. Т.е. процессору скормят 1073741824. А код останется более понятен и читабелен.
Стридэйджеры домой не пришли, пошли на морько тусовать, я остался дома и продолжаю вас с карельской мьюзикой знакомить.
Прямая ссылка: https://youtu.be/TVObKTqZ2lc

Будь я хоть негр
преклонных годов,
Хоть исландец,
пропахший рыбой...
Я б японский выучил
только за то,
Что на нем
разговаривал Киба!

Аниме, так-то про пенсионера, который в результате несчастного случая с НЛО, получает новое тело и превращается в боевого робота. Правда вместе с ним, такие же способности получает и омежка, которым в детстве был известный всем Владимир Таврический Хуйло.
Хуйло начинает валить всех направо и налево, руководствуясь принципом: «друзьям все — остальным пиздец», так что от него даже друг сваливает (это прямо предсказание, запомните этот твит). Причем валит даже не по делу, а ради удовольствия.
А Дед, он воюет со злом, пиздит гопников, выпиливает бандитов, да и охотится за Хуйлом (правда, весьма вяло).
Понятно, что такое молодежи показывать нельзя.
Попробуй этому пенсионеру повысить пенсионный возраст, скажет ведь: «То, что вы делаете, недостойно» — и развесит по фонарям и ПФ РФ, и роскрысдию и ФСО.
Тем более, уничтожил самую крутую банду нараёне, как так-то? Прямая отсылка к самой крутой банде в ГОРФ, т.е. к нашему, а не анимешному Хуйлу и его друзьям-подхуйловникам.
Ну и, естественно, японцы, того не желая, наступили на мантру пропаганды всея ГОРФ — «Деды Воевали»!
Нельзя показывать, ну никак нельзя.
ЗЫ. Гей-секс там был, но исключительно в негативной коннотации, как отношения между старшим бандитом и подчиненным. Хотя и это, наверное, задело зоновский роскомсуд, т.к. такой гей-секс в ГОРФ вполне разрешен. А его тут с негативной стороны показывают.
ЗЗЫ. Антагонист, впрочем, тоже сделал полезную вещь, хотя и в стиле роскомнадзора — перебил кучу анонов с местного двача. А потом даже исправился и помог планету спасти.
Запретили песенку на территории ГОРФ, ублюдки сраные из роскомговна. По поводу нам скидывали интервью Барта, фронтмена группы «Ничего хорошего», но оно безблагодатно проебано куда-то, тяжко иметь 40+ аккаунтов в соцсетях, и потом разобраться, где с кем переписывался.
Прямая ссылка: https://www.youtube.com/watch?v=RLV53ix4GVM
Прямая ссылка: https://www.youtube.com/watch?v=VQwJQ45F57c
Здесь (копия) я показал довольно неоптимальный способ решения данной задачи, но его можно оптимизировать с помощью стандартных функций. Напомню суть задачи: даны числа, скажем, от 1 до 1000, необходимо вывести их на экран или в файл последовательно, добавив лидирующие ноли, исходя из максимального числа. Если максимум 1000, то числа должны быть выведены так:
0001
0002
0003
...
0100
0101
0102
...
1000
Если максимум 100, то:
001
002
...
099
100
Как и в предыдущей версии решения, понадобится задать максимальное число (в тестовых примерах опять же, зададим его статически), например:
int maxnum = 150;
И опять же, понадобится функция, вычисляющая количество цифр (разрядов) числа (копия). Например, такая:
static int CountDigitsRec(int n)
{
n = (int)Math.Abs(n);
if (n <= 9)
{
return 1;
}
else
{
return CountDigitsRec(n / 10) + 1;
}
}
C# автоматически умеет форматировать строки, используя специальные паттерны описания формата, задаваемые в виде строки. Основные паттерны перечислены в таблице ниже:
| C / c | Задает формат денежной единицы, указывает количество десятичных разрядов после запятой |
| D / d | Целочисленный формат, указывает минимальное количество цифр |
| E / e | Экспоненциальное представление числа, указывает количество десятичных разрядов после запятой |
| F / f | Формат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой |
| G / g | Задает более короткий из двух форматов: F или E |
| N / n | Также задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой |
| P / p | Задает отображения знака процентов рядом с число, указывает количество десятичных разрядов после запятой |
| X / x | Шестнадцатеричный формат числа |
Для форматирования строки, содержащей целое число, необходимо использовать паттерн d.
Отформатировать строку можно сразу во время вывода на консоль, функцией Console.Write()/Console.WriteLine():
int num = 125
Console.Write ("0:d4", num) //вывод: 0125
или
int num = 25
Console.Write ("0:d4", num) //вывод: 0025
Пример:
static void Main(string[] args)
{
int maxnum = 150;
string FormatPattern = "{0:d" +
CountDigitsRec(maxnum).ToString() + "}";
for (int i = 0; i <= maxnum; i++)
{
Console.WriteLine(FormatPattern, i);
}
Console.WriteLine("Press Enter...");
Console.ReadLine();
}
Функция String.Format() может сделать аналогичную операцию, но отличается тем, что вывод функции можно сохранить в строковую переменную и использовать далее, а не просто вывести на консоль.
Пример:
static void Main(string[] args)
{
int maxnum = 1150;
string FormatPattern = "{0:d" +
CountDigitsRec(maxnum).ToString() + "}";
string TempFile = Path.GetTempFileName();
string Result = "";
List<string> WriteList = new List<string>();
for (int i = 0; i <= maxnum; i++)
{
Result = String.Format(FormatPattern,i);
Console.WriteLine(Result);
WriteList.Add(Result);
}
File.WriteAllLines(TempFile, WriteList.ToArray());
Console.WriteLine("Test file: " + TempFile);
Console.WriteLine("Press Enter...");
Console.ReadLine();
}
В цикле результат работы функции String.Format() возвращается в переменную Result, значение которой выводится на консоль и сохраняется в List<string> WriteList для дальнейшей записи в файл.
Примечание: в источнике есть еще варианты форматирования строк, ознакомьтесь.
Накрымлся
Пример: «Ваш проект накрымлся кремлевской звездой!»
Накрымлось
Пример: «Всё общество поддержки Путина на Западе полностью накрымлось после нового расследования Bellingcat.»
В локальной сети
Стоит старинный комп,
Закрыт весь доступ,
Пароль висит большой на нем.
Сказать я пытался
Троянов нет на компе,
Но тут же раздался,
Ужасный голос в винде
Голос в Винде…
[Визг свиньи Касперского]
Мне больно видеть Интернет,
Скорей бы отключить вас всех.
Я очень много много лет
Мечтаю о крутом компе
Мне слишком тесно на XP
И я мечтаю об одном,
Скорей пароль свой поломать,
Проникнуть в какдый каждый комп!
Будь проклят каждый комп!
Был вирус в БИОС,
Крутой и жутко злой
Админ не понял
Как комп спасти от заразы той.
Админы не стали
Тогда харддиск форматить
Пароли поставив, решили пива попить,
И забухали…
Мне больно видеть Интернет,
Скорей бы отключить вас всех.
Я очень много много лет
Мечтаю о крутом компе
Мне слишком тесно на XP
И я мечтаю об одном,
Скорей пароль свой поломать,
Проникнуть в какдый каждый комп!
Будь проклят каждый комп!
И это место стороной
Обходит нетский люд,
И антивирусы твердят —
Там вирусы живут!