text:
This article discuss implementation details of PicZoom application [A photo viewer with some functionalities are similar to the Picasa Photo Viewer]. PicZoom is an MFC Dialog based application, and OpenGL is used for drawing. Shader programs are not used for display, and therefore I hope PicZoom will run without a high-end graphics card. Since it requires some graphics memory to prepare all textures [Background, Image, Buttons, etc], graphics card is required to run PicZoom. Limitations section explains graphics memory limitation of PicZoom.
When I started studying OpenGL, I created a simple application to load an image from file and do simple rotation, zoom with it. OpenGL provides APIs to do some simple image operations such as zoom, pan, rotate. Picasa Photo Viewer is a simple and superb image browser tool. In this article, I am just imitating some functionalities of Picasa Photo Viewer with OpenGL and MFC. I'm sure performance of this application is not satisfying with Picasa, but it's an attempt to do something with OpenGL and MFC. Any comments and improvement suggestions are welcome.
Initially, I did almost all functionalities of PicZoom in a single class, CPicZoomDlg. It was very difficult to manage everything in a single class. Therefore, I prepared different classes based on different functionalities. For example, ImageArea class will handle all operations [draw, zoom, pan, mouse cursor based on image] related to Image. Then PicZoomDlg will create objects of ImageArea, Background, etc., and manage them with less effort. And I prepared opengl wrapper classes, to handle initialization, texture creation, text drawing, circle drawing, etc.
When starting PicZoom, it captures the desktop background and creates a semitransparent view to the background. The implementation details are as follows:
Just call ::GetDesktopWindow() and retrieve desktop window handle. Then prepare a memory dc and read contents [RGB data] of desktop window. GetDIBits()provides RGB buffer of desktop window to an allocated memory. Here is the code to capture screenshot of desktop.
bool ScreenCapture::TakeScreenShot() { // Get Desktop window. HWND hDesktop = ::GetDesktopWindow(); // Get temporary Dc for getting data from Desktop. CDC dc; HDC hdc = ::GetWindowDC(hDesktop); dc.Attach(hdc); CDC MemoryDC; MemoryDC.CreateCompatibleDC(&dc); CBitmap BmpObj; BmpObj.CreateCompatibleBitmap(&dc, sz.cx, sz.cy); CBitmap * oldbm = MemoryDC.SelectObject(&BmpObj); // Get data from Desktop to Bitmap. MemoryDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY); // Read RGB data of Desktop window Dc. int nStatus = ::GetDIBits( MemoryDC.m_hDC, (HBITMAP)BmpObj.m_hObject, 0, sz.cy, m_pBuffer, &stBitmapInfo,DIB_RGB_COLORS ); }
Main Components
The above figure shows the split up of main classes used in PicZoom. PicZoom creates a MFC dialog, and the painting of client area is handled with OpenGL.
Initially, PicZoomDlg creates 4 main components of PicZoom, [Background, ImageArea, BottomWindows, and CloseButton] and adds to a vector named WindowList. Whenever we get WM_PAINT in dialog,Draw() commands are passed to all the 4 components. Like <code>Draw(), all mouse messages are also passed to the components.
All these classes [Background, ImageArea, BottomWindows, and CloseButton] are derived from GLWindowBase, the base class designed for handling different windows( or image components).
This class is responsible to create one texture with desktop image. The RGB buffer with screenshot of desktop is obtained with ScreenCapture class. The background image texture is created with 25% transparency. It is achieved with glPixelTransferf() before texture loading. glPixelTransferf is used to provide scale factor of Red, Green Blue channels.
// Set Pixel Transfer to make semitransparent effect of Desktop. glPixelTransferf( GL_RED_SCALE, 0.75 ); glPixelTransferf( GL_GREEN_SCALE, 0.75 ); glPixelTransferf( GL_BLUE_SCALE, 0.75 ); // Create Desktop Texture. if( !m_pImage->Create( m_nWidth, m_nHeight, pbyScreenCapuredData )) { AfxMessageBox(L"Texture Creation failed."); return false; } glPixelTransferf( GL_RED_SCALE, 1.0 ); glPixelTransferf( GL_GREEN_SCALE, 1.0 ); glPixelTransferf( GL_BLUE_SCALE, 1.0 );
bool BackGround::Draw() { if( !GLWindowBase::m_bVisible ) { return true; } glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); // Here draws the background image. m_pImage->Enable(); m_pVertexBuffer->DrawVertexBuffer( GL_POLYGON ); return true; }
The display and all operations (Zoom, Translation, Rotation) of currently loaded image file is handled in this class.
ImageArea creates one opengl texture with RGB data of the image file. Whenever user requests a new image file, ImageArea creates the RGB buffer of new file with BMPLoader class. BMPLoader class uses GdiPlus for creating RGB buffer of image file of type *.jpg, *.bmp, *.png, and *.tga. Whenever Draw() receives, ImageArea will display this texture with zoom, translation, and rotation. The details of Zoom, Translation and Rotation are explained below.
Zoom functionality is simply achieved with OpenGL scale feature.glScalef() is called before displaying the texture, and therefore the texture will be scaled based on the current zoom factor.
Whenever mouse wheel received in Dialog, Dialog will send it to all components, and therefore ImageArea will receive mouse wheel message. The zoom factor is calculated based on the current scroll value.
bool ImageArea::OnMouseWheel( const int nX_I, const int nY_i, const UINT nFlags, const short zDelta ) { float fZoomValue = float( zDelta ) / WHEEL_DELTA; if( 0 == m_fZoomOffset ) { ::SetTimer( m_hParentWindow, TIMER_ZOOM, 5, 0 ); } // Find out zoom factor based on width of and height of image. if( m_nImageWidth > m_nWidth || m_nImageHeight > m_nHeight ) { float fImageToDesktopRatioX = (float)m_nWidth / m_nImageWidth; float fImageToDesktopRatioY = (float)m_nHeight / m_nImageHeight; float fImageToDesktopRatio = min( fImageToDesktopRatioY, fImageToDesktopRatioX ); fZoomValue = fZoomValue * fImageToDesktopRatio; } m_fZoomOffset += ( fZoomValue / 100 ); // Apply Zoom factor 15 times. then first single scroll make 15% zoom. m_ZoomTimer.SetMaxElapseTime( 15 ); return true; }
Inside ImageArea::Draw(), Zoom factor is added to current zoom factor, and then calls glScalef( m_fZoom, m_fZoom, 1.0 ), scaling is not applied in Z order, since it is not required.
glScalef( m_fZoom, m_fZoom, 1.0 )
Whenever Zoom Factor is changing, ZoomText class will display the new Zoom value. ZoomText simply draws a rounded rect and displays the current zoom factor with text drawing of OpenGL. FontEngine class is created to handle the drawing of text.
FontEngine creates a display list with bitmap of all characters. This can be simply achieved through wglUseFontBitmaps() function of OpenGL.
bool FontEngine::Create( HDC hDeviceContext_i ) { VERIFY(m_pFont->CreateFont( 15, // nHeight 7, // nWidth 0, // nEscapement 0, // nOrientation FW_BOLD, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision ANTIALIASED_QUALITY, // nQuality DEFAULT_PITCH, // nPitchAndFamily L"Arial")); // lpszFacename HGDIOBJ hOldFont = ::SelectObject(hDeviceContext_i, m_pFont->m_hObject); if( !wglUseFontBitmaps( hDeviceContext_i, 0, 256 * 2, 1000 )) { return false; } ::SelectObject( hDeviceContext_i, hOldFont ); return true; }
Zoom Text displayed at center of dialog, with current zoom factor. This text is displayed in a semi transparent way. Hide and Show are very smooth, which is implemented by blending feature of OpenGL. When drawing new object, new object and old object[already drawn object] are combined and create a transparent look of new object. Alpha value is started from 0.0, and increased 0.1 during each frame, and get a smooth appearance. When hidden, Alpha value is decreased from 1.0 to 0.0, and gets a smooth disappearance effect.
LButtonDown and MouseMove messages are tracked in ImageArea, and find out the translation required in X and Y direction.When drawing the image texture, ImageArea::Draw() will apply translation with OpenGL translate function glTranslatef.
// Y value is -ve, only because opengl Y coordinate is //increasing from bottom to top, // But Y direction mouse movement received in Dialog is decreasing from bottom to top. glTranslatef( m_fXTranslation, -m_fYTranslation, 0.0 );
Rotation is simply implemented with glRotate() function. The rotation angle is calculated based on the current rotation state. Possible rotation values are listed below:
const float ROTATION_ANGLES[4] = { 0.0,// No rotation 270.0, // First Clockwise 180.0, // Second Clockwise 90.0 // 3rd clockwise };
Inside ImageArea::Draw(), rotation angle is applied to z-order to achieve the required rotation.
/// Drawing of Image. bool ImageArea::Draw() { // .................... // Apply rotation glRotatef( ROTATION_ANGLES[m_nRotate], 0, 0, 1 ); m_pVertexBuffer->DrawVertexBuffer( GL_QUADS ); // ........................... return true; }
Here we can discuss the vertex buffer logic. The below picture shows the 4 corners of image and its corresponding vertex coordinate. Rotation is applied to this vertex buffer and creates a rotated image display.
Image is displayed to screen using GLVertexBuffer class. GLVertexBuffer is a wrapper class for drawing any vertex with texture coordinate. glInterleavedArrays() is called to draw one object to screen. In ImageArea class, GLVertexBuffer object is created with 4 vertices to draw the image into screen.
// Vertex buffer creation logic in ImageArea. bool ImageArea::SetupWindow() { // Setup Vertex buffer and UnProject. int nHalfOfImageY = m_nImageHeight / 2; int nHalfOfImageX = m_nImageWidth / 2; /* 0--3 | | 1--2 */ m_pVertexBuffer->SetAt( 0, -nHalfOfImageX , nHalfOfImageY, 0.0f, 0.0f,1.0f); // Left Top corner m_pVertexBuffer->SetAt( 1, -nHalfOfImageX , -nHalfOfImageY, 0.0f, 0.0f,0.0f), // Left Bottom m_pVertexBuffer->SetAt( 2, nHalfOfImageX, -nHalfOfImageY, 0.0f, 1.0f,0.0f); // Right bottom m_pVertexBuffer->SetAt( 3, nHalfOfImageX, nHalfOfImageY, 0.0f, 1.0f,1.0f); // Right top /// ................... }
This class is responsible for drawing and message handling of buttons displayed at the bottom of PicZoom.
There are 9 buttons displayed at bottom of PicZoom, which will help to explore different image files in the current folder, zoom, and rotation of image.
GLButton is designed to handle all operations related to one button. Bottomwindows creates 9 instances of GLButton, and hold in a list, and all commands are passed to the button list.
/* This class handles all operations related to a Button. The drawing and mouse message handling is handled in this class. The resource ID of bitmap is provided to this class, and ID of Message to send to parentWindow( PicZoomDlg) is also provide to this class. Whenever user press the button, this class will send message to PicZoomDlg. */ class GLButton : public GLWindowBase { public: GLButton( HWND hParentWindow_i ); virtual ~GLButton(); virtual void SetRegion( const int nLeft_i, const int nTop_i, const int nWidth_i, const int nHeight_i ); virtual void SetImage( const int nResourceID_i ); virtual bool SetupButton(); virtual void SetLButtonMessage( const int nMessageToParent_i ); virtual bool OnMouseMove( const int nX_i, const int nY_i, const int nFlags_i ); virtual bool OnLButtonDown ( const int nX_i, const int nY_i, const int nFlags_i ); virtual bool OnLButtonUp ( const int nX_i, const int nY_i, const int nFlags_i ); virtual bool IsWithinRegion( const int nX_i, const int nY_i ); void SetTransparency( const float fTransparency_i ); virtual bool Draw(); };
The initialization of a GLButton is very simple. Three items are required to initialize a GLButton. The resource ID, region of display and the Message ID. The resource ID of bitmap is used to create button image. The alpha channels of each pixel determine the transparency of button. When alpha values of a pixel is 0.0, then that pixel will not be displayed in button image. When user clicks the button, the message will send to the parent window(PicZoomDlg).
The transparent behaviour of each button is achieved by the alpha blending technique. The bitmaps are created in RGBA format (one 8 bit channel for alpha component). GLTexture class is modified to create RGB8, RGBA8, textures. The bitmaps required for bottom windows are added as resource of PicZoom, and that bitmaps are loaded with BMPLoader, and create GLTexture with RGBA data.
// The texture and vertex buffer for rendering are setup in this function. bool GLButton::SetupButton() { // Create Vertex buffer. m_pVertexBuffer = new GLVertexBuffer; if( 0 == m_pVertexBuffer ) { return false; } // Create Vertex buffer for rendering Quad image. m_pVertexBuffer->CreateQuadVertexBuffer(); UpdateVertexBuffer(); // Setup Texture from Bitmap resource ID. m_pTexture = new GLTexture; int nWidth = 0; int nHeight = 0; BYTE* pbyARGBImage = 0; BMPLoader LoadImage; // Load Alpha enabled texture. LoadImage.LoadBMP( m_nResourceID, nWidth, nHeight, pbyARGBImage, true ); // Create RGBA format texture. m_pTexture->Create( nWidth, nHeight, pbyARGBImage, GL_RGBA, GL_RGBA8 ); return (GL_NO_ERROR == glGetError()); }
The mouse over effect of buttons is implemented in a tricky way. When displaying, the blending feature of texel (texture color) with current colour (glColor) is enabled. Then set low color(glColor4f(0.75f, 0.75f, 0.75f, 0.75f)) while displaying button in normal scenario. While displaying button with mouse over high color is applied glColor4f(1.0, 1.0, 1.0, 1.0).
bool GLButton::Draw() { if( m_bMouseOver ) { // After drawing, pixelstore biasing is changed. //glColor4f( 1.0, 1.0, 1.0, 1.0 ); glColor4f( m_fTransparency, m_fTransparency, m_fTransparency, m_fTransparency ); } else { // After drawing, pixelstore biasing is changed. //glColor4f( 0.75, 0.75, 0.75, 1.0 ); glColor4f( 0.75 * m_fTransparency, 0.75 * m_fTransparency, 0.75 * m_fTransparency, 0.75 * m_fTransparency ); } m_pVertexBuffer->DrawVertexBuffer( GL_QUADS ); return true; }
The above screenshot displays the behavior of description text display. GLText is created for displaying a text with smooth show and hide. Here also, alpha blending is used to make smooth appearance and smooth hide.
void GLText::Draw(const int nX_i, const int nY_i) { if( m_StringTimerHide.IsEnabled()) { // Hide old string. Here fColorComponent will decrease // after each frame. int nRemTime = m_StringTimerHide.GetRemainingTime(); float fColorComponent = ( nRemTime / 20.0 ); glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glColor4f( 1.0, 1.0, 1.0, fColorComponent ); // Drawing text to screen. m_pFontEngine->DrawText( nX_i, nY_i, m_csDisplayString.GetBuffer( 0 ) ); glDisable( GL_BLEND ); glColor4f( 1.0, 1.0, 1.0, 1.0 ); m_StringTimerHide.ElapseTime(); } else { m_csDisplayString = m_csDisplayStringNew; // Show New string. Here fColorComponent will // increase during each frame, then reach the maximum value. int nRemTime = 20 - m_StringTimerShow.GetRemainingTime(); float fColorComponent = ( nRemTime / 20.0 ); glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glColor4f( 1.0, 1.0, 1.0, fColorComponent ); // Drawing text to screen. m_pFontEngine->DrawText( nX_i, nY_i, m_csDisplayString.GetBuffer( 0 ) ); glDisable( GL_BLEND ); glColor4f( 1.0, 1.0, 1.0, 1.0 ); m_StringTimerShow.ElapseTime(); } }
CloseButton is derived from GLButton, in order to implement some additional functionalities in CloseButton. The circular shape of close button is implemented by setting alpha channels to outer region of circle to 0.0 and 1.0 to the inner region of circle. The mouse cursor changing is also based on the circle region.
bool CloseButton::IsWithinRegion( const int nX_i, const int nY_i ) { if( GLButton::IsWithinRegion( nX_i, nY_i )) { // Here check the bottom left corner of circle. // If mouse move is not within the semi-circle, then return false. int nXDiff = nX_i - GLWindowBase::m_nWidth; int nYDiff = nY_i; int nRadius = sqrt( (float)nXDiff * nXDiff + (float)nYDiff * nYDiff ); if( nRadius < 45 ) { return true; } } return false; }
One workaround is also included in CloseButton to create smooth edges of semi circle. When semicircle is texture mapped, the edges will not be smooth. Therefore one GLCircle will draw a circle with 50% transparency. Therefore edges of close button will be smooth.
bool CloseButton::Draw() { GLButton::Draw(); // CloseBoundry draws the outline of circle in 50% transparency. m_CloseBoundary.Draw(); return true; }
Slideshow is also implemented with alpha blending functionality. Two textures are created with bitmap data of two image files. Transition from first image to second is created by blending first and texture texels. When starting slide show, the window size is changed to full desktop size, then hides all other windows (BottomWindows, CloseButton, etc).
void SlideShow::Display() { // glColor3f is used to make small amount of texture display. // This color factor is multiplied with texel color and get a shading effect. glColor4f( fColorFactor, fColorFactor, fColorFactor, fColorFactor ); m_pTexture1->Enable(); // Apply zoom1. glScalef( m_fZoom1, m_fZoom1, 0.0 ); m_pVertexBuffer1->DrawVertexBuffer( GL_QUADS ); glPopMatrix(); if( nRemTime < 100 ) { glPushMatrix(); // When transparent display of second texture is required. float fTex2Color = 1.0 - fColorFactor; glColor4f( fTex2Color, fTex2Color, fTex2Color, fTex2Color ); m_pTexture2->Enable(); // Apply Zoom 2. glScalef( m_fZoom2, m_fZoom2, 0.0 ); m_pVertexBuffer2->DrawVertexBuffer( GL_QUADS ); glPopMatrix(); } }
PicZoom supports dragging of image files[*.bmp, *.jpg, *.gif, *.tga]. Drag and Drop is implemented with the help of article from jibesh[http://www.codeproject.com/KB/dialog/JibDragDrop.aspx].
WM_DROPFILES message is handled in CPicZoomDlg class, and file name can be retrieved by DragQueryFile() function. Here is the code to handle new image file loading through drag and drop operation. LoadImage creates a new ImageArea and provides the new file name to this class. ImageArea will display new image file in required zoom and pan.
LRESULT CPicZoomDlg::OnDropFiles(WPARAM wParam,LPARAM lParam) { TCHAR szDroppedFile[1024]; memset( szDroppedFile, 0, sizeof( szDroppedFile )); HDROP hDrop ; int nFiles; hDrop = (HDROP)wParam; nFiles = DragQueryFile(hDrop, // Structure Identifier 0, // -1 to Drop more than one file szDroppedFile,// Dropped File Name 1023 *2 ); // Max char // Load new Image file. LoadImage( szDroppedFile ); return 1; }
GLButton PlayButton
non_power_of_two opengl
parentWindow( PicZoomDlg)
PicZoomInstaller is created to modify the registry entries, which are required to add context menu in windows explorer. When right click a file, the following context menu will be appeared.
The following registry modification is required for creating a context menu in Windows Explorer.
Create a new key "OpenWith PicZoom" under HKEY_CLASSES_ROOT\*\Shell\.
OpenWith PicZoom
RegistryHandler::RegisterForAllFiles() is responsible for creating a OpenWith PicZoom entry in HKEY_CLASSES_ROOT\*\Shell\.
PicZoomInstaller: Some other registry modification is also implemented, in order to create a new application entry(PicZoom) in open with list.
The registry modification is identified by trial and error method. I selected a new program(PicZoom.exe) as default application for opening a BMP file. Then I searched registry and found out the registry location to create an application in open with list. I don't know any other method to do the same.
The registry entries are created for open with list in bmp, jpg, png, and tga files.
// HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jpg // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.png // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.tga
RegistryHandler::AddApplicationName() is responsible for creating PicZoom in open with list of different image files.
When retrieving the width and height of a character with GetGlyphOutline(), I got a GDI_ERROR. Debug mode works fine, but release mode cause a GDI_ERROR. At last, I found its reason from some forums. The transformation matrix provided to , should be initialised with identity matrix.
Since there is no 3D related operation, here we can use orthographic projection. Orthographic projection area is same as the window coordinate, and simply overcame -1 to +1 mapping method of perspective projection.
Initially I prepared a timer, which will display image in 60 frames per second. This causes high CPU usage of PicZoom without any operation :). That was not good at all. I just prepared different timers for different tasks. For example, when zoom starts, ::SetTimer() is called with TIMER_ZOOM ID. Whenever zoom task is over, ImageArea class will kill this timer, and avoid unwanted draw of image to screen.
By default, opengl texture dimension should satisfy power of 2. The width and height of texture should be a power of 2. This can be avoided if your machine supports GL_ARB_texture_non_power_of_two extension.
Initially, GLExtension retrieves the status of GL_ARB_texture_non_power_of_two and updates GLExtension::m_bNonPowerOfTwo. When creating a texture, GLTexture uses this member and decides texture dimension should satisfy non power of two.
bool GLTexture::Create(int nWidth, int nHeight, void *pbyData, int nFormat_i, int nInternalFormat_i) { // ............... // Retrieve Non power of two support and create texture based on it. bool bNonPowerTwo = (GLExtension::GetInstance()).m_bNonPowerOfTwo;; if( bNonPowerTwo ) { glTexImage2D( GL_TEXTURE_2D, 0, nInternalFormat_i, nWidth, nHeight, 0, nFormat_i, GL_UNSIGNED_BYTE, pbyData ); } else { // if non-power of two is not supported, need to create nearest n^2 texture. int nNewWidth = PicZoomUtil::GetNearestPowerOf2( nWidth ); int nNewHeight = PicZoomUtil::GetNearestPowerOf2( nHeight ); int nChannelCount = ( GL_RGB8 == nInternalFormat_i ) ? 3 : 4; int nSize = nNewWidth * nNewHeight * nChannelCount; if( 0 != ( nNewWidth * nChannelCount ) % 4 ) { nSize = nNewHeight * ceil( ( nNewWidth * nChannelCount ) / 4.0f ) * 4.0f; } BYTE* pbyDataNew = new BYTE[nSize]; memset( pbyDataNew, 0, nSize ); // Set black data glTexImage2D( GL_TEXTURE_2D, 0, nInternalFormat_i, nNewWidth, nNewHeight, 0, nFormat_i, GL_UNSIGNED_BYTE, pbyDataNew ); // Update the required area with input data. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, nWidth, nHeight, nFormat_i, GL_UNSIGNED_BYTE, pbyData ); delete[] pbyDataNew; } }
Since all images are created as texture, PicZoom requires some graphics memory. In some machines, PicZoom is not starting, the preparation of background image [Desktop background texture] fails. I checked different machines with graphics card, and none of them cause error to start PicZoom. But some machines without graphics card failed to start. When stating PicZoom, an error message similar to the below one may appear, if your machine does not have enough graphics memory to prepare the textures.
I checked the reason of texture creation failure, in a machine without graphics card. Since some OpenGL applications with multi-texturing are perfectly running in those machines. I changed width and height of these textures to higher values [Modified multi-texturing application to display bitmap of size 1024]. Then I got white rectangle display, instead of proper texture image. I hope this issue is caused by lack of graphic memory to prepare big sized textures.
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
General News Suggestion Question Bug Answer Joke Praise Rant Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.


text:
Links: Paying for College Home | Frequently Asked Questions | Glossary of Common Terms
Dunwoody offers several ways to make a payment. These are:
Go to my.dunwoody.edu
Visit the Accounting window on the Green level (near the cafeteria)
Call Accounting at 612-381-8228.
Dunwoody College of Technology
Attn: Accounting Department
818 Dunwoody Blvd
Minneapolis, MN 55403
If you do not pay your balance due within the first 5 business days, or have not completed financial aid requirements, you will be automatically enrolled in the DCT Payment Plan. A payment plan handling fee of $50 will be charged to your account and the remaining balance will be due in three equal payments on the following dates:
September 15, October 15, November 15
January 15, February 15, March 15
June 15, July 15
If a payment is missed, a fee of 1% of your balance will be charged
Starting Spring semester 2016, students will use one of the following options to receive their refunds:
In addition to selecting one of the options above, please note that you also have the ability to have your funds held on your Dunwoody account to be credited towards future charges. This requires that you fill out the Credit Balance Authorization form (PDF download). This form will need to be submitted to the Accounting office. Under federal law, we are not allowed to carry any funds over the summer unless you are attending summer semester, in this case, you will be refunded the balance via the option you have chosen above. To determine if you are going to be receiving a refund, continue to monitor your account balance on my.dunwoody. There will be a credit balance on your account if you will be receiving a refund. Once the refund has been issued, you will see a "cash disbursement" on your account. Note that refunds are issued once a week starting the second week of the semester. You will not need to take any action to receive your refund. If your account balance shows that a refund was issued and you have chosen option 2 above, please give a week from the check issuance date for your check to reach your address. If after this time, you still have not received a check, please contact the Accounting office.

subset: commoncrawl


text:
'Justine' cross body bag from Fiorelli in black synthetic leather with signature metal branding to the front flap. Fastened with a front flap and clasp closure, the handbag features an adjustable crossbody shoulder strap. The inside of the spacious main compartment is fully lined and features a slip pocket and zip pocket. Complete with a slip pocket under the front flap, silvertone hardware and a zip around back pocket. - A.D. Synthetic Leather Dimensions (HxWxD): 23 x 24 x 7cm
Check stock and price


text:
Serves meat, vegan options available. Fast food chain where you could customize your order (tacos, burritos, bowls) and request no cheese/dairy. Some of its locations offer a soyfrito filling that's made from soy protein. Be sure to ask for plant based protein. Open daily.
Category: Lacto, Fast food, Take-out, Mexican, Non-veg
Reviews (1)
First Review by Sundrop125
Good burrito!
I had a great burrito bowl with rice, black beans, veggies, guacamole, corn and lettuce. Very filling...
Link to this page from your site.
Entry info
Return to
Wilmington Vegetarian Restaurants & Health Food Store Listings
Business Owners, if you see an unfair review, read this.
Why was my review removed? - details
Reviews are not endorsed by HappyCow - review terms
Has Chipotle closed, shut down, moved, or changed? Please use the Update Form.
This page has been viewed 569 times.


text:
TreeDraw is a genealogy software package for producing high quality genealogy charts. Family trees are imported into the software from "Kith and Kin Pro" databases or from GEDCOM files produced by other genealogy programs. After importing the tree data, you can re-arrange the tree and add extra text and graphics before storing, printing or creating a PDF file.
With our software it is easy to produce perfectly laid out charts and incorporate pictures, clip-art and other simple graphics. You have control over which data the software imports and how it formats it, so charts may be as complex or as simple as you wish.
By importing a combination of descendant and ancestral trees from one or more data files, it is possible to build complex charts which can extend in any direction.
This genealogy software maintains a link between each chart text element and the source field in the original Kith and Kin Pro database. This means that you can update each text element automatically to mirror any changes in the original data. The tree link for each text element can also be modified manually. This is a powerful feature which gives you control over the content and format of the text in the chart.
Additional text elements may be entered manually to provide titles, headings, comments, etc.
As well as text, you can place into the chart simple graphics (lines, boxes, circles) and images like pictures, clip-art, diagrams, etc.
TreeDraw lets you control the size, shape, style, colour and alignment of all chart elements and supports colour printing.
You can export your chart as an Adobe PDF file which can be viewed on any PC with the Acrobat Reader.
Download the free TreeDraw Viewer to view/print chart files created with TreeDraw.
TreeDraw Legacy Edition imports data direct from Legacy family files so there's no need
to use GEDCOM. This edition allows you to import many more of Legacy's data types,
including events, addresses and pictures, and still gives you TreeDraw's superior control
over formatting.
For more details visit
These firms will print on large-format paper direct from TreeDraw files.
Click on the logo above to go directly to the FamilyTreePrinting page.
Telephone: +44 (0)20 7060 1849
E-Mail: firstname.lastname@example.com
Web Site: www.familytreeprinting.co.uk
Download genealogy software for family history research. Our free to try genealogy software is for family history research. Download TreeDraw to print charts from family tree software, it is free to try. We specialize in free to try genealogy software, available for download. Try our genealogy charting software for free. You can download genealogy software for family history. TreeDraw is a charting program for your family history. Download genealogy chart program for use with GEDCOM compatible software. Free 30-day trial. You can download genealogy software, free trial, to print your family history. Download genealogy software here for GEDCOM. This site is about genealogy and family history software with free trial software. TreeDraw imports GEDCOM files and produces genealogy charts. Print family trees with our free to try genealogy software. Our family history software is free to try and is used for genealogy. Genealogy software is sometimes mispelled as geneology software. TreeDraw is a genealogy chart program, download it here.


text:
Antonio Carlos Jobim/arr. Michael Mossman - Hal Leonard Corporation
Here's one of the most tuneful of Jobim's many familiar Latin standards in a marvelous setting featuring a baritone sax soloist. The style is a laid-back Latin groove and the arrangement includes a wealth of creative harmonic and textural devices. To round things out, it also includes a sax soli and a lush tutti ensemble chorus. A great way to feature your bari sax soloist! �
Select a Product
My Library
Powered by Rating-System.com


text:
This girl is a real wild rose. They called her so because she has beautiful red pussy, as a rose flower. For the shoot she wears black stockings and black lingerie. And as usual attribute red rose in her hands.
Riza is a charming brunette as she takes her blouse off we see her fit body. She is slim enough and her boobs are quiet large. Afterwards she begin taking her bra off and ends up naked. Se we can be sure that rose is her symbol.


text:
Do you want to make Ohio.com your homepage?
Head coach: Bill Cubit
Last season: The Broncos were 1-10 in 2004. Then Cubit took over. His teams have gone 7-4 and 8-5. While J.D. Brookhart has outrecruited his counterpart at Western Michigan, Cubit has done much more with his predecessor's recruits. Credit their stingy ... naw, downright scary defense. The Broncos allowed just 76.1 rushing yards per game, good for best in the MAC (almost 50 yards fewer than second-best Northern Illinois) and sixth-best in the nation. Ameer Ismael led the way, and the nation, with 17 sacks and 25.5 tackles for loss. Those are not typos. Somehow the second-team All-American wasn't drafted. He landed with New Orleans as non-draftee.
Ryan Cubit effectively ran the offense for his dad, taking the team to the International Bowl, which the Broncos lost to Cincinnati. Mark Bonds was a 1,000-yard rusher, but perhaps the more talented player was behind him. Brandon West averaged 4.8 yards per carry in his freshman year.
Best returning player: Junior cornerback Londen Fryar
Offense: The Broncos lost a lot from the 2006 team. Thomas Peregrin and Tim Hiller will duel for the quarterback job. Peregrin started twice last season, and he started in wins against Toledo and Virginia. He's a junior college transfer who will be a senior this season. Hiller, on the other hand, was 2005 MAC Freshman of the Year. He threw 20 touchdowns that year before injuring his knee and sitting out an entire season. Most of a solid receiving corps returns, including Branden Ledbetter, who scored six touchdowns as the tight end. The offensive line also brings back four of five starters, including Robbie Krutilla -- a preseason All-MAC selection and possibly the highest draftee next spring. Even without a returning starter at quarterback, the Broncos offense should be very strong and multi-faceted.
Defense: And yeah, their defense will still be good. They lost four of the front seven, but return impact players such as defensive lineman Zach Davidson, who logged eight sacks his sophomore season, and Dustin Duclo, whom the team named its defensive player of the year. The secondary, however, might take over as the defense's signature cog. Each starter returns from last year, when the team gave up a fair amount of yardage, but also led the conference with 24 interceptions. Londen Fryar is an outstanding cornerback and, being only a junior, has "first-day draftee" tagged on his shoulder pads. He grabbed four interceptions (two for touchdowns), broke up five passes and forced a fumble last year.
How the Zips match up: With all due respect given to the defending Big Ten champions, the Broncos are a dynamite team and possibly the more difficult game. Every aspect of the team is water-tight. The only question mark is kicker, but the Zips shouldn't be close enough to make that matter.
Way-too-early prediction: Western Michigan 31, Akron 7


text:
Our virtual tour can help you and your child feel as comfortable as possible so you know what to expect when you arrive.
With more than 300 pediatricians and specialists, we provide world class care for children and their families.
Complete our online appointment request form and receive an email response within 1 business day.
Our specialists consult with pediatricians prior to referral or appointments and provide care for your child and adolescent patients requiring hospitalization.
For more than a decade Cleveland Clinic Children's Center for Autism has been committed to offering world-class service to patients and families affected by autism spectrum disorders. Cleveland Clinic Children's has developed a model of services for children and families including an intensive day treatment program, a full service multidisciplinary diagnostic clinic, a community-integrated outreach program and a research program focused on applied and clinical research in the study of autism and autism spectrum related disorders.
Over the last seven years, in addition to the site in Cleveland, Cleveland Clinic Autism Development Solutions has assisted other independent healthcare organizations in developing comprehensive autism treatment centers, utilizing the Cleveland Clinic model, throughout the United States, with locations in Missouri, Kentucky, Pennsylvania, Michigan, Nevada and Ohio.
Autism has been part of the pediatric community for more than 40 years. With clinical and behavioral advances, autism is now perceived as a treatable medical condition.
More than 65 children are diagnosed with autism in the United States each day. According to current research from the Centers for Disease Control, 1 in every 68 children born today will be diagnosed with an autism spectrum disorder. The annual cost of treating and caring for individuals with autism is $90 billion. In 10 years, the annual cost is estimated to increase to $300 billion.
Cleveland Clinic Autism Development Solutions (CCADS) provides essential services from consulting on an as-needed basis, to on-the-ground assistance in the development and execution of a full business plan for your autism treatment center. CCADS provides the total framework for large-scale facility and clinical program development – from designing full-service treatment centers; staff development; creation of individualized patient treatment plans; establishing the necessary procedures and organizational processes for center operation; to providing opportunities for research collaboration across a global network of Cleveland Clinic model affiliates and/or mirror-treatment centers.
Unlike other consultations in autism treatment, CCADS provides an end-to-end solution. CCADS offers all levels of assistance in helping your organization grow your service and produce a turnkey operation for treatment of your patients and families affected by autism. CCADS provides essential services that can be sized and structured to your healthcare organization's individual needs. Specialized consulting programs and services include:
To speak to an Autism Development Solutions representative about our program or to set up an appointment, please call 216.448.6440.
Cleveland Clinic © 1995-2016. All Rights Reserved. 9500 Euclid Avenue, Cleveland, Ohio 44195 | 800.223.2273 | TTY 216.444.0261


text:
Roll Over Image to Zoom
Simply Scallop Shade
No longer available
- Overview
A curved silhouette and scalloped trim add sweet style to a basic shade.
- 12" diameter, 8.75" high
- Frame is crafted of iron and covered in white cotton voile.
- Scallop shaped edge on bottom.
- All our shades, with the exception of chandelier shades, require a harp and finial for attachment to a lamp base.
Mix + match our lamp shades + bases to create your own unique look with our Design Your Own Lighting Tool.
- Dimensions + Care
- Overall: 10.75" diameter at top, 12" diameter at bottom, 8.75" high
- Wipe clean using a soft, dry cloth.
- Shipping Info
This item will arrive in 3-5 business days. Please proceed to the Payment & Review page of Checkout for a precise delivery estimate.
Lamp Shade
No longer available
You May Also Need
Bubble Up Lamp Base
De-Lite Lamp Base


text: Besides our wide selection, we also offer guaranteed best pricing on user interfaces, with items starting as low as $21.74. At Unbeatablesale.com, we celebrate the quality of our service, not just our products. We take every step we can to make sure your online shopping experience is simple, secure, and efficient.We accept major credit cards as well as Paypal and ship your order at lightning speed. Shop Unbeatablesale.com with confidence today!


text:
H.A. Shirvani, Chancellor; Dean Bresciani, University President: Unfreeze funds for comprehensive sexuality education
A competitive $1.2 million grant was awarded to two professors at North Dakota State University-Fargo, by the Department of Health and Human Services. The grant funds were to be used on a voluntary program to educate high-risk teenagers in the Fargo area on how they can reduce their risk for Sexually Transmitted Infections (STI's) and unwanted pregnancies. Under pressure from the State Legislature, the university president froze the funds. The decision to release or return the funds now rests with the University President and the Chancellor of the university system. Between 1991 and 2008, there were approximately 13,000 teen births in North Dakota, costing taxpayers a total of $300 million over that period. Forty-five percent of high school students in North Dakota are sexually active. This program is critical to help teenagers learn sexual responsibility.
- Chancellor
H.A. Shirvani - University President
Dean Bresciani


text:
2000 4.7 weird sound (maybe brake related)
Guys looking for some help with my dad's WJ (2000 V8). He has told me about hearing a sound when he releases the brake pedal. Today I got to hear it 1st hand. When he takes his foot off the brake pedal you hear a low frequency buzzing sound. When foot is on the brake there is no sound, when released the sound starts. It's within the cabin, sounds like possibly under the drivers side of the dashboard. Sounds like something electronic. With the windows closed the sound is heard as well, so I don't think it is from outside. He also said that it seems to be lasting longer, and today at 1 point he had shut the jeep off, and pulled key from ignition and the sound continued.
Any ideas? thanks in advance |
Re: 2000 4.7 weird sound (maybe brake related)
Possibly the ABS???
Re: 2000 4.7 weird sound (maybe brake related)
Can it be a vacuum leak from the brake booster? Will the sound stop after a minute or so after switching off the engine?
Re: 2000 4.7 weird sound (maybe brake related)
the sound didn't continue after the engine was shut off except for 1 time, but this sound has stopped for a couple days now, ugh. Now on Friday when he was driving, he had a new issue. The headlights were set to auto-on and he was driving around middle of the day and they came on and went off a couple of times. When he parked, he turned jeep off and before he exiting the lights came on. He then set the headlights to off. Gotta look into why they are coming on when they aren't required.
Re: 2000 4.7 weird sound (maybe brake related)
The headlights are controlled via the BCM. The BCM uses a light sensor to switch the headlights in auto position. The sensor is mounted in the center of the defroster grill close to the windshield. Any dirt or something on it?
It can also be the multi function switch. |
Re: 2000 4.7 weird sound (maybe brake related)
when your lights are on auto after the vehicle is turned off the headlights will stay for about 30 seconds on this is called follow me you can turn them off in upper console computer
All times are GMT -5. The time now is 07:21 PM. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Copyright 2012 - JeepGarage.Org
The Jeep Grand Cherokee Owners Community


text:
Dec 18, 2008 | 384 Pages Buy
Dec 18, 2008 | 384 Pages
Ken Wells's highly acclaimed picaresque Catahoula Bayou novels introduced "one of the most compelling voices in fiction of the last decade" (Los Angeles Times). Now Wells is back, writing about his favorite subject–the exotic, beleaguered Louisiana wetlands–in a sharp, rollicking tale of corporate corruption and political shenanigans. The fight over one man's tract of sacred marsh fronts a deeper story of our place in the environment and our obligations to it. Justin Pitre's marsh island, a legacy of his trapper grandfather, is a scenic rival to anything in the Everglades, and he has promised to protect it from all harm. But he hasn't counted on oil bigwig Tom Huff's plans to wreck his bayou paradise by ramming a pipeline through it. When cajolery doesn't sway Justin to sign the land over, Huff turns to darker methods. But Justin and his spirited wife, Grace, prove to be formidable adversaries–and the game is on.Into the fray comes the charismatic Cajun governor Joe T. Evangeline, who seems more interested in chasing skirts than saving Louisiana's eroding coast. The Guv, though, is a man on the edge, upended by a midlife crisis and torn between a secret political obligation to Big Oil and the persuasive powers of Julie Galjour, a feisty environmentalist. Julie is clearly out to reform more than the Guv's ecopolitics, but will his tragicomic Big Oil deals wreck both his career and his chances with the brash and beautiful activist?As Justin and Grace battle to stop this Big Oil assault, the plot thickens–and the Guv becomes snared in the web. Featuring a gumbo of eccentrics and lowlifes, a kidnapping, a sexy snitch, a toxic-waste-dumping scheme, a boat chase, and a fishing trip gone horribly awry, Crawfish Mountain, spiced with Ken Wells's keen eye for locale, showcases his adventurous storytelling.From the Hardcover edition.
Ken Wells is a senior writer and features editor for page one of The Wall Street Journal. In 1982, he was a finalist for the Pulitzer Prize for The Miami Herald. He lives with his family outside Manhattan.
Ebook | $12.99 Published by Random House Dec 18, 2008 | 384 Pages | ISBN 9780307518255
Visit other sites in the Penguin Random House Network
Stay in Touch
By clicking Sign Up, I acknowledge that I have read and agree to Penguin Random House's Privacy Policy and Terms of Use.


text:
Invaluable cannot guarantee the accuracy of translations through Google Translate and disclaims any responsibility for inaccurate translations.
Show translation options
Lot 43: porcelain figure & English version of Red book
Important Chinese Antiques and Fine Jewelry Auction
by International Auction Gallery
24 October 2016
Anaheim, CA, USA
Live AuctionSold
Looking for the realised and estimated price?
Description: White porcelain figure of chairman Mao (10.5"H) and English version of Red book in original case


text:
Sale: $17.99
Regular: $35.99
You Save: $18.00
Checking inventory..
As an ambassador of Giants football, it's important to spread the word even while out on your morning jog. Show off some of that fast-paced G-Men spirit with these Nike Tempo performance running shorts. With a printed logo on the right leg, mesh side panels and Nike's patented Dri-FIT technology to keep you dry and cool, these lightweight shorts will provide you with the ultimate comfort during any season. True fans know what to wear to succeed!
Other Customers also liked:
Sale: $17.49
Regular: $24.99
You Save: $7.50


text:
Eversheds Sutherland has problem-solved and resolved disputes for construction industry clients for more than 40 years.
Eversheds Sutherland understands the complex needs of construction industry clients, and we have successfully resolved hundreds of construction cases throughout all fifty of the United States, Canada, Mexico and overseas. Because our lawyers focus exclusively on construction, we are intimately familiar with the individuals, entities, projects, and practical considerations common in the industry, as well as the legal issues and business cycles affecting the construction industry in the United States and overseas. This helps clients achieve either early resolution of disputes or highly successful and cost-effective dispute resolution.
We guide clients from all sides of the construction industry through every step of the construction process. We provide a full scope of services based on our clients' needs, from advice delivered in a single phone call to directly handling complex lawsuits involving hundreds of millions of dollars and the production of millions of documents. Between those extremes, we perform a full range of services for our construction clients, including bid protests, negotiation and preparation of contracts, advice and counsel during contract performance, dispute avoidance, claims preparation and analysis and various forms of dispute resolution. We have extensive jury trial, bench trial, arbitration and mediation experience.
When issues arise, we guide clients through all their options, helping them analyze the advantages and disadvantages of every approach. We have honed skills that help our clients avoid or minimize risk and disputes, with an eye toward preserving business relationships, reducing costs, and keeping projects moving forward. Our attorneys counsel clients to structure their contracts and project relationships in ways that will prevent future problems, offer practical aid with problem solving, and help them anticipate and solve potential issues before they become adversarial. We frequently provide on-site assistance to safeguard our clients' interests by establishing proper procedures for scheduling, cost-tracking, record keeping and claim notification.
Longevity in a tough industry. Eversheds Sutherland has been involved in construction for more than 40 years, so we understand challenges involved in complex projects.
National recognition. We have been ranked by Chambers as a Band 1 firm in Georgia since its inaugural U.S. issue in 2003.
Global reach. Eversheds Sutherland attorneys have successfully resolved hundreds of construction cases throughout all fifty of the United States, Canada, Mexico and overseas.
We serve the entire industry. Our clients include some of the nation's largest commercial and industrial owners, construction managers, engineers, contractors, subcontractors, architects, material and equipment suppliers, real estate developers, public entities and private owners.
Comprehensive service. We advise construction clients on construction project development; negotiating and preparing contracts and documents; project financing, bidding and bonding; permit and land use; environmental compliance; employment relations; supply and distribution chain contracts; intellectual property protection and licensing; claims presentation and defense and alternative and traditional dispute resolution.
The right team. We have worked closely with hundreds of construction consultants and expert witnesses over the years and are able to offer valuable insights in the process of selecting outside assistance.
A green approach. Eversheds Sutherland's team includes a LEED-accredited professional and attorneys knowledgeable about green building standards throughout the United States and the world. We also have extensive experience with wind, solar and biomass projects.
Eversheds Sutherland advises on the full-spectrum of construction projects and issues:
Eversheds Sutherland provides comprehensive services to construction industry clients:
Our construction clients build with confidence, knowing Eversheds Sutherland's experience will serve them well as they adapt to the changing needs and requirements of the modern construction industry.
Eversheds Sutherland is an international law firm helping the Fortune 100, industry leaders, sector innovators and business entrepreneurs solve their biggest challenges and reach their business goals. Dedicated to unfaltering excellence in client service, we are known for our business savvy and industry intelligence, providing creative and custom solutions for each of our clients. Industry and business experience makes the difference for our clients.
Complete the fields below to send your briefcase via email. Separate multiple email addresses with semi-colons(;)


text:
The Hollywood Reporter noted that Walt Disney Co. president and CEO Michael Eisner has taken computer makers, including Apple, to task for fostering piracy. Eisner's comments appear in an article entitled Mouse grouse: Dis boss lays into computer biz. (Unfortunately, the full article is available to subscribers only.)
Eisner's comments came as he testified before the United States Senate Commerce Committee about the potential threat that computer use has to music and movie distribution. Eisner accused the computer industry of considering piracy its new "killer app." He singled out Apple's "Rip, Mix, Burn" ad campaign of 2001 as an example of this type of behavior.
Apple's ad campaign suggested to potential buyers "that they can create a theft if they buy this computer," said Eisner, who otherwise ignored Apple's iPod ad campaign, which features prominent warnings against stealing music.
Eisner's comments come as congress considers legislation known as the Security Systems Standards and Certification Act. The act would require computer makers and consumer electronics makers to install technology which would prevent such devices from being able to duplicate copyrighted media, including CDs, DVDs, digital music and movies and more.
This story, "Disney boss accuses Apple of fostering piracy" was originally published by PCWorld.


text:
hey wheni go to do updates i am getting E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
E: _cache->open() failed, please report.
can someone help me i am new to this computer linux and am not realgood with computers in the first place i need to no what to do to fix this prob please thank u i have linux 11


text: DIY Detachable Smartphone Macro LensWhitson Gordon9/12/10 8:00amFiled to: DIYMacroPhotographyDIY CreationsCameraphoneCamera HacksPhotos15EditPromoteShare to KinjaToggle Conversation toolsGo to permalink If you don't feel like permanently altering your phone with a macro lens, hacker Thomas shows us how to make a detachable one using a lens from mini binoculars. You can really use any lens that has a circular casing around it, as the idea is that it will go in front of your phone's current lens as a separate attachment. Thomas essentially took a lens from a pair of mini binoculars, made a mounting bracket with some epoxy putty, and put a headphone jack on top to attach it (it doesn't actually use the headphone jack for anything except stabilization). It's a pretty clever workaround for those that don't feel like opening up their phone, and pretty easy to do. Hit the link for more instructions and photos. Advertisement Advertisement DIY Nexus One Macro Lens [DsynFLO via Hack a Day]Reply15 repliesLeave a reply


text:
For 3D Printing To Grow, It Needs Materials, Machines & SoftwareMajor changes are happening in the world of 3D printing and additive manufacturing (AM), in the three key technology areas of materials, machines, and software. But if the industry -- and the design engineers and OEMs it serves -- are to grow, all three of those areas must become much more tightly integrated. As patents have expired on existing 3D printing processes, most notably FDM (fused deposition modeling), numerous startup companies have come up with a wide variety of low-cost machines based on those processes. This has also opened up a huge materials market, as both existing materials companies and completely new ones have started supplying a much broader range of filaments and other materials. "For making quality prototypes, you can get desktop machines today for as low as around $1,000," Autodesk's Duann Scott, business development manager for its digital manufacturing group, told Design News. "This has ushered in a new era of faster prototyping, made on less costly machines, with lower-cost quality materials. Similar trends -- lower-cost machines and a broader materials palette -- will also impact different 3D printing processes as patents expire for other additive technologies, such as selective laser sintering and stereolithography." To read the rest of this article, visit EBN sister site Deisgn News. |
More Blogs from Ann R. Thryft
HP's industry-changing 3D printing announcement for commercial-scale end-production wasn't the only news of note at RAPID 2016 this week. Here are six more game-changing software and hardware news items, plus some videos explaining HP's technology.
With an eye toward building space-qualified radio-frequency components for Earth observation and science instruments, the European Space Agency has 3D printed a satellite antenna designed as a single part.
What are humanoid robots? Most of them sort into two general categories. This time, we'll look at obviously mechanical objects shaped like people, like the earlier Terminator models before SkyNet wised up and made them look like Ahnald.
There are new materials for use with 3D printers, and then there are new materials that can only be made using 3D printing (3DP) techniques. In this slideshow, we'll show you some of both.
EBN Newswire
Datasheets.com Parts Search185 million searchable parts


text:
Teams of runners will be rocking holiday-themed costumes when this year's SSRun returns to Boston on Saturday, Dec. 14. The annual race, which raises money for the Play Ball Foundation, always has a few festive and outrageously dressed teams on hand. As we gear up for this year's event, check out these interesting team looks from past Santa Speedo Runs.
Pictured: Nick Capone, Corey Loder, Mark Capone and Katie Banfield of Billerica, rocked Teenage Mutant Ninja Turtle head gear for the 2012 run. Next
Team Skimpy Santas wore colorful costumes during the 2012 race. Next
The full Buddy's Best Friends group got together on the stairway to show off their holiday spirit during the 2011 run. Next
Members of "Team Awesome" showed off their wigs and shades after the 2010 run. Next
Clockwise from left: Jamie Martin, Kristina Collins, Adam Lipworth, and Jennifer Tan, all of Boston, and a team member who identified herself as "Secret Santa," wore pink shades and boas for the 2011 race. Next
Teammates from left: Meredith Duke, Kristin Staniowski, Anegla Mioglionico, and Danielle Thibeault wore Christmas themed attire for the 2009 run. Next
Team Sticky Bandits members Eric Marchese and John Dileo of Brighton got into the holiday spirit for the 2012 race. Next
Anastazia Correa (right) and Jordan Ford, both from Connecticut, represented Dr. McGillicuddy's at the 2007 race. Next
Pictured from left are team members Ernie Pu, Miranda Cookie, Jacob Sooty, Candy Robinwitz, and Jerry D. Sooty, in the middle, described his costume as "the running rabbi." "The Dirty Heathens" team from Boston raised more than $2,500 and was one of the top three fund-raisers for the 2008 race. Next
Members of the "Beantown Gals" team donned Patriots jerseys for the 2010 race. Next
Pictured from left are friends and former high school classmates Mal Scovil, Shane Etem, and Ian Taylor, all from Cambridge, in homemade reindeer costumes for the 2008 run. Next
From left: Tracy Stone of Jamaica Plain, Rob Silva of Roslindale, Andrew Choly of South Boston, Ed Everett of Somerville, and Scott Itri of Roslindale went with a blue theme instead of the conventional Santa-suit red for the 2012 race. Next
Some runners showed their patriotic spirit during the 2011 Santa Speedo Run. Next
From left: Tara Bannon, Spinosa, and Gosia Pyc. From left, back row: Ellen McQuaid and Olga Naumova. Team "Boston Ski Patrol" wore blue tops with hoods for the 2009 race. Next
Twelve Philly Boys made the journey from Pennsylvania for the 2007 run. All together, the group raised $3,300 for the charity. Next
Pictured from left are Emily Ryzak of Boston, Jean Denniston of Boston, and Pamela Negrotti of Philadelphia (originally from Boston), who are all first-time Speedo runners at the 2008 race. Next
Team Santa's Packed Sack members Doug Dimartile and Will O'Brien, both of Boston, rocked some less traditional blue speedos for the 2012 run. Next
These participants in the 2011 race showed off their Celtics pride. Next
From left: Liam Boesel, of Canton, John Bruyere, of Northbridge, Nick Halloran, of Boston, and Ryan Reilly, of North Reading, were more than enthusiastic for the 2006 run. The team raised $3,000 for the Ellie Fund, and the friends were racing for the women whose names were scrawled on Halloran's chest: Cindy McNabb, Patty Burt, Aunt Gunny, and Carol O'Brien. Next
This group wrapped itself up for the 2007 run. Mandy Taylor of Somerville kept warm with her red leggings. She brought along her husband, Wim Taylor of Somerville, Jason Erwin of Beacon Hill, Laura Renaghan of Brookline, and Cynthia Gordon of Amherst. Next
Jess, Joe, and Tamiko of Boston have been running Santa Speedo together since 2006 and rocked some festive attire for the 2012 run. Next
Kyle and Lana Grady of Somerville met at the 2005 race. The married couple wore festive outfits for the 2008 run. Next
Teammates from She Blinded Me With Science dressed in festive gear as they prepared for the 2011 race. Next
Pictured from left: Matt Yuergelun and Corey Fehnel of Rochester, N.Y.; Ryan Davis, Eric Davis, Ethan Ellis, and Matthew Hill, all of Boston at the 2008 race. Next
Team Sapient featured Christmas and Hanukkah inspired outfits for the 2011 run. Next
Members of "Team Play Ball" had an interesting array of outfits for the 2010 race. Next
This group, hastily named Team Candy Cane Christmas Tree, quickly posed for a photo as they rushed to the starting line at the 2011 race. Next
From left: Patrick Cherry, of Worcester, Sarah Reid, of Worcester, and Robert Lotsbom, of Sutton, were all smiles while waiting tostart the race in 2006. Reid and Lotsbom were a daughter/ father team — notice Reid's stomach, which proudly states, "This is my Dad," while pointing to her father. Next
The Zooming Santaz take their name from their triathlon group, Zoom Multisport, and rocked red and green holiday costumes for the 2011 run. Next
2009 marked the third year of participating in the Santa Speedo Run for team "Easy E Santas." Back to the beginning


text: Google Docs Gets Full Find & Replace, Drawing ToolsKevin Purdy3/26/09 5:30amFiled to: online documentsGoogle DocsGoogle Docs & SpreadsheetsdrawingTextText editorText substitution17EditPromoteShare to KinjaToggle Conversation toolsGo to permalink Google Docs takes another step toward becoming a proper document tool, adding a full-fledged find and replace toolbar, as well as a browser-based SVG drawing tool. Advertisement Docs had a kind of low-powered, actually apologetic find and replace tool before that could only do whole-document, every-instance replacements. Now it's a bit more familiar, with one box for the finding text (or regular expression), one for the replacement, and buttons and shortcuts (Ctrl+F, Ctrl+G for next) that can replace items one-by-one: That's just a writing tool, though. The new drawing app, found by hitting "Insert," then "Drawing" from the top menus, works on text documents, spreadsheets, and presentations. It's easy to figure out and doesn't require any special software (at least on SVG-supporting browsers like Firefox, Chrome, or Opera), but, as Google Operating System points out, you have to "save" the drawing by hitting the "X" in the upper-right, which doesn't seem like what you want to do. Advertisement Find (and replace) my favo(u)rite colo(u)r and much, much more Drawing on your creativity in Docs [Official Google Docs Blog]Reply17 repliesLeave a reply


text:
4 May 2009
Basic understanding of the Flash authoring environment and prior experience coding in Flash Lite 2.0 is recommended.
In this tutorial I'll describe how to build a simple but useful List component for Flash Lite applications. You may be familiar with the ActionScript 2.0 List component that ships with Adobe Flash CS4 Professional. Due to the memory and processor constraints of the mobile environment, that component isn't practical for use in Flash Lite applications. This article includes the sample files for the completed custom List component. The sample project can be extended and updated to tailor any part of it to fit the needs of your Flash Lite mobile application.
By definition, a List component is a scrollable collection of items that allows the user to choose a single or multiple list items. List components are scrollable because there are times when the amount of data exceeds the amount of screen real estate and all of the list items cannot be displayed on the device at once. From a Flash perspective, the items in the list will be displayed in separate movie clips. All of these list item movie clips are contained within the list movie clip. Users can navigate the list by pressing the up or down soft keys on their device's directional pad, and they can select an item by pressing the center soft key (which is sometimes labeled Enter).
However, due to resource constraints of mobile devices, creating a movie clip for every data element in your list could result in poor performance, out-of-memory errors and crashes on some lower-end devices. To resolve this issue, the List component created in this sample project will only use as many movie clips as are visible at any one time, and logic in the ActionScript code updates the values shown in those clips when necessary.
This diagram represents a data set of eight elements, and a list that can display four of those elements at once to the user. This illustrates how the list items work in relation to the data (see Figure 1):
In the diagram above, the item with focus represents the initial state of the list, before any user interaction has occurred. The list displays the first four items from the data set, and the first item in the list has focus by default—it is the list item that would be selected if user pressed the select soft key on their device. As the user uses the up and down soft keys to navigate through the list, the logic in the ActionScript code determines whether to change the current focus to a different list item movie clip, or whether to change the data that is currently being displayed to the user.
The different states of the list shown below are the various situations to consider in making that decision (see Figure 2):
In Figure 2A, if the user presses the down soft key, it is only necessary to change which movie clip has focus. If the user presses the up soft key, the logic will re-populate the list with a new range of data because there isn't a list item movie clip above the one that currently has focus. This means that instead of showing Data2 through Data5, when the user presses the up soft key, the list changes to display Data1 through Data4.
In Figure 2B, the situation is exactly the reverse of Figure 2A. Pressing the up soft key requires the logic to change the focus to a different list item. Pressing the down soft key will result in changing the list to show Data3 through Data6.
In Figures 2C and 2D, it doesn't matter whether the user presses their up or down soft keys; all the List component needs to do is change which movie clip currently has focus.
Of course, it is also necessary to add the logic to ensure that the user cannot scroll beyond the very top or very bottom of the list of data.
Now that you have a clear concept of how the List component works and how the user can interact with the list, it's time to begin building it. In the next section, I'll provide the step-by-step instructions to begin developing the sample project.
If you haven't already, be sure to download the sample files provided on the first page of this article.
In Flash CS4, open the file named list_start.fla from the sample files folder. We'll start by using the sample movie clips I created for this article—later you can customize the List component for your own projects. After opening the file, you'll see the list displayed on the Stage (see Figure 3):
Look at the items in the Library. Then review the elements of the project by double-clicking on the movie clips to see how they are nested. Use the Property inspector to identify the instance names. There are two main movie clips on the Stage: the list itself and a scrollbar. The list movie clip contains multiple instances of the list item movie clip used to display the data. The list item movie clip instances are named listItem0
through listItem7
, for a total of eight visible list items. Double click on the mc.listItem movie clip in the Library to see its Timeline. Each list item movie clip contains keyframes labeled on and off. When an item has focus, it will display the graphics that exist at the on keyframe, otherwise it will display the contents of the off keyframe. There is also a dynamic text field that is used to display the data from the array.
The scrollbar contains the scrollbar track, as well as the slider. The slider is a nested movie clip. In the last section of this article I'll describe how to change the slider's size and position depending on how many elements are in the array of data.
Spend some time analyzing the structure of the movie clips and their instance names. After you've become familiar with these movie clips, you're ready to begin adding the ActionScript to populate the list with data. In the next section, I'll provide the instructions on how and where to add the code.
In this section, I'll describe how to add the code to initialize the list and change it in response to user input.
In the main Timeline, click on Frame 1 of the ActionScript layer. Open up the Actions panel by selecting Window > Actions. We'll use an array of 26 string elements as the data source for testing the List component. Copy and paste the following code into the Script window:
var listDataArray:Array = ["Alice", "Betty",
"Carl", "David", "Emily", "Frank",
"George", "Heather", "Ivy", "John",
"Kathy", "Leon", "Michael", "Nicholas",
"Octavia", "Pauline", "Quincy",
"Richard", "Stanley", "Trevor",
"Ursula", "Virginia", "Wanda",
"Xavier", "Yvonne", "Zoe"];
Next, add this code snippet directly beneath the previous array code:
// track which item from listDataArray is shown in the first list
item movie clip
var firstVisibleListItem:Number = 0;
// list item that currently has focus
var listItemWithFocus:Number = 0;
// constants. TOTAL_LIST_ITEM_CLIPS may be changed
// in initializeList(). MAX_VALUE_OF_FIRST_LIST_ITEM
// is set in initializeList();
var TOTAL_LIST_ITEM_CLIPS:Number = 8;
var MAX_VALUE_OF_FIRST_LIST_ITEM:Number;
The firstVisibleListItem
variable keeps track of the index of the array element that is visible in listItem0
. This value is used as the basis for the function that will populate the list items with data from the array. This value is set to 0 so that when the list is first displayed, the first visible item is the first element from the array of data.
The listItemWithFocus
variable keeps track of which of the eight list item movie clips currently has focus. Again, the script initializes the value to 0 so that the first list item has focus when the list is created.
The constant TOTAL_LIST_ITEM_CLIPS
will specify the number of list item movie clips in the list. As you can see from counting the list items inside the list movie clip, there are eight movie clips in total. You will use this number for various purposes, such as when you populate the list with the data. If you customize the list by changing the number of list item movie clips, you will also have to change the value of this constant.
The last line of code creates a constant that specifies the largest index of the element from the data that can be displayed in listItem0
. You'll set the value of this constant when you initialize the list. I'll explain the purpose of this variable in the next section.
Copy and paste the following function below the existing code in the script window. This function will be called when you want to set up the list:
function initializeList() {
// check to see if we need to make this constant a smaller number
// (if we have fewer data elements than list item movie clips)
if (listDataArray.length < TOTAL_LIST_ITEM_CLIPS){
TOTAL_LIST_ITEM_CLIPS = listDataArray.length;
// value of this constant can only be set after data is loaded
MAX_VALUE_OF_FIRST_LIST_ITEM = listDataArray.length - TOTAL_LIST_ITEM_CLIPS;
// call the functions to set up the list and the scrollbar
The first part of the function checks whether the list data contains fewer elements than can be displayed on the screen. In that situation, you'll want to make TOTAL_LIST_ITEM_CLIPS
equal to the number of elements in the array. This setting will prevent the user from scrolling to empty list items. Although in this example there are more data elements than list item clips, you may encounter situations where this is not the case. (Technically speaking, it's not a best practice to be changing the value of a constant—otherwise it's not really a constant! However, in the constrained mobile environment, this approach is the simplest and most efficient.)
The next part of the function sets the value of MAX_VALUE_OF_FIRST_LIST_ITEM
. In this hypothetical scenario, the user has scrolled down to the bottom of the list (see Figure 4):
In this case, you don't want the list to change if the user presses the down soft key again, so you need a way to test for this situation. This is the purpose of the value of MAX_VALUE_OF_FIRST_LIST_ITEM
Remember that firstVisibleListItem
stores the index of the element visible in listItem0
. When the user presses the down soft key, you can check to see if firstVisibleListItem
is less than MAX_VALUE_OF_FIRST_LIST_ITEM
. if it is, you know that there is more data to display. If the two values are equal, you know that you're at the end of the list, and the code should not respond to subsequent down soft key presses. You can calculate MAX_VALUE_OF_FIRST_LIST_ITEM
by subtracting TOTAL_LIST_ITEM_CLIPS
from the total number of elements in the data array.
The next step is to call a number of other functions to complete the set-up of the list. Each of these functions, as well as the other code required to make the list work, will be discussed in the next section of this article, and then we'll finish off the sample project by discussing the scrollbar-related code at the end.
Add the following function to Frame 1 of the ActionScript layer, beneath the other existing code:
// iterate through all of the list item movie clips inside the list and
// assign the required value from the data source to the list item's text
// field
function populateList() {
var i:Number = 0;
while (i < TOTAL_LIST_ITEM_CLIPS) {
var targetMovieClip:MovieClip = list["listItem" + i];
var dataToAssign:String = listDataArray[firstVisibleListItem + i];
targetMovieClip.listTextField.text = dataToAssign;
The populateList function contains the code that will actually display the data in the list items. It consists of a simple while
loop that gets the required data from the data array and assigns it to the proper list item movie clip.
Because firstVisibleListItem
stores the index of the data element displayed in the first list item movie clip, you can use this value to determine what data should be shown in all of the list item movie clips. If, for example, firstVisibleListItem = 0
, you need to display the value of listDataArray[0]
in listItem0
, listDataArray[1]
into listItem1
, and so on. If firstVisibleListItem = 3
, you would want to display listDataArray[3]
through listDataArray[10]
. In general, the calculation firstVisibleListItem + i
will determine what data should be displayed in each list item.
The next step in the loop is to display the data obtained from the array in the appropriate list item. In this case, you assign the value of dataToAssign
to the text
property of the dynamic text field in the list item movie clip. If you're working with a more complex set of data (for example, if you want to display a thumbnail image alongside the text), this is where you would adapt the code to suit your needs.
Next, copy and paste this function below the other code in the Actions window:
function setListFocus() {
var targetMovieClip:MovieClip = list["listItem" + listItemWithFocus];
The setListFocus function sets the list item movie clip with focus to the on keyframe. Since this function turns on the proper list item clip, it is also necessary to add the complimentary function to turn off the focus of a list item movie clip whenever it is changed. Copy and paste the following code at the bottom of the Actions window:
function clearListFocus() {
var targetMovieClip:MovieClip = list["listItem" + listItemWithFocus];
At this point, the logic has been added to retrieve the data from the array, initialize and populate the list with the data. The focus of the list item movie clips has been set to the default selection of the top item in the list, and we've added the code that allows the focus to be changed (which also changes the list item graphically, using the on and off keyframes in the list item's Timeline).
In the following section we'll begin adding the code to create interactions that occur based on the user's input, so that they can step through the items in the list and select the desired item.
In this section, I'll provide the steps to make the interface interact when the user presses the soft keys on their handset. We'll need to address the ability to jump up and down in the list, as well as allowing the user to select the list item that they wish to choose.
Copy and paste this code at the bottom of the Actions window:
function pressDown() {
if (listItemWithFocus < TOTAL_LIST_ITEM_CLIPS - 1) {
} else if (firstVisibleListItem < MAX_VALUE_OF_FIRST_LIST_ITEM) {
// bottom list item has focus, but we're not at the end of
// the list, so we need to repopulate the list with new data
If you recall the earlier discussion of how the List component will function, you'll remember that we need to check for two possibilities when the down soft key is pressed:
is less than TOTAL_LIST_ITEM_CLIPS - 1
(which, in this specific example, is 7). If it is, you can change which list item has focus by clearing the focus on the item that is currently highlighted, increment the value of listItemWithFocus
, and then set the focus on the following list item.firstVisibleListItem
, and then calling the populateList()
function again.If both of these conditions fail, then you know that the focus is on the last list item in the list. Since the user has reached the very end of the list, the functions do not need to take any action.
Now we can add the function that is called when the user presses the up key on their handset. Copy and paste the following code and add it to the bottom of the Actoins window:
function pressUp() {
if (listItemWithFocus > 0) {
} else if (firstVisibleListItem > 0) {
// top item has focus, but we're not at the top of
// the list, so we need to repopulate the list with new data
The code listed above also checks for two possible conditions:
is greater than 0, change which list item has focus, rather than re-populate the list with new data from the array. This code is similar to the first condition checked in the pressDown function, except that you are decrementing the value of listItemWithFocus
, because you are moving up the list.firstVisibleListItem
is greater than 0. If it is, change the data being displayed to represent scrolling up through the list. This is similar to the second condition being checked in the pressDown function.And of course, if both of these cases fail, then you know the user has reached the very top of the list, so it is not necessary to take further action.
Finally, add this code to the bottom of the existing code, which will be called when the user presses the enter key (center soft key) to select an item from the list:
function pressSelect() {
var arrayIndex:Number = firstVisibleListItem + listItemWithFocus;
trace("Position in the array is: " + arrayIndex);
trace("The value of that element is: " + listDataArray[arrayIndex]);
This calculates the index of the selected item by adding the value of listItemWithFocus
to the value stored in the variable firstVisibleListItem
. In this example, this calculation will return a value from 0 to 25, which corresponds to the possible index values for a data array of 26 elements. When you are using the list in your application, this is where you would add the code you want to execute when the user selects a list item, instead of simply tracing the value of the selected list item to the Output window.
Since we've just added the pressUp, pressDown and pressSelect functions, we need to set up a key listener to call these functions when user interaction occurs. Add this code after the existing code:
var keyListener:Object = new Object();
keyListener.onKeyUp = function() {
var keyPressed:Number = Key.getCode();
switch (keyPressed) {
case (Key.DOWN) :
case (Key.UP) :
case (Key.ENTER) :
The script above is standard key listener code, which calls the appropriate function in response to key presses on the handset. To learn more, see the Flash Lite 2.x and 3.x ActionScript Language Reference section on key listeners.
Now we just need to add the last bit of code to initialize the list so you can test your List component. Add this code to the very end of the Actions window:
// initialize the list and scrollbar
Save the file. Test your work by selecting Control > Test Movie or by pressing Command-Return (Mac) or Control-Enter (Windows). Testing this mobile application causes Adobe Device Central CS4 to launch. When it opens, make sure that you've selected a Flash Lite 2.0-enabled device. Press the up and down soft keys to scroll through the list of items. Press Enter (or the center soft key) to display the value of the currently selected list item to the Output window.
Note: If the Output window is not open, you can open it by selecting Window > Flash Output in Device Central CS4, or by pressing Command-T (Mac) or Control-T (Windows).
The interface is responding to the soft key presses, but of course the scroll bar isn't working yet. In the last section of this article, I'll describe how to set up the scroll bar to orient users as they scroll through the list of items.
The scrollbar is an integral part of the List component, and it offers valuable insight that enhances the user's experience. As the user moves up and down through the list of items, the scrollbar moves up and down to orient users to their current location in the list of data. It also provides the user with a sense of how much of the list is visible, relative to the total size of the list. To make the scrollbar work, we need to add two more functions: one to set up the scrollbar's functionality, and another that will update the position of the slider when a new list item receives focus.
In Flash CS4, add this code after the pressSelect function and before the key listener is initialized (it could be added at the end of the Actions window as well, but this way all of the List-related functions are kept together):
function setScrollBar() {
var spacePerItem:Number = scrollBar._height / listDataArray.length;
var scrollBarHeight:Number = spacePerItem * TOTAL_LIST_ITEM_CLIPS;
scrollBar.slider._height = scrollBarHeight;
scrollBar.sliderMoveAmount = spacePerItem;
The code above accomplishes two related goals: it sets the height of the slider and it determines how many pixels the slider should move up or down as the user navigates through the list. The height of the slider is set to a percentage of the height of the scrollbar. This percentage is equivalent to the percentage of elements from the data array that are visible at any one time. In this example, there are 8 out of a possible 26 elements visible, so the height of the slider should be 8/26ths of the height of the total scrollbar area. First, the script calculates the spacePerItem
, then multiplies that value by 8 to determine the height of the slider.
The value of spacePerItem
is also the amount by which the slider should move when the scrollbar needs to move up or down. Storing that value inside the scrollbar movie clip makes it available for later use, and it also makes it easier to repurpose the scrollbar in other applications.
Here's the last piece of code you need to enter. Paste it after the setScrollBar() function
function moveScrollBar() {
scrollBar.slider._y = firstVisibleListItem * scrollBar.sliderMoveAmount;
The function above sets the _y
value of the slider based on the value of firstVisibleListItem
. This means that the slider will move only when firstVisibleListItem
changes, which occurs when the list items movie clips are re-populated with data. In these situations,either the first or the last list item movie clip has focus. Because the actual movie clip that is on does not change, it may not be immediately clear to the user that anything has changed. Moving the scrollbar slider in these situations helps to visually reinforce the fact that the display has updated in response to the user's actions by pressing the soft keys.
Test your application and see how it works. If any of the steps are still unclear, try adding some trace()
statements in the various functions to see how the variables change depending on the current state of the list. If you're getting errors you can't fix or the List component isn't working as expected, compare your code to the code in the list_finished.fla located in the sample files folder.
You now have a fully functional List component with a scroll bar to use within mobile applications. This component can now be extended and integrated into your mobile applications to create an interface for navigating a list of data.
The custom List component is completely customizable—you can change how the list item looks to match the design of your application. For example, you can:
to the appropriate value if necessary, and ensure that the list item movie clips are numbered sequentially. Review the file named list_customized.fla from the sample files folder to see an example of how to do this.listDataArray
. You'll also need to update the populateList()
function so that your image and text are properly displayed.And here are some other ways to enhance the user experience of the List component:
I hope you've found this article to be interesting and useful. If you have any questions about the List component, please feel free to contact me.
Continue to hone your Flash Lite development skills by checking out the many excellent articles and sample projects available at the Mobile and Devices Developer Center. And be sure to visit the Flash Lite section of the Mobile and Devices Developer Center to get more information about developing applications for mobile devices.


text:
Home | Register | iTrader | Members List | Calendar | Search | Today's Posts | Mark Forums Read | Store | Photo Gallery | Chat |
The Pub A friendly forum where everybody is nice, and will answer any questions you have about life. |
greatlakes4x4.com is the premier Great Lakes 4x4 Forum on the internet. Registered Users do not see the above ads.
Thread Tools | Search this Thread |
October 4th, 2012, 03:46 PM | #21 |
Senior Member
Join Date: 11-06-05
Location: Annapolis, MD and Holland MI
Posts: 1,986
iTrader: (0)
Mentioned: 1 Post(s)
I have been brought up sailing, wasn't allowed to even step foot on a powerboat until i was 12. I got out of sailing around 14 and got back into it when the old man let me take the boat out solo when i turned 16. I haven't looked back!
I ran a Hinckley out of Chicago for a season (the owner didnt even know how to sail just liked how it looked!) I raced lasers for a while got my ass handed to me because I am to fat. Raced OPB (other peoples boat) for a while but hated it so convinced the old man to come out of retirement and race his boat had a kick ass time and now sadly he is selling her and buying a motor home, so anyone looking for a retirement boat hit me up killer deal on a 12 year old catalina 380. I have now moved on and bought a cal 25 off of e-bay raced her in Annapolis for a few years before moving up here to MA. redmosquito1 what Cal did you race on over in detriot? you should look into getting back into them, if you can get over the ugly looks, they are CHEAP fun. for under $1500 you get a cabin to overnight in for up to four people and a big cockpit to sprawl out in and have cocktail hour. plus there fun! |
Sponsored Links | |||
October 4th, 2012, 04:12 PM | #22 |
Senior Member
I raced on Elusive, it was my grandparents boat. They kept it docked at the Detroit Edison boat club in the shadows of the 7 sisters for years until they got caught in a shoot out on lycaste. They moved to GPYSC I think after that. I was out every saturday and on major races every summer, best was the Cal25 Nationals up in Port Huron one year. By the time I came around the boat had seen much better days and my grandparents were getting older so we weren't the fastest, lots of fun.
My brother and I have looked into getting one lately but with work you never know when you will have to work on a race night/day and detroit is a ride. Luckily we both work for DTE so we can get a slip at the Edison boat club fairly cheap, and it's a much nicer area than back in the 80s/90s. |
October 4th, 2012, 04:25 PM | #23 |
Senior Member
I learned on a Mini Fish at 12 or so, then a butterfly, then finally stepped up to a 18' SolCat (fast frickin boat). I also spent some time on my uncle's 25' Oday and his current 27' boat. After college I crewed on a 30' catalina at a local yacht club in muskegon.
October 4th, 2012, 04:31 PM | #24 |
expert jeep disassembler
I don't enjoy it that much unless the weather is really bad. I like adreneline too much to putt around. I love it when water is coming over the sides of the boat and you are hauling ass. I am looking forward to sailing my dads New one he is restoring. It is a 36'? racing boat of some sort. I think it is an ericson but I could be waayy off. He said it is super fast even in low wind. It is built to sleep 8 crewmembers but he has taken some of the bunks out and added more creature comforts since it is usually just him and my mom.
October 4th, 2012, 05:07 PM | #25 |
Small, but talented
My Grand father used to sail canoes with the sea Cadets in Mt. Clemens. He was involved with the building of the DN60 Ice Boats.
My dad built a scaled down Lightning in his garage during the late 60's. It started back then as we would sail any chance we could. I got out for 15 years or so before buying a laser. Sailed on Big boats with my Brother. Nix, a Catalina 35, Quix after that, when the yard burnt down the owners bought Jayhawker, been on that and Carinthia both J120's. After my father passed away I decided it was time to teach my son how to sail. I bought a 1978 Chrysler Buccaneer from the original owner. Unfortunately, I've only been out a half dozen times this year. So my son, is the Son of a Son of a Son of a Sailor! |
October 4th, 2012, 05:14 PM | #26 |
I can levitate!
I grew up sailing and racing sailboats. Both big and small. I was born 1 mile from Lake Erie in NY and my dad had his big boat there. I raced Lasers, Scows, Lightnings, and did some sail boarding. My entire family races sale boats. One of my brothers worked / works for Harken. He sails all summer and races ice boats all winter. I have done a few Port Huron to Macs, raced the Queens Cup this year on an all carbon fiber Farr 50. We made it from Milwaukee to South Haven in 8 hours with 9 knots of wind. This boat hauled ass. I have a 28ft Soverel on Lake St.Clair, I raced it once this year, but it needs some updating. Thats where my brother and Harken come into play.
Here is the Farr 50: Here is my boat: |
October 4th, 2012, 05:42 PM | #27 |
expert jeep disassembler
Just walked out and took a few pictures of my dads latest project. This thing was a complete pos when he got it last year. He has an unbelievable amount of time into buffing this thing. It was the color of chalk when he got it. He has a lot of interior pieces built he is just waiting to install them until he gets the dirty work done. He is thinking that he will have it done and sailable (and out from under my lean-to) by next spring.
October 4th, 2012, 07:02 PM | #29 |
rack tap re-rack click
October 4th, 2012, 07:37 PM | #30 |
Senior Member
Join Date: 11-06-05
Location: Annapolis, MD and Holland MI
Posts: 1,986
iTrader: (0)
Mentioned: 1 Post(s)
Nice old ericson your dads re-doing there. The old gel coat is very resilient when buffed out. Looks like he has an old winch farm there as well on board she will sail fine!
So what's the name of the Farr 50' I am so bummed I missed this years queens cup!! Where does your bro work for Harlem over in WI? I am friends with a few of the Harlem folks. Great group of people to know! I am shocked so many people on here sail I never would have guessed! |
October 5th, 2012, 06:30 AM | #34 |
I'm not old, honest...
Well since people are adding family, my brother has been racing for over 40 years. Everything from Hobie's to Tartan 10 & others. He's been a member of CSYC for at least 20 years. He races mostly Lake St Clair but has done a couple of the bigger races but prefers single/double handed stuff. I would guess he has raced 2-3 times a week for at least 20 years. He's had a variety of titles (which I don't have the exact terminology for) which have included the grand pubah of the St Clair & Lk Huron race coordinator & a bunch of other crap where they get all dressed up to go to events.
October 5th, 2012, 07:29 AM | #35 |
I can levitate!
The Farr 50 was Pinball Wizard out of Chicago, it used to be named Ragamuffin. Yes, my brother lives near Milwaukee, heused to work at Harken in technical sales, now he has a small company that does all of their prototype water jet cutting. He is friends with Peter and Olaf and alot of the guys at Harken.
Thread Tools | Search this Thread |


text:
Brock and Salk
Seahawks have one of NFL's deepest receiver corps
By Danny O'Neil
The Seahawks have one of the most run-oriented offenses in the NFL yet they boast one of the league's deepest groups of receivers.
They have four different players who caught 45 or more passes in at least one of the past two seasons yet Seattle is one of only five teams that hasn't had a single player surpass 1,000 yards receiving since 2007.
2012 stats for the top four wide receivers on Seattle's depth chart:
Percy Harvin (MIN) | |
Catches: | 62 |
Yards: | 677 |
Yards per catch: | 10.9 | Touchdowns: | 3 |
Sidney Rice | |
Catches: | 50 |
Yards: | 748 |
Yards per catch: | 15 | Touchdowns: | 7 |
Golden Tate | |
Catches: | 45 |
Yards: | 688 | Yards per catch: | 15.3 | Touchdowns: | 7 |
Doug Baldwin | |
Catches: | 29 |
Yards: | 366 |
Yards per catch: | 12.6 | Touchdowns: | 3 |
Those are just some of the contradictions you must wade through in order to project the impact that can be expected from one of those more expensive pieces of real estate on Seattle's roster. Terrell Owens has had a 1,000-yard receiving season more recently than any Seahawk player, a fact that's not necessarily going to change this year even after the team's addition of Percy Harvin.
Seattle's offense will be built around the run. Coach Pete Carroll hasn't wavered from that mandate since he was introduced as the Seahawks coach, and yet receiver is where Seattle has been most predisposed to spending large chunks of money over the past three years.
Remember, this is a team that flirted with Brandon Marshall before he left Denver in 2010, sniffed around Vincent Jackson when he was still with the Chargers before ultimately signing Sidney Rice as a free agent in 2011. Rice isn't even halfway done with his five-year contract, and the Seahawks took the single biggest risk of general manager John Schneider's tenure by trading three draft picks for the privilege of paying Harvin a top-shelf contract.
It's not as hard to sketch out the likely depth chart at receiver as it is to estimate the production Seattle will get from that position. After all, only San Francisco ran the ball a greater percentage of the time than the Seahawks did last season, but the addition of Harvin adds to Seattle's down-the-field options, and expect Seattle to be more aggressive over the top in 2013.
It will be the quality of the opportunities, not the quantity of throws that will determine the effectiveness of Seattle's receivers.
Roster locks: Harvin, Rice, Golden Tate.
Seattle has kept an average of 5.5 receivers at the 53-man roster cut since 2002.
2012: | 6 |
2011: | 6 |
2010: | 5 |
2009: | 5 | 2008: | 6 |
2007: | 6 |
2006: | 5 | 2005: | 7 | 2004: | 6 | 2003: | 4 | 2002: | 5 |
Rice played all 16 games last season for only the second time in his NFL career, and he led the Seahawks with 50 catches, seven of which were touchdowns. He turns 27 this year, and the fact he's 6 feet 4 makes him stand out for Carroll, who's had a great deal of success with big targets.
To understand Seattle's plan for Harvin, you need to look at the structure of his contract. He counts $4.9 million against the Seahawks' cap this year, but that charge balloons to over $13 million in 2014. That means he'll jump toward the top of the payroll next season, which could squeeze Rice out of his current deal barring a huge season.
There's no doubt about Tate making this roster, but he is the biggest uncertainty in the future of Seattle's offense. He will be an unrestricted free agent after this season, and while the team believes he can thrive alongside Harvin, it's fair to wonder if Seattle is planning to pay another sub-6-foot playmaker.
Safe bets: Doug Baldwin, Chris Harper.
It's hard to see either of these players failing to make the roster, but it's also hard to project their roles.
Baldwin had a great offseason after injuries held him back in training camp a year ago, and two years after leading the team with 51 catches as a rookie, he's fighting to hold onto his opportunities in the slot after the addition of Harvin. Baldwin has shown he can be an invaluable target on third down, but just as surely, he wants more than that.
Danny O'Neil looks at where the Seahawks stand at each position group heading into training camp.
At 230 pounds, Harper is a bigger-bodied receiver, but after looking impressive during the three-day rookie minicamp after the draft, he didn't do much to stand out during the offseason practices. While he may have been a fourth-round pick, he's still going to have to play his way into the receiving rotation.
Sixth sense: The Seahawks have kept six receivers each of the previous two seasons. Whether they do so again may depend upon the status at other positions, especially if Seattle opts to keep both Michael Robinson and Spencer Ware at fullback.
Charly Martin made the team a year ago with an impressive training camp. Stephen Williams is an imposing target the team tried to sign in 2011 as an undrafted free agent only to lose him to Arizona, while Jermaine Kearse made his way onto the field last year largely because of his value on special teams. Another candidate is Bryan Walters, a Juanita High graduate who was previously with the Chargers. Greg Herd, Arceto Clark, Brett Swain, Justin Veltung and Phil Bates will also be trying to springboard training camp into a regular-season job.


text:
Top Definition
Elfyn is the best elf in the wood. He is often very fat and can be seen rolling through the forest rather than walking. He has the strangest laugh which makes other people laugh and before you know it, everyone in the forest is laughing!
There was an Elfyn in the woods the other day.
by Tilly G
June 13, 2011
The Urban Dictionary Mug
One side has the word, one side has the definition. Microwave and dishwasher safe. Lotsa space for your liquids.
Buy the mugThe Urban Dictionary T-Shirt
Smooth, soft, slim fit American Apparel shirt. Custom printed. 100% fine jersey cotton, except for heather grey (90% cotton).
Buy the t-shirt