text:
Of the many safety concerns faced by seniors, the four most common are:
While it is impossible to 100% safeguard a home from any of the above, you can dramatically limit the threat posed by these four concerns.
Preventing Falls
To prevent falls, the first step is to eliminate tripping and slipping hazards (wires, small objects, unsafe furniture, and unsecured rugs). Making sure all surfaces provide as much traction as possible, either by using carpeting, non-slip tile, or by applying no-slip strips, will also drastically limit the chance of a fall. It is also wise to make sure areas are well-lit and easy to navigate, with lots of room to walk through. For areas such as stairs, bathtubs, and showers, you can install handrails for added stability. In the case of spills, make sure to clean wet surfaces immediately. For the winter, ensure that all icy surfaces have been liberally salted/sanded.
Preventing Fires
For fire prevention, having working fire safety equipment – such as smoke detectors and fire extinguishers – will help alert you to fires or help you contain them should they occur. Smart use of electrical items is essential. Replace items with fraying cords and avoid overusing specific outlets. You should also be careful with your use of heat sources. Avoid loose clothing when using the stove top or barbecue, check to make sure the oven is turned off after cooking, and follow all safety instructions for items like space heaters.
While not fire related, you can also prevent scalding burns caused by hot water. You can do this through lowering the thermostat on your hot water heater to 120 F.
Prevent Poisoning
There are two main poison concerns for seniors. The first is gas poisoning. Carbon monoxide can be a silent, unnoticed killer. Installing a working carbon monoxide detector near all bedrooms can safeguard you and your loved ones from this tasteless, odorless gas. The second is medication. You can request large-print labeling for medications. It is important to keep medications properly organized, and they should be used in a well-lit area to avoid misreading labels. If your loved one is forgetful, it can be useful to post a daily tracker where they can mark which medications they have taken so far.
Preventing Burglaries
Protecting your home against burglars is essential, no matter your age. Make sure your doors and windows have strong locks that you keep secure. You should never let strangers into your home and should discourage your loved one from doing so.
Finally, make sure all emergency numbers, including police, fire, ambulance, and poison control are posted directly next to your telephone. And remember that sometimes a person's physical or mental condition degrades to the point where their safety is always going to be compromised. If you already rely on elder care, it might be wise at this point to explore expanding your loved one's coverage. If you do not have care set up, we would suggest contacting your local Visiting Angels elder care office. Our elder care teams provide assistance and vigilance to improve your loved one's safety.
Other Articles
You were such a comfort to me and my grandmother before her death. Your caregivers are a godsend!
You were such a comfort to me and my grandmother before her death. Your caregivers are a godsend!


text:
I'm the kind of guy who worries when something gets too popular.
I looked askance at novels (especially science fiction) that made it to mainstream bestseller lists when written by otherwise mediocre authors. I avoided buying any footwear or polo shirt that was named for, or sported images of, long-jawed fast-crawling reptiles. When anything rapidly accelerated in popularity with no clear tie to quality, I wondered how long it would take before that bandwagon crashed.
I'm starting to ponder the same about technology in education. Because, as I sat on a panel judging ten enthusiastic teams at last weekend's nicely structured Startup Weekend Seattle EDU, I couldn't help but think that digital learning may be getting too popular among some entrepreneurs and investors. Because said popularity may be increasingly for the wrong reasons, and have little to do with actually improving education.
There are early warning signs that the hype could be outpacing the reality, reminiscent of the mindless headlong rush to the Pets.coms of a dozen years ago:
Investment. Once described as a "get rich slow" business, K-12 and other education segments are now being chased by a mob of investment capitalists. At this month's busy EdNET education industry conference, Managing Director Susan Wolford of BMO Capital Markets said the potential for technology to customize learning for students "makes enormous sense" to investors interested in education. But she added it's important for entrepreneurs to create "smart products" rather than jury rig something to take advantage of whatever the current funding or fads support, cautioning that too much money is chasing ideas "that should have been left to die."
Digital instructional content company Boundless summed up the last decade of venture investment in edtech in an infographic. It concludes that "record numbers of companies are receiving venture funding," with VC investments in education this year on pace to be five times higher than in 2002. The news site EdSurge added, "In 2011, we passed the last peak of edtech investment, which occurred during the memorable bubble of 1999."
Attention. Not only have mainstream tech blogs like Mashable and TechCrunch upped their frequently breathless coverage, it seems almost every week a new site surfaces specializing in covering tech in schools, colleges or for consumer and adult education. More recent entrants include WiredAcademic, Technapex and Edudemic joining print-spawned old-timers like THE Journal and Education Week and more established blogs such as EdSurge, Hack Education and MindShift.
Even the Consumer Electronics Association has piled on, this month naming technology in education one of five "prominent technology trends expected to influence the consumer electronics (CE) industry in the years ahead." The CEA report attaches digital learning to the same hand as 3D printing, next-generation TVs and displays, the evolution of audio, and mobile in Africa.
Startup activity. Startup Weekend EDU, a Startup Weekend "vertical" only a year old, is both a thoughtful driver and a reflection of edtech's growing popularity and potential influence among entrepreneurs. Since an early EDU event was organized in Seattle a year ago, an estimated 17 EDU Weekends have occurred — and more are on tap.
It's not the only entrepreneurial launch pad: SXSW has an education conference, SXSWedu, with a LAUNCHedu component first held in March and which will repeat next year. The Software and Information Industry Association has its long-standing Innovation Incubator at its twice-annual education conferences. And there are longer-term, investor-backed incubator projects on both coasts.
Politics. Perhaps unique to education, its adoption of technology is being promoted by those with a political agenda — or perceived to have one. Former Florida Governor Jeb Bush's Foundation for Excellence in Education has digital learning as a core part of its "reform agenda," and edtech frequently is mentioned in the same breath as education reform, as though one can't occur without the other. True or not (and it's a topic I'll explore as moderator of a Seattle MIT Enterprise Forum on edtech in November), adding politics to the mix can mask, or make divisive, technology's application and effectiveness in classrooms.
Individually, none of these developments is worrisome; indeed, they're pretty cool after I and others in the field have suffered years of digital education being viewed as an ugly stepchild to sexier consumer and business tech. Even combined, these moves may be no more than a potential cautionary tale of a balance that never will tip from good to bad. After all, a lot of excitement generates a lot of activity.
So is this a case of an elitist sniffing and claiming a favorite restaurant has gotten too popular now that everyone comes to it?
No. It's more a concern that while there is a burning unmet need and opportunity to apply technology intelligently to teaching and learning, too much overhyped edtech developed for reasons having little to do with enhancing education can collapse into a black hole of failure. And that's a gravity well that could suck across its event horizon not just bad products, greedy investors and clueless entrepreneurs, but also the good of each group — with teachers and students dragged into the maelstrom.
Because in education technology, the stakes are much higher than another me-too e-commerce play going under. It's how the kids of entrepreneurs and everyone else will be educated for decades to come. Not finding another place to buy cat litter.
Flickr Photo by Justin D. Miller.

subset: commoncrawl


text:
Eben Pagan Accelerate High Growth Business Training – Review and Bonus
Welcome to my full Accelerate High Growth Business Training Review which is a new product due to launch in a couple of weeks. Accelerate High Growth Business Training is the latest product who will be releasing by eben pagan on May 20th, 2013. Below is NOT fact about Accelerate High Growth Business Training. Please Click Here if you're looking for the official site.
This pages is about Accelerate High Growth Business Training Review see below if you are looking for Accelerate High Growth Business Training Bonus Offer
What is Accelerate High Growth Business Training About??
Accelerate is an all new series of virtual trainings combined with our best information products all culminating in a live 7-Day Summit in Chicago this August.
Accelerate is for entrepreneurs who want to kick their business into high gear and grow their business to the $1Million level and beyond.
All these products have been tested and PROVEN to work for the last year. We've been streamlining the members area to make it simple and easy to follow.
You will LOVE it and YOU will make tons of money with Accelerate High Growth Business Training!!!
The very best thing about the product, Accelerate High Growth Business Training, is that it's simple enough especially for the newbie to make an extra stream of money.
This course is a idiot proof product that makes getting cash so easy that a baby can do it. The only catch is it is exclusively available for a limited time. Due to such high request Ewen Chia simply has to limit the number of folks he can distribute the product to. I'm serious… I understand where he is coming from. If everyone knew these techniques we could all be wealthy! It would devalue the information.
So you have to go get Accelerate High Growth Business Training this second before it's too late. You do not want to miss out on this it might be gone for good
Accelerate High Growth Business Training Bonus Package
I have prepare the biggest Accelerate High Growth Business Training Bonus offers for you personally. Accelerate High Growth Business Training Bonus package deal is totally Related to what you'll discover from Steve Harrison plus they COMPLIMENT all of the sneaky tactics of Accelerate High Growth Business Training.
Quite simply you will not be finding a lot of outdated PLR junk to clutter up the challenging drive and you will not be finding a lot of crap that distracts you with details overload. There are many ways to make money online, you just need to be a little creative, and ingenious and look for methods that are working for others and use them effectively for your own business. My exclusive Accelerate High Growth Business Training Bonuses will allow you to make Much more money within the lengthy operate!
Below are bonuses you would get if you buy a Accelerate High Growth Business Training through my link
Accelerate High Growth Business Training
BONUS #1. Internet Marketing 101
This FREE course is a complete crash course on Internet Marketing.
It covers everything from A to Z. Local Client Finders created this course for those real estate professionals who wish to take on a "DO-IT-YOURSELF" approach to Internet marketing. After looking over this course, over 50% of agents end up hiring us after they realize how much work is involved regarding properly building an online presence.
Accelerate High Growth Business Training
BONUS #2.Traffic Academy
12 in-depth webinars with experts in video, article, social and SEO marketing.
With my Traffic Academy, you'll learn practical, yet powerful tactics for driving serious, sustainable traffic from our very own my experts!
You'll receive access to monthly webinar downloads and live Q&A webinars. In addition, you'll also receive 10,000 AffSphere credits that can be used in our AffSphere article directory. AffSphere has over 38,000 published articles in 150 categories and they get tons of views because search engines love articles! You'll get 10,000 ad credits so your ads will show up when people read the articles! Just grab a banner ad from one of the many programs we'll show you, and you'll start to get clicks!
Accelerate High Growth Business Training
BONUS #3 . The CPA Wealth Blueprint ebook with 12 incredible info-packed videos
"Discover How To Master The CPA Affiliate
Networks To Generate Huge Cash Promoting
Other Peoples Offers And Rapidly Grow Your
Business By Selling Your Own Products!…
No Matter Your Level Of Experience!"
video 1: CPA Uncovered
video 2: CPA Terms Explained
video 3: Applying To A CPA Network
video 5: CPA Network Demo 1
video 6: CPA Network Demo 2
video 7: CPA Network Demo 3
video 8: CPA Network Demo 4
video 9: Getting Products Into CPA Networks
video 10: Info Product Friendly CPA Network
video 11: Info Product Friendly CPA Network
video 12: Promoting CPA Offers
Accelerate High Growth Business Training
Bonus #4 $131,000 product launch in a week
8 actual time videos walking you through a $131,000 product launch in a week revealing all the tips & tips required to deliver a profit pounding 7 figure product launch.
video 1: Watch $2,433 roll in in just the first hour!
video 2: A quick update after the first 10 hours … making over $13,000!
video 3: Day 3 … $79,812 Total gross sales & conversion tips
video 4: Day 6 before launch discount ends with very IMPORTANT joint venture partner tips!
video 5: Final launch day results, $131k in 6 days plus my secret JV tip that increased profits!
video 6: $136,575 in 13 days … plus awesome tips for increasing optin rates!
video 7: 1 month update, $148,771 in 30 days! Plus several important tips that drove-up my profits to well over 7 figure. You don't want to miss this video!
video 8: Quick video proving #1 ranking in Clickbank and a tip on how to add over 190 JV partners to a product launch!
Accelerate High Growth Business Training
BONUS #5. Internet Millionaire System
There are 6 modules in this Internet Millionaire System
Module 1 -Contents Your first module sets the stage for everything else you'll learn. It's where you'll discover;
Module 2- Contents Your second module teaches you where your products will come from.
Module 3 -Contents Your third module shows you how to set up your long-term business system.
Module 4 -Contents Your website will be dead in the water unless you attract visitors who want to buy what you're selling. Your fourth module shows you how to get all the traffi9Cmissing link" most aspiring Internet millionaires never learn… And because they don't, they get stuck in the same frustrated place I was for years. Inside, I'll
Module 5- Contents This module is the one that's most personally exciting for me Module 6-Contents The final module is advanced material. The prior modules give you the core, but this one's going to launch you into orbit. Here's what I'll show you
Accelerate High Growth Business Training
BONUS #6. Info Product Profits
Info Product Profits was designed from the ground up to turn you into an Info Product cash machine.
This course is a step by step video tutorial series, packed with ALL the information you need to become a profitable information publisher.
Whether you're a seasoned online marketer today, or someone that has never sold a thing online before, this course will give you the help you need to take your business to another level!
Accelerate High Growth Business Training
BONUS #7. List Building Samurai
"Fool Proof List Building Method Turns Your Facebook Leads Into Raving Buyers Who Can't Resist Buying Everything You Have to Offer!" This is a sold out system!
Accelerate High Growth Business Training
BONUS #8 Automated Income Stream Blueprint
If you're not already making $50.00 per day or $1,500+ per month online with a FULLY AUTOMATED online business, then you need this – orth of US property – OUTRIGHT FOR CASH –and become a USD Millionaire…Looking back, I think I could have achieved this within 12-18 months if I'd discovered my AIS System Blueprint sooner…"
Accelerate High Growth Business Training
BONUS #9 – Affiliate Extreme System
Here are you will get on Affiliate Extreme System:
* The strategy that you can use to skyrocket your affiliate commissions by 200% and more.
* How to construct a highly profitable landing page for pay per click.
* Special 6 part "getting started" video course for Newbies.
* How to legally steal your competitors keywords, and a whole lot more.
* Secrets of how to make 5 figures in a single week promoting other people's launches.
* How to get high natural search engine rankings so you'll get tons of free traffic.
* Exactly how to use viral advertising methods to gain floods a lot more guests and also sales.
* Super affiliate blogging secrets, from exactly how to arranged your blog to just how to market it online to increase tall Google engine rankings as well as a lot of extreme affiliate sales.
* On page SEO, how it works, and the free software that you need to analyze your web pages for your chosen keywords.
Accelerate High Growth Business Training
BONUS #10 7 Day Profits Product with Master Resale Rights
Niche Badass Reveals His Simple Step-by-Step System That Bleeds ANY Niche Dry, The More Competition the Better!… 100% Guaranteed
With the 7Day Profit System you will be able to quickly and easily start making money online within 7 days…
Accelerate High Growth Business Training
BONUS #11 – CPA Profit Funnel System Video Home Study!
This comprehensive video comes with THREE video modules taking you through every step of CPA marketing! Also included in the course are resource manuals you can use to access contents and resources discussed in the videos in text format! Watch – Learn – Make Money!
Accelerate High Growth Business Training
BONUS #12 "Website Flipping Secrets"
Former Hamburger Prepare Exposes Exactly how To Flip Websites For Faster Profits And Long-Term Investments!
This moneymaking method hardly ANYBODY knows regarding takes you from web advertising zero to leading man – even in the event you STINK at product production and also are unable to get JVs!
If you re searching for a secret system for developing FAST money, then check THIS out:
Web site Flipping Tips is your key to discovering how to get a shortcut to this very profitable company. Think me personally, this really is the simplest method to render a quick buck online, because you don't need to worry regarding product creation, getting a flow of traffic on to a site, or trying to drum up joint venture chances.
Accelerate High Growth Business Training
BONUS #13 "Wordpress Unleashed"
"Complete Video Course Reveals WORDPRESS Money Making Secrets"
Professional Entrepreneur Concerts You Wearing A Option By Step Guide Exactly how To Use WordPress to Enhance Your Earnings And also Fast Create Profits Drawing Internet site After Profit Drawing Web site. Each video performances you some sort of additional techniques to quickly and also simply make actual cash with WordPress. Use one approach, utilize many – or perhaps utilize them all!
This new WordPress Demystified program will inform you absolutely how to package up as well as use WordPress for the highest possible speed as well as profits.
Each movie shows you some sort of additional technique to quickly as well as simply make real cash with WordPress. Utilize one techniques, utilize many – or utilize them all!
Accelerate High Growth Business Training
BONUS #14 "Your Video Course"
"Would You Like The Blueprint To Building Your Own Online Business That Will Beat Any Recession?"
This awesome video as well as product box will take you from a complete novice in Internet Advertising (or where-ever you might be now) to {having the capacity create the own sites advertising your paint products! – Exactly how potent is that?!
The movie course is made up of ten video clips as well as ten MP3's And Bonus – "The Beginners Help guide to Post Marketing"
Accelerate High Growth Business Training
BONUS #15 "The Craigslist Blackhat System"
See In The Shoulder Of A Underground Craigslist Mastermind As He Exposes That Tips On How To BANKROLL Up To $eight,132.26 In Profit Every single Month! … 100% Guaranteed
Movie 1- Introduction To Craigslist
Movie 2- Authoring Ad Copy That Provides
Movie 3- Utilizing Blogspot For Money
Video 4- Creating Undetectable Manuskript Ads
Video 5- Generating Post Links
Movie 6- Generating And Utilizing Image Ads
Video 7- Automating The Craigslist Business
Video 8- Making use of Craygo To Publish Your Ads
Video 9- Backpage.com
Buy Accelerate High Growth Business Training Through My link Below and get exclusive Accelerate High Growth Business Training Bonus Above
To Claim Your Bonuses, Follow These Simple Steps Below
Step 1. Clear Your Cookies
Step 2.Purchase Accelerate High Growth Business Training Using URL Below:
Direct ORDER Link :
Step 3:Forward your receipt to davidbrennerbonus(at)gmail(dot) com, with the subject line Accelerate High Growth Business Training Bonus
Step 4: Wait for me to send over your bonus. I will get back to you within as soon as possible.
To Your Success


text:
Blackmagic Design Announces New Low Price for HDMI and Analog Mini Converter Models
Unlike other converters on the market today, Blackmagic Design's Mini Converter's include extremely powerful features such as 3 Gb/s SDI technology, redundant SDI inputs, balanced analog and AES/EBU switchable audio on standard 1/4 inch jack audio connections and an international power supply which includes adapter plates for all international power sockets.
Blackmagic Design's Mini Converters have more features that are easier to use than found in other converters. A good example of these powerful features is the inclusion of audio on standard 1/4 inch jack connectors, and the audio can be switched between balanced analog or AES/EBU audio. Jack connectors makes it easy to use off the shelf cables and a wide range of audio products. This lets the customers choose between audio on the HDMI connection, as well as independent audio as AES/EBU and balanced analog.
For customers who need an alternative battery powered conversion option for field use, then Blackmagic Design's HyperDeck Shuttle also operates perfectly as an HDMI to SDI and SDI to HDMI converter all in a single machined metal design. Even if customers are not using the SSD uncompressed recording, the HDMI or SDI input can be connected and then video is output as both HDMI and SDI video. This means HyperDeck Shuttle can be used as two converters in one, all battery operated, with recording of high quality uncompressed video on SSD's if required! It's compact size makes it a fantastic alternative for batter powered conversion.
"We designed the Mini Converters to be the perfect solution for monitoring and for converting computer video to SDI, consumer video cameras to SDI and adapting analog devices to modern HD-SDI environments. Today we have thousands of customers who use our Mini Converters for the most critical broadcast work," said Grant Petty, CEO, Blackmagic Design. "Now, with this new affordable price, our Mini Converters are available to smaller studios on the tightest budgets. Unlike other low cost solutions, with Mini Converters, you get all the professional features such as redundant inputs, re clocked loop SDI out, HDMI, AES/EBU and analog audio all in a compact affordable design!"
Availability and Price
All Mini Converters are available now from US$295 from Blackmagic Design resellers worldwide.


text:
You are about to enter a website that may contain content of an adult nature.
Hello everyone, this is Indian cam girl Barbiexgirl here. I'm 23 year old Female speak English and Portuguese in the Indian live sex chat action. Lets have fun, come in cum hard baby... I ll drive u crazy! Big tits n toys... hot show!. I`m a hot girl and I love touching myself while others are watching. I have an angelic face and a devils mind.. am the BEST cock-sucker you have EVER seen! I enjoy more than wrapping my lips around your cock..and sucking it until you explode deep in my throat! Sexy moans,Home alone(no studio),Long Hard Nipples... is my expertise and also what I will do in Indian live sex private show. I have Blue eyes, Medium Blonde hairs and my measurements are 36D-36-36. For Turn ons: I love a hard cock and a nice wet pussy on my tongue. I love being watched and love to watch a man cumming while i do.. For TurnsOff: Don`t like rude people!. If you prefer kinks, then Tattoos,Shaved, are mine. I'm just hungry for a HARD cock, can't wait to see u in my Indian webcam sex chat room! :)
This website contains live indian sex cams, desi cams, hindi cam and tamil sex chat related sexually explicit content.
You must be at least 18 years of age to enter this website.
© Since 2012 myindiansexcams.com Indian Sex Chat Network All Rights Reserved
AllHosts1 - AllHosts2 - AllHosts3 - AllHosts4 - AllHosts5 - AllHosts6 - AllHosts7 - AllHosts8 - AllHosts9 - AllHosts10 - AllHosts11 - AllHosts12


text:
OS X Yosemite
In OS X Yosemite, removing or disabling the font that Preview is using for markup might cause Preview to quit when opening documents. If you've made such a change to your document, use any of these solutions:
- Upgrade to OS X El Capitan or later.
- Or put the font back. Afterward, you can open Preview and change the markup font: Choose View > Show Markup Toolbar, click the Text Style button , then choose a different font from the pop-up menu. You can now safely remove or disable the previous markup font.
- Or use Terminal to resolve the issue: Quit Preview, then open Terminal, which is in the Utilities folder of your Applications folder. Paste this command in Terminal, then press Return:
defaults delete ~/Library/Group\ Containers/com.apple.Preview/Library/Preferences/com.apple.Preview.plist com.apple.AnnotationKit.font
All macOS versions
If none of the above solutions work in OS X Yosemite, or if you're not using Yosemite, your document might be damaged. If you have a Time Machine backup, try using Time Machine to restore a previous version of the file.


text:
Tag Archives: texting
How to not make phone calls with a mobile phone (huh?)
By William Chinda | Published: August 3, 2010
In this month's Wired, Clive Thompson has a very interesting take on the changing nature of cell phone use. Rather than making voice calls, most people are using a variety of asynchronous forms of communication to get in touch with one another. Social networking tools, texting, and instant messaging allow us to remain in "constant, [...]
Posted in News & Opinion, Product Guides | Also tagged budget, buying guide, cell phones, clear, cost, data, Google Voice, iphone, ipod touch, ispot, mifi, mobile, mobile hotspot, peek, peek pronto, saving money, Skype, smart phones, smartphones, sms, T-Mobile, technology, Verizon, Virgin Mobile, voice, VOIP | 1 Comment


text:
I need a cure for a BAD diaper rash!! Ointment , teabags, and cornstarch not working!!!
i've tried everything! i need a new trick! hurry! my baby is running around naked, bc her rash hurts so bad she keeps taking off her diaper!
Started by Regan on 07/15/2009 in Welcome To Circle Of Moms!!
Last update on 12/20/2010 by Kasi


text:
It's that time of year again, when we check in to see where the annual Arctic sea ice minimum will end up. And this year is a doozie. We haven't quite bottomed out at the end of the melt season, yet, but already 2012 has set new records for smallest Arctic sea ice extent and volume, smashing through the numbers from 2007. Records are often attention-grabbing and "exciting," in a way, but while Usain Bolt's incredible shrinking 100-meter dash time may be uplifting, shrinking sea ice is not.
Every time a new sea ice extent record is broken, the same question comes up: how long until it's gone? That is, how long will it be before the Arctic Ocean is functionally ice-free in the summer, legitimately opening the once-fabled Northwest Passage?
The fact is, we don't know. Climate models continue to underestimate the rate of sea ice loss we're observing, leaving researchers to hazard less scientific guesses. Many estimate that day will come around 2030, but some others push it out to 2070. Regardless, Arctic sea ice is changing—and fast. The prospects of open shipping routes and newly-accessible resources have corporations chomping at the bit and governments racing to prepare the way. Three (open access) articles in the Bulletin of the Atomic Scientists describe the outlook for a changing Arctic from the perspectives of the US, Russia, and Canada. There will be some disagreements, but all parties have at least one view in common—things will get complicated.
Shipping issues
It starts with shipping. An ice-free Arctic isn't as tranquil as it sounds, and commercial use of these routes will require a lot of support. Those who provide that support will, to some extent, control access. One critical service will be icebreakers—specially designed ships that can safely clear the way even when things get dicey. Russia has the world's largest fleet, and recently budgeted for the construction of six more: three nuclear-powered and three diesel-powered. Other countries are also building more (or the first) ships of their own.
Beyond that, there are also refueling tankers and depots, as well as search-and-rescue capabilities. Canada, for example, is expanding its cooperative effort with the indigenous people who make the Arctic their home (a volunteer group known as the Canadian Rangers) and building a patrol fleet that will put a Canadian naval presence in the Arctic for the first time since the 1950s.
Mineral rights
The Arctic also holds large, untapped reserves of oil and natural gas. (Estimates put it around 30 percent of global undeveloped natural gas, and 13 percent of undeveloped oil.) The question is, who does it belong to?
Despite Russia's well-publicized planting of a flag on the Arctic seafloor, the region will be carved up by international negotiation, not by the colonial-age rules of "finders, keepers." As part of the UN Convention on the Law of the Sea, there are some rules about how far from the coast a country's economic claims are valid. However, the United States has never signed onto the convention because of its refusal to defer to an International Seabed Authority when no country has a clear claim to a resource.
There's enough ambiguity in the application of existing rules to the Arctic (plus one country that hasn't necessarily agreed to abide by all those rules) that there will certainly be disputes about claims, and these could develop into considerable sources of tension. The parties involved have talked a good talk about fair, diplomatic settlements, but that doesn't mean they can put these intentions into practice.
When considering oil production, there's also the issue of agreeing on and enforcing environmental regulations. Cooperative agreements will be required to prepare for spills, and the livelihoods of those indigenous to the Arctic will have to be protected.
Defense and management
There is, of course, another obvious concern—defense. Canada, in particular, can no longer ignore the Arctic as a quiet border. And even if all nations are harmoniously cooperative, there's still the possibility of terrorism (including ecoterrorism). Learning to operate in the Arctic will be no small task for armed forces.
Add in the fact that countries will be expected to protect commercial operations in a region teeming with other nations and other corporations, and it's easy to imagine friction. As George Backus, author of the US perspective and a researcher at Sandia National Laboratory, writes, "An unexpected confluence of vessels and aircraft being in the wrong place, when Arctic weather conditions prevent adequate communications, could lead to tense situations, unless national security forces have the ability to readily manage the situation."
Russia, Canada, and the US aren't the only nations with an Arctic claim. There are others (most notably Denmark and Norway), and there are also countries with no claim that, nevertheless, want a piece of the action. Many European nations are in that category, as are China, South Korea, and Japan.
The greater the number of parties involved, the more international politics rears its head. China and the EU both want a seat at the Arctic Council. Strained trade relations between Canada and the EU (which banned the import of seal products, an economic staple of Arctic peoples) have been a sticking point, whereas Canada's more cooperative trade relationship with China has opened a door to the Chinese.
Change as a constant
Not only will the situation in the Arctic be complicated, but the variables will constantly be changing, often in unpredictable ways. While scientists worry about sea ice behavior and the implications for climate, weather, and ecosystems, national leaders will be navigating a dynamic geopolitical landscape certain to spawn quarrels. Still, corporations will ply these risky waters because the potential pay-offs are huge.
And while countries will be intently focused on managing the situation in the Arctic Ocean, they won't be able to ignore the effects of climate change on their own turf. This will be most obvious in Canada and Russia. Yury Morozov, a professor at the Russian Academy of Military Sciences and author of the Russian perspective, writes, "Currently, up to 40 percent of the infrastructure of Russian cities and towns built on permafrost is in critical condition because the frozen ground is melting. Apartment buildings and factories are gradually sinking into quagmires. Buildings are collapsing and pipelines are rupturing."
And as that permafrost melts, of course, it releases large quantities of greenhouse gases into the atmosphere, further amplifying the warming that's changing the Arctic and the rest of the world.
Bulletin of the Atomic Scientists, 2012. DOI: 10.1177/0096340212451568, 10.1177/0096340212451573, 10.1177/0096340212451572 (Open Access) (About DOIs).


text:
Find out more about the
The Assemblies of God has grown to over 67 million members worldwide and is the largest Pentecostal Fellowship in the world. There are currently more than 150 Fellowships that are members of the World Assemblies of God Fellowship.
The purpose of the World Assemblies of God Fellowship is to pursue the fulfillment of the Lord's command to evangelize the lost in the shortest possible time, providing them the opportunity to hear and respond to the gospel in all of its fullness, by encouraging and assisting one another, promoting harmonious relationships and seeking the most effective means of its accomplishment under the dynamic leadership of the Holy Spirit.


text:
This time in this overview I am going to illustrate you how to collect Free Coins for OMG! Fortune, one of the most popular games in the world right now.
Getting OMG! Fortune Free Coins is easy. All you need is the right link to get your account set up, and an ability to realize when new Free Coins become available.
In this section, I am going to illustrate how to do just that. You will learn all the legitimate ways to obtain OMG! Fortune Free Coins and enjoy it at no cost on Android, iPhone, or desktop.
Are These OMG! Fortune Free Coins Safe?
In brief, definitely. Like all the other methods, codes, and procedures you can find here at our page, also the ones that will get you Free Coins for the OMG! Fortune are 100% secure and legitimate.
This is extensive because the Free Coins and tricks you find on this website are the only ones that get you 4047326 of Free Coins without your account getting disallowed right after that.
OMG! Fortune Free Coins: Latest Free Promotion to Play
- 7455314 Free Coins Bonus Link
- 5780017 Free Coins Bonus Link
- 8123325 Free Coins Bonus Link
- 2755801 Free Coins Bonus Link
- 7113939 Free Coins Bonus Link
By the way, check our Facebook.


text:
- Malaysian Grand Prix
Vettel blames 'cucumber' Karthikeyan for puncture
- News:
Vettel has 'total faith' in Red Bull
- News:
Karthikeyan hits back at Vettel
- Feature:
Vettel, cucumbers and Karthikeyan
- Race:
- Malaysian Grand Prix
- Drivers:
- Narain Karthikeyan
- |
- Sebastian Vettel
Sebastian Vettel believes Narain Karthikeyan was responsible for the collision that brought an end to his chances of scoring points at the Malaysian Grand Prix and has called him a "cucumber".
Vettel was running fourth when he came to lap the HRT but tagged Karthikeyan as he passed, causing a left-rear puncture. By the time he recovered to the pits and replaced the shredded tyre he was 12th and out of contention for points. He said his puncture combined with a loss of radio communication ruined his chances of a decent finish.
"Most crucially we lost radio communication and that makes it very difficult in these conditions to know what's going on. Nonetheless, we did our maximum today and got up to fourth. To then lose the race how I did is very frustrating. Some people need to look more where they are going.
Talking to German television, he added: "As in real life, there are a few cucumbers on the road."
He said his pit-to-car radio was dead by the end of the race, meaning he did not hear the mixed messages in the final laps telling him to park the car and then to stay out.
"Today it was crucial to come in at the right time and having no radio meant we were delayed getting the messages and I didn't hear anything from the team at the end," he said. "There were problems with the car after the incident, but I wanted to see the chequered flag. There were no points for me today. Before the incident with HRT the way the race had unfolded was good for us I think, so it's frustrating to lose the race like that."
Team principal Christian Horner explained that a brake problem meant Red Bull wanted to stop the car but said the pit wall could not get the message across.
"We had lost all radio contact with Sebastian, which meant we could only speak with him via the pit board," Horner said. "After his stop he came up to the HRT who hit him and caused a puncture. The incident caused damage to the rear brake duct, which went into thermal runaway, so we wanted to stop the car before the end from a safety point of view. Seb didn't hear us on the radio and continued. Thankfully his car got to the end without failing, but the incident cost Sebastian at least a fourth place finish today."


text:
Popular search terms:
apply online, campus map, admissions events, tuition, transcripts, calendar, graduation, scholarships, nursing, bookstore, registrar, academic calendar, athletics
Instructions and Information
Contains instructions that are specific to Benedictine for instructors, office assistants, and department chairs. Also includes guidance on selecting IDEA objectives, team taught courses, and using additional questions on IDEA surveys.
POD - IDEA Center Notes on Learning
POD - IDEA Center Notes on Instruction
Succinct papers written in collaboration with the Professional and Organizational Development Network in Higher Education (POD). These papers are a great resource in support of teaching improvement! Each paper discusses things one can do to use one of the 20 IDEA teaching methods more effectively.
IDEA Papers
A veritable cornucopia of IDEA papers covering a wide range of topics, such as motivating students, teaching adult students, appraising teaching effectiveness, the reliability of the IDEA system and much, much more.
IDEA Research Notes
These are short notes (1-2 pages) on the results of research done by the IDEA center. For example, one of these notes addresses the question, "Are ratings on the 'overall excellence of teacher' item influenced more by the 'teaching method' used or the 'skill' with which the instructor employs a method?"
IDEA Research Reports
These are "somewhat longer" reports that address specific issues and questions. For example, one report addresses the validity of IDEA student ratings and another report addresses the question "Are quantitatively oriented courses different?"


text:
Brrr! It's cold here at Purl, but Rabbit is bundled up in a warm merino cardigan. This cozy Koigu sweater is a miniature copy of a classic raglan cardigan; great practice for human-sized sweaters, only more cute!
- one skein Koigu Premium Merino, a fingering weight yarn
- US size 3 needles, or size needed to get correct gauge
- 4 stitch markers
- yarn needle
- stitch holders
- Download the Purl Rabbit Raglan Pattern pdf.
This pattern starts with the sleeves to minimize loose ends to sew in later.
6.5 stitches = 1 inch
NOTE: Make two.
Cast on 20 stitches, leaving a tail of yarn about 8 inches long to use for sewing up sleeve and underarms when you are done.
Knit 6 rows (this will create 3 garter stitch ridges).
Row 7: Knit.
Row 8: Purl.
Repeat rows 7 and 8 until sleeve measures 4 inches from cast on edge. Purl Rabbit has extra long arms, so if the doll you're knitting for has arms that are a different length, measure from the doll's wrist to his or her underarm to get the proper measurement for your sleeve.
Bind off 3 stitches at the beginning of the next two rows.
Place 14 remaining stitches on a stitch holder; set aside.
Repeat for second sleeve. Set aside.
Cast on 60 stitches
Knit 6 rows (this will create 3 garter stitch ridges).
Row 7: Knit.
Row 8: K3, purl to last 3 stitches, k3.
Repeat rows 7 and 8 until piece measures 2 inches from cast on edge.
Row 1: Knit.
Row 2: K3, purl 10, bind off 6 stitches, purl 22, bind off 6, purl 10, k3.
Row 1: Knit 13 stitches, place marker, knit across all 14 first sleeve stitches, place marker, knit 22 back stitches, place marker, knit across all 14 second sleeve stitches, place marker, knit to end.
Row 2: K3, purl to last 3 stitch, k3
Row 1: *knit to within 2 stitches of marker, k2tog tbl, slip marker, k1, k2tog, repeat from * for next 3 markers, knit to end.
Row 2: K3, purl to last 3 stitches, k3.
Repeat these two rows 4 more times.
Knit 6 rows even, bind off.
Use tail of cast on yarn to sew up sleeves and underarms. Weave in ends.


text:
On Exhibit
Animal Facts
Scientific Name
Scarus spp
Animal Type
algae that covers coral and the reef bottom
1.5-4 feet (.5-1.2 m)
parrotfishes share some characteristics with wrasses; Family: Labridae
coral reefs worldwide
Natural History
Generally brightly colored, about 60 species of parrotfishes swim in coral reefs around the world. They have fused teeth that form beaklike plates, giving them a parrotlike appearance. They have large thick scales that, in some species, are strong enough to stop a spear.
Their coloring ranges from reds to greens, blues and yellows, as well as grays, browns and blacks. Males and females of the same species generally look quite different and, like wrasses (the Labridae family), female parrotfishes may change into males.
Parrotfishes play an important role in the growth of the coral reef—they feed on algae that could smother the coral if they didn't eat it.
Healthy parrotfishes depend on healthy coral reefs. Unfortunately, global warming, pollution, overfishing and coastal development endanger coral reefs and the animals that live on them. A recent census called Reef Check—conducted by scientists and about 5,000 volunteer scuba divers and local fishermen—included a five-year survey of about 300 of the world's coral reefs. The results showed that the number of coral reef animals has seriously declined. For example, spiny lobsters and bumphead parrotfish have disappeared from the reefs they normally inhabit; the Nassau grouper has virtually disappeared—in part due to overfishing; and sea cucumbers are missing from half of the surveyed reefs. But there's good news, too: populations of key species are increasing in marine sanctuaries where fishing is limited.
Cool Facts
Parrotfishes swim by rowing themselves along with their pectoral (side) fins. Wrasses (the Labridae family) share this swimming style. The next time you visit our kelp forest exhibit, watch how the sheepheads and the señoritas swim—they're both members of the wrasse family.
Parrotfishes produce tons of coral reef sand each year. The sand-making process begins as the fishes graze on the algal film that grows on coral rock. To feed on the algae, the fishes munch on pieces of coral. Molarlike teeth in their throats grind the coral, which then travels through their digestive systems and is deposited in the reef as white coral sand.
Individual species of parrotfish are difficult to identify, since they show different color patterns according to their age and sex. Early scientists named more than 300 species based on the many color forms—now the number of species has been narrowed to about 60.
Parrotfishes are daytime creatures. At night they burrow in the sand or hide in crevices. Some species even secrete a clear mucous cocoon around themselves at night, which probably masks their scent and helps protect them from predators like sharks and moray eels.


text:
You are about to enter a website that may contain content of an adult nature.
Hello everyone, this is Indian cam girl MandyMILF here. I'm 37 year old Female speak English and Italian in the Indian live sex chat action. I`m an unstoppable Sex-Machine. I can do the craziest things You dreamed about. Get on board and forgot about world existing around you - this is going to be another dimension. Let me be your tour guide on this journey.. Hey there! I love my breasts the most. People are saying that I`m really beautiful and smart although I have the kinkiest thoughts you can imagine, visit my show and You surely won`t regret it.. I like the polite and gentle man and also I love playing the strip, their three best samples: 1. Undress me ... 2. Undress you ... 3. We undressed together .... Come, play…. is my expertise and also what I will do in Indian live sex private show. I have Blue eyes, Medium Brown hairs and my measurements are 35-24-35. For Turn ons: My favorite position is the 69… I love the feeling of Your tongue on my clit while Your dick is about to explode into my mouth. If You like the idea, visit my private room and share Your most secret sexual fantasies!. For TurnsOff: Insincere people. I want to be myself and I would like you to be too. It will things a lot more fun.. If you prefer kinks, then Shaved, are mine. I'm just hungry for a HARD cock, can't wait to see u in my Indian webcam sex chat room! :)
This website contains indian cams, desi cam, free hindi chat and tamil sex chat related sexually explicit content.
You must be at least 18 years of age to enter this website.
© Since 2012 myindiansexcams.com Indian Sex Chat Network All Rights Reserved
AllHosts1 - AllHosts2 - AllHosts3 - AllHosts4 - AllHosts5 - AllHosts6 - AllHosts7 - AllHosts8 - AllHosts9 - AllHosts10 - AllHosts11 - AllHosts12


text:
I know when downscaling images we can just use the
scale option. But as far as I know, this doesn't change the size of the overall output (let's say the PDF file).
\includegraphics[trim=1cm 6.1cm 6cm 14.0cm, clip=true, scale=0.3]{figs3.pdf}
\caption{The averaging blocks with $W=2$.}
- Is there anyway to compress the figure when we downscale using
- When we
trimthe figure, and
clip=true, does it through away the extra parts? In other words, does it decrease the size of the figure?
- Is there anyway to compress images inside Latex ?
The original problem is that I am using
zoombox to include magnified subfigures of a BIG image, but I want to put a figure with smaller size instead of the full high-quality figure. (because of size limitation) At the same time, I want the magnified figures to be from the high-quality figure. Any ideas how to do this?


text:
Merkel insists on austerity in Portugal
LISBON, Portugal (AP) — German Chancellor Angela Merkel took her fiscal discipline message to bailed-out Portugal on Monday, tolerating Nazi jibes from a small group of protesters as she advocated the benefits of austerity and economic reforms.
As in her recent trips to bailed-out Greece and debt-stricken Spain, demonstrators unhappy about tax hikes and pay cuts devised to improve public finances turned their anger on the German leader. Portugal needed a 78 billion ($99 billion) rescue last year when it was engulfed by the eurozone's debt crisis, and living standards have dropped sharply.
A protest march in Lisbon featured dummies with Merkel's face and with T-shirts saying "Adolf Merkel" and including a swastika. Banners said "Merkel Nazi, Go Away!" and, in German, "Merkel Raus" (Merkel Out).
"I think it's wrong what they are doing," said Luis Miguel, an actor who was carrying puppets representing Merkel and Portuguese Prime Minister Pedro Passos Coelho. "It's not right what they are taking from the people."
Merkel told a news conference with Passos Coelho she was "not particularly bothered" by the Nazi references, saying people had a right to express their views.
Germany is the eurozone's biggest and strongest economy and contributes more than the other 16 members to bailouts for financially troubled members. In return, it has demanded that rescued eurozone members adopt spending cuts and enact reforms that take away long-standing workers' entitlements in order to improve competitiveness. That has made Merkel a lightning rod for public discontent.
Reactions to Merkel's visit illustrated the split in Europe over how to handle the continent's debt crisis. Merkel and the Portugal's center-right government insist austerity policies must continue. Portugal's main opposition Socialist Party, like French president Francois Hollande, wants a softer emphasis on cuts and greater focus on measures to improve growth. That demand has won broad public support in Portugal.
Authorities laid on heavy security for the visit, but the marches drew only a few hundred people, unlike in Athens and Madrid, where demonstrations have drawn tens of thousands and sometimes become violent. Some hooded protesters pushed over a barricade keeping them away from a venue where Merkel was due to appear, and riot police with shields and dogs were deployed to push demonstrators back.
Merkel praised Portugal's coalition government for complying with the terms of its bailout agreement. Germany and other bailout lenders — the other eurozone countries, the International Monetary Fund and the European Central Bank — are keen for Portugal to stay the course, sparing the continent more difficulties like those in Greece.
The Portuguese government predicts a third straight year of recession in 2013, and the jobless rate has risen to almost 16 percent.
"I think Portugal's conditions for growth have improved greatly recently because of this adjustment program and the courageous action of the government," Merkel told reporters.
"We have to keep our word" on promises to cut debt levels, she said, adding that austerity must go hand-in-hand with reforms to make eurozone countries more internationally competitive.
"It will be a tough path," she said.
The visit came at a tense moment for the government, which is steering another austerity budget through Parliament. The 2013 state budget includes what Finance Minister Vitor Gaspar has called "enormous" income tax hikes that many observers say will choke growth and make it harder for the country to pay off debt. The government has an overall parliamentary majority, allowing it to force through the measures in a vote scheduled for the end of the month.
Merkel's visit coincided with the start of the sixth regular assessment by international inspectors of Portugal's progress in implementing the bailout agreement. The assessment is expected to last about two weeks.
Copyright 2012 Associated Press. All rights reserved. This material may not be published, broadcast, rewritten, or redistributed.


text:
Which tactic you like it best?
Looking for a couple of new ways to add a nice little boost to your marketing funnel conversions?
Give these three "new" conversion tactics a test!
You may also check this report on email automation
Email marketing is constantly getting more interest as years pass. Marketing is making a shift towards the Internet and e-mail marketing is among the major fields that promoters are getting into.
Even if e-mail marketing is getting more popular, it is somewhat getting an infamous image since of spammers. Spam is a term made use of for unsolicited emails that marketers make use of to be able to communicate their marketing message. There has actually been a lot of action that has happened in different states versus spamming. Because of spamming, one can actually be sued.
Surveys have shown that around 70 % of people who receive spam e-mails are rather annoyed or agitated. Bulk of individuals doesn't even open e-mails from suspicious senders or from individuals and business whom they do not acknowledge.
Nevertheless, e-mail marketing is not about its end yet. There are ways on how to legally and ethically send marketing messages through e-mail. One of the methods is "permission-based" e-mail marketing.
Consent email marketing, as the name indicates, takes into factor to consider the consent of the receiver in accepting e-mails consisting of marketing materials. Expressed permission is obtained when people check a box that mentions that they would desire to get email updates and marketing materials concerning a certain product or service.
There are a lot of advantages that approval email marketing provides a promoter as-as compared to spamming. Here are some of them:
1) Legality
As pointed out above, spamming is thought about as an unlawful activity and some states have developed laws and steps to be able to stop spammers. Permission-based email marketing is perfectly legal, and this removes the dangers and possible costs that are connected with being taken legal action against.
2) Ethical
Approval e-mail marketing is seen as an ethical alternative to spamming. Even if one is not demanded spamming, it does not imply that people are not inflamed by the unsolicited e-mails. Sending marketing products that are allowed by the receiver are offered a "go-signal" and is considered entirely ethical.
3) Promotes a great image
Companies that employ spamming activities to be able to market their items are immediately disliked by the individuals who receive their e-mails. Permission-based email marketing offers a company and its product a great business image and, therefore, more appreciated by the targeted audience
4) Target audience.
Consent e-mail marketing channels precious resources to the ideal audience. Spamming tosses marketing efforts as if the promoter is blind. People who offer their grant get emails relating to topics that are appealing to them are people who are willing to invest cash for items in that field. The best target market is reached rather than thoughtlessly spreading out the marketing message.
5) Avoids costs
Authorization based e-mail marketing prevents added expenses. Aside from funneling resources to reach the ideal audience, consent marketing avoids expenses that are associated by being taken legal action against by individuals who have been much inflamed by spam e-mails. Other sanctions that are included with spamming consists of the loss of the business's ISP.
6) Appreciation
Email marketing that is permitted is accepted by individuals with open arms. Spamming is not accepted by the public and it is best that does not take part in this activity.
A study was done by a business called IMT Strategies in 2001 relating to the results of consent e-mail marketing versus the reaction that people make from getting unsolicited email. 48 % of people who get marketing materials with their permission are curious to read the e-mails while just 16 % are interested to check out unsolicited email. The variety of individuals who deleted email marketing messages with approval is half of those who deleted unsolicited email.
Approval email marketing offers specific benefits against spamming. It is a legal and ethical way of marketing through e-mail and receives acceptance from the target market.
Permission e-mail marketing, as the name indicates, takes into factor to consider the approval of the receiver in accepting emails containing marketing materials. Aside from transporting resources to reach the right audience, approval marketing avoids expenses that are associated by being taken legal action against by people who have been much inflamed by spam emails. A survey was done by a company called IMT Strategies in 2001 concerning the effects of approval email marketing versus the response that people make from getting unsolicited e-mail. 48 % of people who receive marketing products with their consent are curious to check out the e-mails while only 16 % are interested to check out unsolicited e-mail. The number of people who erased e-mail marketing messages with authorization is half of those who erased unsolicited e-mail.


text:
It really doesn't get any better than this list of local actors on the East End.
Jeff Keogh as Macbeth. Dan Stearns as Macduff. Andrew Botsford as King Duncan.
Tristan Vaughan, Vincent Cinque, Kenny Kilfara, Josh Gladstone, Morgan Vaughan, Dianne B., Anita Sorel, Bonnie Grice, John Tramontana, Joe Brondo, Brian Schwartz, Gina Fickett, Yuka Silvera, Jennifer Brondo and Tristen Griffen. These are literally the top local names in the acting community on the East End of Long Island. And they are all literally together in one show.
Theater is alive and well in East Hampton, and it all can be seen on stage this weekend with the magical culmination of Shakespeare's Macbeth produced by the Round Table Theatre Company and directed by Tristan Vaughn at LTV Studios in Wainscott.
I used to participate a lot in local theater. I mean like a lot. Every year I did a musical with Springs Community Theater. I wrote a musical that was performed in New York City about lifeguarding in the Hamptons, and for the majority of my life, I was a part of the acting community in East Hampton. I hate to admit it, but ever since I moved to Southampton I've sort of left that behind me.
However, it is nice to know that local theater has come together on such a fantastically serious and impressive scale. From what I can tell, Macbeth this weekend at LTV Studios is being staged by people completely committed to making beautiful theatrical productions. And they have a fine reputation as actors, producers, technicians and directors amongst their peers and fans.
Joe Brondo is one of those people. He's an East Hampton local and is a fixture at Guild Hall in East Hampton. The two of us graduated together from East Hampton High School. Joey told me that the director of the show, Tristan Vaughn, is amazing. Tristan is not only directing and producing the show, but is an actor as well. Tristan has his MFA in acting from the Shakespeare Theatre Company's Academy for Classical Acting at George Washington University.
Joe explained, "Macbeth is something that our director always wanted to direct. It's the first production of their new theater company, the Round Table Theatre Company. Both Tristan and Morgan teach two Shakespeare classes at Guild Hall. Tristan is playing Malcom in the show."
According to Joe Brondo, thanks to the exceptional production value of this particular show, the narrative in Macbeth is easy to follow. "I think the actors rock because you don't neet to bring a dictionary to understand the production. Everyone's intentions are very clear and it makes understanding Shakespearean English easy. Most productions I've seen have some difficulty with the words. That's our strong suit however thanks to the directing and the acting."
Brian Leaver, the Master Set Designer for this show, simply outdid himself with this production. "The set pieces and projections are simply OUTSTANDING!"
You gotta see this show. I'm gonna see it for sure.
Opening on January 11, 2013, The Roundtable Theatre Company will stage William Shakespeare's Macbeth, directed by Tristan Vaughan, in LTV's Studio Three, 75 Industrial Road in Wainscott.
Tickets are $25 for adults and $15 for students/seniors, available at the door, online through this link or by calling LTV at 631-537-2777.
Performance Schedule:
Friday, January 11 at 8 p.m.
Saturday, January 12 at 8 p.m.
Sunday, January 13 at 2 p.m.
Friday, January 18 at 8 p.m.
Saturday, January 19 at 8 p.m.
Sunday, January 20 at 2 p.m.
The play will be presented in an intimate, immersive format with only 100 tickets available each night, so buy early.


text:
The AXIS Fusion Dome series of housings protects the AXIS 213 PTZ Network Camera in outdoor environments, as well as indoor conditions that may be humid, cold or dusty.
The housing provides IP56 protection from dust and water. With a heater and a blower, the housing enables the camera to operate in temperatures ranging from –15 F to 110 F (-26°C to +43°C).
The housing ships with a smoked dome, which allows for discreet surveillance. Its lower semi-sphere is constructed of distortion free, cell-cast acrylic. The housing ships with a wall-mounting bracket that can be replaced with a variety of mounting options all of which provide a protective passage for all necessary cabling.


text:
This blog has moved to http://asmeurer.github.io/
See http://asmeurer.github.io/blog/posts/moving-to-github-pages-with-nikola/ for more details on why I have moved. For now, all posts on this blog have not been migrated.
This blog has moved to http://asmeurer.github.io/
See http://asmeurer.github.io/blog/posts/moving-to-github-pages-with-nikola/ for more details on why I have moved. For now, all posts on this blog have not been migrated.
In my previous post about switching to Python 3 as my default Python, I praised the use of a single codebase for supporting both Python 2 and Python 3. I even chastised the Python core developers for creating 2to3, writing, "I think that the core Python folks made a mistake by presenting Python 3 as a new language. It has made people antagonistic against Python 3 (well, that and the print function, which was another stupid mistake, because even if it was a good idea, it alone has kept too many people from switching). 2to3 was a mistake too, because it perpetuated this idea."
Well, this isn't entirely fair, because I myself used to be one of the biggest advocates of using 2to3 over a single codebase. Take this GitHub comment from when the IPython guys were considering this issue, where I wrote, "maintaining a common code base is going to be a bit annoying from the developer side.…The main benefit of using 2to3 is that 99% of the time, you can just write your code as you would for Python 2, and when it gets to Python 3, it just works (maybe that percent is a bit smaller if you use strings a lot, but it's still quite high). To write for Python 2 and 3 at the same time, you have to remember a lot of little rules, which no one will remember (and new contributors will not even know about). And given that IPython's test coverage is still poor (unless I am mistaken, in which case, please correct me), little mistakes will slip through, and no one will notice until they try the certain behavior in Python 3."
So I just want to clarify a few things.
from __future__ import print_function was introduced in Python 2.6. This means that to support a single codebase for 2.5-3.x you have to write
print('\n') to print an empty line and to print something without a newline at the end, you have to use
sys.stdout.write. Also,
except Exception as e, using the
as keyword, which is the only syntax allowed in Python 3, was introduced in Python 2.6, so if you want to catch an exception you have to use
sys.exc_info()[1]. Now that really is annoying. But in Python 2.6, most differences can be fixed with simple definitions, most of which boil down to try, except ImportError, import x as y type workarounds. The worst are the print function, which can be imported from __future__, division, which can also be imported from __future__ (or worked around), and unicode literals (if it's a big deal, drop support for Python 3.2). Most other things are just simple renames, like xrange -> range, or making sure that you wrap functions that are iterators in Python 3 in
list if you want to access items from them.
map(f, s)[0] doesn't work in Python 3 or that the
StringIO module has been renamed to
io, or that you can't pass around data as strings—they have to be bytes.
Of course, you also need good test coverage to support Python 3 well using 2to3, but you can get away with more because 2to3 will take care of things like the above for you. Perhaps instead of 2to3 what really should have been made is a pyflakes-like tool that uses the same knowledge as 2to3 to check for cross-compatibility for Python 2 and Python 3.
With the single codebase, your view should change. You should start prototyping in Python 3. You should only use Python 2 to test that things work in Python 2 (and since you've been using Python 2 for so long before switching to Python 3, or at least if you're like me you have, this is not that bad). Just yesterday, I found a bug in SymPy in Python 3 that went unnoticed. It relates to what I said above about using bytes instead of strings for data. I just checked, and 2to3 wouldn't have fixed it (and indeed, the bug is present in SymPy 0.7.3, which used 2to3), because there's no way for 2to3 to have known that the data was bytes and not a string. The code was obviously untested, but it would have been obvious that it didn't work if anyone was using Python 3 to use SymPy interactively. As it turns out, some of our users are doing this, and they pointed it out on the mailing list, but it remained unfixed until I found it myself independently.
So old mistakes aside, the lessons to take away from this and the previous blog post are
So I just finished my internship with Continuum. For the internship, I primarily worked on Anaconda, their free Python distribution, and conda, its free (BSD open source) package manager. I might write a blog post about conda later, but suffice it to say that I'm convinced that it is doing package management the right way. One of the major developments this summer that I helped out with was the ability for anybody to build a conda package, and a site called Binstar where people can upload them (the beta code is "binstar in beta" with no quotes).
Another thing that happened over the summer is that Almar Klein made conda Python 3 compatible, so that it can be used with the Pyzo project, which is Python 3 only. The way this was done was by using a single code base for Python 2 and Python 3. Thus, this became the first time I have done any heavy development on Python source that had to be Python 3 compatible from a single codebase (as opposed to using the 2to3 tool).
Another development this summer was that SymPy was released (0.7.3). This marked the last release to support Python 2.5. Around the same time, we discussed our Python 3 situation, and how annoying it is to run use2to3 all the time. The result was this pull request, which made SymPy use a single code base for Python 2 and Python 3. Now, that pull request is hard to mull through, but the important part to look at is the compatibility file. Everything in that file has to be imported and used, because it represents things that are different between Python 2 and Python 3. Ondřej has written more about this on his blog.
In all, I think that supporting Python 2.6-3.3 (not including 3.0 or 3.1) is not that bad. The compatibility file has a few things, but thinking back, it was just that bad or worse supporting Python 2.4-2.7 (heck, back then, we couldn't even use the
all function without importing it). The situation is much better today now that we use Travis too, since any mistake is caught before the pull request is merged. The worst of course is the
__future__, I will be warned about it pretty fast, since
() after
Of course, there are a lot of nice Python 3 only features that we cannot use, but this was the case for supporting Python 2.4-2.7 too (e.g., the with statement and the ternary statement were both introduced in Python 2.5). So this is really nothing new. There is always a stick to drop the oldest Python version we support, and a lag on what features we can use. Now that we have dropped Python 2.5 support in SymPy, we can finally start using new-style string formatting, abstract base classes, relative imports, and keyword arguments after
So as a result of this, I've come to the conclusion that Python 3 is not another language. It's just another version of the same language. Supporting Python 2.6-3.3 is no different from supporting Python 2.4-2.7. You have to have some compatibility imports, you can't use new language features, and you have to have good test coverage. I think that the core Python folks made a mistake by presenting Python 3 as a new language. It has made people antagonistic against Python 3 (well, that and the
In the past, I have always developed against the latest version of Python: 2.6 was the best when I learned Python, and then 2.7. Even though I have had to support back to 2.4, I only used 2.4 explicitly when testing.
Well, given what I said above, the only logical thing to do is to use Python 3.3 as my main development Python. If you use Anaconda, there are basically two ways you can do this. The first is to just create a Python 3 environment (
conda create -n python3 python=3), and put that first in your
PATH (you also will need to add
source activate python3 to your bash profile if you go this route, so that
conda install will install into that environment by default). For me, though, I plan to use a Python 3 version of Anaconda, which has Python 3 as the default. The main difference here is that
conda itself is written in Python 3. Aside from purity, and the fact that I plan to fix any occasional conda bugs that I come across, the other difference here is that conda itself will default to Python 3 in this case (i.e., when creating a new environment with Python like
conda create -n envname python, the Python will be Python 3, not Python 2, and also it will build against Python 3 by default with
conda build). Continuum does not yet make Python 3 versions of Anaconda, but there are Python 3 versions of Miniconda (Miniconda3), which is a stripped down version of Anaconda with just Python, the conda package manager, and its dependencies. You can easily install Anaconda into it though with
conda install anaconda. I personally prefer to install only what I need to keep the disk usage low (on an SSD, disk space is sparse), so this is perfect for me anyway.
My recommendation is to put a Python 2 installation second in your PATH, so that you can easily call
python2 if you want to use Python 2. The easiest way to do this is to create a conda environment for it (
conda create -n python2 python=2) and add
~/anaconda/envs/python2 to your PATH.
So far, I have run into a few issues:
ipython entry point into Python 3 environments. Even so, one has to remember this when installing old versions of IPython in environments.
setup.py develop against anything that uses 2to3 (like IPython).
source activate python2 when I am using Python 2. Or, for a one-off, I can just use
python2, and keep a Python 2 environment second in my PATH. But this issue is not really new. For example, really old versions of SymPy only work with Python 2.5, because they used
as as a variable name.
/usr/bin/env python3 in the shebang line. But for SymPy, I have to be aware of how to support 2.6-3.3, so I have to know all the features that are only in some versions anyway. On the other side of things, if I run some random Python script with a shebang line, it probably is going to expect Python 2 and not Python 3, so I either have to explicitly add
python2 to the command or activate a Python 2 environment
print as a statement instead of a function, so I either have to fix it manually before pasting it or use Python 2. I had tried at one point to make a
%print magic for IPython that would let print work like a statement in Python 3, but I never finished it. I guess I should revisit it.
I'll update this list as I come across more issues.
In all, so far, it's nothing too bad. Conda makes switching back to Python 2 easy enough, and dealing with these issues are hardly the worst thing I have to deal with when developing with Python. And if anything, seeing Python 2-3 bugs and issues makes me more aware of the differences between the two versions of the language, which is a good things since I have to develop against code that has to support both.
So I have just published SymPy 0.7.3.rc1. I'll write a blog post about the release itself when we release 0.7.3 final, but for now, I wanted to write about how we managed to automate our release process.
Our story begins back in October of 2012, when I wrote a long winded rant to the mailing list about how long it was taking to get the 0.7.2 release out (it took over a month from the time the release branch was created).
The rant is fun, and I recommend reading it. Here are some quotes
The intro:
Now here's a timeline: 0.7.1 was released July 29, 2011, more than a year and two months ago. 0.7.0 was released just over a month before that, on June 28. 0.6.7 was released March 18, 2010, again over a year before 0.7.0. In almost two year's time, we've had three releases, and are struggling to get out a fourth. And it's not like there were no changes; quite the opposite in fact. If you look at SymPy 0.6.6 compared to the current master, it's unbelievable the amount of changes that have gone forward in that time. We've had
since then the new polys, at least four completely new submodules (combinatorics, sets, differential geometry, and stats), massive improvements to integration and special functions, a ton of new stuff in the physics module, literally thousands of bug fixes, and the list goes on. Each of these changes on it's own was enough to warrant a release.
So in case I didn't make my point, le me state it explicitly: we need to release more often. We need to release *way* more often.
My views on some of the fundamental (non-technical) issues:
I think that one other thing that has held back many releases is the feeling of "wait, we should put this in the release". The use of a release branch has helped keep master moving along independently, but there still seems to be the feeling with many branches of, "this is a nice feature, it ought to go in the release." My hope is that by making the release process smoother, we can release more often, and this feeling will go away, because it won't be a big deal if something waits until the next release. As far as deprecations go, the real issue with them is time, not release numbers. So if we deprecate a feature today vs. one month from today, it's not a big deal (as opposed to today vs. a year from today), regardless of how many versions are in between.
I read about what GitHub does for their Windows product regarding releasing often on their blog: https://github.com/blog/1271-how-we-ship-github-for-windows (they actually have this philosophy for all their products). One thing that they said is, "And by shipping updates so often, there is less anxiety about getting a particular feature ready for a particular release. If your pull request isn't ready to be merged in time for today's release, relax. There will be another one soon, so make that code shine!" I think that is exactly the point here. Another thing that they noted is that automation is the key to doing this, which is what I am aiming for with the above point.
My vision:
Once we start releasing very often (and believe me, this is way down the road, but I'm trying to be forward looking here), we can do away with release candidates. A release candidate lives in the wild for a week before the full release. But if we are capable of releasing literally every week, then having release candidates is pointless. If a bug slips into a release, we just fix it and it will be in the next release.
We should release *at least* once a month. I think that if the process is automated enough, that this will be very possible (as opposed to the current situation, where the release branch lasts longer than a month). In times of high activity, we can release more often than that (e.g., after a big pull request is merged, we can release).
That was October. Today is July. Basically, our release process was way too long. Half of it was testing stuff, half of it was tedious releasing stuff (like making tarballs and so on), and half of it was updating websites.
We have moved all our testing to Travis CI. So now every pull request is tested, and we can be pretty much assured that master is always passing the tests. There is still some work to do here (currently Travis CI doesn't test with external dependencies), but it's mostly a solved problem.
For updating websites, we conceded that we are not going to update anything that we don't own. That means no attempting to make Debian or Sage packages, or updating Wikipedia or Freshmeat. Someone else will do that (and does anyone even use Freshmeat any more?).
That leaves the releasing itself. It's still a pain, because we have to make a source tarball, Windows installer, html docs, and pdf docs, and do them all for both Python 2 and Python 3.
So Ondrej suggested moving to fabric/vagrant. At the SciPy 2013 sprints, he started working on a fabfile that automates the whole process. Basically vagrant is a predefined Linux virtual machine that makes it easy to make everything completely reproducible. Fabric is a tool that makes it easy to write commands (in Python) that are run on that machine.
Building the basic stuff was easy, but I want to automate everything. So far, not everything is done yet, but we're getting close. For example, in addition to building the tarballs, the fabric script checks the contents of the tarball against
git ls-files to make sure that nothing is included that shouldn't be or left out accidentally (and, indeed, we caught some missing files that weren't included in the tarball, including the README).
You can run all this yourself. Checkout the 0.7.3 branch from SymPy, then cd into the release directory, and read the README. Basically, you just install Fabric and Vagrant if you don't have them already, then run
vagrant up fab vagrant prepare fab vagrant release
Note that this downloads a 280 MB virtual machine, so it will take some time to run for the first time. When you do this, the releases are in the `release` directory.
Finally, I uploaded 0.7.3.rc1 to GitHub using the new releases feature. This is what the release looks like on GitHub, from the user point of view
This is what it looks like to me
GitHub has (obviously) the best interface I've ever seen for this. Of course, even better would be if there were an API, so that I could automate this too. But since Google's announcement that they are discontinuing downloads, we can no longer upload to Google Code. Our plan was to just use PyPI, but I am glad that we can have at least one other location, especially since PyPI is so buggy and unreliable (I can't even log in, I get a 502).
So please download this release candidate and test it. We espeically need people to test the Windows installer, since we haven't automated that part yet (actually, we are considering not making them any more, especailly given the existence of people like Christoph Gohlke who make them for SymPy anyway, but we'll see). The only thing that remains to be done is to finish writing the release notes. If you made any contributions to SymPy since the last release, please add them there. Or if you want to help out, you can go through our pull requests and make sure that nothing is missing.
This past week was the 2013 SciPy conference. It was an exciting time, and a lot of interesting things happened.
First, a background. This summer, I have been doing an internship with Continuum Analytics. There I have been working mainly on Anaconda and conda. Anaconda is Continuum's free (to everyone) Python distribution, which makes it really easy to get bootstrapped with all the scientific software (including SymPy). Conda is Anaconda's package manager, which, I think, solves many if not all of the main issues with the Python packaging tools like pip, easy_install, PyPI, and virtualenv.
I may write more about that later, but for now, I want to write about my experiences at the conference. The main point there is that I have already been in Austin for about a month, so getting to the conference this year was pretty easy.
On the first day of the conference, on Monday morning, Ondrej Certik and I had our tutorial for SymPy. For the past couple of months, I have been rewriting the official SymPy tutorial from scratch. The official tutorial for SymPy was very old, and had many issues. It only went over features that were good at the time of its writing, so while nothing in the tutorial was wrong, it didn't really represent the latest and greatest of the library. Also, it was written just like a list of examples, which is not much more than the API docs. In my new tutorial, I aimed to give a narrative style documentation, which starts from the very beginning of what symbolics are and works its way up to the basic functionality of things like solving and simplifying expressions. My goal was also to lead by example, and in particular, to avoid teaching things that I think either are antipatterns, or lead to antipatterns. In Python, there is one– and preferably only one –way to do it. In SymPy, by the nature of the library, there are about seven different ways to create a Symbol, for example (see https://github.com/sympy/sympy/wiki/Idioms-and-Antipatterns, the section, "Creating Symbols"). But there is one best way to do it: by using symbols(). So all throughout the tutorial, I just use symbols(), even if I am creating a single Symbol. I avoid messy things like var.
The final tutorial is at http://docs.sympy.org/tutorial/tutorial/. This was the basis for the tutorial that Ondrej and I gave at SciPy. The site for our tutorial is at http://certik.github.io/scipy-2013-tutorial/html/index.html. There are links to videos, slides, and exercise notebooks there.
I think our tutorial was a great success. People liked (I think) the introduction from nothing to SymPy. For our exercises, we used the IPython Doctester. I think that people really liked this way of doing exercises, but there were some issues getting it to work on everyone's machine.
In addition to my stuff, Ondrej presented some notebooks of examples of work that he has used in his work at LANL. I think this worked well. There were several physicists in the audience, who understood most of the content, but even for those who weren't (including me!), it really showed that SymPy is a useful tool. In a beginner tutorial, it is easy to get lost in the easy details, and forget that in the end, you can actually use SymPy to compute some powerful things. SymPy has in the past year or two really passed the barrier of toy to tool.
After our tutorial, I attended the IPython tutorial, and the two-part Scikit-Learn tutorial. The most awesome part of this was just getting to meet people. Fernando Perez, Thomas Kluyver, and Brian Granger of IPython were at the conference. Brain is also a SymPy developer, who has spearheaded the quantum module. From SymPy, in addition to Ondrej (who created SymPy), I met Matthew Rocklin, one of the top contributors, Jason Moore, one of the developers of PyDy, which uses SymPy's mechanics module, and David Li, who works on SymPy Gamma and SymPy Live (more on these people later).
After the tutorials, Wednesday and Thursday were the talks. There were a lot of good ones. Here are the ones that I remember the most
Topping off the week were the sprints on Friday and Saturday. My goal was to get out a release of SymPy. We didn't quite get that far, but we got close. We are only blocking on a few small things to get out a release candidate, so expect one before the end of the week. We did introduce a lot of people to SymPy at the sprints, though, and got some first time contributions. Definitely I think we made a lot more people aware of SymPy at this conference than we ever have before.
Another interesting thing at the sprints: before the conference, I was telling David Li that we should switch to Dill for SymPy Live (the way SymPy Live works on the App Engine, it has to pickle the session between runs, because there is a 60 time limit on each execution). Dill is a library that extends Python's pickle so that it can pickle just about anything. At the end of David's talk, the guy who wrote Dill, Mike McKerns raised his hand and asked him about it! At the sprints, David and he worked together to get it working in SymPy Live (and coincidentally, he also uses SymPy in another package, mystic). There were some fixes needed for Dill. He also moved Dill out of a larger project (in the spirit of Matthew's lightning talk), and over to GitHub. Now all they need is a logo (Paul Ivanov suggested a variation on "we can pickle that!").
In all, it was a fun conference. The best part, as always, was meeting people in person, and talking to them. To conclude, I want to mention two other interesting things that happened.
The first is that Matthew and I talked seriously about how to go about fixing the assumptions in SymPy. I will write to the list about this soon, but the basic idea is to just get in there and hack things together, so that we can get something that works. The work there is started at https://github.com/sympy/sympy/pull/2210, where I am seeing if we can merge the old and new assumptions, so that something assumed in one can be asked in the old one.
For https://github.com/sympy/sympy/pull/1969, and previous work at https://github.com/sympy/sympy/pull/1901, we added the ability for the SymPy doctester to run or not run doctests conditionally depending on whether or not required external dependencies are installed. This means that for example we can doctest all the plotting examples without them failing when matplotlib is not installed.
For functions, this is as easy as decorating the function with
@doctest_depends, which adds the attribute
_doctest_depends_on to the function with a list of what dependencies the doctest depends on. The doctest will then not run the doctest unless those dependencies are installed.
For classes, this is not so easy. Ideally, one could just define
_doctest_depends_on as an attribute of the class. However, the issue is that with classes, we have inheritance. But if class
A has a docstring with a doctest that depends on some modules, it doesn't mean that a subclass
B of
A will have a doctest that does.
Really, what we need to do is to decorate the docstring itself, not the class. Unfortunately, Python does not allow adding attributes to strings
>>> a = "" >>> a.x = 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'x'
So what we have to do is to create a attribute that doesn't inherit.
I had for some time wanted to give descriptors in Python a try, since they are a cool feature, but also the second most complicated feature in Python (the first is metaclasses). If you don't know what a descriptor is, I recommend reading this blog post by Guido van Rossum, the creator of Python. It's the best explanation of the feature there is.
Basically, Python lets attributes define what happens when they are accessed (like
a.x). You may already know that objects can define how their attributes are accessed via
__getattr__. This is different. With descriptors, the attributes themselves define what happens. This may sound less useful, but in fact, it's a very core feature of the language.
If you've ever wondered how
classmethod, or
staticmethod work in Python, the answer is descriptors. Basically, if you have something like
class A(object): def f(self): return 1 f = property(f)
A().f magically calls what would normally be
A().f(). The way it works is that
property defines the
__get__ method, which returns
f(obj), where
obj is the calling object, here
A() (remember in Python that the first argument of a method, usually called
self, is the object that calls the method).
Descriptors can allow a method to define arbitrary behavior when called, set, or deleted. To make an attribute inaccessible to subclasses, then, you just need to define a descriptor that prevents the attribute from being accessed if the class of the calling object is not the original class. Here is some code:
class nosubclasses(object): def __init__(self, f, cls): self.f = f self.cls = cls def __get__(self, obj, type=None): if type == self.cls: if hasattr(self.f, '__get__'): return self.f.__get__(obj, type) return self.f raise AttributeError
it works like this
In [2]: class MyClass(object): ...: x = 1 ...: In [3]: MyClass.x = nosubclasses(MyClass.x, MyClass) In [4]: class MySubclass(MyClass): ...: pass ...: In [5]: MyClass.x Out[5]: 1 In [6]: MyClass().x Out[6]: 1 In [80]: MySubclass.x --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-80-2b2f456dd101> in <module>() ----> 1 MySubclass.x <ipython-input-51-7fe1b5063367> in __get__(self, obj, type) 8 return self.f.__get__(obj, type) 9 return self.f ---> 10 raise AttributeError AttributeError: In [81]: MySubclass().x --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-81-93764eeb9948> in <module>() ----> 1 MySubclass().x <ipython-input-51-7fe1b5063367> in __get__(self, obj, type) 8 return self.f.__get__(obj, type) 9 return self.f ---> 10 raise AttributeError AttributeError:
Note that by using the third argument to
__get__, this works regardless if the attribute is accessed from the class or the object. I have to call
__get__ on
self.f again if it has it to ensure that the right thing happens if the attribute has other descriptor logic defined (and note that regular methods have descriptor logic defined—that's how they convert the first argument
self to implicitly be the calling object).
One could easily make class decorator that automatically adds the attribute to the class in a non-inheritable way:
def nosubclass_x(args): def _wrapper(cls): cls.x = nosubclasses(args, cls) return cls return _wrapper
This automatically adds the property
x to the decorated class with the value given in the decorator, and it won't be accessible to subclasses:
In [87]: @nosubclass_x(1) ....: class MyClass(object): ....: pass ....: In [88]: MyClass().x Out[88]: 1 In [89]: MySubclass().x --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-89-93764eeb9948> in <module>() ----> 1 MySubclass().x <ipython-input-51-7fe1b5063367> in __get__(self, obj, type) 8 return self.f.__get__(obj, type) 9 return self.f ---> 10 raise AttributeError AttributeError:
For SymPy, we can't use class decorators because we still support Python 2.5, and they were introduced in Python 2.6. The best work around is to just call
Class.attribute = nosubclasses(Class.attribute, Class) after the class definition. Unfortunately, you can't access a class inside its definition like you can with functions, so this has to go at the end.
Name Mangling
After coming up with all this, I remembered that Python already has a pretty standard way to define attributes in such a way that subclasses won't have access to them. All you have to do is use two underscores before the name, like
__x, and it will be name mangled. This means that the name will be renamed to
_classname__x outside the class definition. The name will not be inherited by subclasses. There are some subtleties with this, particularly for strange class names (names that are too long, or names that begin with an underscore). I asked about this on StackOverflow. The best answer is that there was a function in the standard library, but it was removed in Python 3. My tests reveal that the behavior is different in CPYthon than in PyPy, so getting it right for every possible class is nontrivial. The descriptor thing should work everywhere, though. On the other hand,
getattr(obj, '_' + obj.__class__.__name__ + attributename) will work 99% of the time, and is much easier both to write and to understand than the descriptor.
In this blog post, when I write , I mean the natural logarithm, or log base , i.e., .
A discussion on a pull request got me thinking about this question: what are the solutions to the complex equation ? At the outset, they look like different expressions. But clearly there some solutions. For example, if , then obviously the two expressions will be the same. We probably should exclude , though note that even if is well-defined (probably if it is it is either 0 or complex ), it will be the same well-defined value. But for the remainder of this blog post, I'll assume that and are nonzero.
Now, observe that if we apply to both sides of the equation, we get . Now, supposing that we can apply the famous logarithm exponent rule, we would get , which means that if additionally is one-to-one, we would have that the original expressions must be equal.
The second question, that of injectivity, is easier to answer than the first, so I'll address it first. Note that the complex exponential is not one-to-one, because for example . But we still define the complex logarithm as the "inverse" of the complex exponential. What this really means is that the complex logarithm is strictly speaking not a function, because it is not well-defined. Recall that the definition of one-to-one means that implies , and that the definition of well-defined is that implies . It is clear to see here that being one-to-one is the same as being well-defined and visa-versa ( here is the same loose definition of an inverse as saying that the complex logarithm is the inverse of the complex exponential).
So note that the complex logarithm is not well-defined exactly because the complex exponential is not one-to-one. We of course fix this problem by making it well-defined, i.e., it normally is multivalued, but we pick a single value consistently (i.e., we pick a branch), so that it is well-defined. For the remainder of this blog post, I will assume the standard choice of branch cut for the complex logarithm, i.e., the branch cut is along the negative axis, and we choose the branch where, for , is real and .
My point here is that we automatically know that the complex logarithm is one-to-one because we know that the complex exponential is well-defined.
So our question boils down to, when does the identity hold? In SymPy, this identity is only applied by
expand_log() or
logcombine() when is real and is positive, so let us assume that we know that it holds under those conditions. Note that it also holds for some other values too. For example, by our definition . For our example, this means that , is a non-trivial solution (non-trivial meaning ). Actually, the way that the complex logarithm being the "inverse" of the complex exponential works is that for all (on the other hand in general), so that if , then and . In other words, is always a solution, for any (and similarly for all ). In terms of our question of when , this just says that this always true for , regardless of , which is obvious. We can also notice that this identity always holds for , regardless of . In terms of our original equation, this means that is a solution for all (and as before, for all ).
Note that and real corresponds to and real, respectively, (which are the same condition). So we have so far that the following are solutions to :
Now let's look at some cases where . If and is a nonzero even integer, then so , whereas , which are different by our assumption that . If is an odd integer not equal to 1, then , so = $latex \log{\left (\left(- z\right)^{a} \right )} + i\pi$ WordPress is refusing to render this. It should be log((-z)^a) + iπ = , whereas again, which is not the same because . This means that if we let and , where , we get a non-solution (and the same if we swap and ).
This is as far as I got tonight. WordPress is arbitrarily not rendering that LaTeX for no good reason. That and the very ugly LaTeX images is pissing me off (why wordpress.com hasn't switched to MathJaX yet is beyond me). The next time I get some free time, I am going to seriously consider switching my blog to something hosted on GitHub, probably using the IPython notebook. I welcome any hints people can give me on that, especially concerning migrating pages from this blog.
Here is some work on finding the rest of the solutions: the general definition of is , where is chosen in . Therefore, if , we must have . I believe a description of all such complex and will give all solutions , (and , ) to . I need to verify that, though, and I also need to think about how to describe such and . I will (hopefully) continue this post later, either by editing this one or writing a new one (depending on how much more I come up with).
Any comments to this post are welcome. I know you can't preview comments, but if you want to use math, just write it as
$latex math$ (like
$latex \log(x)$ for ). If you mess something up, I'll edit your comment and fix it.