|
Showing the last text line from a file in QC, how?Hi to all, I need to show in a QC movie just the last line of text* from the latest .log** file inside a local directory. (*)File name structure: 127.0.0.1,[number].log Note: inside the specified /Directory are all the .log files, the latest is the one which its higher value in the [number] file name part. (**)New line format inside de .log: [D/M/Y h:m:s] * Text for showing Note: I don´t want to display the date and the *, just the "Text for showing" part Thank you very much for your help.
|
Hi again,
I missed something: The log is constantly updated in real time, so I need to show in QC the text from the last line just when it changes.
Thank you.
There is a Quartz Composer plugin Apple Developer example called CommandLineTool which can be used to execute unix commands. I used it together with a shell script to 'sed' the log file and remove characters up until and including when the '*' occurs.
Source Code of the plugin here:
http://developer.apple.com/library/mac/#samplecode/CommandLineTool/Intro...
It works by regularly 'tail'ing the last last line of the log file and executing the script.sh script on it; which contains the sed command to remove the leading characters to the '*'. Finally the output is written to screen (together with the original output) - if any errors occur they are output at the bottom of the screen.
I had originally wanted to place the sed processing in the CommandLine tool chain - but couldn't get it to work; hence the script calling workaround.
The attached zip archive contains
i) compiled plugin (place CommandLineTool.plugin in your /Library/Graphics/Quartz Composer Patches folder)
ii) bash script (make a note of the path where you save it, e.g. /Users/USERNAME/Desktop/script.sh if you save it to your desktop)
iii) CommandLineTool-bash-script-1.qtz (remember to change the PATH in Argument #2 of "Get the last line of the file" to your log file and enter the path of where you saved the script.sh file in "Call script")
Hope it helps!
P.S:. and make sure the file permissions on script.sh are 744 so that it will execute. (run 'chmod 744 script.sh' in a terminal)
Hi photonal,
Thank you so much for your response. I am so sorry but I haven´t found how to run your files.
i) compiled plugin (place CommandLineTool.plugin in your /Library/Graphics/Quartz Composer Patches folder)
DONE: I have placed it in:
Macintosh HD/ Library/ Graphics/ Quartz Composer Patches/ CommandLineTool.plugin
ii) bash script (make a note of the path where you save it, e.g. /Users/USERNAME/Desktop/script.sh if you save it to your desktop)
DONE: I have placed it in:
Users/ Me/ script.sh
iii) CommandLineTool-bash-script-1.qtz
¿...? I have opened CommandLineTool-bash-script-1.qtz in QC4, then I can see the attached structure. That´s one of my doubts:
(remember to change the PATH in Argument #2 of "Get the last line of the file" to your log file and enter the path of where you saved the script.sh file in "Call script")
I don´t see "Get the last line of the file" and of obviously, the path argument inside.
How can I see "Get the last line of the file"?
PS: I ran in Terminal "chmod 744 /Users/Me/script.sh" before that.
You have explained so well, maybe it´s me that I don´t understand any of your instructions. I wish you could help me out with my issues about your solution.
Thank you so much again.
I don't have a computer handy to look at the files on, but I do know that the original command line plugin needs to be installed in a plugin folder, not patches.
Hi,
I have changed it to the plugin folder and it has worked, somehow... Let me show you in the attached caption the output from the viewer.
The data is shown (the example last line text is "Arcade Fire - No Cars Go"), but for some reason the output shows a lot of info in 2 lines: Original Input and Output.
As you can see in the image, there are two sprites (I have formatted them first for showing all the contents).
I have 2 questions:
[1] "Test the '*'" has:
Path argument: /bin/echo
and
Argument#1: 2010-11-05 17:03:03.000 Xcode[828:7903]: device disconnected (isDFU = 1)*1
Do I have to change anything here?
[2] "Get the last line of the file"
I have changed Argument #2 with the path of my .log file
but Path: /usr/bin/tail, should it be changed also?
The "Call script" has the correct Path to the script.sh
AT THIS MOMENT...
GOOD:
Somehow, it is shown the last line text.
It updates in realtime when there is a new line inside the .log
Somehow, it breaks the line for the "*" character.
WRONG:
Two lines (input/output) are shown, with a lot of info before the expected text.
You must enter manually inside the movie, the name of the last .log file (remember there are a lot of .log files inside the same directory, the newer, the one which has the higher number in its file name).
UTF-8 characters are not shown and breaks the rest of the text (i.e. "Canción" is shown like "Canci")
Thank you again.
ooops, sorry about that - I hadn't noticed that I had a duplicate of the CommandLineTool plugin in the 'Plug-ins' folder too; which was why I thought the one in the patches folder was working ;-)
Yes, the Plug-ins folder is where it should be installed.
In answer to your questions:
1) The "Test the '*'", is just a patch to check that the text snip after the asterisk was working, so no need to change anything there.
2) In "Get the last line of the file", there is no need to change the path of tail either. I only included the paths to the unix commands because there were times when they wouldn't work unless I included the full path.
Could you provide a couple examples of the log files? Perhaps edit them to just include the last ten lines (preferably with some UTF-8 characters in them) of each if they are very large.
Looks like your whole / (root) directory is being processed there, check that you don't have a space after a '/' in the paths you added.
Hi again,
I have attached 2 consecutive .log files as an example with special characters entries. These are the .logs generated from the app, as they are, without editing anything. I have tried again in QC, and it shows the special characters in the viewer, DONE.
Now, the 2 left issues are:
[1] I have noticed the * stripping doesn´t work for me (the * makes that the "Applications Developer Library..." large sentence appears).
[2] How to autoload the latest .log file in QC?
Notes:
Thank you so much again.
You are right, the .logs are stored at root, but the space after the '/' was an issue of this transcription, it´s ok in the argument fields.
This 'asterisk' in the log files is causing this. Any chance to write the logs without the 'asterisk's? Otherwise the logs will have to be pre-processed to remove them in this current workaround for it to work correctly.
This version (as before change the paths in the various patches for your system) will process new log files as they are created, however I haven't found a way to get around the asterisk problem - they will need pre-processing to get rid of it otherwise the asterisk gets used as a parameter which is why the extra Directories turn up in the output data.
Anyway, hope this helps as a building block to getting what you want.
Even if they have new names? I have tried it with several .logs in the same directory, and it always loads the specified file in Argument #2, not the newest file with new file name.
Another issue is when it´s running for a while the background and the text disappear from the Viewer (it´s like it crashes or something). Then, when clicking Stop and Run, the background and the text come back again but the text scale changes dramatically in the Viewer, except in the sprite Width and Height parameters.
Thank you.
Here's the new version which reads in new log files.
Yeah the text does go haywire after a while - no idea why that id happening.
Hi,
I have tried CommandLineTool-2 with no results. I have changed before running it the paths in your files and tried from /Users/Me/ and Users/Me/Desktop/ (with the .log files in these directories in both cases) having the same output in the Viewer: "Original Input: (blank)" "Output: (blank)". The .sh files are 744 already also.
Did it worked for you with my .log files that I have attached in a previous post?
About the crashes, If there is no way to arrange them, it makes the script useless actually.
Thank you again.
This is the output from the 2nd version.
But like I mentioned, some preprocessing would be needed to be done to the log file to remove the asterisks first; could be done with a script using the 'sed' unix command. Hopefully there are pointers here to help you complete what you are looking for.
Hi,
As I said you before, I can´t get anything in the viewer. I think no .log file is loaded (or something like that), in my case with version 2. How have you done that?
Let me know what I need to change in your files, in my case I put them at /Users/Me/ (in the same directory with the .logs), and changed the directories inside the CommandLineTool-bash-script-2
Do I have to make more changes than these? Do you mean I need to remove the * inside the logs? It can´t be done as they come directly from the software.
Another thing is that I have ran it in Profile mode, and I see the crash issue could be in the LFO settings (when disconnecting it, the script doesn´t crash). Is it necessary to have it as fast as you have configured it?
Thank you.
Ok, hopefully this one does a better job.
It assumes your path is : '/Users/pibo/Desktop/'; change as necessary (change in 'Get latest log file', 'Get the last line of the file' and in the scripts too.)
It also assumes your log files are being written to your desktop.
i) it looks for new log files less frequently (set changing the LFO Period)
ii) it pre-processes the log file to remove the first 24 characters (and the offending asterisk)
Hi again,
It seems that the crashes are gone, but now there is something unexpected in its behaviour now (at least for me):
I have in Desktop the "Scripts" folder, the "CommandLineTool-bash-script-3" file and this 2 .logs also:
127.0.0.1,50454.log
127.0.0.1,50604.log
As the "127.0.0.1,50604.log" file is the last one, it is supposed that the Viewer shows "Arcade Fire - No Cars Go", but:
The first time, it is shown: "Lori Meyers - Hostal Pimodán" The 2nd: "odán" ...
Explanation:
The first time your function runs, it loads the 1st .log file (not the last one) and creates a new "127.0.0.1,50454.log.log" (2 .log) with just the last line of the previous file without the first 24 characters. So it is "Lori Meyers - Hostal Pimodán" in it, and shows this line in the Viewer.
The second time it passes, it loads the "127.0.0.1,50454.log.log" file (not the last one) and creates a new "127.0.0.1,50454.log.log.log" (3 .log) with just the last line of the previous file without the first 24 characters. So it is: "odán" in it, and shows this line in the Viewer.
(etc)
I don´t know how to work with sed, so I can´t find how to help and arrange this by myself, but don´t worry if you don´t find any solution that works. It´s a pity, but maybe it is not possible to make it work correctly as expected.
Anyway, thank you so much for all your work.
Well the period of the LFO could be tweaked to match more closely the rate at which the log files are being created.
btw, there's plenty of 'sed' documentation online.
Anyway, good luck with your project!
Hi again,
I can have the SED code working at 100% right now (thanks Photonal for your previous help here).
Both .sh files are now:
[getFileName.sh]
#!/bin/bash cd /Users/Me/ ls -tr *.log | tail -1
[getLastLineOfLog.sh]
#!/bin/bash sed -ne'$s/^.{24}//p' /Users/Me/$1
BUT there are critical issues now with Quart Composer in [CommandLineTool-bash-script-3]:
Hope I could find a solution for this. Maybe is the LFO and Pulse, that don´t work as expected.
AS Smokris (developer) said in another forum, maybe it is a bug in the current version of the Command Line Tool.
Hi Pibo,
I tried out your version with an LFO triggering the scripts and it is working fine without any crashes or text scaling issues.
Hi again photonal,
I thought for a moment it has been done already, but the LastTrackTiggered.qtz crashed after 2 minutes, and when I runned it again from the Viewer, the random scale appears and no data has been reloaded anymore.
Things go normal for a while when I restart QC with LastTrackTiggered again, but then it crashes suddenly as usual.
Have you tried it out for about 2-5 minutes entering new lines in the current .log on the fly and has it worked? Let me know, please.
Regards.
Does anybody know why this LastTrack composition crashes after a short time running?
I have tried unplugging the LFO/Pulse and Enable/Disable by hand continuosly both Command Line Tool patches.
When doing it in "Get lastest .log file" patch, it outputted this error:
An exception was raised:
*** -[NSConcreteTask terminationStatus]: task still running
0x85b9bc55: -[QCContext nextExecutionTimeForPatch:time:arguments:] 0x85b9b9fe: -[QCGraphicsContext nextExecutionTimeForPatch:time:arguments:] 0x85b9b7e1: -[QCOpenGLContext nextExecutionTimeForPatch:time:arguments:] 0x0000d5f2 0x85be372d: -[QCView render:arguments:] 0x84ad6c49: -[NSView _drawRect:clip:] 0x84ad58bc: -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] 0x84ad5c26: -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] 0x84ad3f8e: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad4e5a: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad4e5a: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad3ab0: -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad0362: -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] 0x84a49b9a: -[NSView displayIfNeeded] 0x84a44a46: _handleWindowNeedsDisplay 0x85471b37: __CFRunLoopDoObservers 0x8544d464: __CFRunLoopRun 0x8544cdbf: CFRunLoopRunSpecific 0x8470591a: RunCurrentEventLoopInMode 0x8470567d: ReceiveNextEventCommon 0x847055d8: BlockUntilNextEventMatchingListInMode 0x84a19e64: _DPSNextEvent 0x84a197a9: -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] 0x849df48b: -[NSApplication run]
When doing it in "Get the last line of the .log file" patch, it outputted this error (i think is the same):
An exception was raised:
*** -[NSConcreteTask terminationStatus]: task still running
0x85b9bc55: -[QCContext nextExecutionTimeForPatch:time:arguments:] 0x85b9b9fe: -[QCGraphicsContext nextExecutionTimeForPatch:time:arguments:] 0x85b9b7e1: -[QCOpenGLContext nextExecutionTimeForPatch:time:arguments:] 0x0000d5f2 0x85be372d: -[QCView render:arguments:] 0x84ad6c49: -[NSView _drawRect:clip:] 0x84ad58bc: -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] 0x84ad5c26: -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] 0x84ad3f8e: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad4e5a: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad4e5a: -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad3ab0: -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] 0x84ad0362: -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] 0x84a49b9a: -[NSView displayIfNeeded] 0x84a44a46: _handleWindowNeedsDisplay 0x85471b37: __CFRunLoopDoObservers 0x8544d464: __CFRunLoopRun 0x8544cdbf: CFRunLoopRunSpecific 0x8470591a: RunCurrentEventLoopInMode 0x8470567d: ReceiveNextEventCommon 0x847055d8: BlockUntilNextEventMatchingListInMode 0x84a19e64: _DPSNextEvent 0x84a197a9: -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] 0x849df48b: -[NSApplication run]
Thank you in advance for your help.