text: Job Discussion Forums :: View topic - Important decision... Get TEFL Certified & Start Your Adventure Today! Job Discussion Forums"The Internet's Meeting Place for ESL/EFL Students and Teachers from Around the World!" FAQ Search Memberlist Usergroups Register Profile Log in to check your private messages Log in Important decision... Job Discussion Forums Forum Index -> Newbie Forum View previous topic :: View next topic Author Message tkrawczykJoined: 23 Mar 2003Posts: 10 Posted: Sat Jul 19, 2003 4:46 pm Post subject: Important decision... I am an 18 year old Canadian male, just graduated from high school and thinking of taking a year off university to take a TESOL course and go teach englich abroad. My first preference is Thailand, but I would like your guys' honest opinions on whether you think I would be able to get by with just a TESOL certificate. If not, where would a guy like me be best to go - I don't plan on making a million bucks, I just wanna break near even in the end. Or would my best bet be to stay home and continue with this after I get a degree? If at all possible, I do want to go now though... Back to top C76Joined: 13 Jun 2003Posts: 113Location: somewhere between beauty and truth...in Toronto. ;) Posted: Sat Jul 19, 2003 7:34 pm Post subject: There's a thread on this board entitled "A List...Countries to Teach With No Degree..." Go check it out. In my experience thus far, I suppose my degree is helping me on a subconscious level. (I majored in English Lit.) But when I teach...I use much of what I've learned while studying for my certification. I can't really answer the last question your second paragraph though. I think it depends on you. You may get your cert, start teaching, and never want to stop. On the other hand, you may get your certificate, teach, go to uni and earn your degree. You might prefer to take this route. Something inside of me wants to lecture about the importance of earning your bachelors...At the very least, if you want, you could get it by correspondence. *C76 steps back for a non-newbie to offer some advice* Back to top aaronschwartzJoined: 17 Jul 2003Posts: 145Location: Beijing Posted: Sun Jul 20, 2003 12:38 am Post subject: Take some time out and get some real life experience under your belt. But FINISH that degree. If you do not finish, you will have regrets all of your life. Back to top tkrawczykJoined: 23 Mar 2003Posts: 10 Posted: Sun Jul 20, 2003 1:49 am Post subject: Well, it's not so much the knowledge of teaching that I'm concerned about, I feel that the TESOL certificate plus my own intellect should suffice. What I was more concerned about is whether I can even find work without the degree - but I see your points, thank you. Back to top Ben Round de BlocJoined: 16 Jan 2003Posts: 1946 Posted: Sun Jul 20, 2003 10:25 am Post subject: Quote: I am an 18 year old Canadian male, just graduated from high school and thinking of taking a year off university to take a TESOL course and go teach englich abroad. - tkrawczyk My first thought upon reading your post was Oh, so young and probably so innocent to venture into the world of TEFL. If you were lucky enough to get into the right school working with the right people, it could be a wonderful life experience for you, a fantastic way to spend a year between high school and university. On the other hand, the field of TEFL has an abundance of scammers, slimy folks, dodgy characters, people looking to prey on the naive and the inexperienced. If your goal is to see some of the world before starting university and if you can afford it, it might be much better to simply travel for a few months rather than try the EFL teaching route for a year. If you think a long-term stint in TEFL might be in your future, you could make it a point to visit some language schools and spend some time with EFLers during your travels. It would give you some insight into the real world of life in a foreign country working as an EFL teacher without getting yourself into situations that you may not be ready to handle. Sorry if this comes across as sounding overly protective. Of course, the bottom line is that these are decisions you'll have to make for yourself. Back to top double agentJoined: 18 Jun 2003Posts: 152Location: In the wild wild west Posted: Sun Jul 20, 2003 12:38 pm Post subject: young and canuck howdy cowboy first let me break your sweet Canadian heart jus´ a ´litttllle baby. You are too young. They wont hire you. They will SEE how young and cute you are and duck you over for your wages. They will lie to you and postpone your salary another day another week after the weekend and you will be broke and young with some foriegn dystentry or sumting. Go travelling, finish your degree, get your TEFL better yet get a TEFL Diploma, the pay increases greatly in GOOD countries. Go make a pile of money, in the middle east, japan, taiwan, go back home, put a deposit on your FIRST house. Rent it out. Go back travelling the world, and working while still SAVING. You will be miles ahead of the game if you play it like this. The other way WILL BE HARD and it will SUCK BIG TIME. Thailand aint so great I have been there and it is dirty and it sucks big time. Go to Morocco for dddrrrruuuuggggssss.. Where are u from in Canada_ Try the CES Back to top tkrawczykJoined: 23 Mar 2003Posts: 10 Posted: Sun Jul 20, 2003 4:58 pm Post subject: I'm from Saskatchewan, and I actually really like your idea. I have always been a little skeptical of teaching at 18, but one of my high school teachers, a young guy, told me that when he went to Thailand there were job offers like crazy, and he basically told me that I was a fool to not check it out. He said he lived like a king, and his stuff wasn't in Korea at the time, he would have never left. I think I probly will just travel around Asia, maybe Europe and South America as well. Quick question though.. I've heard from a lot of people that tutoring makes up a large part of teachers incomes - would I be able to make some money teaching families under the table? Of course I wouldn't plan to make much money tutoring in Thailand, but maybe Taiwan or Japan, just a little to extend my travel funding. I beleive that if I really sold myself, and came across as real outgoing and happy, the Japanese would love me. But of course, that is just my ignorant opinion, would do you guys think?[/list] Back to top double agentJoined: 18 Jun 2003Posts: 152Location: In the wild wild west Posted: Sun Jul 20, 2003 6:52 pm Post subject: furrrgiiittt bbbouuutt iiittt maybe 100 years ago when this TEACHER of yours was in thailand getting laid by young underage thai girls he felt like a king. SAD. Now the market is saturated. Lots of places advertise but few are GOOD. I mean few. Being so young they wont hire you. Maybe if you were at least 22 ..but 18... no way. Maybe u will get lucky and get a tutoring job. More than not, THEY WILL WANT SOMETHING FROM YOU! Your money, your love, just send them 500 dollars a month when you get back to Canada. They will LUUUVVVV u forever. Most of Asia is out to take money outta your pocket. Being western makes you a target. Being young will make you a victim. just travel for a month have fun be safe. Aids is big. dont be silly and lose you health. Back to top aaronschwartzJoined: 17 Jul 2003Posts: 145Location: Beijing Posted: Mon Jul 21, 2003 4:48 am Post subject: Too much negativity here! Try China, forget Thailand. Back to top MindTravellerJoined: 13 Mar 2003Posts: 89Location: Oman Posted: Mon Jul 21, 2003 6:12 pm Post subject: Getting your Bachelors One travel bug you can cure while in college is to spend a year abroad at another university. If you're at a good university, your university may have 'sister universities' around the world in which they do exchanges. (This may mean your scholarship money MIGHT apply to your year abroad. And that much of the paperwork will be done by your school. You might also have a support systm built-in to such a program.) Study a foreign language in college. Preferably an Asian language or Arabic (Sanskirt if you're interested in Asia). Language studies provide much cultural info. Read all the county info/job discussion info on Dave's. That is an exercise MANY people should do to get a dose of reality. Before the Net, many foreign companies got away with badly mistreating their employees because nobody knew. Don't let that happen to you. You can also get special 'summer student work permits' in many countries. You need to visit your college's Overseas Dept. or Foreign Language Dept. or other student travel-study abroad office. An educated person is always much easier, IMHO, to communicate with than an uneducated person. Not all people with degrees are educated, of course, and vice-versa. In general, college usually provides students with a basic intellectual advantage lacking in most high school students' education. (I'm trying to couch my terms to avoid FLAMES.) Etc. MindTraveller On vacation in Vancouver, BC Canada Back to top double agentJoined: 18 Jun 2003Posts: 152Location: In the wild wild west Posted: Thu Jul 24, 2003 7:04 pm Post subject: good advice Mind Traveller Dont take a year off. It will mess with your mind and you will waste time. REALLY. Students who take a year off, more than naught, never bother to come back, but talk about how they are going back next year, next year, next semester, then they are thirty... Travel in the Summer, or the Winter duing Spring break. I can highly highly highly recommend NEPAL. Been there three times. Better than the rest of Asia by far. You wil get laid, smoke, buy explore, learn and not spend much money. Back to top MindTravellerJoined: 13 Mar 2003Posts: 89Location: Oman Posted: Fri Jul 25, 2003 7:09 pm Post subject: Year Off - Advantages I took a year off between my junior and senior year in college. At the time, I just ran out of money. Looking back on it, it seems like I took an "emotional year off' to be in the real world. I learned to empathize with many people when I didn't even have enough money for a TV and a six-pack of beer although I was working full-time. I goofed up, learned about living in the real world, missed college, and when I returned the next year, I was a more attentive and better student than earlier. I found my fellow students quite naive and had trouble relating to them. I could relate better to Viet Nam vets and other non-traditional students. The 'no one returns after a break' thing scared me. But I had first hand knowledge. My father wasn't able to get through 4 years of college because of the Depression in the 30s. That definitely ruined his life. The fear of ending up working class and being a clerk in an office as I had been that year off - those two realities pushed me back into college for my final year, despite my lack of funds. I took out loans, didn't buy things, shared textbooks with friends, etc. I thought I had suggested in my earlier note, to try and enter a 'third year abroad' program - not 'take a year off from college'. When I tried an overseas program, my scholarships wouldn't apply...... so I just got upset and quit college. But this was 25 years ago. International education is much more sophisticated now. For most of us, life really is long. At 18, 20 and even 25, most of us WANT TO DO IT ALL and do it NOW. Fast. Relax. It's far, far better to do it RIGHT then to mess up and cause yourself and people you love a multitude of problems. Think out of the box, but realize you live within a culture that DEMANDS certain things as rites of passage if you're going to climb the cultural ladder of sucess and profit. A college degree, including a Masters nowadays, is one of those rites of passage. Don't do it, and you're excluded from all sorts of long-term benefits. Back to top Display posts from previous: All Posts1 Day7 Days2 Weeks1 Month3 Months6 Months1 Year Oldest FirstNewest First Job Discussion Forums Forum Index -> Newbie Forum All times are GMT Page 1 of 1 Jump to: Select a forum Where to Begin----------------General DiscussionNewbie ForumCurrent Events ForumTechnology ForumOnline Teaching Forum Africa Forums----------------General Africa Forum Asia Forums----------------CambodiaChina (Job-related Posts Only)China (Off-Topic)Hong KongIndiaIndonesiaJapanMalaysiaPhilippinesSingaporeTaiwanThailandGeneral Asia ForumVietnam Caribbean Forums----------------General Caribbean Forum Europe Forums----------------Czech RepublicFranceGermanyGreeceItalyMacedonia and the BalkansPolandRomaniaRussia & C.I.S.SpainTurkeyUkraineUnited KingdomGeneral Europe Forum Latin America Forums----------------ArgentinaBrazilChileColombiaCosta RicaMexicoMexico (off-topic)PeruGeneral Latin America Forum The Middle East Forums----------------BahrainEgyptIsraelKuwaitOmanQatarSaudi ArabiaUnited Arab EmiratesGeneral Middle East Forum North America Forums----------------General North America Forum Oceania----------------Australia/New Zealand You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot vote in polls in this forum This page is maintained by the one and only Dave Sperling. Contact Dave's ESL Cafe Copyright © 2018 Dave Sperling. All Rights Reserved. Powered by phpBB © 2001, 2002 phpBB Group Teaching Jobs in China


text:
+ − Contact Information
+ − Biography
HAGEL, Charles Timothy (Chuck), a Senator from Nebraska; born in North Platte, Nebraska, October 4, 1946; graduated from St. Bonaventure High School, Columbus, Neb.; graduated from the Brown Institute for Radio and Television, Minneapolis, MN, 1966; graduated from University of Nebraska, Omaha, 1971; served in the U.S. Army infantry, attaining the rank of Sergeant E-5, 1967-1968, and serving in Vietnam in 1968; newscaster and talk show host in Omaha 1969-1971; administrative assistant to Representative John Y. McCollister (R-Neb.) 1971-1977; manager of government affairs for Firestone Tire & Rubber Company, Washington, D.C. 1977-1980; deputy administrator, United States Veterans Administration, 1981-1982; investment banker and business executive in Washington and Omaha; deputy director and chief executive officer of the Economic Summit of Industrialized Nations (G-7) in 1990; elected as a Republican to the United States Senate in 1996; reelected in 2002, and served from January 3, 1997, to January 3, 2009; was not a candidate for reelection in 2008; Secretary of Defense in the Cabinet of President Barack Obama, 2013-.

subset: commoncrawl


text:
Here is some important information for riders and manufacturers regarding the scoring of course racing events in 2011.
In 2011, all official event results (this includes world championships, continental championships, PKRA tour events and continental tour events) will be still based on the results of the open division.
The open division includes all riders that signed up for the event, regardless of if they are racing on custom or production equipment.
To encourage competition in the production division (which will be the only allowed equipment from 2012 on !) the IKA will produce a separate production ranking, where only competitors that comply with the production division requirments, are scored.
To be scored in the production division, you need to register ONE board and THREE kites only for the competition. Forms will be available during event registration.
The boards eligible to compete are listed in the always updated IKA registered production board list, which can be found here: http://www.internationalkiteboarding.org/images/documents/etc/registered%20boards.pdf
Producers that want to register their boards, please contact the IKA Executive Office.
The kites used for competitions in 2011 may be still custom, but with a maximum size of 19m.
From 2012 on, ONLY ONE registered production BOARD and a maximum of THREE registered production KITES are allowed to be used per competition, including all world, continental, PKRA, KTE and KTA course racing events.


text:
S.F. plane crash: How rescuers saved victims
Lt. Christine Emmons works at an airport fire station known throughout the San Francisco Fire Department as "the crash house" for its close proximity to the runways.
At 11:27 a.m. Saturday, that nickname became reality when a voice from the airport control tower crackled through Emmons' radio: "Alert 3, Alert 3, plane crash, plane crash."
"I knew from her voice that the event we were going to was real," Emmons said Monday.
Within minutes, she and other firefighters were scrambling up the inflatable chutes of Asiana Airlines Flight 214, even as black smoke billowed out and passengers slid down to escape.
In the back of the plane - which had lost its tail after clipping a seawall short of the runway - they joined a city police officer wearing no protective gear and rescued four injured victims, including one who was trapped.
The account of the first responders emerged at a news conference in which firefighters described a chaotic, rapidly changing scene after the crash, which killed two girls and injured dozens of other people.
'Surreal' scene
"It seemed to be surreal, like it wasn't happening," said fire Lt. Dave Monteverdi.
Emmons said that as she drove across the tarmac toward the crash, she saw a huge column of smoke. "Adrenaline was flowing," she said, "and I had to keep reminding my driver, if we don't get there, we won't be able to help anybody."
The firefighters found the Boeing 777 on its belly, with jet fuel leaking from the left wing and passengers streaming down the chutes. Firefighters were hearing from the crew that some passengers were still trapped inside, and some crew members were unaccounted for.
Monteverdi climbed a chute from a left-side door, along with Emmons and firefighter-paramedic Mike Kirk. A hose line was fed to them, they said, and they knocked down flames in the fuselage.
Stuck in debris
Kirk soon radioed that he had found one flight attendant and four passengers still in the back of the plane, including an elderly man and a person who was stuck in debris.
There was less smoke in the back but more damage from the landing. "It was hectic," Emmons said. "The back of the plane did not hold up as well as the front of the plane."
One of two people put on backboards, Monteverdi said, was a woman who appeared to have fractured legs. One man was groaning, and the crew had little time to assess his injuries.
"We were running out of time," Monteverdi said. "The smoke was getting thicker and thicker. We had no choice. We stood him up. Amazingly, he began shuffling his feet."
Officer rushes in
The firefighters said they were shocked to see San Francisco police Officer Jim Cunningham inside the plane helping out, wearing only his uniform.
Cunningham said he had heard the call come through the radio and rushed to the scene just as the chutes were deployed, bringing with him an ambulance he had waved down on his way to the crash.
Outside the plane, he said, he and his partner, Officer Derrick Lee, threw knives up to the crew so they could cut passengers out of their seat belts as jet fuel "gushed out like a fire hose" near him.
"We kept trying to get the crew off, but they were really brave," Cunningham said. "They wanted to stay with the plane."
Cunningham cleared away luggage and other debris that was blocking a hole where the tail used to be. As he looked up into the plane through the opening, he said, "it didn't look like they had enough people." So he went in.
'Didn't think about it'
"I was just running back and forth trying to help people," Cunningham said. "I didn't think about it. I just knew people were trapped in there. I just thought, 'I'm kind of a tough guy, I can hold my breath if there's a lot of smoke.' "
At one point, he said, he picked up an iPhone, flicked it on, saw a picture of a mother and daughter and thought, "Someone's going to want this." He pocketed the phone and turned it over to a person who could track the owner down.
Even after he left the plane, Cunningham was worried there had been a miscommunication. He had heard that more people were onboard than he had found.
"I wanted to go back in and look through the rubble," he said. "I started crying because I was thinking I screwed up and somebody got killed."
Ultimately, everyone the first responders found aboard the plane was helped to safety. "I feel very lucky and blessed we were able to get those people out," Emmons said.
Vivian Ho and Demian Bulwa are San Francisco Chronicle staff writers. E-mail: firstname.lastname@example.com, email@example.com Twitter: @vivianho, @demianbulwa


text:
Subscribe to RSS headline updates from: Powered by FeedBurner
I'm so excited about these new title cards. One thing I found doing project life, is that it's nice to have the cards in all different colors. With this set you get almost every design in all THIRTY colors.
These go great with our Everyday Life Templates 2013 Sets 1 & 2, but they can work with any project life layouts. :)


text:
GeeXLab 0.29.9 for all platforms
0 Members and 1 Guest are viewing this topic.
At GDC we had the opportunity to check out the latest from iZ3D, a company that has been making stereoscopic drivers for quite a while now. Their drivers can enable stereo viewing on any PC through anaglyph (the red and blue tinted images we are all familiar with) in addition to working with other technologies. Most recently, iZ3D has introduced a stereoscopic viewing system that makes use of an actively polarized monitor and passive glasses in order to bring simple and easy to use stereoscopic viewing to the masses without the color distortion associated with anaglyph.


text:
Young animals may seem abandoned but are seldom alone in the wild; "rescue," however, may kill them
PRATT — Spring is a time of rebirth and birth, with trees budding and young wildlife being born and hatched, and different levels of parental care are employed within the animal kingdom, all designed to work without human interference. But one common problem occurs when seemingly abandoned or orphaned wildlife are picked up by well-intentioned persons, often with tragic results.
Mammals such as deer often leave their young to search for food. Deer fawns are born with natural camouflage and little scent, making it difficult for predators to detect them. A spotted coat helps hide young as they sit motionless in surrounding cover. These adaptations make it possible for the doe to move about and feed, maintaining her strength as she provides for her young. Raccoons and other mammals employ similar strategies.
Well-meaning individuals sometimes discover young deer, raccoons, foxes, rabbits, or skunks and assume that they are orphaned or abandoned. Usually, the mother is close at hand but out of sight waiting for the human intruders to leave the area. In this situation, it is extremely important to leave the animals as found in the wild. To pick them up and take them home is illegal, for good reason. Wild animals often have very specific dietary requirements and often die under human care. Those that do survive have little chance of surviving if returned to the wild.
Another reason to avoid picking up wild animals is health. Wild animals carry diseases and parasites that can infect humans or their pets. Dogs, if not vaccinated, may contract distemper from infected coyotes, foxes, or even weasels. Bobcats can transmit a similar disease to domestic cats. Ticks from host animals can expose humans to Lyme disease, and perhaps the greatest danger wild animals pose to humans is rabies. Many animals can carry rabies for several days without showing any outward symptoms.
Pet dogs and cats should also be restrained during the season when young birds, rabbits, and other wildlife are young. Both dogs and cats can be deadly to wild young, no matter how friendly they may seem to humans.
It can be a wonderful experience to see young animals in the wild, but for the benefit of the wildlife, it is important to leave them in the wild, where they are best equipped to survive.


text:
Welcome to Wordpress blog!October 6th, 2007
Wordpress - is a content management system (CMS) specifically developed to manage frequently changing content. Wordpress is ideal for creation of web blogs as for example:
Wordpress allows publishing of data with typographic filters for proper formatting and styling of text. Publications can be categorized and archived. Internal system of links is optimized for search engines. Static pages can also be created. Wordpress allows for publishing of a group of authors.
The documentation and description of Wordpress can be found here
You can start working with the blog right away. If you do not require the blog it can be switched off from the Admin Panel.


text:
Je Porte Mon Bebe JPMBB Black
Je Porte Mon Bebe JPMBB Black
An evening in April. We're sitting on a bench in the shadow of the Arc de Triomphe, just hanging out, after a long day 'seeing the sights.'
Then it started to rain. But he didn't move. It continued to rain. Still, he didn't move.
"Crikey", I think, "tell me he doesn't think this is romantic?"
"This is romantic, isn't it?" he croons.
No. It's wet. And now I'm cold. Call me a practical realist.
Like when you have a newborn and both of you know he's happiest being held, with his head on your chest (ahh the scent of their little heads ♥). But do you ever need to get things done! Same practical reality.
Enter the JPMBB - another Parisienne great!
Skipping on the bus, hands free. Pre-tied shopping trips. And snuggles! Liberating.
Feels good, doesn't it?
Quite simply, the JPMBB is awesome.
You want to carry your baby; you want to keep them close and secure. You want the soft mouldable comfort of a stretchy wrap with the useability of being able to pre-tie your wrap. The Je Porte Mon Bebe wrap allows you to do all of this. They are the gold standard of stretchy wraps, the creme de la creme ♥
The fabric used in the wrap is dense, stretchy and breathable - most certainly not average t-shirt fabric. Incredibly supportive, the wrap moulds to babies' body like a second skin. The JPMBB wrap can be pre-tied prior to putting baby in ♥
|Je Porte Mon Bebe - JPMBB


text:
With the money I've made on my TSLA stock since I bought it about 6 weeks ago I've almost paid for my Model S, which was delivered about a week before my stock purchase.
Way to go Elon! You're a bloody genius - a cross between Einstein and Steve Jobs.
soon you can order an X


text:
Motorola Moto X Hybrid Slim Armored Dual Layer Protective Kickstand Case from i-Blason (TM)
This case is ONLY for the new Motorola Moto X Smart Phone by Google. It will NOT fit any other Motorola phones.
I-Blason premium hybrid dual layer kickstand case provides the ultimate protection without adding lots of bulk to your Moto X. It boasts of a great combination of polycarbonate and silicone. We use the finest materials to create this case: The inner case part is made of silicone, which gently protects your Moto X from scratches and impact. On the top of the silicone case is a removable polycarbonate cover with rubberized finish. It is anti-fingerprint, dust proof, and provides a comfortable grip. The side of the case is slightly higher than the Motorola X screen. Hence, the case can not only protect the side of your phone, but also your screen. With this case, you will experience the peace of mind of knowing your investment is well protected. Flexible, yet stronger. The inner layer of silicone case offers excellent shock absorption and abrasion resistance while maintaining a thin form factor. Why not build a changeable wardrobe for your phone?
Product Features
- i-Blason Logo (TM) Bearing Dual Layer Hybrid Armored Kickstand Case
- Sepcifically designed for 2013 Motorola Moto X Smart Phone by Google
- Dual Layer Hybrid Design Case for Ultra Performance and Protection (Silicone + Hard Shell)
- Built-in Kickstand for the convenience of watching video and chatting
- Enlarged Camera Cutout Opening to Eliminate Wash Out Effect and Optimized Picture Quality
- Provide extra cushion/protection when drop
- Light Weight and Easy to Install
- Quick and easy access to all Moto X features Screen Display, Dock Connector, Headphone port, microphone, and Camera Lens.
- Multi-color to Choose From and Customize to Your Own Taste


text:
I spent last few days digging into Spring Security User Guide documentation. I had not much experience with this product before, so I thought it is the right time to learn it. I was motivated by the analysis I was doing recently for some project: one of the requirements was building the flexible access control module, allowing for granting fine-grained permissions on per-user, per-object and per-operation basis. This kind of authorization is not possible with standard role-base Java EE approach. I wanted to know how it is solved in real-world systems. As a Spring-addict, my first choice to look at was Spring Security. Spring Security solves the problem with its ACL package.
I read the user guide, and found it not clear enough. It gives some background, but many things are not explained good enough. I started analysing the sample application bundled with Spring Security realease, and JavaDocs, but the complexity of Spring Security was overwhelming. I wanted to implement some simple proof-of-concept application using Spring Source ACL. I believe Spring Security is powerful solution, but amount of interfaces, classes, dependencies, configuration required, makes it hard to learn. Just look at the sample contacs application: the authorization configuration (
applicationContext-common-authorization.xml) requires almost 20 spring beans in context, many of them are just infrastructure classes (and it doesn't contain the definitions of actual ACLs). Why there are no simply defaults for most settings? (Take for example the
aclService bean: why do I have to explicitely define the cache stategy and lookup strategy? Why there is no constructor assuming default values? as a result, I blindly copy the configuration from sample.)
I was still lost, so I looked around for some tutorial, and found A Spring Security ACL tutorial for PostgreSQL. It looked promising, but it turned out to be not less complicated than contacts sample. After long fight, finally I managed to build my simple application, using Spring Security ACL concepts, but with simplified implementations. It took me long time, and I wasn't able to find any such example on the net - so I decided to publish my results. I hope you will find it helpful in learning Spring Security ACL.
Imagine the following scenario. We have a company. Each employee in this company is obliged to provide some work reports to his manager. Manager is allowed to accept the report (or not - but this is not relevant here). Only employee can create report. Only manager can accept it. So far it's easy and can be solved with roles-based solution. The key point, however, is that manager can't accept all reports - only reports submitted by his subordinate employee. Let's say we have four employees and 2 managers. Employees empl1 and empl2 are assigned to manager1, and empl3 and empl4 are assigned to manager2. So manager1 can only accept reports of empl1 and empl2, but not those of empl3 and empl4. This cannot be easily solved with roles. Instead, we will use Spring Security ACLs.
Domain model
We have very simple object model here: the Report class with id, description, acceptation flag, and reference to the owner User; and the User class itself, containing only login name field (obviously, this is extremely simplified model when compared with any real applicaton - but this will help us focus on the main subject). Below is the code of our model classes:
package springacltutorial.model;
public class User {
public User(String login) {
this.login = login;
private String login;
public String getLogin() {
return login;
package springacltutorial.model;
public class Report {
private long id;
private String description;
private boolean accepted;
private User user;
public long getId() {
return id;
public void setId(long id) {
this.id = id;
public String getDescription() {
return description;
public void setDescription(String description) {
this.description = description;
public boolean isAccepted() {
return accepted;
public void setAccepted(boolean accepted) {
this.accepted = accepted;
public User getUser() {
return user;
public void setUser(User user) {
this.user = user;
Service layer and data access
Let's implement our service class, named
ReportsServices. It has only two methods: one for creating new reports (by employees) and second one for accepting reports (by managers). We also use simple map-based DAO for accessing the reports. For simplification, we will not use separate interface and class implementation, but only concrete classes. Spring is able to handle it with help of CGLIB. Here is the code of the classes:
package springacltutorial.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.Authentication;
import org.springframework.security.annotation.Secured;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import springacltutorial.dao.ReportsDao;
import springacltutorial.model.Report;
import springacltutorial.model.User;
public class ReportServices {
ReportsDao dao;
// this method should be accessible only to users with role EMPLOYEE
public long addReport(String description) {
Report report = new Report();
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
if (auth.getPrincipal() instanceof UserDetails) {
report.setUser(new User(((UserDetails) auth.getPrincipal()).getUsername()));
} else {
report.setUser(new User(auth.getPrincipal().toString()));
return report.getId();
// this method may be called only by user with role MANAGER, being manager
// of user linked to the report
public void acceptReport(Report report) {
package springacltutorial.dao;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Repository;
import springacltutorial.model.Report;
public class ReportsDao {
private long sequence;
private Map<Long, Report> reports = new HashMap<Long, Report>();
public void saveReport(Report report) {
if (report.getId() == 0) {
reports.put(report.getId(), report);
public Report getReportById(long reportId) {
return reports.get(reportId);
The method
addReport must make sure that the owner of the new report is the currently logged-in user. Because of this, we had to add some Spring Security specific code to get the name of current user. This seems not the ideal solution, but I cannot find anything better than this. As you also see, I use Spring 2.5 stereotype annotations, so that I don't have to enlist my beans in Spring config file. Here is the Spring config file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="springacltutorial"/>
At this moment, we have most of our application ready. We won't focus on client code calling the service in this tutorial, as this doesn't matter much. Instead, let's write some tests. First the test focusing only on functional site of the service class:
package springacltutorial.services;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springacltutorial.dao.ReportsDao;
import static org.junit.Assert.*;
public class ServicesTest {
public void setup() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-business.xml");
reportServices = (ReportServices) BeanFactoryUtils.beanOfType(context, ReportServices.class);
dao = (ReportsDao) BeanFactoryUtils.beanOfType(context, ReportsDao.class);
ReportServices reportServices;
ReportsDao dao;
public void testAddReport() {
long id = reportServices.addReport("springacltutorial");
assertEquals("springacltutorial", dao.getReportById(id).getDescription());
public void testAcceptReport() {
long id = reportServices.addReport("springacltutorial");
assertEquals(false, dao.getReportById(id).isAccepted());
assertEquals(true, dao.getReportById(id).isAccepted());
For building and running the application, following Maven
pom.xml file will be helpful:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
If you run the test now, it should pass. So - we have the functional application, but without any security imposed on it. Let's add authorization now.
Now we come to the main point of this tutorial: authorization. First we add the second spring context file, named
applicationContext-security.xml. Initially, it will contain definition of
UserService (logins, passwords and roles of users):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<security:authentication-provider >
<security:password-encoder hash="plaintext"/>
<security:user name="empl1" password="pass1" authorities="ROLE_EMPLOYEE" />
<security:user name="empl2" password="pass2" authorities="ROLE_EMPLOYEE" />
<security:user name="empl3" password="pass3" authorities="ROLE_EMPLOYEE" />
<security:user name="empl4" password="pass4" authorities="ROLE_EMPLOYEE" />
<security:user name="manager1" password="pass1" authorities="ROLE_MANAGER" />
<security:user name="manager2" password="pass2" authorities="ROLE_MANAGER" />
<security:user name="testUser" password="" authorities=""/>
Now we can write a test:
package springacltutorial.services;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.AccessDeniedException;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import springacltutorial.dao.ReportsDao;
import springacltutorial.model.Report;
public class ServicesAuthorizationTest {
public void setup() {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext-business.xml", "applicationContext-security.xml" });
reportServices = (ReportServices) BeanFactoryUtils.beanOfType(context, ReportServices.class);
dao = (ReportsDao) BeanFactoryUtils.beanOfType(context, ReportsDao.class);
ReportServices reportServices;
ReportsDao dao;
public void testAddReport() {
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("empl1", "pass1"));
// now use user without EMPLOYEE role
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("testUser", ""));
try {
fail("should throw AccessDeniedException");
} catch (AccessDeniedException e) {
return; // ok
public void testAcceptReport() {
// empl1 creates report
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("empl1", "pass1"));
Report reportEmpl1 = dao.getReportById(reportServices.addReport("springacltutorial"));
// empl3 creates report
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("empl3", "pass3"));
Report reportEmpl3 = dao.getReportById(reportServices.addReport("springacltutorial"));
// manager1 accepts report of empl1 - ok
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("manager1", "pass1"));
assertEquals(false, reportEmpl1.isAccepted());
assertEquals(true, reportEmpl1.isAccepted());
// manager1 tries to accept report of empl3 - access denied
assertEquals(false, reportEmpl3.isAccepted());
try {
fail("manager1 cannot accept reports of empl3");
} catch (AccessDeniedException e) {
// ok
assertEquals(false, reportEmpl3.isAccepted());
// manager2 accepts report of empl3 - ok
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("manager2", "pass2"));
assertEquals(true, reportEmpl3.isAccepted());
If you run the test, it will fail, because there is no access control imposed on methods. This is what we have to do now.
addReport method is simple: each user with granted role EMPLOYEE can call it; user without this role can't. So we simply specify the role based authorization access for this method. We can do it from context configuration file, but it is simpler with annoation:
public long addReport(String description) {
Note that default Spring Security voter which deals with roles takes into account only those configuration attributes that match the pattern "ROLE_*", this is why we called the role ROLE_EMPLOYEE, not simply EMPLOYEE.
In case of
acceptReport method by analogy we can use annoation
@Secured("ROLE_MANAGER"). This is ok, but not enough. We have following requirement: the user may call this method if he has manager role, and is the manager of the user who created the report. So we put the second configuration attribute on the method, this time called freely, let it be ACL_REPORT_ACCEPT:
@Secured( { "ROLE_MANAGER", "ACL_REPORT_ACCEPT" })
public void acceptReport(Report report) {
That's all we have to do in the
ReportServices class. Now we switch to the configuration file
applicationContext-security.xml and define the mechanism for processing role-based access (with standard
RoleVoter - easy part) and the mechanism for processing ACL-based access (Spring Security ACL - hard part).
ACL mechanism
I assume that you already at least scanned through Spring Security user guide, and you know some basic notions of ACL concept described there. I must say that I found the section in user guide describing ACLs not clear enough. It does not highlight the key interfaces and relationships betweent them, but instead it jumps fast into the JDBC-based implementation, desribing the 4 tables that must be set up for this implementation. This gives the impression that this is the only way of using ACLs, and that the model of those tables actually the model of ACLs. But this is not. The JDBC-based implementation is, as far as I understand, the production-ready implementation, and uses some optimisations, like efficient SQL queries, caches, lazy loading etc. The database model is not in 1:1 relationship to the core ACL model.
I prefer approaching it in a different way: first learn the core model (interfaces). Than look at some extremely simple implementation, without any optimisation, persistence etc (if possible) and check if it works and if the model/API fits my expectations. Only then look at production-ready implementations, with all their complexity.
So let's look at ACL model. The main interface is
Acl, representing access control list for given domain object. It contains list of
AccessControlEntry objects, and the
ObjectIdentity. Interface
ObjectIdentity provides indirect represention of domain object.
Acl doesn't keep direct reference to domain object for which this ACL was defined - instead it uses
ObjectIdentity knows the type of Java class of the domain object, and identifier of the specific instance of this class. How this identifier is defined and retrieved depends on implementation. Default implementation assumes that domain object has the method
getId(), returning type compatible with
AccessControlEntry (ACE) represent individual permission assignment. It has unique
id, reference to
Acl itself (note: bidirectional relationship between ACL and each ACE), the
Permission, and the
Sid. Interface
Sid (stands for: Secure Identity) is a kind of common abstraction for user names (
PrincipalSid implementation) and user roles (
GrantedAuthoritySid implementation). So here
Sid represents user (or role) to whom the
Permission is granted (or revoked, depending on
granting flag). So each ACE means: the specific
Sid (user or role) is granted or revoked the specific
Permission (read, write, delete, accept, ...) on the domain object for which the ACL is defined.
Collection of ACEs and
ObjectIdentity are two main components of
Acl. Additionally
Acls can build inheritance trees, so each
Acl can optionally reference its parent (if implementation supports it). Also optionally,
Acl can have the owner, represented by
Sid object, if implementation supports it. Each ACE must be immutable. ACL can be mutable (for this purpuse there is a specific subinterface:
MutableAcl, with methods like
Acl contains one "real" method:
isGranted, containing actual authorization logic.
ACL model interfaces constitute one side of the whole picture. The second side is ACL access API. The central interface here is
AclService, providing retrieval of ACLs for given
ObjectIdentity, through the set of overloaded
readAclById and
readAclsById methods. The whole picture is completed by the
AclEntryVoter class, which is an ACL-specific implementation of the standard Spring Security
AccessDecisionVoter interface. It is responsible for giving "opinions" (votes) about whether the current user should be granted access for protected resource or not (opinion may be of three types: "grant him access", "deny access", or "that's not my business, so I abstain from voting"). The final decision about granting user the access is taken by
AccessDecisionManager, which takes into account all the votes of all registered voters (depending on different implementations, the final decision may differ).
How does it all work?
Let's take the method
acceptReport from our tutorial application. The method itself is the protected resource, and we want to restrict access to it only to users with MANAGER role, and what's more only actual manager of the user who created the report should be able to accept it. As you remember, we put on the method the restriction annotation with two configuration attributes:
@Secured( { "ROLE_MANAGER", "ACL_REPORT_ACCEPT" }). For that to work, we have to define two voters. First is the standard
RoleVoter. When
AccessDesicionManager asks this voter about its opinion on the first configuration attribute (ROLE_MANAGER), this voter will see that the parameter starts with "ROLE_" prefix, so it will check if the currently operating user has the ROLE_MANAGER role. If it has this role, voter will vote for "grant him access". Otherwise, it will vote for "deny access". Then
AccessDesicionManager asks this voter about its opinion on the second configuration attribute (ACL_REPORT_ACCEPT), and the voter will abstain from voting, because it does not match the ROLE_* pattern. This way we have done with the role checking.
Now we have to define the second voter, this time of type
AclEntryVoter, with following configuration: reference to
AclService; the string with configuration attribute that should trigger the voter to actually vote ("ACL_REPORT_ACCEPT" in our case); the list of required permissions that must be found in ACL for this user to grant him access; and the Java type of the domain object, for which the ACL will be used. During method call, the voter analyses all the method parameters and searches for the one compatible with the specified Java type. Once found, the voter will ask the actual object passed under this parameter for the identificator (how? we said earlier: by deafult, it expects the object to have method
getId() returning type compatible with
long). Having Java type and id, the voter constructs
ObjectIdentification from them and then asks
AclService for the
Acl linked to this
ObjectIdentification. After obtaining
Acl, it calls its method
isGranted, passing the list of required permissions as configured for this voter, and array of
Sids of current user. The outcome of this method (boolean value) decides on the voter outcome (grant or deny). If the configuration attribute passed to this voter during call from
AccessDesicionManager is different than the one for which this voter is configured, the voter will abstain from voting. In our example application the
AccessDesicionManager will ask the
AclEntryVoter first for ROLE_MANAGER, and voter will abstain, and then ask for ACL_REPORT_ACCEPT and this time voter will voter "grant" or "deny", depending on current user, the domain object passed as protected method argument, and the ACL configurations. After calling two voters for two configuration parameters, the
AccessDesicionManager will finally decide on granting access or not, based on collected votes.
As you see, we have to configure following beans in Spring context: the
AccessDecisionManager implementation fed with two voters, namely
RolesVoter and
AclEntryVoter; and the
AclService implementation to be used by
AclEntryVoter. Additionally we can define our custom ACCEPT
Permission (there are five built-in permissions: READ, WRITE, CREATE, DELETE, ADMINISTRATION - we may use any of it, but neither fits perfectly our needs, so we can easily define our own).
Spring security provides us with several
AccessDecisionManager implementations - we will use
UnanimousBased, as we require that both voters vote for "yes" before we let the method call continue. Spring Securiry contains also one production-ready implementation of
AclService, namely
JdbcAclService and its subclass
JdbcMutableAclService. This class stores and retrieves ACLs to and from database. It requires the predefined structure of 4 tables - you may find details in Spring Security documentation. Configuration of this implementation is complex, too complex for simple prototyping solutions in my opinion. Because of this, we're going to implement this service on our own, to use in-memory stored ACLs. We will also write our own implementation of
Acl, beacue the built-in
AclImpl implements several other interfaces, which makes it unnecessarily complicated.
It's right time to implement it
First we code our ACCEPT permission, extending the built-in
BasePermission class:
package springacltutorial.infrastructure;
import org.springframework.security.acls.Permission;
import org.springframework.security.acls.domain.BasePermission;
* Adds ACCEPT permission to standard set of Spring Security permissions.
* Based on BasePermission code.
public class ExtendedPermission extends BasePermission {
private static final long serialVersionUID = 1L;
public static final Permission ACCEPT = new ExtendedPermission(1 << 5, 'a'); // 32
* Registers the public static permissions defined on this class. This is
* mandatory so that the static methods will operate correctly. (copied from
* super class)
static {
private ExtendedPermission(int mask, char code) {
super(mask, code);
The char code is used only for textual-representation of the permission, and has no influence on any logic.
BasePermission uses capital letter 'A' for ADMINISTRATION, so I used 'a' for ACCEPT. As I said, it really doesn't matter. We used sixth bit (
1 << 5) in the internal
Permission implementation (first five bits are used by built-in types). I will not dig into internals of
Permissions concept, as it is well described in Spring security documentation and not very difficult. Now we turn our attation to
Acl implementation:
package springacltutorial.infrastructure;
import org.springframework.security.acls.AccessControlEntry;
import org.springframework.security.acls.Acl;
import org.springframework.security.acls.NotFoundException;
import org.springframework.security.acls.Permission;
import org.springframework.security.acls.domain.AuditLogger;
import org.springframework.security.acls.domain.ConsoleAuditLogger;
import org.springframework.security.acls.objectidentity.ObjectIdentity;
import org.springframework.security.acls.sid.Sid;
* Very simple implementation of Acl interface, based on
* org.springframework.security.acls.domain.AclImpl source (mainly the isGranted
* method code). This implementation neither use owner concept nor parent
* concept.
public class SimpleAclImpl implements Acl {
private static final long serialVersionUID = 1L;
private ObjectIdentity oi;
private AccessControlEntry[] aces;
private transient AuditLogger auditLogger = new ConsoleAuditLogger();
public SimpleAclImpl(ObjectIdentity oi, AccessControlEntry[] aces) {
this.oi = oi;
this.aces = aces;
public AccessControlEntry[] getEntries() {
return aces;
public ObjectIdentity getObjectIdentity() {
return oi;
public Sid getOwner() {
return null; // owner concept is optional, we don't use it
public Acl getParentAcl() {
return null; // we don't use inheritance
public boolean isEntriesInheriting() {
return false; // we don't use inheritance
public boolean isGranted(Permission[] permission, Sid[] sids, boolean administrativeMode) throws NotFoundException {
AccessControlEntry firstRejection = null;
for (int i = 0; i < permission.length; i++) {
for (int x = 0; x < sids.length; x++) {
// Attempt to find exact match for this permission mask and SID
boolean scanNextSid = true;
for (int j = 0; j < aces.length; j++) {
AccessControlEntry ace = (AccessControlEntry) aces[j];
if ((ace.getPermission().getMask() == permission[i].getMask()) && ace.getSid().equals(sids[x])) {
// Found a matching ACE, so its authorization decision
// will prevail
if (ace.isGranting()) {
// Success
if (!administrativeMode) {
auditLogger.logIfNeeded(true, ace);
return true;
} else {
// Failure for this permission, so stop search
// We will see if they have a different permission
// (this permission is 100% rejected for this SID)
if (firstRejection == null) {
// Store first rejection for auditing reasons
firstRejection = ace;
scanNextSid = false; // helps break the loop
break; // exit "aces" loop
if (!scanNextSid) {
break; // exit SID for loop (now try next permission)
if (firstRejection != null) {
// We found an ACE to reject the request at this point, as no
// other ACEs were found that granted a different permission
if (!administrativeMode) {
auditLogger.logIfNeeded(false, firstRejection);
return false;
throw new NotFoundException("Unable to locate a matching ACE for passed permissions and SIDs");
public boolean isSidLoaded(Sid[] sids) {
// we use in-memory structure, not external DB, so all entries are
// always loaded
// (if I correctly understand meaning of this method)
return true;
As you see, it is pretty straightforward. The only logic is contained in
isGranted method - which is a slightly simplified copy of the code from the standard Spring Security
AclImpl class. The usage of
AuditLogger is not necessary, but it was already there, so I decided to use it - it may be helpful to see on the console what's going on inside.
Finally, we need
AclService implementation:
package springacltutorial.infrastructure;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.springframework.security.acls.AccessControlEntry;
import org.springframework.security.acls.Acl;
import org.springframework.security.acls.AclService;
import org.springframework.security.acls.NotFoundException;
import org.springframework.security.acls.domain.AccessControlEntryImpl;
import org.springframework.security.acls.objectidentity.ObjectIdentity;
import org.springframework.security.acls.objectidentity.ObjectIdentityImpl;
import org.springframework.security.acls.sid.PrincipalSid;
import org.springframework.security.acls.sid.Sid;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import springacltutorial.model.User;
* The simplest possible implementation of AclService interface. Uses in-memory
* collection of ACLs, providing fast and easy access to them.
public class InMemoryAclServiceImpl implements AclService {
Map<ObjectIdentity, Acl> acls = new HashMap<ObjectIdentity, Acl>();
public void initializeACLs() {
// create ACLs according to requirements of tutorial application
ObjectIdentity user1 = new ObjectIdentityImpl(User.class, "empl1");
ObjectIdentity user2 = new ObjectIdentityImpl(User.class, "empl2");
ObjectIdentity user3 = new ObjectIdentityImpl(User.class, "empl3");
ObjectIdentity user4 = new ObjectIdentityImpl(User.class, "empl4");
Acl acl1 = new SimpleAclImpl(user1, new AccessControlEntry[1]);
acl1.getEntries()[0] = new AccessControlEntryImpl("ace1", acl1, new PrincipalSid("manager1"), ExtendedPermission.ACCEPT, true, true, true);
acls.put(acl1.getObjectIdentity(), acl1);
Acl acl2 = new SimpleAclImpl(user2, new AccessControlEntry[1]);
acl2.getEntries()[0] = new AccessControlEntryImpl("ace2", acl2, new PrincipalSid("manager1"), ExtendedPermission.ACCEPT, true, true, true);
acls.put(acl2.getObjectIdentity(), acl2);
Acl acl3 = new SimpleAclImpl(user3, new AccessControlEntry[1]);
acl3.getEntries()[0] = new AccessControlEntryImpl("ace3", acl3, new PrincipalSid("manager2"), ExtendedPermission.ACCEPT, true, true, true);
acls.put(acl3.getObjectIdentity(), acl3);
Acl acl4 = new SimpleAclImpl(user4, new AccessControlEntry[1]);
acl4.getEntries()[0] = new AccessControlEntryImpl("ace4", acl4, new PrincipalSid("manager2"), ExtendedPermission.ACCEPT, true, true, true);
acls.put(acl4.getObjectIdentity(), acl4);
public ObjectIdentity[] findChildren(ObjectIdentity parentIdentity) {
// I'm not really sure what this method should do...
throw new UnsupportedOperationException("Not implemented");
public Acl readAclById(ObjectIdentity object, Sid[] sids) throws NotFoundException {
Map<ObjectIdentity, Acl> map = readAclsById(new ObjectIdentity[] { object }, sids);
Assert.isTrue(map.containsKey(object), "There should have been an Acl entry for ObjectIdentity " + object);
return map.get(object);
public Acl readAclById(ObjectIdentity object) throws NotFoundException {
return readAclById(object, null);
public Map<ObjectIdentity, Acl> readAclsById(ObjectIdentity[] objects) throws NotFoundException {
return readAclsById(objects, null);
public Map<ObjectIdentity, Acl> readAclsById(ObjectIdentity[] objects, Sid[] sids) throws NotFoundException {
Map<ObjectIdentity, Acl> result = new HashMap<ObjectIdentity, Acl>();
for (ObjectIdentity object : objects) {
if (acls.containsKey(object)) {
result.put(object, acls.get(object));
} else {
throw new NotFoundException("Unable to find ACL information for object identity '" + object.toString() + "'");
return result;
As you see, I put the initialization method which populates the
acls map with data needed for this tutorial (in any real-life application such configuration wouldn't be hardcoded in Java class). We define four ACLs with single ACE each: Two for manager1 (accept reports of empl1 and empl2) and similar two for manager2 (accept reports of empl3 and empl4). Note that the requirement of bidirectional relationship between ACL and each ACE makes the initialization code more verbose (we cannot fully initilize ACL in one line).
We are almost done, but there are two problems left
First problem: we don't want to define the ACL for each report, because reports will be created on the fly by system users, and we don't want to be forced to keep and maintain separate ACL for each report. On the other hand, users are not added and removed from the system too often, so
User object is perfect choice as a domain object for which ACLs will be defined - and this is what we did in the initialization method of our service. So now we will have to configure our
AclEntryVoter passing it
User.class as a configuration parameter. This means, that during secured method call the voter will scan all method parameters searching for
User type (I described this procedure earlier). You see the problem? Our method
acceptReport does not have
User parameter - it takes only
Report! Three solutions come to my mind. First: define ACLs for reports, not for users. But as I said earlier, this would be impractical. Second: add second parameter of type
User to the method. I don't like it too: I don't like the fact that I have to tweak service interface for security framwork needs, and besides this would be dangerous - what if the caller passes as argument the user not being really owner of the report? The method can obviously do the check that the user passed as argument is equal to the user stored in report as owner - but this is bad too. Third solution: overwrite the way the voter retrieves the domain object. This seems the best one, so we'll use it. Normally, the voter would take the Report object passed as the
acceptReport method argument. We don't want this Report object to be passed to
AclService: instead we would like to call the
getUser() method on this object and pass the User object returned from this method. Fortunately, the
AclEntryVoter contains property
internalMethod, which does exactly that: it keeps the name of the method that must be called on domain object to retrieve actual object to be passed to the service. So we set this property to the value "getUser".
This solves the first problem. The second problem we have to deal with is following: as you remeber, the default implementation of
AclEntryVoter expects that each domain object has a method
getId returning type compatible with long, for building the
ObjectIdentity and finding ACL bound to it. Our
User domain object does not have such method. It's ID is a login of String type (like "empl1"). Having it in mind, I declared the ACLs in the
InMemoryAclServiceImpl initilization method with those string-based identifiers. There are two possible solutions for the problem. First: refactor
User class and ACLs to use long-based identifiers. This is a good solution, and in production system I would problably go this way. Using artificial identifiers is in most cases the best way to go. Here though we'll use second solution: change the way Spring Security identifies the domain object. In this case it is easy, because
AclEntryVoter uses the
ObjectIdentityRetrievalStrategy, so we can simply implement this interface and plug it in into our voter using Spring context configuration.
package springacltutorial.infrastructure;
import org.springframework.security.acls.objectidentity.ObjectIdentity;
import org.springframework.security.acls.objectidentity.ObjectIdentityImpl;
import org.springframework.security.acls.objectidentity.ObjectIdentityRetrievalStrategy;
import springacltutorial.model.User;
/** overwrite the strategy: build ObjectIdentity based on user object login property,
* instead of Spring Security default getId() call
public class UserNameRetrievalStrategy implements ObjectIdentityRetrievalStrategy {
public ObjectIdentity getObjectIdentity(Object domainObject) {
User user = (User) domainObject;
return new ObjectIdentityImpl(User.class, user.getLogin());
The last thing to do is Spring context configuration:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<security:authentication-provider >
<security:password-encoder hash="plaintext"/>
<security:user name="empl1" password="pass1" authorities="ROLE_EMPLOYEE" />
<security:user name="empl2" password="pass2" authorities="ROLE_EMPLOYEE" />
<security:user name="empl3" password="pass3" authorities="ROLE_EMPLOYEE" />
<security:user name="empl4" password="pass4" authorities="ROLE_EMPLOYEE" />
<security:user name="manager1" password="pass1" authorities="ROLE_MANAGER" />
<security:user name="manager2" password="pass2" authorities="ROLE_MANAGER" />
<security:user name="testUser" password="" authorities=""/>
<security:global-method-security secured-annotations="enabled" access-decision-manager-ref="businessAccessDecisionManager"/>
<!-- Decision manager uses two voters: one is role-based, another is ACL-based -->
<bean id="businessAccessDecisionManager" class="org.springframework.security.vote.UnanimousBased">
<property name="allowIfAllAbstainDecisions" value="true"/>
<property name="decisionVoters">
<bean id="roleVoter" class="org.springframework.security.vote.RoleVoter"/>
<ref local="aclReportAcceptVoter"/>
<!-- An access decision voter that reads ACL_REPORT_ACCEPT configuration settings -->
<bean id="aclReportAcceptVoter" class="org.springframework.security.vote.AclEntryVoter">
<constructor-arg ref="aclService"/>
<constructor-arg value="ACL_REPORT_ACCEPT"/>
<util:constant id="acceptPermission" static-field="springacltutorial.infrastructure.ExtendedPermission.ACCEPT"/>
<property name="internalMethod" value="getUser"/>
<property name="objectIdentityRetrievalStrategy">
<bean class="springacltutorial.infrastructure.UserNameRetrievalStrategy"/>
<!-- this is tricky! We have to use Report here, so that voter find it in protected method parameters; "internalMethod" will convert it to User -->
<property name="processDomainObjectClass" value="springacltutorial.model.Report"/>
<bean id="aclService" class="springacltutorial.infrastructure.InMemoryAclServiceImpl"/>
You can run again the
ServicesAuthorizationTest now: it should pass, meaning that Spring Security properly controls the access to methods based on ACL. Well done!


text:
When Samantha Jones began dating a Latina artist in Season 4 of "Sex and The City," her announcement – that she was in a lesbian relationship — came as a shock to her NYC BFFs – Carrie (Sarah Jessica Parker), Charlotte (Kristin Davis) and Miranda (Cynthia Nixon). In real life, when Cynthia began her own lesbian relationship with Christine Marinoni, there was no immediate announcement, but her friends – like co-star Kristin Davis – couldn't help but notice the blooming romance.
Kristin told the June/July 2010 issue of The Advocate that she realized something was going on because Cynthia began spending more and more time with Christine, while campaigning to reduce the number of students in classrooms in NYC schools.
"They'd be on the phone and writing speeches," Kristin said. "And I thought, She's really into this."
Cynthia, who is featured on the cover of the newest issue of The Advocate, revealed that she was surprised by the attention her relationship attracted and she was delighted to reveal her relationship publicly when the time was right.
"I was like, 'Really, we can just confirm?'" Cynthia said of her talk with her publicist and manager. "So that's what we did. It was so fantastic."
In the mag, Cynthia got candid about her relationship with Christine – a redhead who is often spotted in pressed shirts and pants.
"She's basically a short man with boobs," Cynthia laughed. "A lot of what I love about her is her butchness. I'm not saying I fell in love with her in a sexually neutral way. I love her sexuality — it's a big part of what I love about her — but I feel like it was her. It wasn't something in me that was waiting to come out. It was like, This person is undeniable. How can I let this person walk by?"
In the revealing piece, Cynthia also opened up about getting away from Miranda when she's not working on "Sex and The City" projects.
"I don't have red hair in real life, so when we're not in production, I make my way back to blond," she said. "I also stubbornly go about my life the way I always did, and sometimes it's not the smartest thing to do. I'm in places people wouldn't expect to see me, like on the subway or in line at the post office. So they just sort of feel like I look like that person, but I'm probably not that person."
Related Content from AccessHollywood.com:
VIEW THE PHOTOS: Scenes From Sex And The City: The Movie
VIEW THE PHOTOS: Guest Stars Of 'Sex And The City'
PLAY IT NOW: ShoWest 2010: Sarah Jessica Parker, Kristin Davis & Cynthia Nixon Talk 'Sex & The City 2'
PLAY IT NOW: Inside The 2010 New York GLAAD Media Awards
MORE ACCESS ON THESE TOPICS: Cynthia Nixon - Sex And The City - LGBT - Movies - TV


text:
Choosing Vegan
I've been a vegitarian for over two years, and have decided not to become a full on vegan, but to choose vegan options when available. I don't live on my own since I'm only fourteen and my mother won't allow mne to be a vegan, but I plan to start choosing vegan options as often as possible until I make my full move to vagan when I turn eighteen and move out.
I think its great that you are choosing to not eat animals at 14. It's sad to hear that your mother won't allow you to be vegan tho. Have you tried explaining with materials showing her how much better it is for a person to not eat helpless animals? My son decided to become vegetarian at 10 and now eats more like a vegan since me and his father are vegan and thats all I cook and buy. I do commend you are your choice but maybe you could try talking with her and she might come around to see your choices in what you eat as a good thing. Or at the very least a "phase" like my parents did to me when I decided to stop eating meat at your age. Keep trying, don't give up. Parents sometimes just don't understand, especially when they think its ok to slaughter animals.


text:
Yesterday Disney and Marvel Studios happily announced that Joss Whedon, the man behind The Avengers, will be back to not only write and direct its sequel, but will be overseeing Phase Two of the Marvel cinematic universe (which will also include a live-action TV series) for the next three years.
The big headline-stealing, buzz-generating announcements keep coming from Marvel Studios, but for Warner Bros., it's been a challenging path to begin organizing live-action feature films for their DC Comics lineup into something that can compete at the same game. They're taking steps in the right direction to make that happen and their answer to Joss Whedon's signing may to bring in Ben Affleck to helm Justice League.
Now that Christopher Nolan has completed The Dark Knight trilogy (and is not interested in Justice League) and director Zack Snyder's Man of Steel is set to launch DC's response to Marvel's franchise, we're about to see what fans have patiently been waiting for: a shared universe where Batman, Green Lantern and Wonder Woman can share a world with The Flash and Superman.
Variety has the scoop from several inside sources which inform them that Affleck is the only directorial candidate to have been sent Will Beall's Justice League screenplay and that he will be chatting with Warner Bros. over the next few days. Affleck, having only begun his major feature film directing career with 2007's Gone Baby Gone also wrote and directed the Oscar-nominated The Town (2010) for Warner Bros., along with the upcoming Argo which he also helmed.
Even with only a few features under his belt, Affleck has proven he can handle ensemble casts in action and drama, and his working relationship with Warner Bros. almost had him taking on Man of Steel previously. He may still get his chance to work with Superman and more interestingly, Affleck could be in front of the camera in this one as well since he's starred in the last two features he directed.
Have we found our new Bruce Wayne in the man who once played Daredevil? Funny enough, Affleck was rumored for the part 13 years ago.
From the Man of Steel panel at Comic-Con 2012, Zack Snyder finally dropped his guard about keeping his Superman story separate, much like Nolan's Batman, and he hinted that once they get "[Superman's] house in order," they will see where Henry Cavill's Clark Kent could appear next. With Green Lantern failing to earn critical acclaim, will Ryan Reynolds return as Hal Jordan for the team-up alongside Cavill?
[gallery columns="2" exclude="196173,196178"]
More importantly, when is Justice League planned for release and who will play Batman if it isn't Christian Bale? Will The Flash and Wonder Woman - both of which have scripts in development - get their introductions through solo movies before Justice League or will Warner Bros. rush Justice League first and use it as a launching pad for each hero's individual film?
There are so many questions but expect more news soon.
[poll id="361"]
Follow Rob on Twitter @rob_keyes.
Source: Variety


text: Following a question I raised a few weeks back, I would like to install tracker and see how it works with natty. The latest stable release of metatracker is 0.10.10, but unfortunately, only version 0.8.17 can be found packaged. Does anyone know how can I install tracker from source, and if anybody has already tried it, please let me know how well does it work with natty.


text:
So, you've decided to jump into CSS and start making those cool multi-column layouts - table-less style. But now, those things known as float: left; and float: right; are giving you headaches like crazy. This tutorial is here to help you. I'll show you two methods you can use to bend those headaches to your will!
As you may know, when you set the display: property of an object (like a paragraph, a div, a span),you have a choice, mainly, between block and inline. The key property when clearing floats is the block property because it will force the float'ed element(s) back into the normal document flow.
Floats take the element out of the document flow, and these methods "put them back in". You won't need to know anything about the former once you put these methods into your document. Let's begin!
Method 1: Use a "clearer" div
You've probably browsed the source of a given HTML page and found this kind of div:
...

 ...
That page is using this method to clear a float or several floats. It's very simple and still quite used. Here's how it works.

Here's some text!

Here's some more text!

#wrapper { /* This just centers the #wrapper in the center of the window. */ margin-left: auto; margin-right: auto; width: 95%; } #leftcontent { /* To the left you go! */ float: left; width: 45%; } #rightcontent { /* And to the right. */ float: right; width: 50%; } /* And here's the clearer. */ .clearer { clear: both; }
As you can see above in the HTML code, I've put the .clearer class right under the last float'ed element. This forces the two elements back into the normal document flow and makes them "inline" elements (side by side).
In the CSS, the .clearer method simply "clears" both floats, and since it's a block, it's like forcing a new line. Think of it like Lego Blocks, there has to be a block on the bottom and the blocks on top have to go along with wherever the bottom block is, so the .clearer method always comes after the two (or three) float'ed elements and says "Hey you, get back in line!"
That's that for that method, now, here's the one that I'm using...
Method 2: The Alsett Clearing Method
The aforementioned method is great and all for clearing floats and it does work, but it also adds an unnecessary div element to your document. Over time, if you have several float'ed elements, the .clearer methods can add up fast, as you'll be forced to put a clearer method after every float to "keep it in line". But there is another way to clear floats that works just as well and doesn't add but one rule to your CSS and not a thing to your HTML. I'm just going to post the code and let you look at this, I'll explain afterwards.

Here's some text!

Here's some more text!

#wrapper { margin-left: auto; margin-right: auto; width: 95%; } #leftcontent { float: left; width: 45%; } #rightcontent { float: right; width: 50%; } /* This is the Alsett Clearing Method. */ #wrapper:after { clear: both; content: "."; display: block; height: 0px; visibility: hidden; }
Notice something gone from the HTML markup? Yep, there's no more "clearer" there. In its place, the CSS has one additional rule and that's the "wrapper:after" rule.
Note: I use the wrapper div here since it contains the floats; always have something to contain the elements that are being float'ed and then just use the :after method on that containing element.
First, in plain English, that rule is saying: "After the thing that has an ID of wrapper, clear both floats, add a period, display that period as a block, give it a height of zero and just make it hidden". Remember how I said the block was a key in clearing floats? That's how this works.
By using CSS' content property, we add a period right after the wrapper div and by displaying it as a block, we force the float to "stop" and force it back into the document flow. By giving it a height of zero and hiding it, we just make sure no one sees that period, thus, there's "nothing" there! The floats "just clear"! The clear: both that's there just like the clearer div tells this block to clear both floats.
Which method?
I would personally go with Method 2. This keeps the clearing of the floats in the CSS where it should be and adds nothing to the HTML.
Compare this with the previous method of where, if you didn't like the name .clearer, then you'd have to go through your document and change every instance of .clearer to the new name. Here, though, you simply have to change one rule and you're finished!
Thank you
I hope you've enjoyed reading this as much as I've enjoyed writing this, and I hope this helps you overcome the headache that is floats. Thank you and happy coding.


text:
Looks like you are using an old version of Internet Explorer - Please update your browser
The Scopes trial-some say a major turning point in US history-occurred 80 years ago this month.
No results found in .
Answers in Genesis is an apologetics ministry, dedicated to helping Christians defend their faith and proclaim the gospel of Jesus Christ.


text:
Proxy by Alex London
Having a Proxy to take the fall for every mistake Knox has ever made seemed like a dream come true at first. Then his Proxy, Syd, is sentenced to death for killing Knox's friend, when it was Knox who drove the car crash that led to death. Now Knox and Syd are on the run. They soon find a band of rebels and seek a way to pay some hefty debts. Read a sample.


text:
The end of 2012 and first months of 2013 have seen a remarkable change in the fight to protect the Arctic from risky and dangerous oil exploration. Three oil "majors" – Total,Statoil and Conoco-Phillips - have withdrawn from drilling projects in the far North. Shell of course has also famously "paused" its drilling in the Chukchi in the Alaskan Arctic after a series of "costly and embarrassing accidents", though thankfully at least without a major oil spill or loss of life. This "pause" though allegedly voluntary, would surely have been imposed upon the subsequent publication of the US Department of the Interior assessment of Shell's 2012 Arctic operations – published just days later, which highlighted inadequate performance in 5 of 7 key areas identified by Interior Department as essential for "safe and responsible" offshore drilling. Greenpeace argues, not unexpectedly and for a variety of reasons, that no drilling in the Arctic can be safe and responsible. But for the US Department of the interior to label one of the most risk averse of the oil majors "inadequate" is worth noting.
Yet as recently as 2011 when speaking to managers of some of the biggest "ethical/socially responsible" investment funds in the UK, Greenpeace and colleagues at Platform and ShareAction were told – with a certain amount of sadness and resignation – that Arctic drilling was almost a certainty and would "inevitably" proceed. So what happened?
The truth was that a lot had already happened, but the investors hadn't really noticed, or if they had noticed, didn't understand. First of all, the age of easy oil had passed and the oil majors had lost access to much of what remained to the national oil companies in the Middle East, Russia and Latin America. In addition, by 2010 even disgraced former BP chief Tony Hayward knew oil consumption in the developed world had peaked. Yet in order to justify further dangerous – and costly – exploration in places like the Arctic companies like Shell, BP, Statoil and Conoco-Phillips had to convince their shareholders that chasing the last drop of oil to the last pristine wilderness on earth was essential to their financial well-being. They did this by emphasising future consumption scenarios that pushed oil use beyond economic and environmental limits.
But even if the penny hadn't dropped for investors – who had a vested short term interest in the massive profits still being booked the oil majors – it should have been apparent to Governments that allowing oil companies into the Arctic was creating unacceptable risks to for both the Arctic environment and the global climate. Yet when the UK Government was pushed to support a call by the Parliamentary Environmental Audit Committee for a moratorium on Arctic drilling –the UK Government refused, perversely saying that Arctic oil was essential to securing a safe future for the climate. It isn't – and governments around the world almost certainly know that, but that's not the point: opposing Arctic drilling would put governments around the world in conflict with some of the most powerful companies in the world.
But now, perhaps, just perhaps, the tide is beginning to turn. And perversely, that turn may have started in the wake of the worst peacetime oil spill in history – the Deepwater Horizon in April 2010. In the Gulf of Mexico, that accident blighted an entire industry, and almost certainly lead to the increased scrutiny - and more stringent regulation - on Arctic drilling, not just in the US but Europe. In turn this contributes to rising costs and complexity (as Shell discovered to their cost in 2012) and a less "attractive" environment for investors, according to analysts at financial institutions including HSBC,Credit Agricole, Natixis and Societe Generale , as well as influential commentators like Nick Butler in the Financial Times.
As the fundamentally flawed economic justification for risky arctic drilling adventures start to pale, other considerations begin to get a look in – including climate change. The Arctic is warming faster than any other region on earth and its vulnerability to climate change is highlighted by the fact – in the words of James Turner, currently skiing to the North Pole as part of the a youth journey to save the Arctic, that since the invention of the mouse, we've lost three quarters of summer Arctic sea ice. A level of oil use that would justify Arctic exploration in economic terms alone, would almost certainly result in catastrophic climate change according - not to Greenpeace - but to analysis by the International Energy Agency – who acknowledged that to have even a 50% chance of avoiding catastrophic climate, 2/3 of known fossil fuel reserves need to remain under ground.
It's likely – and lucky - that a combination of factors is slowing the resource rush to the Arctic – but whether it's fast enough to avoid the train wreck that's coming is still open to question. But inevitable? Perhaps not any more…
Follow the Greenpeace 'Save the Arctic' expedition.
Image: "Hidden consequeces" by Buenos Aires-based graphic designer Martin De Pasquale, depicts an Arctic oil drilling platform and the environmental destruction that it could bring.


text:
Sort by:
Engineer It: Demystifying creepage and clearance for isolation
Next generation digital isolation
Webinar - Understanding Isolation Technology for Industrial Applications
Overview of commonly-used interface for industrial application Part 3
Design considerations for USB type-C power delivery
The presentation addresses the design consideration of USB Type-C power delivery. USB Type-C is the new trend of Industrial, automotive and personal electronics devices. In the training, audience will be able to learn more about USB Type-C power delivery (PD) requirement and understand architecture of USB Type-C PD, AC/DC power source.
Demystifying circuit design with Precision DAC
The presentation addresses the Precision DAC Architecture overview, DAC spec parameters and the theory of operation & Design example. All the information is importer for engineer when work on the system design.
Environmental sensor for building automation design
Building automation system is a communication network infrastructure that manages the building service. This training will introduce the environmental sensor black diagram, key reference design and the solution for IC temperature sensor, power saving analog temperature sensor, digital temperature sensor … etc.
SAR ADC Design
Targeting the Test and Measurement application, this section includes many topics relevant to designing with SAR ADC devices.
Introduce high power DC/DC conversion design: comparison of PSFB and FB-LLC
Overview of commonly-used interface for industrial application
The training provides a very comprehensive introduction of the commonly-used interfaces including RS-485, RS-422, ProfiBus, RS-232, IO-Link, CAN and LIN. These interfaces are used in the application of Factory Automation and some other industrial applications. For the engineer who needs to deal with interface system design, this is a very useful training.
2018 South Asia Industrial Webinar Series
The topics will cover system design issue and solution for Building Automation, Power Delivery and Test & Measurement. TI experts introduce the latest technology and innovation system reference design. Discover ways to enhance the time-to-market and create safer and efficient industrial systems.
How High-Voltage Isolation Technology Works
Want to understand how high-voltage isolation technology works? Watch and learn about reliability testing for isolation. Filmed in TI's high-voltage lab, this series of videos will focus on capacitive isolation structure, working voltage reliability, withstand voltage capability, methods for testing reliability, and more.
Electrical Fundamentals and Need for power systems protection
Introduction to Protection Relay and Power Systems Faults
AC Analog Input Module Architecture (AIM)
Selection of Key Components (ADC, Signal Conditioning Amplifier) for AC Analog Input Module (AIM)
Design Details for TI design TIDA-00834 High Accuracy Analog Front End Using 16-Bit SAR ADC with ±10V Measurement Range Reference Design
Isolation in Industrial Robot Systems
Reinforced Isolation and Power: An Integration Story
How High-Voltage Isolation Technology Works – Capacitive Structure


text:
Duct Repair Bundoora, Duct Repairs Specialists
SK Duct Repair Bundoora provides professional ducted heating repairs and duct replacement. Get 24 X 7 duct repair service in Bundoora.Our rapid response coupled with timely service backed by a very friendly staff have enabled us to becoming the most preferred company of choice to thousands of clients in Bundoora who pride in having all their heating equipment fully repaired and routinely serviced by us.
Our company is the most reputable when it comes to carrying out duct heating repairs and also replacements in Bundoora, Duct repair Bundoora is widely known for providing professional services in duct repairs in Bundoora and its environs.
Duct Repair services:
- We do Duct Repairs and Servicing
- We carry out Duct Installations Servicing
- We conduct Duct units Carbon Monoxide Tests
- We do Duct systems servicing.
- We carry out Cooling and also Heating Duct Fixing
Duct Repair Bundoora process
When you come to Duct Repair Bundoora you will be pleased to learn that we have the most skilled team of experts with requisite know-how and experience that is aptly backed with the latest equipment able to repair all your duct units and make them to function once more at optimal efficiencies.
- Our staff begins the process with a thorough analysis of your duct unit to see if it is well installed.
- We get to check for any perforations, existing holes, and also any parts that are malfunctioning and also any other kinds of defects.
- Staff from Duct Repair Bundoora will then start doing all repair works by first sealing all the holes, and cracks and also repairing and making replacements of any defective parts.
Benefits of using Duct Repair Bundoora
- We continue to diligently serve clients all over Bundoora and we handle all sorts of damaged duct systems.
- We pride in having a team of devoted, licensed, insured, bonded, skilled, and highly experienced certified cleaners who are very proficient in their work. We have the best equipment backed with latest technology and techniques to give you the most excellent solution for all types of water and also flood restoration at Duct Repair Bundoora.
- We are a leading duct repairs company in Bundoora preferred over any other company. Our Duct Repair Bundoora range of services are reputed as the most rapid because we are prompt and we expedite on any order which we carry out efficiently while charging the most affordable rates in Bundoora. We provide 100% client satisfaction guarantee. We are available 24/7 for any emergency if required. Call us for free quote and enjoy our same day Duct Repair Bundoora expert service.
Duct Repair Bundoora facts
- All duct units in your house make up of a very important component when it comes to the aspect of effective heating. With a good duct unit in the home you can have that much desired peace of mind because you actually can go on with daily duties with f that full knowledge that everything in the house is running perfectly as far as heating and cooling is concerned.
- Duct Repair Bundoora makes use of infrared form of motion detecting cameras with the ability of establishing any motion or activity in duct units. This simply enables our professionals to check for any animals like rats and cats that have a high possibility of brutally damaging your expensive ducted heating systems. Such miniature animals generally en up getting some living habitat within the crawling space and also the roof cavities of your duct systems. Whenever you end up doing completely nothing about the looming situation, they end up turning your duct system into their home. To ward off such irreparable damages, you only need to call us for same day service and we will definitely give you a free quote.
- At Duct Repair Bundoora we recommend all our clients to light their duct units a couple of weeks before arrival of winter. This will enable you to find out any foul smell or an indicator of animal intrusion. Upon detection of any airflow problems just feel free to call us. It is advisable to use your duct unit for a period of some minutes on a weekly basis so that you can aptly know if it is optimally functional. On the other hand, if there are any concerns we are here to be of help to you.
Our Duct Repair Team in Bundoora
We have the reputation of providing 100% guaranteed results to all our esteemed clients and the bulk of our projects come from referrals. We are very passionate about our work and that is why we constantly achieve 100% satisfaction guarantee. Duct Repair Bundoora has been of great assistance to thousands of homeowners when it comes to recovering from any flood damage all over the years and we are around to serve all our esteemed customers with expert services at very affordable rates.
[RICH_REVIEWS_SHOW category="Duct Cleaning"]