text:
Ran into an interesting and esoteric problem today when working with a client. This client had a legacy ASP.NET 2.0 application deployed on IIS6 that used global themes. First, a little background…
A theme is: "a collection of property settings that allow you to define the look of pages and controls, and then apply the look consistently across pages in a Web application, across an entire Web application, or across all Web applications on a server." Themes commonly include images and CSS files, the latter of which are automatically added to the  section of an ASP.NET page that uses said theme. Typically, themes are placed in the App_Theme folder within the web application; however, it is possible to create global themes that can be used across multiple websites on a single web server. When using global themes, the themes are placed in the aspnet_client/system_web/version/Themes folder, located at the webserver's root (typically C:\Inetpub\wwwroot).
My client had been using IIS6 and global themes. In particular, the theme contained both images and CSS files, along with skins. The CSS files were all located in a subfolder of the theme named styles and the images in a subfolder named images, resulting in a directory structure like so:
MyTheme | |-- images | | | |-- image1.png | |-- image2.png | |-- ... | |-- styles | | | |-- main.css | |-- admin.css | |-- ... | |-- GridView.skin |-- DetailsView.skin |-- ...
When configuring a page to use MyTheme, the page's rendered markup would automatically include references to the CSS files defined in the MyTheme\styles subfolder (main.css, admin.css, etc.). This worked swimmingly when used as a global theme in IIS6 or when used directly in the App_Themes folder (on both IIS6 and IIS7). However, when my client deployed to IIS7 using global theme structure above the CSS files were not included in the web page. There were no errors when visiting the page, but it clearly wasn't styled.
After some poking and prodding I decided to try moving the CSS files out of the styles subfolder and into the MyTheme folder (alongside the skin files) and, voila, the CSS files were automatically included in the rendered page's output. As to why the theme structure above works as a global theme in IIS6, as to why it works when deployed to the App_Themes folder in both IIS6 and IIS7, but as to why it does not work as a global theme is IIS7 is anyone's guess. The good news is that there is a workaround and it is pretty straightforward.
Happy Programming!
A couple weeks ago I had a client call me up with a perplexing build error. He had an ASP.NET 4 Web Application project open in Visual Studio 2010 that he was working on when, suddenly, the following error cropped up when building:
Resource name 'xxx.resources' cannot be used more than once.
There was no line number, just this error message. According to my client, the project built fine minutes before the error started appearing and, in the interim, he had not made any changes that he was aware of: he had not changed any code; had not created any new web pages; had not deleted anything; had not changed the project's settings.
Unfortunately, we were unable to find much help online. While there are a lot of messageboard posts and blog entries noting this error, most of them were in the context of duplicate key names in resource files – my client's project was not using resource files.
Anyway, we banged our heads on it for a good hour before we finally chose the nuclear option: start excluding files one by one, building after each one, and see if the error goes away. A ham-fisted approach for sure, but one that would likely identify the culprit.
Eventually we got to the obj folder – why was that part of the project? The obj folder As we started working through the files, I noticed in Solution Explorer that the obj folder holds temporary build files, including .resource files. I presume that when building the project Visual Studio was attempting to create the same files that were already part of the project, and hence the error. In any event, excluding the obj folder from the project did the trick. Once it was omitted the project built without error.
So how did this happen? My client likes having the "Show all files" option turned on in the Solution Explorer. My guess is that he inadvertently right-clicked on the excluded obj folder and clicked the "Include in project" option. Or something, because he said he did not intentionally add the folder to his project. Regardless, its presence caused the build to choke and removing it fixed everything.
Thought I would share this experience here so others would have another possible avenue to check in the event that they receive this build error.
In a recent project we needed to block a series of IP addresses from accessing our website. IIS makes this easy with its IPv4 Address and Domain Restrictions feature, which lets the webmaster specify specific or ranges of IP addresses that are either allowed or denied access to the website. See Configure IPv4 Address and Domain Name Rules for more information.
After blocking the IP addresses of interest we wondered, how often are those blocked addresses attempting to access the website? Whenever IIS blocks an IP address it returns a particular HTTP status code - 403.6. Therefore, if we could search the IIS log files for all requests that returned a 403.6 status code we would know what banned IP addresses were attempting to access what pages and when.
Of course we weren't at all interested in manually pouring through the log files. Fortunately, there is Log Parser. Log Parser is a free command-line tool from Microsoft for searching through IIS log files using a SQL-like syntax. We ended up using the following command, which provides the IP address, the requested URL, and the local date/time of the blocked request ordered from the most recent blocked request to the oldest. The results are outputted as a CSV file. (Note: the extra spaces and carriage returns in the below command are for readability only; remove this whitespace before attempting to run the command from the command line.)
LogParser.exe -i:W3C "SELECT c-ip as IP, cs-uri-stem as URL, TO_LOCALTIME(TO_TIMESTAMP(date, time)) AS DateTime FROM c:\inetpub\logs\LogFiles\W3SVC1\* WHERE TO_STRING(sc-status) = '403' AND TO_STRING(sc-substatus) = '6' ORDER BY TO_LOCALTIME(TO_TIMESTAMP(date, time)) DESC" -o:CSV
Note the SQL-like syntax – very easy to read and understand for a DBA or developer who works regularly with SQL. Log Parser supports the standard SQL clauses, including GROUP BY clauses. Log Parser also supports a variety of output types. Above I request the data to be outputted as a CSV (see the –o:CSV switch) but I could have chosen the output as an XML file, a grid – even a chart!
For more on Log Parser, along with some common queries, check out the following resources:
There is also a Samples folder that is included when you install Log Parser with dozens of sample queries.
ASP.NET has long offered the FileUpload control, which simplifies uploading a file from the client's computer to the web server's file system. This control provides a very simple, straight-forward user experience – the browser renders a "Browse" or "Select File" button that, when clicked, brings up a dialog box from which the user can select a file from her computer. Behind the scenes, the FileUpload control renders as an <input type="file" /> HTML element and sets the WebForm's encoding type to multipart/form-data. The <input type="file" /> HTML element is what instructs the browser to render the file upload interface and the multipart/form-data encoding type instructs the browser to send the form's contents (including the binary contents of the selected file) to the server as a multipart MIME message, which allows for transmission of binary data.
Recently, I was working on a web page where users needed the ability to upload a variable number of files. While most users would only upload a single file, some would need to upload two, while others three, four, or possibly more. Since a single FileUpload control can upload only a single file, one option was to add four (or five or six) FileUpload controls on the page, but that would crowd the page and be overkill for the majority of users who only needed to upload a single file. We considered using a third-party file upload control (such as SlickUpload) that would supports richer upload scenarios, including multifile uploads, but ended up with a simpler solution that involved a bit of HTML and jQuery.
In particular, we had the page initially contain a single <input type="file" /> HTML element. Next, we added an "Upload another file" link that, when clicked, executed JavaScript that dynamically added another <input type="file" /> HTML element to the DOM. Additionally, we added a "Remove" link next to each <input type="file" /> HTML element that, when clicked, removed the associated file upload user interface from the DOM.
Here is a demo of this concept. First the HTML. Note that there is a form whose enctype attribute is explicitly set to multipart/form-data. Inside the form is a paragraph with an id of uploadUI and an "Upload another file" link with the id of addFileUpload. There's also a Button Web control (btnUpload) that, when clicked, will postback the form, submitting the file contents to the server. We'll see how to access the uploaded files from server-side code shortly.
<form id="form1" runat="server" enctype="multipart/form-data">

 [Upload another file...]

 <asp:Button ID="btnUpload" runat="server" Text="Upload Files" onclick="btnUpload_Click" />
 </form>
The bulk of the content in this page is the JavaScript that creates and removes the <input type="file" /> HTML elements in response to the user clicking the "Upload another file" and "Remove" links. Each file upload user interface is comprised of:
The file upload user interface is added by the createFileUpload function. The
 element (and its containing elements) are added to the end of the uploadUI paragraph.
var uploadControlCounter = 0;
function createFileUpload() { $("#uploadUI") .append( $("
") .attr("id", "fileContainer" + uploadControlCounter) .append( $("<input />") .attr("type", "file") .attr("name", "file" + uploadControlCounter) ) .append(" ") .append( $("") .attr("href", "#") .attr("class", "removeUpload") .text("Remove") ) ); uploadControlCounter++; }
In the $(document).ready event handler I wire up the click event handlers for the "Upload another file" and "Remove" links, as well as add the initial file upload user interface. Note that for the "Remove" links I use the delegate behavior for jQuery's on function because I want this event handler to fire for not just the current "Remove" links (which there are none), but for all "Remove" links that may be added to the DOM at a later point in time.
$(document).ready(function () { $("#addFileUpload").click(function (e) { e.preventDefault(); createFileUpload(); }); $("#uploadUI").on("click", "a.removeUpload", function (e) { e.preventDefault(); $(this).parent().remove(); }); // Start by creating one file upload createFileUpload(); });
When the user clicks the "Upload Files" button their browser will make a request back to the page sending the selected files' contents. We can inspect the set of uploaded files on the server-side by looping through the Request object's Files collection. The Request.Files property is a collection of HttpPostedFile objects, which have properties that provide the file name, content type, content length, and a stream to the raw binary data. In my demo I loop through the Request.Files collection and for each file save it to the ~/Uploads folder, but since you have access to the raw uploaded binary data via the HttpPostedFile object's InputStream property you could do whatever it is you needed to do, such as save the contents to a database, inspect the contents in memory, and so on.
// Save each upload and redirect user to thank you page for (int i = 0; i < Request.Files.Count; i++) { HttpPostedFile file = Request.Files; string filePath = Server.MapPath("~/Uploads/" + Path.GetFileName(file.FileName)); using (FileStream streamToDisk = File.Create(filePath)) { file.InputStream.CopyTo(streamToDisk); streamToDisk.Close(); } }
That's all there is to it! You can download the complete demo from http://scottonwriting.net/demos/MultiFileUpload.zip
One of ASP.NET MVC's most useful features is its powerful templating system. Templates were introduced with ASP.NET MVC 2 as a way to have the view render either a display- or editing-related user interface for the entire model or for a property of the model. The Html.DisplayFor and Html.EditorFor methods provide a strongly-typed mechanism for rendering the appropriate template for a particular model property:
@Html.DisplayFor(model => model.PropertyName) @Html.EditorFor(model => model.PropertyName)
For an in-depth overview of templates in ASP.NET MVC, see Brad Wilson's multi-part article series, ASP.NET MVC 2 Templates. (The content in Brad's articles apply the same to ASP.NET MVC 3.)
ASP.NET MVC includes a number of built-in display and editor templates. For instance, when rendering a display or editing template for a Boolean value ASP.NET MVC will render either a disabled or enabled checkbox. When rendering a display template for an email address, ASP.NET MVC will render an actual mailto: anchor tag so that the email address is clickable. The editor template for a password property renders an <input type="password" /> textbox so that the user's input is masked. Additionally, you can create your own custom display and editor templates.
The Html.DisplayFor and Html.EditorFor methods, when called, need to determine which template to render for the given property. To make this determination these methods examine the specified property's metadata, which includes information like the property's data type (bool, string, int, etc.) along with attributes decorating the model properties. For instance, in your model you can decorate a property with a DataType attribute to inform the view and the templating system the type of data this property expresses. In the following model, the property Password is decorated as a password data type, while the Bio property is decorated as a multiline text input (which will render a multiline textbox for this property's editor template).
public class MyModel { ... [DataType(DataType.Password)] public string Password { get; set; } [DataType(DataType.MultilineText)] public string Bio { get; set; } ... }
Specifically, the Html.DisplayFor and Html.EditorFor methods consult the following metadata in this order:
Creating a custom template in ASP.NET MVC is a breeze. Simply add DisplayTemplates and EditorTemplates subfolders to the Views\Shared folder. Then add a view file (e.g., .cshtml) to the subfolder with the name of the template. You can override the default templates by naming the template with the same name as the data type to override – such as String.cshtml or DateTime.cshtml – or you can give it a unique name – such as YesNo.cshtml – in which case you specify the template to use via the UIHint attribute. The custom template is a view that defines the incoming model via the @model directive and emits the desired output.
ASP.NET MVC's default display template for Boolean values renders a disabled checkbox, but replacing it with the text "Yes" or "No" is quite simple to do when using templates. Start by adding a new template to the Views\Shared\DisplayTemplates folder named YesNo.cshtml with the following content:
@model bool @if (Model) { <text>Yes</text> } else { <text>No</text> }
The display template starts by defining the incoming model's type (bool) via the @model directive. Next, it emits the literal string "Yes" if the incoming value (Model) is true, "No" otherwise. That's all there is to it!
At this point we have the display template defined, but no view will use it unless we specifically instruct it to do so. (In other words, ASP.NET MVC will continue to use its default display template for Boolean values, which is the disabled checkbox.) To instruct a particular model property to use our display template rather than the default, use the UIHint attribute like so:
public class MyModel { ... [UIHint("YesNo")] public bool ReceiveNewsletter { get; set; } ... }
With those two pieces of the puzzle in place – the template itself and the UIHint attribute – a view will render the text "Yes" or "No" when using the following code:
@Html.DisplayFor(model => model.ReceiveNewsletter)
What about editing? Here we need to create a new template file with the same name (YesNo.cshtml) in the Views\Shared\EditorTemplates folder and then add the following content:
@model bool @Html.DropDownList("", new SelectListItem[] { new SelectListItem() { Text = "Yes", Value = "true", Selected = Model }, new SelectListItem() { Text = "No", Value = "false", Selected = !Model }})
As with the display template, we start by defining the incoming model's type (bool) via the @model directive. Then we render a drop-down using the Html.DropDownList method. This drop-down is composed of two select options – Yes and No with the values true and false, respectively. The first item is selected if the incoming value (Model) is true, while the second option is selected if the incoming value is false.
And we're done! The screen shot below shows the output of a Boolean value when decorated with the [UIHint("YesNo")] attribute and displayed using the Html.EditorFor method.
While I like to consider myself a web developer, every now and then I have to put on my DBA hat to address some SQL related issue. This little script has saved my butt more than once. It searches the text of triggers, UDFs, stored procedures and views for a particular substring, returning the name and type of those database objects that match.
DECLARE @Search varchar(255) SET @Search='text_to_search' SELECT DISTINCT o.name AS Object_Name,o.type_desc FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id=o.object_id WHERE m.definition Like '%'+@Search+'%' ORDER BY 2,1
The above script is one of many in my "bag of scripts" I've collected over the years. This particular gem was snagged from Stackoverflow: How to find a text inside SQL Server procedures / triggers?
On Saturday September 24th I'll be doing two four-hour ASP.NET MVC 3 and Razor training events in San Diego:
Both classes will be held at the University City Center office building, which is located on the 805 off the Governor St. exit (directions and map). And for both classes, students receive electronic access and printed copies of the training materials. Parking is free and coffee, snacks and lunch are provided.
To sign up, or to see a detailed outline for each course, please visit http://fuzzylogicinc.net/InDepth
Hope to see you there!
In conjunction with the Los Angeles .NET Developer's Group I will be presenting a full day, hands-on lab/presentation/training event on ASP.NET MVC 3 Tips, Tricks, and Best Practices on Saturday, August 27th. The event is a 8 hour training with breakfast and lunch served. Attendees are asked to bring their own laptop and participate in a hands-on session. This event is geared for developers already familiar with ASP.NET MVC.
Event: LADOTNET Master Series: ASP.NET MVC3 – Tips, Tricks, and Best Practices with Scott Mitchell Date: Saturday, August 27th, 2011 Cost: $50.00 – signup Location: Outlook Amusements 2900 W. Alameda Ave, Suite 400 Burbank, CA 91505 [Map] Abstract:
When building an ASP.NET MVC application developers are faced with a lot of questions. What comprises the Models in MVC? What techniques are available to build simple, yet powerful views? How best to keep your controllers from ballooning in size? And what sort of busywork and tedium can be offloaded to tools? In this all-day, hands-on event, attendees start with a "baseline" ASP.NET MVC 3 application and together, we will add new features. Along the way we'll explore a variety of tips and best practices. We'll encounter pain points and discuss and implement various solutions. Topics will range from high-level, over-arching ones like options for building a domain model and persistence layer, to ones very specific to ASP.NET MVC, like creating and using custom display and editor templates in your views. And there will be plenty of hands-on experience with popular open source tools like AutoMapper. This talk is tailored for developers who are already familiar with core ASP.NET MVC concepts and are comfortable building ASP.NET MVC applications.
Signup at: http://mastersseries004.eventbrite.com/
In a recent project the client wanted a masked textbox for the textboxes on the page collecting currency information. Moreover, he wanted the user's input to automatically be displayed as a formatted currency value in the textbox after entering their value. (Check out a live demo of my script…) But first things first, let's see how to create a currency masked textbox.
There are a number of existing masked input plugins for jQuery. After trying some out I decided to roll my own JavaScript functions. I intend to come back to these and turn them into jQuery plugins, but for now they're just JavaScript functions. As you can see in the script below, I created four functions:
In addition to the allowed characters discussed above, the functions also permit "special character key codes," namely Delete, Backspace, left arrow, right arrow, Home, End and Tab. What keycodes are valid are listed in the variables at the top of the script; see Javascript Char Codes for a table listing the keys and their corresponding key codes.
Here is the script of interest:
// JavaScript I wrote to limit what types of input are allowed to be keyed into a textbox var allowedSpecialCharKeyCodes = [46,8,37,39,35,36,9]; var numberKeyCodes = [44, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105]; var commaKeyCode = [188]; var decimalKeyCode = [190,110]; function numbersOnly(event) { var legalKeyCode = (!event.shiftKey && !event.ctrlKey && !event.altKey) && (jQuery.inArray(event.keyCode, allowedSpecialCharKeyCodes) >= 0 || jQuery.inArray(event.keyCode, numberKeyCodes) >= 0); if (legalKeyCode === false) event.preventDefault(); } function numbersAndCommasOnly(event) { var legalKeyCode = (!event.shiftKey && !event.ctrlKey && !event.altKey) && (jQuery.inArray(event.keyCode, allowedSpecialCharKeyCodes) >= 0 || jQuery.inArray(event.keyCode, numberKeyCodes) >= 0 || jQuery.inArray(event.keyCode, commaKeyCode) >= 0); if (legalKeyCode === false) event.preventDefault(); } function decimalsOnly(event) { var legalKeyCode = (!event.shiftKey && !event.ctrlKey && !event.altKey) && (jQuery.inArray(event.keyCode, allowedSpecialCharKeyCodes) >= 0 || jQuery.inArray(event.keyCode, numberKeyCodes) >= 0 || jQuery.inArray(event.keyCode, commaKeyCode) >= 0 || jQuery.inArray(event.keyCode, decimalKeyCode) >= 0); if (legalKeyCode === false) event.preventDefault(); } function currenciesOnly(event) { var legalKeyCode = (!event.shiftKey && !event.ctrlKey && !event.altKey) && (jQuery.inArray(event.keyCode, allowedSpecialCharKeyCodes) >= 0 || jQuery.inArray(event.keyCode, numberKeyCodes) >= 0 || jQuery.inArray(event.keyCode, commaKeyCode) >= 0 || jQuery.inArray(event.keyCode, decimalKeyCode) >= 0); // Allow for $ if (!legalKeyCode && event.shiftKey && event.keyCode == 52) legalKeyCode = true; if (legalKeyCode === false) event.preventDefault(); }
My script is, admittedly, very US-centric. I have not tested the key codes with a non-English keyboard and for currencies I only allow a dollar sign. For the project I wrote this script for this is (currently) a non-issue since it is used within the corporate firewall and all sales are domestic, but clearly the above script would not work as well for international settings.
With the above script in place you can have a textbox on the page mask its input by having the appropriate function called in response to the keydown event. The following jQuery syntax wires up this logic to all single-line textboxes that have the CSS class currenciesOnly.
$(document).ready(function () { $("input[type=text].currenciesOnly").live('keydown', currenciesOnly); });
That's it!
Another requirement my client had was to format the just-entered number as a currency. That is, to change the user's input – say, 45000 – to a formatted value like $45,000.00 immediately after their tabbed out of the textbox. To accomplish this I used Ben Dewey's jQuery Format Currency Plugin, which you can see a demo of at http://www.bendewey.com/code/formatcurrency/demo/. This plugin adds a formatCurrency function that you can call on a set of elements returned by a jQuery selector.
To use this plugin I updated the $(document).ready event handler shown above to also call the formatCurrency function on blur:
$(document).ready(function () { $("input[type=text].currenciesOnly").live('keydown', currenciesOnly) .live('blur', function () { $(this).formatCurrency(); } ); });
In short, whenever a textbox with a CSS class of currenciesOnly is blurred, the just-blurred textbox's inputs are formatted as a currency thanks to the formatCurrency function.
And that's all there is to it, folks.
To see a live demo of the above code, check out this jsfiddle script: http://jsfiddle.net/CBDea/1/
About month ago at a user group meeting the guy sitting across from me shared the tale of a talk he had attended. The speaker's laptop had downloaded a slew of Windows Updates in the background, after which the "Restart your computer to finish installing important updates" dialog box appeared. The speaker unwittingly clicked the "Restart now" button, which closed the presentation and displayed those ominous words: "Please do not power off or unplug your machine… Installing update 1 of 43." But how many speakers have the distinction of not only crashing their own system, but in addition the laptops of dozens of others in the audience? I am now among those hallowed ranks.
On Saturday I presented another full-day ASP.NET MVC 3 training event in Los Angeles. Attendees were encouraged to bring their laptops and to follow along as I presented the material. At one point, I was creating a demo and writing some HTML in the _Layout.cshtml file. After typing in some HTML I switched from the _Layout.cshtml file to a controller at which point Visual Studio froze on me. Hard. And with vengeance. I quickly apologized and launched Windows Task Manager to kill VS and restart it.
As Visual Studio was restarting I heard a rising murmur from the crowd – many other people just had Visual Studio crash on them, too! Several people were following along with me key stroke for key stroke and had experienced the same crash. Lovely. I asked the audience to humor me and I tried to reproduce the crash again, but had no luck. But clearly whatever sequence of events caused Visual Studio to crash was deterministic seeing that several other people had the same experience when following the same steps.
So the next time you are at a conference or user group and are swapping stories of speaker flubs or miscues, feel free to tell them about this one guy who not only crashed his own demo, but was so bad that also he crashed dozens of other laptops in the audience.
My latest article on DotNetSlackers looks at how to create Excel spreadsheets using NPOI. NPOI is a free, open-source .NET library for creating and reading Excel spreadsheets and is a port of the Java POI library. In the article I show how to use NPOI to programmatically export data into a spreadsheet with multiple sheets, formatting, and so on. Specifically, my demos look at having a set of objects to export – for example, a set of Linq-to-Sql entity objects – and then crafting an Excel spreadsheet by enumerating those objects and adding applicable rows and columns to the spreadsheet.
Recently, I needed the ability to allow for more generic exports to Excel. In one of the web applications I work on there is an Excel Export page that offers a number of links that, when clicked, populate an ADO.NET DataTable with the results of a particular database view, generate a CSV file, and then stream that file down to the client with a Content-Type of application/vnd.ms-excel, which prompts the browser to display the CSV content in Excel. This has worked well enough over the years, but unfortunately such data cannot be viewed from the iPad; however, the iPad can display a native Excel file (.xls). The solution, then, was to update the code to use NPOI to return an actual Excel spreadsheet rather than a CSV file.
To accomplish this I wrote a bit of code that exports the contents of any ol' DataTable into an Excel spreadsheet using NPOI. It's pretty straightforward, looping through the rows of the DataTable and adding each as a row to the Excel spreadsheet. There were, however, a couple of gotcha points:
To demonstrate exporting a DataTable to Excel using NPOI, I augmented the code demo available for download from my DotNetSlackers article to include a new class in the App_Code folder named NPoiExport, which you can download from http://scottonwriting.net/demos/ExcelExportToDataTable.zip. This class offers an ExportDataTableToWorkbook method that takes as input a DataTable and the sheet name to use for the Excel workbook. (If there are multiple sheets needed, the second sheet is named "sheetName – 2," the third, "sheetName – 3," and so forth.)
The ExportDataTableToWorkbook method follows:
public void ExportDataTableToWorkbook(DataTable exportData, string sheetName) { // Create the header row cell style var headerLabelCellStyle = this.Workbook.CreateCellStyle(); headerLabelCellStyle.BorderBottom = CellBorderType.THIN; var headerLabelFont = this.Workbook.CreateFont(); headerLabelFont.Boldweight = (short)FontBoldWeight.BOLD; headerLabelCellStyle.SetFont(headerLabelFont); var sheet = CreateExportDataTableSheetAndHeaderRow(exportData, sheetName, headerLabelCellStyle); var currentNPOIRowIndex = 1; var sheetCount = 1; for (var rowIndex = 0; rowIndex < exportData.Rows.Count; rowIndex++) { if (currentNPOIRowIndex >= MaximumNumberOfRowsPerSheet) { sheetCount++; currentNPOIRowIndex = 1; sheet = CreateExportDataTableSheetAndHeaderRow(exportData, sheetName + " - " + sheetCount, headerLabelCellStyle); } var row = sheet.CreateRow(currentNPOIRowIndex++); for (var colIndex = 0; colIndex < exportData.Columns.Count; colIndex++) { var cell = row.CreateCell(colIndex); cell.SetCellValue(exportData.Rows[rowIndex][colIndex].ToString()); } } }
Whenever a new sheet needs to be generated – either when starting or when the maximum number of rows per sheet is exceeded – the CreateExportDataTableSheetAndHeaderRow method is called. This method creates a header row, listing the name of each column in the DataTable.
protected Sheet CreateExportDataTableSheetAndHeaderRow(DataTable exportData, string sheetName, CellStyle headerRowStyle) { var sheet = this.Workbook.CreateSheet(EscapeSheetName(sheetName)); // Create the header row var row = sheet.CreateRow(0); for (var colIndex = 0; colIndex < exportData.Columns.Count; colIndex++) { var cell = row.CreateCell(colIndex); cell.SetCellValue(exportData.Columns[colIndex].ColumnName); if (headerRowStyle != null) cell.CellStyle = headerRowStyle; } return sheet; }
Here's how you would go about using the NpoiExport class to export a DataTable and then stream it down to the client:
The following code snippet illustrates the above four steps.
// Populate the DataTable var myDataTable = new DataTable(); using (var myConnection = new SqlConnection(connectionString) { using (var myCommand = new SqlCommand()) { myCommand.Connection = myConnection; myCommand.CommandText = sqlQuery; using (var myAdapter = new SqlDataAdapter(myCommand)) { myAdapter.Fill(myDataTable); } } } // Creat the NpoiExport object using (var exporter = new NpoiExport()) { exporter.ExportDataTableToWorkbook(myDataTable, "Results"); string saveAsFileName = string.Format("Results-{0:d}.xls", DateTime.Now); Response.ContentType = "application/vnd.ms-excel"; Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", saveAsFileName)); Response.Clear(); Response.BinaryWrite(exporter.GetBytes()); Response.End(); }
That's all there is to it. The screen shot below shows an example of the exported report. Note that it lacks the nice formatting, auto-sized columns, and other bells and whistles that are possible with NPOI when constructing a report by hand (as I showed in Create Excel Spreadsheets Using NPOI), but it does make exporting data to Excel an exercise of just a few lines of code. And its exported data that can be opened and viewed from an iPad.
The above Excel spreadsheet was created using the ad-hoc query:
SELECT CategoryName AS [Category], Description, (SELECT COUNT(*) FROM Products WHERE Products.CategoryID = Categories.CategoryID) AS [Product Count] FROM Categories WHERE CategoryID >= 3
Download: http://scottonwriting.net/demos/ExcelExportToDataTable.zip
In conjunction with the Los Angeles .NET Developer's Group I will be presenting a full day, hands-on lab and training event on ASP.NET MVC 3 on Saturday, May 21st. The event is a 8 hour training with breakfast and lunch served. Attendees are asked to bring their own laptop and participate in a hands-on session. This event is geared for intermediate to experienced web developers new to ASP.NET MVC (or just new to ASP.NET MVC 3 and the Razor syntax).
Over the course of the day we'll explore MVC fundamentals, step through the process of building an ASP.NET MVC application, and implement common web application scenarios, such as: creating master/detail reports; working with forms; and building Create/Read/Update/Delete screens (CRUD). We'll also explore interesting and powerful ASP.NET MVC tools and features, including scaffolding, partial views, layouts and layout sections, and more.
Event: LADOTNET Master Series: ASP.NET MVC3 with Scott Mitchell Date: Saturday, May 21st, 2011 Cost: $50.00 – signup Location: Outlook Amusements 2900 W. Alameda Ave, Suite 400 Burbank, CA 91505 [Map] Abstract: In this all-day, hands-on event attendees will build a complete, functional and interesting data-driven website over the course of the day using Microsoft's ASP.NET MVC 3 framework and the new Razor syntax. Signup at: http://www.eventbrite.com/event/1553162551?utm_source=eb_email&utm_medium=email&utm_campaign=new_eventv2&utm_term=eventurl_text
Like many ASP.NET developers, I am most comfortable working with C# and VB. I know just enough HTML and CSS to be dangerous. I know enough to implement the overarching page layout without using
s and instead to use CSS to position, size, and float the elements on the page, but when it comes to certain user interface designs within a page I'm quick to use
s. For instance, if asked to create a contact form like the one pictured below, my first inclination would be to use a trusty
.
Recently, my friend and colleague Dave Yates showed me a website he had helped design and implement, StonehengeStyle. I was particularly interested when Dave showed me the contact page, which contained very clean, terse, readable markup without the use of
s.
First, each right-aligned text label – Name, Phone, and so on - is implemented as a  element. The input elements for collecting the input are simply <input>, <textarea> or <select> elements. For example, the markup for the Name, Phone, and Email Address inputs follows. (Note: I removed the required indicator for brevity; view the contact form's markup in your browser for the complete markup.)
Name <input name="name" type="text" id="name" class="textfield" /> Phone <input name="phone" type="text" id="phone" class="textfield" /> Email Address <input name="email" type="text" id="email" class="textfield" />
Couldn't be simpler, right? No filler
 or
 elements, no
s cluttering things up. Heck, no
s, even.
The layout of the  and <input> elements is handled in the CSS via the following rules. First, all  elements are styled such that they are 180 pixels wide with 3 pixel padding on the top, 10 pixel padding on the right, and 2 pixel padding on the bottom. Their text is right-aligned and they clear left floating elements, which is why each  appears beneath the one above it.
label { clear: left; float: left; padding: 3px 10px 2px; text-align: right; width: 180px; }
The textfield, textarea, and selectlist CSS classes, which assigned to <input>, <textarea>, and <select> elements in this contact form, specify a width of 250 pixels with a bottom margin of 8 pixels.
.textfield, .textarea, .selectlist { font-family: Arial,Helvetica,sans-serif; font-size: 12px; margin: 0 0 8px; width: 250px; }
And that's all there is to it! Pretty simple and straightforward.
This may not be terribly exciting for seasoned web developers or designers, but for someone like me, with just a working knowledge of HTML and CSS, this markup/CSS pattern is a gem and is how I've started doing my contact forms and other similar in-page layouts.
Warning! This blog post is long and rife with navel-gazing.
In 1998 I started an ASP resource site, 4GuysFromRolla.com. Toward the tail end of the dotcom boom I sold 4Guys to Internet.com, but continued working as the editor and primary contributor for the site, writing a new article each week. This arrangement continued until just recently. My last article for 4Guys has been written – Use MvcContrib Grid to Display a Grid of Data in ASP.NET MVC.
My first exposure to web programming came in 1998 working at Empower Trainers and Consultants, a mid-sized consulting and training firm with locations in Kansas City, St. Louis, and Nashville. At the time I was an inexperienced, nervous, 19 year old sophomore at the University of Missouri-Rolla (UMR) who had landed an 8-month internship with Empower at their Kansas City location. My first assignment was to add some new features to the internal timekeeping tool, a custom-build data-driven web application powered by SQL Server and ASP. At the time I had done some rudimentary HTML development, but had zero experience with JavaScript, ASP, and SQL.
Needless to say, I found ASP enthralling. The ability to quickly create an application that could be shared with the world amazed me then as it continues to amaze me to this day. At the time there weren't many online resources for learning more about ASP. As my internship drew to an end I decided that once I got back to school I would start my own site rich with ASP information.
Upon returning to university I cajoled three good friends into starting a website, 4GuysFromRolla.com. The idea was that the site would boast four sections:
If you couldn't guess, we were four witty computer nerds (with an emphasis on the nerd part).
In September 1998 4GuysFromRolla.com went live. Over time, the other three guys lost interest and moved onto other projects. By the time I graduated in May 2000, 4GuysFromRolla.com was run by one guy from Rolla and focused strictly on ASP.
The dotcom boom reached its fever pitch in 2000. Companies were paying $5,000 a month for a little 125x125 banner to appear on the 4Guys homepage and $500 for a two sentence text ad to appear in the weekly newsletter, not to mention the thousands of dollars per month companies were dropping to have their animated 468x60 banners in the rotation to appear at the top of each article. The spending frenzy also extended to the acquisitions side, as numerous ASP resource sites were gobbled up by larger players.
In late 2000 I decided to "cash out." 4Guys was sold to Internet.com.
I wrestled with the decision on whether to sell the site or not for a long time. On one hand, 4Guys was my baby and I had poured uncounted hours into it over the previous three years. Having seen how sites like 15Seconds.com fared after their acquisition, I knew that selling 4Guys would be akin to signing its death warrant. When a larger company buys a smaller site it's not uncommon for the original founders to exit stage right, either immediately or in the very near term. When that happens, and when the acquirer starts to turn the screws in an attempt to better monetize their purchase, the inevitable happens – the site withers on the vine, traffic languishes, and the death knell is sounded. On the other hand, by late 2000 I think it was pretty apparent to everyone that the dotcom boom was coming to an end.
In the end, I decided to sell. The sales price reflected more than five years of dotcom boom revenue, which I deduced would be more like ten or more years of revenue once the boom ended. At age 22, five to ten years is an unimaginable window of time. I wondered, Would I be interested in writing about ASP ten years hence? Would I even be using ASP or web-based technologies? Since the answers to those questions were "maybe," I decided to take the bird in the hand over the two in the bush.
Of course, here we are, 11 years later, and I am still actively involved in ASP.NET and the ASP.NET community and, until recently, was still writing for 4Guys. If I had it to do over again (and knowing what I know now), I would not have sold the site. Hindsight is 20/20. But that's not to say that I regret the decision to sell the site – I don't. In fact, I still hold that it was the right decision at the time given the unknowns.
The dotcom boom heralded an interesting time in the history of the web. At its peak, billions of dollars were spent buying traffic, or "eyeballs," as it was commonly referred to back then. In 2000, companies like Internet.com and DevX (among many others) were buying technology resource sites not for their content or talent, but for their existing traffic. This was a workable business model at the time due to the high rates advertisers were paying. Unfortunately, it was not sustainable once the bottom dropped out of advertising.
In 2009, Internet.com and its hundreds of technology-focused websites were sold to QuinStreet for $18 million. I continued working on 4Guys for QuinStreet (until recently). Unfortunately, QuinStreet's purchase was a continuation of the buying eyeballs business model as evidenced by the lack of investment in the purchased web properties. 4Guys retained its dated look and feel as even more ads were squeezed onto the page.
Sites like 4Guys were sold by Internet.com to QuinStreet for pennies on the dollar. Even at such a steep discount, the question remains: did QuinStreet overpay? Time will tell.
After the sale of 4Guys to Internet.com in 2000 I continued on as the site's editor and primary contributor, authoring an article each week. Despite my continued work on the site, 4Guys started to lose prevalence in the ASP.NET community. There were many times I talked to a developer at a User Group or at a conference who would say something nice like, "I taught myself classic ASP from your articles on 4GuysFromRolla.com - I used to go there all the time." The message was always the same – a meaningful compliment that had embedded in it a reflection on the current state of the site - I used to visit 4Guys.
There are probably a lot of different reasons why the importance and relevance of 4GuysFromRolla diminished over the years. Some of the reasons I've arrived at include:
Of all of the reasons listed above only one of them falls on my shoulders, namely my slow move away from VB to C#. But perhaps there are other factors that are my fault that my ego is blinding me from. I do believe that the quality of writing that has appeared on 4Guys has improved over the years. When I read some of the articles I wrote while I was still in school (1998-2000) I cringe. Also, I posit that the articles' topics are (relatively) timely and of interest to ASP.NET developers. (To be fair, I was a bit late to jQuery and ASP.NET MVC, but once I jumped on that bandwagon I wrote quite a bit on said topics.)
The increased attempts and monetization and dated look and feel falls on Internet.com and QuinStreet's shoulders. The last three factors were out of everyone's control and affected all websites, not just those in my little corner of the web. And those macro changes, while perhaps detrimental to the growth of a site like 4Guys, are net gains for the Internet (and humanity) as a whole.
Neither QuinStreet nor Internet.com has ever provided me with traffic numbers so I don't have any hard data to back up my thoughts on this, but my presumption is that 4Guys is still used by hundreds of thousands of developers around the world each month, but that it's become less and less relevant as time has gone on. Today, I imagine that most people reach 4Guys from a Google search or from a link posted on an old messageboard or newsgroup thread. Few visit the site to see what new content is available or because a coworker told them that it's a great website for ASP.NET developers of any stripe.
Yes, there are still many who find a solution to their problem on 4Guys, but few say, "How do I do X? I bet 4Guys has the answer!"
Is it just me, or is this blog post getting a little depressing? How about some fun 4Guys trivia.
For those who have never been to Rolla, it is about an hour and a half west of St. Louis, located square in the middle of nowhere. The university in Rolla focuses on engineering and the sciences and the student body is predominantly male. Many people wonder how I had the time to write nearly 750 articles while a student at UMR. The answer is that I went to school in the middle of nowhere with no girls - free time was not something that was hard to find!
When we started 4Guys, one of the other 4Guys created the site design. It had a black background with gray text and these bubbles that spanned the top and right of each page with links to each of the four sections. Together, we redesigned the site in 1999 to give it a more professional look. It was at this time that 4Guys adopted teal as its primary color. After acquiring the site, Internet.com did a resign in 2002. The redesign made the site a bit more graphics heavy and added some curved doodads here and there. I always found the 4Guys logo that Internet.com's design team created to be hilarious.
The guy on the left looks depressed and ostracized from the group. The guy on the right wants nothing more than a big group hug. And those two guys in the middle? They look like a couple of real a-holes. Too cocky and arrogant to console their melancholy friend on the left, and too cool for school to hug the guy on the right. Jerks.
My time with 4Guys has now come to an end. It was a fun and unforgettable run. I fondly remember huddled around a computer monitor with the other three guys from Rolla as we tried to decide on a domain name. I remember the excitement of landing my first advertiser and of depositing that first check. And I won't forget the many emails from fellow developers who wrote in to thank me for an article that helped them solve a vexing problem. But most of all, my memories will center around writing the 4Guys article each week – drumming up a topic, banging out some code, and then putting that code into prose.
Having written a 4Guys article each of the preceding 650 or so weeks, it will be odd not to do so this week. Or next week. Or ever again.
Farewell, old girl, it was a good run.
Boggle is a word game trademarked by Parker Brothers and Hasbro that involves several players trying to find as many words as they can in a 4x4 grid of letters. At the end of the game, players compare the words they found. During this comparison I've always wondered what about missed words. Was there some elusive 10-letter word that no one unearthed? Did we only discover 25 solutions when there were 200 or more?
To answer these questions I created a Boggle solver web application (back in 2008) that prompts a user for the letters in the Boggle board and then recursively explores the board to locate (and display) all available solutions. This Boggle solver is available online - fuzzylogicinc.net/Boggle. My family uses it every time we get together and play Boggle. For more information on how it works and to get your hands on the code, check out my article, Creating an Online Boggle Solver. In November 2010, I updated the code to make it more Ajax-friendly; see Updating My Online Boggle Solver Using jQuery Templates and WCF for details.
While playing a game of Boggle I found myself wondering how many total available words are present in a typical game of Boggle, and how many total points are available. It soon dawned on me that I could answer this question using my Boggle solver application and a the Monte Carlo method. My Boggle solving engine has a GenerateBoard method that randomly assembles a legal Boggle board. By generating tens of thousands of random Boggle boards, running them through my solver, and recording the number of words and total points available I could arrive at a good approximation for the average number of words and points in a given game of Boggle. (Scroll to the bottom of this blog entry if all you care about is the average number of words and points per game.)
I started by creating a new class in my Boggle solving Class Library, which I named GameLogger. This class has a single method, LogGame, which takes an inputs the BoggleBoard object that was used to find the solutions and the BoggleWorldList object that comprises the set of solutions to the accompanying BoggleBoard. This method then inserts a record into a database table (boggle_Boards) that logs:
The code for my Monte Carlo simulator is brain-dead simple – create a new Boggle game, solve it, then log it, and do this until I tell you to stop.
while (true) { var gt = GameTiles.OfficialBoggleGameTiles(); var board = new BoggleBoard(3, gt.GenerateBoard()); var solutions = board.Solve(); GameLogger.LogGame(board, solutions); }
Let the above code run for 5 minutes and you've got tens of thousands of solved, random Boggle boards in the database from which you can now ascertain average number of words and score.
The following query returns the average number of solutions and score for games allowing words with 3 of more letters:
SELECT AVG(CAST(NumberOfSolutions AS decimal)), AVG(CAST(Score AS decimal)) FROM dbo.boggle_Boards WHERE MinimumWordLength = 3
Which comes out to:
Average # of words: 66.82 Average score: 93.25
If we compute the average number of words and points for games requiring four or more letters we get, expectedly, lower results. For such games you can expect, on average, 42.12 words and 68.30 points.
So, next time you break out Boggle, keep in mind that, on average, there are nearly 67 words hiding there, ready for you to find. And after time expires, be sure to use my Boggle solver to see all the words that were present!
Note: Of course, these results are based on the dictionary that my Boggle solver uses. My dictionary may permit or deny certain words that you deny or allow, in which case these averages would be skewed. Unfortunately, I am unaware of where I got my dictionary file. I downloaded it from some website many years ago. I know many word-based games use the Enhanced North American Benchmark Lexicon as their dictionary. I am not using this but would like to integrate it at some point in the future…


text:
Welcome to Channels.com. Your Web Video DVR.
Never miss an episode of great Web video shows like:
Click the button to add it to your Channels Playlist (it's just like recording a Season Pass on your home DVR).
[LESS INFO] 1 VIEWS | ADDED 05:17:51 10/01/12 On CBN Newswatch Oct. 1: Two conservative cases the Supreme Court refuses to hear, expectations ahead of this week's presidential debate, California's ban on gay "conversion" therapy, and more.
[LESS INFO] 2 VIEWS | ADDED 16:09:03 09/28/12 On CBN Newswatch Sept. 28: Hostility against religion growing in the U.S., details behind the deadly Sept. 11 attack in Libya, Middle East hackers suspected of attacking U.S. banks, and more.
[LESS INFO] 1 VIEWS | ADDED 05:57:55 09/27/12 On CBN Newswatch Sept. 27: Why some are skeptical of recent presidential election polls, Israel's Prime Minister warns U.N. leaders on Iran, new campaigns to stop abortion in the African-American community, and more.
[LESS INFO] 0 VIEWS | ADDED 05:13:10 09/26/12 On CBN Newswatch Sept. 26: Iran's leader addresses the U.N., students across the nation pray during "See You at the Pole" events, parents protest school birth control access, and more.
[LESS INFO] 0 VIEWS | ADDED 14:56:25 09/25/12 On CBN Newswatch Sept. 25: President Obama addresses Muslim violence to the U.N., U.S. congressional candidates hold the first-ever Spanish debate, Indonesia churches kicked out of their buildings, and more.
[LESS INFO] 1 VIEWS | ADDED 06:22:03 09/24/12 On CBN Newswatch Sept. 24: Deadly Distraction? Election Eclipsing Muslim Crisis, Grand Canyon University Wins Free Christian Campus, and more.
[LESS INFO] 4 VIEWS | ADDED 06:26:27 09/21/12 On CBN Newswatch Sept. 21: Pakistan protests on 'Love for the Prophet Day,' Hispanic voters question the presidential candidates on immigration, the latest on Chick-fil-A's marriage controversy.
[LESS INFO] 3 VIEWS | ADDED 05:02:23 09/20/12 On CBN Newswatch Sept. 20: Possible release of the man convicted of the '93 World Trade Center terrorist attack, debate over an Obama campaign poster resembling the American flag, the latest on an investigation of the botched 'Fast and Furious' gun probe, and more.
[LESS INFO] 5 VIEWS | ADDED 07:14:30 09/19/12 On CBN Newswatch Sept. 19: Reaction to claims that Jesus had a wife, new information about the failed 'Fast and Furious' gun probe, anti-Semitism on the rise in Europe, and more.
[LESS INFO] 4 VIEWS | ADDED 06:11:12 09/18/12 On CBN Newswatch Sept. 18:
[LESS INFO] 5 VIEWS | ADDED 06:28:24 09/17/12 On CBN Newswatch Sept. 17: Americans evacuate as Muslims continue violent protests against an anti-Islam film, Prime Minister Netanyahu urges the U.S. to elect a president who's firm with Iran, David Brody interviews vice presidential candidate Paul Ryan, and more.
[LESS INFO] 12 VIEWS | ADDED 05:59:33 09/14/12 On CBN Newswatch Sept. 14: Questions surrounding America's handling of threats in Libya, a look at rising violent protests across the Mideast, women react to the so-called GOP "war" against them, and more.
[LESS INFO] 26 VIEWS | ADDED 06:08:13 09/13/12 On CBN Newswatch Sept. 13: An update on the recent U.S. embassy attacks, security measures being taken, and the film causing the outrage among Muslims.
[LESS INFO] 23 VIEWS | ADDED 12:10:22 09/12/12 On CBN Newswatch Sept. 12: Reaction to the embassy attack killing the U.S. ambassador to Libya, Christian companies stifled by political correctness, Hobby Lobby files suit against the president's birth control mandate, and more.
[LESS INFO] 28 VIEWS | ADDED 06:18:58 09/11/12 On Tuesday's CBN Newswatch Sept. 11: Americans pay tribute to lives lost on 9/11, how the Chicago teachers strike is impacting students, former CIA Director James Woolsey talks national security with CBN News, and more.
[LESS INFO] 26 VIEWS | ADDED 06:06:17 09/10/12 On CBN Newswatch Sept. 10: The latest on Pastor Youcef Nadarkhani after he's freed from an Iranian prison, parts of New Orleans struggling to bounce back from Isaac, NASCAR fans vow to make a difference at the polls for the GOP, and more.

subset: commoncrawl


text:
Get youngsters out of stroller more, student urges
05/09/2012 7:00am
A U of U grad student wants families to get young children out of the stroller more when they are outside.
7-Eleven robber escapes with little cash
05/09/2012 7:29am
Police are searching for a masked gunman who robbed a convenience store early this morning but didn't get away with much money.
The business behind getting published
05/09/2012 8:23am
When Ka Hancock caught her first glimpse of a
laptop in 1985, she said to her husband that
it would be perfect for writing a novel. He
jokingly responded that the chances of her
being published were one in 64 million. But
this spring, Hancock beat those odds and
published her first book with one of the
world's most prestigious publishing houses.
8-year-old 'Batman' alerts adults to house fire
05/09/2012 9:00am
An 8-year-old Layton boy dressed as his
favorite superhero, Batman, played the part
when fire broke out in his neighborhood last
'Will of the people' won in 2012; Will it again?
05/09/2012 9:03am
With record turnout, the State of Utah
benefited from a much more accurate
reflection of the "will of the people" at this
year's caucuses, but will it carry over?
Facebook could lead to financial stress
05/09/2012 11:48am
Could constantly logging on to Facebook lead to financial stress? According to a recent report, people may feel a sense of financial failure when they look at all of the things their friends are able to do.
5-year-old boy kidnapped, quickly retrieved by mother
05/09/2012 12:39pm
A 5-year-old boy was kidnapped for a short time Wednesday morning, only to be quickly found by his mother, who was able to wrest her son from the kidnapper.
Nordstrom rooftop fire called accidental
05/09/2012 1:33pm
Crews extinguished a small fire on the roof of Nordstrom at City Creek Center in downtown Salt Lake City Wednesday.
Local Happenings with the YMCA, the Ring of Fire, and Crucial Fest
05/09/2012 3:59pm
Find out all that's happening and coming up soon in Utah.
Man pleads guilty in 2011 murder of Wendover classmate
05/09/2012 4:29pm
A 19-year-old West Wendover man pleaded guilty Wednesday to brutally murdering a high school classmate.
First responders prepare at Governor's safety summit
05/09/2012 6:03pm
How prepared are our emergency responders in
dealing with terrorist bombings, earthquakes,
chemical suicides similar disasters?
Sugar House breaks ground on new streetcar line
05/09/2012 6:12pm
It's "back the future," as the streetcar makes a comeback across the country and right here in Utah. A groundbreaking ceremony Wednesday marked the official start of construction on the new Sugar House streetcar line.
Ogden man builds, collects amazing cars
05/09/2012 6:54pm
The rocket car gets Mike Bachman, a man known for building and rebuilding many cars, the most attention. It's built from an old bomber fuel tank. It's got a grenade at the end of the gear shift, and the fuel tank is an old beer keg that you can see on the inside.
Ailing father spends time recording memories for daughter
05/09/2012 6:56pm
A young St. George father is facing a reality he never thought possible: his daughter could grow up without him. But rather than let that thought get him down, he's working as hard as he can to create memories she can hold onto once he's gone.
Political experts say Ind. senator's defeat isn't the end for Hatch
05/09/2012 7:25pm
With a longtime Indiana senator falling to a tea party conservative in a Republican primary election this week, some wonder whether the same fate awaits Sen. Orrin Hatch. But local political experts don't think ti will have much effect on Hatch's race.
Bad brakes, driver impairment contribute to fatal auto-pedestrian crash
05/09/2012 8:35pm
A West Valley City man is charged with misdemeanor drug possession and driving an unsafe vehicle in connection with a fatal car crash that killed two women Friday.
New Geneva Road provides Utah County alternative to I-15
05/09/2012 8:53pm
This is the time of year a lot of road
construction projects get started. But a major
project has just reached completion, and it
could make it easier to get around Utah County.
Classmates mourn 2 killed in car accident near Hunter High
05/09/2012 9:09pm
Two Hunter High School students were killed
Wednesday when two cars collided just north of
the intersection at 4100 South and 5600 West.
Alleged victims testify against Steven Powell in voyeurism trial
05/09/2012 9:24pm
Despite all the talk about Susan Cox Powell and Josh Powell, the trial of Steven Powell is really about two young girls. Wednesday, those girls had their day in court.
Teens forced to navigate through over-sexualized world of apparel
05/09/2012 10:05pm
While parents and teens have argued about
fashion for generations, the push to sexualize
teens seems more pervasive than ever. And
experts say the consequences last a lifetime.
Wolf Creek Resort going up for auction
05/09/2012 10:14pm
It is one of northern Utah's scenic gems, just minutes from downtown Ogden, and it's for sale.
Opioid abuse a big problem for Utah
05/09/2012 10:40pm
Chances are you or someone you know is being affected by prescription drug abuse. Hundreds of Utahns die each year from prescription drug overdose, and some of them are children who are too young to even know what they're getting into.
What a difference a year makes for Utah campgrounds
05/09/2012 10:59pm
Last winter, snowfall on the Wasatch Front
piled up and broke records, forcing
to open later in the season. This year, we
ended up at the other end of the snow gauge
the campgrounds will soon be up and running.
DNA testing leads to arrest in rape case
05/09/2012 11:23pm
Police have arrested a man who they say
committed a violent rape in January.
Site Index
KSL's Children's Television Programming Reports, as well as its FCC public inspection file, are available for viewing during regular office hours at the KSL Broadcast House or online.
The station representative who can assist a person with disabilities with issues related to the content of the public files is Mike Dowdle, available during regular office hours at firstname.lastname@example.com and (801) 575-5555.
The station representative who can assist a person with disabilities with issues related to the content of the public files is Mike Dowdle, available during regular office hours at email@example.com and (801) 575-5555.
© 2013 ksl.com | KSL Broadcasting Salt Lake City UT | Site hosted & managed by Deseret Digital Media - a Deseret Media Company v05


text:
LinkBack | Thread Tools |
12-14-2012, 04:08 PM | #1 (permalink) |
Senior Member
Join Date: Aug 2012
Location: The New Jersey Shore (Ocean County)
Posts: 348
Fun with Captions
In responce to Remy's moms request, I am starting a captions thread. I am sure there are others but this one is new. So the rules are:
Take some pics of your pup Add some clever captions post them here and laugh with everyone else. I am not good with photo editing so I used PAINT! I know they are not up to par but ****, it will work for now. I will be getting photoshop later and hopefully i can figure that out. Anyways here are the first of HOPEFULLY many!!!!!!!!!!
Sponsored Links | |||
Advertisement |
12-14-2012, 05:22 PM | #2 (permalink) |
Senior Member
Join Date: Dec 2012
Location: Texas
Posts: 291
LOL i like those!
I posted these already, but oh well..
Remington "Remy"(3/4/12) - My little "pistol" came into my life April 17th, and I haven't been happier since! -If there are no dogs in Heaven, then when I die I want to go where they went. |
12-14-2012, 07:08 PM | #3 (permalink) |
Knighted Member
Join Date: Feb 2011
Location: Near Atlantic City, NJ
Posts: 2,892
Linda & Gunner 9/14/08 "The reason I talk to myself is because Im the only one whose answers I accept." ~ George Carlin http://www.youtube.com/GSDGunner |
12-14-2012, 07:40 PM | #4 (permalink) |
Elite Member
Join Date: Dec 2010
Location: Canada
Posts: 1,943
This is the face Hunter makes when you say "BUNNY!"
~ Angel SG S-Hunter vom Geistwasser CGN TT RATI (DM Clear) AIRPORT WILDLIFE & BIRD CONTROL K9 http://www.k9instinct.com |
12-14-2012, 09:43 PM | #7 (permalink) |
Knighted Member
Join Date: Jun 2010
Location: North Ga, USA
Posts: 3,179
Made this one a while back with my dog and other members' dogs:
My girl and my mom's lab mix: Not a shepherd, buuut: My friend's dog: And my baby xD:
Kymmey Mom To~ Dakoda (b/t GSD), Simi (b/w DSH), Nashoba (sable GSD)
12-15-2012, 08:58 AM | #9 (permalink) |
Master Member
Join Date: Jan 2011
Location: Florida Keys
Posts: 808
I love these. You guys are so talented. I have to learn to do this. Where is my daughter who is a computer expert when I need her.
Teri Snake Vom Eselspfad RN CGC (AKA Raina) 3/5/08 Pyrate CGC 4/1/03-5/16/12 RIP Too many to list waiting at the bridge but remembering them all |
Sponsored Links | |
Advertisement |
Thread Tools | |


text:
Why The Video Looks Shaky (Don Ward)
Updated: 06/18/2013 - We did a quick helicopter tour of the Black Forest burn area. Someone asked why the video looks shaky.
The Manitou Springs Mountain Music Festival begins Friday, August 24 and runs through Sunday, August 26. This is the 30th anniversary of this free festival. Enjoy 21 hours of music from 12 bands, food vendors, art and crafts, and activities for children.
Burger King is helping us cool down from the summer heat with a 50-cent vanilla soft serve cone. That's half the normal price. The deal is good through the end of August, but make sure your local restaurant is participating.
Military families can enjoy the "boys of summer" for free. The Sky Sox is holding a "Military Appreciation Night" on Wednesday, August 29. The game starts at 6:05 p.m. Contact your installation for ticket information.
Get a free download of the book "The Adventures of Tempest and Serena." It's about two sisters with very different views on returning back to school from summer break. You can only download it for free on Friday, August 24 and Sunday, August 26.
Please remember, all offers are subject to availability and product providers may end these offers at any time.
Sign up for our free, weekly E-Newsletter Click Here To Sign Up For The Here's The Deal E-News Letter
KKTV firmly believes in freedom of speech for all and we are happy to provide this forum for the community to share opinions and facts. We ask that commenters keep it clean, keep it truthful, stay on topic and be responsible. Comments left here do not necessarily represent the viewpoint of KKTV 11 News.
If you believe that any of the comments on our site are inappropriate or offensive, please tell us by clicking "Report Abuse" and answering the questions that follow. We will review any reported comments promptly.
powered by DisqusUpdated: 06/18/2013 - We did a quick helicopter tour of the Black Forest burn area. Someone asked why the video looks shaky.
Updated: 05/20/2013 - Two weekends left to catch one great show!
Updated: 05/14/2013 - I'm still focused on meeting my goal of doing a pull-up. And I'm almost there! But I'm always getting this question:
Updated: 04/17/2013 - Crossing the finish line is such an awesome moment. It's hard to imagine what it has been like for the runners in Boston.
Updated: 04/09/2013 - Admittedly, there are days that I just don't feel like working out. But then I met Viola. And if she can make working out a priority at 99, then none of us have any excuses! Here's how she's living a FIT LIFE:


text:
Worcester Business Journal
Delivering news and opinion for the Central Massachusetts business community. All Business, All the Time…
in print, online and in person.
For Thank You Gifts EXCLUSIVE to specific shows please listen online or tune in to 90.5FM on your radio!!
Become a WICN Member
Please pledge now and give what you can afford – for the value you find in WICN.
YOU really do make everything you hear possible on this station. Pledge Now!
Call 508-752-0700 right now or contribute online! CLICK HERE to take a look at our thank-you gifts.


text:
'); } -->
4 bed, 2 full bath. Wow, designer purchased this property and reworked and updated for a stunning home. Vaulted ceiling More info |
4 bed, 2 full bath, 1 half bath. Four bedroom, two and a half bath home boasts a great location in a quiet neighborhood. The master More info |
4 bed, 2 full bath, 1 half bath. Nicely maintained on a lovely lot. New laminate flooring in kitchen, family room, and 3 bedrooms. M More info |
4 bed, 3 full bath, 1 half bath. This very special home, built by David Roeshot, is situated in the heart of Centre Hills & offers a More info |
5 bed, 4 full bath, 2 half bath. Enjoy many a warm evening on the large front porch of this very spacious two-story home in one of S More info |
3 bed, 2 full bath. Location, location, location. Privacy abounds just moments to downtown, campus and stadium. Solid c More info |
4 bed, 2 full bath. The Village of Lemont is home to this stately Cape Cod home with 4 bedrooms, 2 baths, an office, a More info |
3 bed, 2 full bath. This gorgeous split entry 3 bedroom, 2 bath home is located in a mature development convenient to P More info |
3 bed, 2 full bath. Very nice 4 sided brick with tons of charm. This 3 bedroom 2 bath home has a first floor master bed More info |
3 bed. More info |


text:
[ Source: tcltk-defaults ]
Package: tk (8.5.0-2.1)
Links for tk
Debian Resources:
Download Source Package tcltk-defaults:
- Debian Tcl/Tk Packagers (QA Page, Mail Archive)
- Francesco Paolo Lovergine (QA Page)
- Sergei Golovan (QA Page)
Similar packages:
The Tk toolkit for Tcl and X11 (default version) - run-time files
Tk is a cross-platform graphical toolkit which provides the Motif look-and-feel and is implemented using the Tcl scripting language.
This package is a dependency package, which depends on Debian's default Tk version (currently 8.5).
Other Packages Related to tk
Download tk
Architecture | Package Size | Installed Size | Files |
all | 4.7 kB | 7.0 kB | [list of files] |


text:
Your supply list has been updated.
You can access your supply list from the Account section at any time, or you can click here to view it now.
Ortho® MAX® Fire Ant Killer Broadcast Granules
Prevents fire ants for 6 MONTHS!
Ortho® Fire Ant Killer Mound Treatment
We apologize, but this product is no longer available.


text:
USA English
Log In/Register | My Bio-Rad | Contact Us | Help | Corporate
This automated platform for nucleic acid and protein analysis incorporates LabChip technology into an integrated system that performs multiple electrophoresis steps in one. Software analysis tools are offered for flexible data analysis
The Experion automated electrophoresis system fits into many workflows, including before real-time qPCR, protein interaction experimentation with the ProteOn XPR36 interaction array system, or a variety of microarray experiments. It can also be used with sample preparation and optimization or the purification of proteins using laboratory-scale or process-scale chromatography.
Call us at 1-800-4-BIORAD (1-800-424-6723)


text:
Fox 2000 Hires Michael Elliott to Write WAITING TO EXHALE Sequel GETTING TO HAPPY
by Brendan Bettinger Posted: July 25th, 2012 at 7:48 pm
Fox 2000 has hired Michael Elliott (Just Wright) to write the script for Getting to Happy, the sequel to 1995′s Waiting to Exhale. Forest Whitaker directed Waiting to Exhale, an adaptation of the novel by Terry McMillan that followed the relationship between four black women played by Angela Bassett, Whitney Houston, Loretta Devine, and Lela Rochon. The sequel novel revisits the four core character fifteen years later when "each is at her own midlife crossroads." THR reports McMillan took the first pass at adapting Getting to Happy and Lori Laken Hutcherson worked on the script before Elliott took over.
It will be interesting to see how the studio proceeds after the death of Houston in February. The rumor mill says Oprah Winfrey might assume the role, but there is nothing concrete yet. In fact, there is no word on whether any cast is returning, including notable Exhale cast members Dennis Haysbert, Mykelti Williamson, Giancarlo Esposito, Donald Faison, and Wendell Pierce. Hit the jump for the book synopsis for Getting to Happy and the Waiting to Exhale trailer.


text:
You are currently viewing the beta version of the new AMM site. Click here to return to the current site.
Dec 29, 2010 | 01:22 PM |
The U.S. decision to pursue a dispute settlement with China on wind power subsidies at the World Trade Organization (WTO) could have multiple benefits for the domestic steel industry and the United Steelworkers union.
The Obama administration last week called on the WTO to investigate whether Chinese wind power manufacturers are receiving illegal subsidies. The USW on Sept. 9 filed a 5,800-page trade case, known as the "301 petition," outlining China's abuses in the "green energy" sector. The case seeks settlement on issues related to Chinese restrictions on access to critical materials; its practice of prohibited subsidies contingent on export performance or domestic content; discrimination against imported goods and foreign firms; technology transfer requirements for foreign investors; and trade-distorting domestic subsidies.
To access AMM's full content, please log in below. If you do not have an AMM account, we invite you to take a free trial or subscribe below.
Access to amm.com editorial content is granted only to paid subscribers and trialists. If you do not have an active account in your own name, please either subscribe or take a trial and you will have instant access to amm.com content. Sharing your login credentials with individuals who are not subscribers represents a violation of AMM copyright.
Every morning, every minute no matter how often you follow the markets, there's an AMM subscription to fit your needs.
Not sure if you are ready to invest in a subscription right now? Take a free, no-obligation trial. Start your free trial today.
What is causing the most weakness to the U.S. metals industry?
June 20-21, 2013 New York
Our industry and the U.S. economy are not realizing the full benefits of (higher steel demand) due to recent significant surges of imported tubular products.
--Mario Longhi, U.S. Steel


text:
Seared scallops and quinoa are a great combination for an easy seafood dinner that is under 250 calories per serving. This impressive seafood recipe of seared scallops is quick and delicious.
Jalapeño, garlic, capers and feta cheese give this spaghetti squash lots of flavor without lots of calories. This tasty spaghetti squash is a great gluten free recipe too.
Egg drop soup just got better, and healthier, with this delicious version packed with healthy chickpeas and greens. This quick soup recipe can be ready in 30 minutes.
St. Joseph Mercy Oakland | 44405 Woodward Avenue, Pontiac, Michigan 48341 | 248-858-3000


text:
Web pages that are archived on the Web are not subject to the Government of Canada Web Standards. As per the Communications Policy of the Government of Canada, you can request alternate formats. Information identified as archived on the Web is for reference, research or recordkeeping purposes. It has not been altered or updated after the date of archiving.
Public Service Alliance of Canada and Communications Security Establishment, Department of National Defence
Before: Y. Tarte
Appearances: Decided without an oral hearing
Decision rendered: September 29, 1997
Designation of positions having safety or security duties – Subsection 78.1(6) of the Public Service Staff Relations Act – Technical Category – Extension of time to notify occupants – pursuant to subsection 78.1(4) of the Public Service Staff Relations Act (PSSRA), the parties met to review each position in the bargaining unit to determine whether any of them have safety or security duties as specified in subsection 78(1) – in due course, the employer pursuant to subsection 78.1(5) provided the Board with a statement of the positions that the parties had determined do not have safety or security duties – the employer also advised the Board that the parties had reached agreement on the positions which have safety or security duties – the Board designated these positions pursuant to subsection 78.1(6) of the PSSRA – in addition, the parties requested the Board to extend the 30-day time limit specified in subsection 60(1) of the P.S.S.R.B. Regulations and Rules of Procedure for notification of the incumbents of the designated positions – pursuant to section 78.5 of the PSSRA, the Board authorized the employer to inform the employees occupying the designated positions – also pursuant to section 6 of the Regulations, the Board extended the time within which an employee is to be informed of the fact that he or she occupies a designated position to a period of 30 days from the date of a request for conciliation under section 76 of the PSSRA – thereafter future occupants shall be notified within 30 days of the date on which they occupy the position.
Positions designated.


text:
0cart: $0.00
Previous Page
[x] Close Window
Send your friend(s) a link to this product along with a personal message!
Your Name:
Your E-mail:
To: (your friend's email)
Your Message:
Cc me
Please enter the text below:
Overall Rating: Read all reviews | Write a review
Our Price: $18.00
Product ID: #74901
Hippie Owl Pull-String Pinata (202388)
In Stock
Most orders placed by 3 PM CST will ship same day.
3 Reviews - Overall Customer Rating:
1 Ratings Only Reviews - Rating:
Show all reviews | Write a review | Show reviews with photo(s) | Show reviews with video(s)
Reviewed by: Bernie03
(Read all my reviews)
Title: Fun Purchase
Date: Feb 05, 2012
My daughter wanted a pinata for her birthday party. Since her birthday was in January, I wasn't sure what the weather would be like. So we went with a pull string pinata that could be done inside. The kids had a blast! Best of all, it made the birthday girl very happy!
Report this review as Inappropriate
Was this review helpful to you? Yes | No
Reviewed by: happycamper777
Title: Great Pinata
Date: Oct 09, 2011
This pinata looked good & was well made. I would suggest having the kids pull all the strings at once though instead of one at a time. The bottom was too tough to open with the force of one string at a time, so in the end we still had to bust it open with a stick. I was trying to avoid that; it was the whole reason we bought a "pull string" pinata in the first place. Even still, I'd say it was a nice product; I would recommend it.
Show all reviews
© CelebrateExpress.com. All Rights Reserved.CEWEB01


text:
The Observer 1 |
Previous | 1 of 12 | Next |
small (250x250 max)
medium (500x500 max)
large ( > 500x500)
Full Resolution
All (PDF)
This page
faraingdalo Public Library 274 Main S t . r vu , AN OFFICIAL NEWSPAPER OK THE INCORPORATED VILLAGE OF FARMINGDALE Jfarmtttguale © tenter Election Results 10* SERVING GREATER FARMINGDALE. BETHPAGE & MELVILLE Vol. 4 No. 12 Second Class Postage has been paid at Farmingdale, N. Y. 11735 Thursday, November 10, 1966 GOP SWEEPS F'DALE BY BIG MARGIN Farmingdale Republicans were jubilant on Tuesday evening as Governor Nelson A. Rockefeller carried everyone of the 17 election districts by wide margins. The unofficial count gave him 5,008 votes to 3,120 for Frank O'Connor. The Conservative vote on the gubernatorial level was 1,486 for the Conservatives and 639 on the Liberal side. Even the traditionally Democratic 35th E. D. in South Farmingdale went into the Republican column when Rockefeller polled 290 votes to O'Connor's 260. Rockefeller's margin was only surpassed by Attorney General candidate Louis Lefkowitz who racked up a 5,909 count to 2,799 votes polled by Frank A. Sedita. Supreme Court Justice Howard T. Hogan, a Republican candidate for delegate to the Constitutional Convention was next with 5,361 votes. John J. Burns, running for a similar post polled 5,158 votes. Congressman James R. Grover Jr. won by a count of 4,818 to 3,148 for his Democratic opponent Frank M. Corso. Assemblyman Martin Ginsberg, of the 8th A. D. who was up for reelection in eight of the Farmingdale 17 districts, polled 2777 on both Republican and Liberal lines to Robert J. Connolly's 1,577, by unofficial count. In the Ninth Assembly District which takes in nine Farmingdale election districts, Frank McCloskey polled 2,640 to Stuart R. Gordon's 2,291 votes. Conservative Candidate Frank M. Wells received 598 votes. The only win on the Democrat column was garnered by Arthur Levitt for State Comptroller, who received 4,839 on the Democrat column and 561 on the Liberal line. In the only Election District in Farmingdale which takes in the Fourth Congressional District^ Congressman John W. Wydler polled 348 votes to 188 for the Democrats and 14 for the C o n s e r v a t i v e Opponent. ( See Page 9 for complete details) A smiling, happy Governor Nelson A. Rockefeller is pictured on Tuesday after his overwhelming victory for reelection over Democrat Frank D. O'Connor. 10,254 Farmingdale voters gave Rockefeller a margin of 5,008 to 3,120 for O'Connor. 1,486 Conservative votes went to Paul L. Adams and 639 Liberal votes went to Franklin D. Roosevelt Jr. pour*** pteto)
Object Description
Rating | |
Title | 1966-11-10 |
Post a Comment for The Observer 1


text:
Sports Photos
Welcome to Rightfielders.com collection of hot photos and videos of your favorite women athletes, sports wives and girlfriends, and sports lifestyle and scandal. We encourage you to search the photo archives for cool pictures.
Hot News:
- Is Erin Andrews the next Bachelorette? Find out!
- Erin Andrews is a HOT Sports Reporter
- Erin Andrews: 'Dancing With the Stars'
- Hope Solo and Maksim Chmerkovskiy's DWTS Season 13 Week 2 Recap
- Erin Andrews Contract w/ ESPN Renewing or Not?
- Rey Maualuga Erin Andrews (Video)


text: EventsImportant events in which Inside Europe is involved. Meet Your CandidateThe European Parliament and Armenians in the next legistature of the European Parliament. In this sectionIE Europe events Meet Your CandidateOn May 29, 2009, AGBU London and Inside Europe organised a conference with candidates to the European Parliament, asking them their views on 7 key questions of European Policy. Armenian historian discusses "Conflict Resolution and the Invention of History in Azerbaijan and Armenia" at roundtable in Brussels29/04/2009, Brussels – A roundtable entitled « Conflict Resolution and the Invention of History in Azerbaijan and Armenia » took place in Brussels, involving Dr Ruben Galishian, a British-Armenian historian as a guest speaker. At the roundtable, Dr Galishian presented his recent book: 'The Invention of History: Armenia, Azerbaijan and Showcasing of Imagination'. The Round table was organized jointly by AGBU Europe and Inside Europe and took place on the premises of the Heinrich Böll Foundation. Document Actions |


text:
Veterans Day: Today's Events
• 9 a.m. – A memorial service at Maplewood Cemetery in Wilton for veterans of VFW Post 420 who are interred there. Intersection of Weibel Avenue and Louden Road.
• 10:30 a.m. – Gerald B.H. Solomon Saratoga National Cemetery, Veterans Day program. 200 Duell Road, Stillwater. Keynote Speaker Ma. Gen. Verle L. Johnston Jr., assistant adjutant general, New York Air National Guard. For information call
581-9128 .
• 11 a.m. – Public memorial service in Congress Park, Saratoga Springs.
• 2 p.m. – Gurtler Brothers VFW Post 420, 190 Excelsior Ave. in Saratoga Springs, will unveil its "Gallery of Valor" picture memorial. People from the surrounding area have provided photos for the gallery of friends and loved ones who were in the service during a period of conflict. The public is invited to attend.
• In Glens Falls, Civil War historian, genealogist and collector Lance Ingmire of Saratoga will present his vast collection of artifacts and memorabilia at 1 p.m. at The Hyde Collection, at 161 Warren St. This will be followed by a
2 p.m. talk about his family's connection to President Abraham Lincoln and a display of original photographs of Lincoln's funeral May 4, 1865. The activities are part of a Veterans Day program at The Hyde called "Veterans Vision," inspired by the 1888 portrait of poet Walt Whitman by Thomas Eakins that is presently on loan to The Hyde from the Pennsylvania Academy of Fine Arts. It is considered one of Eakins' finest paintings. For information call 792-1761, ext. 327.
• 6 p.m. – Corinth Town Hall, Palmer Ave., Corinth. Veterans Day ceremony. Show support for those serving in the military. A reception to immediately follow. 654-7668.
See inaccurate information in a story? Other feedback and/or ideas for us to consider? Tell us here.
What should we investigate? Have a tip you want us to look into? Tell us here.
Local Guide
Business Name
Location, ST | website.com
Social Wire
National News Videos
- Saratoga County man among two arrested in alleged terrorist plot (2850)
- Saratoga Springs police charge pair with burglary after brief chase through woods (1630)
- Saratoga County listed among most fiscally stressed (1413)
- Excelsior Springs banquet hall and conference center opens for business (1036)
- City Council rejects salary proposals submitted by Saratoga Springs Housing Authority (856)
- NYRA names Christopher Kay CEO to $300K-plus post (837)
- Creating jobs a goal for Wilton town board in 2010 (95)
- Police: Drunken man tried to enter a Stewart's Shop before it opened, then climbed into employee's car (5)
- Saratoga Springs police charge pair with burglary after brief chase through woods (4)
- 19th annual Secret Gardens Tour offers peek into local displays (4)
- Saratoga County man among two arrested in alleged terrorist plot (4)
- The Restaurant at 62 Beekman is off the beaten path (4)
- Excelsior Springs banquet hall and conference center opens for business (4)
Recent Activity on Facebook
Blog Center
Saratoga County Observer
Reporter Caitlin Morris offers insights into the issues affecting Saratoga County residents.


text:
Hockey great Wayne Gretzky might want to take a listen to "Daughters" by Nas, because the social networks are telling him to come get his precious little girl!
The hockey legend's daughter Paulina Gretzky is a wild child and she's been called too racy for social networks. Back in November 2011, the 23-year-old had to delete her first Twitter page after it was deemed too hot for the internet by the ice god himself.
Paulina tweeted, "Having a nice sit down dinner with my dad about social media..haha," her last 140 characters before closing her account.
Well now, Paulina's back and she's hotter than ever. Since her return to Twitter/Instagram, she's posted photos of a recent hard-partying weekend in Las Vegas. The bikini-clad beauty is pictured sprawled out on top of friends, kissing people, drinking and doing all types of stuff many fun-loving women do.
No social network is safe from this super hot young lady, who apparently wants to whole world to see her "great one."
Check out the pics in our gallery!