четверг, сентября 09, 2010

XBAP в действии

Жило было одно .NET приложение и работало оно себе в окошках, и продавалось успешно, и всё бы хорошо, но захотелось главному идеологу, чтобы приложение ещё и в браузере работало. WinForms в браузере показать! Вот ведь задачка то. Но делать нечего, надо пытаться решить задачу или признать, что решения у неё нет. Понятно, что можно весь front end переписать под ASP.NET, но на это времени никто не даёт.
Решение нашлось довольно быстро - технология XBAP от Microsoft позволяет запустить WPF приложение в браузере, а на WPF форме мы можем показать WinForms элемент упраления. В том числе и обычное окно мы можем на WPF форме показать. Казалось бы УРА, но нет! Не всё так просто... XBAP приолжение запускается в песочнице с очень огарниченными правами, а при использовании WinForm элементов надо, чтобы приложение работало в Full Trust режиме. Вот тут детально написано как это сделать. Если кратко, то 1 - сгенерить сертификат, 2 - установить его на клиенте в 2 хранилища. Вроде бы это решает проблему, но как-то не очень изящно: мне не правится, что пользователь сам должен скачивать этот сертификат, сам лезть, чего-то там шерудить руками. Всё такие не для этого затевается переход в браузер и мне хотелось как-то автоматизировать установку сертификата на клиенте. И опять таки решение нашлось очень быстро!

1. Создать консольное приложение, к примеру "InstallCertificates.exe"
static void Main(string[] args)
{
  try
  {
    if (args.Length > 1)
    {
      Console.WriteLine("Certificates Installer
1.0. Please wait.");

      Uri uriPath = new Uri(Assembly.GetExecutingAssembly().EscapedCodeBase);
      string path = System.IO.Path.GetDirectoryName(uriPath.LocalPath);

      X509Certificate2 cert = new X509Certificate2(System.IO.Path.Combine(path, args[0]), args[1]);
      X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);
      store.Open(OpenFlags.ReadWrite);
      store.Remove(cert);
      store.Add(cert);
      store.Close();
      store = new X509Store(StoreName.TrustedPublisher, StoreLocation.LocalMachine);
      store.Open(OpenFlags.ReadWrite);
      store.Remove(cert);
      store.Add(cert);
      store.Close();
      Console.WriteLine("Certificate Successfully Installed.");
    }
  }
  catch (System.Exception ex)
  {
    Console.WriteLine(ex.Message);
    Console.ReadLine();
  }
}


* This source code was highlighted with Source Code Highlighter.
2. В папке "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\"
   скопировать "WindowsInstaller3_1" и переименовать копию в "CertificatesInstaller". В неё скопировать "InstallCertificates.exe" и сгенерированный pfx сертификат ("myxbapkey.pxf").
3. Изменить Product.xml
<?xml version="1.0" encoding="utf-8" ?>

<Product
 xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
 ProductCode="B2Bits.Certificates.Installer.1.0"
>

  <!-- Defines list of files to be copied on build -->
  <PackageFiles CopyAllPackageFiles="true">
    <PackageFile Name="InstallCertificates.exe"/>
    <PackageFile Name="myxbapkey.pfx"/>
  </PackageFiles>

  <!-- Defines how to invoke the setup for the Windows installer 3.1 redist -->
  <Commands Reboot="None">
    <Command PackageFile="InstallCertificates.exe"
         Arguments= 'myxbapkey.pfx 12345'
         EstimatedInstallSeconds="15" >   
      <ExitCodes>
        <ExitCode Value="0" Result="Success"/>
        <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
      </ExitCodes>
    </Command>
  </Commands>
</Product>


* This source code was highlighted with Source Code Highlighter.
"12345" - это пароль заданный для сертификата при генерации.

4. Изменить Package.xml в папке "en"
<?xml version="1.0" encoding="utf-8" ?>

<Package
 xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
 Name="DisplayName"
 Culture="Culture"
 LicenseAgreement="eula.txt"
>

  <PackageFiles>
    <PackageFile Name="eula.txt"/>
  </PackageFiles>

  <!-- Defines a localizable string table for error messages-->
  <Strings>
    <String Name="DisplayName">Certificates Installer 1.0</String>
    <String Name="Culture">en</String>
    <String Name="AdminRequired">Administrator permissions are required to install Certificates Installer 1.0. Contact your administrator.</String>  
    <String Name="GeneralFailure">A failure occurred attempting to install Certificates Installer 1.0.</String>  
  </Strings>

</Package>


* This source code was highlighted with Source Code Highlighter.
5. Перезапустить VisualStudo, и в свойствах своего XBAP (WPF) проекта на вкладке Publish в списке Prerequisites
  включить галку "Create setup program to install prerequisite components"
  и выбрать -Windows Installer 3.1
                  -.NET Framework 3.5 SP1
                  - CertificatesInstaller

Если после всего этого опубликовать приложение, то будет создан msi package, который развернётся на клиенте и и запустит написанную в 1м пункте утилиту установки сертификата.

понедельник, августа 23, 2010

Ах, Самара - городок!

Прошедшие выходные пролетели в пути. Объектом путешествия стал город, находящийся выше по течению реки Волги - Самара. И не смотря на то, что провёл я там всего 1 день, город мне успел понравиться. На самом деле это не первый мой визит - я уже ездил однажды в аквапарк и ещё раз на DevDays - но оба предыдущих раза как-то погулять по городу не удалось. Во время первой поездки - утром от вокзала до аквапарка, вечером обратно и без пересадок. Во время второй - всё быстренько на машине. В итоге, данная поездка позволила несколько ближе узнать город и горожан. И, как я уже сказал, и город, и горожане мне показались весьма приятными. Понятно, что сама смена обстановки уже является отдыхом и это накладывает положительный отпечаток на картину в целом, но вот, казалось бы, мелочи: кондуктора улыбаются, продавцы не хамят, водители останавливаются перед переходом, общественный транспорт ходит регулярно и его много - всё это вместе очень влияет на общее впечатление от города. А ещё, мне показалось, что люди там реально добрее и цивилизованнее, чем у нас: ну банки о обёртки бросают в урны, разговаривают интеллигентнее, матюков используют меньше. Да там грязь такая же, как в Саратове и такие же плохие дороги. Наверное, в любом провинциальном городе дроги являются проблемой. Да там стройки на каждом углу, как в Москве, но там строится жильё и торгово-развлекательные комплексы, а это много рабочих мест и конкуренция на рынке аренды офисной недвижимости. Однозначно этот город уже гораздо более развит, нежели наша "столица Поволжья" и всё становится всё ближе к Москве.

суббота, августа 07, 2010

Ди Каприо доставляет

То ли я изменился, то ли он, но что-то в последнее время фильмы с Леонардо Ди Каприо кажутся мне довольно интересными. Ну, то есть понятно, что изменились мы оба, а непонятно изменился ли мой вкус на столько, что Леонардо начал нравиться, или же изменилась его игра. Взять, к примеру, недавно мною посмотренный "Остров проклятых". Фильм захватывающий, а главный герой - так вообще мегаофигенен! А совсем на днях посмотрел ещё и "Начало". В кинотеатр ходил. Кстати, надо бы запомнить, что в жару в Победе в красном зале делать нечего - кондиционеры не справляются. Ну так я отвлёкся. Сам фильм "Начало" очень интересен, насыщен спец эффектами и, самое главное, там есть идея! Это не какой-то там боевичок! Тут нам рассказывают про осознанные сновидения, про управление сном, про сон во время сна и т.д. Вы только представьте себе: многоуровневый сон, в который тебя погружают, причём это не твой сон, а сон другого человека! Вот где мозг плавится и "ум за разум заходит"! Короче говоря, я в восторге и от идеи, и от фильма, и от игры актёров. Смотреть обязательно на большом экране.

пятница, августа 06, 2010

ПроЖареное

Сегодня второй день, как жара начала отпускать. По крайней мере, по моим ощущениям. И сразу заметно возросла производительность мозга. На прошлых неделях, когда на улице было примерно 45 в тени, 2 кондиционера в нашей комнате охлаждали воздух до 30 градусов. А иногда и до 30 не охлаждали, а в духоте при 33 градусах жары работалось очень тяжело и медленно. Опять-таки, сон в такую жару - просто никакой. А, следовательно, регулярно невысыпающийся организм, столь же регулярно прожариваемый снаружи, очень активно сопротивляется любой нагрузке - как физической, так и умственной. В итоге накопилось недоделанной работы, которую вот сейчас с удовольствием разгребаю.
Из-за жары, опять-таки, пришлось забросить самообучение - дома кондиционера нет, а от вентилятора толку никакого. Зато сегодня в рюкзак вновь попала книга CLR via C# - опять буду читать по дороге на работу. Надо уже как-то восстанавливать график )

понедельник, июля 26, 2010

Опять про пати

Вся сознательная блоггерская общественность уже отписала своё мнение о прошедшем мероприятии, а я как всегда с опозданием. Оправдывает меня лишь то, что я знаю наверняка, что запоминаются только последние слова (это мне Штирлиц рассказал) и, следовательно, отписываю последним.
Отдавая дань традициям, заложенным очень давно, наша компания вновь выдвинулась на природу с целью проведения летнего праздника. Как и год назад, это мероприятие провели в Ассамблее и прошлогодние происшествия не смутили наше руководство. Для того, чтобы снизить риск наступления этих последствий, руководство приняло решение заказать только шашлык и плов и отказаться от всяких салатиков. Плов, кстати, был вкусным. Вот только что-то там с чем-то не срослось, кто-то с кем-то не договорился, в итоге мы уехали с мероприятия до его завершения, потому как кушать хотелось - шашлыка мне, как и многим другим, не хватило... На самом деле, проблемы начались ещё на входе, когда охрана отказалась пускать нас (в том числе и нашего диектора), объясняя тем, что им не подали пофамильные списки участников! Разрулили её тем, что я героически стоял на входе и говорил кто наш, а кто не наш. Я не знаю кто прав, а кто виноват в данной ситуации, но мне не нравится тенденция проведения мероприятий нашей компанией: с каждым годом сюрпризов становится больше и далеко не все из них приятные.

четверг, июля 01, 2010

Китайский сюрприз

Сегодня утром получил посылку из Китая. Вид упаковки насторожил сразу и я, в общем-то, смирился с тем, что внутри всё поломано.


Подозрения усилились после того как я распечатал конверт и извлёк оттуда коробку.

Хотя, наличие рассеивателя немного обрадовало :) На самом деле зря я опасался. Внутри коробки, за ещё одним слоем картона, в специальном мешочке лежала она - китайская вспышка Speedlite YN460-II, купленная на eBay и высланная из поднебесной аж 11 июня.
Итого, доставка заняла 20 дней. Качество пластика, мешочка и рассеивателя приятное. Буду теперь светить ярче, с новой то пыхалкой :)

суббота, июня 26, 2010

Очередная Nokia

За пять с половиной лет использования моя старенькая Nokia 5140 успела повидать виды и начала рассыпаться. Казалось бы, ничего страшного - заменил корпус и пользуйся дальше, вот только с корпусами в нашем городишке как-то не очень. Нашёл однажды некий корпус китайского производства, так с него краска начла облазить буквально в первый день использования, а резина - на следующий. В итоге, укореняясь в мысли о покупке нового телефона, я начал смотреть на доступный предложения. И как-то поначалу рынок меня не то чтобы сильно разочаровал, но немного расстроить получилось. Как-то не радовало меня то, что я вижу на прилавках или в журнальчиках - если нравится, хначит стоит как чугунный мост, а если цена нравится - то аппаратик отвратненький )
В общем собрался я уже обратить взор в сторону других компаний (прежде я рассматривал только Nokia), но тут на глаза мне попался он! Мы с ним сразу понравились друг другу. Ну по крайне мере он мне. Короче говоря, теперь я счастливый обладатель аппарата Nokia 3720 радостного жёлтого цвета. То есть он не весь жёлтый, а только вставки. Не буду писать тут ничего про технические характеристики, потому как выбор на телефон пал на телефон не из-за них, а из-за его защищённости от пыли и влаги и ударопрочности. А вот об этом обо всём я нашёл на ютубе кучу роликов! Вот некоторые из них!





Больше видео на ютубе. Из минусов, пожалуй, отсутствие функции Бумажник. Уж очень удобно было в нём хранить пинкоды от множества карточек и паролей от интернет-банков.