Библиотеки Windows 7 – управляемый код

June 12th, 2009

Вот и подошло к концу наше продолжительное погружение в программные интерфейсы библиотек Windows 7 и их архитектуру. Осталось лишь поговорить об управляемых API для работы с библиотеками Windows 7. Напомню, что до этого мы успели обсудить предназначение библиотек Windows 7, обсудили то, что происходит за кулисами библиотек, о том, как научить приложение работать с библиотеками Windows 7, поговорили об использовании содержимого библиотек Windows 7, о синхронизации библиотек и вспомогательных функциях для библиотек Windows 7.

В данной статье мы сконцентрируем внимание на управляемых API для работы с библиотеками Windows 7. Windows API Code Pack для Microsoft .NET Framework Library (для краткости Windows API Code Pack) предусматривает .NET-интерфейс для встроенных Windows API, делая доступными 7 ключевых функций доступа в Windows 7, а также использование более продвинутых способов интеграции в оболочку, о которых мы говорили чуть раньше. Загрузить Windows Code Pack API можно отсюда.

clip_image002

Рис. 1. Классы, входящие в ShellLibrary

Windows API Code Pack обладает очень удобным управляемым интерфейсом к Shell Windows и особенно к Windows 7 Libraries API. ShellLibrary (как элемент динамической библиотеки Microsoft.WindowsAPICodePack.Shell, которую вам надо добавить в качестве ссылки на .NET-приложение, чтобы работать с Windows 7) – это единственный объект, представляющий библиотеки. Вышеприведенное изображение показывает классы ShellLibrary.

Теперь можно приступать к работе с библиотеками. Для начала нужно создать объект Library, используя один из четырех доступных конструкторов. Вы можете воспользоваться конструктором, который в качестве параметра использует Known Folder. Это упростит разработчикам обслуживание кода. Но имейте в виду, что большинство конструкторов получают булевый параметр overwrite. Удостоверьтесь в том, что вы не перезаписываете уже существующую папку «Documents» или другую библиотеку, поскольку при создании нового ShellLibrary-объекта библиотечный XML-файл сохраняется в папку библиотеки, описанную параметром Known Folder, о которой мы уже говорили. Следующая строка создает новый объект ShellLibrary, тем самым создавая новую библиотеку:

 

ShellLibrary library = new ShellLibrary(“new test lib1”, true);
 

Если вам не нужно создавать новую библиотеку, можно загрузить существующую библиотеку для получения необходимого ShellLibrary-объекта. Имейте в виду, что все функции загрузки являются статическими и не требуют копии существующего ShellLibrary-объекта. Последним параметром любой загружаемой функции является isReadOnly в булевом формате, когда требуется прочитать содержание библиотеки, не изменяя его. Так, к примеру, приложению, которое осуществляет резервное копирование всех библиотек, не требуется вносить в них изменения. Следующий фрагмент кода – это все, что нужно для загрузки существующей библиотеки:

 

ShellLibrary library = ShellLibrary.Load("My Pictures", true);
 

Хорошо, теперь у нас есть объект ShellLibrary. Что с ним делать дальше? Есть несколько способов позабавиться с библиотеками. Во-первых, можно добавить или удалить папки из конкретной библиотеки. Помните, что библиотеки являются лишь абстрактными хранилищами, в которых нет файлов и которые просто указывают на папки, которые хранят файлы. И об этом мы, кстати, уже говорили. Чтобы добавить папку, просто вызовите функцию Add, для удаления – функцию remove. Вы можете добавлять и удалять папки с помощью строкового параметра или с использованием объекта FileSystemFolder, как показано в следующем фрагменте кода:

 

public void Add(FileSystemFolder item);public void Add(string folderPath);public bool Remove(FileSystemFolder item);public bool Remove(string folderPath);
 

Кроме управления папками в библиотеке, можно установить место сохранения по умолчанию, используя свойство DefaultSaveFolder. Если предположить, что library является объектом ShellLibrary, следующий фрагмент кода вернет место сохранения по умолчанию:

 

String dsfStr = library.DefaultSaveFolder

Обратите внимание, что при установке места сохранения по умолчанию, необходимо указать реально существующую папку, для которой у вас есть разрешения на чтение/запись. Если эта папка не включена в состав библиотеки, она будет добавлена в библиотеку и станет местом для сохранения по умолчанию. Как разработчик, вы можете также добавить неподдерживаемые адреса папок, которые не индексируются или не могут быть проиндексированы.

Еще одна весьма интересная функция – это управление иконкой библиотеки. Это одна из тех функций, к которым конечные пользователи доступа не имеют, хотя она настолько проста в использовании, как это показано в следующем фрагменте кода:

 

library.IconResourceId = new IconReference(icon);

Необходимо получить объект IconReference и после этого потребуется изменить стандартную иконку и установить свою собственную. Еще одна забавная функция, с которой стоит поиграть:

clip_image004

Рис. 2 Библиотеке можно добавить собственную иконку

Еще одной важной особенностью объекта ShellLibrary является возможность перечисления всех элементов и папок библиотеки. В ShellLibrary-объекте предусмотрен интерфейс IList <FileSystemFolder>, поддерживающий перечисление папок в библиотеке через функцию GetEnumerator или с помощью оператора foreach, как показано в следующем фрагменте кода, который выводит на печать имя папки и место сохранения по умолчанию:

 

foreach (ShellFolder folder in library){    Console.WriteLine(            "\t\t{0} {1}",             folder.Name,             defaultSaveFolder == folder.Name ? "*" : "")}

С помощью свойства LibraryType можно управлять типом библиотеки, а с помощью свойства IsPinnedToNavigationPane можно прикрепить библиотеку к левой навигационной панели Windows Explorer.

Теперь поговорим об отображении окна менеджера библиотек. Очень важно выводить это окно, если вы хотите обеспечить полноценный интерфейс для управления библиотеками и приложениями. Поскольку менеджер библиотек отображает диалоговое окно в существующем приложении, нужно принимать во внимание технологии, используемые приложением. Функция ShowManageLibraryUI может вызвать окно обработчика Win32 (whnd), работающее с Windows Forms или WPF-объект для работы с WPF:

 

library.ShowManageLibraryUI(IntPtr.Zero, “title of dialog”, "help text…", true);

И в заключение несколько слов об удалении библиотеки. В объекте ShellLibrary не предусмотрено механизма самоуничтожения, поэтому вы не сможете удалить библиотеку, используя ShellLibrary. Чтобы удалить библиотеку, необходимо удалить XML-файл описания библиотеки. Ниже приведен фрагмент кода:

 

public static void DeleteLibrary(string name){    string librariesPath = Path.Combine(        Environment.GetFolderPath(            Environment.SpecialFolder.ApplicationData),            ShellLibrary.LibrariesKnownFolder.RelativePath);

    string libraryPath = Path.Combine(librariesPath, name);    string libraryFullPath = Path.ChangeExtension(libraryPath, "library-ms");

    File.Delete(libraryFullPath);}

Как видите, вначале мы использовали комбинацию Environment.SpecialFolder.ApplicationData и ShellLibrary.LibrariesKnownFolder.RelativePath, чтобы собрать папку, где хранятся все файлы описаний. Затем добавляем расширение library-ms к папке и удаляем файл. Удаляя файл, удаляем библиотеку, поэтому будьте внимательны и не удалите нужные библиотеки.

Мы рассказали обо всех важнейших функциях управляемых API для библиотек Windows 7. Это и все предыдущие статьи по теме должны были обеспечить понимание принципов работы библиотек, а также способы их использования в приложениях.

Кроме того, при желании вы можете получить первый опыт программирования для Windows 7, ознакомившись с примерами, входящими в состав обучающей документации для разработчиков Windows 7. Документация включает все описанные в данной статье примеры, так что вперед, загружайте документацию поскорее и приступайте к программированию!

Update me when site is updated

Библиотеки Windows 7 – управляемый код

June 12th, 2009

Вот и подошло к концу наше продолжительное погружение в программные интерфейсы библиотек Windows 7 и их архитектуру. Осталось лишь поговорить об управляемых API для работы с библиотеками Windows 7. Напомню, что до этого мы успели обсудить предназначение библиотек Windows 7, обсудили то, что происходит за кулисами библиотек, о том, как научить приложение работать с библиотеками Windows 7, поговорили об использовании содержимого библиотек Windows 7, о синхронизации библиотек и вспомогательных функциях для библиотек Windows 7.

В данной статье мы сконцентрируем внимание на управляемых API для работы с библиотеками Windows 7. Windows API Code Pack для Microsoft .NET Framework Library (для краткости Windows API Code Pack) предусматривает .NET-интерфейс для встроенных Windows API, делая доступными 7 ключевых функций доступа в Windows 7, а также использование более продвинутых способов интеграции в оболочку, о которых мы говорили чуть раньше. Загрузить Windows Code Pack API можно отсюда.

clip_image002

Рис. 1. Классы, входящие в ShellLibrary

Windows API Code Pack обладает очень удобным управляемым интерфейсом к Shell Windows и особенно к Windows 7 Libraries API. ShellLibrary (как элемент динамической библиотеки Microsoft.WindowsAPICodePack.Shell, которую вам надо добавить в качестве ссылки на .NET-приложение, чтобы работать с Windows 7) – это единственный объект, представляющий библиотеки. Вышеприведенное изображение показывает классы ShellLibrary.

Теперь можно приступать к работе с библиотеками. Для начала нужно создать объект Library, используя один из четырех доступных конструкторов. Вы можете воспользоваться конструктором, который в качестве параметра использует Known Folder. Это упростит разработчикам обслуживание кода. Но имейте в виду, что большинство конструкторов получают булевый параметр overwrite. Удостоверьтесь в том, что вы не перезаписываете уже существующую папку «Documents» или другую библиотеку, поскольку при создании нового ShellLibrary-объекта библиотечный XML-файл сохраняется в папку библиотеки, описанную параметром Known Folder, о которой мы уже говорили. Следующая строка создает новый объект ShellLibrary, тем самым создавая новую библиотеку:

 

ShellLibrary library = new ShellLibrary(“new test lib1”, true);
 

Если вам не нужно создавать новую библиотеку, можно загрузить существующую библиотеку для получения необходимого ShellLibrary-объекта. Имейте в виду, что все функции загрузки являются статическими и не требуют копии существующего ShellLibrary-объекта. Последним параметром любой загружаемой функции является isReadOnly в булевом формате, когда требуется прочитать содержание библиотеки, не изменяя его. Так, к примеру, приложению, которое осуществляет резервное копирование всех библиотек, не требуется вносить в них изменения. Следующий фрагмент кода – это все, что нужно для загрузки существующей библиотеки:

 

ShellLibrary library = ShellLibrary.Load("My Pictures", true);
 

Хорошо, теперь у нас есть объект ShellLibrary. Что с ним делать дальше? Есть несколько способов позабавиться с библиотеками. Во-первых, можно добавить или удалить папки из конкретной библиотеки. Помните, что библиотеки являются лишь абстрактными хранилищами, в которых нет файлов и которые просто указывают на папки, которые хранят файлы. И об этом мы, кстати, уже говорили. Чтобы добавить папку, просто вызовите функцию Add, для удаления – функцию remove. Вы можете добавлять и удалять папки с помощью строкового параметра или с использованием объекта FileSystemFolder, как показано в следующем фрагменте кода:

 

public void Add(FileSystemFolder item);public void Add(string folderPath);public bool Remove(FileSystemFolder item);public bool Remove(string folderPath);
 

Кроме управления папками в библиотеке, можно установить место сохранения по умолчанию, используя свойство DefaultSaveFolder. Если предположить, что library является объектом ShellLibrary, следующий фрагмент кода вернет место сохранения по умолчанию:

 

String dsfStr = library.DefaultSaveFolder

Обратите внимание, что при установке места сохранения по умолчанию, необходимо указать реально существующую папку, для которой у вас есть разрешения на чтение/запись. Если эта папка не включена в состав библиотеки, она будет добавлена в библиотеку и станет местом для сохранения по умолчанию. Как разработчик, вы можете также добавить неподдерживаемые адреса папок, которые не индексируются или не могут быть проиндексированы.

Еще одна весьма интересная функция – это управление иконкой библиотеки. Это одна из тех функций, к которым конечные пользователи доступа не имеют, хотя она настолько проста в использовании, как это показано в следующем фрагменте кода:

 

library.IconResourceId = new IconReference(icon);

Необходимо получить объект IconReference и после этого потребуется изменить стандартную иконку и установить свою собственную. Еще одна забавная функция, с которой стоит поиграть:

clip_image004

Рис. 2 Библиотеке можно добавить собственную иконку

Еще одной важной особенностью объекта ShellLibrary является возможность перечисления всех элементов и папок библиотеки. В ShellLibrary-объекте предусмотрен интерфейс IList <FileSystemFolder>, поддерживающий перечисление папок в библиотеке через функцию GetEnumerator или с помощью оператора foreach, как показано в следующем фрагменте кода, который выводит на печать имя папки и место сохранения по умолчанию:

 

foreach (ShellFolder folder in library){    Console.WriteLine(            "\t\t{0} {1}",             folder.Name,             defaultSaveFolder == folder.Name ? "*" : "")}

С помощью свойства LibraryType можно управлять типом библиотеки, а с помощью свойства IsPinnedToNavigationPane можно прикрепить библиотеку к левой навигационной панели Windows Explorer.

Теперь поговорим об отображении окна менеджера библиотек. Очень важно выводить это окно, если вы хотите обеспечить полноценный интерфейс для управления библиотеками и приложениями. Поскольку менеджер библиотек отображает диалоговое окно в существующем приложении, нужно принимать во внимание технологии, используемые приложением. Функция ShowManageLibraryUI может вызвать окно обработчика Win32 (whnd), работающее с Windows Forms или WPF-объект для работы с WPF:

 

library.ShowManageLibraryUI(IntPtr.Zero, “title of dialog”, "help text…", true);

И в заключение несколько слов об удалении библиотеки. В объекте ShellLibrary не предусмотрено механизма самоуничтожения, поэтому вы не сможете удалить библиотеку, используя ShellLibrary. Чтобы удалить библиотеку, необходимо удалить XML-файл описания библиотеки. Ниже приведен фрагмент кода:

 

public static void DeleteLibrary(string name){    string librariesPath = Path.Combine(        Environment.GetFolderPath(            Environment.SpecialFolder.ApplicationData),            ShellLibrary.LibrariesKnownFolder.RelativePath);

    string libraryPath = Path.Combine(librariesPath, name);    string libraryFullPath = Path.ChangeExtension(libraryPath, "library-ms");

    File.Delete(libraryFullPath);}

Как видите, вначале мы использовали комбинацию Environment.SpecialFolder.ApplicationData и ShellLibrary.LibrariesKnownFolder.RelativePath, чтобы собрать папку, где хранятся все файлы описаний. Затем добавляем расширение library-ms к папке и удаляем файл. Удаляя файл, удаляем библиотеку, поэтому будьте внимательны и не удалите нужные библиотеки.

Мы рассказали обо всех важнейших функциях управляемых API для библиотек Windows 7. Это и все предыдущие статьи по теме должны были обеспечить понимание принципов работы библиотек, а также способы их использования в приложениях.

Кроме того, при желании вы можете получить первый опыт программирования для Windows 7, ознакомившись с примерами, входящими в состав обучающей документации для разработчиков Windows 7. Документация включает все описанные в данной статье примеры, так что вперед, загружайте документацию поскорее и приступайте к программированию!

Update me when site is updated

Windows 7 부팅 애니메이션 엔지니어링

June 12th, 2009

 

 

블로그나 Windows 7에 대해 이야기할 기회를 통해서 이 블로그의 화제에 관해서 매우 흥미를 가지고 있던 만이고 있는 것을 오싹오싹 느끼고 있습니다. 우리는 우선, 부팅/시작의 시퀀스 및 그것이 신속히 행해지는 것이 얼마나 중요한가 라는 일을 알았습니다. 동시에 최대 절전 모드 상태에서 머신을 다시 시작할 때나 머신의 전원을 넣을 때에 HDD 라이트가 반짝반짝 하는 것을 바라보는 것은 정말로 지루하다는 것도 이해하고 있습니다. PC를 실행 했을 때의 처음 체험을 향상시키기 위해, 부팅 시퀀스 개선에 착수헸습니다. 매우 간단한 일로 생각될지도 모르지만, 문제해결 때문에 조사했는데, 엔지니어링적으로 꽤 대단한 일이라는 것이 판명되었습니다. 우리의 목표는 시스템 부팅 성능에 영향을 미치지 않고 즐겁게 하는 것입니다. 이 엔지니어링에 대해 설명해, 부팅 시퀀스에 대해 해설하기 위해서 코어 사용자 경험 팀의 프로그램 관리자인 Karen Wong이이 글을 집필했습니다. –Steven

디자인

우리는 「퍼스낼러티 (개성)」라고 하는 말을 사람과 감정적으로 연결되어 있는 소프트웨어 특징의 일부를 언급하기 위해서 사용합니다. 「light (빛)」와「energy (에너지)」는 Windows 7 의 퍼스낼러티를 표현하기 위해서 사용하는 말입니다.

디자인 관점에서 말하면, 기능의 시각적 표현은 성능과 품질에 대한 사용자의 사고 방식에 대해 중요한 역할을 이루어 있습니다. 우리의 목적은 Windows 를 멋지게 실행시키는 것으로, Windows 7 의 퍼스낼러티인 “light”라는  “energy”에서 온 것입니다. 그리고, 자연에서는 이것들이 형태를 부조로 하는 양식이 우리의 디자인 팔레트가 되었습니다. 예를 들어, 「bioluminescence (생물 발광)」, 「organic (유기적인)」, 「humble beauty (소극적인 아름다움)」, 「atmosphere (분위기)」등이 우리가 간 브레인 스토밍(brainstorming)에서 자주 나온 말이었습니다. 이것들은 다소 진부하게 들릴지도 모르지만, Windows 7 의 전체적인 목표입니다.

20개 이상의 부팅 시퀀스 디자인이 생성 및 리뷰,  테스트 되었습니다. 디자인은 색 채도나 밝기, 움직임의 복잡함, 조명 효과등에 의해서 바뀌어 옵니다. 다음은 설계 중에 그려진 스케치입니다:

Design sketches for the proposed boot animation

Windows 7 의 최종적인 디자인은 네가지 방향에서 에너지가 접근해 하나가 되어, 창에 투영 되는 빛을 형성한다고 하는 것입니다 (물론, Windows의  창과 닮아 있는 것은 우연이 아닙니다!). 희미한 고동은 그 후의 진전을 나타내 있지만, 이것은 Windows 7 의 퍼스낼러티를 생생하게 강조하는 디자인입니다.

최고의 성능

만약 모든 것을 Vista 와 같게 해 부팅 애니메이션을 새로운 폴더 Windows 7 용으로만 업데이트 한다면, 우리가 목표로 하는 새로운 폴더 수준의 성능이나 품질을 달성할 수 없습니다. 실제, Windows 7에서 새로운 폴더 부팅 애니메이션을 구현하려면 방대한 코드의 변경이 필요했습니다.

Vista에서는 부팅 로더는 640×480 의 저해상도 스크린을 사용하여, 녹색의 진행 상황 막대에 필요한 파일크기도 몹시 작아서 끝났습니다. 게다가 Vista 부팅 스크린은 색농도도 낮고, 16 bpp (bit per pixel) 밖에 없었습니다. Windows 7에서는 새로운 폴더 부팅 애니메이션으로 풍부한 색채를 구현 하기 위해서 32 bpp 로 늘렸습니다. Vista에서의 실행시의 진행 상황 인디케이터의 업데이트는 CPU 경유로 구현했지만, I/O 시간의 영향을 받기 쉽기 때문에 가끔 애니메이션에 불편이 생깁니다. 저해상도의 스크린으로 색농도도 한정되어 또 불편의 영향도 받기 쉬워 Windows 7에서 무엇인가 공이 많이 든 것을 구축하려면  대단한 일이 기다리고 있었던 것입니다.

우선, 부팅 애니메이션을 표시하는데, Windows 7 부팅 로더에서는 지금까지와는 다른 메커니즘을 사용하는 것부터 다루었습니다. 컴퓨터의 데이터 보존부분 (BIOS 또는 UEFI)에서 frame buffer에 포인터를 설정하여, 고해상도의 이미지 (1024 x 768)를 표시합니다. 커널과 실행에 필요한 장치 드라이버가 메모리에 읽히는 동안에 이미지를 애니메이션화합니다. 디스플레이 용무의 네이티브 그래픽 드라이버는 아직 메모리에 읽혀 초기화되어 있지 않기 때문에 애니메이션은 CPU 를 사용하고, 또 그래픽 디스플레이의 frame buffer를 업데이트 하여 실행됩니다. 새로운 폴더 최적화도 실시했습니까? 성능을 신속화하기 위해서 CPU 가 기입을 병용 하는 캐시를 사용하도록 했습니다.

Michael Fortin 에 의한 부팅의 성능에 관한 블로그에 실행의 초기의 단계는 커널, 장치 드라이버의 파일 및 그 다른 시스템구성요소의 파일을 읽어들이므로, I/O 의 제약을 받는 것이 설명됩니다. 그 때문에 실행 초기에 있어 지연이 발생하는 것을 피하기 위해, 부팅 애니메이션의 크기를 스크린의 좁은 범위로 한정했습니다. 넓은 크기의 애니메이션은 그 만큼 큰 애니메이션의 이미지를 읽어들일 필요가 있어, 그 결과, 파일 I/O 를 증가하게 됩니다. 애니메이션의 이미지는 비트맵을 리소스로서 수중에 넣어 압축 되고, WIM 이미지 압축에 의해 압축됩니다. WIM 이미지 압축은 전체적인 파일크기를 줄여서 읽어들이는데 필요한 I/O 를 줄일수 있습니다. WIM 이미지 압축은 또, 디스크 위의 발자국도 삭감합니다. 스크린의 좁은 범위에 애니메이션을 표시해, 약간 낮은 프레임비율을 사용하여, frame buffer를 업데이트하는 CPU 오버헤드를 필요 최저한의 수준으로 유지하여, 실행 시간에 오버헤드를 추가하습니다.

실행의 성능 뿐만이 아니게 품질도 향상시키는 변경도 더했습니다. 그것은 그래픽 모드의 마이그레이션을 줄이는 것이었습니다. 이 마이그레이션은 그래픽 하부구조나 Windows 셸의 초기화 시에 일어납니다. Vista에서는 이 때문에 사용자에 대해서 로그온 화면을 표시하기까지 (또는 한 명 밖에 시스템 사용자가 없는 경우는 사용자의 데스크톱을 표시하기까지) 몇차례 디스플레이가 변경하여 (검게 점멸), 실행 경험이 매끄럽지는 않았습니다.

새로운 애니메이션을 가능하게 하기 위해 성능과 품질의 향상을 위해서 실행의 구조를 깊게 파고 들어 조사했는데, 부팅 애니메이션의 미화 활동에 의해 데스크톱까지의 시간을 한층 더 단축할 찬스가 태어난 것은 기쁜 놀라움이었습니다. Vista에서는 사용자가 머신의 전원을 넣으면, 부팅 시퀀스는 Windows 플래그 또는 「펄」의 애니메이션이 로그온 스크린 (사용자가 자동 로그인 설정을 한 경우는 데스크톱)의 전에 표시되고 있었습니다. Vista 의 실행 구조의 제약에 의해, 이 펄 애니메이션은 실행 코드가 벌써 완료 한 경우에만 재생됩니다.

Vista boot animation

Vista 의 부팅 시퀀스, 펄 애니메이션을 포함한다

그런데, 새로운 폴더 실행의 영상은 Windows 7 의 퍼스낼러티를 반영한 표현력 풍부한 애니메이션을 표시합니다. 펄 애니메이션은 시대착오로 장황한 느낌이 들었으므로 삭제되었습니다. 그 결과, 실행이 완료한 후에 이 애니메이션을 재생하는 시간을 절약할 수 있었습니다.

Windows 7 boot animation.

Windows 7 의 부팅 시퀀스, 펄 애니메이션은 삭제

실행시의 사운드는 어떻게 되는지 생각될지도 모릅니다. Vista에서는 최고 품질의 경험을 만들기 위해, 사운드는 펄 애니메이션과 동시가 아니면 안됩니다. 그러나, 이것은 일부 하드웨어에 대해서 성능에 영향을 줄 우려가 있었습니다. 이렇게 말하는 것도, 시스템의 사운드 스택은 펄의 시퀀스를 완료하기 위해서 읽히지 않으면 안 되기 때문입니다. 시스템의 사운드 재생의 준비가 갖추어질 때까지 기다리고 있는 경우, 데스크톱이 표시 될 때까지 지연이 발생할 가능성이 있습니다. 그 때문에 이번 사운드는 비동기적으로, 로그온 화면이 읽힌 후의 언젠가에 재생되도록 변경했습니다. 테스트 한 대부분의 하드웨어에서는 로그온 화면이 표시된 타이밍입니다. 즉 이 변경은 성능의 장점에 가세해 사용자에 머신이 사용 가능한 상태가 된 것을 알리는 것으로 사용자 경험을 향상시킵니다.

실행에 관한 코드의 최적화와 Vista 의 펄 애니메이션의 삭제에 의해, 데스크톱에 도달할 때까지의 시간을 증가시키는 일 없이 실행중에 표현력 풍부한 고품질의 애니메이션을 추가할 수 있었습니다.

폭넓은 하드웨어 대응

실행시의 경험은 사용자의 하드웨어에 따라서 크게 다릅니다. 다양한 하드웨어에 최고의 비주얼 경험을 확실히 하기 위해 몇가지 설계 의사결정을 했습니다. 그러나, 시스템이 데스크톱을 표시하기까지 걸리는 시간은 주로 하드웨어에 의존합니다.

예를 들어, 실행시 애니메이션이 시작되기까지 지연된다는 것을 알고 계실지 모르지만, 이 지연시간은 시스템의 하드웨어에 따라서 다릅니다. 즉각 반응을 보이도록 최적화하기 위해서 Windows 가 시스템 위의 모든 프로세서를 시작하는 기회를 얻기 전에 실제로는 실행 화면상에 텍스트를 표시합니다. 그것은 실행 안에 애니메이션이 나머지의 I/O 와 비동기에 실행할 수 있는 경우만 가능합니다 (앞에서 얘기와 같이 최선의 성능과 품질에 필요합니다).

또, 실행 중에 Windows 플래그 크기가 스크린 크기에 의해서 조금 바뀌는 것을 알고 계실지도 모릅니다. Windows 7 의 기술적인 제한 때문에 시스템의 원래 해상도와 관계없이 실행시에는 항상 추천되는 최저 해상도인 1024×768 로 표시됩니다. 오늘, 대부분의 하드웨어는 부팅 시퀀스를 중앙에 표시하는 것이 아니라, 확대하여 화면 가득 표시하도록 설정됩니다. 그 결과, 부팅 애니메이션도 1024×768 와는 다른 비율로 스크린상에 확대됩니다. 그러나, 시각적인 품질이 유지되도록, 일반적인 비율로 일련의 흐름을 테스트 했습니다.

실행, 재시동 및 최대 절전 모드 상태에서 다시 시작

실행시의 경험을 향상시키기 위한 일들이 낭비되도록 하지는 않습니다. 사용자는 최대 절전 모드 상태에서 복귀할 때에도 같은 경험을 체험할 수 있습니다.

사용자 지정

여러분의 상당수는 자기 자신의 애니메이션을 사용하거나 일련의 흐름을 사용자 지정할 수 있는지 알고 싶어합니다. 아쉽지만, 그것은 Windows 7에서 지원하지 않습니다. 이미 Windows 7에서의 매우 많은 「개인 설정」요소, 예를 들어 베타에서 시험할 수 있는 새로운 폴더 테마 팩등에 대해서 이야기하거나 소개해 왔습니다. 이유는 매우 명백하고, 실행시에 임의의 요소가 메모리에 읽히는 것을 허가 하면, 시스템의 보안을 보장할 수 없게 되기 때문입니다. Windows 를 시작하는 초기 단계에서는 파이어 월이나 바이러스 구제 소프트는 아직 시스템을 지키기 위해서 이용 가능하게 되지 않기 때문에 시스템은 열쇠를 잠글 수 있는 대단히 주의 깊게 감시된 기존 상태로 실행되지 않으면 안됩니다. 그리고 물론, 이미지 크기나 내용 등에 대해서 여러분이 요건에 따라 주실 것이라고 믿지만, 성능에 주는 영향을 고려하여, 모든 타사가 그것을 실시하는 것을 보장 하기 위해서 필요한 코드를 기본 제공 싶지 않습니다. Windows 7 의 설계목표의 하나는 사용자의 여러분 한사람 한사람을 표현하는 충분한 기회가 있어, 자신의 PC 를 정말로 자신의 PC처럼 만드는 것이었습니다. 그러므로, 왜 이 요소는 계속 일관할 필요가 있는지 이해하실 수 있으면 다행입니다.

Windows 7에서는 Windows PC 를 시작하다 때의 경험을 좀 더 즐거운 것으로 하려고 목표로 했지만, 이 블로그나 다른 포럼으로의 피드백을 보는 한, 우리는 올바를 방향으로 나아가고 있다고 믿습니다. 실행을 고속으로 하는 대처에 시스템이 충분히 강력인 일도 우리의 목표입니다. 그러므로, 여러분의 상당수는 이 새로운 폴더 부팅 애니메이션을 그만큼 빈번히 보지는 않겠지만 그러한 기회에는 부팅 애니메이션은 즐겁게 한편 고속물건이 되겠지요!

–Karen

Published Thursday, March 12, 2009 12:52 AM by e7blog

Filed under: Design

Update me when site is updated

Библиотеки Windows 7 – управляемый код

June 12th, 2009

Вот и подошло к концу наше продолжительное погружение в программные интерфейсы библиотек Windows 7 и их архитектуру. Осталось лишь поговорить об управляемых API для работы с библиотеками Windows 7. Напомню, что до этого мы успели обсудить предназначение библиотек Windows 7, обсудили то, что происходит за кулисами библиотек, о том, как научить приложение работать с библиотеками Windows 7, поговорили об использовании содержимого библиотек Windows 7, о синхронизации библиотек и вспомогательных функциях для библиотек Windows 7.

В данной статье мы сконцентрируем внимание на управляемых API для работы с библиотеками Windows 7. Windows API Code Pack для Microsoft .NET Framework Library (для краткости Windows API Code Pack) предусматривает .NET-интерфейс для встроенных Windows API, делая доступными 7 ключевых функций доступа в Windows 7, а также использование более продвинутых способов интеграции в оболочку, о которых мы говорили чуть раньше. Загрузить Windows Code Pack API можно отсюда.

clip_image002

Рис. 1. Классы, входящие в ShellLibrary

Windows API Code Pack обладает очень удобным управляемым интерфейсом к Shell Windows и особенно к Windows 7 Libraries API. ShellLibrary (как элемент динамической библиотеки Microsoft.WindowsAPICodePack.Shell, которую вам надо добавить в качестве ссылки на .NET-приложение, чтобы работать с Windows 7) – это единственный объект, представляющий библиотеки. Вышеприведенное изображение показывает классы ShellLibrary.

Теперь можно приступать к работе с библиотеками. Для начала нужно создать объект Library, используя один из четырех доступных конструкторов. Вы можете воспользоваться конструктором, который в качестве параметра использует Known Folder. Это упростит разработчикам обслуживание кода. Но имейте в виду, что большинство конструкторов получают булевый параметр overwrite. Удостоверьтесь в том, что вы не перезаписываете уже существующую папку «Documents» или другую библиотеку, поскольку при создании нового ShellLibrary-объекта библиотечный XML-файл сохраняется в папку библиотеки, описанную параметром Known Folder, о которой мы уже говорили. Следующая строка создает новый объект ShellLibrary, тем самым создавая новую библиотеку:

 

ShellLibrary library = new ShellLibrary(“new test lib1”, true);
 

Если вам не нужно создавать новую библиотеку, можно загрузить существующую библиотеку для получения необходимого ShellLibrary-объекта. Имейте в виду, что все функции загрузки являются статическими и не требуют копии существующего ShellLibrary-объекта. Последним параметром любой загружаемой функции является isReadOnly в булевом формате, когда требуется прочитать содержание библиотеки, не изменяя его. Так, к примеру, приложению, которое осуществляет резервное копирование всех библиотек, не требуется вносить в них изменения. Следующий фрагмент кода – это все, что нужно для загрузки существующей библиотеки:

 

ShellLibrary library = ShellLibrary.Load("My Pictures", true);
 

Хорошо, теперь у нас есть объект ShellLibrary. Что с ним делать дальше? Есть несколько способов позабавиться с библиотеками. Во-первых, можно добавить или удалить папки из конкретной библиотеки. Помните, что библиотеки являются лишь абстрактными хранилищами, в которых нет файлов и которые просто указывают на папки, которые хранят файлы. И об этом мы, кстати, уже говорили. Чтобы добавить папку, просто вызовите функцию Add, для удаления – функцию remove. Вы можете добавлять и удалять папки с помощью строкового параметра или с использованием объекта FileSystemFolder, как показано в следующем фрагменте кода:

 

public void Add(FileSystemFolder item);public void Add(string folderPath);public bool Remove(FileSystemFolder item);public bool Remove(string folderPath);
 

Кроме управления папками в библиотеке, можно установить место сохранения по умолчанию, используя свойство DefaultSaveFolder. Если предположить, что library является объектом ShellLibrary, следующий фрагмент кода вернет место сохранения по умолчанию:

 

String dsfStr = library.DefaultSaveFolder

Обратите внимание, что при установке места сохранения по умолчанию, необходимо указать реально существующую папку, для которой у вас есть разрешения на чтение/запись. Если эта папка не включена в состав библиотеки, она будет добавлена в библиотеку и станет местом для сохранения по умолчанию. Как разработчик, вы можете также добавить неподдерживаемые адреса папок, которые не индексируются или не могут быть проиндексированы.

Еще одна весьма интересная функция – это управление иконкой библиотеки. Это одна из тех функций, к которым конечные пользователи доступа не имеют, хотя она настолько проста в использовании, как это показано в следующем фрагменте кода:

 

library.IconResourceId = new IconReference(icon);

Необходимо получить объект IconReference и после этого потребуется изменить стандартную иконку и установить свою собственную. Еще одна забавная функция, с которой стоит поиграть:

clip_image004

Рис. 2 Библиотеке можно добавить собственную иконку

Еще одной важной особенностью объекта ShellLibrary является возможность перечисления всех элементов и папок библиотеки. В ShellLibrary-объекте предусмотрен интерфейс IList <FileSystemFolder>, поддерживающий перечисление папок в библиотеке через функцию GetEnumerator или с помощью оператора foreach, как показано в следующем фрагменте кода, который выводит на печать имя папки и место сохранения по умолчанию:

 

foreach (ShellFolder folder in library){    Console.WriteLine(            "\t\t{0} {1}",             folder.Name,             defaultSaveFolder == folder.Name ? "*" : "")}

С помощью свойства LibraryType можно управлять типом библиотеки, а с помощью свойства IsPinnedToNavigationPane можно прикрепить библиотеку к левой навигационной панели Windows Explorer.

Теперь поговорим об отображении окна менеджера библиотек. Очень важно выводить это окно, если вы хотите обеспечить полноценный интерфейс для управления библиотеками и приложениями. Поскольку менеджер библиотек отображает диалоговое окно в существующем приложении, нужно принимать во внимание технологии, используемые приложением. Функция ShowManageLibraryUI может вызвать окно обработчика Win32 (whnd), работающее с Windows Forms или WPF-объект для работы с WPF:

 

library.ShowManageLibraryUI(IntPtr.Zero, “title of dialog”, "help text…", true);

И в заключение несколько слов об удалении библиотеки. В объекте ShellLibrary не предусмотрено механизма самоуничтожения, поэтому вы не сможете удалить библиотеку, используя ShellLibrary. Чтобы удалить библиотеку, необходимо удалить XML-файл описания библиотеки. Ниже приведен фрагмент кода:

 

public static void DeleteLibrary(string name){    string librariesPath = Path.Combine(        Environment.GetFolderPath(            Environment.SpecialFolder.ApplicationData),            ShellLibrary.LibrariesKnownFolder.RelativePath);

    string libraryPath = Path.Combine(librariesPath, name);    string libraryFullPath = Path.ChangeExtension(libraryPath, "library-ms");

    File.Delete(libraryFullPath);}

Как видите, вначале мы использовали комбинацию Environment.SpecialFolder.ApplicationData и ShellLibrary.LibrariesKnownFolder.RelativePath, чтобы собрать папку, где хранятся все файлы описаний. Затем добавляем расширение library-ms к папке и удаляем файл. Удаляя файл, удаляем библиотеку, поэтому будьте внимательны и не удалите нужные библиотеки.

Мы рассказали обо всех важнейших функциях управляемых API для библиотек Windows 7. Это и все предыдущие статьи по теме должны были обеспечить понимание принципов работы библиотек, а также способы их использования в приложениях.

Кроме того, при желании вы можете получить первый опыт программирования для Windows 7, ознакомившись с примерами, входящими в состав обучающей документации для разработчиков Windows 7. Документация включает все описанные в данной статье примеры, так что вперед, загружайте документацию поскорее и приступайте к программированию!

Update me when site is updated

Windows 7 부팅 애니메이션 엔지니어링

June 12th, 2009

 

 

블로그나 Windows 7에 대해 이야기할 기회를 통해서 이 블로그의 화제에 관해서 매우 흥미를 가지고 있던 만이고 있는 것을 오싹오싹 느끼고 있습니다. 우리는 우선, 부팅/시작의 시퀀스 및 그것이 신속히 행해지는 것이 얼마나 중요한가 라는 일을 알았습니다. 동시에 최대 절전 모드 상태에서 머신을 다시 시작할 때나 머신의 전원을 넣을 때에 HDD 라이트가 반짝반짝 하는 것을 바라보는 것은 정말로 지루하다는 것도 이해하고 있습니다. PC를 실행 했을 때의 처음 체험을 향상시키기 위해, 부팅 시퀀스 개선에 착수헸습니다. 매우 간단한 일로 생각될지도 모르지만, 문제해결 때문에 조사했는데, 엔지니어링적으로 꽤 대단한 일이라는 것이 판명되었습니다. 우리의 목표는 시스템 부팅 성능에 영향을 미치지 않고 즐겁게 하는 것입니다. 이 엔지니어링에 대해 설명해, 부팅 시퀀스에 대해 해설하기 위해서 코어 사용자 경험 팀의 프로그램 관리자인 Karen Wong이이 글을 집필했습니다. –Steven

디자인

우리는 「퍼스낼러티 (개성)」라고 하는 말을 사람과 감정적으로 연결되어 있는 소프트웨어 특징의 일부를 언급하기 위해서 사용합니다. 「light (빛)」와「energy (에너지)」는 Windows 7 의 퍼스낼러티를 표현하기 위해서 사용하는 말입니다.

디자인 관점에서 말하면, 기능의 시각적 표현은 성능과 품질에 대한 사용자의 사고 방식에 대해 중요한 역할을 이루어 있습니다. 우리의 목적은 Windows 를 멋지게 실행시키는 것으로, Windows 7 의 퍼스낼러티인 “light”라는  “energy”에서 온 것입니다. 그리고, 자연에서는 이것들이 형태를 부조로 하는 양식이 우리의 디자인 팔레트가 되었습니다. 예를 들어, 「bioluminescence (생물 발광)」, 「organic (유기적인)」, 「humble beauty (소극적인 아름다움)」, 「atmosphere (분위기)」등이 우리가 간 브레인 스토밍(brainstorming)에서 자주 나온 말이었습니다. 이것들은 다소 진부하게 들릴지도 모르지만, Windows 7 의 전체적인 목표입니다.

20개 이상의 부팅 시퀀스 디자인이 생성 및 리뷰,  테스트 되었습니다. 디자인은 색 채도나 밝기, 움직임의 복잡함, 조명 효과등에 의해서 바뀌어 옵니다. 다음은 설계 중에 그려진 스케치입니다:

Design sketches for the proposed boot animation

Windows 7 의 최종적인 디자인은 네가지 방향에서 에너지가 접근해 하나가 되어, 창에 투영 되는 빛을 형성한다고 하는 것입니다 (물론, Windows의  창과 닮아 있는 것은 우연이 아닙니다!). 희미한 고동은 그 후의 진전을 나타내 있지만, 이것은 Windows 7 의 퍼스낼러티를 생생하게 강조하는 디자인입니다.

최고의 성능

만약 모든 것을 Vista 와 같게 해 부팅 애니메이션을 새로운 폴더 Windows 7 용으로만 업데이트 한다면, 우리가 목표로 하는 새로운 폴더 수준의 성능이나 품질을 달성할 수 없습니다. 실제, Windows 7에서 새로운 폴더 부팅 애니메이션을 구현하려면 방대한 코드의 변경이 필요했습니다.

Vista에서는 부팅 로더는 640×480 의 저해상도 스크린을 사용하여, 녹색의 진행 상황 막대에 필요한 파일크기도 몹시 작아서 끝났습니다. 게다가 Vista 부팅 스크린은 색농도도 낮고, 16 bpp (bit per pixel) 밖에 없었습니다. Windows 7에서는 새로운 폴더 부팅 애니메이션으로 풍부한 색채를 구현 하기 위해서 32 bpp 로 늘렸습니다. Vista에서의 실행시의 진행 상황 인디케이터의 업데이트는 CPU 경유로 구현했지만, I/O 시간의 영향을 받기 쉽기 때문에 가끔 애니메이션에 불편이 생깁니다. 저해상도의 스크린으로 색농도도 한정되어 또 불편의 영향도 받기 쉬워 Windows 7에서 무엇인가 공이 많이 든 것을 구축하려면  대단한 일이 기다리고 있었던 것입니다.

우선, 부팅 애니메이션을 표시하는데, Windows 7 부팅 로더에서는 지금까지와는 다른 메커니즘을 사용하는 것부터 다루었습니다. 컴퓨터의 데이터 보존부분 (BIOS 또는 UEFI)에서 frame buffer에 포인터를 설정하여, 고해상도의 이미지 (1024 x 768)를 표시합니다. 커널과 실행에 필요한 장치 드라이버가 메모리에 읽히는 동안에 이미지를 애니메이션화합니다. 디스플레이 용무의 네이티브 그래픽 드라이버는 아직 메모리에 읽혀 초기화되어 있지 않기 때문에 애니메이션은 CPU 를 사용하고, 또 그래픽 디스플레이의 frame buffer를 업데이트 하여 실행됩니다. 새로운 폴더 최적화도 실시했습니까? 성능을 신속화하기 위해서 CPU 가 기입을 병용 하는 캐시를 사용하도록 했습니다.

Michael Fortin 에 의한 부팅의 성능에 관한 블로그에 실행의 초기의 단계는 커널, 장치 드라이버의 파일 및 그 다른 시스템구성요소의 파일을 읽어들이므로, I/O 의 제약을 받는 것이 설명됩니다. 그 때문에 실행 초기에 있어 지연이 발생하는 것을 피하기 위해, 부팅 애니메이션의 크기를 스크린의 좁은 범위로 한정했습니다. 넓은 크기의 애니메이션은 그 만큼 큰 애니메이션의 이미지를 읽어들일 필요가 있어, 그 결과, 파일 I/O 를 증가하게 됩니다. 애니메이션의 이미지는 비트맵을 리소스로서 수중에 넣어 압축 되고, WIM 이미지 압축에 의해 압축됩니다. WIM 이미지 압축은 전체적인 파일크기를 줄여서 읽어들이는데 필요한 I/O 를 줄일수 있습니다. WIM 이미지 압축은 또, 디스크 위의 발자국도 삭감합니다. 스크린의 좁은 범위에 애니메이션을 표시해, 약간 낮은 프레임비율을 사용하여, frame buffer를 업데이트하는 CPU 오버헤드를 필요 최저한의 수준으로 유지하여, 실행 시간에 오버헤드를 추가하습니다.

실행의 성능 뿐만이 아니게 품질도 향상시키는 변경도 더했습니다. 그것은 그래픽 모드의 마이그레이션을 줄이는 것이었습니다. 이 마이그레이션은 그래픽 하부구조나 Windows 셸의 초기화 시에 일어납니다. Vista에서는 이 때문에 사용자에 대해서 로그온 화면을 표시하기까지 (또는 한 명 밖에 시스템 사용자가 없는 경우는 사용자의 데스크톱을 표시하기까지) 몇차례 디스플레이가 변경하여 (검게 점멸), 실행 경험이 매끄럽지는 않았습니다.

새로운 애니메이션을 가능하게 하기 위해 성능과 품질의 향상을 위해서 실행의 구조를 깊게 파고 들어 조사했는데, 부팅 애니메이션의 미화 활동에 의해 데스크톱까지의 시간을 한층 더 단축할 찬스가 태어난 것은 기쁜 놀라움이었습니다. Vista에서는 사용자가 머신의 전원을 넣으면, 부팅 시퀀스는 Windows 플래그 또는 「펄」의 애니메이션이 로그온 스크린 (사용자가 자동 로그인 설정을 한 경우는 데스크톱)의 전에 표시되고 있었습니다. Vista 의 실행 구조의 제약에 의해, 이 펄 애니메이션은 실행 코드가 벌써 완료 한 경우에만 재생됩니다.

Vista boot animation

Vista 의 부팅 시퀀스, 펄 애니메이션을 포함한다

그런데, 새로운 폴더 실행의 영상은 Windows 7 의 퍼스낼러티를 반영한 표현력 풍부한 애니메이션을 표시합니다. 펄 애니메이션은 시대착오로 장황한 느낌이 들었으므로 삭제되었습니다. 그 결과, 실행이 완료한 후에 이 애니메이션을 재생하는 시간을 절약할 수 있었습니다.

Windows 7 boot animation.

Windows 7 의 부팅 시퀀스, 펄 애니메이션은 삭제

실행시의 사운드는 어떻게 되는지 생각될지도 모릅니다. Vista에서는 최고 품질의 경험을 만들기 위해, 사운드는 펄 애니메이션과 동시가 아니면 안됩니다. 그러나, 이것은 일부 하드웨어에 대해서 성능에 영향을 줄 우려가 있었습니다. 이렇게 말하는 것도, 시스템의 사운드 스택은 펄의 시퀀스를 완료하기 위해서 읽히지 않으면 안 되기 때문입니다. 시스템의 사운드 재생의 준비가 갖추어질 때까지 기다리고 있는 경우, 데스크톱이 표시 될 때까지 지연이 발생할 가능성이 있습니다. 그 때문에 이번 사운드는 비동기적으로, 로그온 화면이 읽힌 후의 언젠가에 재생되도록 변경했습니다. 테스트 한 대부분의 하드웨어에서는 로그온 화면이 표시된 타이밍입니다. 즉 이 변경은 성능의 장점에 가세해 사용자에 머신이 사용 가능한 상태가 된 것을 알리는 것으로 사용자 경험을 향상시킵니다.

실행에 관한 코드의 최적화와 Vista 의 펄 애니메이션의 삭제에 의해, 데스크톱에 도달할 때까지의 시간을 증가시키는 일 없이 실행중에 표현력 풍부한 고품질의 애니메이션을 추가할 수 있었습니다.

폭넓은 하드웨어 대응

실행시의 경험은 사용자의 하드웨어에 따라서 크게 다릅니다. 다양한 하드웨어에 최고의 비주얼 경험을 확실히 하기 위해 몇가지 설계 의사결정을 했습니다. 그러나, 시스템이 데스크톱을 표시하기까지 걸리는 시간은 주로 하드웨어에 의존합니다.

예를 들어, 실행시 애니메이션이 시작되기까지 지연된다는 것을 알고 계실지 모르지만, 이 지연시간은 시스템의 하드웨어에 따라서 다릅니다. 즉각 반응을 보이도록 최적화하기 위해서 Windows 가 시스템 위의 모든 프로세서를 시작하는 기회를 얻기 전에 실제로는 실행 화면상에 텍스트를 표시합니다. 그것은 실행 안에 애니메이션이 나머지의 I/O 와 비동기에 실행할 수 있는 경우만 가능합니다 (앞에서 얘기와 같이 최선의 성능과 품질에 필요합니다).

또, 실행 중에 Windows 플래그 크기가 스크린 크기에 의해서 조금 바뀌는 것을 알고 계실지도 모릅니다. Windows 7 의 기술적인 제한 때문에 시스템의 원래 해상도와 관계없이 실행시에는 항상 추천되는 최저 해상도인 1024×768 로 표시됩니다. 오늘, 대부분의 하드웨어는 부팅 시퀀스를 중앙에 표시하는 것이 아니라, 확대하여 화면 가득 표시하도록 설정됩니다. 그 결과, 부팅 애니메이션도 1024×768 와는 다른 비율로 스크린상에 확대됩니다. 그러나, 시각적인 품질이 유지되도록, 일반적인 비율로 일련의 흐름을 테스트 했습니다.

실행, 재시동 및 최대 절전 모드 상태에서 다시 시작

실행시의 경험을 향상시키기 위한 일들이 낭비되도록 하지는 않습니다. 사용자는 최대 절전 모드 상태에서 복귀할 때에도 같은 경험을 체험할 수 있습니다.

사용자 지정

여러분의 상당수는 자기 자신의 애니메이션을 사용하거나 일련의 흐름을 사용자 지정할 수 있는지 알고 싶어합니다. 아쉽지만, 그것은 Windows 7에서 지원하지 않습니다. 이미 Windows 7에서의 매우 많은 「개인 설정」요소, 예를 들어 베타에서 시험할 수 있는 새로운 폴더 테마 팩등에 대해서 이야기하거나 소개해 왔습니다. 이유는 매우 명백하고, 실행시에 임의의 요소가 메모리에 읽히는 것을 허가 하면, 시스템의 보안을 보장할 수 없게 되기 때문입니다. Windows 를 시작하는 초기 단계에서는 파이어 월이나 바이러스 구제 소프트는 아직 시스템을 지키기 위해서 이용 가능하게 되지 않기 때문에 시스템은 열쇠를 잠글 수 있는 대단히 주의 깊게 감시된 기존 상태로 실행되지 않으면 안됩니다. 그리고 물론, 이미지 크기나 내용 등에 대해서 여러분이 요건에 따라 주실 것이라고 믿지만, 성능에 주는 영향을 고려하여, 모든 타사가 그것을 실시하는 것을 보장 하기 위해서 필요한 코드를 기본 제공 싶지 않습니다. Windows 7 의 설계목표의 하나는 사용자의 여러분 한사람 한사람을 표현하는 충분한 기회가 있어, 자신의 PC 를 정말로 자신의 PC처럼 만드는 것이었습니다. 그러므로, 왜 이 요소는 계속 일관할 필요가 있는지 이해하실 수 있으면 다행입니다.

Windows 7에서는 Windows PC 를 시작하다 때의 경험을 좀 더 즐거운 것으로 하려고 목표로 했지만, 이 블로그나 다른 포럼으로의 피드백을 보는 한, 우리는 올바를 방향으로 나아가고 있다고 믿습니다. 실행을 고속으로 하는 대처에 시스템이 충분히 강력인 일도 우리의 목표입니다. 그러므로, 여러분의 상당수는 이 새로운 폴더 부팅 애니메이션을 그만큼 빈번히 보지는 않겠지만 그러한 기회에는 부팅 애니메이션은 즐겁게 한편 고속물건이 되겠지요!

–Karen

Published Thursday, March 12, 2009 12:52 AM by e7blog

Filed under: Design

Update me when site is updated

Windows 7 부팅 애니메이션 엔지니어링

June 12th, 2009

 

 

블로그나 Windows 7에 대해 이야기할 기회를 통해서 이 블로그의 화제에 관해서 매우 흥미를 가지고 있던 만이고 있는 것을 오싹오싹 느끼고 있습니다. 우리는 우선, 부팅/시작의 시퀀스 및 그것이 신속히 행해지는 것이 얼마나 중요한가 라는 일을 알았습니다. 동시에 최대 절전 모드 상태에서 머신을 다시 시작할 때나 머신의 전원을 넣을 때에 HDD 라이트가 반짝반짝 하는 것을 바라보는 것은 정말로 지루하다는 것도 이해하고 있습니다. PC를 실행 했을 때의 처음 체험을 향상시키기 위해, 부팅 시퀀스 개선에 착수헸습니다. 매우 간단한 일로 생각될지도 모르지만, 문제해결 때문에 조사했는데, 엔지니어링적으로 꽤 대단한 일이라는 것이 판명되었습니다. 우리의 목표는 시스템 부팅 성능에 영향을 미치지 않고 즐겁게 하는 것입니다. 이 엔지니어링에 대해 설명해, 부팅 시퀀스에 대해 해설하기 위해서 코어 사용자 경험 팀의 프로그램 관리자인 Karen Wong이이 글을 집필했습니다. –Steven

디자인

우리는 「퍼스낼러티 (개성)」라고 하는 말을 사람과 감정적으로 연결되어 있는 소프트웨어 특징의 일부를 언급하기 위해서 사용합니다. 「light (빛)」와「energy (에너지)」는 Windows 7 의 퍼스낼러티를 표현하기 위해서 사용하는 말입니다.

디자인 관점에서 말하면, 기능의 시각적 표현은 성능과 품질에 대한 사용자의 사고 방식에 대해 중요한 역할을 이루어 있습니다. 우리의 목적은 Windows 를 멋지게 실행시키는 것으로, Windows 7 의 퍼스낼러티인 “light”라는  “energy”에서 온 것입니다. 그리고, 자연에서는 이것들이 형태를 부조로 하는 양식이 우리의 디자인 팔레트가 되었습니다. 예를 들어, 「bioluminescence (생물 발광)」, 「organic (유기적인)」, 「humble beauty (소극적인 아름다움)」, 「atmosphere (분위기)」등이 우리가 간 브레인 스토밍(brainstorming)에서 자주 나온 말이었습니다. 이것들은 다소 진부하게 들릴지도 모르지만, Windows 7 의 전체적인 목표입니다.

20개 이상의 부팅 시퀀스 디자인이 생성 및 리뷰,  테스트 되었습니다. 디자인은 색 채도나 밝기, 움직임의 복잡함, 조명 효과등에 의해서 바뀌어 옵니다. 다음은 설계 중에 그려진 스케치입니다:

Design sketches for the proposed boot animation

Windows 7 의 최종적인 디자인은 네가지 방향에서 에너지가 접근해 하나가 되어, 창에 투영 되는 빛을 형성한다고 하는 것입니다 (물론, Windows의  창과 닮아 있는 것은 우연이 아닙니다!). 희미한 고동은 그 후의 진전을 나타내 있지만, 이것은 Windows 7 의 퍼스낼러티를 생생하게 강조하는 디자인입니다.

최고의 성능

만약 모든 것을 Vista 와 같게 해 부팅 애니메이션을 새로운 폴더 Windows 7 용으로만 업데이트 한다면, 우리가 목표로 하는 새로운 폴더 수준의 성능이나 품질을 달성할 수 없습니다. 실제, Windows 7에서 새로운 폴더 부팅 애니메이션을 구현하려면 방대한 코드의 변경이 필요했습니다.

Vista에서는 부팅 로더는 640×480 의 저해상도 스크린을 사용하여, 녹색의 진행 상황 막대에 필요한 파일크기도 몹시 작아서 끝났습니다. 게다가 Vista 부팅 스크린은 색농도도 낮고, 16 bpp (bit per pixel) 밖에 없었습니다. Windows 7에서는 새로운 폴더 부팅 애니메이션으로 풍부한 색채를 구현 하기 위해서 32 bpp 로 늘렸습니다. Vista에서의 실행시의 진행 상황 인디케이터의 업데이트는 CPU 경유로 구현했지만, I/O 시간의 영향을 받기 쉽기 때문에 가끔 애니메이션에 불편이 생깁니다. 저해상도의 스크린으로 색농도도 한정되어 또 불편의 영향도 받기 쉬워 Windows 7에서 무엇인가 공이 많이 든 것을 구축하려면  대단한 일이 기다리고 있었던 것입니다.

우선, 부팅 애니메이션을 표시하는데, Windows 7 부팅 로더에서는 지금까지와는 다른 메커니즘을 사용하는 것부터 다루었습니다. 컴퓨터의 데이터 보존부분 (BIOS 또는 UEFI)에서 frame buffer에 포인터를 설정하여, 고해상도의 이미지 (1024 x 768)를 표시합니다. 커널과 실행에 필요한 장치 드라이버가 메모리에 읽히는 동안에 이미지를 애니메이션화합니다. 디스플레이 용무의 네이티브 그래픽 드라이버는 아직 메모리에 읽혀 초기화되어 있지 않기 때문에 애니메이션은 CPU 를 사용하고, 또 그래픽 디스플레이의 frame buffer를 업데이트 하여 실행됩니다. 새로운 폴더 최적화도 실시했습니까? 성능을 신속화하기 위해서 CPU 가 기입을 병용 하는 캐시를 사용하도록 했습니다.

Michael Fortin 에 의한 부팅의 성능에 관한 블로그에 실행의 초기의 단계는 커널, 장치 드라이버의 파일 및 그 다른 시스템구성요소의 파일을 읽어들이므로, I/O 의 제약을 받는 것이 설명됩니다. 그 때문에 실행 초기에 있어 지연이 발생하는 것을 피하기 위해, 부팅 애니메이션의 크기를 스크린의 좁은 범위로 한정했습니다. 넓은 크기의 애니메이션은 그 만큼 큰 애니메이션의 이미지를 읽어들일 필요가 있어, 그 결과, 파일 I/O 를 증가하게 됩니다. 애니메이션의 이미지는 비트맵을 리소스로서 수중에 넣어 압축 되고, WIM 이미지 압축에 의해 압축됩니다. WIM 이미지 압축은 전체적인 파일크기를 줄여서 읽어들이는데 필요한 I/O 를 줄일수 있습니다. WIM 이미지 압축은 또, 디스크 위의 발자국도 삭감합니다. 스크린의 좁은 범위에 애니메이션을 표시해, 약간 낮은 프레임비율을 사용하여, frame buffer를 업데이트하는 CPU 오버헤드를 필요 최저한의 수준으로 유지하여, 실행 시간에 오버헤드를 추가하습니다.

실행의 성능 뿐만이 아니게 품질도 향상시키는 변경도 더했습니다. 그것은 그래픽 모드의 마이그레이션을 줄이는 것이었습니다. 이 마이그레이션은 그래픽 하부구조나 Windows 셸의 초기화 시에 일어납니다. Vista에서는 이 때문에 사용자에 대해서 로그온 화면을 표시하기까지 (또는 한 명 밖에 시스템 사용자가 없는 경우는 사용자의 데스크톱을 표시하기까지) 몇차례 디스플레이가 변경하여 (검게 점멸), 실행 경험이 매끄럽지는 않았습니다.

새로운 애니메이션을 가능하게 하기 위해 성능과 품질의 향상을 위해서 실행의 구조를 깊게 파고 들어 조사했는데, 부팅 애니메이션의 미화 활동에 의해 데스크톱까지의 시간을 한층 더 단축할 찬스가 태어난 것은 기쁜 놀라움이었습니다. Vista에서는 사용자가 머신의 전원을 넣으면, 부팅 시퀀스는 Windows 플래그 또는 「펄」의 애니메이션이 로그온 스크린 (사용자가 자동 로그인 설정을 한 경우는 데스크톱)의 전에 표시되고 있었습니다. Vista 의 실행 구조의 제약에 의해, 이 펄 애니메이션은 실행 코드가 벌써 완료 한 경우에만 재생됩니다.

Vista boot animation

Vista 의 부팅 시퀀스, 펄 애니메이션을 포함한다

그런데, 새로운 폴더 실행의 영상은 Windows 7 의 퍼스낼러티를 반영한 표현력 풍부한 애니메이션을 표시합니다. 펄 애니메이션은 시대착오로 장황한 느낌이 들었으므로 삭제되었습니다. 그 결과, 실행이 완료한 후에 이 애니메이션을 재생하는 시간을 절약할 수 있었습니다.

Windows 7 boot animation.

Windows 7 의 부팅 시퀀스, 펄 애니메이션은 삭제

실행시의 사운드는 어떻게 되는지 생각될지도 모릅니다. Vista에서는 최고 품질의 경험을 만들기 위해, 사운드는 펄 애니메이션과 동시가 아니면 안됩니다. 그러나, 이것은 일부 하드웨어에 대해서 성능에 영향을 줄 우려가 있었습니다. 이렇게 말하는 것도, 시스템의 사운드 스택은 펄의 시퀀스를 완료하기 위해서 읽히지 않으면 안 되기 때문입니다. 시스템의 사운드 재생의 준비가 갖추어질 때까지 기다리고 있는 경우, 데스크톱이 표시 될 때까지 지연이 발생할 가능성이 있습니다. 그 때문에 이번 사운드는 비동기적으로, 로그온 화면이 읽힌 후의 언젠가에 재생되도록 변경했습니다. 테스트 한 대부분의 하드웨어에서는 로그온 화면이 표시된 타이밍입니다. 즉 이 변경은 성능의 장점에 가세해 사용자에 머신이 사용 가능한 상태가 된 것을 알리는 것으로 사용자 경험을 향상시킵니다.

실행에 관한 코드의 최적화와 Vista 의 펄 애니메이션의 삭제에 의해, 데스크톱에 도달할 때까지의 시간을 증가시키는 일 없이 실행중에 표현력 풍부한 고품질의 애니메이션을 추가할 수 있었습니다.

폭넓은 하드웨어 대응

실행시의 경험은 사용자의 하드웨어에 따라서 크게 다릅니다. 다양한 하드웨어에 최고의 비주얼 경험을 확실히 하기 위해 몇가지 설계 의사결정을 했습니다. 그러나, 시스템이 데스크톱을 표시하기까지 걸리는 시간은 주로 하드웨어에 의존합니다.

예를 들어, 실행시 애니메이션이 시작되기까지 지연된다는 것을 알고 계실지 모르지만, 이 지연시간은 시스템의 하드웨어에 따라서 다릅니다. 즉각 반응을 보이도록 최적화하기 위해서 Windows 가 시스템 위의 모든 프로세서를 시작하는 기회를 얻기 전에 실제로는 실행 화면상에 텍스트를 표시합니다. 그것은 실행 안에 애니메이션이 나머지의 I/O 와 비동기에 실행할 수 있는 경우만 가능합니다 (앞에서 얘기와 같이 최선의 성능과 품질에 필요합니다).

또, 실행 중에 Windows 플래그 크기가 스크린 크기에 의해서 조금 바뀌는 것을 알고 계실지도 모릅니다. Windows 7 의 기술적인 제한 때문에 시스템의 원래 해상도와 관계없이 실행시에는 항상 추천되는 최저 해상도인 1024×768 로 표시됩니다. 오늘, 대부분의 하드웨어는 부팅 시퀀스를 중앙에 표시하는 것이 아니라, 확대하여 화면 가득 표시하도록 설정됩니다. 그 결과, 부팅 애니메이션도 1024×768 와는 다른 비율로 스크린상에 확대됩니다. 그러나, 시각적인 품질이 유지되도록, 일반적인 비율로 일련의 흐름을 테스트 했습니다.

실행, 재시동 및 최대 절전 모드 상태에서 다시 시작

실행시의 경험을 향상시키기 위한 일들이 낭비되도록 하지는 않습니다. 사용자는 최대 절전 모드 상태에서 복귀할 때에도 같은 경험을 체험할 수 있습니다.

사용자 지정

여러분의 상당수는 자기 자신의 애니메이션을 사용하거나 일련의 흐름을 사용자 지정할 수 있는지 알고 싶어합니다. 아쉽지만, 그것은 Windows 7에서 지원하지 않습니다. 이미 Windows 7에서의 매우 많은 「개인 설정」요소, 예를 들어 베타에서 시험할 수 있는 새로운 폴더 테마 팩등에 대해서 이야기하거나 소개해 왔습니다. 이유는 매우 명백하고, 실행시에 임의의 요소가 메모리에 읽히는 것을 허가 하면, 시스템의 보안을 보장할 수 없게 되기 때문입니다. Windows 를 시작하는 초기 단계에서는 파이어 월이나 바이러스 구제 소프트는 아직 시스템을 지키기 위해서 이용 가능하게 되지 않기 때문에 시스템은 열쇠를 잠글 수 있는 대단히 주의 깊게 감시된 기존 상태로 실행되지 않으면 안됩니다. 그리고 물론, 이미지 크기나 내용 등에 대해서 여러분이 요건에 따라 주실 것이라고 믿지만, 성능에 주는 영향을 고려하여, 모든 타사가 그것을 실시하는 것을 보장 하기 위해서 필요한 코드를 기본 제공 싶지 않습니다. Windows 7 의 설계목표의 하나는 사용자의 여러분 한사람 한사람을 표현하는 충분한 기회가 있어, 자신의 PC 를 정말로 자신의 PC처럼 만드는 것이었습니다. 그러므로, 왜 이 요소는 계속 일관할 필요가 있는지 이해하실 수 있으면 다행입니다.

Windows 7에서는 Windows PC 를 시작하다 때의 경험을 좀 더 즐거운 것으로 하려고 목표로 했지만, 이 블로그나 다른 포럼으로의 피드백을 보는 한, 우리는 올바를 방향으로 나아가고 있다고 믿습니다. 실행을 고속으로 하는 대처에 시스템이 충분히 강력인 일도 우리의 목표입니다. 그러므로, 여러분의 상당수는 이 새로운 폴더 부팅 애니메이션을 그만큼 빈번히 보지는 않겠지만 그러한 기회에는 부팅 애니메이션은 즐겁게 한편 고속물건이 되겠지요!

–Karen

Published Thursday, March 12, 2009 12:52 AM by e7blog

Filed under: Design

Update me when site is updated

MVPs Headline at Microsoft Day @ Dhaka!

June 12th, 2009

Microsoft Day @ Dhaka

The Microsoft MVPs in Bangladesh are presenting - Microsoft Day @ Dhaka, a special event dedicated to all developers, IT professionals and students of Bangladesh.

Five MVPs – Omar Al Zabir, Shariqul Islam Azad, Kazi Manzur Rashid, Mohammad Ashraful Alam, and Mehfuz Hussain are organising the event in association with Omar (creator of www.pageflakes.com). Mehfuz, and Ashraful will also be presenting a number of sessions on the day.

If you are based in Bangladesh and are a Microsoft technology enthusiast or professional, make sure you do not miss Microsoft Day @ Dhaka!

Registration information is available here.

 

Technorati Tags: ,,,,,,


Share this post :

Update me when site is updated

MVPs Headline at Microsoft Day @ Dhaka!

June 12th, 2009

Microsoft Day @ Dhaka

The Microsoft MVPs in Bangladesh are presenting - Microsoft Day @ Dhaka, a special event dedicated to all developers, IT professionals and students of Bangladesh.

Five MVPs – Omar Al Zabir, Shariqul Islam Azad, Kazi Manzur Rashid, Mohammad Ashraful Alam, and Mehfuz Hussain are organising the event in association with Omar (creator of www.pageflakes.com). Mehfuz, and Ashraful will also be presenting a number of sessions on the day.

If you are based in Bangladesh and are a Microsoft technology enthusiast or professional, make sure you do not miss Microsoft Day @ Dhaka!

Registration information is available here.

 

Technorati Tags: ,,,,,,


Share this post :

Update me when site is updated

Windows 7 필기 입력 인식 성능 향상

June 12th, 2009

 

 

Microsoft는Windows 3.0 용 펜 확장기능에서 15 연간 이상 필기 입력 인식에 노력해  왔습니다. Windows Vista 의 필기 입력 구성요소의 새로운 폴더 통합 및 광범위한 가용성에 의해, Windows PC 필기 입력이 한층 더 자주 사용되고 있습니다. 우리는 학교, 병원, 은행, 보험 등 여러가지 응용 프로그램에서 필기 입력 기능을 사용하고 있는 많은 사용자를 볼 수 있습니다. 이 자연스러운 상호작용 방식이 새로운 폴더 시나리오에서 사용되는 것을 보면, 매우 기쁩니다. 물론, 우리가 지속적으로 실시해야 하는 것은 인식 품질을 향상시키는 것과 세계의 많은 언어에서 인식 엔진을 사용할 수 있도록 하는 것입니다. 이 글에서는 Yvonne (User Interface Platform 팀의 프로그램 관리자)가 Windows 7의 새로운 폴더 인식 엔진 및 인식 향상의 엔지니어링에 관한 분석을 제공합니다. –Steven

Tablet PC and Handwriting Recognition 팀의 프로그램 관리자인 Yvonne 입니다. 이 글은 Windows 7 용 필기 입력 인식을 향상시키기 위해서 임한 성과에 대해의 글입니다.

Microsoft 는 1990 년대 초기에서 펜 기반의 컴퓨팅에 계속 투자하여 Windows Vista 의 출시에서는 필기 입력 인식 엔진이 미국어, 영어, 독일어, 프랑스어, 스페인어, 이탈리아어, 네델란드어, 브라질 포르투갈어, 중국어 (번자체와 간자체), 일본어 및 한국어를 포함한 12 의 언어에서 사용할 수 있습니다. 사용자 여러분은 한층 더 많은 언어 지원의 출시와 또, 왜 특정 언어가 아직 지원되지 않는지 자주 질문합니다. 우리는 Windows 7에서 노르웨이 스웨덴어, 핀란드어, 덴마크어, 러시아어 및 폴란드 등이 새로운 폴더에서 많은 언어인식 엔진을 출시하도록 계획하고 있습니다. 이 목록은 계속 추가됩니다. 그럼, 새로운 폴더 필기 입력 인식 엔진을 개발하기 위해서 무엇이 필요한지 고찰해 나가겠습니다.

Windows 는 속필 필기 입력에서도 인식합니다. 특별한 쓰기 법을 배울 필요는 없습니다. 실제로 우리가 Windows 에 몇 천의 사용자의 필기 입력 스타일을 가르치고 있으며 (「트레이닝」), Windows 는 사용자가 그것을 사용할 때의 필기 입력 스타일에 대해 실제로 자주 학습하고 있습니다. 과거 16 년에 걸쳐서 우리는 필기 입력 인식용의 강력한 엔진을 개발해 왔습니다. 그리고, 보다 정확하게 보다 빠르게 하기 위해서 이것들을 조정하여, 새로운 폴더 기능 (Vista 의 사용자에서 배우는 기능 등)을 계속 추가하고 있습니다. 새로운 언어를 지원 하는 것은 새로운 폴더 사전을 추가하는 이상으로, 새로운 폴더 언어에는 큰 투자가 필요합니다. 우선, 네이티브 필기 입력의 수집에서 시작되어, 데이터를 분석하여, 트레이닝과 튜닝을 반복하여, 마지막에 이 시스템이 사용자에게 가면, 사용자의 사용과 함께 지속적으로 향상해 갈 것입니다.

데이터 수집

새로운 필기 입력 인식 엔진의 개발은 방대한 데이터 수집의 대처에서 시작합니다. 우리는 전세계에서 몇 만 명의 작가가 쓴 텍스트의 몇 백만 개의 단어 및 문자를 수집합니다.

데이터 수집의 대처를 설명하기 전에 우리가 자는 듣는 질문에 대답하고 싶습니다.「새로운 사전에서 기존 인식 엔진을 사용할 수 없습니까?」그렇고 기내 1 개의 이유는 각 언어에 특수 문자 또는 엑센트 부호가 있는 것입니다. 그러나, 압도적 이유는 세계가 다른 각 지역의 사용자는 영국과 미국과 같은 언어를 가지는 나라들 사이에도 각각 다른 쓰기 방법을 배우고 있습니다. 사람들에서는 매우 비슷해 보이는 문자가 컴퓨터에서는 실제, 완전히 다른 경우가 있습니다.이 때문에 우리는 문자, 절 독점 및 다른 자형이 어떻게 쓰여져 있는지 정확하게 capture 하는 실제 데이터를 수집할 필요가 있습니다.

우리는 확실히 「올바른 데이터」를 수집하고 싶기 때문에 데이터 수집의 째의 설치는 곤란하고 시간이 걸립니다. 우리는 인식 엔진을 개발하는 각각의 나라에서 컬렉션 실습을 신중하게 선택합니다.

실습으로 데이터 수집을 시작하기 전에 우리는 수집 도구를 구성하여, 문서를 준비하고, 수집 프로세스에서 자원봉사를 가이드 하는 언어 스크립트를 컴파일 합니다. 우리의 스크립트는 철이 올바른 데이터, 다른 필기 입력 스타일의 데이터 및 특정 언어에 관련하는 모든 문자, 숫자, 기호 및 부호를 모두 커버하는 데이터가 확실히 수집되도록, 각각의 언어의 네이티브 스피커에 의해서 신중하게 준비됩니다. 스크립트는 컬렉션 실습으로 사용되기 전에 모두 교정되어 편집됩니다.

도구와 스크립트를 준비할 수 있으면, 우리는 실습을 열어, 필기 인식 샘플을 제공해 주시는 자원봉사 모집을 합니다. 신인 모집에서는 성별, 수완가 연령, 교육 등의 비율이 그 나라의 대다수를 나타내도록 밸런스를 잡습니다.

실습의 감독자는 자원봉사에게, 수집 도구에 표시되는 텍스트를 자원봉사 독자적인 필기 입력 스타일로 쓰도록 지시 합니다. 주의해야 할 중요한 것은 우리가 사용자의 자연스러운 쓰는 법을 정확하게 나타내는 필기 인식 샘플을 수집하고 싶다는 것입니다. 따라서 우리는 「펜과 페이퍼」와 같이 「펜과 태블릿」을 취급하도록, 자원봉사에게 재촉합니다. 자원봉사의 1 명이 크게 구부러진 스트로크로 쓰는 경향을 가진다면, 수집 세션에서 그 사람의 올바른 크게 구부러진 스트로크를 수집하고 싶습니다. 덧붙여 이 문맥으로의 고품질 데이터란, 자연스럽게 쓰여진 데이터입니다.

이것은 수집 도구가 어떠한 것인가 보이는 스냅샷입니다.

Figure 1. Collection tool.

그림1: 수집 도구

 

수집 세션은 60  ~ 90 분으로, 자원봉사가 꽤 많은 양의 필기 입력의 데이터를 피로를 느끼지 않고 제공할 수 있는 정도의 시간입니다. 그 후, 제공 된 데이터는 장래의 사용에 대비해 업로딩 되어 Microsoft 의 데이터베이스에 보관 됩니다. 필기 인식 샘플에는 스트로크의 순서 시작 점과 종점, 간격, 새로운 폴더 인식 엔진을 트레이닝하는데 꼭 필요 다른 특성 등 중요한 정보가 포함되어 있습니다.

실로 다양한 필기 인식 샘플이 있는 것을 보여주기 위해, 데이터베이스 샘플을 몇가지를 보여드립니다.

Figure 2.  Ink samples illustrating stroke order.

그림2: 다른 스트로크 순서를 보여주는 필기 인식 샘플

이 스크린 샷은 3 명의 다른 자원봉사가 어떻게 「black」이라는 단어를 손으로 썼는지 보여줍니다. 다른 색으로 필기 입력된 단어내에서의 정확한 스트로크 순서를 보여줍니다. 최초 2 명의 자원봉사는 「black」라고 하는 단어를 쓰기 위해서 5 개의 스트로크를 필요로 했습니다. 3 번째 자원봉사는 4 개의 스트로크로 쓰고 있습니다. 또한 문자 「ck」를 쓰기 위해서 3 번째의 자원봉사는 1 개의 스트로크를 사용하는 한편, 최초 자원봉사는 이 문자와 같은 조합을 위한 3 개의 스트로크를 사용했다는 것에 주의해 주세요. 이 정보는 모두 인식 엔진의 트레이닝용으로 사용됩니다.

신경망과 언어 모델

일단 충분한 양의 필기 입력 데이터를 수집하여, 우리는 데이터를 개발 팀이 사용하는 트레이닝 집합과 테스트 팀이 사용하는 「블라인드」집합에 분할합니다. 그리고 트레이닝 집합은 신경망 네트워크를 트레이닝하기 위해서 사용됩니다. 그것은 인식 프로세스 결과를 크게 좌우합니다. 자연스럽게 쓰여진 데이터는 고품질인식 엔진 개발에 대해 꼭 필요하며, 인식 엔진은 그 트레이닝 집합 없이는 조금도 향상되지 않습니다. 신경망에 의해 많은 고품질의 데이터 공급하는 만큼, 우리는 한층 더 복잡한 필기체의 필기 입력을 처리할 수 있습니다.

신경망은 필기체 스크립트가 접속하고 있는 문자를 처리할 수 있는 Time-Delay Neural Network (TDNN)입니다. TDNN 는 필기 입력의 각 세그먼트 문자, 숫자 및 기호의 가능성을 계산하는 경우, 앞서는 스트로크와 후에 계속되는 스트로크의 각 필기 입력 세그먼트를 고려합니다. TDNN 의 결과는 도움이 되지만, 정리가 없는 필기 입력의 경우는 충분하지는 않습니다. 인간에 의한 인식의 정확도이라고 동일한 정도가 되기 위해서 우리는 문자의 형태를 넘는 정보를 사용 해야 합니다. 우리는 이것을 언어 모델의 문맥이라고 부릅니다. 이 언어 모델의 문맥의 대부분은 사전 형식이 되어 있습니다. 그것은 임의의 언어 용무의 유효한 처리 단어 목록입니다. 많은 언어의 경우, 이것은 spelling checker가 사용하는 것과 같은 사전입니다. TDNN 와 사전은 긴밀히 공동으로 기능하고, 임의의 입력에 대해서 단어의 확률을 계산하고 가장 확률의 높은 결과를 출력합니다.

신경망 트레이닝은 시간이 걸리는 복잡한 프로세스입니다. 인식의 정확성 향상이라는 최종 목표를 위해서 우리는 다른 언어에서 데이터를 차용하여 트레이닝 데이터를 늘리려면 실험합니다. 다른 언어의 문자 차용은 언제나 성공하지는 않습니다. 위에서 말한 것처럼, 스트로크 순서 문자 형태, 필기 입력 스타일 및 문자사이즈는 나라 마다 다르고, TDNN  성능에 마이너스의 영향을 가져올 가능성이 있습니다. 그 때문에 인식의 정확성을 높이는 「올바른 공식」을 찾아내기 전에 자주 트레이닝, 재트레이닝, 그리고 튜닝을 몇 번이나 반복해야 합니다.

새로운 인식 엔진을 구축할 때, 올바를 방향을 향하고 있는지 어떻게 알 수 있을까요? 이것은 테스트 팀이나 네이티브 스피커가 우리에게 묻는 중요한 질문입니다. 테스트 팀은 인식 엔진의 품질을 반영하는 인식의 정확도 메트릭 생성을 담당하고 있습니다. 정확도 메트릭은 개발에서 트레이닝에 사용하지 않았던 수집 데이터인 블라인드 테스트 집합에 근거합니다. 정확도 메트릭에 추가하여 피드백 및 한층 더 입력을 얻기 위해서 사내 및 세계적인 자식 회사의 네이티브 스피커와 협력하고 있습니다

개인 설정에 의한 인식 엔진 향상

앞 단락에서는 우리가 다양한 다른 필기 입력 스타일을 처리할 수 있는 고품질인식 엔진을 개발하는 방법을 소개했습니다. 그러나, 각 사용자가 자신의 독특한 필기 입력 스타일에 대해 인식 엔진을 트레이닝  수 있으면 한층 더 향상됩니다. 개인의 필기 입력 스타일에 대해 인식 엔진에 가르치기 위한 트레이닝은 Microsoft 가 출시 전에 실시하는 것과 같은 트레이닝입니다. 유일한 차이점은 특정 사용자 (몇 천명의 사용자 대신)로 부터 독특한 트레이닝 데이터를 수집합니다. 우리는 이 프로세스를 「개인 설정」을 부릅니다.

Figure 3: Personalization Wizard (Sentence module).

그림 3: 개인 설정 마법사 (문장 모듈)

이 개인 설정 마법사의 스크린 샷과 같이, 사용자는 필기 인식 샘플을 제공하기 위해 요청되는 문장을 쓰도록 지시됩니다. 사용자가 개인 설정 프로세스에서 보다 많은 데이터를 제공 하는 만큼, 인식 엔진은 향상합니다. 지정된 문장에 근거한 필기 인식 샘플의 제공에 추가하여, 사용자는 트레이닝에 사용되는 특정 인식 오류, 자체 및 문자를 손으로 쓸 수 있습니다. 개인 설정 기능은 복잡하여, 사용자가 최적으로 인식 엔진을 튜닝 할 수 있도록 다양한 모듈을 제공합니다. 개인 설정이 모든 Vista 의 언어 및 모든 새로운 폴더 Windows 7 의 언어에서 이용할 수 있습니다. 인식의 정확도를 향상시키는 이 기능을 사용하도록 강력히 권장합니다.

우리는 지속적으로 인식 엔진을 향상시키기 위해 노력하고 있습니다. 이것은 온라인 원격 측정 (익명, 사적, 임의, 옵트인)을 통해 사용자의 피드백을 도입하는 것을 의미합니다. Windows Vista에서 「필기 입력 인식 오류 보고」라는 새로운 폴더 기능을 출시 했습니다. 이것에 의해, 사용자는 인식 엔진이 올바르게 인식하지 못했던 필기 인식 샘플을 제출할 수 있습니다. 사용자가 Tablet 입력 패널 (TIP)로 단어를 수정한 후에 우리 팀에 잘못 인식된 필기 입력을 수정한 것과 함께 송신 할 수 있는 메뉴가 제공됩니다.

다음 스크린 샷은 오류 보고 도구가 어떠한 것인지  보여줍니다.

Figure 4: With “Report Handwriting Recognition Errors” people can choose which of the misrecognized ink samples they want to submit.

그림4: 「필기 입력 인식 오류 보고」에서 사용자는 잘못 인식된 잉크 샘플의 어디를 제출할지 선택할 수 있습니다.

우리는 주 별로 대략 2000 건의 오류 보고를 받고 있습니다. 오류 보고를 분석하여 차세대 인식 엔진 향상을 위해 사용하기 위해 데이터베이스에 보관됩니다. 실제 데이터는 우리의 인식 엔진의 결점을 명확하게 해 주는 유일한 데이터이므로,  많은 도움이 되고 있습니다.

우리는 모든 오류 보고를 귀중하게 생각하며 감사드립니다. 현재와 미래의 인식 엔진 기능을 향상시키기 위해서 사용할 수 있도록,  많은 피드백을 계속하여 보내주시길 바랍니다. 

끝까지 읽어 주셔 감사합니다.

Yvonne.

 

Published Thursday, March 05, 2009 7:35 AM by e7blog

Filed under: input

Update me when site is updated

MVPs Headline at Microsoft Day @ Dhaka!

June 12th, 2009

Microsoft Day @ Dhaka

The Microsoft MVPs in Bangladesh are presenting - Microsoft Day @ Dhaka, a special event dedicated to all developers, IT professionals and students of Bangladesh.

Five MVPs – Omar Al Zabir, Shariqul Islam Azad, Kazi Manzur Rashid, Mohammad Ashraful Alam, and Mehfuz Hussain are organising the event in association with Omar (creator of www.pageflakes.com). Mehfuz, and Ashraful will also be presenting a number of sessions on the day.

If you are based in Bangladesh and are a Microsoft technology enthusiast or professional, make sure you do not miss Microsoft Day @ Dhaka!

Registration information is available here.

 

Technorati Tags: ,,,,,,


Share this post :

Update me when site is updated