text:
Name, hometown, corps, role: My name is Bob Beasley, I am from Danville, Va., and I am the drum major of Carolina Crown. Where do you go to school, and what extracurricular activities are you involved with there? I am in my first year at the College of William and Mary in Williamsburg,
Va. I am also a brother of Lambda Chi Alpha.
Va. I am also a brother of Lambda Chi Alpha.
Give us your full drum corps/marching music background, and how each position prepared you for the leadership role you're in this summer.^ My drum corps/marching music career begin my freshmen year in high school at George Washington High School where I marched for four years. The first two years I marched trumpet and the last two I was the drum major. I then became a member of Carolina Crown in 2003 and I marched baritone. This is my second year with Carolina Crown. The last good book I read: I really can't remember the last good book I read. I read a lot for school, but I wouldn't say any of them are good. The last great film I saw: I love movies. The last great movie I saw in the theater was "The Passion of the Christ." Since then I have watched "Gladiator" and "Old School," and I can't say pick which one is better. Three CDs I'd want on a deserted island: Any CD from the Dave Matthews Band My favorite TV show: "The Family Guy" Favorite performers: The Dave Matthews Band How do you "blow off steam?" When I need to relax I just have to go off by myself and think a little bit. Why I march with the corps I am in: I decided to march Carolina Crown last year because it was one of the closest corps near me and I had watched the corps for a couple of years and thought it had a lot of potential for success. After marching a summer, I found out that Crown is not a corps, it's actually family. I couldn't imagine myself marching anywhere else. Was it always your goal to be in a leadership role? No How will you go about balancing the roles of leader and corpsmate? I think they are one in the same. I am a member of the corps, just a member with more responsibility than others. I think one of the best ways to be a leader is to lead by example. What has been your formative drum corps moment? Making finals last year, because of where we started the season and then achieving our goal. Best drum corps show ever: Star of Indiana, 1993 What are you most looking forward to about the summer? Performing Best thing about being a drum corps leader: The pride you have when your corps has accomplished a goal, and you know that you were involved in achieving that goal. Worst thing about being a drum corps leader: When I make a mistake, it is not just one mistake, it is multiplied by 134. It is hard knowing that I can't make a mistake, but it is apart of the responsibility you accept when taking on a leadership role During tour, the best part of the day is: I would say performing and dinner. I love to go and perform at shows, but the volunteers at Crown do a great job at preparing great food, so I can't pick one. During tour, the worst part of the day is: Getting out of the sleeping bag in the morning. Favorite drum corps personality and why: This is a hard question. We have a great staff at Crown, and not just because of their knowledge for the activity, but also they are all-around great people. I would have to say Matt Harloff or Andre Feagin. They are both exciting teachers. Whenever they are around they show a passion for the activity and to help us get better, but they also know how to have fun and laugh. I have a learned a lot from them both, this year especially. They are two great guys and that is why I have to say both of them. What do you want to be when your drum corps career is over? When I am done with drum corps and graduate from college, I want to go on to law school.
Bob Beasley


text:
Find Out The Ways On How You Can Be Successful In Passing Through The Screening Process Of A Job
If there is one thing that you need to know when it comes to searching for a job, that would be the fact that it can take months of interviewing process to finally land a position in a certain company that matches the skills set they have, their financial needs, their schedule and the industry as well. Although this could mean for you to start jumping for joy, you have to realize that a conditional job is exactly what it is or what it sounds like, no more, no less. There are quite a number of vital things that you need to do for you to become officially part of the company you got in touch with and these may include you to pass a drug test, to have all the reference you have specified to be contacted and also, to go through a background check as well. And for you to be able secure yourself a job from you prospective future employer, you have to see to it that you continue to look or even fully reflect a professional image while you are working with the third party companies that were hired for the purpose of executing the process of employment screening. What we are trying to convey here to you is that you have to bear in mind not to ask questions that could possible raise red flags and instead, you have to prepare for every single step in your journey in order for you to get a start date from the human resources.
The very first thing that you need to do in order for you to successfully make it through the employment screening process is to take into consideration the references you have as well as the things that they will be saying about you. You have to be ready with your list of reference and in doing so, make sure that the names you have written on it are those who have confidence and full trust regarding your skills and also, that they will only have good things to say about you as this will certainly boost your chance of landing that job. When choosing for reference, you have to see to it that you are choosing those who are most familiar with you, preferably those whom you have had work with in the earlier days of your college life or career and saw how much you have grown professionally ever since those times.

subset: commoncrawl


text:
- Home
- News
10.3 have a chance to experience café culture!
11th Apr 2017
In French, at the moment, 10.3 are learning about French food and drink so we decided to make our own citron pressé in class. It was a great success and everyone enjoyed the chance to relax and to imagine what it would be like if we were magically transported to France!
Kilkeel High School, Knockchree Avenue, Kilkeel, Co. Down BT34 4BP N. Ireland | Telephone: 02841762365 | Fax: 02841765038
Website by School Web Design | Login


text:
Puzzled by this paper's conclusion, because wouldn't a giant impact on a massive planet NOT create a new, lighter inner planet, but instead a new, lighter moon for the impacted planet? Like the Earth and Moon? The "post-impact" planets are in nearly circular orbits, too, which strikes me as weird given their creation.
A giant impact as the likely origin of different twins in the Kepler-107 exoplanet system
Aldo S. Bonomo, et al. (Submitted on 4 Feb 2019)
Measures of exoplanet bulk densities indicate that small exoplanets with radius less than 3 Earth radii (R ⊕ ) range from low-density sub-Neptunes containing volatile elements to higher density rocky planets with Earth-like or iron-rich (Mercury-like) compositions. Such astonishing diversity in observed small exoplanet compositions may be the product of different initial conditions of the planet-formation process and/or different evolutionary paths that altered the planetary properties after formation. Planet evolution may be especially affected by either photoevaporative mass loss induced by high stellar X-ray and extreme ultraviolet (XUV) flux or giant impacts. Although there is some evidence for the former, there are no unambiguous findings so far about the occurrence of giant impacts in an exoplanet system. Here, we characterize the two innermost planets of the compact and near-resonant system Kepler-107. We show that they have nearly identical radii (about 1.5−1.6 R ⊕ ), but the outer planet Kepler-107c is more than twice as dense (about 12.6 gcm −3) as the innermost Kepler-107b (about 5.3 gcm −3). In consequence, Kepler-107c must have a larger iron core fraction than Kepler-107b. This imbalance cannot be explained by the stellar XUV irradiation, which would conversely make the more-irradiated and less-massive planet Kepler-107b denser than Kepler-107c. Instead, the dissimilar densities are consistent with a giant impact event on Kepler-107c that would have stripped off part of its silicate mantle. This hypothesis is supported by theoretical predictions from collisional mantle stripping, which match the mass and radius of Kepler-107c.


text:
Stainless steel double sided
pusher. Flat spade side is to
push back cuticles and arrow
pointed end is for cleaning
under and around nails.
To request a price quote on this item click the "Add To Basket" button
Stadler Professional New Adalat Garh, Ugoki Road, P.O. Box 458 Sialkot-51310, Pakistan
(92) 52 3255231 / 52 3556225
(92) 52 3551606
© 2015 Stadler Beauty. All rights reserved. Designed & Devoleped By: Web eXperts


text:
I want to buy an auto program for this game which can help me to finish all the daily missions of the game without time wasting.
Pleasse contact me for more information.
Thank you!
RequirementsThis program can be either desktop based or mobile app (I will pay extra if both).
It should be easy to install for basic pc users.
Level Required: 3+
Skills RequiredCoding Gaming
No bids made yet - be the first!
No Comments Made Yet - Be the First!


text:
St. Peter's Church – North Ridgeville, OH
St. Peter's Church – North Ridgeville, OH
St. Peter's Church needed a bank of traditional swings. Snider Recreation provided and installed a three bay set with 6 swing seats. Swinging is a childhood staple and a great way to add a little fun to any school playground!
Snider Recreation loves the opportunity to help churches and schools add playground equipment into their current play space. New swings, slides, climbers and spinners are a great way to add fun. Our variety of play equipment includes the traditional basics that children don't outgrow!
If you are looking to add outdoor play equipment to your communities' park, school, or church, it is as easy as giving Snider Recreation a phone call at 1-800-888-2889.


text:
I have rare feeling that I am always second time lucky. And this time it seems like even Ubuntu Jaunty Jackalope wants to prove that :)
I started with the torrent, the download did not start because of the error in the torrent, I had to download the torrent again and start for the second time. I burnt the iso into the CD and did boot into Jaunty Jackalope(JJ or Jaunty henceforth) to only see that my Desktop was blank except the top and bottom GNOME bars.
So I thought there was some mistake and did a reboot, to realize that JJ has the funniest bug ever. Live CD has shipped with nautilus that does a segmentation fault. The consequence of this being not able to see any icons of Desktop, being restricted to use only terminal for all navigation purposes, no desktop background(totally blank like a black hole). LoL! It was fun.
Oh I also forgot to say that, the splash screen has been changed, the progress bar's thickness has been reduced. But TBH, I personally did not like the splash screen.
I started out the install menu from System->Admin->Install this time, since I had no access to Install icon on Desktop. Somehow the installer started and closed, I don't know the reason yet. I started again. It seemed fine this time. Installer has been improved a lot. I really liked it. All credits to Ubuntu team. The installation just got much more easier and better(It was already easy). The TimeZone selection is brilliant this time around. You just click on your place on the map, it automatically selects the nearest timezone. You really need to experience this, rather than reading it here.
The partition selection step is a bit messed up. I did not like it at all. I was looking as to where the Manually Partition was placed on the dialogue. But overall looks with graphical layout of partition is good. After I selected manual partitioning, I just noticed remembered that ext4 was added. Thank god, I remembered at that moment, otherwise I would have really repented for not having upgraded to ext4 for next months :P
From here on installation looked almost like a breeze, there were not much changes. When installation reached 82% everything went dead. It started pulling out indexes from Ubuntu servers, it was not even a couple of hours after the release. So you know how jammed out the servers will be. It took almost 40 minutes to update the indexes (just 12-14 MiB) :(. Afterwards there were no other problems. Also I clocked CD-in to CD-out time. It is sharp 1 hr 19 secs. Excluding those 40 mins wasted for update you can safely consider it as 20 minutes. The LiveCD boot time has been reduced a lot. It is under 2 mins. To be precise, it was 1 min, 45 secs on my stop watch.
I did a reboot, to only know that, GRUB failed. It failed miserably with an error 15 message. WTF!?!?!? I could not believe my eyes. I started all the muttering and ranting at Ubuntu developers. I sent out messages to my friends not to try Jaunty(LoL!). I thought of trying my luck for the second time with the live CD. I realized there were some issues with booting into ext4 from grub 1. Now I really started feeling, I should have proceeded with ext3. To for sake of trying. I Googled a lot for this issue, but could not find anything relevant. I started the terminal and just tried re-installing the grub. WTH, I realized it was totally my mistake. I have 2 HDDs and I had given the wrong HDD as the setup path for grub during first install. Anyways I am second time lucky. After the reboot, grub worked fine.
And now came the real "WoW!" thingie. The boot time of Jaunty is lightning fast. Developers have really kept up their promises. You really won't have time to see the splash screen(may be that explains why it is not so good? ;-) ). I clocked the speed. From POST to GDM login screen it is 35.6 secs. From GRUB to GDM screen it is flat 27.8s. Wow!!! I really cannot believe this still. Though it was benchmarked to be 21secs, 27.8s is still fast for me.
After the boot, I just got a glimpse of few important tools I was looking forward to. The changes seem really simple but are subtle. Jaunty has shipped with Mozilla Firefox 3.0.8 (Canonical's off shoot of Firefox upstream project). It has some really noticeable changes, like when I click on the GMail status message box it expands. This is really convenient among others.
Pidgin 2.5.5 seems good. It has been integrated into the Desktop Universal notification system with few plugins enabled by default. Some are really helpful, like notifying about the new IM/IRC messages you get. But few things were irritating too, like showing sign in/out for every user. I disabled this one. And also, Ubuntu has kept up its mess of creating GTalk account. The talk server is not taken by default.
You have to goto Advanced settings for GMAIL account and set talk server as talk.google.com. Everything else seems good.
Also I got irritated by one another change. The Quit and Log out options have been completely taken out from the System menu. I was very much used to this. There is only one way now, you have to reach the right top corner of the screen to shut down/log out.
I tried Open Office 3.0. I was really looked forward for this one. It looks good on the whole, but I could not take a look at the features in detail. I also could not get the most hyped import PDF as a document feature working. It is a bit sad. But I will have to Google a bit about this I think before talking more.
And how can I forget Python? LoL! But this one really upset me. Jaunty ships with Python 2.6 as default. This has a lot of problems. There are many packages which still run on Python 2.5 only. For example, Google App Engine SDK runs of 2.5 only. There is no support for Python 2.6 yet. It breaks like hell. With me being selected for Melange, which runs on App Engine, for this year's Google Summer of Code, this came like a big shock. I badly wanted to run Python 2.5 as default. I did a bit of research, asked in #ubuntu and finally install Python 2.5 and set is as default. Thanks to Debian's update-alternative manager. It is brilliant. It helped me to set Python 2.5 as default.
I still haven't understood the implications of this work around. People on #ubuntu told me that, many of the maintainance scripts and programs on Ubuntu have Python 2.6 as the dependency and setting 2.5 as default may break the system itself as a whole. I haven't experienced anything as such till now. I really really pray that won't happen.
And finally I cannot close this post without talking about the artwork. The design, icons, desktop wallpapers and themes are really awesome!!! Brilliant I must say. There are two new wallpapers. Three new black themes. The GDM login screen theme is simply awesome!!! The artwork seriously steals the show this time. Seems like Ubuntu team has got this one right for the first time! Also the all new notification system is really worth all the hype it created. It truly deserves it.
I must conclude this review saying that, Ubuntu Jaunty Jackalope is worth a try, just for the artwork and the speed itself! Please give a try!


text: Special FREE SHIPPING Destash Sale This Week! Posted on July 11, 2010 by Genevieve Speegle Special destash sale: FREE SHIPPING (U.S. and Canada!) on all orders over $10!! ***Sale good through Wednesday, July 14. Orders must be made from my ArtFire shop.*** http://www.artfire.com/users/BellaStitchery Free shipping code: FREESHIPPING Thanks so much, and happy shopping! Share this:TwitterFacebookGoogleLike this:Like Loading... Related


text:
Results tagged "Balloon Fiesta" from Kazza the Blank One
Seems I never got around to posting these..
So relatively nice long weekend. Did a lot of Lego sorting (every day), a bit of food shopping (Saturday), finally cracked 8192 on 2048 (Saturday), Ben over for roast pork (Saturday), some cooking (caramel slice and beef stew on Sunday morning), killifish study group meeting at Serkan's and then dropped off some stuff at Stu's and the kids (Sunday), saw the balloons (Monday), a Bunnings run (Monday), a couple of episodes of Homeland, several episodes of Enterprise and about fifteen episodes of The Addams Family. I was hoping to do a bit of shower grouting, but that wasn't to be. But I did get some work done on the trivia night (but again, not as much as I'd hoped).
I actually went to the Balloon Fiesta twice this year. Once with Chrissie, after having had not much sleep on account of hurty, and once after dropping Luc off at the airport after having not much sleep on account of insomnia.
Take two ..
These were all taken from our house
Wednesday Luc was in town, so we went for a drink after work, then back to our place for dinner (duck stir fry) and chatting. Mostly chatting about travel.
Woke up at about 3am Thursday morning. And never got back to sleep. Stoopid brain just would. not. shut. up. Super frustrating. Took Luc to the airport then went and saw the balloons again (sadly no sun again). Although the sun was out for the drive home, which made for a super pretty drive under all the balloons (which of course I couldn't document - doh!).
So Thursday was zombie day. Good thing Lachie was busy doing other stuff, I don't think I would have been able to concentrate on the other stuff we're doing.
Also finished drafting the trivia night questions so the weekend will be spent researching, prettyifying and copying and pasting.
Last night slept for around nine hours, so feel a lot better today.
Friday: watched The Lego Movie with the sweetie (got a super awesome deal from JB HiFi cause they'd mucked up a specials deal, and it came out in my favour :) )
Saturday: quiet day, not much, watched tv, docos, sorting crap out, painting etc. Watched Monsters Inc on tv, because that always seems more logical that popping in the Blu-Ray .... hrmm
Sunday: also pretty quiet. Went for a walk with the sweetie to do an Ingress mission. Went to Mishi's in the evening for a lot of chatting, and a game of Pandemic, which was a bit complicated but we somehow managed to win. We'd need to play it a few more times to get the hang of the strategy.
Monday: got up at stoopid o'clock to see the balloons (sadly there was a bit of fog around so they took off and all but disappeared). Watched My Girl on tv and docos while painting.
Up at stoopid o'clock on the last Friday of the balloons to see the Skywhale in flight and say hi to Neil. Had breakfast before the crowds, although being a Friday morning the crowds (and number of balloons) was a lot smaller than a weekend.
My only Canberra Day activity was to get up at stoopid o'clock and go out to see the balloons. And after hearing about the queues for food and toilets I'm kinda glad I didn't battle the hoards to partake in any of the rest of the festivities of the day.
Foreground lit up by the Air Force testing their burner
Darth Vader inflating
The peacock's head
Darth Vader!
Went and visited Neil. Was going to buy something, but queue was all the way back through the pavilion and out the door. They were guestimating getting through 140 dozen eggs that morning!
In the evening the sweetie and I shared a bottle of bubbly and toasted a Happy Birthday to Canberra.
@CLBradley and I were going to do that at 11:15 this morning, but somehow didn't get around to it. So I raised a bottle of water instead.
As we were heading for Black Mountain the clouds closed in
But the balloon people were arriving, as were the spectators.
About 6:25 they got into full swing. By 7:30 they were floating in all directions above Canberra.
The only thing that could have made the morning better would have been some sunshine. But I still went overboard with photos! Next year I plan to go up in one :)


text:
"I don't know how much you already know, since I don't know how you found me, but if you've read the articles or talked to the police you probably know as much as I do. On November 23rd last year, Kenshin was taking the bus home from work — he worked at the Humane Society, which you probably know is way across town from here, but we lived a little closer to it then; I only moved back here to be near my parents after…" She gave a pained-sounding clearing of throat and paused for a moment before going on at the same pace as before. "He was on his way home, waiting for his connecting bus, and there was a gunfight in the street near the stop. It was a gang thing.
"They said he must have tried to take shelter down a little street behind the bus stop, because that's where he was found. It's not the best area — it was the stop at Hamlet and 11th, if you know it, which is statistically the worst part of the city for gang activity — and though there aren't a lot of gunfights, they do happen, and there does happen to be a bus stop right there, so it was inevitable that eventually someone would…"
Her face had been growing more and more brittle throughout this dissertation, her voice tighter and tighter. Something was going to crack, and the result was sure to be sobbing and tears and probably a good deal less coherence. She cleared her throat again and took a deep breath that was not entirely steady.
"He didn't always take the bus to work; we do have a car. It was perfect coincidence that I needed it that day." Her voice sank as she added in a self-accusatory tone, "But of course I didn't need it. I work from home… I didn't have to go shopping that day… if I hadn't kept the car — I didn't need it — he wouldn't have been at that bus stop. He would never have been at that bus stop."
Tears were definitely starting to surface; it was difficult to see her eyes, which were still turned down toward her knees and the hands clenched thereon, but the intonation was unmistakable. She was on the verge of losing the careful control she'd undoubtedly built up painstakingly over the last few months of repeating this story.
She was also lying.
It was extremely frustrating. Exactly what she was lying about, exactly why she was lying, and exactly how it pertained to the current situation and her husband's ghost, Hajime could not begin to tell, but she couldn't hide from him the general sense of untruth behind her words.
What she could hide from him was just about everything else. She was guarding so fiercely, he couldn't even get at completely unrelated thoughts in her head. Moments like this made him regret never training more thoroughly in communication, and he decided then and there how he was going to be spending his free time after this was over, so bothersome was it not to be able to reach a truth that would, presumably, help everyone present.
"He was actually shot twice," she went on, surprisingly with no great increase in breakdown of control: "once just behind his right ear, and the other just in front of it. He was unconscious when he was found and taken to the hospital, and it took him less than an hour to pass away. I didn't even make it over there before… I didn't get a chance to…" After another trembling breath she went on more steadily, "They said, if there was any pain, it was probably over with quickly."
Throughout this discourse Sano had been shifting restlessly, and, though Hajime doubted the young man could sense the dishonesty, it was clear that the woman's words — especially these last — were not helping to decrease the already significant level of anger he was trying to deal with. But Kaoru, gaze still fixed on her knees, did not appear to notice this.
"The police also said that the sweatshirt he was wearing might have contributed, since he'd pulled the hood up, probably to hide his face and hair in the dark or something, and that might have made him look more like a member of one of the gangs. I always thought he should wear a jacket that didn't look so… young… he was thirty-two, but you'd never guess… and it was mine in the first place; I mean, it was grey, but it was a woman's hoodie…" Apparently these somewhat rambling details were more difficult to relate than the physicalities of the death itself, and the tears were now visible on her face. Hajime deemed her distress genuine, but couldn't pass judgment on the accuracy of her account.
"He was always doing that: wearing my clothes without realizing that anyone would think it was weird. And the really weird thing was that they looked just fine on him — usually better than they did on me. But I still used to give him a hard time about it, because of Kenji and the neighbors and because he never seemed to notice that it was a little weird." Her words were becoming more and more difficult to understand as sobs broke into her sentences and a constricted throat marred her pronunciation. "For a while after… last November… I kept thinking, 'If I could just have him back, I'd never get on his case about that again. He could wear anything he wanted — not just jeans and things, but dresses or whatever — if he would just come back.' And every time I realized I was thinking that way, I got so angry at myself for being so stupid… but it still took a while to stop."
This latest set of revelations, Hajime thought, was probably totally honest, since it really had nothing to do with Kenshin's death, and the overwhelming sense of deception had faded somewhat from Kaoru's demeanor. But whether she was making a subtle attempt to get away from the topic about which she felt the need to lie, or whether she really had been sidetracked in her grief by memories of her late husband's quirks, Hajime could not guess. In any case, it wasn't getting them anywhere.
"Mrs. Himura," he began, in the cool tone of a lecturer, "the problem here — at least the first problem that needs to be dealt with — isn't so much your husband himself as the angry energy surrounding him. When someone is haunted by this type of energy — which is called a shade — it has a number of negative effects on them; headaches and an extremely bad mood are the most common. As you can see, Sano is currently suffering these effects because, for some reason, your husband has been haunting him for three weeks."
He'd been ready to go on for as long as she remained silent until the entire situation was laid before her, but at this point she broke in. "Why?" She sounded a little desperate. "Why would he go to a complete stranger?" With an uncertain glance at Sano she added, "Or did he know you and just never mention it?"
Sano, clearly beyond the ability to speak, shook his head. Hajime almost expected a countdown to appear in big visible red numbers above the spiky blue-gelled hair at any moment, and continued his explanation to Kaoru more quickly. "That's one thing we'd like to figure out. But besides the effects on Sano, just the fact that your husband is still here at all needs to be addressed. It's not healthy for anyone to stay in this world after death, and whatever is holding him here needs to be dealt with.
"But the shade energy is blocking all attempts to communicate with him. We can't find out what exactly is holding him here if we can't talk to him — and it's more than likely that some sort of communication is what he needs in order to move on anyway. So the most important point at the moment is why he's so angry. If we can dispel the anger, we can move on to the next step in this process. And the probability that his anger is related to the circumstances of his death is overwhelming."
Her tears were in abeyance for the moment, and she looked faintly confused and equal parts wary; in her mind, the walls seemed to have become thicker and rougher than before. "OK," she said slowly and relatively levelly. "I can see why that would be important."
Abruptly Hajime stood, and the movement made Mrs. Himura shy back toward her end of the bench. "I'm sorry to startle you," he said. "As I mentioned, we appreciate that you came out here at all to talk to us. Unfortunately, if you're not prepared to tell us the truth, I'm afraid you're not going to be any help to us."
The barriers suddenly doubled, and her level of agitation increased perceptibly. He would never have deliberately put her back up like this — it would have been so much more politic to continue the conversation on a non-threatening level and try to work the answers out of her — but to his left he could sense Sano about to explode. What direction the young man's anger was currently pointing really didn't matter; it was clear that he might do something everyone would regret after not much longer.
"What–" Kaoru was saying, rising hesitantly from where she'd been seated, wringing her hands.
But in favor of taking Sano's arm in a firm grip and pulling him away along the sidewalk, Hajime gave every indication of completely ignoring her.


text: The Domes by TPL Vision can be divided in two categories: classic domes and flat domes. In both cases, they have a hole located in the center, so that the camera's lens can be easily inserted. All domes are equipped with high powerful leds. Whatever the kind of dome, the priority is still the same: generate a diffuse and homogeneous lighting, without any light impacts, and therefore reduce the reflections on shiny surfaces.


text:
© Tejon Ranch Conservancy 2018
Russell Faucett, Retired
Prior to his retirement in 2014, Russell Faucett was the Managing Partner of
Barrington Partners LP, a private investment company that specialized in trading the
equity and debt securities of public companies in financial difficulty. Russ started
Barrington in 1984.
Russ Faucett graduated with Distinction from Pomona College with a Bachelor of
Arts in Physics and from the Massachusetts Institute of Technology with a Master of
Science in Industrial Management.
In addition to his investment activities, Russ has worked with several non-
governmental organizations, assisting in improving their strategic planning and
financial management. In 2003 the Faucett Catalyst Fund was established to further
his philanthropic interests, emphasizing social entrepreneurship in the areas of
conservation and the environment, and economic development and healthcare
delivery in developing countries. Russ has years of experiences in Latin America -
climbing, trekking, birding, working with the Organization for Tropical Studies, and in
microfinance with Accion International.
Russ has served on the Administrative Board of the Cornell Lab for Ornithology and
the Board of Directors of TechnoServe, Accion International, California Heart
Foundation at Cedars-Sinai Hospital, Island Press, NatureServe, the Organization
for Tropical Studies at Duke University, Los Angeles Chamber Orchestra, and the
Board of Advisors of the Smithsonian Environmental Research Center and the UCLA
Fielding School of Public Health.
Board Members
About Us
Vision and Values
Board Members
Contact Us
Join Our Mailing List
Public Access
Pacific Crest Trail
State Park
UC Reserve
Become a Member
Citizen Science
Other Resources
Ranch-wide Management Plan


text:
PORT ARANSAS - Port Aransas will soon acquire a new, larger ferry.
Shipyard in Houston will begin the construction of the new $9 million,
28-vehicle ferry for the Texas Department of Transportation ferry
operations in the fall.
Construction should take about two years
and will include design improvements below deck. The overall size,
appearance and deck layout will be nearly identical to the two current
ferries, the Behrens and the Heald.
"The new ferries are necessary
to help us keep up with increased traffic demands and at the same time
replace the older, less efficient, 20-car ferries that cost more to
maintain as they age," Port Aransas ferry operations manager Howard
Gillespie said.
One of the current vessels will be retired when
the new ferry goes into service, maintaining the fleet at eight ferries.
The eventual goal is to have a fleet made up entirely of the larger,
28-vehicle ferries.
Our twice-weekly e-newsletter provides a quick overview of Texas real estate markets. Because your time is valuable.


text:
Your browser does not support iframes.
The 4-H State Livestock Skillathon is a competition that is held once every year to test students' knowledge of all aspects of livestock.
4-H'ers from all over the state come to the Skillathon to compete.
This year's competition was held Feb. 19 at the Hopkins County Fairground.
The Anderson County 4H Livestock Club fielded two teams. Members 9 to 11 years old made up the Clover Team. The Intermediate Team members were 12 to 14 years old.
The Saffell Street Academic team placed second in District Governor's Cup at Turner Elementary on Feb. 26.
The Quick Recall team placed first in the district.
Quick Recall team members include Austin Gabhart, J.Tyler Herzog, Nathan Sallee, Anna Foley, Matthew Lunsford, Abby McClellan, Tanner Gillis, Shelbi Snow, Jesse Barnett, Gage Mitchell, Linda McNulty and Shawn Kenyon.
Students also took written assessments and placed as follows:
Shelbi Snow placed second in social studies
Anderson Community Education has announced classes it is currently offering.
To register, call 839-3754 or e-mail email@example.com.
Class descriptions are provided by Anderson Community Education.
Hip Hop Dance for Children
(Ages 7-15)
When: April 12-May 17 on Tuesday afternoons from 5-6 p.m.
Where: Anderson Middle School cafeteria with Jeriann Winfrey, instructor
Cost: $39
Anderson County High School has produced more than its share of attorneys, and more could be on the way.
Thirteen students competed earlier this month in a mock trial competition in Louisville, finishing 2-2 and impressing those who helped get them there.
"I was just so proud of them," said County Attorney Bobbi Jo Lewis, a 1981 Anderson graduate who served as one of the team's coaches along with local attorney Marie Hellard.
"They put their heart and soul into this, and they had a courtroom full of parents, all just beaming."
Students can breathe a sigh of relief because school won't be in session after the Memorial Day holiday.
The Anderson County Board of Education approved an amended calendar Monday evening, setting the final day of school in Anderson County for Friday, May 27. Anderson County High School graduation ceremonies will be held the same evening at the Frankfort Civic Center.
Parents and students are invited to Parent Connection Night, March 23 from 3:30 to 6 p.m. at Anderson County High School.
The evening will include parent-teacher conferences along with colleges and universities from across Kentucky, service personnel and local career representatives will be participating in a college/career fair and mini-workshops.
Dylan Reaves of Lawrenceburg performed the role of Gangster in "The Drowsy Chaperone," which was performed in February at Denison University's Ace Morgan Theater.
"The Drowsy Chaperone," a zany "musical within a comedy," has music and lyrics by Lisa Lambert and Greg Morrison and book by Bob Martin and Don McKellar, according to a news release.
The play pays homage to American musicals of the jazz age, examining the effect musicals have on the fans who adore them, organizers said.
Alissa Renee Vest of Lawrenceburg was included in this year's United States Achievement Academy yearbook.
Vest, 14, is an eighth-grader at Anderson County Middle School. She plays softball and was a member of the Kentucky Rockers team that played in the World Series last year.
Her science teacher, Jamie Young, nominated her for the recognition.
She is a daughter of Mark and Melissa Vest and sister of Mark Anthony Vest Jr.
Her grandparents are Nancy Dennis, Zeke Dennis and Thelma Vest, all of Lawrenceburg, and the late Billy Vest.
Copyright © 2019
The Anderson News is your source for local news, sports, events, and information in Lawrenceburg, KY and the surrounding area.


text:
JYJ's Jaejoong has sold out all 16,000 tickets to his first solo concert.
C-Jes Entertainment revealed: 'After the tickets to Jaejoong's first solo concert 'Your, My, and Mine' went on sale at 8PM, the servers were bombarded and the tickets were immediately sold out. He became the #1 searched term on the main portal sites while his tickets were on sale. This is Jaejoong's first solo concert in Korea, and it's made of a program that we're trying out for the first time, so we've had high interest. The concert is set in three parts of fanmeeting, product history talk, and mini concert.'
It was also revealed by the agency, that many foreign fans were attempting to buy tickets. They stated: 'Fans from not only Japan and China but also from Europe and the Americas focused on Jaejoong's ticketing. The most foreign IP addresses tried to access the site in its history.'
Source: allkpop
Article by Karolina & Alona
- Excited
- Fascinated
- Amused
- Bored
- Sad
- Angry


text:
Center Stone Ranging From: 0.5 - 1.5 carats
Here's an engagement ring that will delight both your senses, and your taste for design! The center stone sits perfectly nestled in a lovely 4-prong setting. On either side of it sits a lovely round, prong-set diamond that's just over a tenth of a carat. On the outside of the arrangement, sit two more, lovely princess-cut diamonds, set in a 'channel'. A lovely wrap frames either end of the top of this divine ring! This one truly has it all!
Master Model, Rubber Mold, Wax Mold, CZ Sample will delivery in 10days..


text:
To the question about, own hands repair bluetooth
Supposably, you there bluetooth. Served it to you more months. And suddenly bam - and it fails. what to do in current situation? Actually, about and is our article.
Possible it you seem unusual, however nonetheless sense set most himself question: does it make sense general repair bluetooth? may logical will purchase new? Me seems, sense for a start learn, how money is a new bluetooth. it learn, necessary make desired inquiry google.
If you all the same decided own practice repair, then in the first instance must get information how repair bluetooth. For it sense use yandex, or come on appropriate forum.
I think you do not nothing spent time and this article helped you make repair blyutuza. In the next article I will write how repair a turbine or a turbine.
Come our portal often, to be aware of all last events and new information.


text:
Superb Charentaise house with private heated pool, renovated to a high standard., Gémozac
St Germain du Seudre, France
Not available? Browse, refine your search results and find more selection of our St Germain du Seudre Vacation Rentals or a more general research of France Vacation Rentals will help you to discover what France has to offer and, you will be amazed.
Powered by Dimalink


text:
What are Keyword Models?
There are usually a few that are going to give optimal results, but with the current trends on the internet, you would really need to know you are going with it. What is currently taking place in life is sure to be also happening on the internet. The proper search terms will be learned by you by keeping up to date with these events.
If you have got something to write about entertainment and/or about current incidents, then search phrases which are brand new would be the most important. Those that make the most money are some of the fastest moving keywords but they may quickly and easily burn out. For a while, brand new keywords about Britney Spears made the most income online, however nowadays, she actually is not quite as searched for on the internet as somebody like Justin Bieber may be. Cases such as Miley Cyrus being trending and hot at this moment will not always be the same the exact time next year. Stay knowledgeable and informed regarding the things which is presently hot and is talked about in order to have some of the most important key terms out there. It is that simple.
New search phrases, when it comes to guidelines, are exactly the same in just about any writing category. If you are keen on blogging about recreational automobiles as well as cars, you would for an instance, want to see your search phrases along with the names of the most expensive and newest car models, as well as with the most popular and mid priced in-demand models of the specific vehicle which you are blogging about.. You would likewise need to get a brand new set of search terms which will reflect what is going on in the auto sector. This might have revolved around the recent bailouts, stock quotes, as well as recession, but that may not always be the case in the upcoming months or years.
Business is generally an area wherein new keywords are most likely the ones to bring in brand new visitors to your blog. Politics, depending on what is going on with the world at the moment, is another key player in bringing in fresh keywords. Majority of people search for the latest news. There are a few website traffic related to what happened in the past but the most important issue is right here and right now. You would be able to find these brand new search keywords and terms by just simply reading or watching the news every single day. You might want to work with the search phrases of the subject area in your blog or in your articles.


text:
Monday, 9 May 2011
Finding the right perfume
I'm a bit of a fragrance nerd. I find it a fascinating subject and I love Luca Turin's theory (well, he expanded it) that it isn't a molecule's shape that determines the scent, but its vibration, like music for your nose. Humans have actually a very good sense of smell and smelling something is a very good way to evoke a memory or a certain feeling. For me a fragrance can be a way to complete an outfit and I wear perfume every day. However, perfumes are generally alcohol-based and for some reason I find such fragrances way too strong and gives me headache. Though I love perfume, I can't stand it when it is too strong.
My solution is perfume oil and Black Phoenix Alchemy Lab. If you are in any way interested in perfumes, I urge you to check them out. They make scents that are based on literature, places, mythological figures or moods, and more. They have an overwhelmingly large catalogue, but it is possible to search for a scent you like and then get all the perfumes that contain it. It is also possible to order samples of most perfumes and you always get freebies when you order. Another thing I really like with their products is that they don't have scent stabilization. Modern perfume usually does, to make sure a scent smells the same whoever wears it. I find that boring and it makes it harder for a perfume to melt together with your body chemistry. You get a perfume that smells like A on you and her and her and him, instead of something that even if you can tell what perfume it is, it also smells uniquely for you.
When I re-enact 18th century I like to wear perfumes that are based on 18th century perfumes so of course I want to smell right when I wear 40's clothes too. At least I want to have the option so I looked around a little for proper scents. This is by no means a comprehensive study of all the perfumes available in the 1940's, but rather a few that I think may suit me. I'm a 2foody" girl, by which I mean that scents that are based on vanilla and spices works well for me as do fruits and berries. Musks and leathers are a bit of a gamble and florals tend to go a bit cat pee on me. Patchouli was what my paternal grandmother wore, so even if it smells nice on me, it also smells grandmother, so I feel like an old lady if I wear it. With the help of Fragrantica I found the following perfumes that I thought interesting.
Balenciaga Le Dix Perfume from 1947.
Caron Bellodgia.
Caron Tabac Blond from 1919.
Creed Ambre Cannelle from 1949.
D`Orsay Le Dandy from 1925.
Dana Canoe from 1935.
E. Coudray Ambre et Vanille from 1935
Guerlain L'Heure Bleue from 1912.
Guerlains Shalimar from 1928.
Houbigant Chantilly from 1941.
Jitterbug, 1940's.
Molinard Habanita from 1924.
Patou Colony from 1938.
Penhaligon Zizonia, 1930's.
Rochas Femme from 1943 (re-formulated in 1989.)
The Crown Perfumery Co Tanglewood Bouquet from 1932.
Of course, not all of these are available today. I will need to do some more digging to find which one I can get my mittens on. from The Perfumed Court often sell samples of hard to get perfumes, so I will certainly check there. Stay tuned!
A little addition: I have often noticed that if you think about a subject, then it pops up everywhere and when I took a break from writing this post and checked my bloglist I found that Dahling It's Vintagy! has written no less than two posts about the favourite perfumes of golden era movie stars. Read them here and here
5 comments:
- Vintage Vicky said...
Thanks for sharing this, it's really interesting. I also found Fragrantica to be very useful when researching vintage perfumes as it tells you a bit about the history of each one and has links to where to buy it from (if it's still in production). If only I had enough money to buy some Guerlain Shalimar. Ah well, a girl can dream :-)
- 9 May 2011 at 11:27
- Isis said...
Vintage Vicky. Oh, I forgot to add a link (fixed now) to The Perfumes Court:
Sells samples of vintage perfumes, so I think some can be found there.
- 9 May 2011 at 11:45
- Lady Cherry said...
That is an interesting theory, I have never heard that before. I do love a perfume, especially florals.
- 9 May 2011 at 12:36
- Isis said...
Lady Cherry: I think it's considered a bit controversial. :)
- 10 May 2011 at 02:10
- Kristina said...
AAAAWWW... Thank you dear!
- 11 May 2011 at 13:42
Subscribe to: Post Comments (Atom)


text:
|A page from "Videotext", the
common teletext service of the German public broadcasters ARD and ZDF. Translated, the
page says:
|Hessentext is the teletext service from the German public regional broadcaster Hessischer Rundfunk. Most of these pages are from September 1999
|Company logo and address
|Hessentext staff
|Sunrise and Sunset
|The title page for the news and sportsreel sequence
|This is the standard test page of most German public teletext services.
|Further test
* recent orthography reform in Germany has replaced the � character with ss - but that is unlikely to happen here!
|TV index page featuring the Frankfurt skyline
|A preview of the regional news TV programme Hessenschau
|The Astra frequencies and terrestrial channels for Hessen Fernsehen
|An older frequency page.
|The 'Service' index, leading to information about the job centre, railways, flights and road traffic.
|Cinema, festivals etc...
|"Uncle Otto" seems to be the hr equivalent of Gus Honeybun and is available as a cuddly toy from the Onkel Otto shop! - see http://www.hr-online.de/
|Happy birthday from hr
|ORBtext, from the regional public broadcaster Ostdeutscher Rundfunk, Brandenburg.
|An early index page from RTL2's teletext TEO - TElevision Organiser) provided by several TV magazines of a publishing house ("Your update schedule service for all important stations")
Teletext in Europe | Around the World
discussion about all aspects of teletext, from content right through
to complex technical matters.
If you have a question, this is the place to ask it...
mb21 by Mike Brown
discussion about all aspects of teletext, from content right through
to complex technical matters.


text:
I'm assuming since you use the internet, you also like to buy things on the internet. I'm also taking a massive leap of faith and assuming you also like free money (let's be honest, if you don't, you're on the wrong part of the internet).
CashRewards is a website that gives you money back for doing your shopping via it's referral links. It's business model is based on affiliate programs, so each shop gives them money when you click on their link and buy something, and a portion of that gets passed on to you. So you're essentially getting a tiny discount in the form of a cashback.
Yes, I say tiny because it's usually a miniscule amount like 5 or 10%, but a tiny discount is better than no discount right? Especially for something you're going to buy anyway. You can usually also stack it with other sales and discount codes.
Most well known Aussie retailers are on there so it can add up pretty quickly. Some of my favourites ones are eBay, Target, Woolworths, Portmans, Forever New and Expedia.
The catch? It takes fucking forever to get that money, because it has to clear past the retailer's return period. Usually it's a couple of weeks, sometimes a few months if you're really unlucky. I like to see it as the online shopping of getting paid – you're really excited when you get that confirmation email, and then promptly forget about it for 3 months until it turns up on your doorstep like a surprise present from a secret admirer. Except it turns out you're the secret admirer, and you are going to die alone with your cats, but at least you have free money!


text:
Shop Now | My Account | Customer Service | 585.352.5560
Comments or Questions?
If you would like more information about purchasing flags in bulk or have comments regarding the American Glory Collection, please complete the form below or call 585.352.5560.
American Glory, Inc.
200 Paragon Drive, Rochester, NY 14624
American Glory, Inc.gives back a portion of the proceeds from the sale of our flags to Veterans' charities.
See our How-To videos.
is almost here!
Speak with a Sales Representative today: 585.352.5560 | A.G. gives back a portion of the proceeds to Veterans' charities.
© 2003 American Glory, Inc. 200 Paragon Drive, Rochester, New York 14624, U.S.A. | Privacy Policy , Refund Policy,
In The News | FAQ | Contact Us


text:
5.3. - Book presentation, Screening:
It's the Political Economy, Stupid
6.3.–9.3. - Curators´ Network: Vienna
Curators and artists in conversation
19.9. - Round table discussion:
Encounters in Critical and Contemporary Art 1990s to date: Turkey
Status seminar and artistic survey
18.10. - The Unanswered Question. Iskele2
Global Citizenship - Panel discussion
28.10.–17.12. - Visuelle Kultur
23.11. - Screening and Artist Talk
Angelika Brudniak in Conversation with Gülsen Bal
12.12. - Round table discussion:
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. Or a Few Notes on Shifts in Curatorial Practice
Signs Taken in Wonder
Searching for Contemporary Istanbul - Panel discussion
5th March, 7.00 PM
Signs Taken in Wonder
Searching for Contemporary Istanbul
Wed, 23.01.2013 - Sun, 21.04.2013
MAK Exhibition hall
SIGNS TAKEN IN WONDER surveys the work of 33 international contemporary artists, born between the 1920s and the 1980s, whose art work engages with aspects of the culture, history, and daily life of Istanbul, one of the worlds great metropolises. Istanbul has been fascinating people for centuriesthe exhibition carries that fascination into the 21st century.
Many works in SIGNS TAKEN IN WONDER reflect the MAKs status as a museum whose collections span several centuries and materially embrace architecture, ceramics, furniture, glass, metal work, works on paper, and textilesrefracted in myriad ways in the exhibition through the lens of contemporary art. Significant for SIGNS TAKEN IN WONDER is the MAKs extensive holdings of Ottoman applied arts, or, that have traveled via Istanbul to Europe on trade-routes from farther in the East, representing Istanbuls influence as a mediator between Asia and Europe. Because of these collection holdingsand Viennas own status as a gateway to Eastern Europethe MAK operates as a global laboratory of culture and maintains a special focus on EuropeAsia.
The MAK exhibition takes its inspiration from an essay by Homi K. Bhabha, which describes the phenomenon of wonderment and amazement experienced during thediscovery of a new, foreign language and culture. A similar spirit informs Franco Morettis analysis of the relationship between world literatures and cultures in his book Signs Taken for Wonders (London, 1983). Curators Simon Rees and Bärbel Vischer will examine the development of narration and language as a topic of contemporary art. The wonderment is that of the curators developing the exhibition, as they confronted the metropolis and engaged in the process of discovering its various miracles, its culture and its art. At the same time, the reference to theoreticians and authors of world literature reflects the challenge of shedding light on a metropolis that encompasses European, Middle Eastern, and Asian geographies and cultures.
The exhibition intends to produce narratives of smallness in our era of bigness and globalization, presenting a collection of small worlds and little wonders. The influence wielded by Istanbul on the collective imaginary is reflected in the exhibitions focus on the individual and individuality; that sets in motion constructions of worldviews and worlds formation as reflected in the works of important authors such as Mario Levi or Orhan Pamuk. Those images and ideas hold fascination for several of the artists featured in the exhibition, who explore the citys rich store of popular antagonisms and ambivalences; others avoid involving themselves in this dialogue by examining paradigms of modernism established elsewhere in the world.
Participating Artists
Hamra Abbas / Murat Akagündüz / Yeşim Akdeniz / Eylem Aladoğan / Meriç Algün Ringborg / Hüseyin Bahri Alptekin / Halil Altindere / CANAN / Asli Çavuşoğlu / Cengiz Çekil / Banu Çennetoğlu / Mutlu Çerkez / Antonio Cosentino / Canan Dagdelen / Lukas Duwenhögger / Erdem Ergaz / Cevdet Erek / Murat Gök / Nilbar Güreş / Sibel Horada / Emre Hüner / Aki Nagasaka / Olaf Nicolai / Marcel Odenbach / Füsun Onur / Ahmet Öğüt / Mario Rizzi / Nasra Şimmes / Erdem Taşdelen / Cengiz Tekin / Güneş Terkol / İrem Tok / Uygur Yılmaz
Curators Simon Rees, MAK, and Bärbel Vischer, Curator MAK Contemporary Art Collection
Panel discussion:
(held in English)
Wed, 23.1.2013, 4 p.m.
Eylem Aladoğan, Halil Altındere, Paulo Colombo, Ahmet Öğut, Bige Örer
(Moderation Simon Rees)
Tue, 5.3.2013, 7 p.m.
Gülsen Bal, Vasif Kortun, Mario Rizzi
(Moderation Simon Rees)
MAK Lecture Hall
Artist Talk:
Wed, 23.1.2013, 3 p.m.
Halil Altındere, Canan Dagdelen, Cevdet Erek, Emre Hüner, Aki Nagasaka (Moderation Bärbel Vischer, held in German and English)
Murat vs. Ismail (Mario Rizzi, Turkey 2006),
OV with English subtitles
Tue, 22.1.2013, 8 p.m.
Wed, 23.1.2013, 2 p.m.
Tue, 12.2.2013, 7 p.m.
Tue, 26.3.2013, 7 p.m.
Tue, 16.4.2013, 7 p.m.
Sat, 20.4.2013, 2 p.m.
Kazin Ayagi (Mario Rizzi, Türkei, 2012),
OV with English subtitles
Tue, 5.3.2013, 5.30 p.m.
MAK NITE Lab
Tue, 12.2.2013, 8 p.m.
Cevdet Erek
Tue, 26.3.2013, 8 p.m.
Tue, 16.4.2013, 8 p.m.
Korhan Erel
MAK Exhibition Hall
For more information: http://www.mak.at/en/program/event/signs_taken_in_wonder?reserve-mode=active


text:
The fully rugged Toughpad FZ-M1 sets the new benchmark for outdoor tablets making it ideal for field workforces in challenging environments. With its capacitive 10-finger multi-touch outdoor display and flexible configurations, this Windows 10 Pro tablet has been designed to optimize the efficiency of field workers. The Barcode Reader is capable to read 1D/2D Barcode at very high speed to rise efficiency. With the hot swap battery system to change battery even in the field multiple shift usage will be possible. The Toughpad FZ-M1 shares its DNA with the Toughbook family of products from Panasonic, combining ergonomic and durable design that has made Toughbook the first choice for field workforces.
Not quite found what you are looking for? You can find products which may be more suitable by simply checking the features that interest you and clicking the find button.
We use cookies to do things like remember what you've added to your shopping basket and show you content we think you'll be interested in.
If you're happy with the use of cookies by BT Business Direct and selected third parties, click OK to continue.
Some cookies are essential - we can't provide our services without them.
Other cookies can be turned off, although our website won't work as well without them.
Click OK to accept cookies and continue.
These cookies let us do things like remember your login details and settings and provide support using live chat.
We use these cookies to do things like show you content and promotions we think
you'll like while you're browsing BT Business Direct and other sites. They also let you share pages with social media sites.
You can change your cookies settings whenever you like by using the 'Cookie preferences' link at the bottom of every page on this website.
Here are your current cookie settings.


text:
Playing it tough
Blazer: Talbots via Goodwill (similar) | Blouse: H&M (similar) | Denim: Elle via Kohl's (similar) | Boots: Goodwill (similar) | Bag: Vintage Coach via Garage sale | Watch: Kohl's (similar) | Spike Bracelet: Forever 21 | Rings: Forever 21/H&M
After a relaxing weekend spent watching football and baseball, shopping with my mom, and catching up on other blogs, I am ready to begin this week. I recently tweeted about this list, which I definitely plan on implementing beginning today.
On to the outfit: I love classic black and white, and while I definitely considered pairing this jacket with a cobalt blouse, I wanted a print—polka dots it is! I love the look of slouchy boyfriend jeans paired with boots; probably not the most flattering look, but sometimes you have to sacrifice figure-hugging looks for style.


text:
This May Be The Biggest Environmental Catastrophe No One Is Talking About
The oil and gas industry has a major methane problem, according to an extensive environmental study.
Odorless, colorless methane gas is seeping out of wells and tanks at hundreds of natural gas facilities across the U.S., said the nonprofit Environmental Defense Fund, whose researchers used infrared cameras to scan for methane leaks at over 8,000 sites in the U.S.
They found hundreds of leaks scattered in an unpredictable pattern around the country, according to the study that the EDF published this month.
"The study confirms what previous studies were pointing to — that super-emitters are highly unpredictable, and that these leaks can happen anywhere, anytime, at large facilities and small facilities," Matt Watson, associate vice president for the EDF's climate and energy program, told The Huffington Post.
Methane, the primary element in natural gas, is a potent greenhouse gas and is responsible for 10 percent of total greenhouse gas emissions in the U.S. It packs 84 times more warming power than carbon dioxide in the first 20 years that it's present in the atmosphere, according to the EDF. The environmental group estimates that reducing global methane emissions by 45 percent could have the same short-term benefit as shuttering 1,000 coal-fired power plants.


text:
American Hearing Solutions LLC
Clinic staff
Emily Bubnick
Dr. Emily Bubnick is a licensed audiologist and owner of Hamilton Hearing Aid & Audiologic Center and American Hearing Solutions LLC. She holds a certificate of clinical competence in audiology from the American Speech Language Hearing Association and is a member of the Academy of Doctors of Audiology. Dr. Bubnick earned a bachelor's degree and master's degree in audiology from West Virginia University and a doctorate in audiology from A.T. Still University/Arizona School of Health Sciences. Before opening her own practice, Dr. Bubnick worked in an ENT practice for six years.
This provider participates in the following insurance and discount plans: Homelink, OCCM, UAW, Federal Employee Program, Harmony Hearing, Advanced Hearing Providers, AMAC, Prime Health, MCAS and NEI.
Clinic reviews
More information
About this clinic
The mission of the caring staff at American Hearing Solutions is to help each and every one of our patients hear better by offering the highest quality hearing products and services. We strive to be your primary hearing health care provider and accept many insurance plans for your convenience. Contact us today so we can help you get the most out of life through better hearing. We look forward to serving you.
Clinic services
Our services include the following:
- hearing screenings
- comprehensive hearing testing and evaluations
- hearing aids
- hearing aid fittings to ensure proper amplification
- hearing aid accessories
- hearing aid service including cleaning, checks, maintenance and repairs
- hearing aid batteries
- assistive listening devices
- tinnitus
Call us today to schedule your appointment to hearing better.
Call this clinic today!
Or request an appointment online
Hours of operation
|9:00 am - 5:00 pm
by appointment
|9:00 am - 5:00 pm
by appointment
|9:00 am - 5:00 pm
by appointment
|9:00 am - 5:00 pm
by appointment
|9:00 am - 5:00 pm
by appointment
|10:00 am - 5:00 pm
by appointment
Clinic links
Accepted forms of payment
- Visa
- MasterCard
- Cash
- Check
- Insurance accepted, please call for details


text:
HRD TV brings you closer to the industry's
most influential leaders and thinkers. Click on the videos below to watch the interviews:
HR professionals packed out The Westin Sydney at the HR Tech Summit last week. Delegates were provided with a full day of insights from the leading HR tech specialists in Australia and trailblazers who are already harnessing technology in their practice.


text:
This module contains the functionality to arrange the nodes of a
diagram on an abstract grid, and then to produce a graphical
representation of the grid.
The currently supported back-ends are Xy-pic [Xypic].
Layout Algorithm
This section provides an overview of the algorithms implemented in
:class:`DiagramGrid` to lay out diagrams.
The first step of the algorithm is the removal composite and identity
morphisms which do not have properties in the supplied diagram. The
premises and conclusions of the diagram are then merged.
The generic layout algorithm begins with the construction of the
"skeleton" of the diagram. The skeleton is an undirected graph which
has the objects of the diagram as vertices and has an (undirected)
edge between each pair of objects between which there exist morphisms.
The direction of the morphisms does not matter at this stage. The
skeleton also includes an edge between each pair of vertices `A` and
`C` such that there exists an object `B` which is connected via
a morphism to `A`, and via a morphism to `C`.
The skeleton constructed in this way has the property that every
object is a vertex of a triangle formed by three edges of the
skeleton. This property lies at the base of the generic layout
After the skeleton has been constructed, the algorithm lists all
triangles which can be formed. Note that some triangles will not have
all edges corresponding to morphisms which will actually be drawn.
Triangles which have only one edge or less which will actually be
drawn are immediately discarded.
The list of triangles is sorted according to the number of edges which
correspond to morphisms, then the triangle with the least number of such
edges is selected. One of such edges is picked and the corresponding
objects are placed horizontally, on a grid. This edge is recorded to
be in the fringe. The algorithm then finds a "welding" of a triangle
to the fringe. A welding is an edge in the fringe where a triangle
could be attached. If the algorithm succeeds in finding such a
welding, it adds to the grid that vertex of the triangle which was not
yet included in any edge in the fringe and records the two new edges in
the fringe. This process continues iteratively until all objects of
the diagram has been placed or until no more weldings can be found.
An edge is only removed from the fringe when a welding to this edge
has been found, and there is no room around this edge to place
another vertex.
When no more weldings can be found, but there are still triangles
left, the algorithm searches for a possibility of attaching one of the
remaining triangles to the existing structure by a vertex. If such a
possibility is found, the corresponding edge of the found triangle is
placed in the found space and the iterative process of welding
triangles restarts.
When logical groups are supplied, each of these groups is laid out
independently. Then a diagram is constructed in which groups are
objects and any two logical groups between which there exist morphisms
are connected via a morphism. This diagram is laid out. Finally,
the grid which includes all objects of the initial diagram is
constructed by replacing the cells which contain logical groups with
the corresponding laid out grids, and by correspondingly expanding the
rows and columns.
The sequential layout algorithm begins by constructing the
underlying undirected graph defined by the morphisms obtained after
simplifying premises and conclusions and merging them (see above).
The vertex with the minimal degree is then picked up and depth-first
search is started from it. All objects which are located at distance
`n` from the root in the depth-first search tree, are positioned in
the `n`-th column of the resulting grid. The sequential layout will
therefore attempt to lay the objects out along a line.
[Xypic] http://www.tug.org/applications/Xy-pic/
from sympy.core import Basic, FiniteSet, Dict
from sympy.categories import (CompositeMorphism, IdentityMorphism,
NamedMorphism, Diagram)
from sympy.utilities import default_sort_key
from itertools import chain
from sympy.core.compatibility import iterable
class _GrowableGrid(object):
Holds a growable grid of objects.
It is possible to append or prepend a row or a column to the grid
using the corresponding methods. Prepending rows or columns has
the effect of changing the coordinates of the already existing
This class currently represents a naive implementation of the
functionality with little attempt at optimisation.
def __init__(self, width, height):
self._width = width
self._height = height
self._array = [[None for j in range(width)] for i in range(height)]
def width(self):
return self._width
def height(self):
return self._height
def __getitem__(self, xxx_todo_changeme):
Returns the element located at in the i-th line and j-th
(i, j) = xxx_todo_changeme
return self._array[i][j]
def __setitem__(self, xxx_todo_changeme1, newvalue):
Sets the element located at in the i-th line and j-th
(i, j) = xxx_todo_changeme1
self._array[i][j] = newvalue
def append_row(self):
Appends an empty row to the grid.
self._height += 1
self._array.append([None for j in range(self._width)])
def append_column(self):
Appends an empty column to the grid.
self._width += 1
for i in range(self._height):
def prepend_row(self):
Prepends the grid with an empty row.
self._height += 1
self._array.insert(0, [None for j in range(self._width)])
def prepend_column(self):
Prepends the grid with an empty column.
self._width += 1
for i in range(self._height):
self._array[i].insert(0, None)
[docs]class DiagramGrid(object):
Constructs and holds the fitting of the diagram into a grid.
The mission of this class is to analyse the structure of the
supplied diagram and to place its objects on a grid such that,
when the objects and the morphisms are actually drawn, the diagram
would be "readable", in the sense that there will not be many
intersections of moprhisms. This class does not perform any
actual drawing. It does strive nevertheless to offer sufficient
metadata to draw a diagram.
Consider the following simple diagram.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> from sympy import pprint
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
The simplest way to have a diagram laid out is the following:
>>> grid = DiagramGrid(diagram)
>>> (grid.width, grid.height)
(2, 2)
>>> pprint(grid)
Sometimes one sees the diagram as consisting of logical groups.
One can advise ``DiagramGrid`` as to such groups by employing the
``groups`` keyword argument.
Consider the following diagram:
>>> D = Object("D")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> h = NamedMorphism(D, A, "h")
>>> k = NamedMorphism(D, B, "k")
>>> diagram = Diagram([f, g, h, k])
Lay it out with generic layout:
>>> grid = DiagramGrid(diagram)
>>> pprint(grid)
Now, we can group the objects `A` and `D` to have them near one
>>> grid = DiagramGrid(diagram, groups=[[A, D], B, C])
>>> pprint(grid)
Note how the positioning of the other objects changes.
Further indications can be supplied to the constructor of
:class:`DiagramGrid` using keyword arguments. The currently
supported hints are explained in the following paragraphs.
:class:`DiagramGrid` does not automatically guess which layout
would suit the supplied diagram better. Consider, for example,
the following linear diagram:
>>> E = Object("E")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> h = NamedMorphism(C, D, "h")
>>> i = NamedMorphism(D, E, "i")
>>> diagram = Diagram([f, g, h, i])
When laid out with the generic layout, it does not get to look
>>> grid = DiagramGrid(diagram)
>>> pprint(grid)
To get it laid out in a line, use ``layout="sequential"``:
>>> grid = DiagramGrid(diagram, layout="sequential")
>>> pprint(grid)
One may sometimes need to transpose the resulting layout. While
this can always be done by hand, :class:`DiagramGrid` provides a
hint for that purpose:
>>> grid = DiagramGrid(diagram, layout="sequential", transpose=True)
>>> pprint(grid)
Separate hints can also be provided for each group. For an
example, refer to ``tests/test_drawing.py``, and see the different
ways in which the five lemma [FiveLemma] can be laid out.
See Also
[FiveLemma] http://en.wikipedia.org/wiki/Five_lemma
def _simplify_morphisms(morphisms):
Given a dictionary mapping morphisms to their properties,
returns a new dictionary in which there are no morphisms which
do not have properties, and which are compositions of other
morphisms included in the dictionary. Identities are dropped
as well.
newmorphisms = {}
for morphism, props in list(morphisms.items()):
if isinstance(morphism, CompositeMorphism) and not props:
elif isinstance(morphism, IdentityMorphism):
newmorphisms[morphism] = props
return newmorphisms
def _merge_premises_conclusions(premises, conclusions):
Given two dictionaries of morphisms and their properties,
produces a single dictionary which includes elements from both
dictionaries. If a morphism has some properties in premises
and also in conclusions, the properties in conclusions take
return dict(chain(list(premises.items()), list(conclusions.items())))
def _juxtapose_edges(edge1, edge2):
If ``edge1`` and ``edge2`` have precisely one common endpoint,
returns an edge which would form a triangle with ``edge1`` and
If ``edge1`` and ``edge2`` don't have a common endpoint,
returns ``None``.
If ``edge1`` and ``edge`` are the same edge, returns ``None``.
intersection = edge1 & edge2
if len(intersection) != 1:
# The edges either have no common points or are equal.
return None
# The edges have a common endpoint. Extract the different
# endpoints and set up the new edge.
return (edge1 - intersection) | (edge2 - intersection)
def _add_edge_append(dictionary, edge, elem):
If ``edge`` is not in ``dictionary``, adds ``edge`` to the
dictionary and sets its value to ``[elem]``. Otherwise
appends ``elem`` to the value of existing entry.
Note that edges are undirected, thus `(A, B) = (B, A)`.
if edge in dictionary:
dictionary[edge] = [elem]
def _build_skeleton(morphisms):
Creates a dictionary which maps edges to corresponding
morphisms. Thus for a morphism `f:A\rightarrow B`, the edge
`(A, B)` will be associated with `f`. This function also adds
to the list those edges which are formed by juxtaposition of
two edges already in the list. These new edges are not
associated with any morphism and are only added to assure that
the diagram can be decomposed into triangles.
edges = {}
# Create edges for morphisms.
for morphism in morphisms:
edges, frozenset([morphism.domain,morphism.codomain]), morphism)
# Create new edges by juxtaposing existing edges.
edges1 = dict(edges)
for w in edges1:
for v in edges1:
wv = DiagramGrid._juxtapose_edges(w, v)
if wv and wv not in edges:
edges[wv] = []
return edges
def _list_triangles(edges):
Builds the set of triangles formed by the supplied edges. The
triangles are arbitrary and need not be commutative. A
triangle is a set that contains all three of its sides.
triangles = set()
for w in edges:
for v in edges:
wv = DiagramGrid._juxtapose_edges(w, v)
if wv and wv in edges:
triangles.add(frozenset([w, v, wv]))
return triangles
def _drop_redundant_triangles(triangles, skeleton):
Returns a list which contains only those triangles who have
morphisms associated with at least two edges.
return [tri for tri in triangles
if len([e for e in tri if skeleton[e]]) >= 2]
def _morphism_length(morphism):
Returns the length of a morphism. The length of a morphism is
the number of components it consists of. A non-composite
morphism is of length 1.
if isinstance(morphism, CompositeMorphism):
return len(morphism.components)
return 1
def _compute_triangle_min_sizes(triangles, edges):
Returns a dictionary mapping triangles to their minimal sizes.
The minimal size of a triangle is the sum of maximal lengths
of morphisms associated to the sides of the triangle. The
length of a morphism is the number of components it consists
of. A non-composite morphism is of length 1.
Sorting triangles by this metric attempts to address two
aspects of layout. For triangles with only simple morphisms
in the edge, this assures that triangles with all three edges
visible will get typeset after triangles with less visible
edges, which sometimes minimises the necessity in diagonal
arrows. For triangles with composite morphisms in the edges,
this assures that objects connected with shorter morphisms
will be laid out first, resulting the visual proximity of
those objects which are connected by shorter morphisms.
triangle_sizes = {}
for triangle in triangles:
size = 0
for e in triangle:
morphisms = edges[e]
if morphisms:
size += max(DiagramGrid._morphism_length(m)
for m in morphisms)
triangle_sizes[triangle] = size
return triangle_sizes
def _triangle_objects(triangle):
Given a triangle, returns the objects included in it.
# A triangle is a frozenset of three two-element frozensets
# (the edges). This chains the three edges together and
# creates a frozenset from the iterator, thus producing a
# frozenset of objects of the triangle.
return frozenset(chain(*tuple(triangle)))
def _other_vertex(triangle, edge):
Given a triangle and an edge of it, returns the vertex which
opposes the edge.
# This gets the set of objects of the triangle and then
# subtracts the set of objects employed in ``edge`` to get the
# vertex opposite to ``edge``.
return list(DiagramGrid._triangle_objects(triangle) - set(edge))[0]
def _empty_point(pt, grid):
Checks if the cell at coordinates ``pt`` is either empty or
out of the bounds of the grid.
if (pt[0] < 0) or (pt[1] < 0) or \
(pt[0] >= grid.height) or (pt[1] >= grid.width):
return True
return grid[pt] is None
def _put_object(coords, obj, grid, fringe):
Places an object at the coordinate ``cords`` in ``grid``,
growing the grid and updating ``fringe``, if necessary.
Returns (0, 0) if no row or column has been prepended, (1, 0)
if a row was prepended, (0, 1) if a column was prepended and
(1, 1) if both a column and a row were prepended.
(i, j) = coords
offset = (0, 0)
if i == -1:
i = 0
offset = (1, 0)
for k in range(len(fringe)):
((i1, j1), (i2, j2)) = fringe[k]
fringe[k] = ((i1 + 1, j1), (i2 + 1, j2))
elif i == grid.height:
if j == -1:
j = 0
offset = (offset[0], 1)
for k in range(len(fringe)):
((i1, j1), (i2, j2)) = fringe[k]
fringe[k] = ((i1, j1 + 1), (i2, j2 + 1))
elif j == grid.width:
grid[i, j] = obj
return offset
def _choose_target_cell(pt1, pt2, edge, obj, skeleton, grid):
Given two points, ``pt1`` and ``pt2``, and the welding edge
``edge``, chooses one of the two points to place the opposing
vertex ``obj`` of the triangle. If neither of this points
fits, returns ``None``.
pt1_empty = DiagramGrid._empty_point(pt1, grid)
pt2_empty = DiagramGrid._empty_point(pt2, grid)
if pt1_empty and pt2_empty:
# Both cells are empty. Of these two, choose that cell
# which will assure that a visible edge of the triangle
# will be drawn perpendicularly to the current welding
# edge.
A = grid[edge[0]]
B = grid[edge[1]]
if skeleton.get(frozenset([A, obj])):
return pt1
return pt2
if pt1_empty:
return pt1
elif pt2_empty:
return pt2
return None
def _find_triangle_to_weld(triangles, fringe, grid):
Finds, if possible, a triangle and an edge in the fringe to
which the triangle could be attached. Returns the tuple
containing the triangle and the index of the corresponding
edge in the fringe.
This function relies on the fact that objects are unique in
the diagram.
for triangle in triangles:
for (a, b) in fringe:
if frozenset([grid[a], grid[b]]) in triangle:
return (triangle, (a, b))
return None
def _weld_triangle(tri, welding_edge, fringe, grid, skeleton):
If possible, welds the triangle ``tri`` to ``fringe`` and
returns ``False``. If this method encounters a degenerate
situation in the fringe and corrects it such that a restart of
the search is required, it returns ``True`` (which means that
a restart in finding triangle weldings is required).
A degenerate situation is a situation when an edge listed in
the fringe does not belong to the visual boundary of the
a, b = welding_edge
target_cell = None
obj = DiagramGrid._other_vertex(tri, (grid[a], grid[b]))
# We now have a triangle and an edge where it can be welded to
# the fringe. Decide where to place the other vertex of the
# triangle and check for degenerate situations en route.
if (abs(a[0] - b[0]) == 1) and (abs(a[1] - b[1]) == 1):
# A diagonal edge.
target_cell = (a[0], b[1])
if grid[target_cell]:
# That cell is already occupied.
target_cell = (b[0], a[1])
if grid[target_cell]:
# Degenerate situation, this edge is not
# on the actual fringe. Correct the
# fringe and go on.
fringe.remove((a, b))
return True
elif a[0] == b[0]:
# A horizontal edge. We first attempt to build the
# triangle in the downward direction.
down_left = a[0] + 1, a[1]
down_right = a[0] + 1, b[1]
target_cell = DiagramGrid._choose_target_cell(
down_left, down_right, (a, b), obj, skeleton, grid)
if not target_cell:
# No room below this edge. Check above.
up_left = a[0] - 1, a[1]
up_right = a[0] - 1, b[1]
target_cell = DiagramGrid._choose_target_cell(
up_left, up_right, (a, b), obj, skeleton, grid)
if not target_cell:
# This edge is not in the fringe, remove it
# and restart.
fringe.remove((a, b))
return True
elif a[1] == b[1]:
# A vertical edge. We will attempt to place the other
# vertex of the triangle to the right of this edge.
right_up = a[0], a[1] + 1
right_down = b[0], a[1] + 1
target_cell = DiagramGrid._choose_target_cell(
right_up, right_down, (a, b), obj, skeleton, grid)
if not target_cell:
# No room to the left. See what's to the right.
left_up = a[0], a[1] - 1
left_down = b[0], a[1] - 1
target_cell = DiagramGrid._choose_target_cell(
left_up, left_down, (a, b), obj, skeleton, grid)
if not target_cell:
# This edge is not in the fringe, remove it
# and restart.
fringe.remove((a, b))
return True
# We now know where to place the other vertex of the
# triangle.
offset = DiagramGrid._put_object(target_cell, obj, grid, fringe)
# Take care of the displacement of coordinates if a row or
# a column was prepended.
target_cell = (target_cell[0] + offset[0],
target_cell[1] + offset[1])
a = (a[0] + offset[0], a[1] + offset[1])
b = (b[0] + offset[0], b[1] + offset[1])
fringe.extend([(a, target_cell), (b, target_cell)])
# No restart is required.
return False
def _triangle_key(tri, triangle_sizes):
Returns a key for the supplied triangle. It should be the
same independently of the hash randomisation.
objects = sorted(DiagramGrid._triangle_objects(tri), key=default_sort_key)
return (triangle_sizes[tri], default_sort_key(objects))
def _pick_root_edge(tri, skeleton):
For a given triangle always picks the same root edge. The
root edge is the edge that will be placed first on the grid.
candidates = [sorted(e, key=default_sort_key)
for e in tri if skeleton[e]]
sorted_candidates = sorted(candidates, key=default_sort_key)
# Don't forget to assure the proper ordering of the vertices
# in this edge.
return tuple(sorted(sorted_candidates[0], key=default_sort_key))
def _drop_irrelevant_triangles(triangles, placed_objects):
Returns only those triangles whose set of objects is not
completely included in ``placed_objects``.
return [tri for tri in triangles if not placed_objects.issuperset(
def _grow_pseudopod(triangles, fringe, grid, skeleton, placed_objects):
Starting from an object in the existing structure on the grid,
adds an edge to which a triangle from ``triangles`` could be
welded. If this method has found a way to do so, it returns
the object it has just added.
This method should be applied when ``_weld_triangle`` cannot
find weldings any more.
for i in range(grid.height):
for j in range(grid.width):
obj = grid[i, j]
if not obj:
# Here we need to choose a triangle which has only
# ``obj`` in common with the existing structure. The
# situations when this is not possible should be
# handled elsewhere.
def good_triangle(tri):
objs = DiagramGrid._triangle_objects(tri)
return obj in objs and \
placed_objects & (objs - set([obj])) == set()
tris = [tri for tri in triangles if good_triangle(tri)]
if not tris:
# This object is not interesting.
# Pick the "simplest" of the triangles which could be
# attached. Remember that the list of triangles is
# sorted according to their "simplicity" (see
# _compute_triangle_min_sizes for the metric).
# Note that ``tris`` are sequentially built from
# ``triangles``, so we don't have to worry about hash
# randomisation.
tri = tris[0]
# We have found a triangle which could be attached to
# the existing structure by a vertex.
candidates = sorted([e for e in tri if skeleton[e]],
key=lambda e: FiniteSet(e).sort_key())
edges = [e for e in candidates if obj in e]
# Note that a meaningful edge (i.e., and edge that is
# associated with a morphism) containing ``obj``
# always exists. That's because all triangles are
# guaranteed to have at least two meaningful edges.
# See _drop_redundant_triangles.
# Get the object at the other end of the edge.
edge = edges[0]
other_obj = tuple(edge - frozenset([obj]))[0]
# Now check for free directions. When checking for
# free directions, prefer the horizontal and vertical
# directions.
neighbours = [(i-1, j), (i, j+1), (i+1, j), (i, j-1),
(i-1,j-1), (i-1, j+1), (i+1,j-1), (i+1, j+1)]
for pt in neighbours:
if DiagramGrid._empty_point(pt, grid):
# We have a found a place to grow the
# pseudopod into.
offset = DiagramGrid._put_object(
pt, other_obj, grid, fringe)
i += offset[0]
j += offset[1]
pt = (pt[0] + offset[0], pt[1] + offset[1])
fringe.append(((i, j), pt))
return other_obj
# This diagram is actually cooler that I can handle. Fail cowardly.
return None
def _handle_groups(diagram, groups, merged_morphisms, hints):
Given the slightly preprocessed morphisms of the diagram,
produces a grid laid out according to ``groups``.
If a group has hints, it is laid out with those hints only,
without any influence from ``hints``. Otherwise, it is laid
out with ``hints``.
def lay_out_group(group, local_hints):
If ``group`` is a set of objects, uses a ``DiagramGrid``
to lay it out and returns the grid. Otherwise returns the
object (i.e., ``group``). If ``local_hints`` is not
empty, it is supplied to ``DiagramGrid`` as the dictionary
of hints. Otherwise, the ``hints`` argument of
``_handle_groups`` is used.
if isinstance(group, FiniteSet):
# Set up the corresponding object-to-group
# mappings.
for obj in group:
obj_groups[obj] = group
# Lay out the current group.
if local_hints:
groups_grids[group] = DiagramGrid(
diagram.subdiagram_from_objects(group), **local_hints)
groups_grids[group] = DiagramGrid(
diagram.subdiagram_from_objects(group), **hints)
obj_groups[group] = group
def group_to_finiteset(group):
Converts ``group`` to a :class:``FiniteSet`` if it is an
if iterable(group):
return FiniteSet(group)
return group
obj_groups = {}
groups_grids = {}
# We would like to support various containers to represent
# groups. To achieve that, before laying each group out, it
# should be converted to a FiniteSet, because that is what the
# following code expects.
if isinstance(groups, dict) or isinstance(groups, Dict):
finiteset_groups = {}
for group, local_hints in list(groups.items()):
finiteset_group = group_to_finiteset(group)
finiteset_groups[finiteset_group] = local_hints
lay_out_group(group, local_hints)
groups = finiteset_groups
finiteset_groups = []
for group in groups:
finiteset_group = group_to_finiteset(group)
lay_out_group(finiteset_group, None)
groups = finiteset_groups
new_morphisms = []
for morphism in merged_morphisms:
dom = obj_groups[morphism.domain]
cod = obj_groups[morphism.codomain]
# Note that we are not really interested in morphisms
# which do not employ two different groups, because
# these do not influence the layout.
if dom != cod:
# These are essentially unnamed morphisms; they are
# not going to mess in the final layout. By giving
# them the same names, we avoid unnecessary
# duplicates.
new_morphisms.append(NamedMorphism(dom, cod, "dummy"))
# Lay out the new diagram. Since these are dummy morphisms,
# properties and conclusions are irrelevant.
top_grid = DiagramGrid(Diagram(new_morphisms))
# We now have to substitute the groups with the corresponding
# grids, laid out at the beginning of this function. Compute
# the size of each row and column in the grid, so that all
# nested grids fit.
def group_size(group):
For the supplied group (or object, eventually), returns
the size of the cell that will hold this group (object).
if group in groups_grids:
grid = groups_grids[group]
return (grid.height, grid.width)
return (1, 1)
row_heights = [max(group_size(top_grid[i, j])[0]
for j in range(top_grid.width))
for i in range(top_grid.height)]
column_widths = [max(group_size(top_grid[i, j])[1]
for i in range(top_grid.height))
for j in range(top_grid.width)]
grid = _GrowableGrid(sum(column_widths), sum(row_heights))
real_row = 0
real_column = 0
for logical_row in range(top_grid.height):
for logical_column in range(top_grid.width):
obj = top_grid[logical_row, logical_column]
if obj in groups_grids:
# This is a group. Copy the corresponding grid in
# place.
local_grid = groups_grids[obj]
for i in range(local_grid.height):
for j in range(local_grid.width):
grid[real_row + i, real_column + j] = local_grid[i, j]
# This is an object. Just put it there.
grid[real_row, real_column] = obj
real_column += column_widths[logical_column]
real_column = 0
real_row += row_heights[logical_row]
return grid
def _generic_layout(diagram, merged_morphisms):
Produces the generic layout for the supplied diagram.
all_objects = set(diagram.objects)
if len(all_objects) == 1:
# There only one object in the diagram, just put in on 1x1
# grid.
grid = _GrowableGrid(1, 1)
grid[0, 0] = tuple(all_objects)[0]
return grid
skeleton = DiagramGrid._build_skeleton(merged_morphisms)
grid = _GrowableGrid(2, 1)
if len(skeleton) == 1:
# This diagram contains only one morphism. Draw it
# horizontally.
objects = sorted(all_objects, key=default_sort_key)
grid[0, 0] = objects[0]
grid[0, 1] = objects[1]
return grid
triangles = DiagramGrid._list_triangles(skeleton)
triangles = DiagramGrid._drop_redundant_triangles(triangles, skeleton)
triangle_sizes = DiagramGrid._compute_triangle_min_sizes(
triangles, skeleton)
triangles = sorted(triangles, key=lambda tri:
DiagramGrid._triangle_key(tri, triangle_sizes))
# Place the first edge on the grid.
root_edge = DiagramGrid._pick_root_edge(triangles[0], skeleton)
grid[0, 0], grid[0, 1] = root_edge
fringe = [((0, 0), (0, 1))]
# Record which objects we now have on the grid.
placed_objects = set(root_edge)
while placed_objects != all_objects:
welding = DiagramGrid._find_triangle_to_weld(triangles, fringe, grid)
if welding:
(triangle, welding_edge) = welding
restart_required = DiagramGrid._weld_triangle(
triangle, welding_edge, fringe, grid, skeleton)
if restart_required:
# No more weldings found. Try to attach triangles by
# vertices.
new_obj = DiagramGrid._grow_pseudopod(
triangles, fringe, grid, skeleton, placed_objects)
if not new_obj:
# No more triangles can be attached, not even by
# the edge. We will set up a new diagram out of
# what has been left, laid it out independently,
# and then attach it to this one.
remaining_objects = all_objects - placed_objects
remaining_diagram = diagram.subdiagram_from_objects(
remaining_grid = DiagramGrid(remaining_diagram)
# Now, let's glue ``remaining_grid`` to ``grid``.
final_width = grid.width + remaining_grid.width
final_height = max(grid.height, remaining_grid.height)
final_grid = _GrowableGrid(final_width, final_height)
for i in range(grid.width):
for j in range(grid.height):
final_grid[i, j] = grid[i, j]
start_j = grid.width
for i in range(remaining_grid.height):
for j in range(remaining_grid.width):
final_grid[i, start_j + j] = remaining_grid[i, j]
return final_grid
triangles = DiagramGrid._drop_irrelevant_triangles(
triangles, placed_objects)
return grid
def _get_undirected_graph(objects, merged_morphisms):
Given the objects and the relevant morphisms of a diagram,
returns the adjacency lists of the underlying undirected
adjlists = {}
for obj in objects:
adjlists[obj] = []
for morphism in merged_morphisms:
# Assure that the objects in the adjacency list are always in
# the same order.
for obj in list(adjlists.keys()):
return adjlists
def _sequential_layout(diagram, merged_morphisms):
Lays out the diagram in "sequential" layout. This method
will attempt to produce a result as close to a line as
possible. For linear diagrams, the result will actually be a
objects = diagram.objects
sorted_objects = sorted(objects, key=default_sort_key)
# Set up the adjacency lists of the underlying undirected
# graph of ``merged_morphisms``.
adjlists = DiagramGrid._get_undirected_graph(objects, merged_morphisms)
# Find an object with the minimal degree. This is going to be
# the root.
root = sorted_objects[0]
mindegree = len(adjlists[root])
for obj in sorted_objects:
current_degree = len(adjlists[obj])
if current_degree < mindegree:
root = obj
mindegree = current_degree
grid = _GrowableGrid(1, 1)
grid[0, 0] = root
placed_objects = set([root])
def place_objects(pt, placed_objects):
Does depth-first search in the underlying graph of the
diagram and places the objects en route.
# We will start placing new objects from here.
new_pt = (pt[0], pt[1] + 1)
for adjacent_obj in adjlists[grid[pt]]:
if adjacent_obj in placed_objects:
# This object has already been placed.
DiagramGrid._put_object(new_pt, adjacent_obj, grid, [])
placed_objects.update(place_objects(new_pt, placed_objects))
new_pt = (new_pt[0] + 1, new_pt[1])
return placed_objects
place_objects((0, 0), placed_objects)
return grid
def _drop_inessential_morphisms(merged_morphisms):
Removes those morphisms which should appear in the diagram,
but which have no relevance to object layout.
Currently this removes "loop" morphisms: the non-identity
morphisms with the same domains and codomains.
morphisms = [m for m in merged_morphisms if m.domain != m.codomain]
return morphisms
def _get_connected_components(objects, merged_morphisms):
Given a container of morphisms, returns a list of connected
components formed by these morphisms. A connected component
is represented by a diagram consisting of the corresponding
component_index = {}
for o in objects:
component_index[o] = None
# Get the underlying undirected graph of the diagram.
adjlist = DiagramGrid._get_undirected_graph(objects, merged_morphisms)
def traverse_component(object, current_index):
Does a depth-first search traversal of the component
containing ``object``.
component_index[object] = current_index
for o in adjlist[object]:
if component_index[o] is None:
traverse_component(o, current_index)
# Traverse all components.
current_index = 0
for o in adjlist:
if component_index[o] is None:
traverse_component(o, current_index)
current_index += 1
# List the objects of the components.
component_objects = [[] for i in range(current_index)]
for o, idx in list(component_index.items()):
# Finally, list the morphisms belonging to each component.
# Note: If some objects are isolated, they will not get any
# morphisms at this stage, and since the layout algorithm
# relies, we are essentially going to lose this object.
# Therefore, check if there are isolated objects and, for each
# of them, provide the trivial identity morphism. It will get
# discarded later, but the object will be there.
component_morphisms = []
for component in component_objects:
current_morphisms = {}
for m in merged_morphisms:
if (m.domain in component) and (m.codomain in component):
current_morphisms[m] = merged_morphisms[m]
if len(component) == 1:
# Let's add an identity morphism, for the sake of
# surely having morphisms in this component.
current_morphisms[IdentityMorphism(component[0])] = FiniteSet()
return component_morphisms
def __init__(self, diagram, groups=None, **hints):
premises = DiagramGrid._simplify_morphisms(diagram.premises)
conclusions = DiagramGrid._simplify_morphisms(diagram.conclusions)
all_merged_morphisms = DiagramGrid._merge_premises_conclusions(
premises, conclusions)
merged_morphisms = DiagramGrid._drop_inessential_morphisms(
# Store the merged morphisms for later use.
self._morphisms = all_merged_morphisms
components = DiagramGrid._get_connected_components(
diagram.objects, all_merged_morphisms)
if groups and (groups != diagram.objects):
# Lay out the diagram according to the groups.
self._grid = DiagramGrid._handle_groups(
diagram, groups, merged_morphisms, hints)
elif len(components) > 1:
# Note that we check for connectedness _before_ checking
# the layout hints because the layout strategies don't
# know how to deal with disconnected diagrams.
# The diagram is disconnected. Lay out the components
# independently.
grids = []
# Sort the components to eventually get the grids arranged
# in a fixed, hash-independent order.
components = sorted(components, key=default_sort_key)
for component in components:
grid = DiagramGrid(component, **hints)
# Throw the grids together, in a line.
total_width = sum(g.width for g in grids)
total_height = max(g.height for g in grids)
grid = _GrowableGrid(total_width, total_height)
start_j = 0
for g in grids:
for i in range(g.height):
for j in range(g.width):
grid[i, start_j + j] = g[i, j]
start_j += g.width
self._grid = grid
elif "layout" in hints:
if hints["layout"] == "sequential":
self._grid = DiagramGrid._sequential_layout(
diagram, merged_morphisms)
self._grid = DiagramGrid._generic_layout(diagram, merged_morphisms)
if hints.get("transpose"):
# Transpose the resulting grid.
grid = _GrowableGrid(self._grid.height, self._grid.width)
for i in range(self._grid.height):
for j in range(self._grid.width):
grid[j, i] = self._grid[i, j]
self._grid = grid
[docs] def width(self):
Returns the number of columns in this diagram layout.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
>>> grid = DiagramGrid(diagram)
>>> grid.width
return self._grid.width
[docs] def height(self):
Returns the number of rows in this diagram layout.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
>>> grid = DiagramGrid(diagram)
>>> grid.height
return self._grid.height
def __getitem__(self, xxx_todo_changeme2):
Returns the object placed in the row ``i`` and column ``j``.
The indices are 0-based.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
>>> grid = DiagramGrid(diagram)
>>> (grid[0, 0], grid[0, 1])
(Object("A"), Object("B"))
>>> (grid[1, 0], grid[1, 1])
(None, Object("C"))
(i, j) = xxx_todo_changeme2
return self._grid[i, j]
[docs] def morphisms(self):
Returns those morphisms (and their properties) which are
sufficiently meaningful to be drawn.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
>>> grid = DiagramGrid(diagram)
>>> grid.morphisms
{NamedMorphism(Object("A"), Object("B"), "f"): EmptySet(),
NamedMorphism(Object("B"), Object("C"), "g"): EmptySet()}
return self._morphisms
def __str__(self):
Produces a string representation of this class.
This method returns a string representation of the underlying
list of lists of objects.
>>> from sympy.categories import Object, NamedMorphism
>>> from sympy.categories import Diagram, DiagramGrid
>>> A = Object("A")
>>> B = Object("B")
>>> C = Object("C")
>>> f = NamedMorphism(A, B, "f")
>>> g = NamedMorphism(B, C, "g")
>>> diagram = Diagram([f, g])
>>> grid = DiagramGrid(diagram)
>>> print(grid)
[[Object("A"), Object("B")],
[None, Object("C")]]
return repr(self._grid._array)