text:
This Refcard is aimed at intermediate to advanced web developers, but should be useful for anyone who is starting to build more heavy-duty client-side apps.
Cookies have their uses: when you log into a website, for example, a special authentication cookie is used to tell the server that you've logged in and may now view a given page.
In general, however, cookies in modern websites and web applications are discouraged -- partly because of their size (typically 4KB per cookie), and partly because all cookie data is passed back and forth with every call to the server, even if the data isn't required for that request.
All of that extra data costs your users money: you're both increasing their data usage bills and reducing the number of requests the server can handle at once, which can slow down responses.
Web storage has several advantages: most notably, perhaps, it is supported by nearly every modern browser, including Internet Explorer 8.
By default, web storage allows you 5-10MB of space to work with, and your data is stored locally on the device rather than passed back-and-forth with each request to the server. Web storage is useful for storing small amounts of key/value data and preserving functionality online and offline.
With web storage, both the keys and values are stored as strings.
Web storage is not ideal, however, if you want to store large amounts of structured data. That's where HTML5 IndexedDB databases come in.
IndexedDB works both online and offline, allowing for client-side storage of large amounts of structured data, in-order key retrieval, searches over the values stored, and the option to store multiple values per key.
With IndexedDB, all calls are asynchronous and all interactions happen within a transaction.
Note: The specification for IndexedDB includes a section on synchronous calls, originally intended for use within HTML5 Web Workers, but that section of the specification might be removed in the future because no browsers currently support synchronous calls.
Also, you may have run across a technology called HTML5 Web SQL and wonder why that wasn't included in this discussion. The HTML5 Web SQL technology has been deprecated by W3C and it's now highly recommended that developers avoid that technology because browser vendors are not encouraged to support it. IndexedDB is the recommended alternative.
Browser support for IndexedDB has been increasing and, as of May 2013, it's available in the following browsers:
Internet Explorer 10, Firefox, Chrome, Chrome for Android, Firefox for Android, and BlackBerry 10
The following website is updated regularly and can save considerable testing time when you need to determine if a desired feature is available in the browser(s) you intend to support: http://caniuse.com. This tool also indicates the version of the browser in which a given feature became available.
Even if you plan to support only certain browsers, it's always best to test for feature support before trying to use that feature. You can test to see if the browser supports HTML5 IndexedDB like this:
if (window.indexedDB) { /* IndexedDB is supported */ }
When you store information on a user's device, you don't want other websites reading or manipulating the data you've stored. To avoid this, browsers enforce a same-origin policy for IndexedDB databases so that only the website that created the database can access it. The protocol, domain, and port of any site requesting access must match that of the originating site.
So if WebSiteA.com creates an IndexedDB database, then WebSiteA.com/ProductInfo/ could access the database since it belongs to the same domain.
Pages from WebSiteA.com, however, would not be able to access the database. The domains are the same, but the protocol (https rather than http) differs.
A crafty website might try to get around the same-origin policy restriction by loading WebSiteB's page into a Frame or iFrame to try and get a hold of the data. To prevent this attack vector, if a page is loaded into a Frame or iFrame and belongs to a different domain than the main page, as a security precaution, the page within the Frame/iFrame will not be allowed to access its own database.
There are no restrictions on the size of the data stored within the database but, depending on the browser, there may be size restrictions on the database itself.
With the desktop version of Firefox, an IndexedDB can use up to 50MB of storage before the user is presented with a message to find out if they want to allow the website to use more storage. If the user allows for an increase in storage, the IndexedDB growth will then only be limited by the capacity of the user's hard drive.
The mobile version of Firefox follows the same approach, except that the threshold for a user prompt is 5MB rather than 50MB.
With Internet Explorer 10, a database can use up to 10MB of storage by default before the user is presented with a message asking if additional storage is permitted. There also appears to be a hard coded upper limit of 250MB (in testing, adjusting the Temporary Internet Files limit above 250MB had no effect even with a reboot).
In Internet Explorer, if the database has reached its maximum size (either the user has chosen not to allow additional storage to be used or the upper limit of 250MB has been reached), the browser will not throw an error if your code tries to add additional records. Instead, if you watch the disk performance, or the Indexed DB folder itself (%AppData%\Local\Microsoft\Internet Explorer\Indexed DB\Internet.edb), it appears that Internet Explorer still tries to process the information but the Internet.edb file doesn't grow in size.
All IndexedDB functionality is accessed through the window.indexedDB object, which is an IDBFactory object containing an open and a deleteDatabase method (there is also a cmp method available for comparing two keys).
Every operation with IndexedDB is asynchronous: you make a request for something to happen and you're returned an IDBRequest object. You then attach to the IDBRequest object's onerror and onsuccess event handlers to act on the results when they become available.
The IDBFactory's open and deleteDatabase methods return an IDBOpenDBRequest object, which is derived from the IDBRequest object and provides two additional event handlers: onblocked and onupgradeneeded.
To open a database, or to create one if it doesn't already exist, we simply call the open method of the window.indexedDB object and specify the desired database name.
The open method accepts a version number for the second parameter and will default to 1 if the database doesnt't exist (if a database doesn't exist, when open is called, the database gets created). If specified, the version number must be greater than 0.
If the request to open a database was successful, the event object passed into the onsuccess event handler will contain an IDBDatabase object which we can then use to manipulate the objects in the database.
The following is an example of how you request that a database be opened:
var g_db = null;
var dbRequest = window.indexedDB.open("Example");
dbRequest.onerror = function (evt) {
alert("Database error: " + evt.target.error.name);
dbRequest.onsuccess = function (evt) {
g_db = evt.target.result; // IDBDatabase object
Each database can have one or more object stores which hold your records as key/value pairs. Each object store has a name and the name must be unique within the database.
The records within an object store are sorted in ascending order based on the keys and each key must be unique for that object store.
Each object store has an optional key generator and an optional key path.
If you specify a key path, the object store is said to use in-line keys (the key is stored as part of the value). If you don't specify a key path, the object store is said to use out-of-line keys (the key is stored separately from the value that is being stored).
There are three ways that keys can be specified for an object store:
Each record in an object store has a value which can be primitives (string, number, boolean, null, and undefined) as well as anything supported by the structured clone algorithm which includes things like objects, arrays, dates, and even files from the HTML5 File API.
When a database is first created, or when a version number is specified that is higher than the current database version, an onupgradeneeded event handler will be triggered as part of the database versionchange transaction.If the upgradeneeded event is triggered, the onsuccess event handler of the open database request, will only be triggered after the versionchange transaction has completed.
The onupgradeneeded event handler is where all database structure changes are performed, including the creation of object stores.
To create an object store, you need to call the createObjectStore method on the IDBDatabase object which can be found in the event's target.result property of the onupgradeneeded event handler.
The following example illustrates how to create an object store called "Employees" that will use a key path:
dbRequest.onupgradeneeded = function (evt) {
var db = evt.target.result;
var objectStore = db.createObjectStore("Employees", { keyPath: "EmpId" });
Indexes allow you to look up of data within an object store using properties of the values stored rather than just using the keys.
An index is a special object store for looking up records in another object store (also known as a referenced object store). The records in an index are automatically adjusted when items are added, updated, or deleted in the referenced object store. Several indexes can reference the same object store.
Indexes can also be used to enforce some database rules. For example, an index contains a unique flag which, when set to true, can be used to prevent having two records with the same value in an object store (an error would be thrown if the result of an insert/update results in a duplicate value).
Indexes also contain a multiEntry flag which effects how an index behaves when it comes to arrays. When set to false, a single record whose key is an array is added to the index. When set to true, however, a record is added to the index for each array item allowing you to filter on the individual items of the array.
To create an index, you need to call the createIndex method on the IDBDatabase object passing in a name for the index as the first parameter, a keypath as the second parameter, and an optional third parameter object indicating if the index is to be unique or not or if multiEntry is enabled or not.
Since indexes modify the database structure, indexes must be created and modified within the onupgradeneeded event handler as in the following example:
dbRequest.onupgradeneeded = function (evt) {
// ...object stores created...
/* Create an index so we can search by employee names. Multiple employees might have the same name so we don't want the index to be unique */
objectStore.createIndex("EmpName", "EmpName", { unique : false });
/* Create an index to search employees by company email address. Since, typically, no two employees would share the same work email address, we can put a restriction on the records to enforce that each record have a unique email address */
objectStore.createIndex("EmpEmail", "EmpEmail", { unique : true });
All reading or modification of data within a database must happen within a transaction.
The scope of a transaction is determined when the transaction is created and is simply what object stores and indexes the transaction has access to.
A database can have multiple active transactions at once and, with readonly transactions, any number of them can execute at the same time even if they overlap scopes.
Unlike transactions of other database technologies, with IndexedDB, the transactions are auto-committed if the call is successful (your code doesn't need to explicitly call a commit method). If an error is thrown, or the call is explicitly aborted by code, then the transaction automatically rolls back.
A database can have multiple active transactions at once and, with readonly transactions, any number of them can execute at the same time even if they overlap scopes.
Be especially careful with readwrite transactions because, if the scope overlaps, transactions will not execute at the same time. They will instead be queued up which could slow down the responsiveness of your web application.
There are three transaction modes available:
To create a transaction we need to call the transaction method of our IDBDatabase object, which will return us an IDBTransaction object.
The transaction method accepts two parameters. The first parameter is an array of object store names that we want as part of the transaction. The second parameter is optional and indicates the transaction mode we want. If not specified, the second parameter defaults to readonly mode.
The following is an example of how you would create a readwrite transaction on the Employees object store:
var dbTrans = g_db.transaction(["Employees"], "readwrite");
Note: Remember transactions are expected to be short-lived.
o add data to an object store, we could populate the object store during the onupgradeneeded event handler since we're already in a transaction. Because we would already have a reference to the object store, it's just a matter of calling the object store's add method as in the following example:
dbRequest.onupgradeneeded = function (evt) {
// ...object stores and indexes created...
// Add the employee array items to the object store
for (var i in arrEmployees) {
dding records to an object store during the upgradeneeded event is fine when the database is being created or upgraded but what about when the database already exists and we don't need to update the version?
To add a record to an object store, we first need to obtain a readwrite transaction on the object store we wish to add data to by calling the transaction method on our IDBDatabase object.
Once we have the IDBTransaction object we can call that object's objectStore method requesting one of the object stores that we specified when we called the transaction method.
The objectStore method returns us an IDBObjectStore object which we can then use to call the add method to request our object be inserted as in the following example:
var objEmployee = { "EmpId": "101", "EmpName": "Sam Smith", "EmpEmail": "firstname.lastname@example.com" };
// Create a readwrite transaction for the Employees object store
var dbTrans = g_db.transaction(["Employees"], "readwrite");
// Get the IDBObjectStore object for the Employees object store
var dbObjectStore = dbTrans.objectStore("Employees");
// Request the addition of our object to the object store
var dbAddRequest = dbObjectStore.add(objEmployee);
dbAddRequest.onsuccess = function (evt) { alert("Success!"); }
dbAddRequest.onerror = function (evt) { /* handle the error */ }
There is also a put method that can be used. The put method will act like an add method if the record doesn't exist yet but, if the record does exist, the put method overwrites the existing record with the new data. The code works exactly the same as in the above example with the exception that you request a put rather than an add.
Both the add and put requests accept an optional second parameter which is how you would specify the key for the record if you're not using inline keys.
Requesting a record from an object store is very similar to adding it to the object store: You create your transaction (a readonly transaction will do in this case), request the object store object, and then request the record as in the following example:
/* Since the 2nd parameter of the transaction method is optional and defaults to "readonly" we've left it out to reduce code. Also, since we don't need the IDBTransaction object after we call the objectStore method we can chain the calls together and not bother storing the transaction object to a variable */
var dbObjectStore = g_db.transaction(["Employees"]).objectStore("Employees");
// A Get is based on the key. In our case, it's the EmpId value
var dbGetRequest = dbObjectStore.get("101");
dbGetRequest.onsuccess = function (evt) {
alert("Success! The employee's name: " + evt.target.result.EmpName); }
dbGetRequest.onerror = function (evt) { /* handle the error */ }
A get is useful if you only want one record and you know the key value of the record you're looking for.
If you wish to iterate over multiple records, perhaps to build up a list of items for display, you'll need to use a cursor.
Note: If you wish to loop over records in search of a specific record, cursors are not the recommended approach. See the "Using an Index" section which will discuss using cursors on indexes.
As with a get request, to use a cursor you must first create a transaction and then obtain the object store object which you can then call the openCursor method on.
The first parameter of openCursor method is an optional key range which is used to restrict the number of records returned (if not specified, all records from the object store are returned).
You can create a key range object by calling one of the following methods on the IDBKeyRange object: only, lowerBound, upperBound, and bound.
The second parameter of openCursor is also optional and specifies the direction that you will iterate over the results: "next" is for ascending order which is the default and "prev" is for descending order.
If you want to specify the second parameter without having to specify the first one, you can pass in a null for the first parameter.
The following is an example of using a cursor to loop over an entire object store's records (no range filter and using the default direction):
var dbCursorRequest = dbObjectStore.openCursor();
dbCursorRequest.onsuccess = function (evt) {
var curCursor = evt.target.result;
if (curCursor) {
/* Grab the current employee object from the cursor's value property (we could also grab the key) */
var objEmployee = curCursor.value;
// ...do something with objEmployee...
// Cause onsuccess to fire again with the next item
} // End if
dbCursorRequest.onerror = function (evt) { /* handle the error */ }
A few notes about cursors:
If you ever need to look for records based on a value other than the key, it's much more efficient to use an index.
You can request a get on an index which will return you a single record. Even if there are multiple records for the search value, you will always get the record with the lowest key value.
The following is an example of doing a get request on an index:
var dbIndex = dbObjectStore.index("EmpName");
var dbGetRequest = dbIndex.get("Sam Smith");
dbGetRequest.onsuccess = function (evt) {
var objEmployee = evt.target.result;
/* do something with the result */
If you want to take advantage of the better performance of indexes but still need to loop over multiple records, you have an option of two different types of cursors.
The standard index cursor behaves the same as a normal cursor, where the value returned is the whole object from the object store. The following is an example of how you obtain a standard index cursor:
var dbCursorRequest = dbIndex.openCursor();
dbCursorRequest.onsuccess = function (evt) {
var curCursor = evt.target.result;
if (curCursor) {
/* Grab the current employee object from the cursor's value property (we could also grab the key). Do something with the object */
var objEmployee = curCursor.value;
// Cause onsuccess to fire again with the next item
} // End if
The other type of cursor that's possible on an index is a key cursor where the cursor's key is the index value and the cursor's value is the object store's key. For example:
var dbCursorRequest = dbIndex.openKeyCursor();
dbCursorRequest.onsuccess = function (evt) {
var curCursor = evt.target.result;
if (curCursor) {
/* curCursor.key will hold a value like "Sam Smith"
curCursor.value will hold the record's key (e.g. "101" in our case) */
// Cause onsuccess to fire again with the next item
} // End if
With both types of index cursors you can specify a key range filter like you can with normal cursors.
You can also specify the direction like you can with normal cursors but, in this case, you can make use of two additional values on indexes when those indexes are not specified as unique: "nextunique" and "prevunique" (filters the returned records to just unique items).
To delete records from an object store there are a couple of options available.
The first option is to use a delete request on the object store requesting that a specific record be deleted (bear in mind that the transaction shown in the examples below need to be set to readwrite):
var dbDeleteRequest = dbObjectStore.delete("101");
dbDeleteRequest.onsuccess = function(evt){ /* record is gone */ }
dbDeleteRequest.onerror = function(evt){}
The other option is to use the clear request on the object store requesting that all records within the object store be deleted along with any index records that reference the object store:
var dbClearRequest = dbObjectStore.clear();
dbClearRequest.onsuccess = function(evt){ /* records are gone */ }
dbClearRequest.onerror = function(evt){}
Most documentation you will find online about the IDBRequest onerror event handlers will tell you that you need to access the errorCode value. This is no longer the case.
The event's target value now holds an error object, which is a DOMError object. Rather than errorCode you now have access to the name property of the error object as in the following example:
dbRequest.onerror = function (evt) {
alert("Error: " + evt.target.error.name);
Aside from the onerror handlers of the IDBRequest object, it's also very important to wrap your database code in a try/catch statement since several actions will throw exceptions even if you have set up error event handlers.
For example, you will receive a ConstraintError exception if you try to create the same index twice which gets by the onerror handler and shows up in the console window (if your user is using IE and has IE set up to show errors, the user will receive a prompt with the error).
The W3C specification lists some common exceptions, if you're interested in knowing what could trigger one: http://www.w3.org/TR/IndexedDB/#exceptions
A database can be closed in several ways, including by the garbage collector or if the user navigates away from your page.
You can explicitly close a database connection by calling the close method on the IDBDatabase object as in the following example:
/* g_db is a global object holding the evt.target.result value (our IDBDatabase object) from the onsuccess event handler when we called window.indexedDB.open */
To upgrade an existing database to a new version we need to specify a version number that is higher than the current database version when we open the database which will trigger the onupgradeneeded event handler.
The parameter received by the event handler will hold two values oldVersion and newVersion which can help your upgrade code know what code needs to run in order to bring the database up to the current version.
var dbRequest = window.indexedDB.open("Example", 2);
dbRequest.onupgradeneeded = function (evt) {
if (evt.oldVersion < 1) {
// create objects for version 1
// other version upgrade paths
Deleting an object store is a modification to the database structure and needs to be handled within the onupgradeneeded event handler.
To delete an object store, it's simply a matter of calling the deleteObjectStore method on the IDBDatabase object, specifying the name of the object store that you want deleted, as in the following example:
dbRequest.onupgradeneeded = function (evt) {
var db = evt.target.result;
If you ever need to delete a database, this can be accomplished by requesting a deleteDatabase on the IDBFactory object as in the following example:
var dbRequest = window.indexedDB.deleteDatabase("Example");
dbRequest.onsuccess = function(evt){ /* database is gone */ }
dbRequest.onerror = function(evt){}
One nice feature with IndexedDB is that it's available to you from within a web worker rather than just from the UI thread!
Since there is no global 'window' object in a web worker, the approach used to access the indexedDB object needs to be modified slightly to use the global self instead.
The following example shows how you would work with IndexedDB from within a worker:
// Use 'self' instead of 'window' when in a worker
var g_db = null;
var dbRequest = self.indexedDB.open("Example");
dbRequest.onerror = function (evt) {
// Tell the UI thread about the error
self.postMessage("Database error: " + evt.target.error);
dbRequest.onsuccess = function (evt) {
g_db = evt.target.result;
dbRequest.onupgradeneeded = function (evt) {
// Create an objectStore to hold Employee information
evt.target.result.createObjectStore("Employees", { keyPath: "EmpId" });
If for some reason you need to abort a transaction and rollback any changes, you can do so at any point before the transaction finishes, including if he transaction isn't currently active or hasn't started yet, by calling abort on the transaction object.
The following is an example of calling abort on a transaction:
var dbTrans = g_db.transaction(["Employees"], "readwrite");
var dbObjectStore = dbTrans.objectStore("Employees");
var dbAddRequest = dbObjectStore.add(objEmployee);
/* ...success and error handlers... */
Success events don't bubble and can't be cancelled, but error events do bubble and may be cancelled.
Error events will abort the transaction in which they occur unless they're cancelled by calling preventDefault().
I would generally recommend against canceling an error so that a transaction doesn't abort: if there's an error, typically it's because there's a problem, and you could end up with bad data in your database.
That said, you might run across special cases where certain errors are acceptable and you may simply log the error allowing the transaction to continue.
Currently, the only browser with built-in tools to view the contents of an IndexedDB database is Google Chrome.
In Chrome, if you open up the Developer Tools (Tools, Developer Tools menu or by pressing Ctrl+Shift+I), you'll find a Resources tab with an IndexedDB item that you can expand to explore any databases currently held by your browser.
The following Microsoft website details a small web application allowing you to explore IndexedDB databases in other browsers like Internet Explorer:
For security reasons, IndexedDB will only work for websites using http or https. Browsers will not allow a local file (file://) to use IndexedDB.
The only exception to the local file restriction is when IndexedDB is accessed from the JavaScript of a Windows 8 application (ms-wwa or ms-wwa-web protocols in Internet Explorer)
Like with any other data stored in the browser, the user has the ability to remove your databases by deleting the cookies and other local browser data.
This could be a bit of an edge case, but it may also help in determining why IndexedDB isn't working for one user when it works for others: It is possible to disable IndexedDB in Internet Explorer, Chrome, and Firefox:
Some sample code has been written to show a possible real-world use case of IndexedDB and can be found in the following GitHub repository: https://github.com/cggallant/IndexedDB
http://caniuse.com/ can help you discover which browsers support a particular feature and in which browser version the feature became available.
Of the browsers that support IndexedDB, only the BlackBerry 10 browser still uses vendor prefixes for IndexedDB which is a good sign since browser vendors usually don't remove the vendor prefixes from new technologies until they are fairly certain that there won't be any more major changes to the specification. That said, IndexedDB is still a working draft and some aspects may still change in time. If you find that what you read in books or on the internet is not working as you expect, I find it's often easier to go back to the source and read the latest published version of the W3C specification: http://www.w3.org/TR/IndexedDB/
Due to the fast pace of browser updates, information and tutorials on HTML5 often grows outdated quite quickly. I recommend reading the HTML5 specifications first, if possible, but because specifications are sometimes difficult to understand, I try to cross-reference what I read in the specifications with various articles and by writing test code.
I've found the following sites helpful in understanding some of the fine details of various technologies:


text:
Stay informed by joining our exclusive email list and receive special offers regarding Met HD!
Chamber Music Sedona will present three exciting Sedona music festivals in 2015, with an enticing variety of musicians and musical styles to appeal to music lovers of all ages and tastes.
Our 2015 festival season begine with a traditional chamber music festival from January 6 - 11 at the Hilton Sedona Resort & Spa. The Sedona Winter MusicFest will feature amazing young artists who are re-defining chamber music for today and the future.
From April 15 – 18, we are excited to present the second annual jazz festival. Judy Carmichael, our Artistic Director, is bringing three of her friends and the Tucson Jazz Institute, Doug Tidaback, Director, will also be playing.
Finally, June 3 – 6 are the dates for the 9th Annual Sedona Bluegrass Festival. This year Darol Anger will once again be our Artistic Director and he is bringing Mr. Sun with him. Darol and Bert are working on getting more of the best bluegrass bands for your listening enjoyment.
2015 Festivals!
All events artists and venues subject to change without notice.
2015 Sedona Winter MusicFest
Alexander Fiterstein & Nicholas Canellakis Artistic Directors
Join us for fun, free and special events
From the movie "A Late Quartet" starring Philip Seymour Hoffman, Christopher Walken, Catherine Keener and Mark Ivanir to the final concert on Sunday, you will be amazed and thrilled by the music, the exhuberant performances and the passion of six of today's rising stars in the chamber music world.
Violinists Arnaud Sussmann & Harumi Rhodes
Sedona Winter MusicFest - Festival Trio Salon
January 7, 2015 @ 5:30 PM
Sedona Winter MusicFest
Sedona Winter MusicFest
Sedona Winter MusicFest
2015 Sedona JazzFest
Judy Carmichael Artistic Director
Join us for Jazz, jazz and more jazz!
From the movie "A Great Day in Harlem" hosted by Judy Carmichael to the concert on Saturday, you will be treated to some of the best jazz in the area.
Featuring the swinging piano, sultry vocals and sassy humor of Judy Carmichael and her Jazz Quartet![More Info]
Sedona JazzFest
Sedona JazzFest Concert
Saturday, April 18, 2015, Noon to 4:00 P.M.
2015 Sedona Bluegrass Festival
Darol Anger, Artistic Director
Join us for Bluegrass, BBQ and more!
Wednesday June 3rd through Saturday June 6th!
From the movie "Throw Down Your Heart" hosted by Darol Anger to the concert on Saturday, your Bluegrass itch will be satisfied![More Info]
Bluegrass BBQ
Thursday, June 4, 2015 @ 5:30 PM
Sedona Bluegrass Festival Concert
Saturday, June 6, 2015 Noon to 6:00 PM
Come to Sedona for its Beauty
Stay for its Arts & Amenities
Chamber Music Sedona is pleased to share community connections in Art and Culture, Culinary, Historic and Scientific, Outdoor and Viticulture opportunities during your stay. Consider using the websites and services of these Chamber Music of Sedona supporters to plan your stay in Sedona.[More Info]
RV and Campground Parks Near Sedona
Here is a list of RV Parks and Campgrounds in the Sedona area. This is not a comprehensive list. For the most complete information, either Google or Bing your request on the internet. We have no affiliation or connection with any of these parks. This list is offered as a convenience to our out-of-area visitors.[More Info]
Top header image by: Andrew Holman Photography

subset: commoncrawl


text:
MGE XG Dragon Aluminum Case
by Jeremy Lawrence (11/16/2005)
In the field of computer cases, there are a plenty of choices. We have cases ranging in shape, size, price and construction. In a field of so many choices, the main way to get your product into the market is to excel above the rest and show the competition what you're made of. Today, I get to take a look at MGE's newest offering, the XG Dragon. Let's find out of this case has what it really takes to stand out in the market. The folks over at MGE have been nice enough to hooks us up with an XG Dragon so we can have a deeper look at what makes this case tick.
A real eye catcher
The MGE XG Dragon demands your attention. Available in several different colors, it also gives you a choice. Our review unit was black, and with the blue LED lighting, and the front LCD panel offers a very sleek and stylish look. At just over 500mm tall and weighing in at just over ten pounds, this case is also very light and small enough to be taken and shown off at a LAN party.
All rights reserved. All
pages Copyright © 2000 - 2011 by R. Dean Barker.


text:
PGA Tour's Mississippi Stop Liking New Date NFL Files For Injunction Against NJ's Gambling Move McGladrey Extends PGA Tour Deal Leagues, NCAA File Injunction Against N.J. Trio Of Golfers Launching Craft Beer PGA Tour Names Tom Wade CCO N.J. Sports Betting Could Begin This Weekend N.J. Assembly Passes Sports Betting Bill NFL Giants Brief Team On Ebola Vegas Golf Event Ready For Pools
Upcoming Conferences and Events
Dec 2-3
Dec 10-11
Apr 8-9
Apr 9
May 20
SBD/January 21, 2013/Sports in Society
Phil Mickelson Sounds Off On Paying Higher Taxes, Says He'll Make "Drastic Changes"
Published January 21, 2013
LOSING HIS EVERYMAN APPEAL? Golf Channel's Damon Hack said of Mickelson's comments, "I don't know what Phil's doing, bringing his laundry from his home. Have this conversation with your family and if you have to move, that's fine. I don't think people, Phil's fans, the public, people that are struggling to pay rent, are worried about a millionaire's problems." Golf Channel's Matt Ginella added, "He is the guy that seems so connected with the common man, and when saying these things like he said seems really disconnected from the common man" ("Morning Drive," Golf Channel, 1/21). Golf writer Steve Elling wrote on his Twitter feed, "Mickelson will show up at Torrey with rehearsed, researched taxation spiel, but most folks feel no sympathy. He's risking serious skewering."


text:
By Kolapo Olapoju
Contrary to news reports making the rounds, NET can authoritatively confirm that Biola Alabi has not left MNET Africa.
From NET findings, the Managing Director of M-Net did not resign her post, but was instead redeployed as Managing Director of Special projects.
According to an official statement released by M-Net/Africa Magic, the new appointment is as a result of the growth of M-net Africa which has seen the organisation name Regional Directors for East and West Africa, as opposed to having a single Managing director overseeing the entire continent.
The statement said, 'M-Net wishes to confirm the strategic evolution of M-Net Africa MD Biola Alabi's role with the pan African broadcaster. Having served in this role at M-Net Africa for five highly successful years during which time she brought her well-honed business perspective and creative insights to one of Africa's biggest entertainment companies, she has taken on a new strategic role with the organization, that of Managing Director: Special Projects. In this capacity her portfolio now focuses primarily on the broadcaster's flagship productions including but not limited to the Africa Magic Viewers' Choice Awards, the popular reality super series Big Brother Africa and several exciting new initiatives.'
The situation is sensitive, especially as the MNET-organised Africa Magic Viewers' Choice Awards holds this weekend. And many industry insiders say there's plenty going on at the South African company in terms of change in structure and operations.
Meanwhile, M-Net has appointed Mrs Wangi Mba-Uzoukwu as the first Regional Director for West Africa.
© NET Newspapers 2014. All Rights Reserved. Please use sharing tools. Do not cut, copy or lift any content from this website without our consent.
Link to article:


text:
Dates: August 4-August 8
Days: Monday-Friday
Sessions: 5
Medium: Drawing
Course Description: Be inspired by the MFA's collection of fashion, textiles and art to create your own line of contemporary fashions. Work in a studio setting and learn to draw the fashion figure, silhouettes, and textiles with a focus on building a collection. Render fashion plates using color pencil and markers, while also learning how to present them professionally. The workshop will include visits to the art galleries as well as the Textile and Fashion Arts department. Some previous drawing experience suggested.
Instructor: TBD


text:
Remember the Dodge Hornet? Just a few years ago, the chunky funster was rumored to be the automaker's first foray into the subcompact B-segment, and it was even scheduled to be produced in conjunction with Chinese automaker Chery. These plans never came to fruition, and we've had to soldier on with the unloved Caliber as Dodge's only small car offering. It's time for something new.
Now that Fiat has taken control of the Chrysler Group, a whole slew of new products will be worked into the Chrysler, Dodge and Jeep lineups, including a new Alfa Romeo-based small car that might just pick up where the Hornet left off, albeit in a slightly larger (C-segment) package. Seen here testing in the Death Valley heat, the prototype still wears a lot of its Alfa skin, though our spies indicate that the front end design (complete with LED strip) may carry over to the production car, and it's possible that the sheetmetal will, as well.
Mum's the word on when Dodge's new small car will debut, but when it does, we expect the demise of the Caliber around the same time. Click through our high-res image gallery to see the full slew of spy shots.


text:
Investors are quietly building defensive options positions as the stock market hovers around all-time highs. The "greed-in" and "risk-on" trade still dominates, but a nascent change is occurring as key market risks, particularly the threat of sequestration, loom menacingly ahead.
With the Standard & Poor's 500 inhaling thin oxygen around 1500, investors are bearishly positioning in financial and small-company stocks that have reacted poorly to Europe's economic and political unrest and the U.S. economy's malaise. Investors are buying puts, often in large size, on the Select Sector SPDR-Financial XLF 0.12320328542094455% Select Sector SPDR-Financial U.S.: NYSE Arca 24.38 0.03 0.12320328542094455% /Date(1417039200127-0600)/ Volume (Delayed 15m) : 8721828 AFTER HOURS 24.38 % Volume (Delayed 15m) : 26618 P/E Ratio N/A Market Cap N/A Dividend Yield 1.6137817883511074% Rev. per Employee N/A More quote details and news » (XLF) and the iShares Russell 2000 Index iwm 0.33034050482805355% iShares Russell 2000 ETF U.S.: NYSE Arca 118.45 0.39 0.33034050482805355% /Date(1417039200224-0600)/ Volume (Delayed 15m) : 13752474 AFTER HOURS 118.47 0.019999999999996 0.016884761502743775% Volume (Delayed 15m) : 888250 P/E Ratio N/A Market Cap N/A Dividend Yield 1.028646686365555% Rev. per Employee N/A More quote details and news » (IWM). If stocks slide, they could force the parties on the other side to buy these exchange-traded funds at prices higher than those they'd be trading at.
The defensive positioning is broadly reflected in the CBOE Volatility Index (VIX), too. Though much has been made of the VIX's relatively sanguine levels, this fear gauge has quietly risen about 20% since slipping to a 52-week low in late January. This is happening even though stocks are mostly rallying; the VIX usually moves in the opposite direction of the S&P.
True, the defensive trading is thus far isolated and controlled, but it has occurred in such large size as to cause some investors to wonder if the stock market is too far ahead of itself, given what might be waiting at month's end.
Some would say such caution is normal, especially when hedging costs aren't terribly high and so many stocks and ETFs are at or near 52-week highs.
These people would be right. But the sheer size of some of the trades—in some cases, 100,000 Select Sector SPDR-Financial puts and 50,000 iShares Russell 2000 Index puts—at a time when so many individuals are so enthusiastic about stocks suggests major investors with large equity positions are suddenly beginning to worry about the market's lofty heights.
Call it the law of big size, but the options market has long paid attention to anyone who trades large numbers of puts and calls, on the simple assumption that such traders have better information than everyone else.
The federal budget is poised to be cut by $1 trillion on March 1, unless Congress reaches various deals to prevent sequestration, and what is expected to be a major disruption to the American economy. The iShares Russell 2000 Index is considered a pure play on the economy because small U.S. companies tend to only operate in the domestic marketplace. With the iShares Russell 2000 near a 52-week high of 90.69, one investor recently bought 50,000 April 86 puts and sold 50,000 April 84 puts.
AND LAST WEEK, TO HEDGE bank stocks through April, a major investor purchased about 100,000 Select Sector SPDR-Financial April 16 puts when that exchange-traded fund was around 17.60. The position—which we call the hedge heard around the market—sparked widespread discussion because the Select Sector SPDR-Financial has long been used by hedge funds to trade Europe's economic crisis.
The big money-center U.S. banks all have businesses in Europe, and the Select Sector SPDR-Financial can be used to bet against Europe. Depending on how you measure the relationship between the Select Sector SPDR-Financial and the CurrencyShares Euro Trust FXE 0.26037428803905616% CurrencyShares Euro Trust U.S.: NYSE Arca 123.22 0.32 0.26037428803905616% /Date(1417039200193-0600)/ Volume (Delayed 15m) : 330868 AFTER HOURS 123.16 -0.0600000000000023 -0.04869339392955689% Volume (Delayed 15m) : 365 P/E Ratio N/A Market Cap N/A Dividend Yield N/A Rev. per Employee N/A More quote details and news » (FXE), the correlation is 76% to 85% and edging higher. The correlation between the S&P 500 ETF Trust SPY 0.255902660421998% SPDR S&P 500 ETF Trust U.S.: NYSE Arca 207.64 0.53 0.255902660421998% /Date(1417039200261-0600)/ Volume (Delayed 15m) : 49733856 AFTER HOURS 207.83 0.190000000000026 0.0915045270660759% Volume (Delayed 15m) : 12433976 P/E Ratio N/A Market Cap N/A Dividend Yield 1.8092660373723752% Rev. per Employee N/A More quote details and news » (SPY) and the CurrencyShares Euro Trust stands around 85%.
Of course, correlation isn't causation, and maybe sequestration will prove to be a minor issue, and Europe will turn out to be nothing more than a bad story without any major immediate impact. But if you're willing to bet on the upside, what's wrong with a little downside wager, too?
Steven Sears is the author of The Indomitable Investor: Why a Few Succeed in the Stock Market When Everyone Else Fails.
Comments: email@example.com http://twitter.com/sm_sears


text:
We're no scientist. But you know who is? Scientists. And a group of them has written Gov. Rick Scott about his noncommittal stance on man-made climate change. Scott has been wishy-washy on the issue, and whenever he's been pressed about it, he has inexplicably decided to go the Marco Rubio route of ... More >>
Behind South Florida's golden crab industry is the story of a family proud but divided


text:
Who's sharing James Franco's bed? Plus, more from Olivia Wilde, Emma Stone and other stars
Credit: ABC; WireImage; Alexi Lubomirski
Updated: Friday Apr 25, 2014 | 06:00 AM EDT
By: Karen J. Quan
More from PEOPLE
See More News
2 of 12
"I wish PEOPLE had asked John Travolta to announce Lupita Nyong'o as the winner. He did such a nice job at the Oscars."– Jimmy Kimmel, on this year's Most Beautiful cover reveal, during his late-night talk show
Copyright © 2014 Time Inc. All rights reserved. Reproduction in whole or in part without permission is prohibited.


text:
Candace Calloway Whiting
Candace Calloway Whiting has studied and trained dolphins, seals, and orca whales. She is currently a volunteer at the Center for Whale Research at Friday Harbor.
Posts by Author
The Georgia Aquarium Bilked Taxpayers into Financing a Dolphin Exhibit by Using a Program Designed to Help Stuggling Families
In a classic bait-and-switch the Georgia Aquarium managed to con the government out of money expressly targeted to benefit low income communities, in order to finance the expansion of their dolphin exhibit in 2010. Using the New Markets Tax Credit Program (NMTC Program) that was established to encourage investments in low income areas, the Georgia […] [Read More]
Southern Resident Killer Whale Recovery Program Update From NOAA
Southern Resident Killer Whale Recovery Program Update NOAA Fisheries and Fisheries and Oceans Canada recently held their final workshop on the effects of salmon fisheries on Southern Resident killer whales. The meeting was the third of a series to review and present available information on salmon fisheries and orcas to an independent scientific panel. The […] [Read More]
"Overfishin', Overfishin', Save the Fishes"… A Fresh Look (Video)
As the oceans become depleted of large fish, commercial fisheries are increasingly turning to the harvest of the small forage fish to fill their coffers. Unfortunately, what is motivating them in this trend is not the goal of filling dinner plates, but rather looking for ways to keep their own bank accounts full. The younger […] [Read More]
Government Must Protect Captive Southern Resident Orca Under Endangered Species Act or Supply a Legal Reason Why Not to Do So – News Release!
FEDS AGREE TO RECONSIDER PLIGHT OF ORCA AT MIAMI SEAQUARIUM Lawsuit Means Government Must Protect Deprived Orca Under Endangered Species Act or Supply a Legal Reason Why Not to Do So October 12, 2012 MIAMI — Following a lawsuit filed by the Animal Legal Defense Fund (ALDF) and PETA, the National Marine Fisheries Service has […] [Read More]
Tweeting For Sea Canaries – Please Follow Along #noGAqbelugas
"This marine mammal is commonly referred to simply as the beluga or sea canary due to its high-pitched 'twitter'." (wikipedia). Or in this case, the 'Twitter' that has surged around 18 healthy wild belugas who were caught in Russia for captivity in amusement parks in the U.S. First in line to import the whales is […] [Read More]
The Real SeaWorld – Understanding the Captivity Controversy (Video Features Puget Sound's Local Orcas)
Now in their usual fall pattern, the Southern Resident orcas are happily searching for salmon down near Seattle where they entertain us as they forage and frolic (check Orca Network for the whales' current locations) – reminding us once again how it is more relevant to observe whales in the wild than in the unnatural […] [Read More]
Join the Visual Petition to Protect the Wild White Whales – Fun, Quick and Effective
Visual petitions are a way to connect people with a shared interest and to deliver a united message. Whether you use the photos provided on the website or make your own creative message, in a short time you can add your own image to thousands of others and help make a difference. Stop the Georgia […] [Read More]
Dolphins' Astounding Ability to Heal – Why SeaWorld is Confident About the Injured Orca "Nakai"
September 20th, 2012 Nakai, an 11 year old male orca, was injured in a fracas with two other male orcas during a private after hours show for corporate guests at SeaWorld San Diego and was left with this gaping wound (the missing piece was later found at the bottom of the pool). (See Tim Zimmermann's […] [Read More]
SeaWorld Has Lost Its Compassion – It is Up to You to Help (Video)
Unfortunately your browser does not support IFrames. In the wild, these orcas would be living in family based groups, culturally adapted to manage aggression and conflict. At SeaWorld however, young whales are torn from their mothers and throughout their lives they are moved from place to place, group to group, and are mixed in with […] [Read More]
SeaWorld Management Leads to Horrendous Injury of Young Orca Whale
According to journalist Tim Zimmerman, this injury occurred during a show at SeaWorld's San Diego amusement park, and the trainers were not even aware it happened: It happened last week during a night show, seemingly during a major altercation involving Nakai, Keet, and Ike. It's not clear if there was an aggressor or instigator, or […] [Read More]
Show More