среда, 11 января 2017 г.

Добавление шрифта для окна консоли

Оригинальная статья: https://support.microsoft.com/en-us/kb/247815
Article ID: 247815 - Last Review: 12/05/2015 17:45:43 - Revision: 2.3

Шрифты должны удовлетворять следующим условиям, чтобы быть доступными в окне сеанса командной строки:
  • Шрифт должен быть моноширинным.
  • Шрифт не может быть наклонным.
  • Шрифт не может иметь отрицательные значения свойств A или C.
  • Если шрифт TrueType, он должен быть FF_MODERN.
  • Если он не является шрифтом TrueType, он должен быть OEM_CHARSET.
Дополнительные критерии для азиатских установок:
  • Если он не является шрифтом TrueType, имя шрифта должен быть «Терминал».
  • Если шрифт TrueType азиатских языков, он также должен быть набор знаков азиатских языков.
В Windows 2000 установка Console Fonts больше автоматизирована. Это было сделано для увуличения стабильности работы окна консоли в многоязычных средах. Но на свой страх и риск эту задачу можно решить, добавив в реестр запись для определения шрифта для консоли.


В раздел реестра:


HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont

добавьте строковый параметр (String Value)

Name = 00

Data = "Название шрифта" (без "")

Имя должно быть увеличено на "0" для каждого дополнительного шрифта. Значение ключа должно соответствовать названию шрифта в разделе реестра:


HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Fonts 

Применимо к:
Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional Edition, Microsoft Windows 2000 Datacenter Server, Microsoft Windows NT Server 4.0 Standard Edition, Microsoft Windows NT Workstation 4.0 Developer Edition,
а также к
Windows 7 Ultimate, и, скорее всего, ко всем промежуточным версиям Windows.

среда, 23 марта 2016 г.

Тайна Тетриса

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

На моей памяти, этот же вопрос возникал и впоследствии. В головах совершенно различных людей, при игре в различные реализации Тетриса, в совершенно разной обстановке.

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

Интерес к этому вопросу подогревало то обстоятельство, что Алексей Пажитнов, изобретатель Тетриса, "занимался проблемами искусственного интеллекта и распознавания речи, а для обкатки идей применял головоломки, в том числе и классическое пентамино" (цитата из Википедии).

Наконец, по прошествии более 30 лет, у меня дошли руки сделать собственную реализацию Тетриса. Я нашёл эмулятор ДВК-2 для PC и тот самый Tetris, в который играл тогда. И сделал программу, максимально точно повторяющую внешний вид, управление и поведение той игры.

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


воскресенье, 26 января 2014 г.

Монитор

Дома 30" монитор с разрешением 2560х1600 - это круто! Сразу чувствуешь себя человеком.

понедельник, 18 февраля 2013 г.

Упаковка значения в C#

Обнаружил забавный эффект при упаковке значения. Берём пример из книги "C# 2010: ускоренный курс для профессионалов" Трея Нэша:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test03
{
    public interface IPrint
    {
        void Print();
    }

    public struct MyValue : IPrint
    {
        public int x;
        public void Print()
        {
            Console.WriteLine("{0}", x);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyValue myval = new MyValue();
            myval.x = 123;
            myval.Print();     // (1)

            IPrint printer = myval;
            myval.x = 456;
            myval.Print();     // (2)

            printer.Print();   // (3)
        }
    }
}


и вставляем в него две строчки, выделенные жирным шрифтом. Что получаем?

123
456
123

Выражения (1) и (2) работают как и ожидается. Выражение (3) вроде должно было бы также вывести 456, но выводит 123.

На мой взгляд, имеется в наличии источник трудноотлавливаемых ошибок. Значение в поле структуры было изменено, а интерфейс printer помнит старое значение, поскольку именно оно и было неявно упаковано при создании объекта-интерфейса. Теперь в программе значение (в смысле типа, т.е. struct) myval существует в двух ипостасях: со значением (в смысле содержимого) поля x, равным 123, и со значением 456. Что и подтверждает явная распаковка, которую можно добавить после (3):

            MyValue unpacked_myval = (MyValue)printer;
            unpacked_myval.Print();


Вот.

Тестировалось на MS VS 2008.

четверг, 6 сентября 2012 г.

Знакомство с Ruby. Первые впечатления

В последнее время в различных публикациях (обычно в Интернете) всё чаще стали мелькать названия языков программирования типа Haskell, Lua, Python, Erlang, Ruby и пр. Естественно мне захотелось посмотреть в каком направлении идёт развитие, и что ожидает программирование в ближайшем будущем.

Я остановился на Ruby. Выбор был сделан достаточно случайно, основываясь на характеристике из Википедии. Цитирую:

…динамический, рефлективный, интерпретируемый высокоуровневый язык программирования для быстрого и удобного объектно-ориентированного программирования. Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Ruby близок по особенностям синтаксиса к языкам Perl и Eiffel, по объектно-ориентированному подходу — к Smalltalk. Также некоторые черты языка взяты из Python, Lisp, Dylan и CLU.

Привлекло, что это язык, ориентированный на ООП, близок к Perl (который я неплохо знаю), а также, что он «некоторыми чертами» пересекается с тем же Питоном. И вообще, судя по статье, очень интересный язык.

Установочный пакет (Ruby ver. 1.9.3 под Windows) был взят с официального сайта Ruby, а в качестве основного путеводителя я выбрал книгу Д.Флэнаган, Ю.Мацумото «Язык программирования Ruby», поскольку лучше, чем автор, про язык всё равно никто не расскажет. Установка прошла без проблем, и я начал осваивать новый для себя язык.

Самое первое впечатление (или ожидание?) от языка, что это Perl с нормально организованным ООП: т.е. с системой классов, наследованием, инкапсуляцией и пр. Отсутствие нормального ООП мне всегда досаждало в Perl. Однако в последствии оказалось, что Ruby – это скорее нечто среднее между Perl и JavaScript с примесью ООП в духе C++. Что вроде бы и неплохо.

Второе ожидание было навеяно цитатой из письма Мацумото (из статьи в Википедии): «Я знал Perl (Perl4, а не Perl5), но он мне не нравился — был в нём некий привкус игрушечного языка (да и поныне есть)». Из этого я сделал вывод, что Ruby по сравнению с Perl, должен быть логически более стройным и более строгим. Пока это ожидание, мягко говоря, не оправдалось.

У меня сложилось впечатление, что Ruby не проектировался, как например Pascal или Modula. За основу был явно взят Perl, а потом разработка языка шла примерно так: это мне не нравится – выкинем, а вот такая штука мне нравится – вставим. Т.е. в итоге получился некий салат из различных концепций и возможностей, в котором «привкус игрушечного языка» чувствуется гораздо сильнее, чем в Perl.

Что мне сильно не понравилось в Ruby:
  • Отсутствие логической стройности синтаксиса. Синтаксис C, C++, Pascal – логичен, Ruby – нет. Один неправильно поставленный пробел изменяет семантику выражения – это нормально? Одну и ту же семантическую конструкцию можно написать несколькими разными способами.
  • Следствием предыдущего пункта является сложность языка. (Хотя одной из отправных точек при создании Ruby была именно простота языка.) Даже если взять вышеупомянутую книгу «Язык программирования Ruby», в ней 492 страницы. Обычно книги «Язык программирования <название_языка>» (книги начального уровня, т.е. описание языка) имеют 300, плюс минус 50 страниц среднего формата, включая оглавление, предметный указатель и описание грамматики языка в РБНФ. На моей памяти только два языка имели более объёмные описания: Ada и Prolog.
  • Избыточное количество методов для встроенных классов. Например, зачем классу Integer нужно иметь три различных итератора upto, downto и times, да еще и step, унаследованный от Numeric?
  • «Опасность» языка или, лучше сказать, незащищённость от ошибок. Про Perl кто-то из корифеев сказал, что только сумасшедший будет писать на Perl без прагмы strict и ключа –w в командной строке интерпретатора. Видимо на Ruby пишут исключительно сумасшедшие.

Впрочем, пока это только мои первые впечатления. Возможно, что при дальнейшем изучении языка я в чём-то изменю свою точку зрения.

вторник, 13 декабря 2011 г.

Прогресс... мля...

На одном гигабайте мозгов уже ни хера не работает (((

пятница, 10 июня 2011 г.

Autodesk Design Review 2012

Потребовалась мне смотрелка для файлов DWF. Причем даже не мне, а надо было отдать заказчику, что бы он мог посмотреть материалы, которые для него были подготовлены. Естественно полез в и-нет, дабы скачать сей ридер. Сайт Autodesk'а принял меня с распростертыми объятьями: "как раз у нас есть то, что тебе нужно!". И объем файла порадовал: 700 с чем-то килобайт. Отлично! Качаю. Запускаю инсталлятор. Оно лезет в и-нет за "redistributable C++" и еще за чем-то... Целая очередь. М-да... А если и-нета нет? С Адобовским PDF-ридером все как-то по-проще.

Но даже и при наличии и-нета у инсталлятора что-то там не сложилось то ли с прокси-сервером, то ли еще с чем-то, то ли объем для скачки слишком большой оказался... В общем прогресс-бар застыл где-то в районе 1%. По прошествии минут пяти процесс инсталляции пришлось принудительно завершить.

Но, думаю, не сошелся же свет клином на Autodesk? Видимо есть и независимые ридеры. После двух часов поисков в Google выяснилось, что все не так радужно. Огромное количество различных ссылок с различных же сайтов в итоге вели на сайт Autodesk'а, где я уже побывал. Однако мне таки удалось нарыть два freeware ридера для DWF от независимых производителей. К сожалению оба они выдали ошибку при попытке открыть мой файл DWF. Что-то типа "file not valid". Ну и в trash вас!

В итоге я опять вернулся на сайт Autodesk. После очень тщательного копания на сайте мне удалось обнаружить не-интернет версию дистрибутива. Скромного объема: 662 мегабайта. Делать нечего - скачал. Оказалось, что это самораспаковывающийся архив. Дистрибутив в распакованном виде занял 1.45 Гб.

При инсталляции мне было объявлено, что смотрелка DWF займет у меня на диске всего 180 Мб (это без просмотра DWG/DXF, для них надо еще 600 Мб).

Правда после всех этих приключений я увидел содержимое DWF во вполне приличном качестве. В итоге заказчику пришлось отдавать два CD: мегабайт 200 "по делу" и диск с Autodesk Design Review 2012.

Вот такой чудесный продукт от Autodesk.