text:
Get tips to help you make healthy choices and live your best, most balanced life by signing up to our monthly e-newsletter!
It's back-to-school time, and with it comes the annual ritual for moms: buying school supplies, meeting the teachers, sign-up sheets, and the "first day" photos in front of the school or on the front porch.
With all that activity, most of us don't give all that much thought and attention to lunch, except perhaps to make sure your child has something. But, when you consider the important role proper nutrition plays in learning and growing, and the fact that eating habits of children will last well into adulthood, it's worth taking a moment to make sure this little step in the daily routine doesn't get dismissed.
For many parents, it's easier to buy a lunch than to add yet one more thing to a busy morning routine. But packing a lunch tends to be a healthier way to go. We spoke to Liane Vadheim, a registered dietitian and certified diabetes educator with SCL Health, for a few tips to show you how to pack a great lunch without turning it into a dreaded chore:
Get fast, affordable, and convenient care with Doctor On Demand.
Get a daily dose of inspiration and health tips by following us on Facebook!
Happy, sad, excited, scared, hopeful. We see these emotions every day in our hospitals. If you've had a memorable or moving moment with SCL Health, we'd love to hear from you!


text:
A busy week again! I spent much time at Plug-In 2008, learning more about electric vehicles, like what vehicle and battery manufacturers are up to, timelines to production of many products, etc. I was surprised to hear that tens of thousands of the one million Prius' sold have been converted to plug-in for longer electric car mode, even absent of possible warranty voidance. I listened to Andy Grove's (Intel) proclamation that we convert 10 million pickups, SUVs and vans in the US to electric only operation within four years to save enough fuel consumption to actual reduce fuel prices, reduce emissions and advance electric and hybrid vehicle technology. It was horribly apparent that there are few electric/plug-in hybrid vehicle choices today, and that GM and Ford seem to be way behind and undervalue or underestimate consumer demand. It seems that smaller, niche manufacturers will fill the void over the next few years.
I was also lucky enough to test drive an electric motorcycle. Although I raced motorcross when I was a teenager, I am pretty darn afraid of motorcycles, but I had a blast on this hot-rod, all electric motorcycle. It was based upon a Ducati street sport bike and had amazing acceleration, control and balance. Getting up to freeway speeds was as easy as moving the throttle to as fast as you wanted to go, and slowing down was again merely a control of the throttle position. No shifting required, ever. Wow, no shifting was far better than I ever expected and actually IMPROVED control. This coming from a guy who has always preferred manual transmissions. Brakes were only required when below about 5 mph, as regenerative braking took care of the rest. I was amazed at the performance and loved the quiet ride without all of the obnoxious noise associated with many motorcycles. If you might be interested in investing in an all electric motorcycle company, write me and I'll connect with you the excellent founder of this start up company.

subset: commoncrawl


text:
Saul & Carrie
Very helpful, patient and caring–wonderful lady and best agent we have ever had and we have moved a lot!!!! Keeping us in the loop–picking up things at our place and drop off too for signatures and keys, etc.—worked diligently for our well-being in all transactions, took care of house in so many ways and us!!! –She is the best!!!
Leave a Reply
You must be logged in to post a comment.


text:
If you're looking for Shaun Vain these days, look no further:
Stay informed on global issues by reading the Mid-Atlantic Exposè.
Take a look at what's going on with the animals I found.
Are you interested in getting help on a project? Get more information about my writing services for your business needs.


text:
What Is a Thesis Paper and How to Deal With It
What is a Thesis Paper?
A thesis paper is an academic form of writing of which the purpose is to identify an issue and establish what the author's stance is on a particular aspect of the issue. In the paper, compelling evidence of different forms must be used, such as statistics and quotes. We have prepared some guidelines that can help you to understand what does thesis paper mean and how to write it successfully.


text:
Heavy hauling transport services are very much required for those who are moving their home or office from one place to another. So, in case you are shifting from one city to another, you need to have reliable options to help you in the process of transporting all of your material possessions. It is in order to ensure the safety and security of these materials that you are moving you need to appoint businesses that provide such shifting facilities. Only thereby you can remain free from any sort of tension about the conditions of your possessions while transporting or getting them delivered rightly on time to the desired location. Heavy hauling transport facilities are also required by the business entities that are related with heavy industries like that with construction. This indeed forms to be a major part of their logistics support. It is on these service providers that the heavy industries depend upon to transport their equipments and materials to one location to another. These also include multi ton shipments of huge value that are required to get transported from one part of the country to another. So, it is quite obvious that the global business entities will always look to ensure a better and more secure option to ferry their equipments. Heavy transport companies are professional entities that possess an over extensive fleet of trucks. All of these vehicles are built to stand pressure and to provide a cushion for the heavy equipments that are contained in them. Also these companies arrange for cargo in the container ships or freight carriers. In addition to this, you can also send your materials and equipments through them by railroad transfer. One of the best things about going with these well-reputed companies is that they enjoy a network that span all over the entire country and even world. So, whenever you need to transport your equipments and materials to different locations you can always put your trust on one of these reputed hauling facilities. Some of the companies that provide hauling services to the large corporations and to individuals even arrange for an insurance policy for the optimum safety of your investments. These policies are available in a customized manner to meet all the parameters of road safety and security. Suppose you are sending hazardous materials or expensive goods and equipments via one of these well renowned companies. Then a proper coverage plan will be laid down to guarantee you with an option in case if some unforeseen mishaps happen on the road and consequently your products got irreparable damages. So, while going with any of these reputed heavy transport companies, you can be sure of enjoying a great deal of all round facilities. However, while look for the hauling services you must go along with a company that not only has a good track record, but also need to be spread well throughout the country. It is then only you can enjoy the best of services and also be sure of getting your assignments delivered right on time.
If you are looking to have a Heavy Hauling Transport facility, please visit www.wclogistics.net herewith you can be sure to find Heavy Transport facilities with a lot of ease and comfort.
Article Source:http://www.articlebiz.com/article/1051554193-1-all-the-necessary-aspects-of-heavy-hauling-transport/
This article has been viewed 682 times.


text:
China tackles climate change and honors the Paris Agreement
Geneva, 18 January 2017 - Chinese president Xi Jinping highlighted the need for action on climate change in an address to the United Nations in Geneva on the 18th of this month. In his speech, Xi referenced the Paris Agreement, and emphasized the role of governments around the world in ensuring the agreement is adhered to and upheld in upcoming years.
"The Paris agreement is a milestone in the history of climate governance. We must ensure this endeavor is not derailed," said Xi, "All parties should work together to implement the Paris agreement. China will continue to take steps to tackle climate change and fully honor its obligations."
These statements in Geneva mirrored much of what Xi spoke about at the World Economic Forum annual meeting in Davos, Switzerland, two days prior. In a clear appeal to United States President Donald Trump, Xi noted that "walking away" from the pact would be to the clear detriment of future generations' wellbeing. "We should join hands and rise to the challenge", Xi stated.
During his address in Davos, Xi highlighted the economic growth experienced by his country thanks to green development investments, saying they were already "paying off" despite many being implemented in only the last few years. Recent action by the president, namely the suspension of 101 coal-power projects across the country worth 430 billion yuan, or USD 63 billion, further highlights China's commitment to reducing emissions and developing a greener economy. Earlier in January, China was also in the news for pledging to invest 2.5 trillion yuan (USD 360 billion) in renewable energy, including wind, hydro, solar and nuclear power, by 2020. This investment is set to create 13 million new jobs in the sector. In addition, renewable power will contribute to about half of all new electricity generation by the year 2020 as a result of the investment.
As a PAGE member country, China has continuously placed emphasis on the Inclusive Green Economy approach to growth since its acceptance into the partnership in June 2015. At the national level, China views green economy as a balance between economic growth, improved ecosystems and environmental quality, and inclusive and balanced distribution of benefits between regions, cities and rural areas and with all people. The country included "green development" as a major pillar of growth in its 12th Five-Year Plan (2011-2015) and its current 13th Five-Year Plan (2016-2020).
On a regional level, PAGE works within the Jiangsu Province, home to 80 million people. To maintain its competitiveness and achieve inclusive development for its citizens, the province has committed to greening its economy. Jiangsu started mainstreaming green elements into its economic development plans in 2000 and set the overall target of "building up a moderately prosperous society in an all-round way and realizing modernization by 2020" in 2003. Its upcoming plans, including the 13th Five-Year Plan for the National Economic and Social Development of Jiangsu Province and other legislation, reveal clear focus on many of the Sustainable Development Goals (SDGs). For example, Goal 5 on Gender Equality is incorporated into evaluation mechanisms on gender equality policies and regulations and Goal 14 on Life Below Water is addressed in the Plan for Jiangsu Province for Ecological Civilization Construction, which sets targets for offshore water quality. Local initiatives include the "Green Jiangsu" project designed to increase forested areas within the province and the "Work Program on Circulation of Industrial Parks" which aims to make logistics, water supply, power supply, heat supply, lighting, buildings and other infrastructures in industrial parks more sustainable and self-contained.
The recent comments of President Xi reflect the efforts made in Jiangsu Province and underline the country's commitment to greening its economy. Through information sharing events, PAGE has received interests from other provinces and cities in China committed to inclusive green economy transition. Additionally, the efforts in Jiangsu have inspired three additional provinces in China to undertake inclusive green economy projects of their own. To facilitate learning and information sharing between the provinces, a network is being established to share best practices and encourage continued action. PAGE will continue to work collaboratively with the Government of China to support both provincial and national transition towards an Inclusive Green Economy.
For more on Jiangsu Province's transition to an inclusive green economy, please see our 2016 stocktaking report here.


text:
Margin debt at all-time highs is one factor propelling a long-in-the-tooth bull market, now more than five years old.
But while securities lending is a profit center for brokerage firms, it will inevitably pave a primrose path to arbitration and a potentially adverse settlement for brokers involved in the practice.
In a speech last week, Dallas Federal Reserve President Richard Fisher cited record-high margin debt as one indicator of today's "irrational exuberance," purposely echoing the phrase made famous by former Fed chairman Alan Greenspan.
Margin lending refers to the loans a brokerage firm will make available to its clients in order to increase the amount of securities they can purchase; the loans are secured by the securities held in the customer's brokerage account.
Investors accepting such loans are hoping to earn a return on their investments in excess of the margin interest rate they pay the brokerage firm for the loan.
Such transactions can be quite profitable in a bull market like today's, but in many situations margin loans risk violating FINRA suitability standards obligating brokers to limit transactions only to those in the client's best interest.
To learn how brokers can protect themselves — and their clients — from future arbitration headaches, ThinkAdvisor reached out to Chicago-based securities attorney Andrew Stoltmann, who represents investors with arbitration claims against their brokers.
Stoltmann has a unique perspective — not only because he has represented some 1,000 claims against brokers since 1999, but because he himself worked as a broker at Merrill Lynch for two years before he went to law school.
"I hated the cold calling, the prospecting," he says. "I saw a lot of bad things even at a Merrill Lynch that were absolutely incredible. I said to myself I'd rather sue these guys than continue to be one of them."
ThinkAdvisor: What do you see in the market today that should be of concern to financial advisors?
Stoltmann: I feel like I'm living in the movie "Groundhog Day." It seems that every 10 years we see a massive surge in margin. The last time it really got this bad was the late '90s before the 2000 market crash.
Brokers just salivate on taking out margin loans for clients in part because the brokerage firms get part of that interest. But it also allows for additional purchases for generating commission and fees.
And for me, as a plaintiff's lawyer, it's like shooting fish in a barrel when these brokers recommend margin to many of their clients.
Which brokers do you have in your sights?
If the client's over the age of 50; if the client's retired; if the client has a relatively significant amount of their net worth with that broker, it's simply going to be an easy suitability claim for me to make when the market tanks 20%.
Would brokers catering to wealthy clients be less vulnerable?
If you have a 47-year-old cardiologist making $700,000 a year and his portfolio has $300,000 worth of margin and he sustains significant losses, I'm not going to take that case, and he's not going to win the FINRA arbitration.
But if you have a 57-year-old blue-collar factory worker who loses $2,000 in his $5,000 account, it's going to be very difficult for a broker to explain to an arbitration panel why that's suitable.
Aren't brokers in some sense herded by their firm into margin lending? Is it more the broker's problem or the firm's problem when it gets to arbitration?
The average client is reading that the market is surging. The broker doesn't have bad intent, but he wants to magnify those returns. And the client bites off too much risk for him or her to handle. And it becomes the broker's problem when the market crashes.
Wouldn't the brokerage firm want to forestall a wave of arbitration claims by preventing unsuitable loans?
The brokerage firms make so much in profits off of those margin loans. The difference between what the firm borrows the money at and what it charges the client — that's pure profit. You have the firm, the branch managers, the supervisors all kind of burying their head in the sand because the profits to be made are so substantial.
And yet you say it's the broker's problem?
Stupidity on the part of the broker isn't a defense. And yes, the broker doesn't think it's going to end badly, but eight times out of 10 it does. Clearly the bonehead broker wasn't trying to lose his client money. In fact, he was trying to make his client money.
But the suitability rule is pretty stringent, and margin is a red flag from a suitability perspective.
Who typically pays an adverse judgment, the broker or his firm?
If the broker is still with the firm, usually the brokerage firm will pick up the tab. If the broker leaves the firm and the firm is named, they will often go after the broker for the amount they have to pay.
It depends on the relationship between the broker and his firm. If he's a big producer and they want to keep him happy, they'll pay it. If he's a small producer, and a complainer, they may make him pay the freight.
Is your business really based on "irrational exuberance," with lulls between the market spikes?
It is. My business is very cyclical. Once the market crashes, I'm swamped for about five years. Then it slows down, the bubble reinflates, bursts, then I'm swamped for another 5 years.
Brokers and brokerage firms never learn their lesson. It's greed more than anything else.
If these arbitration claims are like a scene out of "Groundhog Day," where are the regulators in all this?
You have an impotent regulator in FINRA and in the SEC, a truly toothless tiger. Nobody fears these guys. There's no real regulation in part because of the political influence the securities industry has over the SEC.
JPMorgan, Goldman Sachs, the major banks and brokerage firms are major contributors even to Obama. No other industry can get away with what they get away with.
The limited regulation, minimal congressional oversight and greed become a toxic brew of problems, and the investor gets left holding the bag.
The good news is it's allowed me to make a very good living for myself. But it's still sad.


text:
The demand for nail art is at an all time high. The designs are out of control and creativity is flowing through the tiny brushes that will bring all ten of your fingers to life. Stiletto nails, Swarovski crystals, glitter and 3D designs. You name it, it's nail-possible. I've been following Regina Rodriguez for quite some time now. Emily B from Love & Hip Hop is a loyal customer and Emily's nails are always a topic of discussion, so naturally I wanted to know a little more about the woman behind the magic, Regina. The 24-year-old Newport, VA sweetheart has been mastering her talent and bringing big smiles to hundreds of women who've gotten the opportunity to experience a private nail visit. Her Instagram following is an impressive 148k and growing.
What better way to get a look at her art then to get it on my own hands? I invited Regina to host a mini-manicure night from my home. Check out my nail tutorial video with Regina Rodriguez in the comfort of my living space in the video above, and some of her work in the photo.
article by Mashonda Tifrere for Global Grind Staff


text:
Online Casino central
|Software: Playtech Casinos
Languages: en, fr, es, it, de, jp, cn-sc, tr, da, fi, no, pt, sv
Currencies: $, £, €, $CAD, R, kr
USA Players: No
|The most natural choice for an online gambling destination, Online Casino Central is sure to become a favorite for new players and those seeking a welcome change from the ordinary.
Online Casino Central offers more than 80 games and a highly competitive 300% sign up bonus. Online Casino Central uses Playtech's award-winning software, featuring the high level of security and reliability players have come to rely on.
Online Casino Central currently offers multiple versions of your favorite casino games including blackjack, slots, video poker, craps and roulette to name just a few. In the months to come you can also look forward to no download software, poker, bingo, mobile games and more! Also coming soon will be the option to play in a variety of languages and currencies.
Online Casino central Bonus Codes
* Take full advantage of this offer and your bonus totals £/€/$ 600 in Sign Up bonuses!
Online Casino central Games
Online Casino central Support
Online Casino central offers 24 hours 7 day a week support via email, fax and toll-free phone:
Online Casino central Deposit Options
Casino Deposits and withdraws are also made quick and easy with a large selection of payment options available:


text:
On Sat, Aug 20, 2005 at 10:49:23PM +0000, W. Borgert wrote: > Hi, > > does a subversion repository for debian-doc exist? If so, > where? If not, are there any plans to create one? I would very > much prefer to use subversion instead of CVS for the Debian > reference card. If the subversion repository does not exist, > nor any plans exist to create one - would people mind, if I ask > for creation on behalf of the DDP? I would use it for the > reference card, but of course, it could be used for other things > as well. Thanks for any positive reply :-) There does not exist a SVN repo at the moment. But you could ask for one in association with the Alioth DDP project (I don't believe klecker has any SVN repos yet). The Alioth DDP project currently does have a CVS repository although there is no SVN repository yet (at least not in use IIRC). The only issue (already discussed in the list) related to Alitoh would be automatic building of that document and publishing of documents in the website. If a SVN repo is added we need to change stuff in order to have the servers that build the DDP CVS build from the SVN repo too. That requires intervention from the debian-admin group... Regards Javier
Description: Digital signature


text:
Health ChecksManaged Services
Identify and Optimise Your IT Systems
Would you like to know more about the IT infrastructure, software or websites that operates in your organisation and whether it is effective, optimised and running smoothly? Effective IT management starts with a bluesource Health Check giving reassurance that systems are ready in terms of performance and reliability.
Our enterprise-class Health Check methodology encompasses a comprehensive, deep dive into the target systems and will cover a range of aspects including:
- Product installation & configuration review
- Architecture and design review
- Capacity planning
- Best practice review
- Operational procedures
- Disaster recovery verification
- Review of system performance
Our senior technology consultants provide a full report with a detailed breakdown of all the key system touch-points which can be used as a basis for future maintenance, installations and upgrades. This will help you optimise your IT systems and identify areas that require improvement; which will save you time and money by reducing unplanned disruption to your business.
Managed Services Datasheet
Learn how our Managed Services can help your business.
Best Practice Guide
We've developed a handy guide to Managing Archive platforms. See how your system stacks up.
Case Studies
Learn more about why our clients continue to partner with bluesource to manage their critical systems.
Health Checks
Independent & impartial IT reviews to help you assess, evolve & manage the health of your system.


text:
King's safety shoes are well-known for their strength and durability, and these are no different. With reinforced steel cap and midsole, they are ideal for working in hazardous areas, or for cross-country walking excursions.
With the added benefit of a selection of width sizes to choose from, these safety boots can be moulded to fit your feet perfectly. With the soft textile lining, the collective result is perfectly crafted comfort with total protection. The soft padded ankle lining and lace fastenings give a smooth and comfortable fit.
These King's safety shoes represent a lasting investment, suitable for both work and play.
|Mens King's 53711 Safety Shoes
|Royal Mail
|£2.99 Recorded & Insured Delivery (1 - 3 working days)
|Super Fast - Next Day Delivery
|£12.99 on orders before 3:30pm
|International Delivery
|From £8.99 Worldwide
|Click here for more info on delivery


text:
A Year Without Mom follows 12-year-old Dasha through a year full of turmoil after her mother leaves for America. It is the early 1990s in Moscow, and political change is in the air. But Dasha is more worried about her own challenges as she negotiates family, friendships and school without her mother. Just as she begins to find her own feet, she gets word that she is to join her mother in America — a place that seems impossibly far from everything and everyone she loves. -Amazon
Sunny Lewin has been packed off to Florida to live with her grandfather for the summer. At first she thought Florida might be fun — it is the home of Disney World, after all. But the place where Gramps lives is no amusement park. It's full of . . . old people. Really old people.
Luckily, Sunny isn't the only kid around. She meets Buzz, a boy who is completely obsessed with comic books, and soon they're having adventures of their own: facing off against golfball-eating alligators, runaway cats, and mysteriously disappearing neighbors. But the question remains — why is Sunny down in Florida in the first place? The answer lies in a family secret that won't be secret to Sunny much longer. . .-Amazon
This series offers a wonderful mix of well-known and obscure tales from many cultures, each masterfully adapted and illustrated by different cartoonist.
For fans of Raina Telgemeier's Smile, a heartwarming graphic novel about friendship and surviving junior high through the power of roller derby.
For most of her twelve years, Astrid has done everything with her best friend Nicole. But after Astrid falls in love with roller derby and signs up for derby camp, Nicole decides to go to dance camp instead. And so begins the most difficult summer of Astrid's life as she struggles to keep up with the older girls at camp, hang on to the friend she feels slipping away, and cautiously embark on a new friendship. As the end of summer nears and her first roller derby bout (and junior high!) draws closer, Astrid realizes that maybe she is strong enough to handle the bout, a lost friendship, and middle school… in short, strong enough to be a roller girl.
In her graphic novel debut, real-life derby girl Victoria Jamieson has created an inspiring coming-of-age story about friendship, perseverence, and girl power -Amazon
Andy, a crabby alligator, is a reluctant friend to Preston, a young coyote pup. Find out what makes Andy even crabbier! They spend lots of time not catching rabbits, falling over cliffs, and trying to decide the difference between an owl and a bear. A perfect bridge between picture books and text-heavy chapter books.
Meet Ace and Bub, the flying beaver brothers! Ace loves extreme sports and is always looking for a new adventure. Bub loves napping and, well, napping. But when penguins threaten to freeze Beaver Island for "resort and polar-style living," the brothers put their talents to work saving their tropical island paradise. Can they save Beaver Island from environmental destruction? And can they do it in time to still win the annual Beaver Island Surfing Competition?
This hysterical series is loaded with exciting plot lines and lots of well-times blank stares. These books magically turned my son from a reluctant reader to a voracious one.


text:
No products in the basket.
Become a Teeth Whitening Trainer
- Are you already in the Beauty Industry?
- Do you have a passion for seeing others succeed?
- Are you energetic and vibrant with a can-do attitude?
- Would you like to have flexibility around when you work?
If the answer to all 4 above questions is yes then we may have the answer. Become a Trainer for Naturawhite and see your potential soar.
Cosmetic Teeth Whitening is a booming business and all across the country Beauticians and Salons are adding this service to their current product ranges, which means we need people like you to be out there, up and down the country, showing them how easy it is to get up and started and the potential earnings they could be making through a simple effective process.
No 2 days are alike. You could be visiting people in their own homes, be on the high street in salons or travel to beauty shows up and down the country to demonstrate the product and pick up potential sales.
You're backed by a vibrant office with years of sales knowledge and great customer service as well as being part of a company that has been around since 2002.
Become a Trainer
Becoming a Trainer is simple and could give you better financial freedom:
- Full training is provided
- Basic salary & commission paid
- Milage allowance (terms and conditions apply)
- Hold a full drivers license
- Have access to a car
- Own a mobile phone


text: BUSINESS Greeks roast Bean at int'l b.o. 5:00 AM PDT 4/9/2007 by Frank Segers , AP FACEBOOK TWITTER EMAIL ME '300' marches back to top chart; 'Holiday' slips to 2nd In a see-saw contest with "Mr. Bean's Holiday," Warner Bros. International's super-violent "300" tipped back into the No. 1 spot internationally this Easter weekend, grossing an estimated $32 million from 6,500 screens in 61 markets, hiking its overseas total to $173 million."300" bested "Holiday" — reclaiming the No. 1 position it held two weekends ago — on the strength of huge results from several territories including Germany, where the Zack Snyder-directed epic about Spartan soldiers at the battle of Thermopylae opened to an estimated $6.3 million (including sneak previews). In Australia, the weekend tally was an estimated $4.6 million from 337 screens that, according to WBI, "marks the industry's biggest April opening weekend of all time." Third stanza weekends for "300" in key holdover markets included Spain (an estimated $2.4 million from 543 sites for a market total of $16 million); the U.K. ($1.98 million from 382 situations for a cume of $23.2 million); Italy ($1.3 million from 470 situations for a cume of $12.1 million); and France ($1.2 million from 464 screens for a cume of $10.8 million). British comedian Rowan Atkinson as Mr. Bean blundered into the No. 2 spot with an estimated $30.1 million from 4,294 screens in 44 territories.The latest in the comedy series takes the mishap-prone title character from London to the French Riviera, including the Festival de Cannes, finishing first in 10 of the 18 new territories it played while nailing down the top spots in such key holdover markets as the U.K. and Spain.In its three weekends in release (the film bowed in Singapore and Malaysia in its first overseas weekend), "Holiday" has grossed $86.7 million. Distributor Universal International noted that today is a holiday in many countries "and we expect big results that day," pushing "Holiday" to the $100 million mark internationally by Tuesday. Most notable among the new markets is Italy, where "Holiday" grabbed the top spot with an estimated $2.7 million from 339 screens or nearly $8,000 per screen and a 25% market share, Universal's biggest market opening weekend of the year. In Mexico, it opened at No. 5 with an estimated $1.1 million from 275 locations, surpassing the entire market take of 1997's "Bean." In Brazil, "Holiday" bowed at No. 2 with $800,000 from 140 sites, behind "300" but 30% ahead of the opening of "Meet the Robinsons."In the all-important U.K. market, "Holiday" ranked No. 1 for the second consecutive weekend with an estimated $5.7 million from 512 screens, collecting a hearty $11,133 per-screen average; the film's 10-day total stands at $27.4 million. In Spain, "Holiday" grabbed the top spot from "300" with an estimated $2.3 million from 280 sites for a 10-day total of $6.3 million. In Australia, the second weekend take was an estimated $2.6 million from 257 locations, enough for a No. 2 market ranking and an 11-day cume of $6.9 million. The Germany results were particularly strong: "Holiday" raked in $4.6 million from 845 screens (a 26% market share), making its nine-day total $11.3 million. "Holiday" has played most key foreign territories for the Easter break but has a dozen more markets to go over the coming months. The films bows Aug. 31 in the U.S. Finishing in the No. 3 spot was Buena Vista International's "Robinsons," which laughed all the way to an estimated $9.5 million from 3,900 screens in 36 markets, lifting its overseas cume to $25.7 (worldwide $77.9 million). Openings for the Disney-generated 3-D animation title included Brazil (an estimated $850,000 from 260 screens), Hong Kong (No. 1 with $485,000 from 40 sites for a $12,125 per-screen average) and Singapore ($340,000 from 30 locations for a per-screen average of $11,333).No. 4 this weekend was newcomer "The Reaping" from WBI, a horror thriller about biblical plagues afflicting a small town, which captured an estimated $7.1 million in its debut in 16 markets. BVI's "Wild Hogs" bagged the No. 5 spot with an estimated $3.5 million on the weekend from 1,400 screens in 10 markets for an international cume to date of $18.5 million. DreamWorks/Paramount Pictures International's "Blades of Glory," the comedy that finished first domestically this weekend, opened in the U.K. at No. 2, earning $2.1 million from 362 situations. The other international newcomer is "Are We Done Yet?" Sony Pictures Releasing International's comedy starring Ice Cube, which managed $745,000 from 425 screens in Mexico and Australia. FACEBOOK TWITTER EMAIL ME Frank Segers email@example.com @thr AP firstname.lastname@example.com @thr


text:
Business Ties
- There are 50+ Swedish companies at 100 locations in greater Chicago including: Cision's, Combi Wear, Electrolux, Ericsson, H&M, Sandvik, Scandinavian Airlines, SKF and Trelleborg Sealing
- There are nearly 60 Chicago-area companies in Sweden including: Abbott, Baxter, CAN Financial, Northern Trust, United Continental, McDonald's, Motorola Solutions, TBricks and Underwriters Laboratories
- Consulate General of the Kingdom of Sweden in Chicago
- Swedish Trade Council in Chicago
- Sweden-US Chamber of Commerce in Chicago
- Chicago-Gothenburg Sister City relationship, since 1987
- There are 5 weekly nonstop departures from Chicago airports to Stockholm, and daily flights in summer.
- An estimated 136,000 Swedish-Americans reside in the Chicago area
- A delegation from Swedavia, a government group that owns and operates airports across Sweden, visited Midway International on a fact-finding mission, Mar. 2012
- WBC participated in the Swedish E-Days event in Chicago, a rotating forum that brought together dozens of American and Swedish companies, Apr. 2007
Recent Expansions
- Cision/Vocus office move, Chicago, 2015
- TBricks, financial IT office in Chicago, 2013
- H&M, retail, multiple locations, Chicago, 2013 and prior years; Lombard, 2014
- Electrolux, expansion to 965,000 sq. ft. distribution center in Minooka, 2013
- Ericcson Inc., sales office in Schaumburg, 2010
- Sandvik AB, acquired Rexam's beverage can business, 2007
- SKF, relocation of production from South Dakota, 2006
Total Trade, 2016: US $696 million
- Total Imports to Illinois, 2016: US $501 million
- Top Import Categories, 2016: Machinery/parts, iron & steel, aircraft parts, tools, medical instruments, pharmaceuticals, electric machinery and electronics, diagnostic chemicals, spirits, plastics
- Total Exports from Illinois, 2016: US $195 million
- Top Export Categories, 2016: Precious metals scrap, earthmoving equipment, trucks, electric machinery, books, chemicals, medical instruments, iron & steel, tools


text:
ColdFusion Iterating Business Objects (IBOs) From The Ground-Up
Peter Bell recently wrote an article for the ColdFusion Developer's Journal (CFDJ) on using Iterating Business Objects in ColdFusion. I have heard about these IBOs for a long time, so now that there was some source code to look at, I really dove right in. In order to learn more about a chunk of code, I often times try to build it from the ground up using my own formatting so that I can truly understand how all the pieces fit together without having to worry about the way it was written (from a stylistic standpoint).
As I was duplicating and modifying the code, there were some issues that began to come to light for me personally. Now, please don't take this as any sort of insult to Peter Bell's work. I think Peter's work is quite excellent. This is just a simple review by someone who has less experience.
For starters, I was not crazy about the name BaseObject.cfc. To me this is too general. This isn't just a base object; it provides base functionality for Iterating Business Objects. In my limited experience, I have come to think of these things as Abstract objects. So, to drive home the point that it has some functionality and is for IBOs, I have named my build AbstractIBO.cfc.
Access And Mutate
Ok, I simply didn't understand this one :) I kind of get the idea - we are hiding the implementation of the getting and setting from the Get() and Set() functions... but I just don't get why. My best guess is that this is some sort of Template Method Pattern where the extending, concrete classes can override the Access and Mutate functions. But, since I didn't understand it, I left it out. It can always be added back in later.
Number Of Records
It took me a while just to figure out why the iterating part of the IBO would work. To me it seemed like it would only ever iterate to N-1 records. Finally, I figured out that his private variable, VARIABLES.NumberOfRecords actually held the value N+1. While this is clever, it just seems misleading. I have actually removed this variable all together. In my mind, the Number of Records will always be related to the internal data structure and can be accessed as such. Of course, a NumberOfRecords would be a nice short hand, so I might put it back in later.
I do however have a public THIS.RecordCount (trying to keep with the ColdFusion query record set naming) that is equal to the internal data's record count. This way, there is no discrepancy between the public numbers and the private numbers. I think this goes a long way for helping others understand the code.
Peter loops over his IBO until IsLast() returns true. If you look at IsLast(), it returns true once the current iteration has gone past the last record. For me, this is just akward. If anything, this would be IsAfterLast(). Whether or not you like that naming convention, I think it is a bad idea to use IsLast() as that has a precedence in the Iterating world to mean "pointing AT the last record" not past it. Likewise, there is often times an IsFirst() which indicates pointing at the first record. In fact, the ColdFusion query objects have both an IsFirst() and IsLast() methods. To have one method mean something and related method mean something different is going to hurt the learning curve.
To keep naming conventions consistent, I have changed the IsLast() to mean is last. I have added a method called, IsRecord(). I am not sure I am sold on this name, but at least it has a bit more meaning to my brain. IsRecord() returns true if the current iteration is pointing towards a valid record. If this iteration goes past the record set, then this returns false. This just feels more natural.
Run Time Property Evaluation
When someone goes to Get() or Set() a property, Peter is checking to see if it is an allowed property - whether we are allowing "SELECT *" mentality or if it is in the explicit list of available properties. He then also checks to see if the property exists as a method or a record set property.
To me, this is not performance friendly. He is doing a ListFind(), and string evaluation, and an Evaluate() call. This is easy stuff, but I just felt that it could be faster. Instead of doing this kind of checking at Run Time of the Get() and Set() methods, I am doing this checking at the load time of the query, during the LoadQuery() method call.
As soon as the query is passed in, I build up the list of available properties based on the explicitly property list and the Get and Set functions of the concrete, extending object. I create a structural mapping that uses the property names a structure keys and the access type (Query column vs. Get/Set Method) as the value. Then, during the Get() and Set() calls, I can access this structure based on the property that was passed in.
Structures, as Hash Tables, have extremely fast look up. By storing the properties in this look-up structure, I can quite efficiently determine which properties are valid and how they should be accessed. This puts the bulk of the processing at query-load time (which is only run once) and allows for a very fast Get and Set actions (which have to happen on a N-times type basis).
Returning Empty String As Invalid
This is quite minor, but the BaseObject.cfc returns an empty string if the accessed property is not available. To me, this just seems a bit off. I have chosen to throw an error. This is minor detail and something that can probably be abstracted out to be overridden by the concrete, extending class.
Other than the fact that I calculate the available properties at this point, there was also some other code that I didn't understand. Peter was copying the query into an internal struct structure. I didn't really follow what was going on. It looks like maybe this was done to allow for a zero-length query. It may have also been done to have a completely separate data set (that would not be altered by outside pointers). Again, not really sure. In my build, I just Duplicate() the given query into the IBO. This is fairly fast action, but unlike what I think his might be doing, mine will break if you try to access a zero-record data set. I suppose his is more inline with how ColdFusion works.
Too Dynamic / Too Naming-Convention Dependent
As I was adding functionality to my IBO build, one thing that I realized is that it was too dependent on naming conventions. Namely, it checked to see if a private method started with "Get" or "Set" and that was it. This was too much flexibility for me. It was picking up methods that I didn't want it to pick up (ie. GetAccessHints() when using *). To work around this, I have added the "mapto" attribute to the CFFunction tag. Only functions that use this are available as a Getter or Setter method.
While this is not a valid attribute of the CFFunction tag, it is available as part of the function's Meta Data (GetMetaData( fnPointer )). This solution has several benefits in my mind.
- It explicitly points out which methods are for getting and setting attributes. Not only does this allow you to have other "Get" and "Set" prefixed methods that are NOT used for getting and setting properties, I find explicit declarations a bit more comforting. They help me sleep a bit better a night.
- It allows for differences in naming conventions between your database and your CFC methods. For example, I use the "_" in my database naming convention. A person's first name in the database would be "first_name". In order for this to be Get'ed as a function rather than a query column, I would have to have a CFC method named GetFirst_Name(). This violates my CFC naming convention which states that I cannot use "_" in CFC names or methods. What I want to do is have a CFC method named GetFirstName(). This however would NOT be picked up by the original IBO which relied only on naming conventions. The MapTo attribute allows me to have a GetFirstName() method and map it to the first_name property via mapto="first_name".
Now, On To The Code
So, that was my review of Peter Bell's Iterating Business Object. Again, please do not take this as a tear-down of his code. I think it is quite good and very innovative. I would never have come up with something like that in a million years. Pete knows how I feel. But anyway, let me show you what I came up with based on his code. This is flawed, but attempts to overcome the issues I have listed above.
- <cfcomponent
- displayname="AbstractIBO"
- output="false"
- hint="This handles the base functionality of an Iterating Business Object.">
- <!--- Run the pseudo constructor to set up default data structures. --->
- <cfscript>
- // Set up the instance object in the private memory scope.
- VARIABLES.Instance = StructNew();
- // This is the index of the current iteration.
- VARIABLES.Instance.IterationIndex = 1;
- // These are the list of keys that can be "get"ed and "set"ed in some
- // way. We are not going to define how they are accessed at this moment.
- // That will be done once the underlying data structure is set. These will
- // populate the Get/Set structures (that follow).
- VARIABLES.Instance.GetAttributesList = "*";
- VARIABLES.Instance.SetAttributesList = "*";
- // This is a structure of keys that can be "get"ed and "set"ed. These
- // will be populated based on the attributes list above.
- VARIABLES.Instance.GetAttributes = StructNew();
- VARIABLES.Instance.SetAttributes = StructNew();
- // This is a structure that will alias the getter and setter methods.
- // We are doing this so that we don't have to care about any method
- // mapping.
- VARIABLES.Instance.GetAttributeMethods = StructNew();
- VARIABLES.Instance.SetAttributeMethods = StructNew();
- // This is the underlying data object. I am initializing to an empty qyery.
- // I can't believe this actually works, but at least it puts a query object
- // as this variable value.
- VARIABLES.Instance.RecordSet = QueryNew( "" );
- // Set up the non-instance private data.
- // These are the types of getter/setters that can be accessed/mutated.
- // Right now, a value can either be accessed as a property or as a
- // function of the underlying data structure. These values are meant to
- // be constant and are therefore not part of the instance variable struct.
- VARIABLES.KeyTypes = StructNew();
- // This defines a key as being accessed as a method.
- VARIABLES.KeyTypes.METHOD = 1;
- // This defines a key as being accessed as a property.
- VARIABLES.KeyTypes.PROPERTY = 2;
- // Set up the default public data.
- THIS.RecordCount = 0;
- THIS.CurrentRow = 0;
- </cfscript>
- <cffunction name="Init" access="public" returntype="AbstractIBO" output="false"
- hint="Returns an initialized Abstract IBO instance.">
- <!--- Return This reference. --->
- <cfreturn THIS />
- </cffunction>
- <cffunction name="First" access="public" returntype="void" output="false"
- hint="Resets the IBO cursor to point to the first record in the record set.">
- <!--- Set the index. --->
- <cfset VARIABLES.Instance.IterationIndex = 1 />
- <!--- Set the public data. --->
- <cfset THIS.CurrentRow = 1 />
- <!--- Return out. --->
- <cfreturn />
- </cffunction>
- <cffunction name="Get" access="public" returntype="any" output="false"
- hint="Gets the value at the given key. Throws an error if the key is not available.">
- <!--- Define arguments. --->
- <cfargument name="Key" type="string" required="true" />
- <!--- Define the local scope. --->
- <cfset var LOCAL = StructNew() />
- <!--- Check to see if the key is available. --->
- <cfif StructKeyExists( VARIABLES.Instance.GetAttributes, ARGUMENTS.Key )>
- <!--- This key is valid. Check to see how it is being accessed. --->
- <cfif (VARIABLES.Instance.GetAttributes[ ARGUMENTS.Key ] EQ VARIABLES.KeyTypes.PROPERTY)>
- <!--- Return the property straight out of the record set. --->
- <cfreturn VARIABLES.Instance.RecordSet[ ARGUMENTS.Key ][ VARIABLES.Instance.IterationIndex ] />
- <cfelse>
- <!---
- The key is being accessed as a method. Get a pointer to the method.
- We need to get the interim method since ColdFusion cannot handle the
- parsing of an array notation followed by a method call.
- --->
- <cfset LOCAL.Method = VARIABLES.Instance.GetAttributeMethods[ ARGUMENTS.Key ] />
- <!--- Return the value of the get method. --->
- <cfreturn LOCAL.Method() />
- </cfif>
- <cfelse>
- <!--- The key is not available for getting. Throw an error. --->
- <cfthrow
- message="You have attempted to access an invalid key."
- type="IBO.InvalidGetKey"
- detail="The key you are trying to get, which is currently #UCase( ARGUMENTS.Key )#, is not available in this IBO."
- />
- </cfif>
- </cffunction>
- <cffunction name="GetAccessHints" access="public" returntype="struct" output="false"
- hint="This is meant for debugging so you can see how the properties are being accessed.">
- <!--- Define the local scope. --->
- <cfset var LOCAL = StructNew() />
- <!--- Create a structure to return both the getter and setter info. --->
- <cfset LOCAL.Hints = StructNew() />
- <!--- Set the keys so that the access methods make sense. --->
- <cfset LOCAL.Hints.Keys = Duplicate( VARIABLES.KeyTypes ) />
- <!--- Set the getters and setters. --->
- <cfset LOCAL.Hints.Get = Duplicate( VARIABLES.Instance.GetAttributes ) />
- <cfset LOCAL.Hints.Set = Duplicate( VARIABLES.Instance.SetAttributes ) />
- <!--- Return the hints. --->
- <cfreturn LOCAL.Hints />
- </cffunction>
- <cffunction name="GetPropertyList" access="public" returntype="string" output="false"
- hint="Returns the property list.">
- <cfreturn VARIABLES.Instance.GetAttributesList />
- </cffunction>
- <cffunction name="IsFirst" access="public" returntype="boolean" output="false"
- hint="Determines if the IBO is pointing at the first record.">
- <cfreturn (VARIABLES.Instance.IterationIndex EQ 1) />
- </cffunction>
- <cffunction name="IsLast" access="public" returntype="boolean" output="false"
- hint="Determines if the IBO is pointing at the last record.">
- <cfreturn (VARIABLES.Instance.IterationIndex EQ VARIABLES.Instance.RecordSet.RecordCount) />
- </cffunction>
- <cffunction name="IsRecord" access="public" returntype="boolean" output="false"
- hint="Determines if the IBO is pointing at a valid record. If the IBO goes past the last index of the current record set, this will return false.">
- <cfreturn (VARIABLES.Instance.IterationIndex LTE VARIABLES.Instance.RecordSet.RecordCount) />
- </cffunction>
- <cffunction name="LoadQuery" access="public" returntype="any" output="false"
- hint="This loads the given query data into the IBO.">
- <!--- Define arguments. --->
- <cfargument name="RecordSet" type="query" required="true" />
- <cfscript>
- // Define the local scope.
- var LOCAL = StructNew();
- // Duplicate the query when storing it in the IBO. I am not sure that
- // I completely agree with this, but it seems that this is (in part)
- // what the original code is doing. We are doing this so that even if
- // the query is altered after it is sent it, it does not affect the
- // underlying data of the IBO.
- VARIABLES.Instance.RecordSet = Duplicate( ARGUMENTS.RecordSet );
- // Now that we have the data stored in our IBO, we can populate the
- // structures of getters and setters. If the list is "*" then we
- // are going to copy the record set's column list over into the list
- // of getters and setters. Otherwise, we will keep it as is.
- // Set local flags for select all.
- LOCAL.IsGetAll = VARIABLES.Instance.GetAttributesList.Matches( "\*" );
- LOCAL.IsSetAll = VARIABLES.Instance.SetAttributesList.Matches( "\*" );
- // Check to see if we are getting all properties.
- if (LOCAL.IsGetAll){
- // The Get attributes list will be the record set's column list.
- VARIABLES.Instance.GetAttributesList = VARIABLES.Instance.RecordSet.ColumnList;
- }
- // Check to see if we are setting all properties.
- if (LOCAL.IsSetAll){
- // The Set attributes list will be the record set's column list.
- VARIABLES.Instance.SetAttributesList = VARIABLES.Instance.RecordSet.ColumnList;
- }
- // At this point, we have the get and set attributes list which have
- // been populated either by the record set OR hard coded by the concrete
- // extending IBO. Let's store these keys into the get and set attributes
- // structures for faster lookup and editing.
- // Loop over get property list.
- for (
- LOCAL.PropertyIndex = 1 ;
- LOCAL.PropertyIndex LTE ListLen( VARIABLES.Instance.GetAttributesList ) ;
- LOCAL.PropertyIndex = (LOCAL.PropertyIndex + 1)
- ){
- // Get the current property.
- LOCAL.Property = ListGetAt( VARIABLES.Instance.GetAttributesList, LOCAL.PropertyIndex );
- // Set the property to a default value.
- VARIABLES.Instance.GetAttributes[ LOCAL.Property ] = 0;
- }
- // Loop over set property list.
- for (
- LOCAL.PropertyIndex = 1 ;
- LOCAL.PropertyIndex LTE ListLen( VARIABLES.Instance.SetAttributesList ) ;
- LOCAL.PropertyIndex = (LOCAL.PropertyIndex + 1)
- ){
- // Get the current property.
- LOCAL.Property = ListGetAt( VARIABLES.Instance.SetAttributesList, LOCAL.PropertyIndex );
- // Set the property to a default value.
- VARIABLES.Instance.SetAttributes[ LOCAL.Property ] = 0;
- }
- // Now, let's collect the IBO methods that have been mapped to properties.
- // This is done to allow for differences in naming conventions between the
- // database (which results in the record set) and the CFC methods. For
- // instance, the database might have "first_name", but for naming convention's
- // sake, we can't have a method named "GetFist_Name". To accomodate this,
- // we are forcing the methods to use the "mapto" attribute. Method's without
- // this attribute (for both GET and SET) will be ignored.
- // Loop over the methods to check for anything that begins with "get" or "set".
- for (LOCAL.CFCProperty in VARIABLES){
- // Check to see if this is a user-defined function. We only care
- // about things that can be called as functions.
- if (
- IsCustomFunction( VARIABLES[ LOCAL.CFCProperty ] ) AND
- StructKeyExists( GetMetaData( VARIABLES[ LOCAL.CFCProperty ] ), "MapTo" ) AND
- (
- (Left( LOCAL.CFCProperty, 3 ) EQ "GET") OR
- (Left( LOCAL.CFCProperty, 3 ) EQ "SET")
- )){
- // Get the mapto attribute value.
- LOCAL.MapTo = GetMetaData( VARIABLES[ LOCAL.CFCProperty ] ).MapTo;
- // Check to see if this is a get method and that it is in the defined
- // list of "get"able properties.
- if (
- (Left( LOCAL.CFCProperty, 3 ) EQ "GET") AND
- (
- LOCAL.IsGetAll OR
- StructKeyExists( VARIABLES.Instance.GetAttributes, GetMetaData( VARIABLES[ LOCAL.CFCProperty ] ).MapTo )
- )){
- // Flag this property as being accessed as a method.
- VARIABLES.Instance.GetAttributes[ LOCAL.MapTo ] = VARIABLES.KeyTypes.METHOD;
- // Set the method alias.
- VARIABLES.Instance.GetAttributeMethods[ LOCAL.MapTo ] = VARIABLES[ LOCAL.CFCProperty ];
- // Check to see if this is a set method and that it is in the defined
- // list of "set"able properties.
- } else if (
- (Left( LOCAL.CFCProperty, 3 ) EQ "SET") AND
- (
- LOCAL.IsSetAll OR
- StructKeyExists( VARIABLES.Instance.SetAttributes, GetMetaData( VARIABLES[ LOCAL.CFCProperty ] ).MapTo )
- )){
- // Flag this property as being accessed as a method.
- VARIABLES.Instance.SetAttributes[ LOCAL.MapTo ] = VARIABLES.KeyTypes.METHOD;
- // Set the method alias.
- VARIABLES.Instance.SetAttributeMethods[ LOCAL.MapTo ] = VARIABLES[ LOCAL.CFCProperty ];
- }
- }
- }
- // Convert the record set column list to a structure for faster access.
- LOCAL.Columns = StructNew();
- // Loop over columns and add keys to column struct.
- for (
- LOCAL.ColumnIndex = 1 ;
- LOCAL.ColumnIndex LTE ListLen( VARIABLES.Instance.RecordSet.ColumnList ) ;
- LOCAL.ColumnIndex = (LOCAL.ColumnIndex + 1)
- ){
- // Add to struct. The value here is not important.
- LOCAL.Columns[ ListGetAt( VARIABLES.Instance.RecordSet.ColumnList, LOCAL.ColumnIndex ) ] = 0;
- }
- // At this point, we should already have all the mapped methods accounted for.
- // Now, we have to figure out which of the properties will be accessed as a
- // property (and which ones are not valid in any access form). To get this,
- // let's loop over the get and set properties and for each property that is
- // not being accessed as a method, check to see if there is an equivalent
- // record set column.
- // Loop over get attributes.
- for (LOCAL.Property in VARIABLES.Instance.GetAttributes){
- // Check to see if this attribute is zero. This would indicate a
- // property that has not been validated yet (and is just based on
- // the list of properties).
- if (NOT VARIABLES.Instance.GetAttributes[ LOCAL.Property ]){
- // This property has not been accounted for. Check for a
- // matching record set column.
- if (StructKeyExists( LOCAL.Columns, LOCAL.Property )){
- // There is a matching record set column. Set this property as
- // being accessed as a standard property.
- VARIABLES.Instance.GetAttributes[ LOCAL.Property ] = VARIABLES.KeyTypes.PROPERTY;
- } else {
- // This property has not been accounted for by either the mapped
- // methods or the record set columns. Delete this property from
- // the get attributes.
- StructDelete( VARIABLES.Instance.GetAttributes, LOCAL.Property );
- }
- }
- }
- // Loop over set attributes.
- for (LOCAL.Property in VARIABLES.Instance.SetAttributes){
- // Check to see if this attribute is zero. This would indicate a
- // property that has not been validated yet (and is just based on
- // the list of properties).
- if (NOT VARIABLES.Instance.SetAttributes[ LOCAL.Property ]){
- // This property has not been accounted for. Check for a
- // matching record set column.
- if (StructKeyExists( LOCAL.Columns, LOCAL.Property )){
- // There is a matching record set column. Set this property as
- // being accessed as a standard property.
- VARIABLES.Instance.SetAttributes[ LOCAL.Property ] = VARIABLES.KeyTypes.PROPERTY;
- } else {
- // This property has not been accounted for by either the mapped
- // methods or the record set columns. Delete this property from
- // the Set attributes.
- StructDelete( VARIABLES.Instance.SetAttributes, LOCAL.Property );
- }
- }
- }
- // At this point, we have set up the Get and Set attributes based on the
- // mapped methods and the record set column list. There might be some
- // differences between the hard coded set/get lists and the available
- // Set and Get attributes. Not sure how to handle that at the moment. I
- // am going to leave it as-is for now. However, we could certainly set
- // the get and let list based on the keys of the attribute structrures:
- //
- // For example:
- // VARIABLES.Instance.GetAttributesList = StructKeyList( VARIABLES.Instance.GetAttributes );
- // VARIABLES.Instance.SetAttributesList = StructKeyList( VARIABLES.Instance.SetAttributes );
- // Set public data.
- THIS.RecordCount = VARIABLES.Instance.RecordSet.RecordCount;
- THIS.CurrentRow = 1;
- // Now that we have populated the IBO's getter/setter definitions, return
- // the This reference. We are doing this so that the LoadQuery() method can
- // be chained with the IBO's constructor.
- return( THIS );
- </cfscript>
- </cffunction>
- <cffunction name="Next" access="public" returntype="boolean" output="false"
- hint="Increments the IBO cursor to point to the next record in the record set. Returns true if the new iteration is pointing to a valid record.">
- <cfscript>
- // Increment the iteration index to point to the next record. At this
- // point, we don't care about any sort of validation. That is going
- // to be taken care of in the next step.
- VARIABLES.Instance.IterationIndex = (VARIABLES.Instance.IterationIndex + 1);
- // Point the public row to the iteration index.
- THIS.CurrentRow = VARIABLES.Instance.IterationIndex;
- // Check to see if the new index points to a valid row. If it does, return true
- // otherwise, return false.
- return( VARIABLES.Instance.IterationIndex LTE VARIABLES.Instance.RecordSet.RecordCount );
- </cfscript>
- </cffunction>
- <cffunction name="Set" access="public" returntype="void" output="false"
- hint="Sets the value at the given key. Throws an error if the key is not available.">
- <!--- Define arguments. --->
- <cfargument name="Key" type="string" required="true" />
- <cfargument name="Value" type="any" required="true" />
- <!--- Define the local scope. --->
- <cfset var LOCAL = StructNew() />
- <!--- Check to see if the key is available. --->
- <cfif StructKeyExists( VARIABLES.Instance.SetAttributes, ARGUMENTS.Key )>
- <!--- This key is valid. Check to see how it is being accessed. --->
- <cfif (VARIABLES.Instance.SetAttributes[ ARGUMENTS.Key ] EQ VARIABLES.KeyTypes.PROPERTY)>
- <!--- Set the property directly in the record set. --->
- <cfset VARIABLES.Instance.RecordSet[ ARGUMENTS.Key ][ VARIABLES.Instance.IterationIndex ] = ARGUMENTS.Value />
- <cfelse>
- <!---
- The key is being accessed as a method. Get a pointer to the method.
- We need to get the interim method since ColdFusion cannot handle the
- parsing of an array notation followed by a method call. Furthermore,
- we don't want to use CFInvoke as CFInvoke requires the naming of the
- arguments. By creating a method pointer, we can use positional argument
- mapping, not mappings by name. This makes for a more flexible interface.
- --->
- <cfset LOCAL.Method = VARIABLES.Instance.SetAttributeMethods[ ARGUMENTS.Key ] />
- <!--- Call the set method. --->
- <cfset LOCAL.Method( ARGUMENTS.Value ) />
- </cfif>
- <!---
- At this point we have either set the value as a property or by
- method. Eitherway, return out.
- --->
- <cfreturn />
- <cfelse>
- <!--- The key is not available for setting. Throw an error. --->
- <cfthrow
- message="You have attempted to access an invalid key."
- type="IBO.InvalidSetKey"
- detail="The key you are trying to set, which is currently #UCase( ARGUMENTS.Key )#, is not available in this IBO."
- />
- </cfif>
- </cffunction>
- </cfcomponent>
The GirlIBO.cfc ColdFusion component is a concrete IBO that extends the AbstractIBO.cfc. It provides some of its own Getter and Setter methods. These override the getting and setting of straight up query columns.
- <cfcomponent
- displayname="GirlIBO"
- extends="AbstractIBO"
- output="false"
- hint="Extends the abstract IBO interface, specialized for girls.">
- <!--- Run the pseudo constructor to set up default data structures. --->
- <cfscript>
- // These are the list of keys that can be "get"ed and "set"ed in some
- // way. We are not going to define how they are accessed at this moment.
- // That will be done once the underlying data structure is set. These will
- // populate the Get/Set structures (that follow).
- // VARIABLES.Instance.GetAttributesList = "id,name,sexyness_factor";
- // VARIABLES.Instance.SetAttributesList = "";
- </cfscript>
- <cffunction name="GetFullName" access="private" returntype="string" output="false"
- mapto="full_name"
- hint="Gets the full name of the girl based on the name and sexyness.">
- <!--- Check to see what the sexyness factor is when we determine the girl's full name. --->
- <cfif (VARIABLES.Instance.RecordSet[ "sexyness_factor" ][ VARIABLES.Instance.IterationIndex ] GTE 9)>
- <!--- This a really hot girl. --->
- <cfreturn (
- "Crazy Hot " &
- VARIABLES.Instance.RecordSet[ "name" ][ VARIABLES.Instance.IterationIndex ]
- ) />
- <cfelseif (VARIABLES.Instance.RecordSet[ "sexyness_factor" ][ VARIABLES.Instance.IterationIndex ] GTE 8)>
- <!--- This a sexy girl. --->
- <cfreturn (
- "Sexy " &
- VARIABLES.Instance.RecordSet[ "name" ][ VARIABLES.Instance.IterationIndex ]
- ) />
- <cfelse>
- <!--- This a really an average girl. --->
- <cfreturn VARIABLES.Instance.RecordSet[ "name" ][ VARIABLES.Instance.IterationIndex ] />
- </cfif>
- </cffunction>
- <cffunction name="GetSexynessFactor" access="private" returntype="numeric" output="false"
- mapto="sexyness_factor"
- hint="Gets the sexyness as an integer (fixes the value).">
- <cfreturn Fix( VARIABLES.Instance.RecordSet[ "sexyness_factor" ][ VARIABLES.Instance.IterationIndex ] ) />
- </cffunction>
- <cffunction name="SetName" access="public" returntype="void" output="false"
- mapto="name"
- hint="Sets the name as all upper case.">
- <!--- Define arguments. --->
- <cfargument name="Value" type="string" required="true" />
- <!--- Set the value and convert to upper case. --->
- <cfset VARIABLES.Instance.RecordSet[ "name" ][ VARIABLES.Instance.IterationIndex ] = JavaCast( "string", ARGUMENTS.Value.ToUpperCase() ) />
- <!--- Return out. --->
- <cfreturn />
- </cffunction>
- </cfcomponent>
Testing The Code
- <!--- Build a test query. --->
- <cfset qGirl = QueryNew(
- "id, name, sexyness_factor",
- ) />
- <!--- Add rows to the test query. --->
- <cfset QueryAddRow( qGirl, 3 ) />
- <!--- Set the row data for the query. --->
- <cfset qGirl[ "id" ][ 1 ] = JavaCast( "int", 1 ) />
- <cfset qGirl[ "name" ][ 1 ] = JavaCast( "string", "Sarah" ) />
- <cfset qGirl[ "sexyness_factor" ][ 1 ] = JavaCast( "float", 10.0 ) />
- <cfset qGirl[ "id" ][ 2 ] = JavaCast( "int", 2 ) />
- <cfset qGirl[ "name" ][ 2 ] = JavaCast( "string", "Libby" ) />
- <cfset qGirl[ "sexyness_factor" ][ 2 ] = JavaCast( "float", 8.5 ) />
- <cfset qGirl[ "id" ][ 3 ] = JavaCast( "int", 3 ) />
- <cfset qGirl[ "name" ][ 3 ] = JavaCast( "string", "Alex" ) />
- <cfset qGirl[ "sexyness_factor" ][ 3 ] = JavaCast( "float", 7.5 ) />
- <!---
- Create the IBO and load in the query. Notice that I can
- chain these two actions together, which the original
- IBO could not. Just a neat little feature.
- --->
- <cfset objIBO = CreateObject(
- "component",
- "GirlIBO"
- ).Init().LoadQuery( qGirl ) />
- <!---
- Loop over the IBO. You might want to run a First() call
- before iterating, but for this demo, that is not
- required.
- --->
- <cfloop condition="objIBO.IsRecord()">
- <!--- Set the name just to test the set as fn. --->
- <cfset objIBO.Set(
- "name",
- objIBO.Get( "name" )
- ) />
- <p>
- #objIBO.Get( "full_name" )# ::
- #objIBO.Get( "sexyness_factor" )#
- </p>
- <!--- Go to the next record. --->
- <cfset objIBO.Next() />
- </cfloop>
One of the things that I don't like about the IBO (or iterators in general) is that there is generally more code involved with the performed actions. In this case, we have to move the IBO to point to the first record (if we have repeat iterations) and for every iteration, we have to move the IBO to point to the next record (via the Next()) method. Once we have the IBO interface nailed down, to get around this extra code, we can then create a ColdFusion custom tag that will loop over the IBO for us. This will do the same exact thing that we did manually, it will just do the record validation and the Next() commands behind the scenes:
- <!--- Kill extra output. --->
- <cfsilent>
- <!--- Param the tag attributes. --->
- <!--- This is the IBO object that we are using to iterate. --->
- <cfparam
- name="ATTRIBUTES.IBO"
- type="any"
- />
- <!---
- Check to see which mode of the tag we are executing. This
- tag is being used to loop back over itself using the LOOP
- value of the CFExit tag. When that happens, the Start mode
- of the tag only gets fired once. Every other iteration fired
- the End mode of the tag. Therefore, most of our actions are
- done in the End mode.
- --->
- <cfswitch expression="#THISTAG.ExecutionMode#">
- <cfcase value="START">
- <!---
- Move the IBO to it's first record. While this is not always
- necessary, if this IBO has already been used for iteration,
- then this is required.
- --->
- <cfset ATTRIBUTES.IBO.First() />
- </cfcase>
- <cfcase value="END">
- <!--- Move on to next row iteration. --->
- <cfset ATTRIBUTES.IBO.Next() />
- <!--- Check to see if we have a record to point to. --->
- <cfif ATTRIBUTES.IBO.IsRecord()>
- <!---
- We are still at a valid record. Allow this tag to
- execute again. Loop to next record.
- --->
- <cfexit method="LOOP" />
- <cfelse>
- <!---
- The Next() command we just performed put out IBO outside
- the range of valid records. Do not let this tag execute
- again. Exit out of the tag.
- --->
- <cfexit method="EXITTAG" />
- </cfif>
- </cfcase>
- </cfswitch>
- </cfsilent>
And then, once we have that ColdFusion custom tag down, we can use it to loop in a fashion similar to the CFLoop tag:
- <cfmodule
- template="./iboloop.cfm"
- ibo="#objIBO#">
- <p>
- #objIBO.Get( "full_name" )# ::
- #objIBO.Get( "sexyness_factor" )#
- </p>
- </cfmodule>
So that's my informal review of Peter Bell's ColdFusion Iterating Business Object. I think Peter is on to something very cool here. I am 100% sold yet, but I am never completely sold on stuff that I have never used before. I like things to be tested over time. I am not convinced that my modifications to the IBO are any better or worse than the original product; I like some of my conventions better, but a lot of that is personal, not functional. I know that Peter does use this sort of stuff in Production so it must be pretty useful. I wait with baited breathe for him to post of some new code.
Reader Comments
Hey Ben,
Great review - many thanks for taking the time to do this!!! Let me clarify some of the design decisions:
BaseObject.cfc - You're right - it isn't a base object. I personally now call it BaseIBO.cfc as that it what it is - a base IBO. It isn't actually truly abstract as I will show you can actually instantiate the base class in place of the extending class if you don't have any custom getters or setters. Look to my blog next week for ideas on that! BaseBusinessObject.cfc is something I also toyed with, but I'm cool with BaseIBO as I think that is most descriptive. If you were never going to initialize it directly, I think AbstractIBO would also work.
Access and Mutate - Lets say you have a CUSTOM method called getPrice(). The logic is that if there is a sale price, return that, if not, return the price. How do you write this? If variables.get("SalePrice") ReturnValue = variables.get("SalePrice") else ReturnValue = Price. But how do you call price? If you know how the price is stored you could call variables[variables.RecordCount].Price, but now every custom method knows the strructure of that struct and I may want to change how I store that. But I can't just call get("Price") or I'll be in an infinite recursive loop. So I need what I used to call the "hard get" method to NOT check for whether there is a custom method but just to go get the value. That is why I have access() and so the else statement is now "else ReturnValue = Variables.access("Price")". Try to implement price and sale price without access and mutate methods and you'll run into the same problem.
Number of records - A hack I'm not proud of and am fixing today. The best solution is simply removing the IsLast() method. If you'll note you will see that Next() returns a boolean, so that should be all that is required to implement the iterator. Let me play with this and see if I can get it working as I want it to.
Run time property evaluation - You are assuming that all of the loaded properties are available for getting. This is NOT A SAFE ASSUMPTION. Lets say I have a dateofbirth that I load into the object only to expose a getAge() method. I may not want people to be able to get the date of birth even though it exists. That is the key to information hiding - the object may contain properties that should not be publically accessible. Nothing wrong with using a struct instead of a list (but I'm going to treat that as premature optimization until I see this being a performance bottleneck), but it MUST be built based on the list of gettable and/or settable properties (these can be built up from the loadquery IF they are set to * or all which is NOT generally a best practice) otherwise you lose all of the information hiding benefits of the IBO.
Great review - thanks! Let me know if any of the descriptions above don't make sense.
Thanks for taking a look at the stuff I wrote down.
As far as "Abstract" vs. "Base", this is just my inexperience as a OOP programmer. I am not set on anything in particular. I just thought Abstract objects were meant to be extended. I understand that this IBO doesn't have to be extended, that it can be instantiated on its own. In my example, I extended it purely to test the Get/Set overrides.
For the access and mutate stuff, I am mostly with you on that. I don't quite understand 100%, but I am sure if I go over it a few more times, it will makes sense.
As for the final point about run time property evaluation, I am NOT assuming that all loaded properties are available for getting and setting. Well, not totally. If someone uses the select "" method, then my "property list" consists of all columns of the query PLUS any methods that have "mapto" attributes. If select "" is not used, then I use only the overlapped columns in the query set... however, true, I DO add all methods that use the "mapto" attribute regardless of whether they are in the property list.
I think my decision to do that is that currently the select list is hard coded. So, my feeling is that if you include the overridden Get/Set method, then it SHOULD be used even if your select list does not have it.
What I think should really happen is that the INIT() method should take the Get and Set property lists and then I would feel more safe about excluding functions that are available in the extending CFC.
Sorry for the bold text. I have to take that stuff out. It's bothering me. I think I will just allow people to use some basic HTML tags.
Hey Ben,
Yeah. Abstract means that something should never be instantiated. In fact, a convention I'm using now is that if I create an abstract class, I usually don't give it an init() method to make it really clear it shouldn't be instantiated.
We're close on getter and setter list, but here is the thing. Sometimes you want to have a column in your recordset and to NOT allow people to access that column. I might select FirstName,LastName,DateofBirth from the db and have a custom getAge() which uses DoB to display age, but my gettableattributelist might be FirstName,LastName,Age - i.e. even though DateofBirth is in the returned recordset, people are not allowed to view it. That is key to the information hiding. That was one of my requirements for the IBO, so you could turn that list into a struct on init() if you wanted to, but you can't just take that from the db column list plus any custom methods as the whole point is to NOT share all of the columns from the database query to keep your objects shy (you don't need to know my DoB - just my age - I as an object just happen to need DoB as a private variable to be able to calculate my age but I don't want you knowing about that).
Make sense?
That's a good idea about the Abstract not having an Init(). I think a related method that I have seen is to have an Init that throws a custom error saying something like "This method must be overridden by an extending class." Nice convention though... I shall make it my own :)
As far as the getters and setters, I think we are just miscommunicating (I think). For your scendario, my select list would have "FirstName,LastName" and then have the mapto attribute of the GetAge() method be "age". The select list would exclude the "DOB" column from the query.
The only time I use all columns from the query is if "*" is used. Otherwise, you cannot get or set any query column that is not in the GetAttributesList or SetAttributesList.
I think we are saying pretty much the same thing. The main difference is that I use a "mapto" to associate methods, not the set/get lists. But in hind sight I see how that could be done.
Sounds like we are indeed saying the same things!
This company stock (ROKE) is set to take off. Worldwide client base in the mobile communications space. See the details at any clarification contact at
I used the iterative business object in a few oo websites with some good results. But i ran into an issue that is obvious in hindsight.
You cant cache these objects and share them in multiple requests, since the iterator needs to be specific to the running thread i.e. 2 incoming requests come in, the first gets the object and starts iterating, the second comes in moments later, gets the SAME object and resets the iterator thus messing it up for the first thread.
Has anyone come across a way around this? I.e. a thread safe way of using these objects. Its nice to have built an ibo from potentially a long query etc but you would like to cache them (good for memory use too to resuse objects). You could just cache the query object and or use cached queries but its not as clean as just sticking an object in a cache to use at will.
What I think you'll want to do is cache the query that populates it, not the CFC itself. Creating the single CFC shouldn't be a huge hit, but caching the data from page to page will be very beneficial.
Hi Ben
Thank for the reply.
Caching things like the underlying queries is an option but its messy especially when you have seperation of layers i.e. the caching only exists on the web layer and not the service layer or when you build up an ibo object from disparate sources, multiple related queries that individually you wouldnt want to cache.
What we decided to do was build an helper object that captures the payload of the ibo and has a package level get and setPayload methods and added similar public methods on the ibo abstract cfc. This at least gives us encapsulation. We could even add a type property to prevent payload objects being added to incorrect ibos e.g. a payload object of type plants cant be added to ibo of type animals etc
Means building more objects that wouldve been nice to avoid and is a tad messy but hopefully it wont be too much of an overhead.
I am not following you exactly? Which part of the data are you caching?
A more important aspect of the IBO is to have it be an abstract class where other abstract classes can inherit from it. For example, I'm considering creating an abstract class (CFC) called Assignment. Its child, real classes are PermanentAssignment and TemporaryAssignment.
I figure it's more appropriate to let these child classes inherit from an abstract class because they share common method stubs (e.g., getStartDate(), getEndDate()) but have their own way implementing these methods.
Or I'm considering making this simple and just keep my IBO as a non-abstract class and have it sub-classed by the Assignment class (with PermanentAssignment and TemporaryAssignment sub-classing the Assignment class), but I don't ever see the need in intantiating a generic Assignment, so why make it non-abstract? Any thoughts?


text:
After winning big at this year's Olivier Awards, the Almeida is on a royal roll with King Charles III's appearance on its small but perfectly-formed stage. Branded a 'future history play', it imagines the aftermath of the not-so-distant death of Queen Elizabeth II. As Charles waits to be crowned, he becomes hungry for power and fearful of betrayal which leads to a bitter end.
Mike Bartlett is a very talented writer, who peppers blank verse throughout a play that is simultaneously serious and humorous. His writing is astoundingly rich, yet Bartlett manages to place ornate language alongside pop culture references ever so smoothly. Its performative nature is also played upon through lines such as, 'coronation day itself is just ancient costumes worn, and lines to learn, a slice of theatre, that's played for fun?'
And a lot of the play is, in fact, fun. Prince Harry is acted artfully by Richard Goulding, who portrays a longing to escape the perils of royal life and visit Sainsburys, eat scotch eggs and hang out with girls other than the usual 'Sloanish fluff'. This is why the edgy (if not bedraggled) Jess saunters in, forming a relationship with Harry that brings a source of 'gap yah' wit into a play that could have easily been too consistently Shakespearean for a modern audience.
Each member of the royal family is treated with respect and does not merely result in a caricature. Prince William is pragmatic, Kate Middleton is clever but calculating, and the supportive, matter-of-fact Camilla rivals the ghost of Diana. Yes, Diana makes an appearance (of course). There are also generic characters such as the Prime Minister, who is named Mr Evans, and the leader of the opposition party who are both practically Charles's nemeses.
It is, however, the marvellous Tim Pigott-Smith who holds the production together. He is so convincing as Charles that I ceased to remember him ever being any other character, on television or stage. He is excellent at depicting intense frustration and bitter sadness, and he also delivers a series of playful gags. At one point he complains about the public's assumption that he will always have a view on a particular topic, remarking that he is like a Findus ready meal, 'prewrapped and frozen'.
The brick walls of the Almeida form the backdrop to the stage and the set design remains simple. This lack of gimmickry propels the play's plot and language further into the spotlight, and it advertises the brilliant subtlety of Rupert Goold's directing. The candlelit funeral scene that opens the play is particularly impressive for this and it also showcases haunting music by Jocelyn Pook.
King Charles III will appeal to anyone that likes watching a talented cast perform an artfully crafted play with an ingenious plot line. It is intelligent, and whilst it may not initially seduce those who prefer the 'jazz hands' type of theatre, it is well worth seeing when it transfers to the West End this autumn. Long live King Charles III.
*Images are not my own*


text:
Subdomains in Website Hosting
Through our website hosting plans you'll be able to create subdomains with only a few clicks in your website hosting CP. All of them are going to be listed in a single place together with the domains hosted in the account and arranged under their own domain so as to make their administration simpler. Whatever the plan that you choose, you'll be able to create hundreds of subdomains and set their access folder or set up custom error pages during the process. You will also have access to many functions for any of them with just a mouse click, so from the very same section where you create them you can access their DNS records, files, visitor statistics, etc. As opposed to other companies, we haven't limited the number of subdomains you can have even if you host one domain within the account.
Subdomains in Semi-dedicated Servers
You'll be able to create as many subdomains as you would like with any of our semi-dedicated plans since we haven't set an upper limit for this feature. The Hepsia website hosting CP will allow you to add a new subdomain with just a few clicks and you'll be able to access a variety of advanced features during the process - change the default access folder, select the IP address the subdomain will use from the shared and dedicated ones that are provided in your account, activate FrontPage Extensions, add an SSL certificate, plus much more. Even if you create a great number of subdomains, you're going to be able to keep track of all of them with ease as they will be listed in alphabetical order below their main domain. For each of them, you can even access the website files or view logs and usage statistics through quick access buttons.


text:
One of the most confusing aspects of starting up a company that might someday be worth a lot is how to divide up the shares. This issue starts with co-founders but can quickly extend to include employees, boards of directors and boards of advisors, and important contributors trading services for equity as a bootstrapping strategy to conserve cash.
Lots has been written on the topic, especially focused on venture capital funded startups. However, there are other useful resources relevant for other types of companies as well. The following is a short annotated list. Unfortunately this will not overcome the confusion as there are many strong and different opinions on how to split equity.
General Equity Compensation Resources
The National Center for Employee Ownership is a non-profit association that "provides practical resources and objective, reliable information on employee stock ownership plans (ESOPs), equity compensation plans, and ownership culture." It has published many free articles on a wide variety of topics, including ESOPs, equity in LLCs, phantom stock, and more.
The Open Guide to Equity Compensation sits over on Github. It is extremely comprehensive yet concisely written. It's focused on C corporations on the venture capital path.
Over time employee stock plans become an administrative issue, so it's not surprising that there are software companies with management tools. Certent has 2400+ customers including both large and small firms. Their opt-in White Paper on Best Practices in Stock Plan Operations has useful survey data for companies that already have a plan and need better execution.
Slicing Pie is a method developed by a professor at Northwestern University that's been used by a variety of companies, including more Mainstreet types of businesses, for about a decade. The methodology includes co-founder equity splits but includes family and friends investors, consultants, advisors, even landlords. You can learn a lot for free, but the book and software are recommended for implementation.
Co-Founder Equity Resources
The Gust Co-founder Equity Split tool is free, and takes a very different approach from Slicing Pie. Where Slicing Pie focuses on market value of compensation, Gust focuses on skills and contributions. As such, Slicing Pie can help with a variety of contributions – time, equipment, discounts, ideas – while Gust focuses on co-founders in very high potential companies.
Another approach similar to Gust is the free Startup Equity Calculator that asks just 15 questions about up to 4 co-founders. It is very focused on software based startups.
A tech company founder who did lots of research on the topic of co-founder equity wrote this post including a link to his Excel spreadsheet calculator. It uses five different methodologies based on his research, and the spreadsheet provides a calculation for each and an average of the five.
On the other hand, this Y Combinator blog post by Michael Seibel, CEO of YC, argues for simple, equal splitting of founder equity with 4 year vesting.


text: Mark Tredinnick is a poet, essayist and writing teacher; he lives in Burradoo, in the highlands southwest of Sydney in Australia's southeast. His books include The Little Red Writing Book , The Land's Wild Music and A Place on Earth. The Blue Plateau—a landscape memoir on which he has been at work for some years—and The Little Green Grammar Book will appear in 2008. Mark is working on a volume of poems and a book about the consolations of literature in a frantic age.


text:
The clock is an entrepreneur's kryptonite. There are never enough hours in the day. You can always make more money, but you can never make more time!
That's why we're so excited about a new frontier in digital media that's been exploding as of late: live video. More specifically, what it means for entrepreneurs who are building a brand.
Live Video
The early days of live video for the masses truly began in early 2015, with the nearly simultaneous launches of Periscope and Meerkat. Remember those? Looking back, it seems like those apps exploded, then faded into the background almost as quickly as they came.
But those two platforms were the catalyst for another major live video introduction: Facebook Live.
In late 2015, Facebook began rolling out its own live video feature to a limited number of accounts. By 2016 it was available to everyone, and now you and I and anyone else can send a live broadcast into the universe for anyone to watch, from anywhere.
Do you realize what this means?
For literally the last 90 years, since the invention of television, you'd have to pay thousands or even millions of dollars for this kind of access to the public at large. The only way to get an international, up-to-the-minute live video stream would be to, I don't know, get into a car chase with police or something.
Now, every single one of us has unprecedented access to as large of an audience as we can amass—based, of course, on how engaging or interesting we are to watch. And oh—people are watching. Facebook video receives a reported 8 billion (with a B) views per day.
This could be one of the greatest developments of at least the last decade for entrepreneurs.
The Impact for Entrepreneurs
It's an old saying in business: people don't buy products, they buy relationships.
When someone comes back to buy from you over and over again, it's not purely a dollars-and-cents transaction. There's an exchange of emotions that happens, too. People spend their money with brands they feel attached to.
Live video has huge implications for helping you build those relationships in three key ways:
- Pulling back the curtain
- Lengthening the attention span
- Expanding reach exponentially
First and foremost, it gives you an unparalleled way to give your customers and prospects behind-the-scenes access to your daily operations—pulling back the curtain, so to speak. People love feeling like they're getting a sneak peek into a secret world.
Think of the popularity of reality TV. It's so hard to stop watching because you feel like a fly on the wall of someone else's life. Strange as that may be, it's something we're naturally drawn to out of curiosity.
When people feel emotionally connected with a brand, they're more likely to buy from that brand, according to multiple advertising studies. Making a customer laugh, showing them something unexpected or teaching them how you do things via live video is a great way to solidify that emotional connection.
Which brings us to the second factor—lengthening the prospect's attention span.
Humans are notorious for our short attention spans. We flip to a different channel or click the "X" button as soon as we're presented with an ad. But we need that attention if we're going to build a brand-buyer relationship.
Live video has a crazy way of extending this split-second attention span. In fact, people spend three times longer watching video that's live versus video that's pre-recorded. That's three times as big of a window to make your message count!
Finally, live video allows you to extend your reach like never before. Remember earlier, when we talked about time being an entrepreneur's biggest weakness?
With live video, you can give your followers a real-time update on your latest sale while heading to your kid's ballet recital. You can make a keynote speech for a conference in San Diego while you're at a business meeting in New York. Physical location is no longer a limiting factor.
The best part? Your reach can grow exponentially as people who are watching share the video stream with friends of their own. With live video, you can be in an endless number of places at once, without paying a penny for that reach. Pretty amazing stuff.
By the Numbers
The bottom line, as always, is your bottom line. Building a connection with your fans isn't just something you should do because it feels good; there's real money there.
Facebook, Twitter, Instagram and Google all invested heavily in live video in 2016, with Facebook alone shelling out a reported $50 million to celebrities and brands to produce live videos on the platform. We wouldn't be surprised if 2017 brings a streamlined way to sell products from directly within your video stream, similar to YouTube's embedded links.
Where there's attention, there's potential for revenue, and live video certainly has the attention of the masses heading into 2017.
Have you ventured into live video for your business? Leave us a comment and share your thoughts on it!
Subscribe to our blog and make sure you never miss an update by clicking the image below.
Additional Resources
Way back in 2010, thought leaders were beginning to recognize the game-changing power of web video. Watch as TED curator Chris Anderson discusses how online video is transofrming the way we learn--a message that's still relevant today.


text:
Search this Blog
Browse by Category
Social Media
- 19th century
- activism
- African American
- Chapel Hill
- civil rights
- Civil War
- community archives
- Confederate
- diary
- Durham
- education
- events
- exhibit
- Family
- farms
- film
- grants
- history
- Jim Crow
- Journey of Reconciliation
- letter
- literature
- Mississippi
- Mississippi Delta
- North Carolina
- North Carolina Fund
- photograph
- Politics
- race relations
- Raleigh
- Rebooting the SHC
- slavery
- social justice
- South Carolina
- Southern Historical Collection
- Southern Oral History Program
- Terry Sanford
- The Long Civil Rights Movement
- University of North Carolina
- Virginia
- women
Category Archives: Revised Collections
New Collections: Love Letters
We have a number of new collections that are preserved, processed, and now available for research. Love and war were in the air, as the bulk of the materials include courtship correspondence and letters written by people while they were … Continue reading
Creator of the Month: Walker Percy
In conjunction with the current exhibit "Four from between the Wars," the creator of the month for September is Walker Percy. A UNC alum and celebrated Southern author, Percy's works include The Moviegoer, which won the 1962 National Book Award … Continue reading
Posted in Revised Collections, Writers Leave a comment


text:
This is a bit of the tail wagging the dog, but a national magazine is interested in covering anyone in the greater Dallas area who is holding a Wine.Dine.Donate event (and if you are, check out Kent Rathbun's Thanksgiving home menu. It's a great idea to give thanks on that Thursday by giving back to your local community). If you are holding such a party in the next few weeks, please reply to this forum post. And, if you can, meet Kent and me one week from Sunday, November 12, at Abacus, for a spectacular feast and fund-raise.
- share
Dallas in the Spotlight
by epicurious
on 11/03/06 at 06:00 AM
Tagged with: Giving
main categoriesbaking books chefs cooking drinking entertaining family fare healthy news & gossip recipes restaurants seasonal travel vegetarian
recent posts
about this blogwelcome to the epi-log
guest contributors
food blogs we like
- share