В свете повторно всплывшей темы про раскраску ещё кучи языков, я не мог обойти вниманием очень интересный и нужный (практически всем) язык. (Любопытный парадокс заключается в том, что чем больше человек владеет этим языком, тем больше он ему нужен).
Взгляните на это убожество:
(A)
/ |
v |
(B) |
| |
v v
(C)
А теперь посмотрите в окно — на дворе 21-й век. А мы как в старые добрые времена БК и Спектрумов рисуем псевдографикой... Есть ли альтернатива? (Ну кроме конечно графических редакторов).
Есть! GraphViz — инструментальная программа, которая принимает на вход описание графа, а выдаёт картинку с этим графом. Пользуется большой популярностью, используется в куче инструментов в качестве движка для создания диаграмм (например doxygen).
После такого вступления моё пожелание совсем нетрудно предугадать: ввести тэг [graphviz]:
[graphviz] ... здесь определение графа ... [/graphviz]
который бы преобразовывал текст в картинку и вставлял картинку в сообщение.
Пожалуйста, высказывайтесь, что вы думаете об этом.
PS:
Кстати (надо же какое совпадение!) буквально вчера я наткнулся на ajax-сервис (написан на Руби) http://ashitani.jp/gv/
Можно зайти, поиграться. Есть несколько особенностей, о которых можно глянуть здесь. Кроме того, картинки генерятся в гифах, посему совсем не переливаются всеми цветами радуги. И остаётся открытым вопрос, насколько долго там хранятся сгенерированные картинки и можно вешать прямые линки отсюда прямо туда...
PS0: Не рекомендуется в качестве пути файла вводить путь к шаре
PS1: К сожалению реализован только алгоритм dot, алгоритмы neato, twopi, fdp, circo — увы (пока?).
PS2: А можно тэг будет [gv][/gv]? (Для других алгоритмов (если таковые появятся) сделать тэги типа [gv=neato][/gv]).
Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.
Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, Lazy Cjow Rhrr, Вы писали:
S>>>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка... LCR>>Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.
S>*чешет в затылке* S>В принципе софтины то... текст, картинка и поле, и поле ввода, где коммстрока для преобразования одного в другое с кнопочкой "поехали"...
Emacs как всегда впереди планеты всей.
-- Главное про деструктор копирования не забыть --
Здравствуйте, Блудов Павел, Вы писали:
БП>Вот здесь есть COM объектик: http://home.so-net.net.tw/oodtsen/wingraphviz/index.htm БП>Я сделал к нему обёртку: http://rsdn.ru/File/507/CSharpGraphvizSample.zip БП>Запустил. На каждый чих вытекает по 30 GDI объектов и несколько килобайт памяти. Это неприемлимо. БП>Посмотрел исходники...
БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем. БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.
AdjacencyGraph g = new AdjacencyGraph(new VertexAndEdgeProvider(), true);
IVertex a = g.AddVertex();
IVertex b = g.AddVertex();
IVertex c = g.AddVertex();
IVertex d = g.AddVertex();
IVertex e = g.AddVertex();
g.AddEdge(a,b);
g.AddEdge(a,c);
g.AddEdge(b,c);
g.AddEdge(c,d);
g.AddEdge(a,e);
g.AddEdge(c,a);
new GraphvizAlgorithm(g).Write(); // На выходе получаем текст в формате Graphviz.
А нужнен компонент, который на входе получает текст, а на выходе даёт gif/png/svg.
Здравствуйте, Sheridan, Вы писали:
a>> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать... S>Да ты шо, ентож линуховый подход, неспортивно
Во-первых, это юниксовый подход. Во-вторых, ненависть к линуксу — это болезнь.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Пожалуйста, высказывайтесь, что вы думаете об этом.
Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ?
И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?
Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...
Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
Андрей Хропов,
LCR>>Пожалуйста, высказывайтесь, что вы думаете об этом. АХ>Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ? АХ>И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?
Да, именно, механика такая. Как вариант — можно не в файлы пользователей, а в "глобальный пул". DokuWiki например так работает. Хотя для RSDN лучше в файлы пользователя.
И лучше подставлять не ссылку, а сразу .
АХ>Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ... АХ>Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
Ну во-первых мне думается, что SVG намного тяжелее, а во-вторых — это непринципиально сейчас.
Блудов Павел,
БП>Идея здравая. Дело за тем чтобы раздобыть версию для .Net.
БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем. БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.
Sheridan
LCR>>Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:
S>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...
Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
S>>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка... LCR>Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.
*чешет в затылке*
В принципе софтины то... текст, картинка и поле, и поле ввода, где коммстрока для преобразования одного в другое с кнопочкой "поехали"...
Блудов Павел,
БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем. БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.
Короче, я смотрю на плагин gv для DokuWiki. Там всё тупо:
не применёт написать сообщение, которое так просадит сервер, что мало не покажется.
Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.
Здравствуйте, Блудов Павел, Вы писали:
БП>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.
В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?
akasoft,
БП>>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.
A>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?
Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
Зд7равствуйте, Lazy Cjow Rhrr, Вы писали:
A>>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках? LCR>Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
Ну я бы попробовал для начала собрать Win32 версию, затем помучил бы её каким-нибудь BoundsChecker'ом.
Смущают меня конструкции типа (lefty\ws\mswin32\gpcanvas.c)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Выдаёт такую картинку:
Не получается воспроизвести .
Вызов Dot.Run() приводит к закрытию приложения. FileMon кажет вот такие ошибки:
10:28:03 CSharpGraphvizS:3772 QUERY INFORMATION C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\%WINDIR%\FONTS\Times.ttf PATH NOT FOUND Attributes: Error
10:28:03 CSharpGraphvizS:3772 QUERY INFORMATION C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\%WINDIR%\FONTS\Times.dfont PATH NOT FOUND Attributes: Error
10:28:03 CSharpGraphvizS:3772 QUERY INFORMATION C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\%WINDIR%\FONTS\Times.pfa PATH NOT FOUND Attributes: Error
10:28:03 CSharpGraphvizS:3772 QUERY INFORMATION C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\%WINDIR%\FONTS\Times.pfb PATH NOT FOUND Attributes: Error
10:28:03 CSharpGraphvizS:3772 CREATE C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\c:\temp.bmp.png NAME INVALID Options: OverwriteIf Access: All
10:28:03 CSharpGraphvizS:3772 OPEN C:\work\paul\personal\CSharpGraphvizSample\bin\Debug\c:\ NAME INVALID Options: Open Directory Access: 00000000
Вызов
_dot.TempDir = Path.GetTempPath();
Результата не возимел.
Кстати, а что, Graphviz насмерть завязан на файлы? Т.е. на вход можно только файл на языке dot, а выходе непременно файл с картинкой?
Нельзя туда System.IO.Stream прикрутить?
Павел,
БП>Не получается воспроизвести . БП>Вызов Dot.Run() приводит к закрытию приложения. FileMon кажет вот такие ошибки:
...UZHOS GOES HERE...
БП>Кстати, а что, Graphviz насмерть завязан на файлы? Т.е. на вход можно только файл на языке dot, а выходе непременно файл с картинкой?
Ну ты взгляни на пример — там на вход подаётся простая строка, а файл только на выходе. Брать надо Dot который из Helpers, а не из базового неймспейса.
БП>Нельзя туда System.IO.Stream прикрутить?
Уфф.
extern FILE *aagin, *aagout;
В принципе можно. Только объём работы будет примерно следующим: берём только алгоритмическую часть, а отрисовкой занимаемся сами. В IO.Stream'е, в файле, на абстрактном канвасе, хоть у чёрта на ж***.
А почему так сильно нужен IO.Stream? Политики безопасности мешают прямо файлы создавать?
Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...
Приветствую, adontz, вы писали:
a> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...
Да ты шо, ентож линуховый подход, неспортивно
Приветствую, adontz, вы писали:
a> Во-первых, это юниксовый подход.
Пофиг. А в данном контексте вооооооооооооооооооооооооооооооооообче пофиг
a> Во-вторых, ненависть к линуксу — это болезнь.
Ну мне ента болезнь не грозитъ
adontz,
a>>> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать... S>>Да ты шо, ентож линуховый подход, неспортивно
A>Во-первых, это юниксовый подход. Во-вторых, ненависть к линуксу — это болезнь.
Я так понимаю, генерация картинок может сожрать все ресурсы сервера. Поэтому нужна поддержка ограничений против абузеров — нехороших людей, которые будут генерировать слишком большую картинку, или сразу большую кучу картинок. Даже сейчас есть (давно была?) опасная (тссс!) ситуация с обилием табличных тегов в сообщении из-за чего форматтеру сносило крышу.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Я так понимаю, генерация картинок может сожрать все ресурсы сервера. Поэтому нужна поддержка ограничений против абузеров — нехороших людей, которые будут генерировать слишком большую картинку, или сразу большую кучу картинок. Даже сейчас есть (давно была?) опасная (тссс!) ситуация с обилием табличных тегов в сообщении из-за чего форматтеру сносило крышу.
Ну так тем лучше. Отдельный процесс можно запускать с крайне низким приоритетом и вообще асинхронно.
adontz,
A>Ну так тем лучше. Отдельный процесс можно запускать с крайне низким приоритетом и вообще асинхронно.
Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).
adontz,
LCR>>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).
A>Через Job Object
Ок (хотя не ведаю, шо это такое, но видимо вещь хорошая). Как защититься от дыр и переполнений буферов в самом dot.exe? Я полагаю надо организовать маленький такой сэндбоксик на каждый вызов dot.exe. Или пул сэндбоксиков... Да?
Здравствуйте, AndrewVK, Вы писали:
AVK> Хватит уже зря мечтать. Вариант с внешней программой малоприемлем для януса, nntp, авалона и диска к журналу.
А если попробовать заюзать внешний сервис генерации картинок, а потом их у себя кэшировать? Т.е., по большому счету, картинка же генерится один раз при создании сообщения (или его первом отображении), потом ее забираем, кладем себе и храним сколько жаба позволяет, а форматтеру останется только подставить нужный img src, который можно вычислять каким-нибудь хэшем от содержимого тэга.
Я не думаю, что тэг будет уж очень сильно востребован, чтобы этих картинок было жутко много или чтобы можно было просадить сервис генерации.
Здравствуйте, AndrewVK, Вы писали:
AVK>Вариант с внешней программой малоприемлем для януса, nntp, авалона и диска к журналу.
Вариант с внешней программой по области своей применимости абсолютно ничем не отличается от варианта с внешней неуправляемой DLL. Как техническое обоснование отказа не катит.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>adontz,
LCR>>>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).
A>>Через Job Object
LCR>Как защититься от дыр и переполнений буферов в самом dot.exe?
Думаю, запускать его от имени NETWORK SERVICE вполне достаточно.
LCR>Я полагаю надо организовать маленький такой сэндбоксик на каждый вызов dot.exe. Да?
см. выше. Учётная запись NETWORK SERVICE вполне себе sandbox как раз для таких случаев.
Здравствуйте, adontz, Вы писали:
a> Это гораздо лучше, чем совсем никакой идеи. Кроме того, что мешает вместе с Янусом ставить Graphviz?
+1. В avalon это именно так и реализовано — стоит пакет — рисуем красивые картинки, нет пакета, выдаем as-is. Можно вместо as-is приделать внешний веб-сервис (если кто знает таковой, с которым просто работать наподобии формул LaTeX).