Alexey's profileLife vs. ProgrammingPhotosBlogListsMore Tools Help

Blog


    November 29

    Генератор данных для разработчиков

    Иногда, когда мы пробуем или тестируем что-то, бывает необходимо создать некоторый набор данных, на которых мы и эксперимертируем.
    Картинка все объясняет лучше, чем слова, смотрите:

    Кому интересно - взять можно тут. Там же показано, как расширять генератор своими данными и т.д.

    November 24

    VirtualPathProvider в ASP.NET 2.0

    Ковыряясь в ASP.NET обнаружил вот какую штуку: оказывается, нельзя поместить MasterPage в каталог темы (App_Themes\MyTheme, например).
    Хотя, казалось бы, вполне разумное решение для реализации скинов - положить все мастер-шаблоны, стили и .skin-файлы в одной папке в одном месте. Тогда и темы для приложения будет делать и деплоить легко - скопировал папочку и готово.
    Ан нет. ASP.NET за этим делом следит и не дает руки распускать. А хранить шаблоны в одном месте, а темы - в другом как-то не удобно... Пришлось ковыряться глубже.

    Наковырял следующее: в ASP.NET есть специальный провайдер для вычисления виртуальных путей.
    Так, получается, можно сделать такой вот "финт ушами": складывать все, что касается тем, в одну папку, но не в App_Themes, а в другую, скажем, в папку Skins. А все запросы к папке App_Themes просто перенаправлять в Skins с помощью провайдера.

    Забегая вперед скажу, что совсем избавиться от каталога App_Themes не удастся, придется создать его и какую-нибудь пустую папку-тему-заглушку в нем (я назвал ее Virtual). Класть туда ничего не нужно, но нужно прописать эту тему как тему по умолчанию в конфигурационном файле:

    <pages validateRequest="false" theme="Virtual">

    Так, делаю провайдер, наследуюсь от VirtualPathProvider. В этом провайдере переопределяю методы GetDIrectory и GetFile. Соответственно, делаю своих потомков VirtualDirectory и VirtualFile. Идея в том, чтобы VirtualDirectory представлялся системе как каталог "App_Themes/Virtual", но возвращал список файлов из другого, нужного нам каталога.

     

    public class ThemedVirtualPathProvider : VirtualPathProvider
    {
        private const string _stubTheme = "/App_Themes/Virtual/";
        private const string _newThemesFolder = "/Skins/";
        public override VirtualDirectory GetDirectory(string virtualDir)
        {
            if (IsThemeFolder(virtualDir))
                return new ThemedVirtualDirectory(virtualDir);
            return base.GetDirectory(virtualDir);
        }
        public override VirtualFile GetFile(string virtualPath)
        {
            if (IsThemeFolder(virtualPath))
                return new ThemedVirtualFile(virtualPath);
            return base.GetFile(virtualPath);
        }
        internal static bool IsThemeFolder(string virtualPath)
        {
            return virtualPath.Contains(_stubTheme);
        }
        internal static string ReplaceThemePath(string virtualPath)
        {
            virtualPath = virtualPath.Replace(
                _stubTheme,
                String.Concat(_newThemesFolder, SiteSettings.Instance.Theme, Path.AltDirectorySeparatorChar)
            );
            return virtualPath;
        }
    }

    Реализация классов ThemedVirtualFile и ThemedVirtualDirectory достаточно тривиальна.
    Вот пример ThemedVirtualDirectory:

     

    private class ThemedVirtualDirectory : VirtualDirectory
    {
        public ThemedVirtualDirectory(string virtualDir)
            : base(virtualDir)
        {
            GetData();
        }
        protected void GetData()
        {
            string virtualDirectoryName = ThemedVirtualPathProvider.ReplaceThemePath(this.VirtualPath);
            string directoryName = HostingEnvironment.MapPath(virtualDirectoryName);
            if (Directory.Exists(directoryName))
            {
                string tempVirtualEntry;
                string[] fileSystemEntries = Directory.GetDirectories(directoryName);
                ThemedVirtualFile vFile;
                ThemedVirtualDirectory vDirectory;
                foreach (string dir in fileSystemEntries)
                {
                    tempVirtualEntry = VirtualPathUtility.Combine(this.VirtualPath, Path.GetFileName(dir));
                    vDirectory = new ThemedVirtualDirectory(tempVirtualEntry);
                    _children.Add(vDirectory);
                    _directories.Add(vDirectory);
                }
                fileSystemEntries = Directory.GetFiles(directoryName);
                foreach (string file in fileSystemEntries)
                {
                    tempVirtualEntry = VirtualPathUtility.Combine(virtualDirectoryName, Path.GetFileName(file));
                    vFile = new ThemedVirtualFile(tempVirtualEntry);
                    _children.Add(vFile);
                    _files.Add(vFile);
                }
            }
        }
        private List<VirtualFileBase> _children = new List<VirtualFileBase>();
        public override IEnumerable Children
        {
            get { return _children; }
        }
        private List<VirtualFileBase> _directories = new List<VirtualFileBase>();
        public override IEnumerable Directories
        {
            get { return _directories; }
        }
        private List<VirtualFileBase> _files = new List<VirtualFileBase>();
        public override IEnumerable Files
        {
            get { return _files; }
        }
    }

    Здесь одна только особенность: при создании каталога ему в конструктор передается "изначальный" виртуальный путь, то есть, тот, который с "App_Themes". Потому, что ASP.NET за этим следит и если попытаться вернуть другое имя, то грязно выругается. А вот "внутри" себя он работает с нужным нам каталогом. Его подкаталоги и файлы и возвращает. А вот при создании файла ему в качестве виртуального пути передается его "реальный" путь. То есть, путь после замены "App_Themes\Virtual" на нужный нам каталог с темой. Для того, чтобы ASP.NET, вставляя, скажем, стиль в качестве ресурса страницы, ссылался все же на существующий файл.

    Реализацию наследника виртуального файла я уже не привожу, должно быть все понятно. Единственное, что там нужно сделать - так это определить метод Open, который вернет поток с контентом файла..

    Да, теперь как это вызывать.
    Для начала провайдер нужно зарегистрировать, написав следующий вызов:

    HostingEnvironment.RegisterVirtualPathProvider(new ThemedVirtualPathProvider());

    Сделать это можно либо в публичном статическом методе AppInitialize() любого из классов в App_Code, либо в Global.asax в методе Application_Start, как удобнее. И в дальнейшем все вызовы будут проходить через этот провайдер.

    А в базовом классе страницы в методе OnPreInit я написал следующее:

    string themedMasterFile = HttpPath.Concat("~/Skins", SiteSettings.Instance.Theme, "Layout.master");
    this.MasterPageFile = themedMasterFile;

    То есть, тут я указываю шаблон для страницы в соответствии с темой (свойство SiteSettings.Instance.Theme возвращает имя выбранной темы), а сама тема будет подключена уже с помощью провайдера...

    P.S. Поискав подобное решение в интернете я нашел лишь убогую реализацию в каком-то mojoFramework. Убогую потому, что они не предполагают, что контент в разных темах может быть разным. Потому, видимо, и не работают со списком файлов вообще. Таким образом их фреймворк позволяет в теме иметь только те, скажем, .skin-файлы, которые заданы в теме-пустышке. Только они будут "перенаправлены", об остальных система даже не узнает. Моя реализация лишена подобного недостатка ;)

    Так что, надеюсь, это поможет.

    November 22

    PayPal действует

    Поскольку проблема с местом на жестком диске периодически возникает, придумал купить внешний SATA-винчестер. SATA потому, что USB2 все же тормозно.
    Сказано - сделано, заказал 500-гигабайтовый (надеюсь, на долго хватит) eSATA винчестер и PCMCIA-контроллер этого дела для ноутбука.

    Странное дело, кстати. В магазинах, где есть сами диски, нет контроллеров, а там, где еть контроллеры - нет дисков.. Чудеса.

    Словом, покупая этот самый контроллер, столкнулся с тем, что деньги принимаются только через PayPal.
    И, поскольку гражданам России с недавних пор разрешено заводить аккаунты в этой платежной системе (читай: карточки российских банков принимаются), пришлось попробовать.

    Действительно работает. Никаких тебе проблем, транзакция прошла мгновенно и совершенно прозрачно. Фактически я просто дал PayPal'у команду "вот с этой моей карточки отправь деньги воон тому чуваку".

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

    Словом, в таком виде платежная система мне понравилась. Буду пользоваться, а то вместо этого делать банковский перевод тоже долго...

    November 17

    Еще один тул для отладки AJAX

    Релизнулся сегодня.
    Назвается "FireBug". Вторая часть названия намекает на "отладчика", а первая происходит от того, что инструмент интегрируется в браузер Firefox.

    Скриншоты, описание и т.д. - на новом оффициальном сайте инструмента тут: http://www.getfirebug.com/

    Что же касается IE7, то теперь стала доступна и русская его версия.
    Те, кто любит, чтобы вместо File было написано "Файл", могут скачать по этому адресу:

    http://download.microsoft.com/download/d/4/e/d4e2d315-2493-44a4-8135-b5310b4a50a4/IE7-WindowsXP-x86-rus.exe

    Я не пробовал. Не люблю русский интерфейс - теряюсь.

    November 14

    Кто хотел консоли?

    Вышел релиз того, что когда-то называлось Monad, а ныне зовется Windows PowerShell.

    PowerShell - это такая консоль для управления системой, но с очень широкими возможностями. Например, из нее можно напрямую "общаться" с WMI и COM (если прав хватит). Ну и много чего еще там.

    Примеры и некоторые фичи можно посмотреть здесь. Там же есть ссылка на видео, в котором все это продемонстрировано.

    Technorati tags:

    WebDeveloperHelper Utility: в помощь ASP.NET разработчику

    Nikhil Kothari, архитектор команды ASP.NET и  разработчик Script# - компилятора из C# в JavaScript, обновил WebDeveloperHelper - утилиту, которая будет (и является) чрезвычайно полезной для ASP.NET разработчиков.

    Программа позволяет очень удобно "отслеживать" что же именно и как "ходит" от сервера к клиенту и наоборот, что откуда берется и так далее.
    Новая версия позволяет работать так же с MS Ajax и UpdatePanel.

    Небольшой скриншот программы:

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

    Кстати, отступление об MS Ajax Framework. Поскольку у меня сейчас нет "реальной" работы c ASP.NET, то и интересуюсь я этой темой постольку поскольку, просто чтобы быть в курсе.
    Но вот недавно поставил последнюю бету и попробовал что-то сделать. Сделать удалось следующее: сайт, который выглядит как новый (2007-й) Office, с такой же менюшкой выпадающей, с таким же тулбоксом интерактивненьким..
    Все это мне удалось сделать не написав ни одной строчки кода. Ни JavaScript, ни C#.
    Да, конечно, разметку в ASPX-файлах я делал, свойства тегов задавал.. Но это и все :)

    Technorati tags: , ,
    November 10

    PhotoSynth: вот и мы можем посмотреть

    http://labs.live.com/photosynth - такой вот своеобразный способ попутешествовать. Например, сейчас можно "побывать" в Венеции.

    ASP.NET AJAX Framework: Дело близится к релизу.

    Вышла вторая бета-версия.
    Пофиксено и улучшено и упрощено. Более подробно можно посмотреть здесь.

    Technorati tags: , ,
    November 08

    Правильный постинг.

    Вот, натолкнулся: http://davydov.blogspot.com/2006/11/blog-post_08.html

    Что-то да, в последнее время слишком часто приходится сталкиваться с такими вот "крайностными" точками зрения.
    Типа, там (в России) людей "зомбируют", пора валить; тут (в Бельгии) арабы и чернокожие заполонили все, закон не писан, пора валить; и так далее.

    Думал, что один я удивляюсь. Обострение, чтоли, у людей.. :)

    .NET Framework 3.0 - Релиз

    Ну только ленивый еще не неписал о том, что вышел релиз. Видимо я - ленивый :)

    На самом деле он вышел еще позавчера. Просто я из двух новостей (про релиз и про онлайн-курсы) увидел вторую (про курсы), бросил читать новости и пошел их проходить.

    Уже прошел все три. Образовательно, советую для ознакомления.

    А что касается 3-го фреймворка, то смотреть и качать вот тут.
    Да, не забудьте правильно удалить бету, если была. "Удалятор" на той же странице. Что-то он непростое делает...

    Лично я уже скачал и поставил :)

    [Added] А, вот, еще что. Вот тут можно скачать Windows SDK примеры для .NET 3.0.

    Technorati tags: ,
    November 06

    Вызвать к автономному игроку курса?

    О чем это я?
    А, да. О  том, что как бы там Майкрософт не распылялся по поводу того, как правильно переводить приложения на русский язык, какие замечательные глоссарии есть у них на сайте и т.д, не помешало бы им самим почаще эти самые глоссарии перечитывать.
    Ибо попытка поставить eLearning Offline Player у меня вылилась в то, что меня просто послали.
    Судите сами:

    А ведь я ставил Offline Player вовсе не для того, чтобы XXX просматривать, для этого другие ресурсы существуют..

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

     
    Полагаю, в названии ярлыка была допущена грубая ошибка: вместо слова "Вызов" следует читать "Воззвать". Тогда предложение становится более корректным. Осталось только добавить пояснения, что же это за Игрок Курса такой.

    Да, к слову именно о глоссариях. После окончания установки в браузере открывается страничка с маленьким текстиком, в котором сказано, что до первой загрузки курса взывать будет бесполезно, более того, Offline Course Player даже не появится на рабочем столе и в меню Начало. У них тоже выделено.
    Насколько я помню, меню всегда называлось "Пуск" в русской версии Windows... А уж никак не "Начало".. Или в глоссариях такого нет?..

    .NET Framework 3.0 из первых рук

    Майкрософт предлагает бесплатное онлайн-обучение по теме "Developing Rich Experiences with Microsoft® .NET Framework 3.0 and Visual Studio® 2005".

    Обещается 3 двухчасовых обучающих сессии по новшествам .NET Framework 3.0. Расчитано на опытных разработчиков и архитекторов, которые заинтересованы в изучении следующего поколения .NET (а кто сейчас не заинтересован? тому завтра денег платить не будут :))

    Темы, как не трудно догадаться:

    • Windows Presentation Foundation
    • Windows Workflow Foundation
    • Windows Communication Foundation

    Для успешного понимания требуется пара лет опыта работы с .NET (во всяком случае так считают разработчики курса).

    Подписаться на курс можно здесь.
    Эх, жаль, что Linq и иже с ним в 3-й фреймворк не вошли...

    Technorati tags: ,
    November 05

    Винный фестиваль.

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

    Вино готово для дегустации ФуаГра и то, что из нее делают

    Супруга испробовала кучу вин, а я, как человек не переваривающий вкуса этилового спирта - кучу сыров и несколько видов мяса.
    Да, купили ФуаГра. Настоящей французской. Мужик долго объяснял, что он сам с юга франции, что его ФуаГра завоевала всяческие золотые медали в соревнованиях и т.д. Рассказал (и дал проспект), что к ним приезжают туристы, селятся в домики (недорого, кстати, домик снять получается) на несколько дней.. Отдыхают и едят всяческую фуагранскую еду (оказывается, много всего делается с ее добавлением).
    Дал попробовать - действительно очень отличается от того, что мы покупали до этого в магазине и ели в ресторанах. В лучшую сторону.

    Да, и еще! Я, наконец-то, попробовал устриц. Тех самых, которых едят сырыми, поливая лимонным соком.
    Точнее сказать - одну устрицу. Остальные в меня лезть не захотели. Не люблю вкус сырого во рту.
    А вот супруге понравилось...

     Продавец мясов 1Устрицы с лимоном готовы к проглатыванию.

    Да, снова о винах. Купили пару бутылок австраллийского, мельбурнского :) Все остальные из продегустированных (не мною) оказались хуже..
    Вот так вот.

    November 01

    Windows Live Messenger 8.1 beta

    Снова что-то делают. А я продолжаю надеяться.
    Установил последнюю бету. Изменение обнаружил одно - Contact Card стала удобнее.
    Добавили возможность бесплатных тестовых звонков с PC на "обычные" телефоны. Посмотрел тарифы - в принципе не дорого. В Питер звонить - 2 цента минута.
    Попробовать не удалось - российский пластик не принимают (бельгийского у меня нет). Точнее как, принимать принимают, SMS о снятии денег приходит, но на сайте пишут, что валидация провалилась.
    Дальше пробовать не стал, надеюсь, что транзакции откатят (куда денутся) :)

    В остальном - то же самое. Надеялся зря - хистори по-прежнему в наипозорнейшем состоянии.

    Словом, ставить пока никакого смысла нет...

    Technorati tags:

    Windows Media Player 11

    Вышел.
    Я обранужил это вчера. Поставил. Доволен.
    Субъективно: существенно быстрее, чем его "предок" 10-й версии. Во всяком случае из-за тормозов "десятки" в частности при сворачивании в тулбар.
    В этой версии такого нет, меня все устраивает, загружается даже быстрее отправленного на пенсию винампа.

    Так же очень понравилась навигация по Media Library (может быть в 10 была такая же, я даже не смотрел в связи с его тормозами).

    Для установки достаточно посетить www.microsoft.com, там висит огромный баннер с предложением его установить :)

    Technorati tags: