text:
QuickTime for Java: A Developer's Notebook/Capture
From WikiContent
m (1 revision(s))
(Initial conversion from Docbook)
Revision as of 13:17, 7 March 2008
Much of this book has assumed you already had media of some kind to play and edit—but where does this media come from in the first place? Digital media has to come from one of two places: either it's completely synthetic or it's captured from a real-world source. Capture, via devices like microphones and video cameras, is far more common.
The problem is that capture doesn't officially work in QuickTime for Java. The problem dates back to Apple's Java 1.4.1 rearchitecture, which broke QTJ and forced massive changes to the API in QTJ 6.1. One of the things that was not updated for QTJ was the ability to get an on-screen component from a SequenceGrabber, which is the QuickTime capture component. Instead, Apple just put a statement in the QTJ 6.1 documentation:
Although sequence grabbing is currently not supported in QuickTime for Java 1.4.1, it may be provided in future releases.
But if you think back to how the QTJ 6.1 situation was described in Chapter 1, you might recall that QTJ classes that didn't require working with AWT—such as the quicktime.std classes that simply wrapped straight-C calls—were unaffected by the Java 1.4.1 changes and still worked. Given that, notice in the Javadoc the package called quicktime.std.sg, which contains the SequenceGrabber class among several others. Besides, capture, per se, doesn't necessarily imply using the screen, so shouldn't it still work?
The good news is that it does. In this chapter, I'll introduce the parts of the capture API that still work in QTJ, even without official support: capturing audio, capturing to disk, and even getting captured video on screen with a little QuickDraw voodoo. QTJ still needs proper support for on-screen, video-capture preview, but there's plenty to do in the meantime.
Capturing and Previewing Audio
Audio capture is a good place to start because that sidesteps the problem of the broken video preview. There's plenty to be learned in just opening up the default microphone and looking at the incoming level data—that is, how loud or soft the incoming sound data is.
How do I do that?
Setting up audio capture requires a number of steps. You start by constructing a SequenceGrabber. This object coordinates all the capture channels (audio, video...even text capture), and allows you to set capture parameters like whether to save the captured data to disk, set a maximum amount of time to let the capture run, etc.
Don't scoff—there really are text-capture devices. For example, you could capture the closed captions off regular TV (also called "line 21" data).
Once you have the SequenceGrabber, you use an optional prepare( ) call to indicate whether you intend to preview the captured media, record it to disk, or both.
To work with sound, you need to create a sound channel, by calling the SGSoundChannel constructor and passing in the SequenceGrabber. This object allows you to configure the audio capture, choose among audio capture devices (see the next lab), and get the device's driver. The driver, exposed by the SPBDevice class, provides methods for checking the input line level.
As an example, compile and run the AudioCapturePreview application as shown in Example 6-1. Note that you need to have at least one audio capture device hooked up to your computer. Most Macs come with a built-in microphone. If you don't have one, you can use a USB capture device (like a headset or external microphone) or a FireWire device (like an iSight).
Compile and run this example from the book's downloadable code with ant run-ch06-audiocapture-preview.
Example 6-1. Previewing captured audio
package com.oreilly.qtjnotebook.ch06; import quicktime.*; import quicktime.io.*; import quicktime.std.*; import quicktime.std.sg.*; import quicktime.std.movies.*; import quicktime.std.image.*; import quicktime.qd.*; import quicktime.sound.*; import java.awt.*; import java.awt.event.*; import javax.swing.Timer; import com.oreilly.qtjnotebook.ch01.QTSessionCheck; public class AudioCapturePreview extends Frame implements ItemListener { static final Dimension meterDim = new Dimension (200, 25); Checkbox previewCheck; AudioLevelMeter audioLevelMeter; SequenceGrabber grabber; SGSoundChannel soundChannel; SPBDevice inputDriver; boolean grabbing = true; public AudioCapturePreview( ) throws QTException { super ("Audio Preview"); QTSessionCheck.check( ); setLayout (new GridLayout (3, 1)); add (new Panel( )); // reserved for next lab previewCheck = new Checkbox ("Preview", false); previewCheck.addItemListener (this); add (previewCheck); audioLevelMeter = new AudioLevelMeter( ); add (audioLevelMeter); // 4th row is reserved for later lab setUpAudioGrab( ); grabbing = true; } public void itemStateChanged (ItemEvent e) { try { if (e.getSource( ) = = previewCheck) { if (previewCheck.getState( )) soundChannel.setVolume (1.0f); else soundChannel.setVolume (0.0f); } } catch (QTException qte) { qte.printStackTrace( ); } } protected void setUpAudioGrab( ) throws QTException { grabber = new SequenceGrabber( ); soundChannel = new SGSoundChannel (grabber); System.out.println ("Got SGAudioChannel"); System.out.println ("SGChannelInfo = " + soundChannel.getSoundInputParameters( )); System.out.println ("SoundDescription = " + soundChannel.getSoundDescription( )); // prepare and start previewing grabber.prepare(true,false); soundChannel.setUsage (StdQTConstants.seqGrabPreview); soundChannel.setVolume (0.0f); grabber.startPreview( ); inputDriver = soundChannel.getInputDriver( ); inputDriver.setLevelMeterOnOff (true); int[ ] levelTest = inputDriver.getActiveLevels( ); System.out.println (levelTest.length + " active levels"); // set up thread to update level meter ActionListener timerCallback = new ActionListener( ) { public void actionPerformed(ActionEvent e) { if (grabbing) { try { grabber.idle( ); audioLevelMeter.repaint( ); } catch (QTException qte) { qte.printStackTrace( ); } } } }; Timer timer = new Timer (50, timerCallback); timer.start( ); } public static void main (String[ ] args) { try { Frame f = new AudioCapturePreview( ); f.pack( ); f.setVisible(true); } catch (QTException qte) { qte.printStackTrace( ); } } public class AudioLevelMeter extends Canvas { public void paint (Graphics g) { // get current level if available int level = 0; if (inputDriver != null) { try { int[ ] levels = inputDriver.getActiveLevels( ); if (levels.length > 0) level = levels[0]; } catch (QTException qte) { qte.printStackTrace( ); } } float levelPercent = level / 256f; System.out.println (level + ", " + levelPercent); // draw box g.setColor (Color.green); g.fillRect (0, 0, (int) (levelPercent * getWidth( )), getHeight( )); } public Dimension getPreferredSize( ) { return meterDim; } } }
When run, the application brings up a small window with a green bar that indicates the current level on the line, as seen in Figure 6-1. At maximum input volume—if you're speaking loudly and directly into the microphone—it will stretch all the way to the right of the window.
There is also a Preview checkbox that is off initially. Clicking this will play the captured audio over the headset or speakers.
What just happened?
The constructor does some simple AWT business, adding the Preview checkbox and an AudioLevelMeter, which is an inner class that will be explained shortly. Then it calls setUpAudioGrab( ).
setUpAudioGrab( ) is responsible for initializing the audio capture. As described earlier, the first step is to create a new SequenceGrabber object. Next, tell the grabber what you intend to do with it, via the prepare( ) method, which takes two self-explanatory booleans: prepareForPreview and prepareForRecord.
You don't have to call prepare( ). If you don't, SequenceGrabber will take care of its setup when you start grabbing, possibly making the startup take longer.
You also need to tell the SGSoundChannel what you want to do via setUsage( ), inherited from SGChannel. As with all methods that take behavior flags, you logically OR together constants to describe your desired usage. In this case, seqGrabPreview indicates that the application is only previewing the captured sound, but you can use (and combine) four other usage constants:
- seqGrabRecord
- Include this if you want to record the captured media to disk.
- seqGrabPlayDuringRecord
- Add this to play while recording.
- seqGrabLowLatencyCapture
- Used to get the freshest frame possible (used for video conferencing and live image processing).
- seqGrabAlwaysUseTimeBase
- Used by video channels to get more accurate audio/video sync.
At this point, the capture is initialized. Begin capturing audio with SequenceGrabber 's startPreview( ) method.
To create the level meter, it's necessary to get an SPBDevice, which provides low-level access to the incoming data. This object provides level meters as an array of ints by first enabling monitoring with setLevelMeterOnOff(true) and then followed by getActiveLevels( ). The returned ints range from 0 (silence), to 255 (maximum input volume). In the example, the AudioLevelMeter inner class gets the first level on each repaint and draws a box whose width is proportional to the audio level. A Swing Timer calls repaint() on the meter every 50 milliseconds to keep it up to date.
There may be multiple levels in the array, usually two for stereo input.
The repaint thread also calls idle() on the SequenceGrabber , which is something you have to call as frequently as possible to give the SequenceGrabber time to operate.
SequenceGrabber.idle( ) is a lot like "tasking" back in Chapter 2, except there's no convenience class to do it for you.
What about...
...defaulting the volume off with SoundChannel.setVolume() ? This is a common practice because some users' speakers will be close enough to their microphones to cause feedback when previewing the audio to the speakers. On the other hand, users with headphones probably do want to hear the preview. So, the best practice is "default off, but let the user turn it on."
One thing this demo lacks is a call to SequenceGrabber.stop() when the user quits. This is something you should usually do, but I've left it out to make a point. On Mac OS X, if you don't stop the SequenceGrabber and you leave the volume on, you will keep grabbing sound—feedback included—even after the application quits. I've even seen this behavior survive a restart. So, try it out, don't blow your speakers, and then remember to have your programs turn off the volume and call SequenceGrabber.stop( ) when they quit.
Selecting Audio Inputs
It's not realistic to think the user has only one audio input device. The computer might be connected to a headset for audio conferencing, a webcam for video conferencing, and a camcorder for dumping pictures of the summer vacation into iMovie. Ideally, it should be possible to discover connected devices at runtime and specify which is to be used for capture.
How do I do that?
To provide a list of devices, you need to query the SGAudioChannel for what devices are available, and then present the choice to the user. So, take the code from the previous lab and add an AWT Choice called deviceChoice in the constructor (replacing a line with a comment that said "reserved for next lab"). Next, after the SGSoundChannel is created in setUpAudioGrab( ), insert this block of code to search for audio devices, adding the name of each to the deviceChoice:
// create list of input devices SGDeviceList devices = soundChannel.getDeviceList(0); int deviceCount = devices.getCount( ); for (int i=0; i<deviceCount; i++) { SGDeviceName deviceName = devices.getDeviceName(i); // is it available? if ((deviceName.getFlags( ) & StdQTConstants.sgDeviceNameFlagDeviceUnavailable) = = 0) deviceChoice.add(deviceName.getName( )); }
You need to update the itemStateChanged() callback to handle AWT events on the deviceChoice—in other words, when the user changes the selection. Fortunately, QuickTime allows you to change the input device by passing in a name, so switching devices is pretty easy. Add this to itemStateChanged( ), inside the try-catch block:
} else if (e.getSource( ) = = deviceChoice) { System.out.println ("changed device to "+ deviceChoice.getSelectedItem( )); grabbing = false; // grabber.stop( ); soundChannel.setDevice (deviceChoice.getSelectedItem( )); // also reset inputDriver inputDriver = soundChannel.getInputDriver( ); inputDriver.setLevelMeterOnOff (true); grabbing = true; }
The boolean named grabbing is a simple gate to keep the repaint thread from trying to get levels while this device change is underway, because the old inputDriver will be invalid once the new device is set.
A demo of this technique, SelectableAudioCapturePreview, is shown in Figure 6-2.
Run this example with ant run-ch06-selectableaudiocapturepreview.
What just happened?
The key to switching capture devices is a single call, SGSoundChannel.setDevice() , which lets you change device mid-grab, without pausing or doing other reinitializations. It takes a device by name, the same name that was retrieved by walking through the SGDeviceList.
What about...
...the "0" parameter on getDeviceList( ) ? This method takes flags, only one of which is even relevant to QTJ.
Actually, it's easier to explain by starting further down, with the test for whether to add a device to the Choice. The SGDeviceName used to identify the capture devices wraps not just a name string, but also an int with some flag values. sgDeviceNameFlagDeviceUnavailable is the only publicly documented flag. As seen in this example, to test for whether such a flag is set, you AND the value with the flag you're interested in and check whether the result is nonzero. If so, it means that bit is set. So, in this case, if the value is 0, the device is available (literally, it's "not unavailable"), so it's OK to let the user select it.
If we were to return to the getDeviceList( ), the only flag available would be sgDeviceListDontCheckAvailability, which skips the device availability check, meaning that flag in SGDeviceName would never be set, and thus the device would never be reported as unavailable. That's clearly undesirable behavior here—you don't want to give the user an option that's only going to throw an exception when she chooses it.
Capturing Audio to Disk
Typically, you don't just capture media and immediately dispose of it—you want to save the media to disk as you capture so that you can use it later. Fortunately, the SequenceGrabber makes this pretty easy.
How do I do that?
Adding to the previous labs' code, the calls to set up the SequenceGrabber need to be changed to prepare for grabbing to disk. Specifically, the SGSoundChannel 's setUsage() call gets a flag to indicate that it will be writing the captured audio to disk:
soundChannel.setUsage (StdQTConstants.seqGrabPreview | StdQTConstants.seqGrabRecord);
Next, add a call to give the user an opportunity to configure the audio capture:
soundChannel.settingsDialog( );
The settingsDialog( ) call will crash Java 1.4.2 on Mac OS X if called from the AWT event-dispatch thread. Yes, it's a bug. To work around this until the bug is fixed, you can stash the call in another thread and block on it. For instance, in this example you could replace the settingsDialog( ) call with the following:
final SGSoundChannel sc = soundChannel; Thread t = new Thread( ) { public void run( ) { try { sc.settingsDialog( ); } catch (QTException qte) { qte.printStackTrace( ); } } }; t.start( ); while (t.isAlive( )) Thread.yield( );
After starting the preview, tell the SequenceGrabber where it should save the captured audio:
// create output file grabFile = new QTFile (new java.io.File ("audiograb.mov")); if (grabFile.exists( )) grabFile.delete( ); grabber.setDataOutput(grabFile, StdQTConstants.seqGrabToDisk //seqGrabDontAddMovieResource); );
Finally, start recording to this file with startRecord() :
grabber.startRecord( );
The last step is to provide a Stop button because the data is written to disk only when the SequenceGrabber.stop() method is called. This Stop button is added near the bottom of the constructor, before the SequenceGrabber is set up:
stopButton = new Button ("Stop"); stopButton.addActionListener (this); add (stopButton);
The button requires a new ActionEventListener to make the SequenceGrabber.stop( ) call and close down the sample program:
public void actionPerformed (ActionEvent e) { if (e.getSource( ) = = stopButton) { System.out.println ("Stop grabbing"); try { if (grabber != null) { grabber.stop( ); } } catch (QTException qte) { qte.printStackTrace( ); } finally { System.exit (0); } } }
Run this example with ant run-ch06-audiocapturetodisk.
When this AudioCaptureToDisk sample program runs, the user sees an audio settings dialog, as shown in Figure 6-3.
After OKing the settings dialog, the capture begins. When the user clicks Stop, the SequenceGrabber writes and closes the audiograb.mov file and the program exits.
What just happened?
Requesting that the SequenceGrabber save to disk requires just the few extra steps detailed earlier:
- Add seqGrabRecord to the channel's setUsage( ) call.
At this point, you optionally can call the channel's settingsDialog() to give the user a chance to configure the capture.
- Call setOutput( ) on the SequenceGrabber.
- Call SequenceGrabber.startRecord().
Also, the SequenceGrabber must be explicitly stop( )ped to write the captured data to disk.
What about...
...the SequenceGrabber.prepare() call? If the second argument is prepareForRecord, why isn't that set to true for this example? Well, inexplicably, when I did set it to true, I started getting erroneous "dskFulErr" exceptions every time I idle() d, even though I had 9 GB free. No, I don't know why—it's totally insane. But given the choice of what should work and what does work, I'll go with the latter.
And what is the deal with the settings dialog? Could that have been used in the preview examples? Yes, absolutely. In fact, it's important to let the user adjust things like gain, or to specify a compressor before grabbing begins. But that's more important when you're actually grabbing to disk, so I held off introducing it until now.
Actually, it's usually best to capture uncompressed, so the CPU doesn't get bogged down with compression and possibly slow down the capture rate.
Capturing Video to Disk
Audio capture is nice, but if you bought this book because the sticky-note on the cover lists "capture" as one of the topics to be covered, you probably figured it meant video capture. Is there an iSight on the top of your monitor that wants some attention? OK, here's how to turn it on and grab some video.
How do I do that?
As with audio capture, the basics of setting up capture are:
- Create a SequenceGrabber.
- Create and configure (with setUsage( ) and the settingsDialog( )) the channels you're interested in—in this case, an SGVideoChannel.
- Call SequenceGrabber.setOutput( ) to indicate the file to capture to.
- Call SequenceGrabber.startRecord( ) to begin grabbing to disk.
- Finish up with SequenceGrabber.stop( ).
There is, however, a big difference with video. With no on-screen preview component available in QTJ 6.1, you must indicate where the SequenceGrabber can draw to. The workaround is to create an off-screen QDGraphics and hand it to the SequenceGrabber via the setGWorld( ) call.
The VideoCaptureToDisk program, presented in Example 6-2, offers a bare-bones video capture to a file called videograb.mov.
Run this example with ant run-ch06-videocapturetodisk
Example 6-2. Recording captured video to disk
package com.oreilly.qtjnotebook.ch06; import quicktime.*; import quicktime.io.*; import quicktime.std.*; import quicktime.std.sg.*; import quicktime.std.movies.*; import quicktime.std.image.*; import quicktime.qd.*; import quicktime.sound.*; import java.awt.*; import java.awt.event.*; import javax.swing.Timer; import com.oreilly.qtjnotebook.ch01.QTSessionCheck; public class VideoCaptureToDisk extends Frame implements ActionListener { SequenceGrabber grabber; SGVideoChannel videoChannel; QDGraphics gw; QDRect grabBounds; boolean grabbing; Button stopButton; QTFile grabFile; public VideoCaptureToDisk( ) throws QTException { super ("Video Capture"); QTSessionCheck.check( ); setLayout (new GridLayout (2, 1)); add (new Label ("Capturing video...")); stopButton = new Button ("Stop"); stopButton.addActionListener (this); add (stopButton); setUpVideoGrab( ); } public void actionPerformed (ActionEvent e) { if (e.getSource( ) = = stopButton) { System.out.println ("Stop grabbing"); try { grabbing = false; if (grabber != null) { grabber.stop( ); } } catch (Exception ex) { ex.printStackTrace( ); } finally { System.exit (0); } } } protected void setUpVideoGrab( ) throws QTException { grabber = new SequenceGrabber( ); System.out.println ("got grabber"); // force an offscreen gworld grabBounds = new QDRect (320, 240); gw = new QDGraphics (grabBounds); grabber.setGWorld (gw, null); // get videoChannel and set its bounds videoChannel = new SGVideoChannel (grabber); System.out.println ("Got SGVideoChannel"); videoChannel.setBounds (grabBounds); // get settings // yikes! this crashes java 1.4.2 on mac os x! videoChannel.settingsDialog( ); // prepare and start previewing // note - second prepare arg should seemingly be false, // but if it is, you get erroneous dskFulErr's videoChannel.setUsage (StdQTConstants.seqGrabRecord); grabber.prepare(false, true); grabber.startPreview( ); // create output file grabFile = new QTFile (new java.io.File ("videograb.mov")); grabber.setDataOutput(grabFile, StdQTConstants.seqGrabToDisk //seqGrabDontAddMovieResource); ); grabber.startRecord( ); grabbing = true; // set up thread to idle ActionListener timerCallback = new ActionListener( ) { public void actionPerformed(ActionEvent e) { if (grabbing) { try { grabber.idle( ); grabber.update(null); } catch (QTException qte) { qte.printStackTrace( ); } } } }; Timer timer = new Timer (50, timerCallback); timer.start( ); } public static void main (String[ ] args) { try { Frame f = new VideoCaptureToDisk( ); f.pack( ); f.setVisible(true); } catch (QTException qte) { qte.printStackTrace( ); } } }
Run this example with ant run-ch06-videocapturetodisk.
When it starts up, the program shows a settings dialog for your default camera, as seen in Figure 6-4. The video settings dialog is even more important for users than the audio settings dialog, as the video dialog gives them a chance to aim the camera, check the lighting, adjust brightness and color, etc.
Just like its audio equivalent, calling SGVideoChannel.settingsDialog( ) will crash the virtual machine in Mac OS X Java 1.4.2 if called from the AWT event-dispatch thread. And just as before, you can work around this bug by firing off the settingsDialog( ) call in its own thread and blocking until the thread finishes. I've filed it as a bug, but feel free to file a duplicate to get Apple's attention.
Once you click the Stop button, the video is written to videograb.mov and the application terminates. You can view the captured movie in any QuickTime application—Figure 6-5 shows it in the BasicQTController demo from Chapter 2.
What just happened?
The critical step in doing video capture, at least until QuickTime adds on-screen preview, is to create an off-screen QDGraphics and set that as the SequenceGrabber's GWorld:
// force an offscreen gworld grabBounds = new QDRect (320, 240); gw = new QDGraphics (grabBounds); grabber.setGWorld (gw, null);
In previous versions of QTJ, this wasn't necessary because the on-screen preview provided a GWorld that the grabber could use. With no on-screen preview currently available in QTJ, this is a handy technique.
The next step is to create an SGVideoChannel from the SequenceGrabber and set its bounds. After optionally showing a settings dialog, set the usage (just seqGrabRecord this time because there's no preview) and then call prepare(false, true), which prepares the SequenceGrabber for recording but not for previewing.
This time, setting the second prepare( ) argument to true is the right thing to do.
Just as with audio, the final steps are to call setDataOutput( ) on the SequenceGrabber, followed by startRecord( ). When SequenceGrabber.stop( ) is called, the file is written out and closed up.
What about...
...using this on Windows...it doesn't find my webcam! This example presupposes that a video digitizer component for your camera will be found, and a lot of video cameras don't ship with a Windows QuickTime "vdig", supporting only Microsoft's media APIs instead. However, there's hope: you can use SoftVDIG from Abstract Plane (http://www.abstractplane.com.au), which acts as a proxy to bring captured video from the Microsoft DirectShow world into QuickTime.
Capturing Audio and Video to the Same File
So, it's possible to capture audio and video in isolation. With QuickTime's editing API, it would be possible to put them in the same movie by adding each as a separate track (see Chapter 3). But wouldn't it be nice to just capture both audio and video into the same file at once, presumably keeping them in sync along the way? Fortunately, SequenceGrabber supports this, too.
How do I do that?
Starting with the previous lab's video-only example, you just need to add an SGSoundChannel in the setUpVideoGrab( ) method:
soundChannel = new SGSoundChannel (grabber);
The setUsage( ) and prepare() commands are identical to what was shown in the audio-only and video-only labs:
// prepare and start previewing videoChannel.setUsage (StdQTConstants.seqGrabRecord); soundChannel.setUsage (StdQTConstants.seqGrabPreview | StdQTConstants.seqGrabRecord); soundChannel.setVolume (0.0f); grabber.prepare(false, true); grabber.startPreview( );
Beyond that, everything is the same as in the video-only case. Because the setDataOutput() call is made on the SequenceGrabber—not just on an individual channel—the grabber writes data from all the channels it's capturing into the same file, called audiovideograb.mov in this case.
Run this example with ant run-ch06-audiovideocapturetodisk.
What just happened?
For once, the SequenceGrabber APIs behave pretty much as you might expect them to. With no obvious prohibition on creating both audio and video channels from the same SequenceGrabber, and assigning the grabber's output to a file, the captured data from both channels goes into a single movie file.
Making a Motion Detector
Capture isn't just about writing data to disk. You can grab images as they come in and analyze or manipulate them.
A great example of "grabbing different" is Lisa Lippincott's ScrollPlate, a demo shown at ADHOC 2004. She used her iSight camera as a scroll wheel, by holding up a Styrofoam plate with either a large green arrow (for up) or a large red arrow (for down). Her code presumably grabbed from the camera, looked at the grabbed image for an abundance of green or red, and scrolled the top window in response.
This example offers a simple motion detector, which will display an alarm message if two subsequent grabs are markedly different. The idea is that if the camera is not moving, a significant difference between two subsequent grabs indicates that something in view of the camera has moved.
How do I do that?
In this case, what you want to do is to set up video-only capture, but instead of saving the data to disk, you do a little bit of image processing each time you idle() . Specifically, there is a method in QTImage called getSimilarity( ), which compares two images (one as a QDGraphics and the other as an EncodedImage). Motion—objects entering, exiting, or significantly moving within the camera's field of vision—can be understood as a significant difference between two consecutive grabbed images.
See Chapter 5 for more on QTImage, QDGraphics, and EncodedImage.
Unfortunately, this requires jumping through quite a bit of QuickDraw hoops once an image is grabbed from the camera. Example 6-3 shows the SimpleMotionDetector code.
Run this example with ant run-ch06-simplemotiondetector.
Example 6-3. Detecting motion by comparing grabbed images
package com.oreilly.qtjnotebook.ch06; import quicktime.*; import quicktime.io.*; import quicktime.std.*; import quicktime.std.sg.*; import quicktime.std.movies.*; import quicktime.std.movies.media.*; import quicktime.std.image.*; import quicktime.qd.*; import quicktime.sound.*; import quicktime.app.view.*; import quicktime.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.Timer; import java.text.*; import com.oreilly.qtjnotebook.ch01.QTSessionCheck; public class SimpleMotionDetector extends Frame implements ActionListener { SequenceGrabber grabber; SGVideoChannel videoChannel; QDGraphics gw; QDRect grabBounds; boolean grabbing; Button stopButton; Pict grabPict; byte[ ] importPictBytes; Component importerComponent; Label motionLabel; GraphicsImporter importer; RawEncodedImage lastImage; ImageDescription lastImageDescription; byte[ ] lastImageBytes; QDGraphics newImageGW; int thumbcount = 0; // lesser numbers are more different (0 = = totally different) // public static float trigger = 0.0002f; public static float trigger = 0.002f; public SimpleMotionDetector( ) throws QTException { super ("Simple Motion Detector"); QTSessionCheck.check( ); setLayout (new BorderLayout( )); motionLabel = new Label ( ); motionLabel.setForeground (Color.red); add (motionLabel, BorderLayout.NORTH); stopButton = new Button ("Stop"); stopButton.addActionListener (this); add (stopButton, BorderLayout.SOUTH); importer = new GraphicsImporter (StdQTConstants.kQTFileTypePicture); importerComponent = QTFactory.makeQTComponent(importer).asComponent( ); add (importerComponent, BorderLayout.CENTER); setUpVideoGrab( ); } public void actionPerformed (ActionEvent e) { if (e.getSource( ) = = stopButton) { System.out.println ("Stop grabbing"); try { grabbing = false; if (grabber != null) { grabber.stop( ); } } catch (Exception ex) { ex.printStackTrace( ); } finally { System.exit (0); } } } protected void setUpVideoGrab( ) throws QTException { grabber = new SequenceGrabber( ); System.out.println ("got grabber"); // force an offscreen gworld grabBounds = new QDRect (320, 240); gw = new QDGraphics (grabBounds); grabber.setGWorld (gw, null); // get videoChannel and set its bounds videoChannel = new SGVideoChannel (grabber); System.out.println ("Got SGVideoChannel"); videoChannel.setBounds (grabBounds); // get settings // yikes! this crashes java 1.4.2 on mac os x! // videoChannel.settingsDialog( ); // prepare and start previewing videoChannel.setUsage (StdQTConstants.seqGrabPreview); grabber.prepare(true, false); grabber.startPreview( ); // get first grab, so we're ready // to calc diff's and draw component scanForDifference( ); updateImportedPict( ); grabbing = true; // set up thread to idle ActionListener timerCallback = new ActionListener( ) { public void actionPerformed(ActionEvent e) { if (grabbing) { try { grabber.idle( ); grabber.update(null); scanForDifference( ); updateImportedPict( ); } catch (QTException qte) { qte.printStackTrace( ); } } } }; Timer timer = new Timer (2000, timerCallback); timer.start( ); } protected void scanForDifference( ) throws QTException { // this seems like overkill, but the GW we give // the grabber doesn't get updated. Picts returned // from grabber are different each time, so use 'em if (newImageGW = = null) newImageGW = new QDGraphics (grabBounds); grabPict = grabber.grabPict (grabBounds, 0, 0); grabPict.draw (newImageGW, grabBounds); if (lastImage != null) { // compare to last image float similarity = QTImage.getSimilarity (newImageGW, grabBounds, lastImageDescription, lastImage); System.out.println ("similarity = = " + formatter.format(similarity)); if (similarity < trigger) { System.out.println ("*** Motion detect ***"); motionLabel.setText ("motion detect"); } else { motionLabel.setText (""); } } // create a new lastImage from grabber GWorld int bufSize = QTImage.getMaxCompressionSize (newImageGW, newImageGW.getBounds( ), 0, StdQTConstants.codecNormalQuality, StdQTConstants.kRawCodecType, CodecComponent.anyCodec); // make new lastImage lastImageBytes = new byte[bufSize]; lastImage = new RawEncodedImage (lastImageBytes); lastImageDescription = QTImage.compress(newImageGW, newImageGW.getBounds( ), StdQTConstants.codecNormalQuality, StdQTConstants.kRawCodecType, lastImage); protected void updateImportedPict( ) throws QTException { importPictBytes = new byte [grabPict.getSize( ) + 512]; grabPict.copyToArray (0, importPictBytes, 512, importPictBytes.length - 512); Pict wrapperPict = new Pict (importPictBytes); DataRef ref = new DataRef (wrapperPict, StdQTConstants.kDataRefQTFileTypeTag, "PICT"); importer.setDataReference (ref); importer.draw( ); if (importerComponent != null) importerComponent.repaint( ); // wrapperPict.disposeQTObject( ); } public static void main (String[ ] args) { try { Frame f = new SimpleMotionDetector( ); f.pack( ); f.setVisible(true); } catch (QTException qte) { qte.printStackTrace( ); } } }
When running, if two frames differ by more than a specified amount, the label "motion detect" will appear at the top of the window. Figure 6-6 shows the running application.
What just happened?
This is a huge example, but much of it draws on the video-grabbing techniques of the previous two labs. setUpVideoGrab() sets up the SequenceGrabber for grabbing video, but in this case, it doesn't need to save to disk, so the setUsage() argument is seqGrabPreview, and the arguments to prepare( ) are true and false (for preview and record, respectively). A Swing Timer calls back every two seconds—the long delay is intentional, so the potential for change between grabbed frames is greater—and calls the SequenceGrabber idle( ) and update( ) methods, followed by calls to the brains of this example: scanForDifference() and updatePict( ).
scanForDifference( ) evaluates the difference between the current frame and the last one. It does this by grabbing a Pict from the SequenceGrabber and drawing it into a QDGraphics (also known as a GWorld). It compares this GWorld to an EncodedImage of the last grab, via the QTImage.getSimilarity() method. This method returns a float that expresses the similarity of the two grabbed images, where 0 means the images are totally different and 1 means they're identical. At the end of this method, QTImage.compress( ) is used to compress the grabbed GWorld into a new EncodedImage for use on the next call to scanForDifference( ).
It might be better to call scanFor-Difference( ) on another thread, so the image analysis doesn't block the repeated calls to SequenceGrabber.idle( ).
updatePict( ) updates a GraphicsImporter that is used to provide the preview image in the middle of the window. This uses a Pict-to-GraphicsImporter trick that was introduced in Chapter 5s Section 5.4 lab. In this case, it's used not to get a Java AWT Image, but to get new pixels into a GraphicsImporter, which is wired up to a QTComponent for on-screen preview.
What about...
...the ideal value for triggering a difference? It probably depends on lighting, your camera, and other factors. In a professional application, you'd want to give the user a slider or some similar means of configuring the sensitivity of the detection.
Also, there seems to be a lot of inefficient code here, particularly with drawing into the newImageGW. Why is that necessary when the Grabber was initially set up with a brand-new off-screen QDGraphics /GWorld? This, admittedly, is weird. When I was debugging, I found that the GWorld used to set up the Grabber is drawn to once and never again. On the other hand, the Pict generated from SequenceGrabber.grabPict( ) is always fresh, so that's what's used for testing similarity. However, to apply the getSimilarity( ) method, you need to have a GWorld, so you Pict.draw( ) the pixels from the Pict into the GWorld.
Come to think of it, with this application updating the component with a new grab every couple of seconds, isn't that effectively an on-screen preview? Yes, it is, in an extraordinarily roundabout way. You could take out the motion-detecting stuff and make a preview component by just grabbing a Pict each time, making a new Pict with a 512-byte header, setting the GraphicsImporter to read that, and calling GraphicsImporter.draw( ) to draw into its on-screen component. I didn't split that out as its own lab because the performance is pathologically bad (one frame per second—at best), and because it's an awkward workaround in lieu of a better way of getting a component from a SequenceGrabber. Presumably, someday there will be a proper call to get a QTComponent from a SequenceGrabber—maybe another overload of QTFactory.makeQTComponent( )—and kludgery like this won't be necessary.


text:
Did you read today's front page stories & breaking news?
From the Wires
Become a Wing Girl and Play Matchmaker on Wingdate's New Online Dating Website
By: Marketwired .
Feb. 6, 2013 08:10 AM
LOS ANGELES, CA -- (Marketwire) -- 02/06/13 -- Although the practice of meeting someone online is no longer taboo, the process can often be overwhelming, time-consuming, and disappointing without someone to help navigate it. Enter Wingdate.com -- an innovative online dating site that introduces an old fashioned twist to online dating by allowing women to become virtual "Wing Girls" for their friends who are looking for love. A "Wing Girl" can create a profile for her friend in minutes by registering directly on the Wingdate.com site or linking her Wingdate account to Facebook.
"One of the biggest drawbacks to online dating is that people often post misleading profiles or are not truthful about what they want, and that can make the experience disappointing and a waste of time," says CEO and Co-founder of Wingdate, Dara Barker. Barker believes that the best way to meet other singles is by introductions through friends who know them. Barker realized that if she could combine the traditional way of meeting people through friends, with the vast pool of online singles looking for love, people could have the best of all worlds. "Wingdate is about getting friends out on good, fun dates with interesting people."
As a "Wing Girl," you can recommend potential suitors to your friend and ensure that she only meets the most eligible bachelors. Men that create a profile on Wingdate can find their potential "Dream Girl" by impressing her "Wing Girl" and gaining an advocate in the process.
Barker founded Wingdate with business partner and fellow Ivy Leaguer, Warren Chao, a media and technology entrepreneur and investor who helped start My Damn Channel, a leading online studio and distribution company. Chao brings substantial experience in venture capital, corporate and intellectual property law, and launching web companies. "Dara's novel approach to online dating is brilliant because it combines traditional dating opportunities with Facebook's massive connective power," says Chao.
In addition to the online dating focus of the website, Wingdate hosts a blog where people can seek tried-and-true dating advice from "Dr. Wingdate" and special guest bloggers, including relationship and dating experts. Wingdate also hosts "Morning After Mondays," a series of funny user video posts about online dating.
For more information and to create a profile on Wingdate, visit www.Wingdate.com
Image Available: http://www2.marketwire.com/mw/frame_mw?attachid=2218272
Add to Digg Bookmark with del.icio.us Add to Newsvine
Media contact:
SOA World Latest Stories
Subscribe to the World's Most Powerful Newsletters
Subscribe to Our Rss Feeds & Get Your SYS-CON News Live!
SYS-CON Featured Whitepapers
Most Read This Week

subset: commoncrawl


text:
The MPAA Defends Rating System Against Critics
After controversy and criticism, the Motion Picture Association of America has upheld its ratings system, justifying it by saying parents like it.
A study by the Annenberg Public Policy Center and Ohio State University has shown that gun violence in popular PG-13 rated films has tripled since the rating's creation in the mid 1980s, with the number of gun violence scenes matching or surpassing many R rated films. In response to the studies, Joan Graves, head of the MPAA's ratings board, said,
We try to get it right. The criticism of our system is not coming from the parents, who are the people we're doing this for.
The criticism Graves is referring to is the commonly held belief that the MPAA is more accepting of violence than sexuality or even vulgarity. For many films, such as the recent documentary Bully, the use of "the F word" more than once, regardless of the intent or context, can result in the R rating. But for Graves and the MPAA, as long as the parents are complaining, they feel they are doing their job,
We're certainly listening on the sexuality and the language. We'd be very interested in adjusting violence if in fact we were hearing from them we're getting it wrong. They don't seem to think that.
The MPAA claims that they are not policing or censoring films, but issuing warning labels about the films' content. However, the MPAA will inform film makers what scenes and/or dialogue must be cut in order to receive a desired rating. A great deal of the criticism comes from such film makers who feel their creations are in fact being censored, or they will be given a rating that will prevent their film from reaching a broad audience due to parental restrictions. The ratings system is voluntary, but many theaters are reluctant to carry unrated films for business concerns.
The PG-13 rating was created after backlash over frightening films like Gremlins that weren't worthy of an R rating, but too intense for PG.
via Huffington Post


text:
5 Pop-Culture Pumpkins You Can Actually Carve
Every Halloween, we see pumpkins carved into intricate portraits of our favorite celebs and dream of replicating one.
Then we realize they were made by artists with years of experience (plus tools like saw blades and battery-operated knives), and go back to our original plan of cutting triangle eyes and a toothy grin. But not this year! Instead, we tracked down ingenious pop-culture-themed pumpkins created by regular-people carvers like us. Recreate any of these for your front steps with nothing more than a knife and these photos as a guide.
Whether you call this gourd Walter White or Heisenberg, the simple hat, glasses and mustache make it a dead ringer for the main character of Breaking Bad. Its creator—the blogger behind Tumblr The Bluth Company—also crafted a pretty cool Arrested Development-inspired design.
We know Grumpy Cat wouldn't be amused by this pumpkin rendition of her (she didn't even crack a smile about her movie deal!), but it sure makes us grin. Reddit user MrNoMoniker, who created the carving, calls it a "Grumpkin." May it inspire many more.
The show logo is nice, but the splattered "blood" (red paint!) and knife stuck into the top is what really makes this a king among TV-themed pumpkins. "I'm a big fan of Dexter and when I was trying to figure out what I wanted to carve I thought that a Dexter pumpkin would be pretty awesome," writes the owner of Etsy shop Ali Buttons Designs and mastermind behind this carving. "I found one Dexter stencil online, but it just looked too complicated. I knew if I had attempted it, I would have messed it up and got aggravated."
Bazinga! It doesn't take a physics degree to carve the catch phrase from The Big Bang Theory into your pumpkin—just maybe a pattern from Stoneykins, which is what blogger Connor Guyton used. However, we think we could do this one freehand. Just carve each side of the burst around a rectangle of pumpkin skin and scrape in the letters with a screwdriver, since the scraper in a cheapo carving kit will likely be too wide.
This throwback to Gaga's infamous meat dress at the 2010 MTV Music Video Awards is timeless—and totally worth investing in a cheap blonde wig and a few slabs of raw beef (stored in the fridge until the day of your party or Halloween proper!). "Complete with lipstick and backup dancers," writes Tina Le of blog Bread & Circus, who says her sister entered this gourd in a contest "because she knows that I love Lady Gaga."
—Marissa Conrad


text:
Hey Michael,
Happy New Year to you too! Great to have an update, but it sounds a little ominous...
I hope these inquiries from two different people aren't something to worry about. However, I'll just have to wait and find out.
Glad everything is going well for you. I hope your enjoying the summer.....it's feaking cold up here...lol


text:
Phillylacrosse.com, Posted 4/6/13
From Press Release
In a heated rematch of last season's Patriot League Championship Game, #18/19 Lehigh and Colgate combined for 23 goals and 20 penalties, but it was the Mountain Hawks who came up big when it mattered most today.
Lehigh broke an 8-8 tie after three quarters, outscoring Colgate 5-2 in the fourth for a big 13-10 win in Goodman Stadium. The victory sets up a big showdown at Bucknell next Friday with the winner clinching the Patriot League Regular Season Title and #1 seed in the Patriot League Tournament.
"I thought it was an absolute battle," said Lehigh head coach Kevin Cassese. "Both teams played hard. Our guys really answered when we went down. They stepped up and found an extra gear, an extra level, late in the second quarter and into the third. I'm really proud of the way they finished today.
"We talked about it all week. Colgate prides itself on being a third-quarter team. We do too. I was proud of the way our guys played in the second half. They did enough to win and made the plays that needed to be made."
Saturday's win clinches Lehigh's third straight Patriot League Tournament appearance. The Mountain Hawks now shift their attention to next Friday and with a win, would host the league tournament for the first time in school history.
Senior Dante Fantoni tied a career high with six points behind three goals and a career-high tying three assists. In the process, he eclipsed 100 career goals, currently standing at 101. Classmate David DiMaria also reached a milestone, surpassing 100 career assists with his one-goal, four-assist effort. Sophomore Patrick Corbett set a career high with four goals, Dan Taylor added three points (one goal, two assists), senior Kyle Stiefel scored two man-up goals and Brian Hess dished two assists.
"Our seniors stepped up," said Cassese. "I'm really proud of David DiMaria, Dante Fantoni, Mike Noone (La Salle); those guys in particular played really special today. You need your seniors to step up when it comes down to big games in the league. I was really proud of the fact that our guys did that today."
Lehigh finished 6-of-8 on the extra man, a team and Patriot League high for man-up goals this season.
Senior Mike Noone helped spearhead the defense, posting three groundballs and three caused turnovers. Classmate Baxter Lanius had two groundballs and two caused turnovers while Ryan Snyder (Duke's LC) won 13-of-25 faceoffs while scooping eight groundballs and giving Lehigh a significant edge in time of possession.
"Over the first three quarters, I thought Ryan was the difference in the game," said Cassese. "It allowed us to get some extra possessions early in the game. Maybe that leads to the Colgate defense getting tired in the fourth quarter, taking some fouls down the stretch and allowing us to secure the win."
Sophomore goalie Matt Poillon finished with 15 saves, one shy of his career high, with nine coming in the second half.
Lehigh got off to a quick start, taking leads of 2-0 and 3-1 following Fantoni's first of the game. The extra man-goal, assisted by Taylor, made it 3-1 at 4:54 of the first quarter. Colgate responded with the next two, but Taylor finished off a nifty behind-the-back goal, beating Raiders' goalie Conor Murphy with just one second left in the first quarter to make it 4-3.
The Raiders went on a 3-0 run to take a 6-4 lead after Peter Baum's second goal in a 3:06 span. However, Lehigh ended the half on a 3-0 run of its own, beginning with Corbett's second of the game at 10:55 and ending with his third with 4:41 remaining.
The sides traded goals to begin the second half. Colgate scored two of the three third-quarter goals to even the score at eight, but DiMaria single-handedly gave Lehigh the 9-8 lead at 12:37 of the fourth. After a Cody Ferraro shot was saved, DiMaria picked off a Murphy pass behind the goal and came around and found the empty net.
Jimmy Ryan answered just 21 seconds later, but the Mountain Hawks again had an answer. Hess found Corbett for his fourth of the game at 9:37 to make it 10-9. The Raiders were called for an unnecessary roughness penalty after the play and Lehigh made them pay.
Stiefel added his second just 41 seconds later for an 11-9 lead then the Mountain Hawks used the transition game to take a three-goal advantage. Senior Mike Noone started the play by causing a turnover on the defensive end, which finished with Fantoni scoring his third of the game (from DiMaria) to make it 12-9.
Baum scored his fourth at 5:01, but sophomore Kurtis Kaunas (Parkland) iced it with 44 seconds remaining for the 13-10 final.
Baum scored four goals, but it came on 15 shots and 10 shots on goal. The reigning Tewaaraton Award winner had 15 of Colgate's 34 shots. Lehigh finished with a 36-34 edge in shots and 31-25 in groundballs. The Raiders were 1-for-7 on the extra man to Lehigh's 6-of-8. Poillon's 15 saves came across Murphy who made 10. Each team had 12 turnovers.
Tags: Lehigh


text:
MILLINGTON, Tenn. --
Paul Cartwright, Director of Race & Facility Operations said, "It was great to see all the racers back at the facility after what seemed to be such a long winter, it's been just over three months since we've run a race, it felt good today." Cartwright went on to say, "We couldn't have asked for a better start to what will be a great 14-race series for 2014."
Race Results:
R. T. Turbines Junior Dragster:
Tyler Poindexter takes the win with a .046 reaction time, 8.013 ET at 78.08 mph off his 8.00 dial-in over younger brother and defending 2013 Track Champion, Justin Poindexter who had a .138 reaction time, 8.028 ET at 79.33 mph breaking out with his 8.07 dial-in, with Clay Combs from Bells, TN rounding out the top 3 on the day.
B & B Towing Footbrake:
Rick's Powder Coating Super Pro:
R. T. Turbines D.O.T. Street:
"Congratulations to all the winners and a special thank you to all the racers, spectators and crew, for coming out today and supporting this great facility and program," said Tyler Crossnoe, Drag Strip Manager. Crossnoe continued, "The support we received today is a great indication of what the future holds."
The season has just begun so make your plans now to come out and feel the excitement building at Memphis International Raceway. The next MIR points meet for the Summit Bracket Racing Series presented by: COMP Cams is scheduled for a doubleheader weekend: Saturday, March 1, 2014 and Sunday, March 2, 2014. On Saturday, March 1, 2014, the gates are scheduled to open at 4:00 and time trials will be underway at 5:00 p.m.; on Sunday, March 2, 2014, the gates will open at 9:00 a.m., followed by Church Service at 9:30 a.m. and time trials beginning at 11:00 a.m.
Don't miss a minute of action at Memphis International Raceway in 2014! To stay up to date with all the racing excitement be sure and check out our website at www.racemir.com, like us on Facebook at www.facebook.com/RaceMIR, or follow us on Twitter at www.twitter.com/RaceMIR.
The entire MIR team looks forward to seeing you at the track in 2014!
Copyright ©2018 AUTOSALES INC, dba Summit Racing Equipment
Ready to take your order at 1-800-230-3030 | Customer Service 1-800-517-1035


text:
San Francisco, CAUSA
March 24, 2011
No introduction yet
It's really hard to get anything done alone. Sharing technique and knowledge is key in getting to a stable build. Meeting frequently, discussing our projects and presenting what we've made can bring the art to another level. Even if you come with little experience, we're sure you can make meaningful contributions. We are a group of technologists, designers and hobbyists that support a healthy and empowered culture of collaboration and invention. We hold regular public meetings and maintain online resources for other Android Makers. The group meets in the spirit of the "home brew computer club" ( http://en.wikipedia.org/wiki/Homebrew_Compu... ) our public events are open to all makers, professionals and hobbyists alike. Meetings and resources for people using the Android Operating System to power home brew computer and robotics projects. Welcome, and I'll see you when we meet up!
Sid Gabriel
Note: The Android Makers are not representatives of Google Inc. or directly affiliated with Google Inc.
7,686 Startup-Hardwarians
8,394 Tech Lovers
5,553 Google Developers
2,099 Members
5,150 Startups Showcasers
12,517 Data Scientists
Or sign up with email
Already a member? Log in.
Meetup members, Log in
By clicking "Sign up" or "Sign up using Facebook", you confirm that you accept our Terms of Service & Privacy Policy


text:
YAKIMA – Sunnyside High School's cross-country squads didn't exactly get off to a flying start in Big Nine League action Thursday afternoon.
The Grizzly boys, the only 3A runners in the perennially tough class 4A conference, settled for last place honors in the six-school field. No Sunnyside girls competed in the varsity race.
Yesterday's three-mile races at Yakima's Franklin Park came in the first of only two league competitions that will be staged this fall.
The top finisher for the Sunnyside boys on Thursday was freshman Griffey Sarmiento. From a field of 41 varsity runners he earned a 25th place finish. Sarmiento got around the rolling, sloped three-mile course in a time of 18:59.2.
The winning time was posted by Wenatchee junior Cole Christman, who sprinted to a clocking of 16:05.2. He hit the finish line approximately 15 seconds ahead of the runner-up, Eisenhower junior Ben Mahony.
Team-wise, Ike's boys walked away with first-place honors, tallying a meet-low 27 points. Wenatchee was second with 43 points. Eastmont, Davis, Moses Lake and Sunnyside rounded out the team scoring with 78, 105, 135 and 158 points, respectively.
Second across the finish line for the Sunnyside's boys squad was another freshman, Joe Rodriguez III. He clocked a time of 19:25.
SHS Coach George Paulus said he is still missing a couple of key, experienced runners from the roster, but early on this season is pleased and pleasantly surprised that a couple of underclassmen are leading the way for the Grizzlies.
"I couldn't be happier with the two ninth graders who have finished first and second for us in our first two meets of the season," he said.
"They're showing they can run competitively, and right now that's a good thing.
"They, along with the rest of our team – which honestly is very inexperienced – will be a work in progress.
"Right now we're paying attention to conditioning and how they perform at the different stages of a race…knowing when it's time to settle in and when it's time to surge," Paulus said.
Besides the two freshmen, Sunnyside had five other harriers competing in yesterday's boys varsity race. They included senior Robert Rodriguez (19:36), senior Ignacio Portillo (19:53), junior Jesse Torres (20:52), sophomore Julian Naranjo (20:53) and junior Julio Gaspar (20:54).
Paulus elected not to enter the six girls he had at his disposal in the varsity competition.
"We're young and very inexperienced," he said. "Only Jeniya (Guillen) and Kayla (Gonzalez) have racing experience, so we decided to keep all six of our girls together in the JV race.
"Considering our lack of experience, it was actually a surprise we placed second behind Eisenhower in the JV girls scoring," he added.
Ike freshman Caroline McCarthy had the fastest time in the girls JV race, a clocking of 21:22.4.
The sophomore Guillen and the senior Gonzalez placed 9th and 10th, respectively, with times of 23:33.6 and 23:34.9.
Also running for Sunnyside in the girls JV race were freshman Samantha Herrera (26:04), sophomore Angela Montes (27:25), senior Briseida Soberanes (27:52) and sophomore Sierra Gonzalez (27:52).
The three-mile girls varsity race winner proved to be Ike senior Elise Tello (18:49.6).
Sunnyside's harriers are scheduled to compete at Highland High School this coming Saturday.
Comments are subject to moderator review and may not appear immediately on the site.
Please read our commenting policy before posting.
Any comment violating the site's commenting guidelines will be removed and the user could be banned from the site.
Use the comment form below to begin a discussion about this content.


text:
SOUTH BEND, Ind. — — Flush with a most fruitful victory over a ranked team on the road, Kevin Ollie, that noted farmer out of South Central Los Angeles, was talking about reaping what is sown.
"Tyler Olander was wonderful," Ollie said after UConn had knocked off No. 17 Notre Dame 65-58 Saturday at the Joyce Center. "Looking aggressive, looking like he wanted the challenge.


text:
Providence, RI- In the first meet of the 2010-11 indoor track & field season, the Brown University men's and women's team combined for 14 titles yesterday afternoon at the Olney Margolies Athletic Center.
The women earned 10 titles in yesterday's meet at the OMAC, as Brynn Smith led the way with two in the shot put and weight throw.
Smith tossed a 57-01 (17.41m) for the weight throw title, and threw a 47-04 (14.43m) in the shot. Teammate Victoria Buhr finished right behind Smith in the shot put tossing a 45-01 (14.43m) and earning sixth and seventh place was Jessica Eason (40-07) and Natasha Smith (40-04). Lacey Craker competed in the weight throw for the Bears and earned fourth place with a 52-04 (15.96m).
Hannah Wallace cleared the pole vault at 10-11 (3.35m) to finish first overall, and Chelsea Hartigan followed right behind with a mark of 10-11 (3.35m) for second. In the long jump the Bears locked up first through third place finishes, as Jara Crear garnered the top spot with a 5.17m leap, followed by Rachel Biblo (5.05) and Brianna Crimmins (5.00m). Biblo also competed in the triple jump for Bruno, and earned the title with an 11.37m leap.
In the running events, Colby Lubman won the 300m title in 41.16 seconds, followed by a fourth place finish by Brielle Beaudette (41.72), and Nealy Williams (43.68) finished in 10th. Lubman also earned fourth in the 55m dash crossing the line in 7.36 seconds. In the 55m hurdles, Susan Scavone finished second overall (8.32) and Chelsea Walters (8.44) finished right behind in third.
The Bears earned first through fourth in the 1,000m run, as Michaeline Nelson finished first with a time of 3:01.61. Following Nelson was Carolyn Ranti (3:01.86), Shannon Stacey (3:02.95) and Sasha Teninty (3:04.37).
Samantha Adelberg won the one-mile run race with a 4:49.50, and Elizabeth Costa finished sixth with a 5:43.54. Melanie Fineman and Caitlin Stone earned first and second place in the 3000m run, as Fineman turned in a 10:30.44 and Stone with a 10:36.04.
Tess Plant-Thomas recorded a 1:40.40 in the 600m for second place, and Lucy Higgins crossed the finish line in 1:42.61 good for sixth.
On the men's side, Brown's Evan Weinstock, Nate Elder, Sean Igelman and Daniel Smith each garnered a title for the Bears in their respective events as the newcomers gained valuable experience for the upcoming season.
Weinstock won the 55-meter dash in 6.59 seconds, and Mike Mazerik followed in third place with a time of 6.68 seconds. Weinstock almost collected a title in the 300m dash, but fell just short of Providence College's Brian Stannard (36.20) to finish in second place with his 36.37 second time. Also in the 300, Ajani Brown ran a solid race to earn sixth place with a time of 37.06 seconds.
Elder captured the 600m title with a time of 1:22.07, and teammate Matt Bevil came in right behind with a 1:22.15. Zach Keefer finished in fifth place with a 1:28.17.
In the 55m hurdles, Brown's Vincent Sghiatti and Arjun Pande finished in fifth and sixth places, respectively, with Sghiatti finishing in 8.44 seconds and Pande running in 8.60.
Igelman cleared the pole vault at 13-11 (4.26m) to capture the title, and Thompson earned first in the long jump with a 6.20m leap. Thompson also earned a fourth place finish in the triple jump with a leap of 13.27m. Brown's Daniel Smith won the shot put with a throw of 53-11 (16.44m) and teammate Joe Daou came in right behind with a 49-10 (15.19m) for second place. Weinstock also competed in the shot put and finished in sixth place with a throw of 40-11 (12.49m).


text:
for a short time during their funny years.
After that, their jokes/they are not funny anymore. True? why is that so??
Margaret Cho, Woopi Goldberg ... etc
They used to be funny but not now.
for a short time during their funny years.
After that, their jokes/they are not funny anymore. True? why is that so??
Margaret Cho, Woopi Goldberg ... etc
They used to be funny but not now.
can't cosign that. depends on what tickles your funny bone. some comedians are on point most of the time where others are okay or overrated and not funny. there's certain comedians that aren't funny to me period and most people like them such as richard pryor, eddie murphy, and dave chapelle. seen their standups and not one laugh came out of me. only chris rock and eddie griffith has made me laugh at their standups.
^ but they are not comedians anymore.
So "funny for a short time" is still true.
I'm talking about they are only funny for a few years.
After that, they are not funny anymore.
Billy Crystal is away from comedy business for many years because he can't create new jokes?
I am often considered funny but people mistake that for a sharp wit which is a New England/Atlantic trait [there are a lot of funny Canadians from the Atlantic provinces too].
You would have to do some quick research on "New England Comedians".
^ One word: Codco
RIP Tommy Sexton
Priestly lovers (Tommy, the dark-haired priest, was openly gay. He died of AIDS in December, 1993.):
Babylon Mall:
God answers all prayers. Most of the time, though, the answer is 'No'.
That "Priestly lovers" video is funny
Do people still do standup?
It seems that all of those mentioned here are from the past.
Don't agree. For starters, it's really just going to boil down to a matter of opinion anyway; who makes me laugh(Ron White, for instance) may not make you laugh because they NEVER made you laugh. But he's my favorite example of a comedian that had a shtick that made him famous in the beginning ("I was thrown out of a bar in New York City"), used it up, and then moved away from it and evolved - it's more than I can say for his other Blue Collar counterpart, Jeff Foxworthy.
I don't know what funny years is supposed to mean other than the fact they "peaked", and true, some comedians do - Andrew Dice Claw for instance(who personally I never found all that funny or exciting to watch... I won't go as far as to compare him to the much maligned Dane Cook, but he's in that area in my mind), and Katt Williams especially(he should have stayed retired and less, you know, high and crazy). But some continue to either get funnier or stay as or nearly as funny with completely new material. They're not going to be as "perfect" as when they started, but can you name me a comedian that has ever been? Not even Richard Pryor or George Carlin made me think - as far as laughs go - that they were flawless every time. But come to think of it, if they were just about laughs and absolutely nothing else, then maybe people wouldn't revere them as much.
"Theres death on the horizon,
and Ill run to behold your sacrifice..."
Lily Tomlin is my favorite comedian...and she is just as funny now and she always was. I love that she has respect for her characters and instead of making fun of them she is laughing with them.
I'm a fan of Rita Rudner, I love how she speaks her material and how she delivers the punch lines. But I don't seek her out because I know if I did then I would probably get tired of her. But if I catch her on tv while flipping channels I will watch her.
I remember as a kid watching Whoopi doing stand up and it was long before I even grew to appreciate comedy.
But I agree, the ones I grew up watching, tv or movies aren't the same anymore, maybe it's just I've moved on, or like Whoopi for example, becoming something completely unfunny (the view) and changing market. Maybe if she hadn't become part of the view she would still be relevant, or maybe people just moved on to the next thing and she does the view to let people know she is still around...
I may be bad, but I'm perfectly good at it.
Before I know it, I'm blowing total strangers in the Greyhound station men's room or Amtrak station men's room...then regretting it the next day...
Motto: Think before you blow...remember this fellas.
"Don't wait for the world to be ready. Find what you're looking for."
Joey Graceffa
Speaking of comedy.......I can't help but wonder why Comedy Central is called Comedy Central.......
I tried watching it a few times in search of some comedy which was time wasted.......
Most of the truly funny comics are gone from SNL.......and they sure as hell aren't appearing on Comedy Central.......
Lisa Lampanelli used to be very funny when she first started but now shes not funny and recycle too many jokes.
Comedy is a business like any other. You have to keep up with what's relevant. The popular comedy and satire show hosts who still have a career going usually employ others to write the punchlines for them, otherwise they wouldn't survive with that job either.


text:
While Manchester United have put together an impressive assault on winning the Premier League this season, there has been one notable absentee of late - Paul Scholes.
Scholes has not kicked a ball or an opponent in anger for Sir Alex Ferguson's side since a substitute outing against Fulham in the fourth round of the FA Cup back in January, with a niggling knee injury side-lining him ever since.
Scholes has been expected to return for a number of weeks, however as of yet there has been no sign of the veteran with the season coming closer to an end.
The lengthy absence has raised concerns that Scholes, United's third all-time leading appearance maker, may decide to call it a day and hang up his boots; for the second and final time.
Former United midfielder Bryan Robson is certainly of the opinion that the ginger prince may well be into his last few months on the playing staff at the Theatre of Dreams:
Robson told the Daily Mirror: "Giggsy has got another year, but he looks as fit as he was when he was 21.
"Scholesy I'm not so sure about. He's been having a few problems with his knee. So I think he might just call it a day.
"Only he can answer whether or not he may register again in case of emergencies.
Robson was keen to emphasise the importance of Scholes and keeping him around the club.
He continued by saying: "Because of his attitude and the way he goes about training it is good to have him around the place."
Scholes assumed a coaching role with the youth team having chosen to retire at the end of the 2010/11 season, only to go back on his decision the following January having missed being away from the action.
Having been limited to 19 appearances in all competitions and just 10 starts its looking more and more likely that United fans will be saying farewell to this living legend; and this time for good.
DISCLAIMER: This article has been written by a member of the GiveMeFootball Writing Academy and does not represent the views of GiveMeFootball.com or SportsNewMedia. The views and opinions expressed are solely that of the author credited at the top of this article. GiveMeFootball.com and SportsNewMedia do not take any responsibility for the content of its contributors.
Do YOU want to write for GiveMeSport? Get started today by signing-up and submitting an article HERE: https://www.givemesport.com/writeforgms


text:
Want to remind yourself or a friend about this program? Fill out this simple form and klru will email you a reminder on the day that it will air.
Can Science Talk God?
series: Closer To Truth
air date: 2/18/13 10:30 AM
Some say that science and God are not related. Others, that science describes a world that evidences "God's handiwork," or a world that works just fine without God.
WARNING: Email reminders for this program have already been sent out. Your reminder may not reach the intended address in time for this program's airing.
Back to TV Schedule


text:
- Football news
Gazza agent: He needs help
Paul Gascoigne's agent Terry Baker admits he is fearful for the former England midfielder's life after he started drinking again.
Gascoigne, 45, has been dealing with alcoholism since retiring from the game and was sectioned five years ago under the Mental Health Act.
After many high-profile incidents, Gascoigne's most recent breakdown appeared at a charity appearance in Northampton on Thursday where he appeared to be unwell and trembling, while he broke down in tears and slurred his words during the £100-a-head event.
Baker told BBC Radio Five: "He won't thank me for saying but he needs to immediately get help. Whatever's happened to him in the five or six weeks since I saw him before Christmas, he is not as well as he has been.
"He's been absolutely fine, he really has, and now he isn't. But I think he knows that. His life is always in danger because he is an alcoholic. Maybe no-one can save him - I don't know. I really don't know.''
As The Sun published a video of Gascoigne's charity appearance, former Manchester United goalkeeper Peter Schmeichel called on the Professional Footballers' Association to step up and help the ex-Newcastle, Tottenham, Lazio and Rangers playmaker.
Schmeichel wrote on Twitter: "This is not fun watching. Gazza needs help. Come on PFA & (PFA chief executive) Gordon Taylor, time to step up.
"We are all responsible for how we live our lives. But that doesn't mean we can't step in and help, and I think the footballing community, as the family we at times claim to be, must do more to help Gazza and others like him.
"Instead of getting great deals on cars & other luxury goods for members, PFA should commit more time and funds to help the like of Gazza. So what if he's had help before and has messed it up, does that mean that we just give up on him?
"What really gets me here is people. Everyone close to him was looked after by him. Now he's abandoned by the lot and in many ways they helped him becoming what he is today. He needs help, they should be there to provide that for him, regardless.''


text:
Release Notes: This release adds support for EMM filtering and CHID filtering (tested with RadugaTV). Griffin and DGCrypt CASes are now fully supported.
Release Notes: This release adds full IPv6 support for CAMD connections and IPv6 multicast and unicast input and output. Another major feature is the added support for EMM filtering (see the FILTERING file). Another addition is the support for multiple CAMD addresses returned when resolving the server hostname. tsdecrypt now tries each of the IP addresses and uses the one which works, allowing failover between multiple servers.
Release Notes: This release adds support for Bulcrypt CAS.
Release Notes: This release can be compiled with FFdecsa, which brings up to 40% faster decryption in some cases. libdvbcsa is still the default decryption library, but thanks to FFdecsa, libdvbcsa is now an optional dependency. This release also supports decryption of streams encrypted with BISS or constant code words.
Release Notes: Input buffering was added. This feature helps decrypting services that have very strict timing requirements (like SkyUK). Major bugfixes to the newcamd protocol were made. Added are optimizations and fixes related to MPTS support.
Release Notes: This release adds RTP output support. There is an option to save input stream in file and PID statistics for better input stream overview. A major bug was fixed that prevented tsdecrypt from working if the CAMD server was not available for couple of minutes.
Release Notes: This release adds support for the newcamd protocol and support for choosing services when the input is mpts. A benchmark for decryption functions has been added, along with control over output filters.
Release Notes: This release added support for calling an external notification program when an event occurs. Logging to local syslog was implemented. The NODELAY flag was applied to the CAMD connection in order to avoid errors when lots of EMM packets are sent in a very short time.
Release Notes: This release fixes couple of bugs which prevented decoding of certain satellite channels, prevents emm processing from interfering with decoding, and adds a full packet dump debug mode.
Release Notes: This release adds fully tested support for Viaccess, Mediaguard (Seca), and Videoguard (NDS). Also added was untested support for Nagra and DRE-Crypt. Other new features are support for manual emm/ecm pids and caid settings, support for compilation on OS X, and install/uninstall Makefile targets.


text:
Proxool is a Java connection pool. It's not rocket science but we've been
doing it since 2001 and we've ironed out a lot of problems. Development has slowed down
considerably over the past few years but we're still here, making releases and answering
support questions.
Transparency: Transparently adds connection pooling to your existing JDBC driver.
Open Source: Our licence allows you flexibility to use it in both commerical
and other open source products.
Standards: Complies with the J2SE API, giving you the confidence to develop
to standards.
Control: You can monitor the performance of
your database connections and listen to connection events
Ease of use: It's easy to configure using the JDBC
API, XML, or Java property files - you decide.
23 August 2008 - 0.9.1.
Fix to include proxool-cglib.jar in the binary release. This file is a repackaged
version of CGlib 2.1.3.
See the change log for details.
19 August 2008 - 0.9.0.
See the change log for details.
10 January 2007 - 0.9.0RC3.
Getting close to a 0.9.0 release. This wraps up some fixes for the packaging of
Cglib, more flexibility when shutting down, a missing property when configuring
as a datasource.
See the change log for details.
23 March 2006 - 0.9.0RC2.
Only a few changes since RC1, but the most important is our upgrade to Cglib 2.1_3. With
the use of Jar Jar Links we can
now keep up to date very easily.
See the change log for details.
2 March 2006 - 0.9.0RC1.
810 days. What a long gap between releases! 0.9.0 has been in the pipeline for many months now and a considerable
amount of work was put in during 2004 and, to a lesser extent, 2005. Unfortunately, we let things slip and this release is well overdue.
Thank you to all the people who continue to use Proxool and tell us so. There are no known problems with this release but,
as ever, you should remember that it is only a release candidate. The latest stable release remains 0.8.3.
See the change log for details.
14 December 2003 - 0.8.3
Changes to allow Proxool to work with Cglib 2.0. If you upgraded to Hibernate 2.1 then you will need to
upgrade to Proxool 0.8.3.
See the change log for details.
Older news
Proxool is fully compatible with JDKs 1.2 to 1.5. Our tests with early releases of
JDK 1.6 show no problems.
New: As of 0.8.0, because of the use of Cglib's
proxy library, we are now able to support all JDKs from 1.2 upwards.
Gule Sider:
Norway's Yellow Pages (telephone listings).
Electronic greeting cards
Agent Provocateur:
Perfect Coffee:
If you are using Proxool then let us know.


text:
0 Members and 1 Guest are viewing this topic.
I agree that something is really wrong here. My guess, as for others, would be that this pregnancy was unwanted, and they're not happy about it.However, I'm not sure you can do anything more than what you've done. She obviously doesn't want anything to do with you, and is blaming you (and lots of other people) for things you haven't done, said or meant.What I might do is write her one more time. Tell her that you didn't mean to do anything to hurt her, and wish her only happiness, but have been really worried about her. Then tell her that you accept that she no longer wants a friendship with you and will no longer bother her, but will be there if she changes her mind.
I am curious what the policy is for conflicts within such a small group as your home church group (you said only 9 people). Is there a leader of the group that you could talk to about this and get guidance from? You said the group involves sharing somewhat personal thoughts (e.g., what your prayers are for and "what is going on with" you); this woman's behavior would make me uncomfortable with sharing things in her presence, and that is surely the opposite of what the group leader would want. Also, I'm confused about how she could be fully participating in the group when she (and her husband) have been so withdrawn and have not shared important things. It may be that I just don't understand how the group works. But, if her behavior is changing the dynamics of the group and making people uncomfortable, perhaps the group leader needs to step in and counsel her or the other members. Is this a possibility?
Page created in 0.217 seconds with 18 queries.


text:
Press Release
Doug Gardner Appointed Juneau District Attorney; Two Juneau Prosecutors Move to Senior Positions Within the Department of Law's Criminal Division
June 29, 2006
(Anchorage) - Deputy Attorney General Susan Parkes, who supervises the Department of Law's Criminal Division, announced several key position changes today. Doug Gardner has been appointed as the Juneau District Attorney. Pat Gullufsen was appointed a senior, statewide prosecutor. Rick Svobodny was appointed Chief Assistant Attorney General within the Criminal Division, replacing Dean Guaneli, who retires at the end of June.
"Dean started in 1976 and has had his hand in some of the Department of Law's most significant accomplishments," said Attorney General David Márquez. "Within this current Administration Dean was instrumental in drafting Governor Murkowski's omnibus crime legislation and rewriting Alaska's felony sentencing laws. It has been an honor for me to serve with an attorney of his dedication and quality. I thank him for his 30 years of public service. He will truly be missed."
Svobodny replaces Guaneli as Chief Assistant Attorney General within the Department of Law's Criminal Division. He will provide legal advice to several criminal justice agencies, including the Department of Public Safety. He will also supervise the Office of Special Prosecutions and Appeals and the Cold Case prosecution unit. Svobodny became a Senior Assistant Attorney General for the Criminal Division and the state's first cold case prosecutor in January 2006. He started with the Department of Law in 1975 as an assistant attorney general. He worked as an assistant district attorney in the Juneau office from 1978-84 and served as the Juneau District Attorney for nearly 20 years.
Pat Gullufsen, who became Juneau's District Attorney, after Svobodny, will be moving into the cold case unit to take advantage of his years of experience in homicide cases. Pat will also be available to assist in complex criminal prosecutions across the state - but particularly in Southeast Alaska. Gullufsen was admitted to the Alaska Bar in 1974. He served as an assistant district attorney and with the Office of Special Prosecutions and Appeals in Fairbanks for four years. He served as the Juneau District Attorney from 1979 to 1984. From 1992 to 2001 Gullufsen was an assistant attorney general in the government affairs section in Juneau. From 2002 to 2003 he was Deputy Attorney General for the Criminal Division. In 2003 he was appointed the Juneau District Attorney. "Pat's extensive experience in prosecutions makes him extremely well-suited to advise on our most challenging cases, including our cold case prosecutions," said Parkes.
Gardner served four years as an assistant district attorney in the Juneau office before his appointment as the Juneau District Attorney. Prior to working as a prosecutor, Gardner worked as an assistant attorney general in the department of law's transportation section from 1995 to 2002.
"As Dean moves on to new pursuits in his life, his departure provides the opportunity for three talented and experienced Southeast prosecutors to move up within the department's ranks," said Parkes. "Doug's appointment maintains continuity in the Juneau district attorney's office and I am confident that the office's high standard of quality will continue under his watch. Rick and Pat are senior statesmen in the criminal division and in their new positions they will be incredible resources for the department's prosecution efforts across the state."
# # #


text:
ADA, OK -- 20-year-old, David Stewart, and 23-year-old, Cassie Stewart were arrested Tuesday after authorities learned that their two infant twin boys had suffered multiple bone fractures.
According to the affidavit, David, the children's stepfather, was watching the boys, and claimed one of the infants had fallen off a swing, but doctors at OU Medical Center noted the injuries were non-accidental, and a fall wouldn't have caused these severe injuries.
Neighbor, Samantha Self, says she's shocked.
"It's scary. My daughter used to go down there and play with the kids, and just to think that somebody could let that happen to their child...makes you wonder what could happen to yours while they're in their care," Self said.
According to the affidavit, one infant was admitted to Mercy Hospital in Ada, but later transferred to OU Medical Center for a higher level of care.
The 4-month-old had suffered retinal hemorrhaging and 13 rib fractures. The infant's twin brother was examined, and authorities learned he had suffered 21 rib fractures.
Neighbor, Jeanette Treamaine-Ruston, says she's glad to see action being taken.
"It's about time somebody did something about it, and followed through and protected and gave a voice to a little person that doesn't have one otherwise," Ruston said.
Self says she always saw the children playing, and never had a suspicion anything was wrong.
"I feel sorry for the children, because you know a parent is supposed to love and care for them, not allegedly abuse them," Self said.
The couple remains behind bars in the Pontotoc County Justice Center.
Bond has been set at $500,000 for Cassie, the twins' mother.
David is being held without bond.
The District Attorney's office has not yet said what charges the couple will face.


text:
Women's Health
Beyond Bone Health: The Power of Vitamin D
A simple glass of milk can do a lot for your health. Thanks to the "Got Milk" campaign, many women know that it packs a healthy punch of calcium and vitamin D - two nutrients critical for strong bones. But did you know vitamin D may be beneficial beyond bone health? Ongoing research suggests it may have some truly potent powers.
More than a vitamin
Scientists have known about vitamin D for nearly 100 years. It was first identified as a nutrient useful in preventing rickets, a childhood disease that causes weak and deformed bones. Although it's called a vitamin, some scientists actually consider it a prohormone - a type of substance that's similar to a hormone but doesn't fully act like one.
Vitamin D's chief function is to help the body absorb calcium. This process leads to stronger bones. Vitamin D also figures into several other essential functions of the body. It pumps up muscle strength, boosts the immune system, and improves messaging between the nerves, the brain, and other parts of the body.
The value of vitamin D
As calcium's companion, vitamin D helps prevent osteoporosis, a disease that weakens bone and increases the likelihood of fractures. Women are especially at risk for osteoporosis after menopause, because their body makes less estrogen. That fact alone should put vitamin D on top of your nutrient list.
Research has provided even more reasons to make sure your body has enough vitamin D. Some studies have suggested that higher levels of vitamin D may be linked to a reduced risk for certain cancers - in particular, colorectal and breast cancer. Experts haven't yet confirmed this connection; more research is needed.
Your brain may also benefit from vitamin D. In a recent study published in the Journals of Gerontology, researchers found that older women who consumed less vitamin D were more likely to develop Alzheimer's disease. Those with the most vitamin D intake were more than four times less likely to develop the condition.
Your body can naturally create some vitamin D through simple sun exposure. But because of skin cancer risks, experts recommend limiting the amount of time you spend outside without sunscreen protection. It's better to get the majority of your vitamin D from food. You can also take a vitamin D supplement, but talk with your doctor first. Like other nutrients, too much vitamin D can harm your body, and supplements may interact with other medications.
In addition to vitamin D, your body needs other important nutrients to stay healthy. Read here to learn more about them.
Always talk with your health care provider to find out more information.
Online Resources
(Our Organization is not responsible for the content of Internet sites.)
NIH Osteoporosis and Related Bone Diseases - Calcium and Vitamin D: Important at Every Age
Office of Dietary Supplements - Calcium
February 2013
Adding More D to Your Diet
Current nutritional guidelines recommend that women ages 19 to 70 strive to include 600 international units (IUs) of vitamin D in their daily diet. Women older than 70 should have 800 IUs. Focusing on the foods you eat can help you reach these recommended amounts. Few foods are naturally high in vitamin D. But dairy items are fortified with it - in particular, milk. Almost all milk sold in the U.S. has vitamin D added to it. You can also find vitamin D in these foods:
Always talk with your health care provider to find out more information.


text:
Summit of 15 EU countries shows split on EU budget
- Article by: RAF CASERT
- Associated Press
- November 13, 2012 - 12:54 PM
BRUSSELS - Divisions among the 27 European Union countries over increasing the region's (EURO)1 trillion budget deepened Tuesday as the region's two opposing camps set out their arguments over raising spending in the midst of a three-year debt crisis.
A group of 15 of the political leaders meeting in Brussels Tuesday called for an increase in the EU budget, which is used to fund pan-European programs designed to ensure a level economic playing-field across the region. Meanwhile on a visit to Rome, David Cameron, the Prime Minister of the euroskeptic U.K. called on the EU to "live within its means".
One week ahead of a summit of all 27 countries on the budget, Tuesday's decision reflected the unity of the mostly poorer member states which are counting on backing from a larger EU budget to get them back on track for economic growth. The 15 countries, ranging from Portugal in the southwest to Poland in the northeast, fear that the Nov. 22-23 summit, which was called to set spending limits for the EU institutions through the year 2020, will hit programs and funding they are counting on.
EU Parliament President Martin Schulz said that `'to cut the EU budget might be popular in some of the member states but it is absolutely counterproductive." The EU parliament needs to give its consent to any budget deal.
The current budget proposals call for a (EURO)1.03 trillion ($1.31 trillion) spending ceiling for 2014-2020, but the U.K. wants to slash that by more than (EURO)50 billion ($64 billion).
The U.K. is leading a group of countries that wants to contain its contributions to EU coffers and is calling for further austerity. Their argument is that when people have to cut spending at home, the EU should do likewise.
Cameron told reporters in Rome after a meeting with Italian Prime Minister Mario Monti that "we cannot go on increasing EU spending."
The U.K. leader also visited the Dutch Prime Minister Mark Rutte in the Hague Tuesday, where the two of them called for tough negotiations.
In a further move that highlights the split over EU spending, a meeting to fix the 2012 and 2013 budget was canceled at the last minute Tuesday amid the same acrimony over spending as little as possible in times of crisis.
Colleen Barry in Milan contributed to this article
© 2018 Star Tribune