text:
HP Showcases Security In-Depth With Wolf Security
I've been in and around security for much of my life. My family at one time owned one of the largest security tech companies. I worked for Pinkerton, was a sheriff for a time, owned the security for an IBM group, managed a security practice, and have written a great deal on the subject over the years. Security is a mindset that today surrounds concepts like Zero Trust, constructs like Blockchain, and events like the recent ransomware attack on the Colonial Pipeline.
I'm particularly a fan of the concept of Security In-Depth, which is where you have multiple security layers that collectively act to prevent unauthorized access and will alert on attempts. HP chose some time ago to differentiate on security after it was discovered that printers, at the time, were relatively large security threats due to their internal storage and how easy it was to clone them and use their identity for unauthorized access. They've built an impressive security competency with a dedicated group of researchers and partnerships with cutting-edge security companies like Deep Instinct.
This week they branded their Security In-Depth approach to security "HP Wolf Security," and it is an impressive offering. Let me explain.
The Importance Of Endpoint Security During A Pandemic
While we are working in an office, we are generally surrounded by several tools we take for granted or may not even know to exist. These tools range from physical protections like security cameras, secured entry doors, security guards, and sensors that protect the site, to electronic tools like firewalls, network monitors, external call alerting, and anti-virus software.
But when we shifted people to work at home, often over a weekend, much of these physical and electronic security methods were effectively bypassed. Particularly for companies that implemented VPN solutions, they suddenly had people who weren't protected able to drill in mass into systems that otherwise would be protected. Therefore, according to HP, it should be no surprise that Cyber attacks jumped 238% during the pandemic, with a considerable shift in focus to attacking remote employees.
As of this writing, the Colonial Pipeline breach is connected to a set of highly negligent security practices, suggesting that it won't be for long if the Colonial gets a new CIO (a reminder to prioritize security).
HP Wolf security is broken down into four product groupings.
HP Wolf Security for the Home, explicitly focusing on the growing attacks on employees indefinitely working from home.
HP Wolf Security for business is designed to address the user security needs in any size business, small to large.
HP Wolf Pro security a set of services that focus on Security for small to medium-sized businesses.
HP Wolf Enterprise is a comprehensive security service that focuses on enterprises and government accounts.
New Enterprise Focus
While much of this offering aggregates HP's earlier security technologies under a new brand, several aspects of it are brand new. Access Enterprise uses unique isolation technology, ensuring applications, particularly critical applications, are safeguarded from an attack that uses a PC as an entry point. This tool protects using a hardware-enforced virtual machine (VM), creating a virtual air gap between the protected services and the host PC. This tool also allows a user to securely work on multiple virtual privileged access workstations (PAWS) from a single device.
HPs Wolf Pro integrates threat containment based on micro-virtualizations, next-gen antivirus, and identity protection integrated with HP's hardware security capabilities. Malware prevention appears to use the Deep Instinct technology HP has licensed and Identity protection designed to thwart ever more common identity attacks. This offering appears to integrate with HP's built-in PC hardware security.
The HP Flexworker offers loops in secure printers, so they don't become a problem for those working in otherwise unsecure locations like from home. HP+ smart printers include a Wolf Security component, protecting both them and the environments in which they operate.
The Colonial Pipeline event showcases how critical security is and the need to keep systems patched and secure in the office or at work. Given that this work from home pandemic event no longer looks like it is a one-off thing, many if not most employees will remain working from home, and that a 4th wave of the Pandemic (given variants) is becoming more likely, this offering is well-timed.
It is well past time that device, and particularly home, security was an afterthought, and I'd expect HP's peers to follow HP's lead in making sure our employees remain safe wherever they work.
Rob Enderle has been a columnist for the TechnologyAdvice B2B sites since 2003. His areas of interest include AI, autonomous driving, drones, personal technology, emerging technology, regulation, litigation, M&E, and technology in politics. He has an AS, BS, and MBA in merchandising, human resources, marketing, and computer science. Enderle is currently president and principal analyst of the Enderle Group, a consultancy that serves the technology industry. He formerly worked at IBM and served as a senior research fellow at Giga Information Group and Forrester.


Now available in several countries worldwide, Pokémon Go has gone above and beyond expectations, delivering an engaging augmented reality experience that has prompted players to get outside and hit the pavement to catch 'em all. But no new game comes without glitches these days, and along with server issues slamming the game every other day, a few stand-out problems still remain to be resolved in future updates. One of the biggest is the three-step glitch: on the "nearby" tab, players are supposed to be able to determine how far away a creature is by how many paw prints display under their icon. But every so often, all nearby creatures will display three paw prints no matter what.
To combat this glitch (and the fact that it's hard to determine which types of Pokémon frequent which areas), an all-new app is using crowdsourced information to keep players up-to-date on where to find these hidden gems. It's called PokéRadar, and it's available now on iOS.
PokéRadar's functionality is simple, and could be essential for obsessed trainers. Upon opening the app, a map will display all of the Pokémon that have been found in the user's surrounding area. The app's most useful function is its dropdown search option, where players can specify which kind of Pokémon they want to catch, and the app will display all areas where it has most recently been seen. Users submit their tips on which creature they caught and when they caught it, then the app does the rest of the work.
The only real drawback to the crowdsourced aspect of the PokéRadar is that, in the age of the internet troll, it's possible that a user might plant a fake tip. The app's developers have put measures into place to combat that, giving users "rating systems" where others can upvote and downvote tips based on whether or not it worked. So, for the most part, it's just about staying vigilant before you speed off after a Dragonite (which has not yet been found in the wild, mind you).
Right now, the app is only available for iOS, but an Android version is expected to roll out soon.
Players are exploring their cities and towns in new ways thanks to the game. Some are reporting heartwarming experiences as they use the app to navigate toward famous landmarks in manners that might give Google Maps a run for its money.


The winners of the Diocesan Photography Competition now have their entries on display in Rochester Cathedral.
The photos can be seen in the south transept from 1 – 15 August.
The winning photos can also be viewed in the September edition of Rochester Link.


To alleviate a social disease or dysfunction, problem, or injustice, we have to change our behavior. Alleviating HIV AIDS requires behavior changes. Addressing childhood diabetes requires effecting behavior changes. To gain more influence in city government, we have to change what we do. Self-change comes from involvement in community change. Self-change, even the smallest of changes, such as holding a door open for someone, or smiling, even if you don't feel like it, produces higher consciousness. It produces greater awareness.
Many believe that an idea creates change. And there is some truth to that. However, for profound change to occur, we need to change our consciousness. A positive change in conduct increases or heightens our character. A negative change in conduct lowers or decreases our character. Higher character leads to broader and more developed consciousness.
To see beyond our immediate pleasures or pains and to see solutions, requires conduct that leads to consciousness. Consciousness is the knowledge that creates power.


A world-first study out of New Zealand aims to reveal the health benefits that conventionally-born babies may get in early life – which babies born by Caesarean-section miss out on.
According to the latest New Zealand Ministry of Health figures, there were 16,423 C-section births in this country last year – 25 per cent of all live births.
Scientists at the University of Auckalnd's Liggins Institute, however, say that babies born by C-section have a greater risk of getting asthma and eczema, and are also likely to be obese later in life.
The study will investigate the role of mothers' bacteria in babies' early health, and will "examine twins where one twin is treated with the mother's bacteria, and the other is not," says study lead Professor Wayne Cutfield.
If the treatments with the mothers' microbiome actually improves the health and wellbeing of the children in terms of obesity and asthma, it's going to be a simple thing to scale up and do," Cutfield adds.
Findings from previous studies suggest that what's commonly called "vaginal seeding" might help babies born by caesarean establish normal gut bacteria.
This new study, a first of its kind, is said to be informative to pregnant women who may or may not be undergoing Caesarean section, and to obstetricians and midwives.
More information and how to get involved can be found on the University of Auckland website.


text:
Report/Track Your Claim
Check Policy Status
Employee Giving and Volunteering
Youth Leadership Programme
Buy Motor Insurance
HomeWelcome to FBN General InsuranceCitizenshipCommunity SupportYouth Leadership Programme
The Youth Leadership programme is targeted at young people between the ages of 14 and 35 years old. The key objectives of the programme are providing a platform for the youth to imbibe a deeper understanding of the necessary but rewarding sacrifices and qualities of great leadership and equipping them the relevant tools, skills to become great leaders; opportunities for youth participation in developing the country through sustainable community development programmes; mentorship for the youth and value based leadership.
Our current partners are the Nigeria Leadership Initiative (NLI) and LEAP Africa. We have partnered with NLI since 2008 and have been committed to goal of bridging the knowledge gap between NLI Fellows and the young associates of the Future Leaders. In December, 2013, we partnered with LEAP Africa on a Youth Development Programme where staff of FirstBank were trained as trainers on life, leadership and facilitation skills; which they will be expected to cascade to at least 30 young people between the ages of 14 and 35 years old within their network.
Staff volunteers who attended the youth development training programme were exposed to in-depth knowledge, skills and tools of becoming effective leaders with specific instructions on self-discipline, mastering potentials, project planning and management. About 1,000 young people will be further empowered through this initiative as FirstBank staff volunteers will share their knowledge and impart leadership skills to young Nigerians in public Secondary Schools by educating and empowering them using the LEAP Africa training curriculum.
Future First
Employee Giving & Volunteering
Educational Endowment Programme
Claims-Alert
Our Core Investors
Copyright © 2020. FBN General Insurance Ltd. RC 208278 | A subsidiary of FBNInsurance Ltd.
All Rights Reserved. Authorised and Regulated by the National Insurance Commission. RIC NO. 031
We use cookies to offer you the most relevant information and best experience on our website. By continuing to browse this site, you give consent for cookies to be used. For more details, please read our Privacy and Cookie Policies.
Find out more Accept Cookies
I already like FBN General Insurance.com

redpajama_set_name: RedPajamaCommonCrawl


text:
Industry News 3 mins
Two Thirds of US, EU Crypto Exchanges Fail to Verify Customer Identities
Next Article: Asian Cryptocurrency Trading Update: Ontology Rising Above the Rest
Analyst P.A.ID Strategies has revealed the results of research into the on-boarding practices of cryptocurrency wallets and exchanges across the U.S. and Europe, research that focused on which of these crypto service providers are using Know Your Customer (KYC) checks when on-boarding customers. These companies might have to change their protocols when the EU's anti money laundering regulations come into effect next year.
Exchanges and Wallets Under Scrutiny
Out of the 25 services included in the study — picked based on the volume of transactions — the identification protocols of 14 exchanges, including Kraken, Coinbase, Gemini, and Poloniex, and 11 wallets, including Luno, Bonpay, and Mercatox, were examined.
The research, commissioned by Mitek, a digital identity verification firm, shows that of the 25 wallets and cryptocurrency exchanges examined, 68% are allowing users to trade crypto and fiat currency with no official identification or KYC checks — with most requiring just an email address and a telephone number.
These lax requirements might be set to change. When the The EU's fifth anti money laundering directive, AMLD5, comes into effect in 2019, it will seek to bring these currently non-compliant platforms in line with other financial service providers like traditional banks, making it law that checks are carried out on new customers to confirm their identities. John Devlin, principal analyst at P.A.ID, said of the issue:
"Cryptocurrency wallets and exchanges want to enjoy the same trust as the wider traditional financial services, but for this to happen they need to rise above the sometimes-dubious reputation of cryptocurrencies' past and be seen as 'model citizens' of the economy."
Currently, in order to sign up to exchanges and wallets that do not perform KYC, customers only need a verified email address and mobile number. Both of these are attainable without ID — and in many countries an easily purchased pay-as-you-go mobile phone is sufficient.
With these simple tools, users of the exchanges that presently fail to meet the upcoming AMLD5 regulation can buy and sell cryptocurrencies and exchange them for fiat currencies with no questions asked.
"Wallets and exchanges want to change perceptions of lawlessness and it's a relatively straightforward fix. Identity verification processes can be—if implemented correctly—simple for the customer and no barrier to signing up," said Kalle Marsal, COO at Mitek. "By incorporating systems that are just as future-looking as cryptocurrency itself, exchanges and wallets can be both competitive and compliant with regulatory demands."
If a cryptocurrency platform is found to be involved (implicitly or not) with money laundering after failing to meet the demands of the upcoming regulation, it's likely to cause irreparable damage to the company's brand.
As we know, this is a delicate subject. The key is to find the right balance between protecting our rights to chose what information we share (or don't) about ourselves, while at the same time helping take the right steps to further legitimatize the crypto industry.
"Meeting the regulatory demands ahead of AMLD5 coming into force could go a long way to changing this sector's reputation as being something of a 'wild west'," Devlin said.
Image from Shutterstock
Two Thirds of US, EU Crypto Exchanges Fail to Verify Customer Identities was last modified: June 6th, 2018 by newsbtc
Tags:amlAMLD5coinbasecryptocurrency exchangecryptocurrency walleteuGemeniidKnow You CustomerkrakenkycpoloniexregulationU.S. BitStarz Player Lands $2,459,124 Record Win! Could you be next big winner?
Existing Bitcoin Exchange Dwarfs Institutional Volume: Are CME and...
Despite successful shows of force from CME Group and Bakkt's Bitcoin options offerings, the...
Thomas Delahunty 1 day ago
Fidelity's Crypto Team Just Forayed Into Europe, and It's...
Fidelity Digital Assets (FDAS), the Bitcoin-centric arm of investment firm Fidelity, has...
Thomas Delahunty 3 days ago
Why Bitcoin Adoption May Spike if Australia's Proposed...
People could be jailed for two years and fined $25,200 just for using more than $10,000 in...


text:
US drone attack kills another 14 Afghan civilians
An Afghan lawmaker says more than a dozen civilians have been killed in a recent US drone strike, which was said to be aimed at a militant targets in the country's eastern province of Kunar.
On Friday, residents from the Chawki district of Kunar Province held a gathering to pay tribute to the victims of the deadly drone attack a day earlier.
Speaking during the ceremony, Afghan lawmaker Shahzada Shahid said "the villagers are very upset about this incident, people are now busy with the funeral ceremony of the 14 civilians from the area."
"There is no doubt that they were civilians, they were not armed with weapons and those that were killed were oppressed," he added.
A resident also said, "All the victims were civilians and they bombarded the villages and the houses. All of them were local people and did not belong to the enemy."
Provincial governor's spokesman Abdul Ghani Musamim said Saturday that the strike targeted a meeting of local Daesh terrorists and Taliban militants, without elaborating on any details.
Afghanistan's Defense Ministry spokesman Dawlat Waziri also confirmed the report.
The US-led foreign military forces in the country have not yet commented on the incident.
The government has no control over the remote area where Afghanistan's Daesh affiliate has managed to establish a foothold, among other areas in the eastern part of the country.
The United Nations announced in a quarterly report on Thursday that Afghan civilian casualties from US and Afghan airstrikes have climbed by more than 50 percent since last year.
The US military has escalated attacks in Afghanistan under a new strategy announced by President Donald Trump in August.
Washington currently maintains 8,400 soldiers in Afghanistan, with NATO troops making up another 5,000.
Civilian casualties caused by NATO forces have been one of the most contentious issues during the 16-year military campaign in Afghanistan, prompting strong government and public criticism.
Afghanistan is still suffering from insecurity and violence years after the United States and its allies invaded the country as part of Washington's so-called war on terror. The military invasion removed the Taliban from power, but the militancy continues to this day.
The war in Afghanistan is the longest in US history with a cost of about $1 trillion. More than 2,400 Americans have died and another 20,000 have been wounded since the invasion in 2001.
US airstrike in Afghanistan kills 17 police officers
US military's only goal in Afghanistan is to not have to admit they failed
'No foreign intervention' President Trump bombs Afghanistan over 500 times last month
US airstrike kills 16 civilians in Afghanistan
Legalised murder: US airforce kills 12 Afghan police
Australian special forces killed children in Afghanistan and covered it up 10 times
Trump admin drone bombs Yemen, innocent civilians killed
US drone strike kills 15 civilians in Afghanistan
Pentagon: Special Ops killing of two pregnant Afghan women was "appropriate" use of force


text:
Oregon Trail card game and an adult version of Codenames found at Target (update)
Reddit posts hint at a raft of new tabletop games headed to a retailer near you
By Charlie Hall@Charlie_L_Hall Jul 25, 2016, 4:30pm EDT
Source Reddit and Reddit
Share All sharing options for: Oregon Trail card game and an adult version of Codenames found at Target (update)
A Target shopper found a batch of new, exclusive tabletop games and posted pictures straight to Reddit. Among the new titles is an adults-only version of the popular party game Codenames. Another shopper also found an Oregon Trail-themed card game.
Polygon first encountered Codenames at last year's Gen Con in Indianapolis, where we included it in our roundup of the convention's best board games. Players take the role of spymasters, trying to give their teammates clues to find other agents in the field. The simple mechanics and opportunities for improvisation quickly put in the number one slot of the Board Game Geek community's best party games.
Codenames: Deep Undercover puts an adults-only twist on the game with words like commando, motorboat and clam. Publishers Czech Games Edition seems to be saying this was all Target's idea:
It's the Target call - idea and distribution. And we gave Them the agreement to do so.
— Czech Games Edition (@czechgames) July 25, 2016
We've got plans to spend time with Codenames: Pictures, another new version of the game that replaces the words entirely. It's slated for release in just a few weeks and is expected to be on the floor of this year's Gen Con.
Pressman Toy Company, on the other hand, has gone decidedly old school with The Oregon Trail Card Game. Leaning heavily on the original 1974 classic, details are scarce but it looks to be a faithful interpretation including cards for food, water, bullets and oxen to start your journey and a sideboard to place your headstone when you inevitably die of dysentery.
Of course, we've called our local Target and they deny any of these games are in their computer system. But they're clearly in the distrubition pipeline, which could put them on store shelves during or even slightly before this year's Gen Con.
For all of Polygon's tabletop coverage, see our dedicated page here.
Update: We heard back from Target, and these and other new games will be widely circulated exclusively at their stores starting Aug. 1.
Next Up In Tabletop Games
Annie Wersching, who played Tess in The Last of Us game, has died at 45 The actor was diagnosed with cancer in 2020
Star Trek: Picard season 3 trailer gets the whole Next Gen gang back together To nostalgically go where many have gone before


text:
HomePosts tagged 'antagonist'
Seeking that which lies within
April 26, 2019 Maximum Z antagonist, backstory, character arc, characters, development, draft, emotion, goals, motivation, problem-solving, protagonist, rewrite, screenplay, screenwriting, script, writing	antagonist, characters, development, emotions, goals, protagonist, rewrite, screenplays, screenwriting, script, writing
I won't say the tough part of this rewrite is over, because it's not. Well, part of it is. Sort of. Still working my way through Act 3 of the current draft, along with taking care of some minor story developments that have popped up as a result of changes along the way. Seriously hoping to wrap things up in the next week or so. Depends on how all of this goes.
But there's one thing that's been weighing heavily on my mind as I crank out the pages and start planning for the next draft. As good and solid as the action parts are, I also want to make sure the characters' emotional arcs are just as effective.
Every character needs an internal and external goal. While the latter has never given me much of a problem, the former can sometimes be a bit trickier. Sure, there's the protagonist and antagonist, which really drives the main storyline, but what happens with the supporting characters is just as important.
I've always been impressed with seeing how other writers incorporate little details or necessary information about the characters into the story that really help flesh them out AND add to the story. That's what I'm seeking to do here. It's also helpful to approach it with the mindset of "how to convey this information without it seeming too expository or on-the-nose?".
As a writer, you want your characters to come across as realistically as possible, and by offering up some details about them – especially the why they do the things they do, it can help us better relate to them, and also make us wonder if they'll be able to achieve their goals. When the story's over, will we have seen how they changed from when they first showed up?
I've given myself the homework of watching films of a similar nature to get a better grasp on how to work these sorts of developments into the story. Going over the pages I already have has shown the foundations for each character are more or less in place, and will require digging a little deeper to really put them on full display.
While I'm glad I was able to produce this draft relatively quickly, I'm equally as eager to get started on the next one, taking care of everything it'll require. That's becoming a long list, but I'm feeling pretty confident about being able to effectively handle every item on it.
Q & A with Jeff Buitenveld of ScriptArsenal
April 12, 2019 Maximum Z analysis, antagonist, characters, concept, consultant, contests, development, dialogue, directing, feedback, flaws, goals, Los Angeles, Marvel Comics, movies, objective, originality, pie, producer, production company, protagonist, screenplay, screenwriting, script, stakes, story, storytelling, structure, subtext, theme, UCLA, writing	antagonist, characters, concept, flaws, Marvel Comics, originality, producer, production companies, protagonist, screenplays, screenwriting, script, story, theme, writing
Jeff Buitenveld of ScriptArsenal is an independent producer and former development executive with over 15 years of experience on some of Hollywood's biggest films. He is currently a producer on the upcoming thriller The Kimberlite Process. After graduating with an MFA from UCLA's Producers Program, Jeff worked in various capacities on numerous productions for Tom Cruise and Paula Wagner including The Last Samurai, Mission Impossible 3, Jack Reacher, Valkyrie, Lions for Lambs starring Robert Redford and Meryl Streep, Ask the Dust starring Colin Farrell and Salma Hayek, Death Race starring Jason Statham, The Eye starring Jessica Alba, Suspect Zero starring Aaron Eckhart and Ben Kingsley and many more.
What's the last thing you read or watched that you thought was incredibly well-written?
Spider-Man: Into the Spider-Verse was a blast. HBO's Barry is a funny and oddly haunting series. I recently re-watched/re-read Hell or High Water, which is a deceptively simple, sad, and suspenseful story with rich, complicated characters. Netflix's The Haunting of Hill House delivered the goods on scares and family dysfunction for me. Issa Rae ("Insecure,") Jill Soloway ("Transparent,") Amy Sherman-Palladino ("The Marvelous Mrs. Maisel,") and Andrea Savage ("I'm Sorry,") all have unique, exciting, and powerful voices.
How'd you get your start in the industry?
I didn't know anyone in LA when I first moved here but developed a sci-fi project that was quickly optioned by an Academy Award-winning producer (and never made). During that time, I was also accepted into UCLA's Producers Program where I took Meg Le Fauve's ("Inside Out" "Captain Marvel") Development class, which was instrumental to my growth and understanding of cinematic storytelling and how to work effectively with screenwriters. I started cold-calling various companies for internships and was lucky enough to land positions at both Artisan Entertainment and Mike Medavoy's Phoenix Pictures. Back then, Artisan had a deal with Marvel and I was immediately thrown into pitch meetings with various notable writers/directors on properties like Thor, Hulk, The Punisher, Black Widow, and Iron Fist, etc. I was also taking pitches at Phoenix – it was an incredible learning experience. I eventually became an assistant briefly to a Hong Kong action director and then used those experiences to land a job with Tom Cruise and Paula Wagner once I graduated from UCLA.
Is recognizing good writing something you think can be taught or learned?
Though having an eye for quality material can be a natural instinct, it needs to be honed. I ultimately feel that recognizing good writing can be learned and taught.
What do you consider the components of a good script?
Generally speaking, a good script maintains a captivating concept, and a flawed but likeable hero with a concrete objective attached to grave stakes (whether intimate or epic). The hero's emotional flaw is often rectified as a result of him/her achieving their practical goal (he/she should also be active, resourceful, and exhibit a range of change). It's helpful if the hero's goal is time-sensitive and somehow socially relevant. Lastly, if the script is a feature, it should adhere to a three-act structure.
What are some of the most common screenwriting mistakes you see?
Too much description, on-the-nose dialogue, flimsy structure, and the lack of a flawed hero with a concrete objective, attached to grave stakes.
What story tropes are you just tired of seeing?
I'm not at all opposed to writers using things like "one last job," "a reluctant hero who can save the world," "a family in peril," or "a fish out of water," etc. The familiar can be very accessible and., if used effectively, can lure a reader into the story. The trick, however, is to infuse that story with other unique and complex qualities so that it unfolds in fresh and unexpected ways. What can make your story different or set it apart? I always urge writers to challenge the reader's expectations or preconceived notions as to what type of story they're entering!
What are some key rules/guidelines every writer should know?
-Use Final Draft.
-Study the most notable screenwriting books and authors.
-Read every script you can get your hands on whether good, bad, or mediocre.
-Have conviction but be open to ideas – ultimately this is a collaborative industry.
-Don't be afraid of genre and don't be afraid to push the boundaries on the tenets of said genre (but know what those tenets are).
-Actively seek feedback and don't be precious.
-Strive to be both clear and complex in your writing and understand the difference between the two.
-Don't be a hater – watch all kinds of movies and TV shows, and be mindful of those that are both commercially and critically successful as well as those that aren't.
-Read the trades to better understand the marketplace.
-Don't chase trends – write from the heart.
Have you ever read a spec script that was an absolute, without-a-doubt "recommend"? If so, what were the reasons why?
"Recommends" are a rare breed. Those that do qualify show a master of the craft, are usually somewhat familiar but also somehow unique, tend to maintain complex characters, rich themes, and have an easily identifiable position in the marketplace (you can visualize the poster, trailer, audience, etc.) That being said, most of the scripts I've read, even from the most notable A-list writers in the industry, still needed some further development.
How do you feel about screenwriting contests? Worth it or not?
I think it can be incredibly important and worthwhile, particularly for young writers, to enter screenwriting contests. However, I would also encourage writers to do some homework on which ones are notable and relevant so as to not waste too much money and time.
How can people find out more about you and the services you provide?
Go to www.scriptarsenal.com and follow us on FaceBook and Twitter to get updates on upcoming sales and weekly helpful screenwriting tips.
Readers of this blog are more than familiar with my love/appreciation of pie. What's your favorite kind?
Given my mid-section I generally try to stay away from sweets, but a few years ago, I had some homemade pecan pie (numerous pieces actually) for Thanksgiving and it was an absolutely transformative experience…a chemical portal to another dimension that somehow transcended the time-space continuum…okay, maybe I'm being a bit dramatic but damn, it was good!
A most informative Q & A with Andrew Zinnes
December 7, 2018 December 7, 2018 Maximum Z acting, Anderson, antagonist, assistant, characters, conflict, consultant, contests, emotion, ideas, Los Angeles, motivation, networking, originality, overwriting, passion, pie, production company, protagonist, reading, screenplay, screenwriting, script, story, structure, studio, style, superheroes, Tarantino, tension, tropes, voice, writing	antagonist, conflict, contests, emotions, ideas, originality, overwriting, pie, production companies, protagonist, screenplays, screenwriting, script, storytelling, structure, voice
Andrew Zinnes is a UK-based screenwriter, screenwriting consultant and producer who's worked for production companies, read for contests, and co-author of The Documentary Film Makers Handbook: The Ultimate Guide to Documentary Filmmaking and The Guerilla Film Makers Pocketbook: The Ultimate Guide to Digital Film Making. He currently holds the position of Lecturer in Screenwriting at The Bournemouth Film School at Arts University Bournemouth, the London Film Academy, and the University of Portsmouth.
What's the last thing you read/watched you thought was incredibly well-written?
I have small children so I don't get to the theater as much as I'd like, but I recently saw I, TONYA and thought it was fantastic – a real pleasant surprise! I remember the Nancy Kerrigan incident vividly and, at the time, there wasn't a bigger villain than Tonya. Yet Steve Rogers managed to make her sympathetic by focusing on her relationship with her mother and other aspects of her home life. Then you add breaking the fourth wall and other stylistic choices, and the characters became self-aware in a manner that added to their depth and relatability. BABY DRIVER was great, too. Loved the way they used music to tell the story. Very Edgar Wright.
I became a script reader for a small production company based at Sony. I read for free as I wanted anyway into the machine. I would go in on off days or they would messenger me scripts, back when that was a thing, and I would write up coverage and fax it back to them, when that was a thing. I became friends with the assistants in the office and when I said I wanted to do development, they put me up for other assistant gigs.
From my experience, recognizing good writing is innate. Many years ago, I went home for Thanksgiving and took my weekend read with me. My sister got curious and started reading some of them. She read one that was a spec from an unknown writer and she was surprised at its mediocrity. She stopped reading after 40 pages and picked up another. This time she started laughing straight away and continued through the whole 100 pages. That script turned out to be AMERICAN PIE. She knew the difference between the two scripts quality-wise with no training, but what she wasn't able to do was tell me what was wrong with them via screenplay/story theory or how she would have fixed any issues. That part needs to be learned and practiced as one would with any craft.
The biggest component revolves around making the story or premise personal to you, the writer. If it's not something you're passionate about then how are you going to put 100% effort into it? If you can't connect to the premise, then how can the reader or the viewer? John Truby says this issue leads to generic, unoriginal work and I have seen this first hand with my college/university students. Just recently, one wanted to do a crime thriller that had an okay hook, but was otherwise unremarkable. I asked why he wanted to do this project and he said it was because he loved those kind of movies and this sounded cool. I told him my doubts and he got frustrated. He said that he has trouble making decisions about writing because he doesn't want to make mistakes that can't be undone easily. When I pressed, he said he felt that way about many things in life, not just writing. I told him he should write about that concept. His eyes lit up!
The other key component are the forces of antagonism. I don't just mean the villain. I mean everything that holds back the protagonist(s) from their goals. The better they are, the better the tension, drama and comedy become.
Because I work with many writers in the development of stories from early in their conception, impatience reigns the king of mistakes. Often times writers want to rush into the actual writing before they've explored a premise fully. The don't want to do enough research to make the story richer or come up with alternative character motivations and story points that might make their project surprising and original. They don't want to take hard looks at their structure because they have something in their head and want to get it out. I get it. I've felt the rush of getting something down in Final Draft, too. However, whenever I've let a client or student get on with it despite my objections, it always goes wrong. They create a story and/or characters that are generic or derivative. They come to the point where the structure doesn't work and either get stuck or plow forward anyway and there's structure or story flaws. Now for some writers, this is the process they need to go through. This is how their brains process information. That's fine, but whether that is the case or they are just steadfast, we end up going back to the drawing board to pull everything apart as we should have done originally.
Aside from that, overwriting tends to be an issue, especially with newer writers. Screenplays are meant to be quick reads and having a lot of black on the page slows that down. Learning economy of writing is essential. I realize that many people, myself included, like Wes Anderson or Quentin Tarantino's style, which creates these dense, epic screenplays and, that further, feel they should follow suit. However, one, that's being derivative; two, they're directing the work so they probably doing it partially because they don't want to forget anything; and three, they've earned it as they had to fund their first films in this style mostly themselves and became successful with it.
Tropes don't bother me. It's what is done with the tropes that matters. Whenever a superhero movie comes out social media garners a a lot of eye rolls and hate from various creative or general public communities and then WONDER WOMAN, DEADPOOL or BLACK PANTHER comes out and shakes things up. Teen horror films is another one that gets a lot of grief, and then HAPPY DEATH DAY hits the screens and all of a sudden cyberspace is hit with short memory syndrome. Take tropes and tell them in unique ways.
What are some important rules every writer should know?
-Observe people, places, things and ideas.
-Observe by asking questions and listening to what people say and don' t cut them off to speak about yourself.
-Travel and observe what's around you.
-Write down what you observe and think about what universal truths of the human condition emerge that matter to you.
-Read good scripts and watch good movies so you know what works.
-Read bad scripts and watch bad movies so you can recognize problems to avoid.
-Notes are opinions. They aren't personal.
Have you ever read a script that was an absolute, without-a-doubt "recommend"? If so, what were the reasons why?
I haven't read many. TRAINING DAY may have been one. THE SIXTH SENSE may have been one, too. The reasons are for the usual hallmarks: great voice, original take on a premise, explored some kind or large idea, writing that moved my emotions (tense, scary, etc) and structured well. Then the other side of the equation, the business side, saw great roles for movie stars to play, was something my company might do and had general commercial appeal.
That's a tricky one. On the one hand, if you can win one or at least become a finalist, it can get you noticed. The bigger the competition the better your chances, obviously. If you live outside of Los Angeles or don't have a friend that works in the industry, it may be one of the only ways that you can garner attention. On the other hand, if you enter many of them, it can get expensive. Also there is a fundamental truth about screenplay competitions: there has to be a winner. It's the best of what a competition gets that year, not necessarily the best written thing that would attract an agent or manager and that sometimes makes Hollywood impatient with competitions. But all in all, I say they are worth it. Especially if there's some sort of networking attached to winning or placing.
How can people can get in touch with you to find out more about the services you provide?
I'm very easy to find: andrewzinnes.co.uk. You can message me from there. I live in the UK, but work with writers all over the world. Thank you FaceTime, Skype and WhatsApp!
Blueberry! I make a mean one, too.
What you want VS what the story needs
January 26, 2018 Maximum Z analysis, antagonist, characters, development, draft, editing, ego, feedback, ideas, narrative, notes, protagonist, rewrite, scenes, screenplay, screenwriting, script, story, storytelling, writing, writing process	antagonist, characters, development, drafts, editing, ego, feedback, notes, protagonist, rewrite, screenplays, screenwriting, script, story, storytelling, writing
Sometimes it takes a little more evaluation
Over the course of several drafts, the core elements of my scripts remain more or less the same. There might be a few changes here and there, but to me, the end result is pretty darn close to what I originally intended.
As part of the development of those drafts, I get notes from trusted colleagues and professional analysts. Everybody has their opinions, of which there were many, and I can pick and choose which ones to use.
I was still presenting my stories the way I wanted to tell them, but is that the way they should be told? Was I falling into the trap of "I'm the writer, so what I say goes! End of discussion!"?
I recently got notes on one of my scripts that offered up some keen insight regarding the antagonist's storyline. This included the reader's frustration about what they perceived as a lack of knowing the character's goal and the reasoning behind it.
At first, that was pretty surprising to hear. But as is usually the case, I took a step back and looked at the big picture, trying to be as objective as possible. Was it really not as apparent as I thought?
And as is also usually the case, their comments were spot-on. I had never made any big changes to how that storyline was written because I saw it as being "just fine the way it is", which also happened to be the way I wanted it to be.
Which was counterproductive to how the story needed it to be. It wasn't working within the context of the story itself.
Was it my writer's ego that prevented me from seeing this through all the previous drafts? Maybe a little. I've seen this kind of thing before in other scripts, but just couldn't see it within my own material.
I knew the script wasn't perfect, but there'd always been this nagging thought in the back of my mind that it still needed work. Something had to be changed, but I couldn't identify what. This could also explain why I always felt compelled to keep working on it.
But with those notes, I now had a much firmer grasp of what the reader was talking about, and could begin to rectify the situation.
It took a little time to work through it, including some significant edits and rewrites. It also entailed cutting some scenes that absolutely broke my heart to see them go, but were totally necessary. All part of the process.
I know I've said all of this before, but looking through the latest draft, the script really does seem different now – in a better and much stronger sense. The characters, especially the protagonist and antagonist, feel more developed. The story reads as more concrete. I'm very happy with how it turned out.
Once I was able to put what I wanted aside and focus on what was best for the story, it all came together a lot better than I expected. My hope is that this kind of self-analysis will be a bit easier for me to figure out for future drafts of other scripts.
Can't wait to give it a try.


Affordable Housing is one of the areas for which DAA and NAA provide services and resources. There are webinars available for DAA members that relate to Affordable Housing issues.
NAA is on the leading edge of national advocacy for many relevant issues, including submitting HUD comment letters, Section 8 improvements, tax credits and income verification.
DAA is a proud member of PennDel AHMA.
Contact Candy McVey for more information on DAA's role with Affordable Housing.


Booking.com: Hotels in Guwahati. Book your hotel now!
Featuring free WiFi, a restaurant and a sun terrace, Eagle Nest Home Stay and Serviced Apartment offers accommodations in Guwahati, 6.2 mi from Kamakhya Temple. Guests can enjoy the on-site bar.
Providing free WiFi, Treebo Trend Hotel Rudraksh is located in Guwahati, 10 miles from Kamakhya Temple and 5 miles from Accoland.
Kirtti Inn provides accommodations in Azara Guwahati. All rooms boast a flat-screen TV with cable channels and a private bathroom.
Located in Guwahati, 7.5 mi from Kamakhya Temple, Kiranshree Grand features rooms with air conditioning. This 5-star hotel offers a 24-hour front desk and free WiFi.
Located in Guwahati, OYO Flagship 15828 Neexotica is 10 miles from Kamakhya Temple. All rooms feature a TV with cable channels and a private bathroom. Accoland is 6 miles from the property.
Located 9 miles from Kamakhya Temple and 5 miles from Accoland, C52 Homes has accommodations in Guwahati. An American breakfast is served at the property.
14 miles from Kamakhya Temple, Treebo Trend Hotel Pemaling is located in Guwahati and provides rooms with free WiFi.
Located 8 miles from Kamakhya Temple, Capital O 16719 Airport Guest House provides rooms with air conditioning in Guwahati.
OYO 10189 Hotel Aashiyana provides air-conditioned accommodations in Kāhārpāra. Among the various facilities of this property are a garden and a terrace. The restaurant serves Indian cuisine.
Set in Dekapara, Airport guest house offers accommodations with a terrace. All units include a fully equipped kitchen, allowing guests to prepare their own meals.
Located in Kāhārpāra, Lodge Airforce Gate provides a shared lounge. All rooms feature a flat-screen TV with cable channels and a private bathroom. The property has a 24-hour front desk.
Located 16 miles from Kamakhya Temple and 4.4 miles from Accoland, Larica Green Hamlet offers accommodations with a kitchen in Guwahati. The apartment is 16 miles from Umananda Temple.
Offering an outdoor swimming pool, Radisson Blu Hotel Guwahati is located 2.2 mi from the Saraighat Bridge and 3.7 mi from the popular Kamakhya Temple. Free WiFi access is available.


text:
require 'rational'
require 'date/format'

# Class representing a date.
#
# See the documentation to the file date.rb for an overview.
#
# Internally, the date is represented as an Astronomical
# Julian Day Number, +ajd+.  The Day of Calendar Reform, +sg+, is
# also stored, for conversions to other date formats.  (There
# is also an +of+ field for a time zone offset, but this
# is only for the use of the DateTime subclass.)
#
# A new Date object is created using one of the object creation
# class methods named after the corresponding date format, and the
# arguments appropriate to that date format; for instance,
# Date::civil() (aliased to Date::new()) with year, month,
# and day-of-month, or Date::ordinal() with year and day-of-year.
# All of these object creation class methods also take the
# Day of Calendar Reform as an optional argument.
#
# Date objects are immutable once created.
#
# Once a Date has been created, date values
# can be retrieved for the different date formats supported
# using instance methods.  For instance, #mon() gives the
# Civil month, #cwday() gives the Commercial day of the week,
# and #yday() gives the Ordinal day of the year.  Date values
# can be retrieved in any format, regardless of what format
# was used to create the Date instance.
#
# The Date class includes the Comparable module, allowing
# date objects to be compared and sorted, ranges of dates
# to be created, and so forth.
class Date

  include Comparable

  # Full month names, in English.  Months count from 1 to 12; a
  # month's numerical representation indexed into this array
  # gives the name of that month (hence the first element is nil).
  MONTHNAMES = [nil] + %w(January February March April May June July
                          August September October November December)

  # Full names of days of the week, in English.  Days of the week
  # count from 0 to 6 (except in the commercial week); a day's numerical
  # representation indexed into this array gives the name of that day.
  DAYNAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)

  # Abbreviated month names, in English.
  ABBR_MONTHNAMES = [nil] + %w(Jan Feb Mar Apr May Jun
                               Jul Aug Sep Oct Nov Dec)

  # Abbreviated day names, in English.
  ABBR_DAYNAMES = %w(Sun Mon Tue Wed Thu Fri Sat)

  [MONTHNAMES, DAYNAMES, ABBR_MONTHNAMES, ABBR_DAYNAMES].each do |xs|
    xs.each{|x| x.freeze}.freeze
  end

  class Infinity < Numeric # :nodoc:

    include Comparable

    def initialize(d=1) @d = d <=> 0 end

    def d() @d end

    protected :d

    def zero? () false end
    def finite? () false end
    def infinite? () d.nonzero? end
    def nan? () d.zero? end

    def abs() self.class.new end

    def -@ () self.class.new(-d) end
    def +@ () self.class.new(+d) end

    def <=> (other)
      case other
      when Infinity; return d <=> other.d
      when Numeric; return d
      else
        begin
          l, r = other.coerce(self)
          return l <=> r
        rescue NoMethodError
        end
      end
      nil
    end

    def coerce(other)
      case other
      when Numeric; return -d, d
      else
        super
      end
    end

  end

  # The Julian Day Number of the Day of Calendar Reform for Italy
  # and the Catholic countries.
  ITALY     = 2299161 # 1582-10-15

  # The Julian Day Number of the Day of Calendar Reform for England
  # and her Colonies.
  ENGLAND   = 2361222 # 1752-09-14

  # A constant used to indicate that a Date should always use the
  # Julian calendar.
  JULIAN    =  Infinity.new

  # A constant used to indicate that a Date should always use the
  # Gregorian calendar.
  GREGORIAN = -Infinity.new

  HALF_DAYS_IN_DAY       = Rational(1, 2) # :nodoc:
  HOURS_IN_DAY           = Rational(1, 24) # :nodoc:
  MINUTES_IN_DAY         = Rational(1, 1440) # :nodoc:
  SECONDS_IN_DAY         = Rational(1, 86400) # :nodoc:
  MILLISECONDS_IN_DAY    = Rational(1, 86400*10**3) # :nodoc:
  NANOSECONDS_IN_DAY     = Rational(1, 86400*10**9) # :nodoc:
  MILLISECONDS_IN_SECOND = Rational(1, 10**3) # :nodoc:
  NANOSECONDS_IN_SECOND  = Rational(1, 10**9) # :nodoc:

  MJD_EPOCH_IN_AJD       = Rational(4800001, 2) # 1858-11-17 # :nodoc:
  UNIX_EPOCH_IN_AJD      = Rational(4881175, 2) # 1970-01-01 # :nodoc:
  MJD_EPOCH_IN_CJD       = 2400001 # :nodoc:
  UNIX_EPOCH_IN_CJD      = 2440588 # :nodoc:
  LD_EPOCH_IN_CJD        = 2299160 # :nodoc:

  # Does a given Julian Day Number fall inside the old-style (Julian)
  # calendar?
  #
  # +jd+ is the Julian Day Number in question. +sg+ may be Date::GREGORIAN,
  # in which case the answer is false; it may be Date::JULIAN, in which case
  # the answer is true; or it may a number representing the Day of
  # Calendar Reform. Date::ENGLAND and Date::ITALY are two possible such
  # days.

  def self.julian? (jd, sg)
    case sg
    when Numeric
      jd < sg
    else
      if $VERBOSE
        warn("#{caller.shift.sub(/:in .*/, '')}: " \
"warning: do not use non-numerical object as julian day number anymore")
      end
      not sg
    end
  end

  # Does a given Julian Day Number fall inside the new-style (Gregorian)
  # calendar?
  #
  # The reverse of self.os?  See the documentation for that method for
  # more details.
  def self.gregorian? (jd, sg) !julian?(jd, sg) end

  def self.fix_style(jd, sg) # :nodoc:
    if julian?(jd, sg)
    then JULIAN
    else GREGORIAN end
  end

  private_class_method :fix_style

  # Convert an Ordinal Date to a Julian Day Number.
  #
  # +y+ and +d+ are the year and day-of-year to convert.
  # +sg+ specifies the Day of Calendar Reform.
  #
  # Returns the corresponding Julian Day Number.
  def self.ordinal_to_jd(y, d, sg=GREGORIAN)
    civil_to_jd(y, 1, d, sg)
  end

  # Convert a Julian Day Number to an Ordinal Date.
  #
  # +jd+ is the Julian Day Number to convert.
  # +sg+ specifies the Day of Calendar Reform.
  #
  # Returns the corresponding Ordinal Date as
  # [year, day_of_year]
  def self.jd_to_ordinal(jd, sg=GREGORIAN)
    y = jd_to_civil(jd, sg)[0]
    doy = jd - civil_to_jd(y - 1, 12, 31, fix_style(jd, sg))
    return y, doy
  end

  # Convert a Civil Date to a Julian Day Number.
  # +y+, +m+, and +d+ are the year, month, and day of the
  # month.  +sg+ specifies the Day of Calendar Reform.
  #
  # Returns the corresponding Julian Day Number.
  def self.civil_to_jd(y, m, d, sg=GREGORIAN)
    if m <= 2
      y -= 1
      m += 12
    end
    a = (y / 100.0).floor
    b = 2 - a + (a / 4.0).floor
    jd = (365.25 * (y + 4716)).floor +
      (30.6001 * (m + 1)).floor +
      d + b - 1524
    if julian?(jd, sg)
      jd -= b
    end
    jd
  end

  # Convert a Julian Day Number to a Civil Date.  +jd+ is
  # the Julian Day Number. +sg+ specifies the Day of
  # Calendar Reform.
  #
  # Returns the corresponding [year, month, day_of_month]
  # as a three-element array.
  def self.jd_to_civil(jd, sg=GREGORIAN)
    if julian?(jd, sg)
      a = jd
    else
      x = ((jd - 1867216.25) / 36524.25).floor
      a = jd + 1 + x - (x / 4.0).floor
    end
    b = a + 1524
    c = ((b - 122.1) / 365.25).floor
    d = (365.25 * c).floor
    e = ((b - d) / 30.6001).floor
    dom = b - d - (30.6001 * e).floor
    if e <= 13
      m = e - 1
      y = c - 4716
    else
      m = e - 13
      y = c - 4715
    end
    return y, m, dom
  end

  # Convert a Commercial Date to a Julian Day Number.
  #
  # +y+, +w+, and +d+ are the (commercial) year, week of the year,
  # and day of the week of the Commercial Date to convert.
  # +sg+ specifies the Day of Calendar Reform.
  def self.commercial_to_jd(y, w, d, ns=GREGORIAN)
    jd = civil_to_jd(y, 1, 4, ns)
    (jd - (((jd - 1) + 1) % 7)) +
      7 * (w - 1) +
      (d - 1)
  end

  # Convert a Julian Day Number to a Commercial Date
  #
  # +jd+ is the Julian Day Number to convert.
  # +sg+ specifies the Day of Calendar Reform.
  #
  # Returns the corresponding Commercial Date as
  # [commercial_year, week_of_year, day_of_week]
  def self.jd_to_commercial(jd, sg=GREGORIAN)
    ns = fix_style(jd, sg)
    a = jd_to_civil(jd - 3, ns)[0]
    y = if jd >= commercial_to_jd(a + 1, 1, 1, ns) then a + 1 else a end
    w = 1 + ((jd - commercial_to_jd(y, 1, 1, ns)) / 7).floor
    d = (jd + 1) % 7
    d = 7 if d == 0
    return y, w, d
  end

  def self.weeknum_to_jd(y, w, d, f=0, ns=GREGORIAN) # :nodoc:
    a = civil_to_jd(y, 1, 1, ns) + 6
    (a - ((a - f) + 1) % 7 - 7) + 7 * w + d
  end

  def self.jd_to_weeknum(jd, f=0, sg=GREGORIAN) # :nodoc:
    ns = fix_style(jd, sg)
    y, m, d = jd_to_civil(jd, ns)
    a = civil_to_jd(y, 1, 1, ns) + 6
    w, d = (jd - (a - ((a - f) + 1) % 7) + 7).divmod(7)
    return y, w, d
  end

  private_class_method :weeknum_to_jd, :jd_to_weeknum

  # Convert an Astronomical Julian Day Number to a (civil) Julian
  # Day Number.
  #
  # +ajd+ is the Astronomical Julian Day Number to convert.
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  #
  # Returns the (civil) Julian Day Number as [day_number,
  # fraction] where +fraction+ is always 1/2.
  def self.ajd_to_jd(ajd, of=0) (ajd + of + 1.to_r/2).divmod(1) end

  # Convert a (civil) Julian Day Number to an Astronomical Julian
  # Day Number.
  #
  # +jd+ is the Julian Day Number to convert, and +fr+ is a
  # fractional day.
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  #
  # Returns the Astronomical Julian Day Number as a single
  # numeric value.
  def self.jd_to_ajd(jd, fr, of=0) jd + fr - of - 1.to_r/2 end

  # Convert a fractional day +fr+ to [hours, minutes, seconds,
  # fraction_of_a_second]
  def self.day_fraction_to_time(fr)
    h,   fr = fr.divmod(1.to_r/24)
    min, fr = fr.divmod(1.to_r/1440)
    s,   fr = fr.divmod(1.to_r/86400)
    return h, min, s, fr
  end

  # Convert an +h+ hour, +min+ minutes, +s+ seconds period
  # to a fractional day.
  def self.time_to_day_fraction(h, min, s)
    h.to_r/24 + min.to_r/1440 + s.to_r/86400
  end

  # Convert an Astronomical Modified Julian Day Number to an
  # Astronomical Julian Day Number.
  def self.amjd_to_ajd(amjd) amjd + 4800001.to_r/2 end

  # Convert an Astronomical Julian Day Number to an
  # Astronomical Modified Julian Day Number.
  def self.ajd_to_amjd(ajd) ajd - 4800001.to_r/2 end

  # Convert a Modified Julian Day Number to a Julian
  # Day Number.
  def self.mjd_to_jd(mjd) mjd + 2400001 end

  # Convert a Julian Day Number to a Modified Julian Day
  # Number.
  def self.jd_to_mjd(jd) jd - 2400001 end

  # Convert a count of the number of days since the adoption
  # of the Gregorian Calendar (in Italy) to a Julian Day Number.
  def self.ld_to_jd(ld) ld + 2299160 end

  # Convert a Julian Day Number to the number of days since
  # the adoption of the Gregorian Calendar (in Italy).
  def self.jd_to_ld(jd) jd - 2299160 end

  # Convert a Julian Day Number to the day of the week.
  #
  # Sunday is day-of-week 0; Saturday is day-of-week 6.
  def self.jd_to_wday(jd) (jd + 1) % 7 end

  # Is a year a leap year in the Julian calendar?
  #
  # All years divisible by 4 are leap years in the Julian calendar.
  def self.julian_leap? (y) y % 4 == 0 end

  # Is a year a leap year in the Gregorian calendar?
  #
  # All years divisible by 4 are leap years in the Gregorian calendar,
  # except for years divisible by 100 and not by 400.
  def self.gregorian_leap? (y) y % 4 == 0 && y % 100 != 0 || y % 400 == 0 end

  class << self; alias_method :leap?, :gregorian_leap? end
  class << self; alias_method :new!, :new end

  # Is +jd+ a valid Julian Day Number?
  #
  # If it is, returns it.  In fact, any value is treated as a valid
  # Julian Day Number.
  def self.valid_jd? (jd, sg=ITALY) jd end

  # Do the year +y+ and day-of-year +d+ make a valid Ordinal Date?
  # Returns the corresponding Julian Day Number if they do, or
  # nil if they don't.
  #
  # +d+ can be a negative number, in which case it counts backwards
  # from the end of the year (-1 being the last day of the year).
  # No year wraparound is performed, however, so valid values of
  # +d+ are -365 .. -1, 1 .. 365 on a non-leap-year,
  # -366 .. -1, 1 .. 366 on a leap year.
  # A date falling in the period skipped in the Day of Calendar Reform
  # adjustment is not valid.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.valid_ordinal? (y, d, sg=ITALY)
    if d < 0
      ny, = (y + 1).divmod(1)
      jd = ordinal_to_jd(ny, d + 1, sg)
      ns = fix_style(jd, sg)
      return unless [y] == jd_to_ordinal(jd, sg)[0..0]
      return unless [ny, 1] == jd_to_ordinal(jd - d, ns)
    else
      jd = ordinal_to_jd(y, d, sg)
      return unless [y, d] == jd_to_ordinal(jd, sg)
    end
    jd
  end

  # Do year +y+, month +m+, and day-of-month +d+ make a
  # valid Civil Date?  Returns the corresponding Julian
  # Day Number if they do, nil if they don't.
  #
  # +m+ and +d+ can be negative, in which case they count
  # backwards from the end of the year and the end of the
  # month respectively.  No wraparound is performed, however,
  # and invalid values cause an ArgumentError to be raised.
  # A date falling in the period skipped in the Day of Calendar
  # Reform adjustment is not valid.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.valid_civil? (y, m, d, sg=ITALY)
    if m < 0
      m += 13
    end
    if d < 0
      ny, nm = (y * 12 + m).divmod(12)
      nm,    = (nm + 1).divmod(1)
      jd = civil_to_jd(ny, nm, d + 1, sg)
      ns = fix_style(jd, sg)
      return unless [y, m] == jd_to_civil(jd, sg)[0..1]
      return unless [ny, nm, 1] == jd_to_civil(jd - d, ns)
    else
      jd = civil_to_jd(y, m, d, sg)
      return unless [y, m, d] == jd_to_civil(jd, sg)
    end
    jd
  end

  class << self; alias_method :valid_date?, :valid_civil? end

  # Do year +y+, week-of-year +w+, and day-of-week +d+ make a
  # valid Commercial Date?  Returns the corresponding Julian
  # Day Number if they do, nil if they don't.
  #
  # Monday is day-of-week 1; Sunday is day-of-week 7.
  #
  # +w+ and +d+ can be negative, in which case they count
  # backwards from the end of the year and the end of the
  # week respectively.  No wraparound is performed, however,
  # and invalid values cause an ArgumentError to be raised.
  # A date falling in the period skipped in the Day of Calendar
  # Reform adjustment is not valid.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.valid_commercial? (y, w, d, sg=ITALY)
    if d < 0
      d += 8
    end
    if w < 0
      ny, nw, nd =
        jd_to_commercial(commercial_to_jd(y + 1, 1, 1) + w * 7)
      return unless ny == y
      w = nw
    end
    jd = commercial_to_jd(y, w, d)
    return unless gregorian?(jd, sg)
    return unless [y, w, d] == jd_to_commercial(jd)
    jd
  end

  def self.valid_weeknum? (y, w, d, f, sg=ITALY) # :nodoc:
    if d < 0
      d += 7
    end
    if w < 0
      ny, nw, nd, nf =
        jd_to_weeknum(weeknum_to_jd(y + 1, 1, f, f) + w * 7, f)
      return unless ny == y
      w = nw
    end
    jd = weeknum_to_jd(y, w, d, f)
    return unless gregorian?(jd, sg)
    return unless [y, w, d] == jd_to_weeknum(jd, f)
    jd
  end

  private_class_method :valid_weeknum?

  # Do hour +h+, minute +min+, and second +s+ constitute a valid time?
  #
  # If they do, returns their value as a fraction of a day.  If not,
  # returns nil.
  #
  # The 24-hour clock is used.  Negative values of +h+, +min+, and
  # +sec+ are treating as counting backwards from the end of the
  # next larger unit (e.g. a +min+ of -2 is treated as 58).  No
  # wraparound is performed.
  def self.valid_time? (h, min, s)
    h   += 24 if h   < 0
    min += 60 if min < 0
    s   += 60 if s   < 0
    return unless ((0..23) === h &&
                   (0..59) === min &&
                   (0..59) === s) ||
                  (24 == h &&
                    0 == min &&
                    0 == s)
    time_to_day_fraction(h, min, s)
  end

  # Create a new Date object from a Julian Day Number.
  #
  # +jd+ is the Julian Day Number; if not specified, it defaults to
  # 0.
  # +sg+ specifies the Day of Calendar Reform.
  def self.jd(jd=0, sg=ITALY)
    jd = valid_jd?(jd, sg)
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  # Create a new Date object from an Ordinal Date, specified
  # by year +y+ and day-of-year +d+. +d+ can be negative,
  # in which it counts backwards from the end of the year.
  # No year wraparound is performed, however.  An invalid
  # value for +d+ results in an ArgumentError being raised.
  #
  # +y+ defaults to -4712, and +d+ to 1; this is Julian Day
  # Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.ordinal(y=-4712, d=1, sg=ITALY)
    unless jd = valid_ordinal?(y, d, sg)
      raise ArgumentError, 'invalid date'
    end
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  # Create a new Date object for the Civil Date specified by
  # year +y+, month +m+, and day-of-month +d+.
  #
  # +m+ and +d+ can be negative, in which case they count
  # backwards from the end of the year and the end of the
  # month respectively.  No wraparound is performed, however,
  # and invalid values cause an ArgumentError to be raised.
  # can be negative
  #
  # +y+ defaults to -4712, +m+ to 1, and +d+ to 1; this is
  # Julian Day Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.civil(y=-4712, m=1, d=1, sg=ITALY)
    unless jd = valid_civil?(y, m, d, sg)
      raise ArgumentError, 'invalid date'
    end
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  class << self; alias_method :new, :civil end

  # Create a new Date object for the Commercial Date specified by
  # year +y+, week-of-year +w+, and day-of-week +d+.
  #
  # Monday is day-of-week 1; Sunday is day-of-week 7.
  #
  # +w+ and +d+ can be negative, in which case they count
  # backwards from the end of the year and the end of the
  # week respectively.  No wraparound is performed, however,
  # and invalid values cause an ArgumentError to be raised.
  #
  # +y+ defaults to 1582, +w+ to 41, and +d+ to 5, the Day of
  # Calendar Reform for Italy and the Catholic countries.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.commercial(y=1582, w=41, d=5, sg=ITALY)
    unless jd = valid_commercial?(y, w, d, sg)
      raise ArgumentError, 'invalid date'
    end
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  def self.weeknum(y=1582, w=41, d=5, f=0, sg=ITALY) # :nodoc:
    unless jd = valid_weeknum?(y, w, d, f, sg)
      raise ArgumentError, 'invalid date'
    end
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  private_class_method :weeknum

  def self.rewrite_frags(elem) # :nodoc:
    elem ||= {}
    if seconds = elem[:seconds]
      d,   fr = seconds.divmod(86400)
      h,   fr = fr.divmod(3600)
      min, fr = fr.divmod(60)
      s,   fr = fr.divmod(1)
      elem[:jd] = UNIX_EPOCH_IN_CJD + d
      elem[:hour] = h
      elem[:min] = min
      elem[:sec] = s
      elem[:sec_fraction] = fr
      elem.delete(:seconds)
      elem.delete(:offset)
    end
    elem
  end

  private_class_method :rewrite_frags

  def self.complete_frags(elem) # :nodoc:
    i = 0
    g = [[:time, [:hour, :min, :sec]],
         [nil, [:jd]],
         [:ordinal, [:year, :yday, :hour, :min, :sec]],
         [:civil, [:year, :mon, :mday, :hour, :min, :sec]],
         [:commercial, [:cwyear, :cweek, :cwday, :hour, :min, :sec]],
         [:wday, [:wday, :hour, :min, :sec]],
         [:wnum0, [:year, :wnum0, :wday, :hour, :min, :sec]],
         [:wnum1, [:year, :wnum1, :wday, :hour, :min, :sec]],
         [nil, [:cwyear, :cweek, :wday, :hour, :min, :sec]],
         [nil, [:year, :wnum0, :cwday, :hour, :min, :sec]],
         [nil, [:year, :wnum1, :cwday, :hour, :min, :sec]]].
      collect{|k, a| e = elem.values_at(*a).compact; [k, a, e]}.
      select{|k, a, e| e.size > 0}.
      sort_by{|k, a, e| [e.size, i -= 1]}.last

    d = nil

    if g && g[0] && (g[1].size - g[2].size) != 0
      d ||= Date.today

      case g[0]
      when :ordinal
        elem[:year] ||= d.year
        elem[:yday] ||= 1
      when :civil
        g[1].each do |e|
          break if elem[e]
          elem[e] = d.__send__(e)
        end
        elem[:mon]  ||= 1
        elem[:mday] ||= 1
      when :commercial
        g[1].each do |e|
          break if elem[e]
          elem[e] = d.__send__(e)
        end
        elem[:cweek] ||= 1
        elem[:cwday] ||= 1
      when :wday
        elem[:jd] ||= (d - d.wday + elem[:wday]).jd
      when :wnum0
        g[1].each do |e|
          break if elem[e]
          elem[e] = d.__send__(e)
        end
        elem[:wnum0] ||= 0
        elem[:wday]  ||= 0
      when :wnum1
        g[1].each do |e|
          break if elem[e]
          elem[e] = d.__send__(e)
        end
        elem[:wnum1] ||= 0
        elem[:wday]  ||= 0
      end
    end

    if g && g[0] == :time
      if self <= DateTime
        d ||= Date.today
        elem[:jd] ||= d.jd
      end
    end

    elem[:hour] ||= 0
    elem[:min]  ||= 0
    elem[:sec]  ||= 0
    elem[:sec] = [elem[:sec], 59].min

    elem
  end

  private_class_method :complete_frags

  def self.valid_date_frags?(elem, sg) # :nodoc:
    catch :jd do
      a = elem.values_at(:jd)
      if a.all?
        if jd = valid_jd?(*(a << sg))
          throw :jd, jd
        end
      end

      a = elem.values_at(:year, :yday)
      if a.all?
        if jd = valid_ordinal?(*(a << sg))
          throw :jd, jd
        end
      end

      a = elem.values_at(:year, :mon, :mday)
      if a.all?
        if jd = valid_civil?(*(a << sg))
          throw :jd, jd
        end
      end

      a = elem.values_at(:cwyear, :cweek, :cwday)
      if a[2].nil? && elem[:wday]
        a[2] = elem[:wday].nonzero? || 7
      end
      if a.all?
        if jd = valid_commercial?(*(a << sg))
          throw :jd, jd
        end
      end

      a = elem.values_at(:year, :wnum0, :wday)
      if a[2].nil? && elem[:cwday]
        a[2] = elem[:cwday] % 7
      end
      if a.all?
        if jd = valid_weeknum?(*(a << 0 << sg))
          throw :jd, jd
        end
      end

      a = elem.values_at(:year, :wnum1, :wday)
      if a[2]
        a[2] = (a[2] - 1) % 7
      end
      if a[2].nil? && elem[:cwday]
        a[2] = (elem[:cwday] - 1) % 7
      end
      if a.all?
        if jd = valid_weeknum?(*(a << 1 << sg))
          throw :jd, jd
        end
      end
    end
  end

  private_class_method :valid_date_frags?

  def self.valid_time_frags? (elem) # :nodoc:
    h, min, s = elem.values_at(:hour, :min, :sec)
    valid_time?(h, min, s)
  end

  private_class_method :valid_time_frags?

  def self.new_by_frags(elem, sg) # :nodoc:
    elem = rewrite_frags(elem)
    elem = complete_frags(elem)
    unless jd = valid_date_frags?(elem, sg)
      raise ArgumentError, 'invalid date'
    end
    new!(jd_to_ajd(jd, 0, 0), 0, sg)
  end

  private_class_method :new_by_frags

  # Create a new Date object by parsing from a String
  # according to a specified format.
  #
  # +str+ is a String holding a date representation.
  # +fmt+ is the format that the date is in.  See
  # date/format.rb for details on supported formats.
  #
  # The default +str+ is '-4712-01-01', and the default
  # +fmt+ is '%F', which means Year-Month-Day_of_Month.
  # This gives Julian Day Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  #
  # An ArgumentError will be raised if +str+ cannot be
  # parsed.
  def self.strptime(str='-4712-01-01', fmt='%F', sg=ITALY)
    elem = _strptime(str, fmt)
    new_by_frags(elem, sg)
  end

  # Create a new Date object by parsing from a String,
  # without specifying the format.
  #
  # +str+ is a String holding a date representation.
  # +comp+ specifies whether to interpret 2-digit years
  # as 19XX (>= 69) or 20XX (< 69); the default is not to.
  # The method will attempt to parse a date from the String
  # using various heuristics; see #_parse in date/format.rb
  # for more details.  If parsing fails, an ArgumentError
  # will be raised.
  #
  # The default +str+ is '-4712-01-01'; this is Julian
  # Day Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.parse(str='-4712-01-01', comp=false, sg=ITALY)
    elem = _parse(str, comp)
    new_by_frags(elem, sg)
  end

  class << self

    def once(*ids) # :nodoc:
      for id in ids
        module_eval <<-"end;"
          alias_method :__#{id.object_id}__, :#{id.to_s}
          private :__#{id.object_id}__
          def #{id.to_s}(*args, &block)
            (@__#{id.object_id}__ ||= [__#{id.object_id}__(*args, &block)])[0]
          end
        end;
      end
    end

    private :once

  end

  # *NOTE* this is the documentation for the method new!().  If
  # you are reading this as the documentation for new(), that is
  # because rdoc doesn't fully support the aliasing of the
  # initialize() method.
  # new() is in
  # fact an alias for #civil(): read the documentation for that
  # method instead.
  #
  # Create a new Date object.
  #
  # +ajd+ is the Astronomical Julian Day Number.
  # +of+ is the offset from UTC as a fraction of a day.
  # Both default to 0.
  #
  # +sg+ specifies the Day of Calendar Reform to use for this
  # Date object.
  #
  # Using one of the factory methods such as Date::civil is
  # generally easier and safer.
  def initialize(ajd=0, of=0, sg=ITALY) @ajd, @of, @sg = ajd, of, sg end

  # Get the date as an Astronomical Julian Day Number.
  def ajd() @ajd end

  # Get the date as an Astronomical Modified Julian Day Number.
  def amjd() self.class.ajd_to_amjd(@ajd) end

  once :amjd

  # Get the date as a Julian Day Number.
  def jd() self.class.ajd_to_jd(@ajd, @of)[0] end

  # Get any fractional day part of the date.
  def day_fraction() self.class.ajd_to_jd(@ajd, @of)[1] end

  # Get the date as a Modified Julian Day Number.
  def mjd() self.class.jd_to_mjd(jd) end

  # Get the date as the number of days since the Day of Calendar
  # Reform (in Italy and the Catholic countries).
  def ld() self.class.jd_to_ld(jd) end

  once :jd, :day_fraction, :mjd, :ld

  # Get the date as a Civil Date, [year, month, day_of_month]
  def civil() self.class.jd_to_civil(jd, @sg) end # :nodoc:

  # Get the date as an Ordinal Date, [year, day_of_year]
  def ordinal() self.class.jd_to_ordinal(jd, @sg) end # :nodoc:

  # Get the date as a Commercial Date, [year, week_of_year, day_of_week]
  def commercial() self.class.jd_to_commercial(jd, @sg) end # :nodoc:

  def weeknum0() self.class.__send__(:jd_to_weeknum, jd, 0, @sg) end # :nodoc:
  def weeknum1() self.class.__send__(:jd_to_weeknum, jd, 1, @sg) end # :nodoc:

  once :civil, :ordinal, :commercial, :weeknum0, :weeknum1
  private :civil, :ordinal, :commercial, :weeknum0, :weeknum1

  # Get the year of this date.
  def year() civil[0] end

  # Get the day-of-the-year of this date.
  #
  # January 1 is day-of-the-year 1
  def yday() ordinal[1] end

  # Get the month of this date.
  #
  # January is month 1.
  def mon() civil[1] end

  # Get the day-of-the-month of this date.
  def mday() civil[2] end

  alias_method :month, :mon
  alias_method :day, :mday

  def wnum0() weeknum0[1] end # :nodoc:
  def wnum1() weeknum1[1] end # :nodoc:

  private :wnum0, :wnum1

  # Get the time of this date as [hours, minutes, seconds,
  # fraction_of_a_second]
  def time() self.class.day_fraction_to_time(day_fraction) end # :nodoc:

  once :time
  private :time

  # Get the hour of this date.
  def hour() time[0] end

  # Get the minute of this date.
  def min() time[1] end

  # Get the second of this date.
  def sec() time[2] end

  # Get the fraction-of-a-second of this date.  The unit is in days.
  # I do NOT recommend you to use this method.
  def sec_fraction() time[3] end

  private :hour, :min, :sec, :sec_fraction

  def zone() strftime('%:z') end

  private :zone

  # Get the commercial year of this date.  See *Commercial* *Date*
  # in the introduction for how this differs from the normal year.
  def cwyear() commercial[0] end

  # Get the commercial week of the year of this date.
  def cweek() commercial[1] end

  # Get the commercial day of the week of this date.  Monday is
  # commercial day-of-week 1; Sunday is commercial day-of-week 7.
  def cwday() commercial[2] end

  # Get the week day of this date.  Sunday is day-of-week 0;
  # Saturday is day-of-week 6.
  def wday() self.class.jd_to_wday(jd) end

  once :wday

=begin
  MONTHNAMES.each_with_index do |n, i|
    if n
      define_method(n.downcase + '?'){mon == i}
    end
  end

  DAYNAMES.each_with_index do |n, i|
    define_method(n.downcase + '?'){wday == i}
  end
=end

  # Is the current date old-style (Julian Calendar)?
  def julian? () self.class.julian?(jd, @sg) end

  # Is the current date new-style (Gregorian Calendar)?
  def gregorian? () self.class.gregorian?(jd, @sg) end

  once :julian?, :gregorian?

  def fix_style # :nodoc:
    if julian?
    then self.class::JULIAN
    else self.class::GREGORIAN end
  end

  private :fix_style

  # Is this a leap year?
  def leap?
    self.class.jd_to_civil(self.class.civil_to_jd(year, 3, 1, fix_style) - 1,
                     fix_style)[-1] == 29
  end

  once :leap?

  # When is the Day of Calendar Reform for this Date object?
  def start() @sg end

  # Create a copy of this Date object using a new Day of Calendar Reform.
  def new_start(sg=self.class::ITALY) self.class.new!(@ajd, @of, sg) end

  # Create a copy of this Date object that uses the Italian/Catholic
  # Day of Calendar Reform.
  def italy() new_start(self.class::ITALY) end

  # Create a copy of this Date object that uses the English/Colonial
  # Day of Calendar Reform.
  def england() new_start(self.class::ENGLAND) end

  # Create a copy of this Date object that always uses the Julian
  # Calendar.
  def julian() new_start(self.class::JULIAN) end

  # Create a copy of this Date object that always uses the Gregorian
  # Calendar.
  def gregorian() new_start(self.class::GREGORIAN) end

  def offset() @of end

  def new_offset(of=0)
    if String === of
      of = (self.class.zone_to_diff(of) || 0).to_r/86400
    end
    self.class.new!(@ajd, of, @sg)
  end

  private :offset, :new_offset

  # Return a new Date object that is +n+ days later than the
  # current one.
  #
  # +n+ may be a negative value, in which case the new Date
  # is earlier than the current one; however, #-() might be
  # more intuitive.
  #
  # If +n+ is not a Numeric, a TypeError will be thrown.  In
  # particular, two Dates cannot be added to each other.
  def + (n)
    case n
    when Numeric; return self.class.new!(@ajd + n, @of, @sg)
    end
    raise TypeError, 'expected numeric'
  end

  # If +x+ is a Numeric value, create a new Date object that is
  # +x+ days earlier than the current one.
  #
  # If +x+ is a Date, return the number of days between the
  # two dates; or, more precisely, how many days later the current
  # date is than +x+.
  #
  # If +x+ is neither Numeric nor a Date, a TypeError is raised.
  def - (x)
    case x
    when Numeric; return self.class.new!(@ajd - x, @of, @sg)
    when Date;    return @ajd - x.ajd
    end
    raise TypeError, 'expected numeric or date'
  end

  # Compare this date with another date.
  #
  # +other+ can also be a Numeric value, in which case it is
  # interpreted as an Astronomical Julian Day Number.
  #
  # Comparison is by Astronomical Julian Day Number, including
  # fractional days.  This means that both the time and the
  # timezone offset are taken into account when comparing
  # two DateTime instances.  When comparing a DateTime instance
  # with a Date instance, the time of the latter will be
  # considered as falling on midnight UTC.
  def <=> (other)
    case other
    when Numeric; return @ajd <=> other
    when Date;    return @ajd <=> other.ajd
    end
    nil
  end

  # The relationship operator for Date.
  #
  # Compares dates by Julian Day Number.  When comparing
  # two DateTime instances, or a DateTime with a Date,
  # the instances will be regarded as equivalent if they
  # fall on the same date in local time.
  def === (other)
    case other
    when Numeric; return jd == other
    when Date;    return jd == other.jd
    end
    false
  end

  def next_day(n=1) self + n end
# def prev_day(n=1) self - n end

  private :next_day

  # Return a new Date one day after this one.
  def next() next_day end

  alias_method :succ, :next

  # Return a new Date object that is +n+ months later than
  # the current one.
  #
  # If the day-of-the-month of the current Date is greater
  # than the last day of the target month, the day-of-the-month
  # of the returned Date will be the last day of the target month.
  def >> (n)
    y, m = (year * 12 + (mon - 1) + n).divmod(12)
    m,   = (m + 1)                    .divmod(1)
    d = mday
    d -= 1 until jd2 = self.class.valid_civil?(y, m, d, fix_style)
    self + (jd2 - jd)
  end

  # Return a new Date object that is +n+ months earlier than
  # the current one.
  #
  # If the day-of-the-month of the current Date is greater
  # than the last day of the target month, the day-of-the-month
  # of the returned Date will be the last day of the target month.
  def << (n) self >> -n end

=begin
  def next_month(n=1) self >> n end
  def prev_month(n=1) self << n end

  def next_year(n=1) self >> n * 12 end
  def prev_year(n=1) self << n * 12 end
=end

#  require 'enumerator'

  # Step the current date forward +step+ days at a
  # time (or backward, if +step+ is negative) until
  # we reach +limit+ (inclusive), yielding the resultant
  # date at each step.
  def step(limit, step=1) # :yield: date
=begin
    unless block_given?
      return to_enum(:step, limit, step)
    end
=end
    da = self
    op = %w(- <= >=)[step <=> 0]
    while da.__send__(op, limit)
      yield da
      da += step
    end
    self
  end

  # Step forward one day at a time until we reach +max+
  # (inclusive), yielding each date as we go.
  def upto(max, &block) # :yield: date
    step(max, +1, &block)
  end

  # Step backward one day at a time until we reach +min+
  # (inclusive), yielding each date as we go.
  def downto(min, &block) # :yield: date
    step(min, -1, &block)
  end

  # Is this Date equal to +other+?
  #
  # +other+ must both be a Date object, and represent the same date.
  def eql? (other) Date === other && self == other end

  # Calculate a hash value for this date.
  def hash() @ajd.hash end

  # Return internal object state as a programmer-readable string.
  def inspect() format('#<%s: %s,%s,%s>', self.class, @ajd, @of, @sg) end

  # Return the date as a human-readable string.
  #
  # The format used is YYYY-MM-DD.
  def to_s() strftime end

  # Dump to Marshal format.
  def _dump(limit) Marshal.dump([@ajd, @of, @sg], -1) end

# def self._load(str) new!(*Marshal.load(str)) end

  # Load from Marshall format.
  def self._load(str)
    a = Marshal.load(str)
    if a.size == 2
      ajd,     sg = a
           of = 0
      ajd -= 1.to_r/2
    else
      ajd, of, sg = a
    end
    new!(ajd, of, sg)
  end

end

# Class representing a date and time.
#
# See the documentation to the file date.rb for an overview.
#
# DateTime objects are immutable once created.
#
# == Other methods.
#
# The following methods are defined in Date, but declared private
# there.  They are made public in DateTime.  They are documented
# here.
#
# === hour()
#
# Get the hour-of-the-day of the time.  This is given
# using the 24-hour clock, counting from midnight.  The first
# hour after midnight is hour 0; the last hour of the day is
# hour 23.
#
# === min()
#
# Get the minute-of-the-hour of the time.
#
# === sec()
#
# Get the second-of-the-minute of the time.
#
# === sec_fraction()
#
# Get the fraction of a second of the time.  This is returned as
# a +Rational+.  The unit is in days.
# I do NOT recommend you to use this method.
#
# === zone()
#
# Get the time zone as a String.  This is representation of the
# time offset such as "+1000", not the true time-zone name.
#
# === offset()
#
# Get the time zone offset as a fraction of a day.  This is returned
# as a +Rational+.
#
# === new_offset(of=0)
#
# Create a new DateTime object, identical to the current one, except
# with a new time zone offset of +of+.  +of+ is the new offset from
# UTC as a fraction of a day.
#
class DateTime < Date

  # Create a new DateTime object corresponding to the specified
  # Julian Day Number +jd+ and hour +h+, minute +min+, second +s+.
  #
  # The 24-hour clock is used.  Negative values of +h+, +min+, and
  # +sec+ are treating as counting backwards from the end of the
  # next larger unit (e.g. a +min+ of -2 is treated as 58).  No
  # wraparound is performed.  If an invalid time portion is specified,
  # an ArgumentError is raised.
  #
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  # +sg+ specifies the Day of Calendar Reform.
  #
  # All day/time values default to 0.
  def self.jd(jd=0, h=0, min=0, s=0, of=0, sg=ITALY)
    unless (jd = valid_jd?(jd, sg)) &&
           (fr = valid_time?(h, min, s))
      raise ArgumentError, 'invalid date'
    end
    if String === of
      of = (zone_to_diff(of) || 0).to_r/86400
    end
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  # Create a new DateTime object corresponding to the specified
  # Ordinal Date and hour +h+, minute +min+, second +s+.
  #
  # The 24-hour clock is used.  Negative values of +h+, +min+, and
  # +sec+ are treating as counting backwards from the end of the
  # next larger unit (e.g. a +min+ of -2 is treated as 58).  No
  # wraparound is performed.  If an invalid time portion is specified,
  # an ArgumentError is raised.
  #
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  # +sg+ specifies the Day of Calendar Reform.
  #
  # +y+ defaults to -4712, and +d+ to 1; this is Julian Day Number
  # day 0.  The time values default to 0.
  def self.ordinal(y=-4712, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
    unless (jd = valid_ordinal?(y, d, sg)) &&
           (fr = valid_time?(h, min, s))
      raise ArgumentError, 'invalid date'
    end
    if String === of
      of = (zone_to_diff(of) || 0).to_r/86400
    end
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  # Create a new DateTime object corresponding to the specified
  # Civil Date and hour +h+, minute +min+, second +s+.
  #
  # The 24-hour clock is used.  Negative values of +h+, +min+, and
  # +sec+ are treating as counting backwards from the end of the
  # next larger unit (e.g. a +min+ of -2 is treated as 58).  No
  # wraparound is performed.  If an invalid time portion is specified,
  # an ArgumentError is raised.
  #
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  # +sg+ specifies the Day of Calendar Reform.
  #
  # +y+ defaults to -4712, +m+ to 1, and +d+ to 1; this is Julian Day
  # Number day 0.  The time values default to 0.
  def self.civil(y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
    unless (jd = valid_civil?(y, m, d, sg)) &&
           (fr = valid_time?(h, min, s))
      raise ArgumentError, 'invalid date'
    end
    if String === of
      of = (zone_to_diff(of) || 0).to_r/86400
    end
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  class << self; alias_method :new, :civil end

  # Create a new DateTime object corresponding to the specified
  # Commercial Date and hour +h+, minute +min+, second +s+.
  #
  # The 24-hour clock is used.  Negative values of +h+, +min+, and
  # +sec+ are treating as counting backwards from the end of the
  # next larger unit (e.g. a +min+ of -2 is treated as 58).  No
  # wraparound is performed.  If an invalid time portion is specified,
  # an ArgumentError is raised.
  #
  # +of+ is the offset from UTC as a fraction of a day (defaults to 0).
  # +sg+ specifies the Day of Calendar Reform.
  #
  # +y+ defaults to 1582, +w+ to 41, and +d+ to 5; this is the Day of
  # Calendar Reform for Italy and the Catholic countries.
  # The time values default to 0.
  def self.commercial(y=1582, w=41, d=5, h=0, min=0, s=0, of=0, sg=ITALY)
    unless (jd = valid_commercial?(y, w, d, sg)) &&
           (fr = valid_time?(h, min, s))
      raise ArgumentError, 'invalid date'
    end
    if String === of
      of = (zone_to_diff(of) || 0).to_r/86400
    end
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  def self.weeknum(y=1582, w=41, d=5, f=0, h=0, min=0, s=0, of=0, sg=ITALY) # :nodoc:
    unless (jd = valid_weeknum?(y, w, d, f, sg)) &&
           (fr = valid_time?(h, min, s))
      raise ArgumentError, 'invalid date'
    end
    if String === of
      of = (zone_to_diff(of) || 0).to_r/86400
    end
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  private_class_method :weeknum

  def self.new_by_frags(elem, sg) # :nodoc:
    elem = rewrite_frags(elem)
    elem = complete_frags(elem)
    unless (jd = valid_date_frags?(elem, sg)) &&
           (fr = valid_time_frags?(elem))
      raise ArgumentError, 'invalid date'
    end
    sf = (elem[:sec_fraction] || 0)
    fr += sf/86400
    of = (elem[:offset] || 0)
    of = of.to_r/86400
    new!(jd_to_ajd(jd, fr, of), of, sg)
  end

  private_class_method :new_by_frags

  # Create a new DateTime object by parsing from a String
  # according to a specified format.
  #
  # +str+ is a String holding a date-time representation.
  # +fmt+ is the format that the date-time is in.  See
  # date/format.rb for details on supported formats.
  #
  # The default +str+ is '-4712-01-01T00:00:00+00:00', and the default
  # +fmt+ is '%FT%T%z'.  This gives midnight on Julian Day Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  #
  # An ArgumentError will be raised if +str+ cannot be
  # parsed.
  def self.strptime(str='-4712-01-01T00:00:00+00:00', fmt='%FT%T%z', sg=ITALY)
    elem = _strptime(str, fmt)
    new_by_frags(elem, sg)
  end

  # Create a new DateTime object by parsing from a String,
  # without specifying the format.
  #
  # +str+ is a String holding a date-time representation.
  # +comp+ specifies whether to interpret 2-digit years
  # as 19XX (>= 69) or 20XX (< 69); the default is not to.
  # The method will attempt to parse a date-time from the String
  # using various heuristics; see #_parse in date/format.rb
  # for more details.  If parsing fails, an ArgumentError
  # will be raised.
  #
  # The default +str+ is '-4712-01-01T00:00:00+00:00'; this is Julian
  # Day Number day 0.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.parse(str='-4712-01-01T00:00:00+00:00', comp=false, sg=ITALY)
    elem = _parse(str, comp)
    new_by_frags(elem, sg)
  end

  public :hour, :min, :sec, :sec_fraction, :zone, :offset, :new_offset

end

class Time

#  def to_time() getlocal end

  def to_date
    jd = Date.civil_to_jd(year, mon, mday, Date::ITALY)
    Date.new!(Date.jd_to_ajd(jd, 0, 0), 0, Date::ITALY)
  end

  def to_datetime
    jd = DateTime.civil_to_jd(year, mon, mday, DateTime::ITALY)
    fr = DateTime.time_to_day_fraction(hour, min, [sec, 59].min) +
         usec.to_r/86400000000
    of = utc_offset.to_r/86400
    DateTime.new!(DateTime.jd_to_ajd(jd, fr, of), of, DateTime::ITALY)
  end

  private :to_date, :to_datetime

end

class Date

=begin
  def to_time() Time.local(year, mon, mday) end
  def to_date() self end
  def to_datetime() DateTime.new!(self.class.jd_to_ajd(jd, 0, 0), @of, @sg) end
=end

  # Create a new Date object representing today.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.today(sg=ITALY) Time.now.__send__(:to_date)    .new_start(sg) end

  # Create a new DateTime object representing the current time.
  #
  # +sg+ specifies the Day of Calendar Reform.
  def self.now  (sg=ITALY) Time.now.__send__(:to_datetime).new_start(sg) end

  private_class_method :now

end

class DateTime < Date

=begin
  def to_time
    d = new_offset(0)
    d.instance_eval do
      Time.utc(year, mon, mday, hour, min, sec,
               (sec_fraction * 86400000000).to_i)
    end.
        getlocal
  end

  def to_date() Date.new!(self.class.jd_to_ajd(jd, 0, 0), 0, @sg) end
  def to_datetime() self end
=end

  private_class_method :today
  public_class_method  :now

end

class Date

  [ %w(os?      julian?),
    %w(ns?      gregorian?),
    %w(exist1?  valid_jd?),
    %w(exist2?  valid_ordinal?),
    %w(exist3?  valid_date?),
    %w(exist?   valid_date?),
    %w(existw?  valid_commercial?),
    %w(new0     new!),
    %w(new1     jd),
    %w(new2     ordinal),
    %w(new3     new),
    %w(neww     commercial)
  ].each do |old, new|
    module_eval <<-"end;"
      def self.#{old}(*args, &block)
        if $VERBOSE
          warn("\#{caller.shift.sub(/:in .*/, '')}: " \
               "warning: \#{self}::#{old} is deprecated; " \
               "use \#{self}::#{new}")
        end
        #{new}(*args, &block)
      end
    end;
  end

  [ %w(os?      julian?),
    %w(ns?      gregorian?),
    %w(sg       start),
    %w(newsg    new_start),
    %w(of       offset),
    %w(newof    new_offset)
  ].each do |old, new|
    module_eval <<-"end;"
      def #{old}(*args, &block)
        if $VERBOSE
          warn("\#{caller.shift.sub(/:in .*/, '')}: " \
               "warning: \#{self.class}\##{old} is deprecated; " \
               "use \#{self.class}\##{new}")
        end
        #{new}(*args, &block)
      end
    end;
  end

  private :of, :newof

end

class DateTime < Date

  public :of, :newof

end

redpajama_set_name: RedPajamaGithub


I did an interview with Bonnie Petrie on KRLD Radio last week. It was an interesting conversation. She wanted to talk about the shift away from flipping homes to buying homes to use as income producing investments. We've been talking about this shift for the past several years yet the emphasis has remained on flipping houses.
Why the shift? The primary reason is the lack of "easy" money that once fueled the flipping engine. Investors were able to purchase properties, rehab them, and then get them back on the market. Buyers were able to take advantage of the "easy" money, securing a mortgage and becoming homeowners.
The lending market softened with mortgage meltdown. Underwriting guidelines tightened on both borrowers and the properties. This left fewer buyers able to purchase and lenders began asking lots of questions about why a property that sold for $100k two months ago is now worth $150k.
The conditions that have made flipping properties much harder are what make investing in income-producing properties the thing to do now.
Investors can purchase properties at a discount, rehab them, and then lease them to produce a steady stream of income. I find investors with cash have a much easier time of it but money is available. Investors need to be prepared to put 20 to 30 percent down and carry the costs of rehabbing the property.
Investors need to carefully select properties. Not only is initial price important, but the cost of rehabbing the property has a huge impact on the long-term capitalization rate. This is where working with a seasoned real estate professional and having a solid pool of trusted contractors is critical.
Property management has lots of pitfalls, so investors need to outsource the management of their properties or become very familiar with state and local laws.
Looking to invest in real estate in the Dallas area? Contact us!


A winter view of the clematis. Just as beautiful as in the summer.
I am in the field and totally off the grid for most of July, so my responses to comments will be interrupted.
Canon EOS 5D Mkii, Canon 50mm/f1.4 lens, ISO 200, f5, 1/160th.


In bringing home a new dog, your task is to carefully introduce your new canine companion to other pets in the household to prevent conflict among the animals. Making the right introductions can take some time, and some pets don't adjust to their new siblings for weeks or even months. Take it slow, be diplomatic, and supervise all interactions until everyone can be trusted.
If you already have a dog who's used to being the only dog in the house, he probably will see another dog as a trespasser and want to make darn sure that the new dog knows his place. A new dog on new turf may defer to the previous resident dog, but some dogs just tend to have stronger personalities and try to be the leader. If you put two such dogs together, you can have squabbles.
Dogs learn crucial dog-to-dog communication skills when they're between 3 to 6 weeks of age. Puppies deprived of this time together may not understand how to communicate well with other dogs.
Adopt a female dog if you already have a male dog, or vice versa. Male and female dogs together are less likely to fight each other than dogs of the same gender. Spayed or neutered dogs also are less likely to enter the fray.
Introduce the dogs first on neutral territory — the shelter the new dog comes from, a quiet corner of a park, or the home of a friend.
Keep both dogs on their leashes with each handled by a separate adult. You must be a strong presence and maintain control. When both dogs think you're in control of the situation, they may feel less anxious, fearful, or defensive.
Remember that the first dog may see your home as his territory and feel threatened that another dog is on his turf. Be patient and supervise all interactions until the dogs accept each other.
Be patient. Dogs may take a few hours to become fast friends, but some dogs may never get along very well. The relationship probably will improve with time, but it can take weeks or even months.
Let both dogs spend some extended getting acquainted time on either side of a baby gate, screen door, or other barrier that neither is able to jump over. Doing so can help dogs gain interest in each other without the threat of one dog invading the other's space.
Give each dog his own space, his own den, and room to run away to in case of a confrontation. A brand-new kennel or crate won't automatically be the resident dog's property, so it gives the new dog a place to feel safe. Keep the door open so the new dog can go in whenever he needs a safe spot, but keep the resident dog out of the new dog's den.
Give both dogs plenty of attention and separate training time, especially your resident dog, who may be feeling neglected. Make sure he knows you aren't replacing him!
Take it slow. Not everybody wants a new sibling. Let both dogs take time getting to know each other, and supervise all interactions until they work out their new relationship.
A baby gate can help your new dog and your resident dog get acquainted.
If your two dogs get into a fight, don't stick your hand in the middle or grab a collar — you may get hurt! Distract the dogs by spritzing them with water from a spray bottle or make a loud noise, like shaking a can of pennies or pebbles. As soon as they stop fighting for a moment, separate them immediately and put each in his respective den or separate room to cool off.
If you can't seem to resolve the issue, call a local dog trainer who uses positive reinforcement. A trainer can work with you and your dogs, giving you some strategies tailored for your individual situation.