
Открытый отчет 2017-2018
Итак, на жизнь сайту надо 60 $ в год, по итогам года собрано 50 $, 10 остались должны, но это некритично.
Пришлось урезать расходы на админов, занимающихся бэкендом и дизайном, поэтому Нуген и Асперг более не являются сотрудниками редакции.
Состав редакции:
Администратор, директор проекта: Алексей Тихонов, (aka Leha Silent) Костомукша/Tampere
Главный редактор: Анатолий Перец, (aka PunkArr[]) СПб/Кондопога
Заместитель главного редактора: Lina Lukina (Keronen) (aka Lin’Ka) Tampere
В команду пришел новый человек, консультант по IT: N.K.T, aka Nikita N. (MSK/SPb/PTZ)
Супермолния над Кондопогой
Байка про порчу.
Или о том, как я стал колдуномЪ.
В свои 17 лет я действительно интересовался непознанным, гадал на картах знакомым (лет с 12), и правда верил в колдовство (и сейчас верю, с некоторыми поправками).
Надо допустить небольшую ремарку, что в школе я был почти круглый отличник, исключая математику (по ней совокупно натянули итоговую 4, а так я ее знаю на 2 с плюсом), и ИЗО (по которому у меня была твердая двойка, которую переправили на тройку, благодаря влиянию отца-военного). Но дело не в этом.
В школе я был няшным мальчиком, вежливым и интеллигентным. Участвовал в конференциях и олимпиадах, где периодически занимал призовые места (это важно).
Но вот, подошел 11 класс, и я решил поступить на физтех. В военное училище не взяли по здоровью, а на биофак, куда я хотел и мог, жутко отговаривала вся семья (идиоты, нахуй я их послушал). Мои знания в физике были довольно малы, потому мама отсыпала мне бабла на репетитора. Поскольку, роль играло бабло, то пропускать репетитора можно было только в случае смерти.
Итак, суть. Последним уроком шла история, и тут нашему директору пришла в голову мысль припахать меня на спонсорский КВН. Тогда такое дело было в почете — для спонсоров школы проводились показушные мероприятия. А мне надо было идти к репетитору (Бабло!). Тем более все эти КВН-ы мне нахуй не вперлись.
Далее рассказываю в лицах (И — историчка, пламенная едроска, и Я — это я):
И: Васисуалий Пропердыщев, вас выбрали от класса на КВН.
Я: Я не могу участвовать в КВН, у меня репетитор по физике
И: Вы можете пропустить занятие, это ЧЕСТЬ ШКОЛЫ!
Я: За это занятие заплачены деньги, я не могу его пропустить.
И: Тебе что, ДЕНЬГИ важнее ШКОЛЫ?
Я: Да, важнее, их зарабатывали мои родители.
Я: И вообще, я столько в конференциях и олимпиадах участвовал, что, может быть, Вы освободите меня от участия в этом КВН?
И: Олимпиады и конференции — это твое личное дело! Они школе не нужны!
И тут у меня, простите, бомбануло. В нашей школе было очень плохо с информатикой, и я ее изучал, по протекции мэрии, в Лицее, где были относительно нормальные компы (Mac LC 2/3), и преподавали мне довольно крутые женщины, я начал делать даже собственные сайты на Народе, web 1.0. Сделал сайты паре магазинов (за что меня отблагодарили фотографией молнии), и панковской группе (но это позже описываемых событий).
Я: Ох, раз они вам не нужны, тогда я на городской конференции буду выступать за Лицей!
И тут у К█████й, исторички, женщины, внешностью и размерами похожей на йоркширского терьера, началась форменная истерика. Она обозвала меня фашистом (хорошо, что Правого Сектора тогда не было), я ей ответил, «а вы не видите, что я скинхед», и провел рукой по своей шикарной шевелюре, которую не стригли лет с 14.
Первая часть истории закончилась тем, что К█████а убежала стучать на меня директору, класс с которым я никогда не дружил, высказал мне «фи», а я ушел учить физику.
Потом был зачет по истории, и мстительная собачка меня таки завалила, на что я забил, хотя пытался ситуацию исправить, но собачка была непреклонна, и на исправления, я, либо «опаздывал», либо «ее не было».
Сижу я такой грустный в коридоре, и ко мне подходит моя классная (действительно классная) руководительница.
КР: У тебя двойка по истории за четверть, может я с К█████й поговорю?
Я: █.█. Не надо, я (наматываю на палец цепочку с перевернутым крестом) сам с ней разберусь, на нее порчу наведу.
На следующий день «собачка» попала в больницу с осложнением после гриппа.
Хотя я ничего даже не колдовал, просто пошутил. Но интересно, что зачет по истории вдруг был исправлен автоматически. Т.е. я пришел исправлять, а «собачка» мне говорит, что все уже исправлено.
«Осиное гнездо» — партия училок, которые держали всю школу (туда входила «собачка», химичка, информатичка, а шестерками у них были две учительницы биологии), стало ко мне относиться хорошо. И химичка — главная оса в осином гнезде, с перепугу даже отказалась со мной фотографироваться на выпускном.
Кстати, химичка, когда-то, как потом выяснилось, пыталась увести мужа у моей тетушки, которую в селе Г██████ро все считали ведьмой. Но не получилось. Подробностям этой истории должна быть посвящена отдельная статья.
Вот такие вот дела!
C#, Симпатичное окошко «О программе»

Можно сказать, по многочисленным просьбам зрителей. Итак, спрашивали, как устроено в наших программах окошко «О программе» с «эффектом титров». Т.е. список разработчиков и прочее медленно выплывает снизу, проползает по форме и исчезает наверху, часть всплывающих строк останавливается в центре формы, в конце выплывает слоган, так же останавливающийся на некоторое время в центре.
На самом деле, форма была устроена ужасно, написана совсем другими людьми для другого проекта, а у нас кочевала из программы в программу без особых изменений, строки добавлялись в 3 ArrayList
в коде формы, в функции рисования были какие-то непонятные жестко заданные поправочные коэффициенты, подобранные на глаз, и т.д.
Решили немного поправить и все переделать. Не знаю, насколько получилось лучше, но понятнее и универсальней точно. Далее будет не столько код с пояснениями, сколько попытка показать, как мы рассуждали, переделывая форму.
Сначала надо определить с какими данными мы будем работать. В первую очередь, мы выводим набор строк, т.е. первая сущность это строка, у строки может быть задан шрифт и цвет текста, и, собственно, содержимое строки — это будут явные параметры сущности. В процессе добавился еще один, неявный параметр — номер сцены
Шрифт целесообразно выделить в отдельную сущность. Во-первых, все используемые шрифты желательно загрузить и сформировать до вывода строк, во-вторых, у шрифта куча своих параметров, и задавать их для каждой отдельной строки неудобно.
Параметры шрифта это FontFamily (Arial, Times New Roman и т.д.), размер и начертание или стиль (жирный, курсив, подчеркнутый, зачеркнутый, или все вместе). Для того, чтобы связать шрифт со строкой, пришлось добавить еще один параметр внутреннее имя, по которому программа будет узнавать, какой шрифт к какой строке применить.
Последняя сущность это группа строк, или сцена, поскольку строки выводятся группами (см. анимацию). К сцене мы приписали следующие параметры: цвет фона, скорость прокрутки строк (технически задается как таймаут таймера прорисовки) и время паузы (для эффекта остановки группы строк посередине формы, см. анимацию). Неявным параметром будет номер, его зададим позже автоматически, а также высота всех строк сцены и их количество.
Негоже задавать эту кучу параметров непосредственно в коде, поэтому пришлось подумать над форматом данных. Решено было хранить описание строк, шрифтов и сцен в виде простого текстового файла следующего формата:
...
команда;параметр1;параметр2;параметр3 [...]
команда;параметр1;параметр2;параметр3 [...]
команда;параметр1;параметр2;параметр3 [...]
...
Формат команд следующий (в квадратных скобках необязательные параметры):
Шрифт:
addfont; FontFamily; Размер (pt, float); [Стиль]; Внутреннее_имя
Например:
addfont; Arial;9;Bold;Group;
addfont; Microsoft Sans Serif;8;;Names;
addfont; Arial;14;Bold italic;Slogan;
Строка:
addstring; Строка; [Имя_шрифта]; [цвет_текста];
Например:
addstring;Make code, not war! C# like you.;Slogan;FF FF 00;
Сцена:
scene; [цвет_фона];[скорость_таймера_прорисовки ms];[пауза ms]
Например:
scene;20;3000;
Цвет текста задается в шестнадцатеричном формате через пробел(ы): R G B [Alpha]
Например:
FF FF 00
— желтый
FF 00 00 80
— красный с прозрачностью
Начертания (стили) шрифта перечисляются через пробел(ы), от регистра не зависят.
Шрифты:
Генерируются при анализе «скрипта», и помещаются в приватный Dictionary
, где строковый ключ — заданное «внутреннее имя» шрифта.
Строка:
Текст и параметры хранятся в специальной структуре:
private struct AboutString { public string Text; public string FontName; public Color TextColor; public int SceneNumber; }
А все строки в private List
Сцена:
Для описания сцены так же создана структура:
private struct AboutScene { public int PauseTimeout; public int StringsHeight; public int StringsCount; public Color BackColor; public int DrawTimeout; }
И описания сцен так же хранятся в private List
— последняя точка с запятой является необязательной
— пустые строки, или строки, содержащие только пробельные символы, пропускаются
— команды приводятся к нижнему регистру (т.е. они регистронезависимы)
— есть возможность оставить однострочный комментарий, начинающейся с ~ (тильды). Все, что после знака ~ считается комментарием и пропускается при анализе «скрипта».
— если первая (нулевая) сцена явно не определена, то создается сцена с параметрами по умолчанию
Команды, благо их немного, последовательно анализируются с помощью конструкции switch/case
и передаются в функции добавления шрифта, строк, или сцены, где анализируются далее.
Параметры и команда разбираются с помощью string.split(';');
Размер шрифта должен быть float
, поэтому надо сделать функцию-обертку над Convert, так, как я писал об этом ранее:
private float ConvertToFloat(string Number) { NumberFormatInfo format = new NumberFormatInfo(); format.NumberDecimalSeparator = "."; return (float)Convert.ToDouble(Number, format); }
Некоторые параметры передаются через пробел (значения RGBA цвета, или стили шрифта). Нужна функция, которая будет избавляться от дублирующих пробелов, поскольку лишний пробел поставить легко, а вот вылавливать его потом неприятно:
private string RemoveDupSpaces(string s) { while (s.Contains(" ")) { s = s.Replace(" ", ""); } return s; }
Естественно, весь функционал не стоит реализовывать прямо на форме, потому вся работа вынесена в отдельный класс AboutDrawer
, который парсит переданный скрипт и занимается отрисовкой строк на форме.
На форме строки отображаются в компоненте PictureBox
, который передается в конструктор класса. Конструктор также устанавливает некоторые параметры по умолчанию.
Поскольку, класс все равно работает с компонентами формы, то спокойно подключаем пространство имен System.Windows.Forms
, и пользуемся всеми его возможностями. Например, в классе создаются два таймера (Timer
). Внутри обработчика события Tick
одного из них, происходит отрисовка, а другой используется для эффекта паузы.
В классе созданы открытые свойства для установки цвета фона, цвета текста по умолчанию, и размера расстояния между строк.
Подробнее ознакомиться с кодом примера можно на Github: