Prog. Pages.

четверг, 20 ноября 2014 г.

Разворачиваем ASP.NET vNext под Ubuntu 14.04

   Для начала нужно скачать и установить саму операционку. Я брал образ с официального сайта.
http://www.ubuntu.com/download/desktop/contribute/?version=14.04.1&architecture=amd64
    Далее этот образ я развернул наVirtualBox поскольку это был просто эксперимент.    

    Чтобы запустить приложение на ASP.NET vNext под Ubuntu нам необходимо две вещи: проект оформленный в новом стиле ASP.NET vNext и развернутый и запущенный KRuntime с возможностью поднятия веб сервера Kestrel.

      Создание приложения

    Первая задача решается просто. Можно взять готовый очень простой пример с гитхаба https://github.com/aspnet/Home/tree/master/samples/HelloWeb.
    Если гит еще не установлен, устанавливаем его.
sudo apt-get install git
    Затем клонируем себе репозиторий с примерами.
git clone https://github.com/aspnet/Home.git

        Инфраструктура

    Вторая задача посложнее, но тоже решаема. Процесс состоит из следующих этапов:

      1. Установка Mono

wget http://download.mono-project.com/repo/xamarin.gpg
sudo apt-key add xamarin.gpg
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee --append /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-complete

      2. Установка KRuntime

        Разрешаем kvm лазить на свои сайты по своим сертификатам.
sudo certmgr -ssl -m https://go.microsoft.com
sudo certmgr -ssl -m https://nugetgallery.blob.core.windows.net
sudo certmgr -ssl -m https://nuget.org
mozroots --import --sync
        Скачиваем скрипт установки kvm и запускаем его, после чего запускаем kvm upgrade, и теперь все что нужно у нас уже установлено.
curl https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.sh | sh && source ~/.kre/kvm/kvm.sh && kvm upgrade
        Вытягиваем все зависимости KRuntime
kpm restore

      3. Установка Bower

        Если не установлен NPM устанавливаем
sudo apt-get install npm

      4. Запуск Web-сервера

    Компилим libuv, и (жесткий хак), копируем сборку в папки KRuntime, поскольку там лежат по умолчанию несовместимые версии, поскольку MS еще не работали над поддержкой Linux.
    На данный момент KRuntime необходима версия 1.0.0-rc1 и сам KRuntime находится в версии 1.0.0-beta1. Все это очень быстро меняется, поэтому всегда необходимо знать какие версии линковались между собой последний раз.
wget http://dist.libuv.org/dist/v1.0.0-rc1/libuv-v1.0.0-rc1.tar.gz 
tar -xvf libuv-v1.0.0-rc1.tar.gz
cd libuv-v1.0.0-rc1/
./gyp_uv.py -f make -Duv_library=shared_library
make -C out
sudo cp out/Debug/lib.target/libuv.so /usr/lib/libuv.so.1.0.0-rc1
sudo cp out/Debug/lib.target/libuv.so ~/.kpm/packages/Microsoft.AspNet.Server.Kestrel/1.0.0-beta1/native/darwin/universal/libuv.dylib
sudo ln -s libuv.so.1.0.0-rc1 /usr/
npm install -g bowerlib/libuv.so.1
    Вся работа с KRuntime выполняется над приложением, соответственно мы должны находится в директории с проектом, где лежит project.json. В нашем случае делаем

cd Home/samples/HelloWeb/
    Запускаем наше приложение на сервере kestrel (все настройки в файле project.json)
k kestrel
    Открываем браузер и переходим по адресу
http://localhost:5004
    ну или другой адрес указанный в project.json рядом с kestrel.
 


пятница, 26 ноября 2010 г.

Шаблон MVVM

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

вторник, 7 сентября 2010 г.

Далее..

Далее стоит задача обработки документа Word (предположительно) через XML.
Понять:
1. В каком виде буду хранить документ
Предположительно будет храниться в виде docx файла. Шаблон в таком же виде, но в папках программы.
2. Каким образом он будет отображаться? А это вообще главный вопрос..
Отображение будет в виде RichBox.

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

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

воскресенье, 5 сентября 2010 г.

Хозяйке на заметку 3. Атрибут Description.

Атрибут Description отвечает за интерпритацию полного имени класса, именем, которое мы задаем в атрибуте.
Чтобы вытащить этот атрибут необходима такая конструкция:
AttributeCollection attributes =
                   TypeDescriptor.GetAttributes(this);

                /* this - это текущий класс из которого вытаскиваем атрибут*/
                DescriptionAttribute myAttribute =
                   (DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
Вот такая загагулина получилась(с)Гоблин.

Хозяйке на заметку 2. Передача типа в метод.

Была задача по передаче типа в метод. Решается Generic-объектами.

public void CreateNewDocument<T>(String name)
        {
            switch (typeof(T).Name)
            {
                case "Contract": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateContract), name); }
                case "Act": { return (IDocument)StaticFabric.Create(new CreateHandler(HowToCreateAct), name); }
                default: { return null; }
            }
        }
т.е. Мы передаем тип при вызове метода (CreateNewDocument<Contract>("123")) и используем этот тип в методе.

среда, 1 сентября 2010 г.

Хозяйкена заметку1. TreeView и отображение диковинных структур.

Хозяйке на заметку:
1.Если не работает сложный биндинг, то стоит разбить задачу этого биндинга на мелкие подзадачи и проверить каждую из них на простых элементах, типа TextBlock.

Специфика задачи:
Нужно было отобразить данные в TreeView. Данные устроены особым образом:
МенеджерПриложения содержит хранилище, в нем есть коллекция, содержащая проекты.
У каждого проекта также есть хранилище, в котором есть коллекция документов (разных типов).
Нужно показать в дереве взаимоотношения проектов и документов.
К сожалению сходу этого не получилось, и долго ковырял волосы на затылке, в поисках решения проблемы. А все почему? А потому что из-за того, что Хранилище - абстрактный класс, и коллекция хранящаяся в нём так же должна была абстрагироваться, от типа, объекты которого хранятся в ней. И вследствие этого коллекцию я объявил, как коллекцию объектов Object, соответственно неявное привидение не срабатывало.
Решение: Упаковал все типы, которые мы будем хранить в интерфейс IObject, и Object поменял на IObject.

К слову.. Любые данные можно отобразить в TreeView благодаря конструкции
<HierarchicalDataTemplate DataType="{x:Type Docs:IDocument}">
            <TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
В данном случае все объекты типа Idocument будут отображены как TextBlock, поле Text которого привязан к свойству Name отображаемого элемента.
Так же, если элемент содержит в себе другие, можно передать элементу коллекцию следующих и шаблон их отображения. Шаблон можно заменить такой же конструкцией, только определённой для другого типа.

Начало.

И так, приступим к созданию ,надеюсь, длинного блога. Будет посвящен он моим мыслям, умозаключениям  по поводу разработки и повседневной жизни.