воскресенье, 30 марта 2008 г.

How to crash MS C# Compiler :)

Посмотреть примеры можно тут. Хотя я сомневаюсь, что кому-то кроме индийцев и китайцев придет в голову такой код :)

суббота, 29 марта 2008 г.

Использование указателей в C#

"Бывают ситуации, хотя и очень редко, когда надо использовать библиотеку (*.dll) написанную скажем на Delphi. И если для использования этой библиотеки нету промежуточного COM объекта или иных достижений цивилизации, да если еще «коллеги» написали в качестве параметров указатели, то тогда эта заметка будет вам в помощь." читать дальше...

Авторское право

Вот тут человек задается целым рядом интересных вопросов касающихся блогов, технической реализации безотказной работы серверов и соблюдения авторского права с точки зрения закона.

Вопросы подняты очень интересные. Если честно - у меня даже идей нет, как на них можно ответить. Ну да я и не юрист - мне простительно :)

пятница, 28 марта 2008 г.

Немного про оптимизацию программ

Всем хорош .Net Framework, но есть у него некоторые особенности, не знание которых гарантированно приводит к падению производительности алгоритмов в два и более раза. Сегодня я расскажу о двух таких особенностях.

1. Debug.Write и Debug.WriteLine

Класс Debug является, пожалуй, одним из самых полезных для более-менее крупных программ. Удобен он тем, что нет необходимости как-то заботиться о сохранении отладочных данных – этим занимается сам дотнет. Главная особенность в том, что если проинициализирован «слушатель» отладочной информации – то эта информация гарантированно будет записана в файл в независимости от того в какой части (и в какой сборке) нашей программы будет вызвана функция записи.

Примерная схема работы с этим классом выглядит так:


            Encoding enc = System.Text.Encoding.GetEncoding(1251);
            FileStream fs = new FileStream("log.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            Debug.Listeners.Add(new TextWriterTraceListener(new StreamWriter(fs, enc)));
            Debug.AutoFlush = true;
            …
            …
            Debug.WriteLine(“Эта строка будет записана в файл log.txt”);
Однако, кроме положительных качеств, данный класс имеет и один, но очень большой, недостаток. А именно – при активной записи отладочных данных скорость выполнения программы резко падает. В частности, в моем личном опыте снижение может достигать 50-100% и более.

Как этого избежать?
Создаем вспомогательную переменную типа StringBuilder (я надеюсь, вы уже знаете, что строки складывать в time-critical алгоритмах – нельзя) и в наиболее активно использующих запись отладочной информации функциях пишем в эту переменную. По окончании работы критичной части программы – сбрасываем данные на диск «одним куском».


2. Особенности выделения памяти.

Собственно, про то, как выделяется память – пишут во всех книжках. Но! Никто не упоминает о неприятных последствиях ее выделения.

В частности, худшее, что можно придумать – это выделять память операцией new внутри цикла или нескольких вложенных циклов, а также внутри функций, вызывающихся в цикле. Такой подход гарантированно приводит к падению производительности на 200-300% и более.

Нет, ну понятно, что память выделять все-таки надо :) Но везде, где это возможно, следует вынести выделение памяти за пределы циклов.
В частности, мой переводчик активно работает со строками – это приводит к необходимости постоянно выделять память под все новые и новые строки. Основная оптимизация, которую я начал активно применять – это активное использование заранее созданных StringBuilder’ов.
Идея следующая – при первом вызове функции проверяется на null специальная вспомогательная переменная, являющаяся членом класса (т.е. внешняя по отношению к функции). Если null – вызывается new StringBuilder. В противном случае – вызывается StringBuilder.Clear(), которая очищает содержимое переменной. В этом случае повторное выделение памяти не производится.
С точки зрения всех книг по проектированию ПО – это очень плохо :) Фактически, большинство time-critical функций имеют дополнительно по 1-2 переменным-членам класса. Кроме того – эти функции нельзя использовать в многопоточном режиме. Однако, если конечная цель – обеспечить высокую производительность для однопоточного алгоритма, то такой подход имеет смысл.

Ну и как заключение.

В результате использования только этих двух методов удалось снизить время работы алгоритма перевода на тестовом тексте с 27 секунд до 6 секунд без изменения самого алгоритма. Это примерно 22% прироста. Замечу, что это суммарное время работы всех частей программы – включая и те, что невозможно оптимизировать такими способами. По отдельным функция прирост производительности составлял порядка от 100 до 300% (в основном – за счет избавления от операции new).

четверг, 27 марта 2008 г.

Немного истории

Совершенно случайно наткнулся на интервью с академиком РАН В.С. Бурцевым. Он рассказывает про отечественные суперкомпьютеры - в частности, про "Эльбрус". Оказывается, разработки были очень и очень эффективны даже не смотря на отсталую элементную базу. А уж идея использования света для передачи информации внутри суперЭВМ в 1994 (точнее в этом году проект уже защитили) - это вообще нечто!

P.S.: К сожалению, как и все у нас в стране данное направление исследований так же было загублено неумелым/глупым руководством...

вторник, 18 марта 2008 г.

Интересная книжка про Linq

LINQ Quickly by Satheesh, N Kumar:

"This book gets you started with LINQ and shows how it will make your programming life easier by making use of new features from the .NET Framework 3.0. This book is split into seven chapters, each of which is dedicated to presenting a feature of LINQ and its usage in real-life scenarios. Language Integrated Query (LINQ) is a new feature in Visual Studio 2008 that extends its query capabilities, using C# and Visual Basic. Visual Studio 2008 comes with LINQ provider assemblies that enable the use of LINQ with data sources such as in-memory collections, SQL relational databases, ADO.NET Datasets, XML documents, etc. In Visual Studio 2008, Visual C# and Visual Basic are the languages that implement the LINQ language extensions. LINQ language extensions use the new standard query operators API, which is the query language for any collection that implements IEnumerable."

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

MP3 CMS - 2

Как оказалось - вчерашний способ запуска сайта сработал только наполовину. Т.е. в режиме "или сканер или сайт". Хотелось, конечно же, и то и то :)

Но сегодня я его все-таки добил :) Оказалось, что достаточно было запустить application pool сайта в классическом режиме не меняя файл web.config - и все сразу заработало. Так что если кто будет переезжать на IIS7 и столкнется с разными проблемами - попробуйте сначала сделать именно это. Авось поможет :)

воскресенье, 16 марта 2008 г.

Mp3 CMS (Веб-разработчикам на заметку)

И все-таки мне это удалось! Я запустил сайт Mp3 CMS по-человечески :)

Собственно, проблема была в том, что некоторые секции в файле web.config "переехали" на другое место. Достаточно было отредактировать файл - и все сразу заработало!

Как подписать стороннюю сборку

Допустим у нас есть приложение, сборки которого обязательно должны быть подписаны. Проблема в том, что наше приложение ссылается на неподписанную сборку от стороннего производителя, причем исходных кодов нет. Понятно, что пока мы не подпишем эту сборку - наше приложение не скомпилируется. Однако подписать чужую сборку если она не рассчитана на отложенную подпись стандартными методами нельзя. Но если очень хочется - то можно :)

Итак:

1. Декомпилируем неподписанную dll в MSIL код.

ildasm providedAssembly.dll /out:providedAssembly.il


2. Убираем куда-нибудь исходную dll (она нам больше не понадобится)

3. Компилируем полученный на этапе №1 код, подписывая его:

ilasm providedAssembly.il /dll /key=keypair001.snk



Самое интересное в этом методе - таким сособом можно подписать даже обфусцированные сборки.

пятница, 14 марта 2008 г.

Альтернатива Singularity OS: CosmOS

Cosmos (C# Open Source Managed Operating System) - тоже является операционной системой, написанной на дотнете. Те, кому интересно - могут почитать краткий обзор на русском, а также посетить главный сайт.

Вообщем-то, идея та же - вид сбоку. Если SingularityOS - это попытка реализовать принципиально иной способ работы с процессами в системе, то CosmOS - это (насколько я понял) перенос дотнета на уровень железа. Другими словами - тот же самый привычный .Net Framework, но без Windows.

P.S.: кстати, если попинать гугл - можно и еще несколько подобных операционных систем найти. Например - SharpOS

среда, 12 марта 2008 г.

Баги, баги... Кругом одни баги!..

Играюсь с очень интересным сервером MP3 CMS (брать/смотреть тут).

Проект представляет собой ASP.Net сайт для каталогизации/отображения фонотеки со встроенным сканером mp3-файлов. Сканер живет на тегах, поэтому у кого с тегами в музыке проблемы - будут проблемы и с сервером :)

Выглядит это все очень красиво. Работает шустро. Успешно справилось с моими 170 гигами музыки (это вторая программа после iTunes, которая способна работать без тормозов с таким количеством музыки). Есть возможность проиграть музыку прямо со страницы - что очень хорошо, можно забыть про бесконечные копирования через фтп на работу "что-нибудь послушать".

Это плюсы. А теперь про минусы.

Последняя версия - 1.5.0.1 пишет обложки к альбомам и sqllite-овскую базу в свою папку App_Data.

Проблема в том, что в новом IIS7 по-умолчанию запрещена модификация файлов. Т.е. создавать файлы можно, а вот изменять - нельзя. Соответственно, первым умер sqllite :(

Во-вторых, сервер блокирует доступ из сайта в любые папки вне папки с сайтом (я точно не уверен - но сильно на это похоже). Таким образом, вторым умер сканер. С другой стороны, проблемы со сканером могли быть вызваны невозможностью писать в базу данных. Логов нет - они тоже того... умерли.

Шаманские пляски с бубном в течение двух дней никакого эффекта не дали. В частности, пробовал дать разрешение на модификацию файлов (да и вообще на полный доступ) к папке с данными. Пробовал запускать сайт не под стандартным аккаунтом NETWORK SERVICE, а под админским - эффект нулевой. Поиски в инете дали только одно - всех очень сильно интересует вопрос изменения файлов :) Собственно, единственный внятный ответ оказался несколько неожиданным:

"As a result of this and other compatibility issues, we're considering reverting this change in Longhorn Server / Vista SP1."

Вы спросите, а как я тогда с ним экспериментировал? Берем и запускаем сайт в VS2008 ASP.Net Development Server - все начинает работать, сканер индексирует папку с музыкой в свою базу, собирает обложки альбомов и все это складывает в папку App_Data. После чего результат подсовываем уже сайту, который крутится в IIS7. Удивительно - но работает!

На днях планирую поставить/поиграться Windows Server 2008 RTM - заодно и проверю, поправили ли разработчики как обещали - или воз и ныне там.

Поиск похожих картинок

Цитирую:

В Сети появилась новая поисковая система Picollator, использующая мультимедийные запросы.

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

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


Вроде бы даже работает правильно :) Даже интересно - а что там внутри?

пятница, 7 марта 2008 г.

Quake III портировали на .Net Framework

Бывают же чудеса на свете :) Оказывается Quake III портировали на дотнет. В процессе было исправлено порядка 32000 ошибок и дофига предупреждений. Но интересно другое:

"Using Sebastian’s suggestion I ran timedemo’s without vsync and turned off the fps cap. Here are the numbers (this is from demo “four” that comes with the Ultimate Quake box you see in stores). I ran each instance three times to make sure there weren’t any flukes:

Running original Quake III commercial game:

Test run #1: 324.2 fps
Test run #2: 330.9 fps
Test run #3: 332.5 fps

.NET port:

Test run #1: 328.6 fps
Test run #2: 336.9 fps
Test run #3: 336.8 fps

At first it may seem weird that the .NET version is slightly faster, but remember, the original commercial quake3.exe uses its own custom interpreter to run QVM files responsible for all of the game logic (except rendering of course). My .NET port uses DLL’s also _interpreted_ by the .NET framework instead of QVM’s. So what you’re really doing is comparing who’s interpreter is faster."


Кстати, это уже далеко не первая попытка сделать игру на фреймворке. Нет, я, конечно, понимаю, что это совсем "сделать", но все-таки - работает ведь! В основном, пока это разные мелкие игрушки, но тенденция есть. И это не может не радовать - может наконец-то игры перестанут падать от малейшего чиха?

О жизни

За сутки ссылка Singularity RDK на www.codeplex.com в разделе "Projects With Most Downloads" поднялась уже на второе место :) Еще вчера была на третьем.

Что, в принципе, и не удивительно, учитывая что инфрмация про "новую ОС от Майкрософт" прошла даже по телевизору...

P.S.: А запускать я ее пока не стал - времени нет. Но завтра точно попробую :) Пока что краем глаза заглянул в исходники - совершенно ничего не понятно... Хочется какой-нибудь обзор от спецов почитать... Русских.

четверг, 6 марта 2008 г.

Singularity OS доступна для закачки!

Нежданно-негаданно Microsoft опубликовала исходный код своей экспериментальной операционной системы Singularity.

Цитирую:
Корпорация Microsoft представила новую экспериментальную операционную систему под названием Singularity.

Это высоконадежная операционная система, ядро, драйверы и приложения которой написаны на управляемом коде. В Singularity применяются типобезопасные языки программирования вкупе с абстрактным набором команд, которые вместе делают возможным осуществление программно-изолированных процессов (Software Isolated Processes — SIPs).

В отличие от традиционных ОС, компоненты Singularity не запускаются в разных адресных пространствах. Вместо этого существует лишь одно адресное пространство, в котором запускаются SIPs. Каждый такой процесс изолирован, принимает и передает код и данные независимо. Взаимосвязь между процессами осуществляется через каналы более высокого уровня, которыми управляет операционная система. Процессы не могут делить память и изменять свой код, в результате чего обеспечивается высокая надежность исполняемого процессом кода. Система может работать с более чем 16-ю ядрами, а также поддерживать центральные процессоры со встроенными графическими контроллерами.

Singularity написана на Sing#, специально доработанном для данного проекта диалекте C#, и предназначена исключительно для научных целей. Некоторые идеи, реализованные в Singularity, в будущем могут найти применение в Windows, однако когда это произойдет, не известно.

«Singularity — это не следующая Windows, — рассказывает в интервью Ars Technica вице-президент Microsoft по разработкам и исследованиям Рич Рэшид (Rich Rashid). — Это прототип операционной системы, созданный с нуля для того, чтобы понять, как еще могут взаимодействовать между собой операционные системы и приложения. Новая ОС доступна сообществу, и мы надеемся, что вскоре ученые порадуют нас новыми идеями». В компании полагают, что благодаря проекту будущее программное обеспечение станет более надежным. «Мы хотели сделать Singularity достаточно маленькой, достаточно простой, с отличной архитектурой, что послужило бы мгновенному возникновению множества новых идей», — рассказал TG Daily один из ключевых разработчиков ОС Гален Хант (Galen Hunt).

Исходный код Singularity можно загрузить на сайте проекта CodePlex. При этом прототип операционной системы не может быть использован для создания коммерческих продуктов. Несмотря на открытость кода, проект не является open source, так как распространяется в рамках лицензии Microsoft Research License.

Проект Singularity был основан в 2003 г. с целью создания высоконадежной операционной системы. Первая версия исходного кода (RDK) была завершена в 2007 г. В настоящий момент на сайте CodePlex выложена версия 1.1 (~ 62 МБ), в то время как проект перемещается ко второй версии кода.

Экспериментальная ОС Singularity была представлена на ежегодной конференции TechFest во вторник, 4 марта, в Редмонде.


Скачать Singularity можно здесь.

Полезная утилита

Желающие скачать все pdb файлы для того, чтобы смотреть исходный код .Net Framework могут воспользоваться вот этой утилитой.