воскресенье, 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.

понедельник, 3 января 2011 г.

Кое-что из твиков Windows 7

Папка гаджетов

Гаджеты в Windows 7 расположены в папке C:\Program Files\Windows Sidebar\Gadgets и в папке C:\Program Files\Windows Sidebar\Shared Gadgets.

Дополнительные темы и обои для рабочего стола

Дополнительные темы и обои для рабстола находятся в скрытой папке - C:\Windows\Globalization\MCT

Взято отсюда

Как поменять экран приветствия в Windows 7?

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

1. Необходимо проверить включена ли данная опция или нет. Для этого необходимо зайти в реестр, в раздел HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background

и проверить наличие параметра OEMBackground, если данного параметра нет, то надо создать DWORD (32 бита) с именем OEMBackground и присвоить значение 1, этим мы включим возможность изменения рисунка.

2. Далее как вы это сделаете, перейдите в папку C:\Windows\System32\oobe\info\backgrounds, возможно папка backgrounds может отсутствовать, тогда просто ее необходимо создать.

В эту папку скопируйте нужную Вам картинку и назовите её backgroundDefault.jpg

Обратите внимание, что файлы должны быть jpg-типа и быть меньше 256КБ.

Если фон загрузить нельзя (например, он слишком большой, или имеет неверное отношение ширины к высоте и т.п.), то загружается рисунок из библиотеки imagesres.dll.

Взято отсюда.

Установка общего принтера, подключенного к компьютеру под Windows XP


Оказывается, нужно при установке ОБЩЕГО принтера, находящегося подключенным на другом компе, выбрать установку ЛОКАЛЬНОГО принтера, но в качестве порта выбрать Local Port, в следующем окошке (где название порта) в качестве имени указать сетевой адрес компа, к которому он подключен и имя принтера в сети (как его определяет сам Windows 7 Ultimate x64) в следующем виде:

\\IP-адрес компа\имя принтера в сети.

В моем случае это было так:

\\192.168.1.5\epsonal-lpt

где 192.168.... - явно заданный адрес компа в моей сетке

epsonal-lpt - название принтера в сетке(как его определяет Win7 при попытке автоматической установки сетевого принтера).

Взято отсюда.

Как показала практика, вместо явного IP-адреса можно использовать символическое имя компьютера. Т.е \\MyComp\epsonal-lpt.

Автозагрузка программ


При каждой перезагрузке Windows NT приложение может запускаться из следующих мест:

1. Из папки Автозагрузка (Startup) для текущего пользователя и всей группы пользователей.

2. Из реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows

3. Из строк run и load файла %systemroot%\win.ini


Продолжение следует...

понедельник, 4 октября 2010 г.

Administrative share в Windows 7

Потребовалось потратить половину дня что бы найти разрешение административной шары в Windows 7 (оно же применимо и к Vista).

Hive: HKEY_LOCAL_MACHINE
Key: Software\Microsoft\Windows\CurrentVersion\Policies\System
Name: LocalAccountTokenFilterPolicy
Data Type: REG_DWORD
Value: 1


Взято отсюда: http://en.wikipedia.org/wiki/Administrative_share