-
Posts
156 -
Joined
-
Last visited
-
Days Won
8
Content Type
Profiles
Forums
Downloads
Gallery
Everything posted by Steen Schmidt
-
Get connector pane 32x32 image - looking for better idea
Steen Schmidt replied to Steen Schmidt's topic in LabVIEW General
Thanks Phillip, I have worked a bit with Darren's VI, and it's slightly faster than scripting a subVI, but the created conpane image does not look 100% correct, as some of the terminal borders are thicker than normal (2px vs. 1px). But your link gave me an idea; I could combine Darren's approach of making the colored rectangles in an empty image, and then just superimpose the proper conpane "frame" on top of that image (instead of drawing a slightly wrong rectangle around each terminal position). The only drawback is that I'll be supporting a static set of conpane patterns then. On the other hand, once the conpane patterns eventually gets updated, my whole BatchEditor will probably have to be rewritten anyway. I'll take a look at it tomorrow - it's getting close to midnight here. Cheers, Steen Update: Superimposing the conpane frame doesn't work correctly either. Output terminals should have 2px wide borders in the conpane image, while inputs and unwired terminal borders should have 1px wide borders. And it's of course not possible to have all possible conpane image combinations of I/O prepared statically. Back to the drawing board, or stay with the scripting approach... -
Lucky for him then . There is a big difference between using a hidden feature at your own risk that didn't violate any license agreement, and breaking a feature that could potentially invalidate the code security of NI's customers. But it doesn't upset me that much that flarn2006 wishes to look into how stuff like password protection is implemented, and maybe trying to defeat it. H***, all us techheads here probably have that urge in us, and we have done it in some form or another once in a while. We just have to look at how this or that works. Yes, that's an appealing trait. But it comes with a big responsibility, and that is where I feel the chain comes of. flarn2006 (what's your name really, I'd like to be able to call you something more human-like ) doesn't acknowledge this responsibility. Now he has asked in a couple of different threads if it's OK or not to tell people how to defeat the password protection. He seems to genuinely believe it is up to himself to decide which parts of a license agreement he may break, and he can judge all by himself that this is a feature that nobody but NI wants. I think the password protection scheme is a big deal. It can be broken, it's not that hard. I've seen it done numerous times over the years, it's not rocket science, so there's nothing to prove here. Only a skewed morale. If some of my (commercial) code ends up in his hands, I'll expect him to attempt to break into it, and I'll expect him to feel righteous doing it. But I'd be feeling robbed. So no, I wouldn't hire him, but I'd keep him real close if he was in my circles... He's by his own account only 19, so he can still change his views of course. Or he could be the one writing the next trojan that kills my backup servers... /Steen Did I really write "sole"? . Don't feet the trolls I must add then... /Steen
-
Lets' take the latter first; No, you're right, I cannot (nor would I) guarantee that anything bad will happen to our guy here. Of course not. What I really meant was that he would be breaking his contract, so he's not on safe ground. Almost no matter the circumstances, an exception being force majure-like circumstances where there could be legal outs to breaking an otherwise legally binding contract (the whistleblower policies for instance). But by "getting into trouble" you could argue that he derates his personal value, and maybe choses the path of lesser opportunity - i.e. he is less trustworthy if he choses to break a signed contract, and that will stack up against him eventually. Anyways, I reread my own post and I may be coming off as something of a doomsday preacher. Sorry about that to all of you! About the non-equality of intellectual and physical rights. You're right again, they're not the same, but similar in many ways. Especially more similar than flarn2006 seems to recognize. It's a topic that can't be treated with fairness in this forum, it's far too complicated. My isolated point was that regarding ownership and who-can-decide-what they are very equal. If you agree to some terms of usage, well you will have to abide by those rules. But there are several differences as well, but not in favor of the end-user; the clause of termination rights for instance, that does not exist for physical entities (I'm grateful for that). Add to this that intellectual property is treated slightly differently in different legal domains, but so are some physical property laws. So sure, they are not equal but equivalent. flarn2006 seems to think that "intellectual property" equals free-for-all though, and that's my main concern. /Steen
-
Doesn't it sound funny in your own ears: License agreement, and then breaking that agreement? Why do you think it's up to you to decide which parts of the agreement to follow and not to follow? That is the main point, I think, that irks us on this board; that you display such indifference to violating a contract that you have signed. I would never hire a guy like you, if I found such statements as yours on the internet. I simply wouldn't trust that you would honor any agreement that we made. Sure, software licensing is up for a major change over the comming years. That probably goes for large parts of the digital media usage legislation. But until that happens you have an agreement with your software vendor, no matter if you have paid for that software or it's free. One of the much talked about things currently is if you actually have the right to resell "used" software. My opinion is that you should be allowed to, but many software vendors disagree. Several large companies are in the process of changing their licensing schemes so you lease their software for a limited time (20 years for instance), in which case you definetely cannot transfer your contract to a third party. So, probably nothing bad will happen if you don't tell anyone what you do, but it's definetely a problem if you involve others. And even if you keep it exclusively to yourself it's still a violation, it's just not one with a high risk of getting spotted by anyone. Anybody can put anything into a contract as long as it's not violating any other law, and if you sign that contract (for instance when buying a car) it's binding. Using your analogy; Porsche had a very special paintjob on a very small number of 911s a year or two back, where they put in the buyer's contract that they were never allowed to repaint the car, and any damages to the paint should always be taken to the Porsche factory for repair. Nobody else are allowed to touch up that paintjob. That's a legal contract, and I expect those select Porsche owners are thrilled by owning such a special car . You break a contract. Contracts (your trustworthyness basically) and money are two things that glue the world together. It's taken very seriously when you mess with either. And damages? One could think up a number of possible damaging outcomes from you looking at source code you agreed not to look at for instance; You could get technical inspiration that made you rich in a couple of years - you could even turn out to become that software vendor's biggest competitor in the market. It could be even worse than that. A slight mention of how to break a licensing scheme (just wisper "MD5" and "Calypso algorithm" in the wrong forum) could potentially mean that some poor sole sold 5 instead of 5,000,000 licenses of his or her software. There are many many real world cases that supports this statement; Nero Multimedia, Winzip, Ghisler (makers of Total Commander), and IDM (makers of UltraEdit) for instance. /Steen
-
Get connector pane 32x32 image - looking for better idea
Steen Schmidt replied to Steen Schmidt's topic in LabVIEW General
Thanks again Darren, that VI basically does exactly what Yair suggested and what I turned down as too much work . /Steen -
Just stumbled upon this thread... @flarn2006: It's hard for me to see your points in any light different than the "new generation's view that everything in this world was made for them, and nothing that CAN be obtained is to be held from them". A few of my own comments: - There is no difference whatsoever between intellectual property and physical property. If you can't see that then you just have to live a while longer and it will dawn on you eventually. - You WILL get into trouble for releasing to the public any information that helps break the LabVIEW password protection scheme. The definition of "public" being any entity outside yourself basically. You will be in breach of NIs license agreement as well as the intellectual property laws of almost any country. Those laws typically state that if a lock is in place, you may not attempt to break it. They do not consider themselves with the strength of the lock, merely its presense. - Personally I'm for DRM when it's done right: it's the sole right of the intellectual property owner to chose which platform you may use the digital content on or with. The problem is that 99.9% of all DRM protected material is flawed by nature. The usual beef people have with it is that they felt they were promised that the digital content would work on some device that it turns out it doesn't. That can be categorized as mislabelling to downright fraud from the seller's side, depending on the circumstances. Unfortunately it's really hard to come down on a big company when they have promised you something that they can't or won't deliver. It's actually difficult for me to grasp how you can think that you own the intellectual rights to some software that you've only paid a tiny fraction of the development cost of? Do you sincerely believe it's OK for you to reverse engineer Word for instance, just because you forked out a couple of dollars for it? "Reverse engineering" in my eyes is just a matter of level. A password protected VI takes less work to get back to the clear source code, while an object file is a bit harder to reverse. You have in both cases been locked out from viewing the "source". It's not yours. And simply by looking at it, you obtain valuable information. Of course it's a pain if it's your own VI that happened to have a malfunction with the password protection scheme, but then as suggested you should contact NI to get it resolved. Regards, Steen
-
Get connector pane 32x32 image - looking for better idea
Steen Schmidt replied to Steen Schmidt's topic in LabVIEW General
ShaunR: The Icon Editor isn't helping either. It doesn't get the conpane image really, it builds a slightly larger terminals outline image programmatically from conpane info. This conpane info is publically available, and I could use that to create my own conpane image... And then we're at what Yair suggests, namely that I build this image manually instead of grabbing it from somewhere, and hoping this process is faster than what I do now with scripting. The programming involved is quite extensive pixel-chipping though, so I think I'll stick with what I currently have and use those hours on something else in the BatchEditor. Thanks for your suggestions :-) Cheers, Steen -
Get connector pane 32x32 image - looking for better idea
Steen Schmidt replied to Steen Schmidt's topic in LabVIEW General
Phillip, the 'Get Conpane Image' method works fine, it just doesn't return the image I need. Marc Page's Polish VIs library does not get the image I need either, it builds a larger version of the conpane step by step - sort of what Yair suggests, just larger. /Steen -
Get connector pane 32x32 image - looking for better idea
Steen Schmidt replied to Steen Schmidt's topic in LabVIEW General
Yes I have, the 'Export Interface' method returns the same image as the 'Get Conpane Image' method. That is, the icon (not conpane "icon") including any controls and indicators connected to the conpane. It doesn't include the VI Description text either, which I had actually expected (to the extent that you can expect anything from private methods). That method is also a bit funny as it's marked as "Deprecated" (as in your image) when imported from an earlier LV version, even though it's still present, and selectable, with the exact same name in LV 2012 for instance. /Steen -
Hi, Do you know of a simple way to check programmatically if a VI (any LV file actually) is compatible with different LV targets (Desktop, Real-Time, FPGA)? Currently I plan on scripting an empty project, add Real-Time and FPGA targets, add the VI under each target and check for execution state. Since I expect this approach to be slow as ****, and a broken (e.g. under construction) VI will defeat the check in any case, I'm looking for a better alternative. Is there some private VI Server methods that can tell me if my subject LV file is compatible with this or that target? Preferrably while loading as little as possible of the file into memory. Of course a VI and its dependencies need to be loaded to check for compatibility, but I want the process to stop as soon as a problem is encountered (since by then I know the answer is "not compatible"), and I definetely don't want the "searching..." prompt to appear if a dependency is not found at the expected path. Looking forward to your input here! Cheers, Steen
-
Hi, I'm building a BatchEditor to bulk edit/verify for style many LV files at once (projects, VIs, controls, folders etc.). For that I need to get the 32x32 pixel connector pane image. Not the icon (I can get that with the public VI Icon.Get As Image Data method), and not the image from context help (I can get that with the private Get Conpane Image method for instance). Instead, look at the output of my VI here: I do that by scripting a new VI, dropping in my subject VI as subVI, then showing that subVI's terminal image instead, then grabbing the image from there: In case you're wondering; the 32x32 pixel "Black frame icon" is set to get correct conpane images of subVIs that are smaller than 32x32 pixels to start with... But, this entire scripting approach is slow and convoluted, do any of you guys have a better idea to get this image? Cheers, Steen
-
Dropping control from palette: making it wire up the conpane?
Steen Schmidt replied to Steen Schmidt's topic in VI Scripting
I actually missed the above part when reading your post the first time - probably because the font was so large and in a different color that I mistook it for a commercial or something like that . But anyways, I have already modified the label and caption of those error clusters. The labels are now "Error in" and "Error out" instead of "error in (no error)" and "error out". The captions, which were empty before, does now hold the default value by default. I remove those default value parentheses when "Error in" is required (which it actually is for some of the functions in my "Error & Warning" toolset). The GPower style guide contains these rules (among others) regarding control/indicator labels and captions: - No default value nor unit in the label. - Labels start with a capital letter and every following word in the label start with small letters (thus "Error in" and not "Error In"). - Labels must be in bold. - Control captions are "<Label><space><(default value)><space><[unit]>". - Indicator captions are "<Label><space><[unit]>". - The <Label> part of a caption is in bold, the rest in plain text style. - Units may be left out of captions if the value is unit-less, else unit is required (also when there is no default value specified). - Default value specifier may only be present in the caption if the control isn't a required input on the connector pane. - Default value must also be specified for empty values (if the above rules state so). Such empty values could be "" (for strings), <empty> (for arrays), <none> (for variants) etc. So, following the above these GPower error controls and indicators have captions like the ones you see in the image in my OP; "Error in (no error)" and "Error out". I remove the " (no error)" part of the caption when "Error in" is required. I don't agree that the error cluster control should have special treatment when it comes to indicating its default value. I do find the connector pane tip strip indication (of some kind) of the default value a really good solution that would enable us to get rid of stating the default value in the caption of controls and indicators. So I've kudoed that idea. But no special treatment of the error cluster from my side. That said, the NI error clusters don't follow the GPower style guide, therefore they are updated for my use. I'm not sure how a better indication of unit should be implemented. It would be great to get rid of units in the captions as well, and I don't think the current unit implementation on controls in LabVIEW cuts it for this purpose - it's much too rigid to use in practice, so I never specify units on controls in reuse VIs (you know, the unit field that can be enabled for numeric controls). Regards, Steen- 5 replies
-
- error cluster
- scripting
-
(and 2 more)
Tagged with:
-
Dropping control from palette: making it wire up the conpane?
Steen Schmidt replied to Steen Schmidt's topic in VI Scripting
Yair, making an intermediate XControl delete itself after doing its stuff is actually a novel idea. I'll ponder that for a moment... /Steen- 5 replies
-
- error cluster
- scripting
-
(and 2 more)
Tagged with:
-
Hi. I have this 'Error & Warning' toolset with a functions and a controls palette: The controls palette contains only a single control, basically a subVI dropping its contents on the front panel when dragged there. That contents is two error clusters so I don't have to visit the control palette twice to get those (there are a small number of additional changes to these controls, mainly label and caption formatting to match GPower style). When dragged and dropped I have this on the FP: When dropping these it'd be nice if some additional stuff happened, like they automatically got wired to the correct connectors on the conpane (if they are available), maybe they placed themselves more conveniently than where you just happened to drop them etc. Now, I have been wrecking my brain about how to do make them do this. If I turn them into XControls it could probably be done, but I'd hate to turn something as fundamental as the error cluster into a proprietary XControl and litter those all over my (and other people's) VIs. I can't seem to get anywere with scripting on this one - the VI isn't being run when it spills its contents when dragged from the palette. Do you have any ideas, or is this too much work? I could maybe register some internal LV app event when the 'Error & Warning' toolset gets installed (it's a VIP), but that seems like a lot of work. Cheers, Steen
- 5 replies
-
- error cluster
- scripting
-
(and 2 more)
Tagged with:
-
There's a bug in v1.3 that expresses itself this way. Please get v1.4 from the LabVIEW Tools Network. Cheers, Steen
-
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
VI Launcher is noted. I like that, and I agree that 'launcher' underlines the async behavior, where 'caller' can be both. /Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
It is asynchronous. The toolset simplifies the process of dynamically calling, sending data to, running, and closing a VI. Like when you open a VI reference, setup control values on it with VI Server, Run it with VI Server, and then close the reference, possible invoking the Abort method if the dynamic VI hasn't stopped when you needed it to. So Dynamic VI Call & Run would describe it quite clearly, but is cumbersome. The VI Call & Run part I combined into Dispatch, but that makes the name conflict with launching class member function VIs. Dynamic Call(er)? Dynamic Launch(er)? Dynamic Load(er)? Dynamic VI Call(er)? Dynamic VI Launch(er)? Dynamic VI Load(er)? Dynamic Invoke( r)? I'm probably inclined to Dynamic VI Caller at the moment. Cheers, Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
You're probably right Dave. Any ideas for a good name? Cheers, Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
Within the next few days I hope to have an update to the VIRegister toolset ready. This update fixes the issue brought up by Götz Becker without sacrificing too much performance. Cheers, Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
Oh, now I see what you mean. For sure, if you obtain a named queue A in callchain B and B goes idle before anyone else obtains A, then A will be released, thus losing any data in it. That's correct. Hmm, what would an elegant way around that be? I think a requirement of having to read all variables at least once at each call site is too much. The data should remain in memory even after callchain B goes idle. I'll have to think about this for a moment. Thanks for taking the time to construct the example. Cheers, Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
Thanks, I'll take a look. Cheers, Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
The quick answer would be that you have no need to communicate with idle code. The VIRegister instance(s) you create in the calling (non-idle) code will continue to live. There is no risk of a VIRegister in running code going unreferenced due to some other dynamic code going idle. Each instance is self-referencing as named queues are used - there is no "owner" of the queue other than the LV instance. That would've been the case with unnamed queues. /Steen -
[CR] GPower toolsets package
Steen Schmidt replied to Steen Schmidt's topic in Code Repository (Uncertified)
For a single I32: VIRegisters are 10-15% slower for a single read/write than the simplest LV2, but much faster than the LV2 for parallel reads (twice as fast for 5 concurrent reading loops for instance). Performance may depend somewhat on data type (the case for both technologies). I see the biggest benefit from VIRegisters in the fact that you don't have to tie them to anything to make them work. With globals and LV2 vars you need to create and maintain a file on disk. A local you must bind to a control/indicator on the front panel, and you'll have different sorts of performance and compatibility issues depending on the configuration of said control and hosting front panel (and you can't easily share this data between VIs). Variables like Shared Variables you must configure in a LabVIEW project, and they may need additional backends to work (the SVE for instance). A VIRegister basically wraps up a single element queue. You are given automatic obtain, error handling, and the most performance efficient method for accessing this queue. And it all lives inside a single "template"; the VIRegister polyVI. That it also performs almost as well as the fastest ordinary variables is just an added benefit in my mind. Even with 10 times worse performance I'd been happy (I actually improved performance from ~10,000 reads/s to more than a million reads/s along the way). /Steen