HTML и CSS мелочи

Простой двухколоночный макет на DIV’ах

HTML
CSS
Скачать

Таблица с помощью DIV

HTML
CSS
Скачать

Ограничение размера изображения в CSS

Абсолютный размер в пикселях
По размеру DIV’а
Пример

Источники

Киберфорум
Кот из примера
Еще какие-то

L.S.

Про «Жизнь»

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

LIVE.PAS
Архив с экзешником и исходником

C# Пример Charmap (таблицы символов) для различных кодировок.

Очередное студенческое задание, да. Причем опять, то ли препод не совсем адекватный, то ли студент, то ли мы дебилы и не видим чего-то лежащего на поверхности. Потому что «совсем для всех» кодировок, поддерживаемых .NET оно не получается.

Для начала, пришлось задачу все-таки глобально поделить на 3 больших части:
— кодировки однобайтовые (Windows 1251, DOS 866 и т.д.)
— кодировка Unicode
— кодировки многобайтовые, но не Unicode (всякие там японские, китайские и прочие).

Однобайтовые

С ними проще всего. Достаточно перебрать все символы от 0 до 255, перекодировать их последовательно в UTF-16 стандартной функцией класса Encoding и вывести на экран.

Encoding enc = Encoding.GetEncoding(CP);
for (int i = 0; i < 256; i++)
{
	string sChr = enc.GetString(new byte[] { (byte)i });
	//...
}

Отделить их от остальных тоже просто, у объекта Encoding есть свойство IsSingleByte

Unicode

С этим тоже особой сложности нет, весь стандарт открытый, можно взять список диапазонов Юникода прямо с официального сайта. Разобрать, залить в ComboBox и отображать кусками, для больших кусков сделать постраничное листание.

Главная проблема была побороть глюк с отображением символа с кодом > FFFFh Копия, из-за чего пришлось использовать RichTextBox и периодически пересчитывать ему размер в зависимости от используемого шрифта и символа, а также в нужных местах перерисовывать таблицу, чтоб та не расползалась.

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

Чтоб ради задания не загадить систему шрифтами, пришлось предусмотреть возможность грузить их из файлов, а тут поджидал уже другой глюк, на этот раз Framework'а Копия.

В общем, процентов 90 кода (да и процессорного времени) уходит на возню со шрифтами и отрисовку таблицы.

Отделить варианты кодирования Unicode от других кодовых страниц тоже несложно, благо всего этих вариантов не так много (UTF16 LE/BE, UTF32 LE/BE, UTF8 и UTF7).

public static bool IsUnicode(int CodePage)
        {

            if (CodePage == 65001 ||
                CodePage == 65000 ||
                CodePage == 1201 ||
                CodePage == 1200 ||
                CodePage == 12000 ||
                CodePage == 12001)
                return true;
            else return false;            
        }


А получить конкретный символ можно вот таким способом:

if ((num >= 0x00d800) && (num <= 0x00dfff))
{
	st = Convert.ToString((char)num);
}
else
{
	st = char.ConvertFromUtf32(num); 
}


if ((num >= 0x00d800) && (num <= 0x00dfff)) - это чтобы не попасть в диапазоны суррогатов, но все-таки на их месте что-то отображать (в шрифтах там обычно пустые символы или знаки ?), а char.ConvertFromUtf32() при попадании в диапазон суррогатов свалится с ошибкой.

Остальные многобайтные кодировки

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

Нет, был, конечно, вариант простого перебора всех возможных вариантов. Максимальное количество байт, необходимых для кодирования символа в указанной кодировке можно получить с помощью Encoding.GetEncoding(cp).GetMaxByteCount(1), но перебрать все возможные значения, например, для массива размером уже в 4 байта, перебирая его, например, так, да еще и фильтруя все лишнее, непомерно долго.

В общем, вроде бы того, что сделали, оказалось достаточно.
Пришлось студенту писать пояснительную записку с источниками 🙂

Исходник примера на GitHub
Скачать

Leha S, NKT

C# Ошибка «Попытка чтения или записи в защищенную память» при работе со шрифтами из PrivateFontCollection

Понадобилось грузить TTF-шрифты из файлов, что делается с помощью PrivateFontCollection.AddFontFile(FileName). И, внезапно, стал проявляться плавающий глюк, возникающий, если периодически пересоздавать объект PrivateFontCollection. Например, при попытке сделать MeasureString(Text, LoadedFont).ToSize(), программа стала вываливаться с ошибкой "Попытка чтения или записи в защищенную память".

Пишут, что это глюк Framework’а и толковое решение только одно, создавать PrivateFontCollection один раз при запуске программы, например, в каком-нибудь статическом классе, и больше ее не трогать. Т.е. подгружать новые шрифты можно, а пересоздавать коллекцию не надо.
Минус решения — можно загадить память подгружаемыми шрифтами, если подгрузить много файлов. Но лучше пока ничего не нашел.

В принципе, можно создать вот такой статический класс, который будет подгружать шрифт в коллекцию, и хранить в Dictionary сопоставление между именем файла и шрифтом в коллекции. Если файл еще не был загружен — подгружать, если был, возвращать позицию в коллекции.

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

На Cyberforum’е тоже пока ничего более дельного не предложили.

C# Отображение суррогатной пары (символа с кодом >FFFF)

Известно, что внутренний формат строк в .NET — UTF16, что значит, что символы из основной многоязыковой плоскости (BMP) Unicode, т.е. с кодом меньше FFFF кодируются одним машинным словом, а остальные символы — двумя, одно из которых т.н. суррогат.

Так вот, как оказалось, с отображением суррогатных пар может возникнуть проблема. Контролы Windows Forms могут воспринимать символ с кодом >FFFF не как один символ, как должно быть, а как два. Для примера пробуем отобразить анатолийский иероглиф

с кодом 0x14476

Как видно, TextBox и Label воспринимают символ, как два символа, и, соответственно, его не отображают, а RichTextBox видит, что это один символ, но не отображает его, даже при правильно заданном шрифте.
MessageBox также отображает символ не как один, а как два:

Устранение проблемы с RichTextBox

Для устранения проблемы с RichTextBox достаточно задать нужный шрифт перед тем, как присвоить свойству Text нужные символы.

         int Code = 0x14476; //анатолийский иероглиф        
        Font AnFont = new Font("Anatolian", 24, FontStyle.Regular,
 GraphicsUnit.Pixel, 1);
        private void Form1_Load(object sender, EventArgs e)
        {
            string strSP = char.ConvertFromUtf32(Code);
            
            lblTest.Font = AnFont;
            txtTest.Font = AnFont;                        
            lblFont.Text = AnFont.FontFamily.Name;
            rtbTest.Font = AnFont;

            lblTest.Text = strSP;
            txtTest.Text = strSP;
            rtbTest.Text = strSP;
        }

PictureBox также отрисовывает нужный символ без проблем:

Корень проблемы

А корень проблемы кроется не в C#, .NET и компонентах Windows Forms, а в самой Windows. Пакет обновления SP1 для Windows 7 решает проблему полностью.

Наиболее универсальное решение

Наиболее универсальным решением является использование RichTextBox для работы с такими символами, во всяком случае, это работает даже для Windows XP, для которой ждать патчей, понятное дело, не приходится.
Главное, не забывать про то, что шрифт надо задавать до вставки/присвоения символа.

Обсуждение на Киберфоруме Копия

Пример
Пример на GitHub

Шрифты поддерживающие весь Unicode-диапазон

Или, во всяком случае, большинство символов.

TWBh: шрифт, поддерживающий большинство символов Unicode
Дополнительно:
Композитный шрифт для BabelMap (TWBhBabelCompositeFont.xml)
Композитный шрифт для WPF (TWBh.CompositeFont)
Композитный шрифт для примера простой Charmap для Unicode и однобайтных кодировок (babel.cf)

Universalia самый распространенный максимально поддерживающий Unicode набор шрифтов Ссылка Magnet

Набор шрифтов с почти полной поддержкой Unicode, собранный неизвестным пользователем интернета Что и как поддердживает каждый файл шрифта, есть описание в тектовом файле. Плюс есть композитный шрифт для тестовой программы.

Программа BabelMap Копия
Самый совершенный Charmap для Unicode, поддерживает композитные шрифты и все диапазоны Unicode

За кадром.

Или будни редакции.
Главред все переживал, не выглядит ли он на «свои почти 40 лет» и не сильно ли у него «насекомная (рептильная) мордочка», несмотря на все-таки серьезность акции и вполне ответственное, как наше всехное, так и его личное отношение. Не смог побороть глупую улыбку в камеру, как мы его просили.
«Ну не могу я, когда фоткают, не улыбаться, даже на загран 7 раз фотографировали», сказал редактор.
-А как ты, сишарпер хренов, по скайпу выступаешь.
-У меня камера хреновая, там хрен чо хрен разглядишь. И сишарп вообще не гадание на Таро, там лицо видеть не обязательно.

Ктулху с ним, как получилось, так и ладно.

БрокаЦентр

Нашли еще две темы. По-моему круто! Хотя мечтаю познакомить вас с их первым альбомом, на котором вполне себе панковский гражданско-оборонно-гаражный звук. Надеюсь, архивы Леши не оскудели, и в ближайшее время, таки да.


БрокаЦентр — СОН


БрокаЦентр — Терпи, ведь это любовь
Вторая песня, это заодно запоздалое поздравление с 8 марта всем парням, которым достались курицы или еще какие зверюшки, вместо женщин. Потому что их с 8 марта поздравлять и надо на самом деле. Такие тян, действительно, не нужны. Но многие парни, к сожалению, тетерева и фазаны, хотя думают, что львы.
Как-то так. Удачи!

BrokaCenter — INSIDE

Ну раз уж у нас сегодня вечер панковско-рокерских воспоминаний, навеянный приездом Леши, сегодняшним содержимым ленты, и вообще, каким-то анархическим настроением, то вот вам еще немного кондопожского панка.

Группа БрокаЦентр была в Кондопоге самой долгоиграющей, если исключить пипец какую древнюю группу «Всё» и Германа Фирсова, который вообще один из первых и старейших рок-музыкантов Карелии, России и СССР.

Больше БЦ на нас в нежном возрасте (включая половину ОИМ, и всю российскую часть редакции), наверное повлияли только LovinGod и группа Purgen.

Это одна из последних известных записей. Попробуем найти все и выложить в сеть. Даже введу новый тег.

Прямая ссылка

Гаражный панк

Репетиция кондопожской группы «Позитив», 200█ год. Эх, как все было круто и мило, и отрываться можно было до утра, благо бешеный принтер еще не был настолько бешеным. Ну и Леше отдельное с кисточкой, хз в каких архивах откопавшему запись.

ГЕОРГИЕВСКАЯ ЧЛЕНТОЧКА

Уберите от экрана женщин, беременных детей и обязательно покажите ватникам!

Это меня так замечательно поздравили с 23 февраля. Такой вот дерьмоядреной бiмбой, способной порвать гигаватное количество пердаков!

Алсо, у нас была георгиевская туаленточка, она менее натуралистичная, но не менее разжигающая.

C# Перевод чисел между системами счисления стандартной функцией класса Convert

Да, совсем забыл выложить исходник, спасибо, что напомнили.
Перевести число в/из десятичной в 2, 8, и 16-ричную систему можно с помощью стандартной функции класса Convert
Convert.ToInt64(s, From)
s — строка, содержащая число.
From — основание системы счисления.

Обратное преобразование:
Convert.ToString(n, To)
n — число
To — основание системы счисления.
На выходе будет строка

В примере еще показал, как ограничить ввод в текстовое поле, чтоб можно было вводить только определенные символы, и добавил отображение символа по его коду (в однобайтной кодировке, для Unicode будет погода на Марсе). Числа можно вводить через пробел.

Скачать исходник
Этот и другие примеры на Github

Иконка для своего приложения Windows. Стандартные размеры иконок

И как сделать ICO файл с несколькими изображениями
Спрашивали, как надо правильно делать иконку для своего Windows-приложения.

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

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

То же самое касается и иконки для формы приложения, хотя на самой форме корректно будет отображаться и маленькая иконка 16×16 пикселей, при переключении по Alt+Tab уже будет заметно и некрасиво.


Рисовать, то лучше в каком-нибудь векторном редакторе, чтоб было потом проще создать несколько растровых изображений разных размеров. Мы, например, пользуемся Inkscape, он простой, бесплатный и для простых изображений вполне подойдет.

Еще момент — изображение должно, очевидно, быть квадратным.

Стандартные размеры иконок приложения

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

— 16×16
— 32×32
— 48×48
— 256×256

Где-то читал рекомендацию, что нужен значок еще 128×128, но на практике пока не заметил, чтобы его наличие было критично.
Для Windows 7 и выше обязательно нужен значок 48×48
Обратите внимание, что размер значка рабочего стола по умолчанию в XP был 32×32, а в Windows 7 — 48×48

В значки для формы, а не для иконки экзешника, лучше не включать значок 256×256 в том случае, если приложение должно работать на XP.
В остальных случаях XP игнорирует значок 256×256, но ничего плохого при этом не происходит, а вот если такой значок используется для формы, то приложение может упасть.

Сборка нескольких изображений в одну иконку

Известно, что в одном файле ICO могут храниться несколько изображений разных размеров. Для сборки есть много приложений и онлайн-сервисов, но мы пользуемся простой бесплатной программкой icon sushi Копия

Пользоваться очень просто.
1. Открываем все нужные изображения
2. Выделяем их в окне программы:

3. Сохраняем иконку (File — Save as Multiple Icon)

ЗЫ. Чтоб два раза не вставать.
Кто-то просил картинки-кнопочки от XuliOrganizzer’а
Так Леша выложил картинки на Github

Текстовый редактор FOTON для DOS

Охрененная софтина была для 1989 года.
Макросы, возможность компиляции программ, не выходя из бассейна из редактора и множество передовых фишек для того времени.

А самое главное, в нем есть одна штука, которой до сей поры нет ни в одном более современном текстовом редакторе. Выделение прямоугольных блоков текста! Которые можно переносить, вставлять и т.д. Вот нет такого больше нигде и все, а надо иногда. Причем настолько надо, что периодически пользуюсь сим олдовым произведением программерского искусства. Хоть сам бери и пиши редактор с подобной функцией, блин.
UPD.
Есть, оказывается. Не знаю насчет vim и emacs, правда, но Notepad++ делает как надо. И Far (по Аlt+стрелки). А вот Студия делает, но не совсем так.


Его собственная внутренняя демка:

https://youtu.be/vc5ONlBnPrg
Скачать

Colors. Утилита для подбора цвета фона и текста в Windows Forms

Опять студенты приходили, на этот раз с мелким заданием, перечислить все названия цветов в Windows Forms. Заодно уж сделал из этого задания утилитку, чтобы подбирать цвет символов на фоне в Windows Forms. Довел задание, так сказать, до логического конца. В общем, кто не успел сегодня на скайп-чатик, где я всякие мелочи объяснял и делал, ходите на Гитхаб, скачивайте там. Только не забудьте хоть что-нибудь переделать, а то преподы будут ругаться.

Принцип очень простой. Все названия цветов есть в перечислении KnownColor, а в классе Enum есть метод GetNames, который позволяет получить строковый массив с именами элементов перечисления.

string[] ColorNames = Enum.GetNames(typeof(KnownColor));

Вытащить конкретное значение элемента перечисления по его имени (если оно в виде строки) можно с помощью Enum.Parse

KnownColor knownColor =
                    (KnownColor)Enum.Parse(typeof(KnownColor), n);


n — строковая переменная с именем.

Все остальное стандартно, заполняем в цикле GridView и красим ячейки.

Ну и в довесок в программе есть пример использования ColorDialog и получение информации о выбранном в диалоге цвете.

И элемента управления TrackBar для выбора цвета и фона по RGB.

Пользуйтесь на здоровье.

Исходник:
На Гитхабе
На Mega.NZ
Cкомпилированная программка

ЗЫ. Спасибо, Леха, огромное за наводку на GitEve, и удобно, можно всё мышей тыкать, не набивать километры команд в консоли, и идет на всех ОС. Все-таки с этим вашим гитом через консоль несколько неудобно работать, или я пока еще не привык.

Игра «Жизнь» на Turbo Pascal for DOS

От ведь блин, нашел лохматого возраста исходник игры «Жизнь». Писалось с другом на Turbo Pascal для DOS в лохматых годах, когда еще в школе учился.

Написано, конечно, криво, косо, неоптимизированно и все это жутко тормозит, особенно «редактирование» картинки. Но все равно круто, аж детство вспомнилось, когда не пил, не курил, мониторы были зеленее, компьютеры медленнее, Ельцин президент, а я хотел вступить в КПРФ.


https://youtu.be/W7VRyfoaOkg
Еще видео

Думал даже переписать сие произведение, Free Pascal вроде умеет в графику. Может и займусь, или найду еще более крутой исходник шизово-психоделических трехмерных графиков и сделаю из него заставку на Юнити, все равно давно хотел попробовать что-нибудь написать, чтоб с триде, да в голову ничего не приходило.
А гадский Ютуб почему-то пакостит в видео, во всяком случае, в эти. На локальной машине все четко видно, а публикуешь, как-то лажовенько выглядит, ерунда какая-то непонятная с ютубом.

Исходник
Скачать

Патчи от WannaCry, NotPetya и скрытых майнеров для Windows XP

Пришлось столкнуться, слава Ктулху не с самими вирями и майнерами, но с незаделанными дырками. Есть два пути обновить пожилую ОС, протестировать на наличие уязвимости Eternal Blue и заткнуть только ее, или сделать кумулятивное обновление.

Тестирование

Протестировать наличие дыры можно с помощью программы Eternal Blues. Пользоваться очень просто, вводим диапазон IP в локальной сети и жмем кнопку SCAN. Где в графе Vulnerable? указано YES, там дырка не заделана.

Заделываем

Качаем официальные патчи от MS

KB4012583
KB4012598

Устанавливаем, перезагружаемся, и проверяем результат программой Eternal Blues

Кумулятивное обновление

Вот тут в прямом смысле слава Украине, а точнее конкретному украинцу под именем Simplix, который заботливо собрал все обновления со времен выхода SP3 в одну кучу, протестировал и выложил в одном пакете.

Скачать можно с его сайта simplix

Я поставил сразу тестовое обновление, но вы можете скачать то, которое уже полностью протестировано, хотя и тестовое вполне себе зашло. 5 машин и неделя времени, полет нормальный.

Установка детально описана на его же форуме.

Большой плюс для виндопользователей пиратской винды, если таковые найдутся :), после обновлений активация не слетает.

Копии на всякий случай

Eternal Blues
KB4012583 и KB4012598
UpdatePackLive-19.11.15 (если запускает пакет обновления с ключом /ie8, обновится IE до версии 8)

Подводный камень при чтении файла с помощью File.ReadAllText

Иногда проще прочитать файл, как текстовый в однобайтовой кодировке, чтобы что-нибудь там поделать с помощью стандартных string.Replace/string.Remove и т.д., иногда даже если файл не совсем текстовый, потому что таких же удобных функций для работы с массивом байт нет (или я не нашел).
Это, наверняка, адский быдлокод, но все-таки вполне альтернатива изобретению совсем уж дикого велосипеда.

А у меня речь шла о текстовых файлах, правда, неизвестно в какой кодировке, и символах, которые нужно искать/менять. Символы от кодировки не зависели, посему любой файл можно было рассматривать, как текстовый, в любой однобайтовой кодировке. Главное, в какой кодировке открыл, в той же потом и сохранить.
Так вот File.ReadAllText пытается автоматически определить кодировку файла на основе наличия меток порядка следования байтов и принудительная установка кодировки не помогает. Если в файле встретился зловредный BOM, то ReadAllText наплюет на твои указания кодировки с высокой колокольни и откроет в той, на которую ему BOM указывает, а при сохранении, соответственно, будет глюк и текст превратится в тыкву.

Беда, конечно, решается стандартно, чтением файла с помощью StreamReader и записью с помощью StreamWriter, которые себе такой самодеятельности не позволяют, но «осадочек остался».

Пример
Скачать