C++ schedule task with a non administrator account - c++

I have been looking for a solution for 2 weeks now. I have seen solutions like schtasks, timeouts, timer loops, xml-triggering, etc.
However, I can't get it working on my C++ application compiling with MinGW GCC-compiler. What I'm looking for is a C++ solution to schedule a task e.g. notepad.exe. I also have to be able to adjust the task, for instance by changing the trigger-time. (The biggest problem is that my application that is going to schedule will be ran by non-administrators!)
Unfortunately, I haven't been able to get it to work. I have also tried this example, but it won't compile because I'm missing comdef.h, wincred.h and taskschd.h? Besides that, I also can't use pragma statements with my GCC-compiler...
So, if anyone has a solution for my problem, please speak :)

Related

Start my program at login in MacOSX

I am developing a program in C++ in MacOSX, and I want to add an option to start my program at login. I investigated some possible solutions in MacOSX, but I did not understand well which is the best/the official suggested one nowadays. Some of them are easy, some more complicated, and it seems that the easier ones are not the suggested ones for the future.
Here a resume of what I found:
using OsaScript: it seems the simplest one, but I really would like a C/C++ API, and not using the osascript command
From the official documentation, I can see the 'Service Management framework', but I want the user be able to see my app started at login in the preference, and I would not like to create another helper bundle...
Again from the official documentation, I can see Launch Services Reference, but I am not sure it is what I need. I did not find any example in C/C++, and if I search for the 'Login' keyword, I just see two deprecated functions therein...
Technical Note TN2228 it seems a complete guide and with also some example therein, but it speaks about creating a 'authorization plug-in'. Do I really need that to start my app at login?
Creating Launch Daemons and Agents it seems the preferred way to launch a Daemon, but my app is not really a daemon...
So, what do you suggest me to do?
Do you know some other way to make my programm running at login?
Which one do you think is the easiest but not deprecated solution?
Do you have some example in C/C++? All the example I found are in other languages...
Thanks everybody
PS:
At the end I chose the OsaScript solution (one line of code...)
From this example you can see that you can set the property "name" when you add your item so that you can delete it later.
I am still looking for a easy C++ solution...

GNU Parallel host sticky jobs

I am writing a parallel build farm to build C++ cross-platform applications against various platforms / environments. Every time new code is pushed to a git repo, I build and test the latest code against all the platforms.
I've setup parallel to correctly distribute the jobs among several hosts using the --sshlogin option.
I transfer files, collect output and results. It's all working more than fine and I love the tool.
The build time being sometimes quite long for some platforms, I would like the build to be as incremental as possible.
My only issue is that the build is only incremental if the scheduler sends the jobs to the same machine and reuse the artefacts of the previous build on this specific host.
Say I have 3 hosts, I have 1 chance in 3 for the build to be incremental. If a hosts hasn't built this platform in a while, it might take a long time.
Is it possible to gain control over the host a specific input source will run on and only fallback to the other hosts if the host is busy?
Ideally, I would love to see a tag system where I tag input source with a name and tag several hosts with a name, creating pools of jobs and pools of machines specialized into that type of build.
But a very simple implementation where the input sources are distributed in the same order as the order the sshlogins are defined could be a simple & quick fix in my situation.
I tried to find the source code to implement it myself but I only see doc generation when I browse the code on Savannah.
Any ideas?
Thanks,
M
There is currently no support for prioritizing a given argument to a given sshlogin. The source code is at https://savannah.gnu.org/git/?group=parallel
Feel free to join the mailing list and discuss the idea: https://lists.gnu.org/mailman/listinfo/parallel
The only priority in the code is when a job has failed on an sshlogin, then GNU Parallel prefers to retry that job on another sshlogin. Maybe that could be extended?
If a job is marked as having failed -1 time for a given sshlogin, then GNU Parallel ought to prefer to run the job on that sshlogin.
I've been trying to discuss this idea on the mailing list as you suggested but never had any respone in more than 10 days... I guess you must be busy with other things at the moment. So I went along and forked the source code to make the necessary changes and make my solution work.
I pushed it there a week ago:
http://michakfromparis.github.io/gnu-parallel-sticky/
the source code is available on github here:
https://github.com/michaKFromParis/gnu-parallel-sticky
Wasn't exactly easy without any guidance as the source code has a lot of history so I tried to keep the changes surgical to ease merge of your future releases.
I've been using it in production for more than a week now and it works perfectly in my configuration.
It is also compatible with older formats, should be a drop-in replacement for usual parallel uses with extra features on the side.
Would love to get feedback from other users though as it might not be completely dry.
Thanks for sharing the original source code.
Best Regards,
M

Prevent piracy of desktop application which doesnt need Internet connection?

Suppose for an application which will never receive internet connection during its lifetime, how can you prevent the piracy of the software?
There cannot be a single product key requirement during installation because, once installed legitimately anybody can copy the installation and re-distribute it.
So every time the application runs it should check for something and crash if the check fails.
Now what could it possibly check?
Initially I thought keeping an encrypted binary file will do the job, but as answered here, that seems a negligible prevention.
Any hacker can modify the executable so that instead of crashing when the check fails it should continue running.
So no matter how difficult the check is, the cracked application will always run.
Now I cannot see any possible solution to this problem.
PS: I am a single independent developer who is developing productivity software with very low charge. Seeing this question I believe I just have to let it go. Sigh....
EDIT: I would like to thank all the contributors in this discussion in letting me know the grim reality...
What I understand now is that you are indirectly submitting the source code of your application in the form of the target executable. Its source code can be modified by anybody using a debugger, thus ANY method of preventing piracy through source code of your application is useless. The only possible solution to this problem is to keep your legitimate customers happy by providing them services (apart from the software) and keep your price below their expectations.
I was think of solving this problem for past 3 days and now all seems worthwhile but still learnt a lot in this process, which I wouldn't have otherwise...
I ha
The only standalone thing I've seen that is semi-effective is hardware keys that come with the boxed software. They used to attach to a parallel port or a serial port and get checked when you started the program.
AutoCad and similar programs used to do this, but it is a BIG PAIN for your customers. Any time it doesn't read it, or a key goes bad, customer productivity suffers. It hurts your legitimate customers far more than those who end up pirating it anyway, and a sufficiently motivated pirate can make a VM that will overcome this. Modern versions of this use USB.
My recommendation is to trust people. Upon install, make them click a "I promise I paid for this" button and be done with it. If they click "I didn't pay for this" show them a small paragraph about how to help keep good software coming and prevent customer-harming DRM schemes by simply contributing to the success of good software authors.
You could generate a unique copy for each user, create a database, and check it agents copies you find online if you like playing the biggest game of wack-a-mole ever.

Find out where application is hanging

Is there a way to figure out where an application is hanging and not completing its function? I opened the call stack but it is empty. What does this mean. Does anyone have any advice for debugging where an application was the moment it started to hang/become non responsive.
Edit: I am using Visual Studio 2010
When this happens to me, I find attaching the Very Sleepy profiler to the debugee often makes it easy to identify where the hang occurred, even if you attach it after it happened - just look for stackframes that were active for 100% of the profiler sampling session (by sorting the list by the "Inclusive %" column and looking at the top).
Compile your application with all warnings enabled and with the compiler producing debugging information. On Linux, that means g++ -Wall -g. Work on the source code till you got no more warnings. Learn to use a debugger (e.g. gdb on Linux), and use its step by step abilities.
But we can't help you more, because this is system dependent and you did not tell what system you are using and you did not show us the code you are debugging.
Read How To Debug Small Programs
In addition to using the debugger, run a profiler through the code. My VS is rather rusty, so I can't give details on how to do so, but google can help.
It would also help to have many small functions instead of few large ones, as the tightest granularity of the profile is function level.
Put log statements into the code. It is time consuming but some sort of divide and conquer approach should help you solve the problem.

How would you approach to rectify a non-responsive application?

Just now i was interviewed by ca(Computer Associates) for a C++ opening.
Q:There is an application that continuously runs for days.. at some day it becomes non-responsive/gets hanged.How would you Debug/rectify the application.What will be your first steps?
A:I answered starting with .. having a check on memory usage details/CPU usage..checking if some of the required resources are available...or if it is network bound,if the network is live..etc..
Q:He told.. these are all superficial things.. assume no such problem is there..then?
A:I told the best way is to check the debug logs if they are enabled..and if they arent..give the customer a debug enabled application and test it in the field.
Because the application is hanging intermittently..its very difficult to detect through any other way why it would go unresponsive..And debug logs would tell me at what instant the application starts to go mad,as to find the root cause the specific operation responsible needs to be known,and debug logs are what i think the best bet.
The interviewer switched to another question says .. ok fine.
So,was my answer good enough.Any other approach that a good programmer would follow?
Use WinDbg or create a (mini) dump file and load it up in your Visual Studio. Load debugging symbols for all the release binaries, and see exactly where it is hung
That should be a decent first step
Edit Of course I was (foolishly) assuming windows for no apparent reason. On UNIX/linux this would be even easier using strace, ptrace, gdb --remote, pstack, dtrace (if it's there) etc
Edit Also using WMI performance counters/perfmon is a very good practice in general. This would perhaps shed some light (but I'm sure the interviewer was looking for the 'How do I inspect a running application' type of answer; this is slightly leaning to the 'depend on logging' approach that you already had mentioned in your own answer)
Most of the times such questions cannot be answered to the point because they are very much subjective. They are usually asked to evaluate & judge how a potential candidate approaches a problem and shows some constructive approach of debugging the problem. As long as the answer shows some logical methodology of tackling the problem the answer is good.
Your answer was good. To add to it, Most important is to identify the use case/pattern where the problem occurs. If a problem is reproducble easily it is solvable. So I would try to define steps to reproduce the problem and then move ahead with steps to tackle it.