Modular Architecture: Risks
Early in the public beta program, I was of the opinion that LR's modular architecture would turn out to be one of those thing that is developer-friendly, but user-hostile. Frequently, I'd find that a tool or bit of information I was expecting to be immediately available was suddenly missing, 'cause I was in the wrong module. Usually this was a Library Module feature missing from the Development Module, or vice versa.
This issue has abated as the product has developed, and has probably abated more in v1.0 (which I haven't used yet). But I still worry that this architecture, for all it's benefits, is inevitably destined to impose limitations on usability.
Here's an example from Beta 4.1:
Say you're going through and rating a bunch of candids shot in a mixed light situation, where for each image you need to block in white balance in order to judge the image, and where WB might be different for each image. The efficient tool you want to use here is the White Balance Selector from the Develop Module (even more so in v1 with the new preview feature). So you go to the Develop module, moving through the images, quick WB, quick rating them with "[" and "]". Only you can't SEE the ratings. they're not displayed anywhere in the Develop view. Not in the content area. Not in the toolbar. Not in the filmstrip.
The obvious solution is to either a) add the White Balance Selector tool to Quick Develop, or b) add rating icons to the filmstrip thumbs and in the Develop content area (or toolbar). Fundamentally, you're forced to replicate features between modules, which is, to some extent, defeating the purpose of the modular structure.
Compare that to Aperture's non-modal interface, where you can enable tools and panels individually in multiple combinations and arrangements.
Just food for thought. I prefer LR for a number of reasons (and am in the process of consolidating old Aperture shoots to LR). But I'm just saying I think there is a downside to the modular architecture.
Tim Wilson
Studio/lab
I prefer to see all those settings in context, rather than have to check the filter setting to know what I'm looking at. Say I'm developing a 3-star pick and see a problem and want to check related images that may have other ratings. I want to glance down to the filmstrip and see if there are other 3-star or 2-star images nearby, and which ones are 3 and which are 2. Shouldn't have to go fiddling with filters to do that.
In Aperture, the star ratings are shown with the image everywhere in the program (unless you turn them off). When you're bouncing around looking at a lot of similar images, that immediate, intuitive, qualitative identification becomes a very useful thing.
Tim Wilson
Studio/lab
Similar Messages
-
Best use of framework events in application architecture
Hello,
I apologize in advance if this is not the appropriate forum to be posting about Flex framework questions. I considered the Cairngorm forum, but thought the question applied more broadly to all flex frameworks. That, and it seems that the Cairngorm forum isn't really very active.
My question is about using frameworks for application architecture. Reading the "Introducing Cairngorm" document, I see that it specifically says that Cairngorm events are just those events that will handle business logic (things like grabbing data from a server, committing data to a server, etc). So then, how does a view interact with a controller when changing state?
Let's say I have two or three different views of the same data and I have a buttonbar to switch to the view I want. Is it then typical to dispatch a Cairngorm (or Mate/Swiz/Pure MVC, etc..) event to the controller to change the view state of the application? Does this effectively mean that for every button a user can click on, we'll have an event and a command associated with that event to perform some change of state or business logic? With a moderately complicated application, with several different screens, a few forms, a couple of lookups, i.e. lots of buttons for user input, that seems like an awfully huge number of events/commands...? Or do you dispatch a regular old flash Event to handle this? Or does the view data bind to the model to change the view state?
Obviously there's never any single correct answer to application architecture questions, but I'd like to know if there's any general best practices that I should follow. I don't want to under-architect OR over-architect my app. I'm new to Flex programming and would like not to code something egregiously ugly.
Thanks,
CoryHi,
Consider this, there is no such thing as an enterprise level RIA, the whole concept behind thin client was to restrict the enterprise requirements to the backend, that being said if we assume that a flex application is specifically for the client end and can maintain its own state and that MVC frameworks are more about enterprise solutions then the whole framework argument becomes what it is, academic BS.
<start rant>
Its really simply, in half a century nothing has changed, you have rules and requirements(model), you have access to that(view) and you wrap it up as a program/application(controller) so why do you need convoluted multilayer abstraction of functionality to make things work ? maybe so those that can't get a real development job can run around and preach at conferences, how else could they feed their adopted kids.
So all those nice buzzwords, design patterns(the new age terminology for modular architecture), model/view/controller, borg coding(resistance is futile) is all very fine if you want to act smart but producing quality code actually means you are smart. As you may have guessed I am not a strong proponent of MVC frameworks, and I don't even need to get into the argument that everytime a 'framework' expert gets control of a project that isn't done in their MVC poison of choice it gets a rewrite, clients really love those associated costs and retesting requirements.
</end rant>
You only need 1 framework for flex and thats the flex framework.
Have a read this blog, the section on MVC and Flex is very interesting if not overly polite.
http://www.herrodius.com/blog/216
David -
Well, I have read all class of J2EE books and worked a lot on EJB, so I think, that I do know, what I am speeking about. But I still can't get the spirit.
My point of view is the following:
EJB is a very (extremely) modular architecture, which is theoretically innovative, but in practice..?
It is so extremely modular, that you have to pay an inmense overhead for it (descriptors, EJB-Containers, problems of testing, performance problems etc..)
Ok, there is scalability, security, support of multiclients, distributed transformations
but : security is not(!) standardized.
support of multiclients is in the great majority of cases allready done by a simple webcontainer.
Use of remote ejb-clients and distributed transactions are rare exceptions.
It is somehow awful, to test ejb, because you need remote interface for test-client, but after testing you have to convert to local interface. The more, you can't get J2EE server for more than 30 days but JBoss that is not documented.
So give me back the faith please
What are the advantages?Consultants are paid the GDP of a small country to answer questions like that! They'd examine everything from the throughput to the development team as well as the financial risk of concurrency/security problems.
Such a generic situation can only be answered in similarly generic terms:
J2EE is "worthwhile" if the costs/risks to your business inherent in not supporting concurrency and security combined with the costs/risks of redesigning the system to be scalable outweigh the increase in costs/risks of development using J2EE.
Since one side of this balance is almost entirely determined by the development of the application it isn't unreasonable to say that the abilities of the development team will be a major factor in whether J2EE will be "worthwhile" to your enterprise. A good J2EE development team will make light work of complex enterprise applications that another development team might struggle with (and most likely make a bad job of).
So, in general:
PROS: read the J2EE spec
CONS: if you don't need it then it's overhead (but isn't everything?)
It's horses for courses. -
dear all,
I want to make package docbook-utils
but have erroe . someone know why?
Making all in HTML
make[2]: Entering directory `/var/abs/local/docbook-utils/src/docbook-utils-0.6.14/doc/HTML'
SGML_CATALOG_FILES=/etc/sgml/catalog
SGML_SEARCH_PATH=../..:../../doc:..
jade -t sgml -i html -d ../../docbook-utils.dsl#html
-V '%use-id-as-filename%' ../../doc/docbook-utils.sgml
jade:../../doc/docbook-utils.sgml:1:55:W: cannot generate system identifier for public text "-//OASIS//DTD DocBook V3.1//EN"
jade:../../doc/docbook-utils.sgml:9:0:E: reference to entity "BOOK" for which no system identifier could be generated
jade:../../doc/docbook-utils.sgml:1:0: entity was defined here
jade:../../doc/docbook-utils.sgml:9:0:E: DTD did not contain element declaration fordocument type name
jade:../../doc/docbook-utils.sgml:11:11:E: there is no attribute "LANG"
jade:../../doc/docbook-utils.sgml:11:19:E: there is no attribute "ID"
jade:../../doc/docbook-utils.sgml:11:34:E: element "BOOK" undefined
jade:../../doc/docbook-utils.sgml:12:11:E: element "BOOKINFO" undefined
jade:../../doc/docbook-utils.sgml:13:10:E: element "TITLE" undefined
jade:../../doc/docbook-utils.sgml:14:12:E: element "PUBDATE" undefined
jade:../../doc/docbook-utils.sgml:16:16:E: element "LEGALNOTICE" undefined
jade:../../doc/docbook-utils.sgml:17:6:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:24:13:E: element "ABSTRACT" undefined
jade:../../doc/docbook-utils.sgml:25:11:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:28:11:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:34:16:E: element "AUTHORGROUP" undefined
jade:../../doc/docbook-utils.sgml:35:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:36:11:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:36:37:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:37:20:E: element "AFFILIATION" undefined
jade:../../doc/docbook-utils.sgml:38:18:E: element "ADDRESS" undefined
jade:../../doc/docbook-utils.sgml:38:25:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:41:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:42:11:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:42:39:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:43:20:E: element "AFFILIATION" undefined
jade:../../doc/docbook-utils.sgml:44:18:E: element "ADDRESS" undefined
jade:../../doc/docbook-utils.sgml:44:25:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:47:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:48:11:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:48:38:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:49:20:E: element "AFFILIATION" undefined
jade:../../doc/docbook-utils.sgml:50:18:E: element "ADDRESS" undefined
jade:../../doc/docbook-utils.sgml:50:25:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:53:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:54:11:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:54:41:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:55:20:E: element "AFFILIATION" undefined
jade:../../doc/docbook-utils.sgml:56:18:E: element "ADDRESS" undefined
jade:../../doc/docbook-utils.sgml:56:25:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:63:14:E: there is no attribute "ID"
jade:../../doc/docbook-utils.sgml:63:28:E: element "CHAPTER" undefined
jade:../../doc/docbook-utils.sgml:64:12:E: element "DOCINFO" undefined
jade:../../doc/docbook-utils.sgml:65:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:66:18:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:66:44:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:69:10:E: element "TITLE" undefined
jade:../../doc/docbook-utils.sgml:71:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:76:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:76:21:E: there is no attribute "URL"
jade:../../doc/docbook-utils.sgml:76:57:E: element "ULINK" undefined
jade:../../doc/docbook-utils.sgml:81:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:89:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:94:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:95:19:E: element "ITEMIZEDLIST" undefined
jade:../../doc/docbook-utils.sgml:96:17:E: element "LISTITEM" undefined
jade:../../doc/docbook-utils.sgml:97:15:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:97:28:E: element "APPLICATION" undefined
jade:../../doc/docbook-utils.sgml:101:17:E: element "LISTITEM" undefined
jade:../../doc/docbook-utils.sgml:102:15:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:102:28:E: element "APPLICATION" undefined
jade:../../doc/docbook-utils.sgml:108:19:E: element "ITEMIZEDLIST" undefined
jade:../../doc/docbook-utils.sgml:109:17:E: element "LISTITEM" undefined
jade:../../doc/docbook-utils.sgml:110:15:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:113:17:E: element "LISTITEM" undefined
jade:../../doc/docbook-utils.sgml:114:15:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:117:17:E: element "LISTITEM" undefined
jade:../../doc/docbook-utils.sgml:118:15:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:123:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:129:9:E: element "NOTE" undefined
jade:../../doc/docbook-utils.sgml:130:14:E: element "SIMPARA" undefined
jade:../../doc/docbook-utils.sgml:131:12:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:134:14:E: element "SIMPARA" undefined
jade:../../doc/docbook-utils.sgml:135:12:E: element "EMAIL" undefined
jade:../../doc/docbook-utils.sgml:138:14:E: element "SIMPARA" undefined
jade:../../doc/docbook-utils.sgml:139:41:E: element "ULINK" undefined
jade:../../doc/docbook-utils.sgml:145:24:E: element "CHAPTER" undefined
jade:../../doc/docbook-utils.sgml:146:12:E: element "DOCINFO" undefined
jade:../../doc/docbook-utils.sgml:147:13:E: element "AUTHOR" undefined
jade:../../doc/docbook-utils.sgml:148:18:E: element "FIRSTNAME" undefined
jade:../../doc/docbook-utils.sgml:148:46:E: element "SURNAME" undefined
jade:../../doc/docbook-utils.sgml:151:10:E: element "TITLE" undefined
jade:../../doc/docbook-utils.sgml:153:6:E: element "SECT1" undefined
jade:../../doc/docbook-utils.sgml:154:6:E: element "TITLE" undefined
jade:../../doc/docbook-utils.sgml:156:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:156:23:E: element "CITEREFENTRY" undefined
jade:../../doc/docbook-utils.sgml:156:39:E: element "REFENTRYTITLE" undefined
jade:../../doc/docbook-utils.sgml:157:14:E: element "MANVOLNUM" undefined
jade:../../doc/docbook-utils.sgml:160:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:161:16:E: element "APPLICATION" undefined
jade:../../doc/docbook-utils.sgml:162:37:E: element "FIRSTTERM" undefined
jade:../../doc/docbook-utils.sgml:163:14:E: element "FIRSTTERM" undefined
jade:../../doc/docbook-utils.sgml:168:9:E: element "PARA" undefined
jade:../../doc/docbook-utils.sgml:170:23:E: element "FIRSTTERM" undefined
jade:../../doc/docbook-utils.sgml:171:14:E: element "FIRSTTERM" undefined
jade:../../doc/refentry/jw.sgml:1:13:E: there is no attribute "ID"
jade:../../doc/refentry/jw.sgml:1:17:E: element "REFENTRY" undefined
jade:../../doc/refentry/jw.sgml:2:10:E: element "DOCINFO" undefined
jade:../../doc/refentry/jw.sgml:3:11:E: element "AUTHOR" undefined
jade:../../doc/refentry/jw.sgml:4:16:E: element "FIRSTNAME" undefined
jade:../../doc/refentry/jw.sgml:4:42:E: element "SURNAME" undefined
jade:../../doc/refentry/jw.sgml:5:18:E: element "AFFILIATION" undefined
jade:../../doc/refentry/jw.sgml:6:16:E: element "ADDRESS" undefined
jade:../../doc/refentry/jw.sgml:6:23:E: element "EMAIL" undefined
jade:../../doc/refentry/jw.sgml:10:10:E: element "REFMETA" undefined
jade:../../doc/refentry/jw.sgml:11:18:E: element "REFENTRYTITLE" undefined
jade:../../doc/refentry/jw.sgml:12:14:E: element "MANVOLNUM" undefined
jade:../../doc/refentry/jw.sgml:15:13:E: element "REFNAMEDIV" undefined
jade:../../doc/refentry/jw.sgml:16:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:17:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:18:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:19:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:20:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:21:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:22:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:23:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:24:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:25:12:E: element "REFNAME" undefined
jade:../../doc/refentry/jw.sgml:26:15:E: element "REFPURPOSE" undefined
jade:../../doc/refentry/jw.sgml:29:17:E: element "REFSYNOPSISDIV" undefined
jade:../../doc/refentry/jw.sgml:30:16:E: element "CMDSYNOPSIS" undefined
jade:../../doc/refentry/jw.sgml:31:14:E: element "COMMAND" undefined
jade:../../doc/refentry/jw.sgml:32:20:E: there is no attribute "CHOICE"
jade:../../doc/refentry/jw.sgml:32:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:32:30:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:32:38:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:33:18:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:34:5:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:34:13:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:35:18:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:36:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:38:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:38:30:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:38:38:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:39:18:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:40:5:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:40:13:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:40:45:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:41:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:43:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:43:30:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:43:38:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:43:63:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:44:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:44:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:44:48:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:45:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:47:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:47:30:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:47:38:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:48:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:48:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:49:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:51:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:52:5:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:52:13:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:53:20:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:54:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:54:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:55:20:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:56:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:58:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:59:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:59:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:59:45:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:60:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:60:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:60:48:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:61:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:63:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:64:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:64:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:64:45:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:65:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:65:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:65:53:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:66:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:68:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:69:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:69:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:69:45:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:70:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:70:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:70:51:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:71:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:73:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:74:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:74:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:74:45:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:75:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:75:20:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:75:51:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:76:18:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:78:18:E: there is no attribute "CHOICE"
jade:../../doc/refentry/jw.sgml:78:23:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:78:31:E: element "OPTION" undefined
jade:../../doc/refentry/jw.sgml:79:20:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:79:57:E: element "REPLACEABLE" undefined
jade:../../doc/refentry/jw.sgml:79:88:E: element "SBR" undefined
jade:../../doc/refentry/jw.sgml:81:25:E: element "GROUP" undefined
jade:../../doc/refentry/jw.sgml:82:12:E: element "ARG" undefined
jade:../../doc/refentry/jw.sgml:82:20:E: element "OPTION" undefined
jade:I: maximum number of errors (200) reached; change with -E option
jade:../../docbook-utils.dsl:5:73:W: cannot generate system identifier for public text "-//James Clark//DTD DSSSL Style Sheet//EN"
jade:../../docbook-utils.dsl:9:96:W: cannot generate system identifier for public text "-//Norman Walsh//DOCUMENT DocBook HTML Stylesheet//EN"
jade:../../docbook-utils.dsl:15:0:E: reference to entity "STYLE-SHEET" for which no system identifier could be generated
jade:../../docbook-utils.dsl:5:0: entity was defined here
jade:../../docbook-utils.dsl:15:0:E: DTD did not contain element declaration for document type name
jade:../../docbook-utils.dsl:9:1:E: notation "DSSSL" for entity "docbook.dsl" undefined
jade:../../docbook-utils.dsl:17:12:E: element "STYLE-SHEET" undefined
jade:../../docbook-utils.dsl:19:26:E: there is no attribute "ID"
jade:../../docbook-utils.dsl:19:38:E: there is no attribute "USE"
jade:../../docbook-utils.dsl:19:47:E: element "STYLE-SPECIFICATION" undefined
jade:../../docbook-utils.dsl:20:29:E: element "STYLE-SPECIFICATION-BODY" undefined
jade:../../docbook-utils.dsl:32:45:E: element "STYLE-SPECIFICATION" undefined
jade:../../docbook-utils.dsl:33:29:E: element "STYLE-SPECIFICATION-BODY" undefined
jade:../../docbook-utils.dsl:68:44:E: element "STYLE-SPECIFICATION" undefined
jade:../../docbook-utils.dsl:69:29:E: element "STYLE-SPECIFICATION-BODY" undefined
jade:../../docbook-utils.dsl:113:29:E: there is no attribute "ID"
jade:../../docbook-utils.dsl:113:48:E: there is no attribute "DOCUMENT"
jade:../../docbook-utils.dsl:113:61:E: element "EXTERNAL-SPECIFICATION" undefined
jade:../../docbook-utils.dsl:115:13:E: end tag for "EXTERNAL-SPECIFICATION" omitted,but its declaration does not permit this
jade:../../docbook-utils.dsl:113:2: start tag was here
jade:E: specification document does not have the DSSSL architecture as a base architecture
jade:E: no style-specification or external-specification with ID "HTML"
DocBook Utils
18 June 2000
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.1 or any later version published by the Free Software
Foundation. A copy of the license is included in the section
entitled "GNU Free Documentation License".
This documentation describes the DocBook-utils version
0.2.
The DocBook-utils are a collection of various utilites to
convert and analyse SGML documents in general and DocBook files
in particular. They are developped by many authors and released
under GPL licence.
Eric Bischoff
[email protected]
Jochem Huhmann
[email protected]
Steve Cheng
[email protected]
Frederik Fouvry
[email protected]
Eric Bischoff
Introduction
The DocBook-utils are a collection of various utilites to
convert and analyse SGML documents in general and DocBook files
in particular. They are developped by many authors and released
under GPL licence.
DocBook
is a SGML-based or XML-based standard for writing technical
documentation defined by the DocBook Technical Committee of the
OASIS consortium.
The DocBook-utils try to be as general as possible, and
therefore it is possible to use them with other SGML formats
than DocBook, like TEI or HTML. But each time there was an
opportunity to make them biased to DocBook to ease the life of
DocBook users, this opportunity has been given a higher priority
than generality considerations. This is why this package is not
called "SGML-utils".
The DocBook-utils are independant of any existing distribution
of SGML parsers and of DocBook resources. However, they conform
with the new draft on SGML and DocBook standardization being
discussed at Linux Standard Base project.
So far, the DocBook-utils only consist of:
jw, a script used to convert
from DocBook or other SGML formats into "classical" file
formats like HTML, man, info, RTF...
sgmldiff, a script used to
compare the markup of a SGML file with its translation into
another language.
but we would like to see them accomplish other tasks in the future:
Conversion from "legacy" formats like LinuxDoc, man,
info, HTML or PDF into DocBook.
Refined analysis of DocBook files like a "sgmlgrep"
program that would allow context-sensitive searchs.
Support for XML.
If you want to help or keep informed of the latest developments,
please subscribe to the "[email protected]"
mailing list. This list has been set up to allow collaborative
development of these
tools.
To subscribe: Send a message to
[email protected]
- you will get a confirmation message, just reply to it.
To unsubscribe: Send a message to
[email protected]
and reply to the confirmation message
For any additional information, write to Jorge Godoy who is
the maintainer of this list.
Jochem Huhmann
jw
Command reference
jw
1 converts DocBook or other
SGML-based formats into "classical" file formats.
The modular architecture used by
jw allows to write plug-in
programs (we call them backends and
frontends). The backends are specific to
output formats while the frontends are specific to input formats. We
would like to encourage you to write such programs and to submit
them to the docbook-utils project.
While most backends are based on Jame's Clark Jade, or its
OpenJade alternative, some of the backends make use of the programs
from the docbook2X project. We call these
helper programs.
Eric Bischoff
[email protected]
jw
1
jw
docbook2dvi
docbook2html
docbook2man
docbook2pdf
docbook2ps
docbook2rtf
docbook2tex
docbook2texi
docbook2txt
(Jade Wrapper) converts SGML files to other formats
jw
-f
frontend
--frontend
frontend
-b
backend
--backend backend
-c file
--cat file
-n
--nostd
-d
file|default|none
--dsl
file|default|none
-l file
--dcl file
-s path
--sgmlbase path
-p program
--parser program
-o directory
--output directory
-V
variable[=value]
make[2]: *** [api.html] Error 1
make[2]: Leaving directory `/var/abs/local/docbook-utils/src/docbook-utils-0.6.14/doc/HTML'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/var/abs/local/docbook-utils/src/docbook-utils-0.6.14/doc'
make: *** [all-recursive] Error 1
ERROR: Build Failed. Aborting...
==>[root@lion docbook-utils]#Hello,
is there any solution now?
Because i need doocbook-utils.
I hope so :-D -
What is the best way of adopting a flex 4.5.1 built website for mobile "as is"?
I have a website built with flex 4.5.1 which I want to be working on mobile as it should - meaning that touch style of interactions should be working not mouse.
The question is: Do I HAVE TO recode all of my website from Application into Mobile Application in order to be a more lightweight version of the original one, which includes: remove some functionality, pages, animation, build a separate backend and cms to control it etc.?
OR
Can I just define mobile skins, for my existing components to use when in mobile mode, in which I could have done some tweaking by removing some unnecessary parts and changing component interactionMode to Touch ?
Are both options which I see possible and if yes - which one would you recommend?
Thanks in advance!Thanks for the answer. Yeah I bet you figured out what I want the answer to be, but is it ? That's why I am asking here. I can see my website on my HTC Desire HD and it's working pretty well. If I reskin the parts that need a bigger hit area or the scrollers to work with touch so I don't have to scroll the actual scrollbars with my finger, remove some complex animations - everything will work just fine... The problem is that I am not sure if that is the right way to do it or if it is possible at all.
I do get your point about not designed for mobile stuff, but while with html 5 you get the job done for web and mobile with little differences at the same time, in flash you need double time cause you'll have to build 2 projects. And since the framework is one for both web and mobile.. why not...
I want to see the pros and cons of the both approaches I suggested. In a complex modular architecture I could easily swap one web module with a mobile module for example or change skins or components if I need more lightweight ones, but do I have to copy all that logic in to a MobileApplication, can't I do it with Application and use the MobileComponents (which are simplier and less functional) if the project actually needs them...
I do hope you get why I am asking these questions, and I can't believe I haven't found a guide or something like that "why this and not that" when it comes to mixing web with mobile development and flex... If you have, please share the link, I would be happy to read. Or someone with the experience in what I am talking about shares some knowledge, that would be great!
Thanks. -
Creating Packages from BLOB field contents, line wrap problems
Good afternoon,
we use an in-house developed database-driven update system to update both our databases and filesystems, the system itself performs really well but there is still one problem I can't fix without some expert help:
the code of to-be-updated Oracle packages is stored inside of a BLOB field, the BLOB field will contain both the package specification and package body and needs to be split into two parts to first execute the spec and then to execute the package body (I tried to execute both in a single step but this didn't work). This works for packages with less than 32767 characters and also works in some other cases but I found one case where the executed code contains an extra line wrap right in the middle of a word.
To make it more clear (I hope it's comprehensible), imagine the following database content:
CREATE OR REPLACE Package
MyPack
AS
[... a lot procedure headers ...]
END MyPack;
CREATE OR REPLACE
Package Body MyPack AS
[... a lot more procedures ...]
PROCEDURE myTest (intID OUT integer)
AS
BEGIN
SELECT count (*) into intID FROM MyTa[--this is where the dbms_lob.substr() ends --]ble;
END;
END MyPack;My code searches for the second occurrence of the "Create or replace package", splits the code into spec and body, executes the specification and keeps on adding the rest of the code to a VARCHAR2A variable called "storedCode" from the BLOB. Now in the above example, after the specification has been removed from the string, the remaining characters (ending with the "MyTa" string) are added to the varchar2a variable, the next line is fetched from the BLOB via "dbms_lob.substr()" and added as long as dbms_lob.substr() does not return a NULL value (end of BLOB). When the code is executed after all has been fetched, the generated Package Body will contain an extra line wrap right in the middle of the "MyTable" word compiling the package invalid.
This is the procedure code I use (definitely improvable, I'm better in MSSQL and MySQL dialects ...) to load, parse and execute the BLOB content:
-- to run package code
procedure runPackageCode (stepRef integer)
AS
numLines integer default 1;
pos integer default 1;
storedCode LOG_CHANGEDOBJECT.STOREDOBJECT%type;
objectCursor integer;
lSqlOut integer;
sqlCommand dbms_sql.varchar2a;
emptyCommand dbms_sql.varchar2a;
pIsError integer := 0;
pErrorMsg varchar2(200) := '';
updateRef integer := 0;
currentUpdate integer := 0;
schemaReference varchar2(20);
-- required to do string cutting
strLine varchar2(32767);
strLeftFromSlash varchar2(32767);
strRemaining varchar2(32767);
intDelimiterPos integer := 0;
begin
-- retrieve update ID
SELECT log_update_ref INTO currentUpdate FROM link_update_with_taskstep WHERE log_taskstep_ref = stepRef;
begin
select storedobject, change_area
into storedCode, schemaReference
from vw_storedobjects
where step_id = stepRef;
exception
when no_data_found then
pIsError := 1;
pErrorMsg := 'Invalid SQL ID ' || stepRef;
pkg_generic.LogError(updateRef, 'LocalUpdater', stepRef, 'Run package code failed: ' || pErrorMsg);
end;
if pIsError = 0 then
begin
-- change schema
execute immediate 'alter session set current_schema = ' || schemaReference;
objectCursor := dbms_sql.open_cursor;
loop
strLine := UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(storedCode, 32767, pos));
intDelimiterPos := regexp_instr(strLine, '\s*Create\s*or\s*Replace\s*Package', 2, 1, 0, 'i');
while intDelimiterPos > 0
loop
-- '/' found, execute currently stored statement
strLeftFromSlash := substr(strLine, 1, intDelimiterPos-1);
strLine := substr(strLine, intDelimiterPos);
-- execute the extracted part without any '/' in it
sqlCommand(numLines) := regexp_replace(strLeftFromSlash, '(^|\s+)/(\s+|$)', '', 1, 0, 'm');
if (sqlCommand(numLines) is not null) then
objectCursor := dbms_sql.open_cursor;
dbms_sql.parse(objectCursor, sqlCommand, 1, numLines, true, dbms_sql.native);
lSqlOut := dbms_sql.execute(objectCursor);
dbms_sql.close_cursor(objectCursor);
end if;
-- reset sqlCommand
sqlCommand := emptyCommand;
-- reset line counter and store remaining string
numLines := 1;
-- check for further '/'s
intDelimiterPos := regexp_instr(strLine, '\s*Create\s*or\s*Replace\s*Package', 2, 1, 0, 'i');
end loop;
-- add the remaining strLine to the sqlCommand
strLine := regexp_replace(strLine, '(^|\s+)/(\s+|$)', '', 1, 0, 'm');
--> I assume this line breaks the code, lpad()'ing the content to move it to the end of a varchar2a line didn't help
sqlCommand(numLines) := strLine;
exit when sqlCommand(numLines) is null;
pos := pos+32767;
numLines := numLines+1;
end loop;
objectCursor := dbms_sql.open_cursor;
dbms_sql.parse(objectCursor, sqlCommand, 1, numLines, true, dbms_sql.native);
lSqlOut := dbms_sql.execute(objectCursor);
dbms_sql.close_cursor(objectCursor);
commit;
-- reset schema
execute immediate 'alter session set current_schema = UPDATE_DB';
-- set state to installed
pkg_update.setstepstate(stepRef, 'Installed');
exception
when others then
-- reset schema
execute immediate 'alter session set current_schema = UPDATE_DB';
-- set state to installFailed
pkg_update.setstepstate(stepRef, 'InstallFailed');
pkg_generic.LogError(updateRef, 'Database', stepRef, 'Run package code failed: ' || sqlerrm);
end;
end if;
END; Thanks if you kept on reading so far, I would really appreciate any feedback!
Regards, SaschaWelcome to the forum!
Whenever you post provide your 4 digit Oracle version (result of SELECT * FROM V$VERSION).
Thanks for providing an easy-to-understand problem statement and for using code tags.
>
the code of to-be-updated Oracle packages is stored inside of a BLOB field
>
This should be stored in a CLOB since it is character data. Why are you using BLOB?
>
the BLOB field will contain both the package specification and package body and needs to be split into two parts to first execute the spec and then to execute the package body
>
Good, clear problem statement. So why doesn't your code do just what you said it should do: 1) split the code into two parts, 2) execute the spec and 3) execute the body.
Instead of writing code that does these three relatively simple steps your code tries to combine splitting and executing and mushes/mashes it all together. The result, as you found, is code that is hard to understand, hard to debug, doesn't work and doesn't report on what it is doing.
Code like this doesn't have a performance issue so the code should implement the simple step-by-step process that you so elegantly stated in your problem description:
1. split the code into two parts
2. execute the spec
3. execute the body
My advice is to refactor your code to perform the above steps in the proper order and to add proper exception handling and reporting for each step. Then when a step isn't working you will know exactly where and what the problem is.
Here are my recommendations.
1. Add two CLOB variables - one will hold the spec, the second will hold the body
2. Add a comment (you have some good ones in the code now) for every step no matter how trivial it may be
3. Add exception/error handling to EVERY STEP
Your code for the first step has a comment but no exception handling. What should happen if you don't get any data? Why aren't you validating the data you get? Dynamic SQL using table-driven data is great, I love it, but you MUST validate that the data you get is what you expect to get.
-- retrieve update ID
SELECT log_update_ref INTO currentUpdate FROM link_update_with_taskstep WHERE log_taskstep_ref = stepRef;Recommended
-- step 1 - retrieve update ID - This is the id that determines BLAH, BLAH, BLAH - add appropriate to tell a new developer what this ID is and what it means.
BEGIN
SELECT log_update_ref INTO currentUpdate FROM link_update_with_taskstep WHERE log_taskstep_ref = stepRef;
EXCEPTION
WHEN ??? THEN -- what should happen if step 1 fails? Do it here - don't default to an exception handler that is several pages away.
END;Your code
begin
select storedobject, change_area
into storedCode, schemaReference
from vw_storedobjects
where step_id = stepRef;
exception
when no_data_found then
pIsError := 1;
pErrorMsg := 'Invalid SQL ID ' || stepRef;
pkg_generic.LogError(updateRef, 'LocalUpdater', stepRef, 'Run package code failed: ' || pErrorMsg);
end;
Good - except there is no comment that says what this does - I assume that the query above and this block are the 'retrieve update ID ' step?
You log an error message and set the error flag to '1'. But since you don't want to continue why aren't you exiting the procedure and returning right here?
if pIsError = 0 then
beginSo now you check the error flag and do several pages of code if there were no errors.
I don't like that 'inverted' logic.
If you don't want to continue then STOP right now! Don't make a developer scan through pages and pages of code to find out you really aren't doing anything else if there was an error.
Either put a RETURN statement in the exception handler above or change your code to
if pIsError = 1 then
RETURN;
end if;Now the rest of the code doesn' t have to be indented; you will never get there if there is an error. Check for errors after every step and exit right then as appropriate.
-- change schema
execute immediate 'alter session set current_schema = ' || schemaReference;
objectCursor := dbms_sql.open_cursor;
loop
strLine := UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(storedCode, 32767, pos));
intDelimiterPos := regexp_instr(strLine, '\s*Create\s*or\s*Replace\s*Package', 2, 1, 0, 'i');
while intDelimiterPos > 0
loopThis code mixes all of the steps together into one giant mess. You open a cursor, try to split the BLOB into spec and body and try to parse and execute both all within a double nested loop.
Even if that works correctly another developer will have a hard time understanding what the code is doing and fixing it if it goes wrong. And it will go wrong if you let me test if for you because I will put garbage into the BLOB for the spec, body or both to make sure it breaks and to see how your code handles it.
I suggest you rewrite this double nested loop to perform the three steps separately.
1. split the code into two parts
a. put the spec into one new CLOB variable and the body into the other.
b. use DBMS_OUTPUT (or a work table) to output the spec and body so you can see what the code is and make sure the 'split' process worked properly. You probably created that BLOB by manually concatenating the SPEC and BODY to begin with so now create a SPLIT process to split them again and give them back to you. This is such a fundamental component that I suggest creating a new SPLIT_MY_BLOB procedure. This procedure would take a BLOB and return two CLOBS as OUT parameters: one CLOB is the spec and one is the body. Then you can reuse this 'split' procedure in other code or more complex versions of code. Modular programming is the key.
2. execute the spec - Now have a step that executes the spec and does something appropriate if the step succeeds or if it fails. I mean, do you really want to do execute the body if the spec execution fails? What do you want to do? Should you delete the body and spec? If you don't you might wind up with an INVALID body based on old code and an INVALID spec based on the new code you were trying to use. How will anyone, including you, know that the spec and body in the ALL_SOURCE view is really two different versions of things?
This suggests that for your use case you may want to consider DROPPING the entire package, spec and body, before trying to recreate them both. At least if the package is totally missing anyone will know that the entire thing needs to be put back. Ahhhh - but to do that you need to know the package name so you can drop it. Than may require adding another step to get the package name from your data-driven table and adding a DROP PACKAGE step.
3. execute the body - This step executes the body. Hmmmm - we have two nearly identical steps. So why don't you create a new function/procedure that takes a CLOB as input, uses dynamic sql to execute it and returns a result code. That would be useful. Then you could execute ANY sql stored in a CLOB and have a generic function that you can use for other things.
Right now you are using the VARCHAR2 table version of DBMS_SQL.PARSE but you would change this to use the CLOB version.
The end result of this refactoring is a main function/procedure that acts as the CONTROL - it decides what to do and what data (BLOB) to do it with. But it doesn't actually do ANY of the work. It just controls what is done.
And you have a couple of generic, reuseable functions that actually do the work. One knows how to split a CLOB into spec and body. The other knows how to use dynamic SQL to execute a CLOB.
Now you have a modular architecture that is easy to understand, easy to code and easy to test. -
Dish Stirling sun Tracking program
Hello , i am a Labview beginner. In a previous Work a program for sun Tracking was written. This program could not be tested because of a short ciciut in one of the TMCM 1110. My Task is to get the program run. But after one Week of trying i just can control the motors with labview and this program i found in the internet. I have no idea how i should do this. Actually the program should work but it doesnt. The Bachelor thesis in which the program is described is in the appendix and the program too, Please help me i have really no idea. maybe you find the mistake in the program or maybe you have an idea for a new program to get get the Dish-Stirling-Sun tracker to run.
Thank you.
Attachments:
Autotracking Dish-Stirling Solar Power Plant Ordner.zip 83 KB
2014-10-28 18.22.38.jpg 3373 KBHi,
i believe, you posted this question in an earlier thread on:
http://www.labviewforum.de/Thread-Dish-Stirling-Solaranlage-2-Achsen-Schrittmotorsteuerung
I recommendation are the same as Trinitatis told you.
the bockdiagram is not programmed based on the NI style guide. Therefore nobody will be able to debug the program.
-> You should rewrite the source code in a modular architecture. Furthermore you have to think about your architecture.
Therefore you have to get the basic knowledge in LabVIEW programming. The easiest way to get them is listening to LabVIEW core 1 and 2. There are several ways to do this. If you have a software within SSP, you can use Self paced online training for free,
http://sine.ni.com/myni/self-paced-training/app/main.xhtml
If you are writing your "Studienarbeit", you are able to get the thypical courses like core 1 and 2 for a reduced price, you can register for this via the following link in germany:
http://germany.ni.com/academic/training/programs
These would be my recommendation for you as a beginner. After getting the basics, you will be able to get the program running.
Without Hardware i believe, you are the only person who can find the issue.
Best Regards, Fabian -
I have a fairly large top level application vi which contains a number of non-reentrant Functional Globals. It is a cRIO RT application. The product which this LV application supports is modular. That is, the end product is being expanded by integrating a duplicate set of the hardware. From a software control standpoint, the same LV application could be used to support the expansion. Thus, on the cRIO a second instance of the top level application vi running from a parallel loop would do the job. However, because of the non-reentrant Function Globals this will not work because state needs to be maintained. I see two options for a solution:
1) Duplicate the top level vi hierarchy with unique file names for all functional global vi's. This would be very inefficient.
2) Change the functional global vi's to re-entrant, pre-allocated. This may be the best, but has it's issues because the application calls these vi's in different places.
Any other suggestions to manage a modular architecture like this?Here, I got it to work.
You make your functional global a non-reentrant template and you make your top level vit a reentrant vi template. Then when you launch the top level vit dynamically you will get two independent instances of the functional global. I used VI server methods but you could most likely use start async call if you are using LabVIEW 2012.
Run the Main.vi and you will see that each launched template VI increments its counter independent of the counter in the other vit.
CLA, LabVIEW Versions 2010-2013
Attachments:
vitemplates.zip 25 KB -
Using a User Store different from LDAP to identify users
Hello everybody,
I've developed a couple of authentication classes in Access Manager and
I found the constrain to use a LDAP user store very limitative.
I have to develop a class that check the credential against a table in
a database. I've no LDAP user store at all. I find all the relevant
information in the db. So I can correctly authenticate the user but I
can't "say" to the Identity Server that the user is also correctly
identified. In the code I can create a new NIDPPrincipal object with a
(null UserAuthority) setting its properties for the authenticated user.
It works but anyway I've to add a "fake" LDAP User store to be able to
check the "identify user" option in the method definition in the
Administration Console. And I presume that the Identity Server can
became unstable because it can not find the User in the user store.
I've looked at the LDAP Plugin extesion, trying to create a "wrapper"
to the db, but the documented API is only about the LDAP definition and
does not expose any interface to catch ldap search or read (or whatever
else the Indentity Server may ask to the User store) so I guess that the
LDAP access is hard-wired in the Identity server code. This approach
seems very strange because the modular architecture of the NAM solution
could work very well with other type of user stores than LDAP. I
expected to find an interface to abstract the User Authority.
I'm missing something or my argumentations are very wrong?
Thanks
Giovanni
cannata_g
cannata_g's Profile: http://forums.novell.com/member.php?userid=17484
View this thread: http://forums.novell.com/showthread.php?t=422784cannata g wrote:
>
> Hello everybody,
> I've developed a couple of authentication classes in Access Manager
> and I found the constrain to use a LDAP user store very limitative.
>
> I have to develop a class that check the credential against a table in
> a database. I've no LDAP user store at all. I find all the relevant
> information in the db. So I can correctly authenticate the user but I
> can't "say" to the Identity Server that the user is also correctly
> identified. In the code I can create a new NIDPPrincipal object with a
> (null UserAuthority) setting its properties for the authenticated
> user. It works but anyway I've to add a "fake" LDAP User store to be
> able to check the "identify user" option in the method definition in
> the Administration Console. And I presume that the Identity Server can
> became unstable because it can not find the User in the user store.
>
> I've looked at the LDAP Plugin extesion, trying to create a "wrapper"
> to the db, but the documented API is only about the LDAP definition
> and does not expose any interface to catch ldap search or read (or
> whatever else the Indentity Server may ask to the User store) so I
> guess that the LDAP access is hard-wired in the Identity server code.
> This approach seems very strange because the modular architecture of
> the NAM solution could work very well with other type of user stores
> than LDAP. I expected to find an interface to abstract the User
> Authority.
>
> I'm missing something or my argumentations are very wrong?
I'm probably not really the right person but the way I see it is that
NAM supports LDAP userstores therefore it kinda makes why the LDAP code
is so heavily embedded. Maybe log an enhancement request to see if JDBC
can be supported as an authentication mechanism.
Cheers,
Edward -
is it possible to connect FM with a Database, so that I have not to export anything from the DB, but just open the document with the link to DB and print my pdf?
Are there some plug in that do this? Which?
Thanks.Hi David,
Since you asked..;)
Our company, Index Information Technologies, has been working with SGML and XML the past 14 years. We are a system integrator/consultant/SW development house that builds documentation systems for customers using structured text.
Indox is an application we have developed over the past years. Since our website's (www.index.fi) english translations are being updated (still..) and I'd imagine that finnish portion might cause reading problems.., here are the some of the new things:
Overall
- supports also DITA
- Connector supports DITA Open Toolkit
- supported databases: X-Hive, (eXist) and SQL Server 2005
Indox Connector
- connector between DB/filesystem and an XML editor
- .NET-based modular architecture
- front-end connection via COM interop
- back-end connection via SOAP, REST, filesystem..
- database browser
- check-in / check-out / open / save..
- supports versioning and ACL
- Xlink resolver
- edit documents through links (conref/xref)
- resolve links for publishing through editor/pipeline
- link editor (conref/xref)
- fetches external entities (eg. graphics) from database or file system
- supports embedded graphics (SVG or base-64 encoded binary data)
- pipelined server/client-side XSL-transformation engine
- configurable parameter passing between editor and transformation
- doctype, system id, static/dynamic variables..
- supports also local transformations within the instance loaded in editor
- available for PTC/Arbortext, FrameMaker and x4o
If you want to know more, drop me an email: martti(dot)poutanen(at)index.fi
BR, Martti -
Please send me the flow of SD cycle in ABAP and linking between SD transparent tables.
hi...
Application Development Process
In this section, we will:
<u><b>Planning Phase</b></u>
Some of the most important artifacts in the planning phase are as follows:
SyncBOs required in the application are identified and verified that they can be mapped to the business objects in a backend system as well as they are sufficient to realize the client-side requirements
Client GUI design and navigation model are determined and agreed by the stakeholders
Use cases covered in each iterative cycle in the implementation phase are determined
One of the key decisions in the planning phase is to identify the business objects in the backend system and to decide how they are represented in the client application. Since one of the core functions of an Smart Sync application is that the business objects updated on a client device is successfully uploaded to a backend system and vice versa, it is very important to identify which business object in a backend system can be used and to identify the dependencies of the business objects on other objects. The identification of the business objects is typically followed by the identification of existing BAPIs. Then, it is necessary to identify the header and item structures of each object.
On the client side, the same business object identification process is required based on the requirements. It is especially important to identify whether the downsized or merged version of the business objects in a backend system can be used.
In most cases, BAPI wrappers are responsible for absorbing the differences between the client-side business objects and those in a backend system. However, if they are greatly different, it should be carefully investigated whether BAPI wrappers can really absorb the differences.
Since the GUI requirements of client applications can differ greatly from an application to another depending on the target application users, it is advisable to conduct a preliminary usability test with potential users of the application and to agree on the GUI design and navigation model used in the application as early as possible.
Finally, before moving on to the first development cycle, it is worth planning which use cases will be covered in each development cycle (For more information, refer to Iterative / Use Case Driven Development).
<u><b>Implementation Phase</b></u>
In each development cycle in the implementation phase, the client- and server-side components can be developed in parallel. However, it is important to be aware of the following dependencies:
To finalize the SyncBO access logic in the client application, the definition of SyncBOs needs to be completed, and the changes in SyncBO definition can affect the client SyncBO access logic
When SyncBOs are defined and BAPI wrappers are implemented, sample data from a backend system can be used for client application standalone testing; before that, test data must be created within the test code of the client application
For efficient parallel development, therefore, it is important to plan the activities accordingly taking these dependencies into account.
<u><b> Test / Deployment Phase</b></u>
At the end of each development cycle, it is important to conduct the integration/synchronization test, which should include the following:
Synchronization performance benchmark with various data volume
Performance benchmark of the client application on a target client device
Application deployment test
Performing the integration/synchronization test at the end of each development cycle is beneficial because it makes it possible to identify issues and risks that should be addressed in the next development cycle.
After the completion of all the development cycles and testing, SyncBOs and BAPI wrappers are moved to the production system and an installation package of the client application is put in a Mobile Infrastructure server for automatic deployment to client devices.
Iterative / Use Case Driven Development
It is rarely the case that the first plan remains unchanged throughout the entire development cycle, no matter how thoroughly the planning is conducted. Thus, as widely recommended in modern software development process, the iterative and incremental development is one of the key factors also for a successful Smart Sync application development. For an effective iteration, the following can be applied:
Cover only a couple of high-level use cases in each development cycle starting with the least dependent ones
<b>Example</b>
Suppose that it is identified that customer business object is not dependent on other main business objects although it uses country and region business objects. Suppose also that sales order business object refers to customer business object.
Then, the first cycle might cover only customer business object and related ones such as region and country objects, and not sales order business object. Furthermore, the first cycle might just concentrate on the display of customer list and detail use cases, and the creation of a customer use case might be covered in a later cycle.
Plan each development cycle to be completed in a relatively short time period, for example, in less than or equal to 3-4 weeks
Conduct integration/synchronization test at the end of each development cycle
Refine the schedule and the design based on the issues and risks identified in the previous cycle as well as the changes in the requirements (change management)
The benefits of such an iterative approach is as follows:
Makes it possible to identify and tackle issues/risks earlier in the development life cycle such as architecture risks and performance bottlenecks
Reduces the integration risks at the very end of the implementation phase
Allows continuous quality improvements and facilitates identification of reusable components
Makes it easy to keep track of the progress and to adjust the schedule
Makes it possible to demonstrate the application from an earlier phase of the application development, which makes it easy to get feedbacks from the stakeholders and incorporate them in the application
Allows the participation of technical writers and testers earlier in the implementation phase
Allows application developers to gain skills/knowledge required in various aspects of the development relatively quickly
Allows the process improvements over the iterative cycles
Server-side Application Development Process
The keys of the server-side development are as follows:
BAPI wrappers (function modules) implemented in the target backend system
SyncBOs defined in Smart Synchronization, which includes the generation of the runtime components
The table below describes the skills/knowledge and tasks required:
Target System
Skill / Knowledge Task
Web AS 6.20 Smart Sync SyncBO builder Defining SyncBOs (parameter settings)
Backend SAP system Backend application knowledge (inc. BAPIs available), ABAP BAPI wrapper (ABAP function module) development
In the planning phase, it is important to identify the business scenario and the business objects required, which is followed by the identification of appropriate BAPIs available in the target backend system. It is important to agree on how the identified business objects are represented in the client application. If the business objects used in a backend system are very different from ones in client devices, BAPI wrappers may need to absorb the differences. This can be done also on the client-side application; however, it is often the case that it is less effective to do that.
In the implementation phase, ABAP programming is required for each BAPI wrapper, and SyncBOs need to be defined using the SyncBO Builder. The SyncBO Builder will generate the runtime component (synchronizer) for each SyncBO. Then, using the SyncBO Builder, it is also necessary to generate the so-called meta-data XML, which is referenced by a client application that accesses the SyncBOs defined.
Often, it is a useful approach to define a SyncBO as soon as possible when BAPI wrapper interfaces are defined and activated for the SyncBO but before implementing the logic in BAPI wrappers. This makes it possible to generate a meta-data XML, which is often referenced during developing SyncBO access logic of a client application.
In the testing phase, the synchronization test needs to be performed. Finally, in the deployment phase, the BAPI wrappers and SyncBOs are transported to the target production systems.
The diagram below describes the simplified process of the server-side application development and where the details are covered in this cookbook:
For details of BAPI wrapper development, refer to BAPI Wrapper Development.
For details of defining SyncBO, refer to Defining Synchronization Business Object (SyncBO).
Client-side Application Development Process
The key deliverable of the client-side application development is a compiled JSP/AWT application in an archive file such as a .war/.jar file.
The skills/knowledge required for the client application development are JSP/AWT application development skills as well as the business requirements of the client application.
The client-side application development is not different from a normal JSP/AWT application development. One of the differences is, however, that the data access is performed using Smart Sync APIs.
Some of the important considerations in the client application development are as follows:
Apply Model-View-Controller design pattern, which is a popular approach of a JSP/AWT application, if the application is reasonably complex
In most cases, Smart Sync APIs should be called only within BO classes in the Model layer for reusability such as replacing the View layer with another.
Always keep in mind that PDAs are different from PCs, even if the software technology looks the same as the technology of PCs
Pay attention particularly to memory consumption and performance, and conduct the performance test on a target client device from an early phase of the development
Decide the GUI design and flows of the application as early as possible
Plan development activities taking the availability of meta-data XML, which defines the client view of the SyncBOs, into account
Develop a build script so that the standalone and integration tests are conducted frequently .
or u can visit the link
https://www.sdn.sap.com/irj/go/km/docs/library/mobile/mobile%20infrastructure/mobile%20development%20kit%202.5/content/appdev/smartsync/app_dev_process.html
<b>plz reward pts if helpful.</b>
regards
vijay -
ApplicationUpdater for apk(flex 4.5.1)
Hi friends,
I am stuck with ApplicationUpdater for flex 4.5 apps. I have used NativeApplicationUpdater.swc.
I am constatntly getting the error Update package is not defined for current installerType: exe
Also, I tried modifying the xmlns uri from http://ns.adobe.com/air/application/1.5 (as present in svn code for NativeApplicationUpdater) to http://ns.adobe.com/air/application/2.6, but same error.
I also changed the extension to apk.But couldnt resolve my problem.
Has anyone worked with APK updation? Any approach to the solution will be of great help.Thanks in advance.Thanks for the answer. Yeah I bet you figured out what I want the answer to be, but is it ? That's why I am asking here. I can see my website on my HTC Desire HD and it's working pretty well. If I reskin the parts that need a bigger hit area or the scrollers to work with touch so I don't have to scroll the actual scrollbars with my finger, remove some complex animations - everything will work just fine... The problem is that I am not sure if that is the right way to do it or if it is possible at all.
I do get your point about not designed for mobile stuff, but while with html 5 you get the job done for web and mobile with little differences at the same time, in flash you need double time cause you'll have to build 2 projects. And since the framework is one for both web and mobile.. why not...
I want to see the pros and cons of the both approaches I suggested. In a complex modular architecture I could easily swap one web module with a mobile module for example or change skins or components if I need more lightweight ones, but do I have to copy all that logic in to a MobileApplication, can't I do it with Application and use the MobileComponents (which are simplier and less functional) if the project actually needs them...
I do hope you get why I am asking these questions, and I can't believe I haven't found a guide or something like that "why this and not that" when it comes to mixing web with mobile development and flex... If you have, please share the link, I would be happy to read. Or someone with the experience in what I am talking about shares some knowledge, that would be great!
Thanks. -
Interest in helping get a NetDirector PKGBUILD for Archlinux?
Hi,
I am the project lead for NetDirector, a free and open source (right now we use a modified MPL with attribution - we're moving either to GPLv3 or CPAL) system admiistration tool primarily for servers - www.netdirector.org
NetDirector is focused on managing at the service level - so, it provides robust (one-to-many changes, change scheduling, rollback, etc) and secure (strict role-based authorization and authentication, system communication encrypted in ssl,...) management for many of the most popular Linux server apps like Apache, Samba, DHCP, BIND, Sendmail, FTP, LDAP. We have a modular architecture, so additional services can be snapped in to NetDirector as plugins. Things others have expressed interest in are a plugin for Asterisk, ClamAV, Snort, quotas, MySQL and so on. Also, we have a plugin to Red Hat Network that extends NetDirector's role-based access control, one-to-many actions, scheduling and rollback to patching and provisioning done with RHN. Something like this to Pacman would be cool!!
I got turned on to Archlinux by a user.
I would love to see if anyone out here would like to help us get NetDirector packaged up and available through the Archlinux content repos.
Also, there are a variety of other things we could use some developer help on, too. If you want to get involved and know Java, please let me know.
Thanks in advance!
GregHi guys,
thanks for rolling up your sleeves on this.
to get a sense of the NetDirector architecture, check out this page: http://www.netdirector.org/index.php?op … &Itemid=49
I hope it will help in terms of understanding the build process. Since NetDirector is a client/server tool, you need one server manager and one server agent installed on each server that you use netdirector to manage. Server Manager is by far the more complicated of the two pieces. Written in Java, it contains a database (mysql or postgresql), tomcat, the netdirector change management engine, the agent listener and more. The Server Agent is simple by contrast - written in Python, we designed the Agents to be pretty dumb so as not to gobble up toomany resources.
I've asked my more technical partner to also reply to this forum in order to give you guys guidance
Blind and Tardo - do you thihnk we should see how we make out here before I put this request to the mailing list?
Thanks
Greg -
X-Fi *entertainment mode* and L/R balance adjustment
Is there a L/R balance adjustment available in the *Entertainment Mode*? I can't find it (c.f. the older Creative Mixer Control had it by default) .. or does one have to switch to Music Creation mode to adjust balance?
No the bass and treble settings from entertainment mode do not apply to game mode. There are no bass and treble controls in game mode.
While the idea behind the new modular architecture is good, as always with CL, the execution is utterly abysmal. Whole heaps of functionality that were availble in the Audigy 2 ZS drivers, just isnt there with the X-fi. The console does not work with a dual monitor setup, each time you switch mode there is a massi've audio crunch, the driver panel crashes continuosly, the entertainment mode is too big, the panel cannot be resized, etc etc.
Then not to mention the card makes huge screeching noises when loading levels in BF2, does not work with Teamspeak, these are all things that the Audigy 2 ZS could manage but the X-Fi cant. Antoher day of this and I will probably be requesting a refund. -
What is the Best Ad Network for a Flex Website?
I'd like to put ads on my website? What is the best ad network for Flex? How did you install it?
Has anyone used OpenX with Flex?
Thank you.
-LaxmidiThanks for the answer. Yeah I bet you figured out what I want the answer to be, but is it ? That's why I am asking here. I can see my website on my HTC Desire HD and it's working pretty well. If I reskin the parts that need a bigger hit area or the scrollers to work with touch so I don't have to scroll the actual scrollbars with my finger, remove some complex animations - everything will work just fine... The problem is that I am not sure if that is the right way to do it or if it is possible at all.
I do get your point about not designed for mobile stuff, but while with html 5 you get the job done for web and mobile with little differences at the same time, in flash you need double time cause you'll have to build 2 projects. And since the framework is one for both web and mobile.. why not...
I want to see the pros and cons of the both approaches I suggested. In a complex modular architecture I could easily swap one web module with a mobile module for example or change skins or components if I need more lightweight ones, but do I have to copy all that logic in to a MobileApplication, can't I do it with Application and use the MobileComponents (which are simplier and less functional) if the project actually needs them...
I do hope you get why I am asking these questions, and I can't believe I haven't found a guide or something like that "why this and not that" when it comes to mixing web with mobile development and flex... If you have, please share the link, I would be happy to read. Or someone with the experience in what I am talking about shares some knowledge, that would be great!
Thanks.
Maybe you are looking for
-
Exception occurred during commit of transaction Name
Hi, I am getting following error while updating a Table through the application. I am running the application on welogic 9.2.. I have added new Constants to the the existing methods and i am trying to update the database table row with this new const
-
Premiere Pro CS 5.5 crashes when opening certain projects. Others work.
Hey, when opening two certain project PP starts to load but when the progress bar is full the program crashes with an error saying Premiere Pro doesn't work anymore. Other projects can be opened like normal. I can also create a new project and premie
-
Does anyone else feel that the iPhone is sluggish after update 1.1.1?
Is it just me or does anyone else feel that the iPhone feels more sluggish after update 1.1.1? I haven't unlocked or hacked the phone in any way and so it must be due to the update. I thought that the sluggish behavior could be due to a recent update
-
Why can't I view a secure web site (basic https) on my iPhone?
I was wondering why my iPhone is unable to connect (at all) to https://c1.cmpro.net? When I attempt to go to this address (this is a server at work I'd like to be able to use via my iPhone), I get the following message: "Safari can't open the page be
-
Burned DVD works fine in a mac but audio out of sync in a DVD player!?
The titles kinda says it all. Nearly. I've made my most complicated (for me) DVD to date. It's a concert DVD shot in anamorphic. I've edited in FCP and exported with compressor with all the appropriate settings, to mpeg 2. I've built the DVD in DVDSP