Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 29.11.06 17:17
Оценка: 83 (11) +5
Привет всем!

В свете повторно всплывшей темы про раскраску ещё кучи языков, я не мог обойти вниманием очень интересный и нужный (практически всем) язык. (Любопытный парадокс заключается в том, что чем больше человек владеет этим языком, тем больше он ему нужен).
Взгляните на это убожество:
  (A)
  / |
 v  |
(B) |
 |  |
  v v
  (C)

А теперь посмотрите в окно — на дворе 21-й век. А мы как в старые добрые времена БК и Спектрумов рисуем псевдографикой... Есть ли альтернатива? (Ну кроме конечно графических редакторов).

Есть! GraphViz — инструментальная программа, которая принимает на вход описание графа, а выдаёт картинку с этим графом. Пользуется большой популярностью, используется в куче инструментов в качестве движка для создания диаграмм (например doxygen).

Пора от рекламных лозунгов перейти к делу
SourceResult
digraph
{
// feel the difference!
size="1,2"
A->B
B->C
A->C
}
digraph
{
size="2,5"; // maximum size in inches
S0 -> S0 [ label = "0.5"];
S0 -> S1 [ label = "0.3"];
S0 -> S2 [ label = "0.1"];
S1 -> S0 [ label = "0.2"];
}
digraph G 
{
size ="4,4"; // size in inches
main [shape=box];

main -> parse [weight=8];
parse -> execute;
main -> init [style=dotted];
main -> cleanup;
execute -> { make_string; printf}
init -> make_string;
edge [color=red]; // so is this
main -> printf [style=bold,label="100 times"];
make_string [label="make a\nstring"];
node [shape=box,style=filled,color=".7 .3 1.0"];
execute -> compare;
}
// Something complicated
digraph structs
{
node [shape=record, fontsize=9];
struct1 [shape=record,
    label="<f0> left|<f1> middle|<f2> right"];
struct2 [shape=record,
    label="<f0> one|<f1> two"];
struct3 [shape=record,
    label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
// At last, UML!
digraph G {
fontname = "Verdana";
fontsize = 7;

node [
    fontname = "Verdana"
    fontsize = 7
    shape = "record"
    width = 1
]

edge [
    fontname = "Verdana"
    fontsize = 7
]

Animal [
    label = 
"{Animal|+ name : string\l+ age : int\l|+ die() : void\l}"
]

subgraph clusterAnimalImpl {
    label = "Package animal.impl"

    Dog [
        label = "{Dog||+ bark() : void\l}"
    ]

    Cat [
        label = "{Cat||+ meow() : void\l}"
    ]
}

edge [
    arrowhead = "empty"
]

Dog -> Animal
Cat -> Animal

edge [
    arrowhead = "none"

    headlabel = "0..*"
    taillabel = "0..*"
]

Dog -> Cat
}
После такого вступления моё пожелание совсем нетрудно предугадать: ввести тэг [graphviz]:
[graphviz] ... здесь определение графа ... [/graphviz]

который бы преобразовывал текст в картинку и вставлял картинку в сообщение.

Пожалуйста, высказывайтесь, что вы думаете об этом.

PS:
Кстати (надо же какое совпадение!) буквально вчера я наткнулся на ajax-сервис (написан на Руби) http://ashitani.jp/gv/
Можно зайти, поиграться. Есть несколько особенностей, о которых можно глянуть здесь. Кроме того, картинки генерятся в гифах, посему совсем не переливаются всеми цветами радуги. И остаётся открытым вопрос, насколько долго там хранятся сгенерированные картинки и можно вешать прямые линки отсюда прямо туда...
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.12.06 01:56
Оценка: 60 (6)
Павел,

Я залил сборки к себе в профиль:
http://rsdn.ru/File/10144/NGraphviz.dll
http://rsdn.ru/File/10144/NGraphviz.Helpers.dll
http://rsdn.ru/File/10144/NGraphviz.Layout.dll

Использование:
using System;
using NGraphviz.Helpers;

public class HelloWorld
{
    public static void Main()
    {
        System.Console.WriteLine("Ok, let's rock!");
        String dotstring = @"
            digraph g              
            { 
            size=""6,7""
            graph [
                rankdir = ""LR""
            ];
            node [
                fontsize = ""16""
                shape = ""ellipse""
            ];
                edge [
            ];
            ""node0"" [
                label = ""<f0> 0x10ba8| <f1>""
                shape = ""record""
            ];
            ""node1"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node2"" [
                label = ""<f0> 0xf7fc44b8| | |2""
                shape = ""record""
            ];
            ""node3"" [
                label = ""<f0> 3.43322790286038071e-06|44.79998779296875|0""
                shape = ""record""
            ];
            ""node4"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |2""
                shape = ""record""
            ];
            ""node5"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node6"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |1""
                shape = ""record""
            ];
            ""node7"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |2""
                shape = ""record""
            ];
            ""node8"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node9"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node10"" [
                label = ""<f0> (nil)| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node11"" [
                label = ""<f0> (nil)| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node12"" [
                label = ""<f0> 0xf7fc43e0| | |1""
                shape = ""record""
            ];
            ""node0"":f0 -> ""node1"":f0 [id = 0];
            ""node0"":f1 -> ""node2"":f0 [id = 1];
            ""node1"":f0 -> ""node3"":f0 [id = 2];
            ""node1"":f1 -> ""node4"":f0 [id = 3];
            ""node1"":f2 -> ""node5"":f0 [id = 4];
            ""node4"":f0 -> ""node3"":f0 [id = 5];
            ""node4"":f1 -> ""node6"":f0 [id = 6];
            ""node4"":f2 -> ""node10"":f0 [id = 7];
            ""node6"":f0 -> ""node3"":f0 [id = 8];
            ""node6"":f1 -> ""node7"":f0 [id = 9];
            ""node6"":f2 -> ""node9"":f0 [id = 10];
            ""node7"":f0 -> ""node3"":f0 [id = 11];
            ""node7"":f1 -> ""node1"":f0 [id = 12];
            ""node7"":f2 -> ""node8"":f0 [id = 13];
            ""node10"":f1 -> ""node11"":f0 [id = 14];
            ""node10"":f2 -> ""node12"":f0 [id = 15];
            ""node11"":f2 -> ""node1"":f0 [id = 16];
            }";


        new Dot().Run(GraphvizImageType.Png, dotstring, "out.png");
    }
}

Выдаёт такую картинку:


Намано?

PS0: Не рекомендуется в качестве пути файла вводить путь к шаре
PS1: К сожалению реализован только алгоритм dot, алгоритмы neato, twopi, fdp, circo — увы (пока?).
PS2: А можно тэг будет [gv][/gv]? (Для других алгоритмов (если таковые появятся) сделать тэги типа [gv=neato][/gv]).
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 05.12.06 03:37
Оценка: 5 (1) +3
Здравствуйте, korzhik, Вы писали:

K>Кстати Graphviz и в SVG умеет конвертить.

Именно. В профиле можно будет сделать галочку
[X] Использовать векторную графику.

У кого будет выставлена, тот будет наслаждаться векторной графикой.
У кого нет — будет получать gif'ы низкого качества.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 01.12.06 09:27
Оценка: 17 (3)
Здравствуйте, Lazy Cjow Rhrr!

Идея дравая. Дело за тем чтобы раздобыть версию для .Net.

Вот здесь есть 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, вобщем что угодно, но чтоб работало и не протекало.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[6]: Тэг [graphviz]
От: mishaa Россия http://kmmbvnr.livejournal.com
Дата: 20.12.06 09:48
Оценка: 17 (2)
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Lazy Cjow Rhrr, Вы писали:


S>>>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...

LCR>>Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.

S>*чешет в затылке*

S>В принципе софтины то... текст, картинка и поле, и поле ввода, где коммстрока для преобразования одного в другое с кнопочкой "поехали"...

Emacs как всегда впереди планеты всей.
-- Главное про деструктор копирования не забыть --
Re[3]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 04.12.06 19:39
Оценка: +1 :)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:


Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...
Matrix has you...
Re[2]: Тэг [graphviz]
От: anonymous Россия http://denis.ibaev.name/
Дата: 01.12.06 10:21
Оценка: 5 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Вот здесь есть 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, вобщем что угодно, но чтоб работало и не протекало.

А такое не пойдёт: QuickGraph: A 100% C# graph library with Graphviz Support?
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 01.12.06 10:51
Оценка: +1
Здравствуйте, anonymous, Вы писали:

A>А такое не пойдёт: QuickGraph: A 100% C# graph library with Graphviz Support?

"with Graphviz Support" В данном случае означает, что можно делать так:

            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.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[7]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.08.09 21:37
Оценка: :)
Здравствуйте, Sheridan, Вы писали:

a>> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...

S>Да ты шо, ентож линуховый подход, неспортивно

Во-первых, это юниксовый подход. Во-вторых, ненависть к линуксу — это болезнь.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Тэг [graphviz]
От: Андрей Хропов Россия  
Дата: 29.11.06 17:49
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Пожалуйста, высказывайтесь, что вы думаете об этом.

Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ?
И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?

Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...
Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 29.11.06 17:59
Оценка:
Андрей Хропов,

LCR>>Пожалуйста, высказывайтесь, что вы думаете об этом.

АХ>Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ?
АХ>И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?

Да, именно, механика такая. Как вариант — можно не в файлы пользователей, а в "глобальный пул". DokuWiki например так работает. Хотя для RSDN лучше в файлы пользователя.

И лучше подставлять не ссылку, а сразу .


АХ>Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...

АХ>Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
Ну во-первых мне думается, что SVG намного тяжелее, а во-вторых — это непринципиально сейчас.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 01.12.06 10:51
Оценка:
Блудов Павел,

БП>Идея здравая. Дело за тем чтобы раздобыть версию для .Net.


БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.

БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.

Понял, рыть от забора до обеда...

Посмотрю, что можно сделать. Спасибо.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Тэг [graphviz]
От: Sheridan Россия  
Дата: 04.12.06 19:19
Оценка:
А не подскажеж ли гуй для этого дела под линух?
Чтото с первой попытки я не нашел
Matrix has you...
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.12.06 19:30
Оценка:
Sheridan,

S>А не подскажеж ли гуй для этого дела под линух?

S>Чтото с первой попытки я не нашел

Ну может поможет то, что под виндой этот самый гуй называется GVUI.exe.

Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:
dot -Tpng xxx.dot -o xxx.png

и усё.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: Тэг [graphviz]
От: korzhik Россия  
Дата: 04.12.06 19:36
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...


Кстати Graphviz и в SVG умеет конвертить.
Re[4]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.12.06 22:49
Оценка:
Sheridan

LCR>>Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:


S>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...


Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 05.12.06 19:02
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

S>>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...

LCR>Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.

*чешет в затылке*
В принципе софтины то... текст, картинка и поле, и поле ввода, где коммстрока для преобразования одного в другое с кнопочкой "поехали"...
Matrix has you...
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.06 04:13
Оценка:
Блудов Павел,

БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.

БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.

Короче, я смотрю на плагин gv для DokuWiki. Там всё тупо:
$retval = exec('/usr/bin/dot -Gsize="5,4" -Tps '.$tmpdotfile.' -o '.$filename);


Так делать приемлемо?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 08.12.06 06:39
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>
LCR>$retval = exec('/usr/bin/dot -Gsize="5,4" -Tps '.$tmpdotfile.' -o '.$filename);
LCR>

LCR>Так делать приемлемо?

Не хотелось бы. Много накладных расходов. Андрей
Автор: anvaka
Дата: 03.12.06
не применёт написать сообщение, которое так просадит сервер, что мало не покажется.

Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[4]: Тэг [graphviz]
От: akasoft Россия  
Дата: 08.12.06 10:35
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.


В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?
... << RSDN@Home 1.2.0 alpha rev. 668>> SQLE 2005
Re[5]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.06 11:42
Оценка:
akasoft,

БП>>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.


A>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?


Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 11.12.06 02:04
Оценка:
Зд7равствуйте, Lazy Cjow Rhrr, Вы писали:

A>>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?

LCR>Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
Ну я бы попробовал для начала собрать Win32 версию, затем помучил бы её каким-нибудь BoundsChecker'ом.
Смущают меня конструкции типа (lefty\ws\mswin32\gpcanvas.c)
    brush = CreateSolidBrush (PALETTEINDEX (1));
    SelectObject (GC, brush);
    pen = CreatePen (PS_SOLID, 1, PALETTEINDEX (1));
    SelectObject (GC, pen);


Если нативная библиотека будет вести себя прилично, то написать к ней рапер на c# труда не составит, на с++/clr тем более.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[5]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 11.12.06 02:40
Оценка:
Здравствуйте, 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 прикрутить?
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[6]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 11.12.06 05:13
Оценка:
Павел,

БП>Не получается воспроизвести .

БП>Вызов Dot.Run() приводит к закрытию приложения. FileMon кажет вот такие ошибки:

...UZHOS GOES HERE...


БП>Кстати, а что, Graphviz насмерть завязан на файлы? Т.е. на вход можно только файл на языке dot, а выходе непременно файл с картинкой?


Ну ты взгляни на пример — там на вход подаётся простая строка, а файл только на выходе. Брать надо Dot который из Helpers, а не из базового неймспейса.

БП>Нельзя туда System.IO.Stream прикрутить?


Уфф.
extern FILE *aagin, *aagout;

В принципе можно. Только объём работы будет примерно следующим: берём только алгоритмическую часть, а отрисовкой занимаемся сами. В IO.Stream'е, в файле, на абстрактном канвасе, хоть у чёрта на ж***.

А почему так сильно нужен IO.Stream? Политики безопасности мешают прямо файлы создавать?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.08.09 18:49
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 30.08.09 20:31
Оценка:
Приветствую, adontz, вы писали:

a> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...

Да ты шо, ентож линуховый подход, неспортивно
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[8]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 30.08.09 22:39
Оценка:
Приветствую, adontz, вы писали:

a> Во-первых, это юниксовый подход.

Пофиг. А в данном контексте вооооооооооооооооооооооооооооооооообче пофиг

a> Во-вторых, ненависть к линуксу — это болезнь.

Ну мне ента болезнь не грозитъ
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[8]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.11.09 02:38
Оценка:
adontz,

a>>> Извиняюсь не некрофилию, но почему нельзя просто вызывать dot.exe? Это так обязательно, именно в виде библиотеки использовать? Я понимаю, что создание процесса накладно, но если кешировать...

S>>Да ты шо, ентож линуховый подход, неспортивно

A>Во-первых, это юниксовый подход. Во-вторых, ненависть к линуксу — это болезнь.


Я так понимаю, генерация картинок может сожрать все ресурсы сервера. Поэтому нужна поддержка ограничений против абузеров — нехороших людей, которые будут генерировать слишком большую картинку, или сразу большую кучу картинок. Даже сейчас есть (давно была?) опасная (тссс!) ситуация с обилием табличных тегов в сообщении из-за чего форматтеру сносило крышу.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[9]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 05.11.09 03:11
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Я так понимаю, генерация картинок может сожрать все ресурсы сервера. Поэтому нужна поддержка ограничений против абузеров — нехороших людей, которые будут генерировать слишком большую картинку, или сразу большую кучу картинок. Даже сейчас есть (давно была?) опасная (тссс!) ситуация с обилием табличных тегов в сообщении из-за чего форматтеру сносило крышу.


Ну так тем лучше. Отдельный процесс можно запускать с крайне низким приоритетом и вообще асинхронно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.11.09 10:03
Оценка:
adontz,

A>Ну так тем лучше. Отдельный процесс можно запускать с крайне низким приоритетом и вообще асинхронно.


Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[11]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 05.11.09 19:59
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).


Через Job Object
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[12]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.11.09 09:14
Оценка:
adontz,

LCR>>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).


A>Через Job Object


Ок (хотя не ведаю, шо это такое, но видимо вещь хорошая). Как защититься от дыр и переполнений буферов в самом dot.exe? Я полагаю надо организовать маленький такой сэндбоксик на каждый вызов dot.exe. Или пул сэндбоксиков... Да?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[13]: Тэг [graphviz]
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.11.09 11:46
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

Хватит уже зря мечтать. Вариант с внешней программой малоприемлем для януса, nntp, авалона и диска к журналу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1260 on Windows 7 6.1.7600.0>>
AVK Blog
Re[14]: Тэг [graphviz]
От: Anton Batenev Россия https://github.com/abbat
Дата: 10.11.09 14:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK> Хватит уже зря мечтать. Вариант с внешней программой малоприемлем для януса, nntp, авалона и диска к журналу.


А если попробовать заюзать внешний сервис генерации картинок, а потом их у себя кэшировать? Т.е., по большому счету, картинка же генерится один раз при создании сообщения (или его первом отображении), потом ее забираем, кладем себе и храним сколько жаба позволяет, а форматтеру останется только подставить нужный img src, который можно вычислять каким-нибудь хэшем от содержимого тэга.

Я не думаю, что тэг будет уж очень сильно востребован, чтобы этих картинок было жутко много или чтобы можно было просадить сервис генерации.
avalon 1.0rc2 rev 304, zlib 1.2.3
Re[15]: Тэг [graphviz]
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.11.09 16:12
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>А если попробовать заюзать внешний сервис генерации картинок, а потом их у себя кэшировать?


Т.е. форматтеру понадобится для работы интернет и доступ к диску? Не думаю, что это удачная идея.
... << RSDN@Home 1.2.0 alpha 4 rev. 1260 on Windows 7 6.1.7600.0>>
AVK Blog
Re[14]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.09 17:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Вариант с внешней программой малоприемлем для януса, nntp, авалона и диска к журналу.


Вариант с внешней программой по области своей применимости абсолютно ничем не отличается от варианта с внешней неуправляемой DLL. Как техническое обоснование отказа не катит.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[13]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.09 17:47
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>adontz,


LCR>>>Как ему (dot.exe-у) ограничить прожорливость в смысле оперативной памяти? В смысле пиковое потребление памяти может быть очень большим. (Память по-прежнему ресурс на сервере).


A>>Через Job Object


LCR>Как защититься от дыр и переполнений буферов в самом dot.exe?


Думаю, запускать его от имени NETWORK SERVICE вполне достаточно.

LCR>Я полагаю надо организовать маленький такой сэндбоксик на каждый вызов dot.exe. Да?


см. выше. Учётная запись NETWORK SERVICE вполне себе sandbox как раз для таких случаев.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[16]: Тэг [graphviz]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.09 17:48
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Т.е. форматтеру понадобится для работы интернет и доступ к диску? Не думаю, что это удачная идея.


Это гораздо лучше, чем совсем никакой идеи. Кроме того, что мешает вместе с Янусом ставить Graphviz?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[17]: Тэг [graphviz]
От: Anton Batenev Россия https://github.com/abbat
Дата: 10.11.09 21:04
Оценка:
Здравствуйте, adontz, Вы писали:

a> Это гораздо лучше, чем совсем никакой идеи. Кроме того, что мешает вместе с Янусом ставить Graphviz?


+1. В avalon это именно так и реализовано — стоит пакет — рисуем красивые картинки, нет пакета, выдаем as-is. Можно вместо as-is приделать внешний веб-сервис (если кто знает таковой, с которым просто работать наподобии формул LaTeX).
avalon 1.0rc2 rev 305, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.