Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 28.04.12 11:27
Оценка: 190 (4)
В мире Java есть такой удобный инструмент, который называется jRebel. В двух словах, он позволяет изменять код веб приложения без перезагрузки домена. То есть исправил ты значение переменной в контроллере, нажал ctrl+s и можешь уже обновлять страницу в браузере. Так же как если бы ты кодил на PHP или другом интепретируемом языке.

Прямой аналог на дот нете сделать нереально. В джаве есть некоторые механизмы, которых нет в CLR.
Однако варианты есть, и одним из них я решил воспользоваться.
Упрощённая схема такая:
1. Отслеживаем сохранение файлов с кодом
2. Програмно пересобираем проект
3. Подгружаем новую сборку в наш домен
4. Из ControllerFactory даём ссылку на уже новый контроллер, который в свою очередь обращается к новым типам

На практике, конечно, всё оказалось значительно сложнее, но тем не менее прототип работает.
Посмотреть можно тут: https://bitbucket.org/ionoy/easymvc_nemerle/

Хочу напомнить, что это прототип, так что скорее всего содержит кучу багов. Тем не менее, на некоторых достаточно крупных проектах я его уже тестировал.

Из-за непредсказуемости ошибок, некоторые части писались в стиле Debug Driven Development, так что качество кода пока хромает.

Первоначально писал на C#, но довольно быстро понял, что нервов не хватит чтобы на нём же и закончить. Поэтому я принял решение перевести всё Немерле. Это сильно упростило написание и поддержку кода, так как я смог формализовать задачу и отразить её в примитивах языка.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: Прототип аналога jRebel на Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.04.12 19:33
Оценка: +2
Здравствуйте, ionoy, Вы писали:

I>Первоначально писал на C#, но довольно быстро понял, что нервов не хватит чтобы на нём же и закончить. Поэтому я принял решение перевести всё Немерле. Это сильно упростило написание и поддержку кода, так как я смог формализовать задачу и отразить её в примитивах языка.


А можно об этом по подробнее?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Прототип аналога jRebel на Немерле
От: fddima  
Дата: 28.04.12 21:44
Оценка:
Здравствуйте, ionoy, Вы писали:

Я извиняюсь, то ли чего-то не понял... Но разве ASP.NET/XSP-хосты так не работают?

ЗЫ: Лучше скажите как обновить windows-service с минимальным временем простоя, без собственных велосипедов. Собственный блэкджек будет, но позже, а пока...
Re: Прототип аналога jRebel на Немерле
От: fddima  
Дата: 28.04.12 22:02
Оценка: 6 (1)
Здравствуйте, ionoy, Вы писали:

Ага. Я кажется потихоньку начал въезжать. Спасибо, действительно интересно. Хотя с практической точки зрения не уверен что это реально кому-то нужно — но не мне судить. Видимо нужно, раз такое появилось на свет.

ЗЫ: И ещё — спасибо за выбор bitbucket — последняя массовая шиза по поводу github, в котором ничего хорошего нет (хорошее есть, но не больше и не лучше, чем у других), — уже реально заколебала.
Re: Прототип аналога jRebel на Немерле
От: fddima  
Дата: 28.04.12 22:06
Оценка:
Здравствуйте, ionoy, Вы писали:

И ещё — по поводу оформления проекта — readme.txt — просто отвратителен — попытайтесь вменяемо описать для чего этот проект предназначен, что делает и как его использует — не нужно очень много текста, но сейчас, если зайти на страницу проекта — даже неясно для чего эта штукенция! Это нехорошо.
Re[2]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 29.04.12 07:24
Оценка: 6 (1)
Здравствуйте, fddima, Вы писали:
F>Ага. Я кажется потихоньку начал въезжать. Спасибо, действительно интересно. Хотя с практической точки зрения не уверен что это реально кому-то нужно — но не мне судить. Видимо нужно, раз такое появилось на свет.
У меня есть некоторые проекты, где стадия инициализации приложения занимает больше 20 секунд. То есть, если я активно правлю бэкенд, то мне после каждого изменения в коде приходится ждать почти пол минуты. В данном же случае, мне достаточно сохранить файл, переключиться на браузер и нажать F5. Как только закончится билд, я сразу получу исправленную страницу. Также не стоит забывать, что иногда очень полезно не терять сессию, кэш и прочую стейтфул информацию.

F>ЗЫ: И ещё — спасибо за выбор bitbucket — последняя массовая шиза по поводу github, в котором ничего хорошего нет (хорошее есть, но не больше и не лучше, чем у других), — уже реально заколебала.

Собственно меня привлекли бесплатные приватные репозитории. Да и к тому же, теперь там есть как Hg, так и Git.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 29.04.12 07:27
Оценка:
Здравствуйте, fddima, Вы писали:
F>И ещё — по поводу оформления проекта — readme.txt — просто отвратителен — попытайтесь вменяемо описать для чего этот проект предназначен, что делает и как его использует — не нужно очень много текста, но сейчас, если зайти на страницу проекта — даже неясно для чего эта штукенция! Это нехорошо.
Да, тут должен извиниться. Только вчера репозиторий сделал публичным, и пока он не предназначен для простых пользователей. В readme сейчас только самое необходимое -- как приладить EasyMVC к своему проекту.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 29.04.12 07:53
Оценка: 62 (2)
Здравствуйте, VladD2, Вы писали:
VD>А можно об этом по подробнее?

После того, как проект пересобран, мне нужно заменить все старые типы на новые в тех местах, где они сами не заменятся. Одно из таких мест, это DI контейнер.

Алгоритм на первый взгляд достаточно простой, но вот реализация достаточно сложная.
Надо обойти весь контейнер, найти все Type'ы и инстансы из нашей сборки, сохранить локешейшены и при следующем ребилде их обновить.
Локейшен — это в простейшем случае пара (instance, fieldInfo). Но что делать, если поле находится в структуре, которая сохранена в массиве?

На с#, для того, чтобы решить эту задачу мне пришлось мастерить нефиговые такие костыли. Когда размер костылей превысил размер вменяемого кода, я понял, что надо что-то менять.
Тогда я и решил перейти на Nemerle. Теперь я при обходе, с помощью вариантов, строю абстактное дерево внутренностей контейнера. На следующем этапе я с помощью ПМ это дерево разбираю. А функцию локейшенов теперь выполняют локальные функции и partial application. Так что теперь я после ребилда прохожусь в цикле по списку функций от двух аргументов, за которыми на самом может скрываться любая логика в зависимости от того, в каком участке дерева она применяется.

Также мне пригодился макрос late, который я переделал под private, чтобы он доставал и приватные члены класса. (кстати, как правильно оформить верхушку этого макроса, я ведь там всего одну строчку изменил? сейчас там написано, что это модификация макроса late) Этот макрос позволил заменить целую библиотеку ReflectionMagic, которой я пользовался в C#.

Короче говоря, пользовался всем понемножку, оно как-то само органично вписывалось в мои требования. Или если более правильно выразить, то сократился разрыв между представлением алгоритма и его реализацией в коде.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Прототип аналога jRebel на Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.12 14:38
Оценка:
Здравствуйте, ionoy, Вы писали:

I>кстати, как правильно оформить верхушку этого макроса, я ведь там всего одну строчку изменил?


По уму нужно добавить дополнительный параметр с дефолтным значением, так чтобы по умолчанию было старое поведение, но когда нужно можно было бы указать, что нужен приватный член. Ну, и предложить пул-реквест.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Прототип аналога jRebel на Немерле
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.04.12 18:20
Оценка:
Здравствуйте, fddima, Вы писали:

F>ЗЫ: И ещё — спасибо за выбор bitbucket — последняя массовая шиза по поводу github,


Какая разница какой сорс-контрол?

F>в котором ничего хорошего нет (хорошее есть, но не больше и не лучше, чем у других), — уже реально заколебала.


В нем есть подстветка немерла
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Прототип аналога jRebel на Немерле
От: Аноним  
Дата: 01.05.12 13:40
Оценка:
Здравствуйте, ionoy, Вы писали:

I>В мире Java есть такой удобный инструмент, который называется jRebel.

В мире .NET есть такая штука как Edit and Continue.
Re[2]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 01.05.12 14:05
Оценка:
Здравствуйте, Аноним, Вы писали:
А>В мире .NET есть такая штука как Edit and Continue.
Спасибо, кэп.

Edit and Continue — очень ограниченная штука. Нельзя изменять методы с лямбдами, нельзя добавлять новые члены/классы. Нельзя даже сигнатуры методов менять.
Короче, толку от него ноль.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: Прототип аналога jRebel на Немерле
От: Аноним  
Дата: 01.05.12 17:07
Оценка: :)
Здравствуйте, ionoy, Вы писали:
I>Нельзя изменять методы с лямбдами, нельзя добавлять новые члены/классы. Нельзя даже сигнатуры методов менять.
I>Короче, толку от него ноль.
Короче ничего нельзя, но когда потребовалось описать зачем нужен аналог jRebel на Nemerle один человек почему то в качестве примера написал:

I>То есть исправил ты значение переменной в контроллере, нажал ctrl+s и можешь уже обновлять страницу в браузере.



Так вот для случая изменения значения переменной Edit and Continue гораздо круче.
В частности можно даже не прерывать отладочную сессию и будет тот же стек вызовов.
Собственно, даже не потребуется обновлять страницу в браузере.

А с более глобальными изменениями, типа добавления новых членов, новых классов, изменения сигнатур методов и так неплохо справляется механизм ASP.NET

Поменял страницу, Ctrl+S, ну может быть еще Ctrl+B, вот уже и новая функциональность.

Вообще сама по себе странная идея брать что-то с заведомо устаревшей платформы Java и переносить её на обогнавшую её на годы платформу .NET.
Re[4]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 01.05.12 17:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Короче ничего нельзя, но когда потребовалось описать зачем нужен аналог jRebel на Nemerle один человек почему то в качестве примера написал:

I>>То есть исправил ты значение переменной в контроллере, нажал ctrl+s и можешь уже обновлять страницу в браузере.
А>
Это был самый простой пример, который я мог привести, чтобы показать функциональность. Зачем цепляться за это?

А>Так вот для случая изменения значения переменной Edit and Continue гораздо круче.

А>В частности можно даже не прерывать отладочную сессию и будет тот же стек вызовов.
А>Собственно, даже не потребуется обновлять страницу в браузере.
Он "круче" только тем, что можно во время дебага менять код. Только в реальности это никем никогда не используется.
Зато замыкания используются очень часто.

А>А с более глобальными изменениями, типа добавления новых членов, новых классов, изменения сигнатур методов и так неплохо справляется механизм ASP.NET

Как это он справляется в MVC, подскажешь?

А>Поменял страницу, Ctrl+S, ну может быть еще Ctrl+B, вот уже и новая функциональность.

Если мы говорим про Web Application, то не "ну может быть ещё Ctrl+B", а обязательно Ctrl+Shift+B. На лету компилируются только представления.

А>Вообще сама по себе странная идея брать что-то с заведомо устаревшей платформы Java и переносить её на обогнавшую её на годы платформу .NET.

Я ничего не переносил с Java, я только взял идею. Увидел как знакомые радуются jRebel и решил, что нечто подобное могло бы быть и на .NET
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[5]: Прототип аналога jRebel на Немерле
От: Аноним  
Дата: 01.05.12 18:18
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Это был самый простой пример, который я мог привести, чтобы показать функциональность. Зачем цепляться за это?

Что значит цепляться? Очевидно, что это был самый распространенный пример, который прежде всего приходит в голову.
Поэтому заявлять что толку от Edit and Continue ноль, некорректно.
Где же ноль, когда он успешно справляется с самым часто встречающимся случаем?

I>Он "круче" только тем, что можно во время дебага менять код.

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

I>Зато замыкания используются очень часто.

Да, это большой недостаток Edit and Continue.
Впрочем и без поддержки замыканий, это одна из Killer возможностей .NET.

I>Как это он справляется в MVC, подскажешь?

MVC заточен на более длительный цикл разработки с активным использованием Юнит тестирования.
Подход с подгрузкой в рантайме измененных классов в домен в нём слабо уместен, так как вполне вероятно, что новые классы, новые методы, просто не пройдут юнит тесты, или они для них вообще еще не будут написаны.

I>а обязательно Ctrl+Shift+B. На лету компилируются только представления.

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

I>Увидел как знакомые радуются jRebel и решил, что нечто подобное могло бы быть и на .NET

Насколько я понимаю, на java jRebel сделано с глубоким внедрением в JDK.
У вас же фактически повторение идеи с ASP.NET, ну чуть более оптимизированное, думаю выигрышь достигается только на каких-то супер огромных сборках или на слабом железе. И кстати сомневаюсь, что решение совместимо например со строгими именами сборки.
Re[6]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 01.05.12 20:18
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Поэтому заявлять что толку от Edit and Continue ноль, некорректно.
Вполне корректно. На практике он никому не нужен.

А>Где же ноль, когда он успешно справляется с самым часто встречающимся случаем?

Это не самый часто встречающийся сценарий.

I>>Он "круче" только тем, что можно во время дебага менять код.

А>Это, мягко говоря, не слабо, кавычки заведомо не уместны.
Уместны.

А>Вообще сомнительно что подобная возможность есть в каких-либо других более-менее распространенных языков программирования. Симулу и Модулу в расчет не берем.

Потому что в том виде, в котором эта фича реализована она никому не нужна. Ей практически невозможно пользоваться.

I>>Зато замыкания используются очень часто.

А>Да, это большой недостаток Edit and Continue.
А>Впрочем и без поддержки замыканий, это одна из Killer возможностей .NET.
Где же тут Killer, если она ничего кроме примитивных вещёй не умеет.

I>>Как это он справляется в MVC, подскажешь?

А>MVC заточен на более длительный цикл разработки с активным использованием Юнит тестирования.
Он только даёт возможность легко тестировать, но не заставляет.

А>Подход с подгрузкой в рантайме измененных классов в домен в нём слабо уместен, так как вполне вероятно, что новые классы, новые методы, просто не пройдут юнит тесты, или они для них вообще еще не будут написаны.

Не все пишут Tests First.

I>>а обязательно Ctrl+Shift+B. На лету компилируются только представления.

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

I>>Увидел как знакомые радуются jRebel и решил, что нечто подобное могло бы быть и на .NET

А>Насколько я понимаю, на java jRebel сделано с глубоким внедрением в JDK.
А>У вас же фактически повторение идеи с ASP.NET, ну чуть более оптимизированное, думаю выигрышь достигается только на каких-то супер огромных сборках или на слабом железе. И кстати сомневаюсь, что решение совместимо например со строгими именами сборки.
Зачем веб приложению строгое имя?

---

Я не понимаю, что ты пытаешься здесь доказать. Ну не будет это никому интересно и ладно, что поделать. Жалко будет потраченого времени, но не более того.
Дэвид Еббо, кстати, сказал что ему проект интересен и он будет следить.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[7]: Прототип аналога jRebel на Немерле
От: Аноним  
Дата: 01.05.12 20:47
Оценка: :)
Здравствуйте, ionoy, Вы писали:

I>Вполне корректно. На практике он никому не нужен.

StackOverflow [jRebel] — 31 questions tagged
StackOverflow [Edit-and-continue] — 24 questions tagged

StackOverflow jRebel — 238 search results
StackOverflow "edit and continue" — 270 search results

На сайте из вашей подписи.

I>Это не самый часто встречающийся сценарий.

Первый сценарий который пришел вам в голову.

I>Уместны.

Разве что от зависти. В Java такой штуки нет, про C++ уж молчу, может в каком Javascript или Ruby и можно реализовать, но без преимуществ статики.

I>Потому что в том виде, в котором эта фича реализована она никому не нужна.

Нужна очень многим, даже в текущем виде.

I>Ей практически невозможно пользоваться.

Если про нее не знать.

I>Где же тут Killer, если она ничего кроме примитивных вещёй не умеет.

Они же самые распространенные.

I>Дай мне пример, где это работает. Если честно я себе не представляю, как это можно сделать без жёсткого геморроя.

Допустим при загрузке Веб-приложения, оно при инициализации тупо создает БД уничтожая предыдущую версию, и наполняет её какими-то данными.
Естественно, процесс не очень быстрый. А база допустим строится по метаданным в коде на C#.
Самый примитивный способ переменная в конфиге и не пересоздавать каждый раз базу, тогда собственно запуск будет гораздо быстрее. Можно разнести на два приложения и в MSBuild настроить чтобы при изменениях в метаданных запускалось создание данных. В IIS можно вести развертывание в разные пули приложений.

I>Зачем веб приложению строгое имя?

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

I>Я не понимаю, что ты пытаешься здесь доказать.

Не очень понимаю, чего вы не понимаете. Здесь форум, здесь могут высказывать критические замечания.

I>Ну не будет это никому интересно и ладно, что поделать. Жалко будет потраченого времени, но не более того.

Уже кой-кому интересно, судя хотя бы по этой ветке. Не мне, сразу говорю.

I>Дэвид Еббо, кстати, сказал что ему проект интересен и он будет следить.

А я вот высказал критические замечания. На форумах, кто-то похвалит, кто-то поругает, так и живем.
Re[8]: Прототип аналога jRebel на Немерле
От: ionoy Эстония www.ammyui.com
Дата: 02.05.12 06:44
Оценка: +1
Здравствуйте, Аноним, Вы писали:
А>StackOverflow jRebel — 238 search results
А>StackOverflow "edit and continue" — 270 search results
Правильно, потому что "edit and continue" больше создаёт проблем, чем решает. Вот люди и спрашивают, как их обойти.

I>>Это не самый часто встречающийся сценарий.

А>Первый сценарий который пришел вам в голову.
Да, но только я слабо представляю, какие переменные нужно менять в экшенах.
Зато представляю, что часто приходится добавлять параметры, поля во viewmodel, изменять запрос к базе.

А>Разве что от зависти. В Java такой штуки нет, про C++ уж молчу, может в каком Javascript или Ruby и можно реализовать, но без преимуществ статики.

Потому что в Джава есть круче, там можно целиком класс загрузить. Вот это уже полезная фишка, в отличае от...
И что нужно реализовывать в Javascripte или Ruby? Изменение кода во время дебага?

I>>Потому что в том виде, в котором эта фича реализована она никому не нужна.

А>Нужна очень многим, даже в текущем виде.
Я встречал только людей, которые отключали её из-за того, что она часто вылезает когда не надо.

I>>Ей практически невозможно пользоваться.

А>Если про нее не знать.
В том то и дело, что она напоминает о себе, когда у тебя неожиданно срабатывает брейкпойнт. Очень бесячая штука.

I>>Где же тут Killer, если она ничего кроме примитивных вещёй не умеет.

А>Они же самые распространенные.
Ну так докажи, что они самые распространённые. Приведи список того, что она умеет, и кто этим пользуется. Потом посмотрим, что из этого умеет моя библиотека.
Ну а дальше сравним

А>Допустим при загрузке Веб-приложения, оно при инициализации тупо создает БД уничтожая предыдущую версию, и наполняет её какими-то данными.

А>Естественно, процесс не очень быстрый. А база допустим строится по метаданным в коде на C#.
А>Самый примитивный способ переменная в конфиге и не пересоздавать каждый раз базу, тогда собственно запуск будет гораздо быстрее. Можно разнести на два приложения и в MSBuild настроить чтобы при изменениях в метаданных запускалось создание данных. В IIS можно вести развертывание в разные пули приложений.
Согласен, генерация базы данных по модели это та задача, которую можно отделить. Но она далеко не единственная и общего решения для этой проблемы не существует. Я думаю ты и сам знаешь, что таскать объекты из одного домена в другой удовольствие не из приятных.

I>>Зачем веб приложению строгое имя?

А>Ну вы еще спросите зачем вообще нужны строгие имена.
А>Вот почему-то уверен, что на сайте микрософта веб-приложения имеют соответствующую подпись.
Точно уверен? Может они и библиотеки только подписанные используют?

I>>Я не понимаю, что ты пытаешься здесь доказать.

А>Не очень понимаю, чего вы не понимаете. Здесь форум, здесь могут высказывать критические замечания.
Критическое замечание было только одно: есть Edit and Continue. Я на это ответил, что он даже близко не сопоставим по возможностям. Единственный его плюс, это позможность менять код во время дебага, но это же и является его минусом.

I>>Дэвид Еббо, кстати, сказал что ему проект интересен и он будет следить.

А>А я вот высказал критические замечания. На форумах, кто-то похвалит, кто-то поругает, так и живем.
Так ругай по делу, конструктивно. Говори, что конкретно не так сделано, что работает лучше у конкурентов (EaC). Тогда и ответы будут нормальными.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[8]: Прототип аналога jRebel на Немерле
От: WolfHound  
Дата: 02.05.12 09:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Разве что от зависти. В Java такой штуки нет, про C++ уж молчу,

Edit and continue был еще в VC++6.
В VC++7 я его использовал на практике.

I>>Потому что в том виде, в котором эта фича реализована она никому не нужна.

А>Нужна очень многим, даже в текущем виде.
В текущем виде она действительно малополезна.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Прототип аналога jRebel на Немерле
От: Ziaw Россия  
Дата: 02.05.12 12:41
Оценка:
Здравствуйте, VladD2, Вы писали:

F>>в котором ничего хорошего нет (хорошее есть, но не больше и не лучше, чем у других), — уже реально заколебала.


VD>В нем есть подстветка немерла


На битбакете тоже есть ) Имхо, там те же пигменты, что и на гитхабе.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.