9/27/2008 5:13:10 PM

Сегодня посетили местный аутлет-центр (DFO). По сравнению с нидерландским Роэрмондом, конечно, попроще. Но на антверпенский вполне даже потянет.

Основное отличие в соотношении количества известных марок к “простым” брендам. Первых очень, очень мало.

Тем не менее, все равно ходили там часа три, купили мне пару хороших пиджаков :) Скидки тоже весьма неплохие попадаются. Те же мои пиджаки: цена проделала путь от $499 за штуку и до $99, за которые они и были куплены. Очень неплохо.

Tags:

9/26/2008 11:27:16 AM

dell2408wpf Как-то друзья рассказали историю про одного австраллийского миллионера (они видели передачу о нем по ТВ). Он всегда приходил в магазин и спрашивал, не дадут ли ему скидку на покупаемые товары. Даже в сезон распродажи, даже при учете уже имеющейся на ценнике скидки. Иногда, дескать, работает.

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

Вчера я торговался с Деллом (Dell). Дважды. Один раз по email, второй раз в их киоске в нашем шоппинг-центре. Хотел купить монитор. Dell 2408WPF. На сайте он стоил $799, но по имейлу удалось договориться на счет суммы в $699. В киоск пошел полюбопытствовать, не удастся ли сторговать еще дешевле и потому, что человек на том конце интернета отказался мне гарантировать новую ревизию монитора (А01), в которой пофиксен ряд багов. Парень из киоска согласился "сбить" цену всего до $720 и обещал какую-то экспресс-доставку. Поскольку цена меня не устраивала, разговор о ревизии так и не зашел. Однако он посоветовал подойти завтра (уже, следовательно, сегодня) - у Делла должны были появиться новые спецпредложения.

И они появились! Сегодня тот же монитор стоит у Делла на сайте $669. Чтож, появился повод снова зайти в киоск.

Вчерашнего продавца в киоске не оказалось, зато тот, что был в наличии, оказался наиболее компетентным из пока встреченных мною тут. Он даже знал, что покупаемый монитор обладает PVA-матрицей, а остальные (махнул рукой пренебрежительно) "они все TN" :) Мы тут были во многих магазинах с мониторами (в том числе и в этом же киоске) и на вопрос о типе матрицы в лучшем случае получали в ответ цифры разрешения и количество милисекунд. А в одном из магазинов продавец просто отвел нас к коробкам и показал: "вот, читайте, я знаю только то, что тут написано". Тип матрицы на коробках не пишут...

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

Но в итоге как-то получилось так, что цена оказалась еще дешевле: $642, плюс нам бесплатно дали 5 лет расширенной гарантии от Делла. По сравнению с "исходной" для меня ценой в $799 прогресс очень даже большой.

Договорились, что пусть монитор приедет (привезут прямо домой), а я там посмотрю, какая будет ревизия. Шанс получить A00 достаточно мал (хотя и есть), да и 14 дней на возврат без объяснения причин мне никто не отменял :)

Сказали ждать как минимум неделю. Жду.

Tags:

9/24/2008 12:14:00 PM

Вообще в Composite Web Application Block достаточно неплохо реализована авторизация (она базируется на Security-блоке из Enterprise Library). Но есть и недостаток в этой реализации: правила (rules) можно можно применять к ресурсам в рантайме, но декларировать (задавать) их можно только в конфигурационном файле.

Для тех, кто не сталкивался, объясню: правило (rule) - это некая именованая комбинация ролей и/или пользовательских имен. Например, можно создать правило, разрешающее управлять пользователями, которое будет определяться комбинацией "Роль Администратор или роль Менеджер или пользователь Вася Пупкин".
В конфигурации это задается так:

<rules>
    <add expression="R:Administrator OR R:Manager OR I:pupkin" name="AllowManageUsers"/>
</rules>

А используется это потом вот так, в конфигурационном файле:

<authorization>
   <rule Url="~/BackEnd/ManageUsers.aspx" Rule="AllowManageUsers"/>
</authorization>

Либо вот так, в рантайме:

authorizationRuleService.RegisterAuthorizationRule(url, ruleName);

Понятное дело, что сказав "а", хотелось бы и "б" сказать, то есть, иметь возможность "на лету" определять правила, а не только пользоваться уже имеющимися. Например, это было бы удобно делать при инициализации модуля (в наследнике ModuleInitializer), чтобы каждый модуль имел возможность задать свои собственные правила и применить их к своим ресурсам. Однако, как я уже и сказал, "out of box" такой возможности нет.

Однако, благодаря "сервисной" структуре Composite Web и Enterprise Library, ее можно добавить. Для этого нужно расширить поведение неустраивающих нас сервисов.

В нашем случае это AuthorizationRuleService из Composite Web, который отвечает за авторизацию, но не дает возможности зарегистрировать новое правило, и AuthorizationRuleProvider, который, собственно, и выполняет всю работу и который "заполняется" правилами из конфигурационного файла.

Я просто расширил эти два механизма, написав свою реализацию AuthorizationProvider и IAuthorizationService. Кроме этого сервис авторизации реализует еще и интерфейс IRuleRegisterService, который я ввел для того, чтобы иметь возможность регистрировать правила в рантайме. Код всего этого дела в этом же постинге.

Теперь, когда у  нас есть собственные реализации этих двух вещей, нужно сказать Composite Web, что нужно использовать их вместо дефолтных.

Для регистрации провайдера просто меняем тип в конфигурационном файле:

<securityConfiguration defaultAuthorizationInstance="RuleProvider" defaultSecurityCacheInstance="">
    <authorizationProviders>
        <add type="WebClientApplication.Shell.Providers.ShellAuthorizationRuleProvider, Shell" name="RuleProvider">
            <rules>
                <add expression="R:Administrator OR R:Manager OR I:pupkin" name="AllowManageUsers"/>
            </rules>
        </add>
    </authorizationProviders>
</securityConfiguration>

В случае сервиса идем в ModuleInitializer "главного" модуля (Shell), там есть функция AddGlobalServices, в которой регистрируется сервис IAuthorizationService. Выкидываем эту строчку, а вместо нее пишем:

IAuthorizationService newAuthService
    = globalServices.AddNew<ShellAuthorizationRuleService, IAuthorizationService>();

IRuleRegisterService ruleRegistrator = newAuthService as IRuleRegisterService;
if (ruleRegistrator != null) globalServices.Add<IRuleRegisterService>(ruleRegistrator);

Таким образом мы регистрируем один класс в виде сразу двух сервисов: IAuthorizationService (так, что подмены никто не заметит) и IRuleRegisterService, который позволит нам регистрировать правила "на лету".

Ну а пользоваться всем этим хозяйством - задача уже совсем рутинная:

 

public override void Load(CompositionContainer container)
{
    base.Load(container);

    AddGlobalServices(container.Parent.Services);
    AddModuleServices(container.Services);
    RegisterSiteMapInformation(container.Services.Get<ISiteMapBuilderService>(true));

    IRuleRegisterService ruleRegistrator = container.Services.Get<IRuleRegisterService>();
    if (ruleRegistrator != null) RegisterRules(ruleRegistrator);

    IAuthorizationRulesService rulesService = container.Services.Get<IAuthorizationRulesService>();
    if (rulesService != null) ApplyRules(rulesService);
}

private void ApplyRules(IAuthorizationRulesService rulesService)
{
    rulesService.RegisterAuthorizationRule("~/AdminPage.aspx", "OnlyForAdministrators");
}

private void RegisterRules(IRuleRegisterService ruleRegistrator)
{
    AuthorizationRule commonRule = new AuthorizationRule("OnlyForAdministrators", "R:Administrator");
    ruleRegistrator.RegisterRule("OnlyForAdministrators", commonRule);
}

Выделено то, что добавилось к уже имеющемуся коду инициализатора модуля. Там регистрируются правила (в моем случае всего одно: OnlyForAdministrators), а потом правила регистрируются для авторизации доступа к ресурсам.

WCABAuthorization.zip (4.09 kb)

9/1/2008 2:34:06 PM

В прошлую субботу ездили на закупки. Закупали мягкую мебель, компьютер и всякую прочую всячину. И между делом, случайно, попали на расподажу в одну местную большую сеть (Harvey Norman). Они там отмечали 50-летие и по этому случаю сделали скидку в 22,5% на всё, что у них есть.

Но удивило другое. Помимо скидок по магазину ходили двое крепких парней в форменных футболках и еще один мужик с микрофоном. У этих двоих в руках был огромный колокольчик с бантиком, действие разворачивалось примерно такое: они подходили к какой-нибудь витрине, стойке или просто куче товара и начинали диалог:

- А тут у нас что?
- А тут у нас рисоварки.
- И что мы будем с ними делать, майт?!
- А давай их продавать!
- Нууу, рисоварка стоит $49,95. И какую цену мы назначим?
- 10 баксов!
- 10 баксов?! За рисоварку, которая стоит $49.95?! Ты сошел с ума!
- И когда мы начнем распродажу?
- Ну, как только ты позвонишь в колокольчик, майт!

Дальше один звонил в колокольчик, а мужик с микрофоном горланил на весь магазин, что в таком-то отделе продается такой-то товар по такой-то цене. Мужики раздавали некоторое количество товара (штук до 10-12 максимум) и переходили к следующей стойке.

Лично я получил 4GB флешку за 9 баксов (реальную цену не помню), веб-камеру за $18 (вместо 50 с лишним) и компьютерные колонки за $5 (вместо $19.95).

Ленка отхватила эту самую рисоварку за $10 (еще не опробовали), пару тефалевских сковородок (что-то $12 или $15, не помню, но таких цен на них не бывает нигде) и портативный DVD-плейер за $90 (полную цену не помню). Плейер мы, правда, за ненадобностью решили все же не покупать.

При мне раздавали компьютеры (системные блоки) за $60 всего. Я не знаю, что там за конфигурация, но 60 баксов – это даром даже если там просто корпус. Нужно было видеть огромные глаза счастливого австрала, который шел на меня с коробкой и приговаривал: “компьютер за 60 баксов! компьютер за 60 баксов, невероятно!” :)

За $100 люди утащили какие-то ноутбуки. Спецификации тоже не видел, но зато видел кучу статей о том, что то тут, то там кто-то обещает сделать ноут за сотню. А тут, гляди, сделали!

За $90 некоторые получили автомобильные GPS-системы с томтомом.

За $100 раздали несколько 7-дюймовых ноутбучеков с Линуксом.

Ноутбуков и компьютеров решили не брать, деньги не переводить зря, пусть и небольшие (дома уже три ноута и десктоп, да грядет еще Home Server), а GPS мы, вроде как, имели мысль встроенный, вместо магнитолы прикупить. А вот мониторов отчего-то не распродавали. Монитор бы нам пригодился ;)

Так же мы наблюдали распродажи наборов кухонных ножей, столовых наборов, каких-то массажоров всего и вся, видео и DVD плейеров, я даже не помню, чего еще. Народу было море, очереди во все кассы. Но было весело :) Я такого еще никогда не видел.
Интересно, это у них так бывает иногда, или только на 50-летие? :)

Tags:

Powered by BlogEngine.NET 1.6.0.0

About the author

Alexey Raga Alexey Raga
.NET software developer.

E-mail me Send mail

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

Sign in