Показаны сообщения с ярлыком работа. Показать все сообщения
Показаны сообщения с ярлыком работа. Показать все сообщения

четверг, сентября 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м пункте утилиту установки сертификата.

четверг, мая 06, 2010

Биндим IEnumerable к ListBox

Недавно возникла потребность забиндить IEnumerable<XElement> источниклм данных к обчному ListBox. Казалось бы, чтого проще? Но забиндить нужно так, чтобы выглядело user friendly. Собственно, если просто присвоить свойству DataSource значение, то для каждого XElement будет вызван ToString(), который вернёт строковое представление XML элемента. Это, конечно, не плохо, и, навреное, даже удобно для разраотчика - сразу видно что выбрал, но для конечного пользователя программного продукта выглядит это ужасно.
Спустя недолгое время мук творчества на свет был рождён вот такой компактный и удобный код:

void fillListBox(ListBox listBox, IEnumerable<XElement> elements)
{
  if (listBox == null || elements == null)
    return;

  listBox.Items.Clear();

  listBox.DisplayMember = "Value";
  listBox.ValueMember = "Key";

  foreach (var element in elements)
  {
    listBox.Items.Add(
      new KeyValuePair(element, element.Attribute("name"))
      );
  }
}


* This source code was highlighted with Source Code Highlighter.

В результате пользователь имеет удобный и красивый список, а программист имеет лёгкую возможность взять SelectedValue и получить выбранный XElement.

вторник, апреля 06, 2010

О работе на работе

Вот сколько раз зарекался рабочими вопросами заниматься только в рабочее время. Но, блин, ровно столько же раз это обещане нарушал. Вот и в последний раз над задачей с прошлой недели мозг ломал, и все выходные она из головы не выходила. Но всё, хватит. Теперь о работе буду думать только на работе и не более 8 часов в день. Кстати вчера попробовал так - то есть уйти с работы и выкинуть мысли о ней из головы, а при попытке их вползти обратно в голову, гнать их прочь - и это мне очень понравилось. В результате я сегодня бодр, свеж и выспавшийся :) В общем, рабочие мысли, будте в голове только когда я в офисе, а в остальное время бойтесь меня и сидите где нибудь подальше от головы!

среда, ноября 04, 2009

Книжка-раскраска

Что-то октябрь месяц выдался наименее плодородным для постов в моём блоге. Скорее всего, это произошло из-за работы, которая навалилась снежным комом. Проект, на котором я сейчас тружусь и который мы сейчас заканчиваем, в последние дни своего существования заставляет работать со всё большей отдачей, что, безусловно, сказывается на общей усталости организма.
И вот, воспользовавшись выходным, я решил немного разукрасить свой блог. Ну во-первых, первая буква поста теперь красного цвета - клёва, да?
Во-вторых, я написал своё собственное облачко тэгов и прикрутил его сюда взамен старому. Если кому надо такое же - пишите, расскажу как использовать.
Вот так и живём.

воскресенье, октября 11, 2009

Ну, собственно говоря, вот и всё

Ну, собственно говоря, вот и всё - кончился отпуск. Ещё неделю назад, распрощавшись с черноморским побережьем, неоднократно воспетым Алексом Экслером в своих рассказах, сев в поезд, я помчался обратно, домой. Там же, в Лазаревке, я встретил свой тридцатый год жизни.
Это было примерно вот так:
Ну и ещё так
Но на самом деле были и солнечные и тёплые дни.
Подытоживая проведённое время, можно сказать, что отпуск удался - я сделал всё, что планировал, ну или почти всё (процентов на 99). К тому же был опробован мой нетбук. Его удобно таскать, потому как он лёгкий, но обещанные 4-5 часов он живёт при минимальной яркости дисплея - если в поезде ночью это не помеха работе, то днём на пляже работать при такой подсветке не очень удобно. В остальном машинка справлялась со всеми задачами и нареканий не вызывала.

пятница, сентября 25, 2009

Вперёд и только вперёд!

Ура! Ура! Ура!
Примерно так я порадовался, когда сделал на сегодня последний коммит. Ну что же, статус по направлениям таков:
  1. все запланированные и внеплановые срочные задачи по работе сделаны;
  2. планы на будущее, в основном не связанные с текущей работой, построены;
  3. в ноут закинуто всё, что хочется сделать/изучить/почитать.
Мой полный энтузиазма взгляд направлен в южную сторону, рука сжимает ручку чемодана. На неделю я свободен от репортинга и могу посвятить всё своё время изучению упущенного и тестовым заданиям!
И снова УРА! УРА! УРА!

четверг, сентября 24, 2009

Стандартный жизненный workflow

И почему так всегда получается? Вот вроде бы напрягся и всю запланированную работу переделал раньше срока, появилось немного времени, начал делать что-то для себя, тут же появилась какая-то срочная работа! А вот если сидишь, и для себя ничего не делаешь, да и вообще ничего не делаешь, работа не появляется...

пятница, сентября 11, 2009

Непростая печать отчётов

Жил да был один проект и всё на нём было хорошо: и инженеры при деле, и менеджеры спокойны, и заказчик доволен. Но заказчик на то и заказчик, чтобы что нибудь новенькое заказывать. И вот приснилось этому заказчику, что он хочет отчёты распечатывать прямо из ASP.NET приложения. Раньше то у него как было - открыл окошко с отчётом, экспортировал это в Excel или PDF и сиди себе спокойно. Ан нет, теперь подавай прямую печать. Ну надо так надо, сказали инженеры.
В общем то, имея опыт общения с Crystal Reports, я ошибчно полагал, что с печатью у MS проблем не будет. Но не тут то было. Оказалось, что для реализации клиентской печати нужно переходить на серверные отчёты. То есть сам компонент, используемый для отображения отчёта, не может осуществить печать, а нужно отдельно ставить SQL Server Reporting Services (SSRS). Но нет таких задач, с которыми не справился бы наш инженер. В кратчайшие сроки проблемы была решена, заказчик удовлетворён и вновь ввергнут в шаткое состояние перманентного счастья.
Для заказчика и потомков был рождён на свет документ с детальным описанием процесса перехода от локальных отчётов к серверным. Документ лежит здесь.

пятница, августа 07, 2009

Vista + IIS 7 + Visual Studio 2005

Microsoft со своими технологиями не стоит на месте, а, наоборот, постоянно разивается и внедряет в массовое сознание необходимость перехода на всё новейшее. Поддавшись этому веянию я стал пользователем Windows Vista взамен Windows XP и последней среды разработки Visual Studio 2008. Но возникла тут производственная необходимость установить Visual Studio 2005. У меня был небольшой опыт использования 2005й студии под Vista, но касался он разработки Windows приложений, а тут WEB-приложение да ещё и на IIS базирующееся. Казалось бы, что 2005я студия, что виста, вещи не очень старые и всё должно работать без проблем, но не тут то было.
Первое, с чем пришлось столкнуться - студия не хотела рабатать с IIS до тех пор, пока не будет запущена от имени администратора. Решение проблемы - специальный ярлык на рабочем столе, который запускает её от имени этого самого администратора. можно проще - каждый раз на обычном ярлыке вызывать контекстное меню и выбирать пункт "Запустить от имени администратора", но тут уж каждый волен выбрать что ему нравится.
Далее танцы с бубном на тему пермиссий. К папкам "c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\" и "c:\Windows\temp\" пользователям NETWORK SERVICE и IIS_USRS надо дать полный доступ. Это можно сделать из свойств каждой папки.
Следующий пункт - это контроль того, какие компоненты IIS установлены. Обязытельными к установке являются компоненты:
  • IIS Metabase and IIS 6 configuration compatibility
  • .NET Extensibility
  • ASP.NET
  • ISAPI Extensions
  • ISAPI Filters
  • Windows Authentication
Далее идём в IIS Manager (inetmgr) и в свойствах нашего приложения заходим в Authentication и ставим Enabled для Windows Authentication.
И вот, проделав такие нехитрые, но не очевидные манипуляции, мы обретаем счастье запускать IIS based WEB-приложения из Visual Studio 2005.

четверг, июня 11, 2009

Долбаная секурность и долбаный Crystal Reports

Столкнулись мы тут с проблемой, что у заказчика в интранете между двумя серверами стоит файрвол: меджу сервером с нашим вэб приложением и сервером Crystal Reports. И настроен этот файрвол очень недоброжелательно - не пропускает он пакетики! Говорим заказчику "Открой!", а он кричит "Несекурно!"... Надо как то решать проблему - отчёты то не показываются! Взор наш был обращён на официальный гайд от Business Objects под названием, которое говорит само за себя "Configuring the Crystal Enterprise SDK for Firewalls"! Вот оно! То, что надо! Ура! Но радовались мы рано...
В общемы по этому документу настроили мы все порты по-порядку CMS на 6402, RAS на 6403, на файрволе открыли их, но вот репорты всё равно не кажутся... Все головы изломали, что же с этим делать то.
Но самая гадкая штука - это сообщение об ошибке: "Load report failed". Такое сообщение возникает в более чем 1500 случаев!!!!
И тут решили проверить телнет на порт 6403 с сервера приложений на сервер отчётов и вуаля - порт то по-прежнему закрыт!!! Кстати открыть его должен был и отрапортавал, что порт открыт, опять таки, американец индийского происхождения!!!
Кстати говоря, пока траблшутил эту проблему столкнулся с первым в моей жизни адекватным индоамериканцем! Работать с ним крайне приятно! Так что, кажется, не все они такие, что не может не радовать.

среда, апреля 22, 2009

Happy Vista customer

Однажды у меня состоялся примерно такой диалог с заказчиком:
Заказчик: Уфф, сегодня излечил свой компьютер от вируса под названием Windows Vista.
Я: Хмм, тебе не нравится Vista? У меня на лэптопе стоит Vista и мне она нравится.
Заказчик: Ну, тогда ты наверняка единственный счастливый пользователь Vista.

С тех пор прошло уже много времени - наверное, уже год, а я так и остался Happy Vista customer'ом. И вот сегодня на рабочем компе у меня тоже завёлся зверёк под названием Windows Vista Enterprise, чему я, в общем-то, безмерно рад. Вот сейчас поставил студию, восстановил закладки файрфокса, поставил всякую мелочь, типа плеера и сижу, наслаждаюсь.

В ожидании Windows 7.