text:
From Staff Reports
GALLMAN – The Starkville Academy softball team lost an 11-1 decision on the road to a tough Copiah Academy squad Tuesday night.
Bette Mahoney Rice, 86, a long-time resident of Starkville, passed away on August 8, 2011, from a year long battle of cancer.
Maebell Ashley Palmertree, 99, passed away in Mathiston on August 9, 2011.
LOUISVILLE — Miss Betty Sue Jackson, 79, died Monday, August 8, 2011, at Carrington Nursing Home in Starkville.
By GWEN SISSON
Squash, okra, peas, beans, cucumbers and a few tomatoes are still on the tables at the Starkville and Maben Farmers' Markets this month.
Pat Harpole, Maben Farmers' Market treasurer, and Libby McMullen of Maben, winner of the $50 prize drawing last week.
You can't make my mom's chocolate pie.
Go ahead...try. The recipe is below. But you can't do it.
Many of us make excuses as to why we don't eat breakfast, such as "I'm running late." "I don't have the time," "I need a few more minutes of sleep," "I'll just have a cup of coffee," But as a parent,
Everything in moderation. Isn't that the credo that guides wise men and women in just about every area of life? I guess I should have applied this idea like the Pirates of the Caribbean applied the
By CARL SMITH


text:
Friday Philosophy: It's Not What you Know – It's What you are Getting To Know. December 7, 2012Posted by mwidlake in Friday Philosophy, Meeting notes, Perceptions.
Tags: Meeting, perception, Presenting, UKOUG, user group
add a comment
This has been a good but tiring week. It started with the UKOUG TEBS conference where I saw lots of people I know, a few who I didn't but now do and I had good times in pubs and restaurants. One evening culminated in my singing part of "Two out of Three ain't bad" in the style of a munchkin with Nial Litchfield in a pub at 1am, which I am sure he woud rather forget about – so if you know him, ask him about it. For me that was the indicator to go lie down in the dark and sleep. Irrespectve of drunken singing, I must had talked about 20 topics with 40 people over the conference, exchanging ideas, tricks and war stories.
I also presented on the Sunday, teaching people. I went to many fine presentations through the week and learnt stuff, balancing the knowledge books. This included one talk on Wednesday where I found out I had been teaching people wrong on Sunday! *sigh* Oh dear. And it is something I have been getting wrong for years. I'll check the fine detail before I blog about that though. I now hate SQL Maria for pointing out my error – which is unfair but that's life. Sorry Maria, I'll buy you a beer sometime to make up for it.
After all that, I came back to work to find we had some big issues with one system. I won't go into the details but there were half a dozen of us working on it, coming up with ideas, knocking each other's suggestions down or agreeing with them – and coming up with working solutions. None of us could have done it alone and I reckon most of us learnt a couple of things in the process (such as how bad some of the app design was :-) ).
So all in all, a week of learning that has worn me out but left me happy and that is what I like about my work life at present. I am working with people who know stuff and who want to know stuff. I am in a role that exposes me to a lot of issues. I am working for a boss (and team) who let me take time out from the official job to learn stuff too. I suspect it is going to end soon though as the company I am working for are taking large numbers of people to the carpark and shooting them (figuratively speaking only, I should point out). It will be a shame if it does end. But then, just as when I worked with the best IT person I ever worked with, I'll be happy I had the experience.
Yes, I know I am lucky to have such a good working life at present {but, you know something? I did take efforts to make it like this – maybe a future FF on that}.
So having said I like my working life so much, who is willing to bet I'll be complaining like a spoilt child all next week?!?
Friday Philosophy – The Tech to Do What You Need Probably Exists Already November 30, 2012Posted by mwidlake in Friday Philosophy, Perceptions.
Tags: documentation, knowledge, perception, system development
4 comments
How many of you have read the Oracle Concepts manual for the main version you are working on?
This is a question I ask quite often when I present and over the last 10 years the percentage number of hands raised has dropped. It was always less than 50%, it's been dropping to more like 1 in 10 and Last year (at the UKOUG 2011 conference) was the nadir when not a single hand was raised. {Interestingly I asked this at the Slovenian User Group 3 months ago and something like 40% raised their hand – impressive!}.
Why do I feel this is important? Well, do you know all the technology solutions available across just the core RDBMS with no cost options?. No, you don't, you (and I) really don't. If you read the concepts manual, even just skimming it, you will be reminded of a whole load of stuff you have only dim memories of and perhaps you will even see some features that passed you by when they were first introduced.
Of course, you would need to read a few more manuals to get the full picture, such as the PL/SQL Packages and Types References, as so much good stuff is introduced via built-in packages, and the SQL Language Reference, as SQL has been extended quite a lot over the last couple of versions. Dull reading indeed but I'd estimate that if you read those three you would be aware of 90%+ of the Oracle technologies that are available to you out-of-the-box and considerably more than all but a handful of Oracle Experts. You'd know more than I as (a) I have not skimmed the PL/SQL one for years and (b) I have a rotten memory.
My point it, you can't consider using Oracle technologies you don't know about or remember – and they could be just what you need to fix the problem you see in front of you.
I'll give a couple of examples.
Problem, physical IO is too high, your storage system is bottle-necked.
Answers, Reducing Physical IO:
-First up, Index Organized tables. Some of you will be aware that I am very keen on IOTs and the reason I am is that I've used them to physically group data that the application needed to select over and over again. It can make a massive improvement to that sort of system. They are rarely used.
-Clustered Tables. Even less used, in fact has anyone reading this used them in anger in the last 10 years? Great for situations where you need parent-children or parent-children-type-1+parent-children-type-2 data. I confess, I have not used them in anger for years.
-Move table (and order them as you do it!) and re-build indexes to remove "dead" space. This one got a bad name, especially the index rebuilds, as people were doing it needlessly without appreciating what the intention was, but now I hardly ever see it done – even when it is of benefit.
-Compress your tables and indexes. With normal Oracle compress (no need for HCC). In tests I've done I pretty much always see a drop in physical IO and run time. Being candid, I can't remember doing any tests and NOT seeing an improvement but I usually only test when I expect and improvement and I don't want to give anyone the impression it will always help.
All the above were available in Oracle 7 or 8 and all have improved over the versions.
Problem, you want to carry out some long,complex data processing in PL/SQL and if a step fails, be able to handle it and carry on.
– Savepoints. You can rollback to a savepoint, not just to the last commit. In this way you can break the task into chunks and, if something towards the end fails, you roll back one step (or several, your choice) and call an alternative routine to handle the exception.
– Autonomous Transactions. You want to record that an error occurred but not fail the original action or not save anything it has done to date. An autonomous transaction runs in it's own sub-session and commits in it do not effect the calling session.
– Temporary Tables. You can put your working information in them as you progress and if you need to bomb out (or some evil DBA kills your session for running too long) the temp table contents just disappear. No clean up needed.
Maybe the above is not so fair, I have not been a proper PL/SQL developer for a while now, but I hardly see the above used. Especially Savepoints. I can't remember not having savepoints available (hmm, maybe Oracle 6) and Autonomous Transactions and Temporary tables are Oracle 8 (I thought Temporary tables might be 9 but Tim Hall's OracleBase says 8)
Another thing I have noticed over the years is that so often I will read up on some oracle feature I know little about, only for it to come up in the next few weeks! There is a psychological aspect to this, that we only remember these "coincidences" and not the more common situations where we read up on something which does not subsequently come up before we forget about it, but I think that it is also that we tend to use only a few solutions to solve the problems we see and adding another solution to our list means the chances are high it will be suitable for something soon.
OK, so it would help us all to read the manuals (or other Oracle technical books) more. Now the big problem is finding the time.
Why Present (UKOUG TEBS 2012) November 27, 2012Posted by mwidlake in Friday Philosophy, Presenting.
Tags: behaviour, Presenting, UKOUG, user group
3 comments
The annual UK Oracle User Group Technical and E-Business Suite conference is fast approaching and rather than just say "hey everyone, I'm going to present at a conference" I thought I would say why I present at conferences (and SIGs (and any opportunity I get) ).
The UKOUG TEBS conference is the one that is, in my eyes, the UKOUG conference. It covers E-business suite and the core database stuff – DBA-type things and developer-type things. The things I am interested in. You can see the details and agenda via this link. If you would like to see someone else's view of this year's conference, from a delegate's perspective, check out this post by my friend Big Dave Roberts. I've said it before and I'll say it again, I've personally got more out of the UKOUG TEBS conference than when I have been lucky enough to go to Oracle Open World. For me, I want to see user stories and opinions as well as the Oracle company line – and user groups give far more of that. UKOUG is the biggest and most encompassing of the European conferences, but check out and attend your local user groups if you are not based in the UK (or are in Scotland) – I've been to a couple now and all have been good.
{Oh, I should add, I am not presenting at the main TEBS conference, for the first time that I've made it there in…10 years! I'm presenting on the OakTable Sunday. I get to fully enjoy the whole 3 days of TEBS this year, as a normal punter!}
So why do I present?
First up, I am lucky that presenting does not scare me. Oh, I get nervous before I start and I worry about my material and doing a decent job of it, but I never feel sick or faint before starting(*). I've got some good friends who know as much or more about database technology than I and, in a social situation, they will let fourth with eloquence and passion about some topic. Usually in a pub. But the idea of formally presenting fills them with the heebie-jeebies if not the screaming abdabs. Or, when they get up to talk, they morph from erudite and eloquent {ie they speak clearly, concisely and interestingly) into stuttering, uncomfortable rabbits caught in the lights. And they quickly drop back from it. It's a real shame as they have a lot to say. Actually, it is a blessing as it leaves space open for me :-)
Secondly, I want to be noticed. There, I've said it. I'm pretty sure that 75%+ of the regular speakers at conference want to be noticed and that is a factor in why we do it. Oh, of course, we can wrap it up as "marketing your skills" or "maintaining a presences" but that's fluff. We want you to see us talk and we want you to like what you see. Well, not the physical aspect of it, that would be weird, but we want you to either think we know what we are talking about or enjoy listening to us prattle on. We want to be appreciated. That's not so noble, huh? But true.
As a sub-topic to "I want to be noticed" let's deal with getting work. For me personally, speaking has never got me a job. Asking around friends and contacts most people are the same in that Presenting does not get most of us any work. Maybe it's a factor when I get interviewed but no one has once come up to me after a talk and said "can you come to our site and be paid a vast sum of money to solve this problem". I'd love you to be the first, though…
Third, and this may seem noble – or corny or self-worthy – but I talk because I want to teach. I want you to have in your head the knowledge I have in mine, preferably with less pain and anguish than it took me to get it in mine. I love teaching people stuff. It is a common trait to the OakTable network. We teach and we demonstrate why we think what we think. Usually. I can't decide if I prefer making something that is broken work or teaching people more. Those two are why I do what I do. Frankly I gave up on making a "significant difference" years ago, I'll stick to making lots of insignificant differences.
Fourth, I get to meet people. It's taken a while as, except in small groups, I am not great at being sociable. That might seem odd given I said I like to be noticed, but I don't like to be noticed as a fool and for reasons I will side-step, I'm not too great at judging how I am coming across. Plus I cannot remember names or faces, which is tricky sometimes. Actually, a lot of actors are not "social people", for some they act because they can't "do" people. Anyway, presenting has opened doors to me by meeting other presenters who know their stuff, non-presenters who know their stuff and, generally, people. Most of whom have been nice.
Fifth, and this is quite rare. I get asked. If you ask me to present the chances are I will say "ohh, yes please!!!!" We are back to my second point about being noticed, aren't we? Caveat. If you ask me to present and you live thousands of miles from the UK, as I have no employer to fund my demands for limousines and four-star hotels, I might have to say no. Unless you buy me a LOT of beer.
That is why I present. You probably now expect me to say something to encourage you to present but, mehh, if you want to, just do it. If you don't, don't do it. It's not for everyone. Except you over there. Yes, you know who you are. You need to present more. :-)
(*) I confess, when I do a talk that is aiming to be funny, I get very nervous. When I do my "disasters" talk I can get very nervous as the whole idea is that people will be amused. If I get the feel of the talk wrong I can look preachy or obnoxious or bitter or daft or all four and more. But it is still the talk I most enjoy giving.
Friday Philosophy – The Importance of Context November 23, 2012Posted by mwidlake in Friday Philosophy, Perceptions.
Tags: Architecture, behaviour, Humour, perception, system development
1 comment so far
A couple of weeks ago I was making my way through the office. As I came towards the end of the large, open-plan room I became aware that there was someone following behind me so, on passing through the door I held it briefly for the person behind me {there was no where else they could be going}, turned left and through the next door – and again held it and this time looked behind me to see if the person was still going the same way as I. The lady behind gave me the strangest look.
The strange look was reasonable – the door I'd just held for her was the one into the gentleman's bathroom. *sigh*
I was doing the correct thing, I was attempting to be helpful to a fellow person, I was in fact being very polite. But because I had utterly failed to consider the context, there is now a lady who works on the same floor as I who considers me, at best, as strange. At worst she thinks I am very strange – and more than a little creepy. I fear the latter given her reaction when she saw me in the kitchen area recently and turned around. {By the way, if anyone can think of a good way I can clear this up I'd appreciate it. After all, I can't exactly go up to her and say "sorry about holding the door to the gents for you the other day, I did not realise you were a woman"}.
My point is that you can do what you believe is the right thing but, because you are not thinking of the context or are unaware of the full situation, you end up giving utterly the wrong impression. I had a work situation like this a while back.
Without going into too much detail, I was working with a client on a data warehouse project. The Oracle database bulk-processed large quantities of data, did classic big-data queries and was sitting on some fairly expensive hardware with dedicated storage and the intention of implementing Dataguard. One of the issues they had was with a subsidiary part of the system that created a very large number of small transactions, lots of updates. High volume OLTP on a DW setup. It was hammering the storage and eating up all the available IO. The data for this subsidiary system was transient, no need to protect it.
I realised that the hardware was not correct for this subsidiary system and it needed no archived redo. Archiving redo is an all or nothing situation for an Oracle instance. So happy that I had worked out what to do I proposed {with a smile} moving the subsidiary system to it's own database on it's own hardware.
When I said this to the client, their response was a stony look and the comment "We've just spent a fortune on this platform……". Having dug my hole I proceeded to jump right in there "It's OK, what I am proposing is only about 5, 7 thousand pounds of kit – nothing compared to what you spent already!". The client now got very, very annoyed indeed.
You see, the context is that they had been sold a system that was very expensive – it was to do a demanding job. They had been getting poor performance with the system and that is partly why I was there. They also did not really understand the technical nuances well (at least, not the chaps I was talking to) and they did not appreciate why I said what I did. From their perspective, this smiling loon was suggesting that a system costing 2-3% of what they had spent on their data warehouse platform was going to be able to do the processing that the expensive system could not. Either they had spent waaay too much, this new "expert" was an idiot or else I was lying to them. And they did not like any of those options.
Looking back it is clear I should have been more aware of how they would receive what I said. I've done this before {several times}, bounded into a situation like a wide-eyed puppy and gone "Look! We can just do that!" without considering things like upsetting the guy who had suggested the original solution, or making the on-site expert look stupid or blowing away a salesman's pitch. Or that I have missed a glaring and valid reason why they can't "just do that".
I suspect that a few people would say "no, you just tell them the way it is and if they don't like it or you upset someone then tough". Well, maybe, but not if you want to be there to help fix the next problem. Also, I know I am not great at appreciating the context sometimes. That is part of why I will never run a company or be a senior manager, I lack the skills to judge the impact of what I propose or say sometimes, in my rush to be helpful. I am slowly learning to just hold back on ideas though and to run things past friends or colleagues with more "whole picture" skills first though. I might be rubbish at it but I can learn I am rubbish at it.
In the case of the situation above, the expensive system was correct for what they wanted to do – and maybe not quite expensive enough. I was suggesting a slightly unusual fix for a specific problem and I should have been more laboured in explaining the problem and more circumspect in leading them to the solution. I should have taken more time.
I should have checked who was following me and where I was going before I held the door open.
Row Level Security 3 – In Pictures! November 22, 2012Posted by mwidlake in database design, security.
Tags: security, SQL, system development
3 comments
<..Part one intro and examples
<….Part two Permissions
I've noticed that there has not been a lot of traffic on this series on Row Level Security (data masking) so far – maybe due to how I am presenting the material? So here is a summary to date in picture/diagram format:
This is the flow of logic as to whether Row Level Security is applied to the SQL statement. Usually this is a query and usually it is on a table but the policy can be applied to other DML and also on views and synonyms:
These are the steps you need to add RLS to a table:
Below is a summary of how oracle fires and uses RLS functions and the predicates they provide:
An finally, a summary of what happens if an RLS function is invalid:
If you have not looked at the previous posts on this topic, more details are in there.
Row Level Security Part 2 – permissions November 20, 2012Posted by mwidlake in internals, security, SQL.
Tags: security, SQL, system development
3 comments
<..Part 1, introduction..
..Part 3 summary in pictures..>
In this second post on the topic of "an introduction to Row Level Security" I want to cover a few things about what permissions you need to implement RLS and some of the consequences. In my introduction in part one I just said my main user has "DBA type Privileges".
{NB This is all on Oracle V11.2 and I believe everything below is applicable to V10 as well. Also, I should point out that I am not an Oracle security expert – but despite repeatedly saying this, it seems like at least once a year I am asked to improve a system's security on the grounds of "more than we have now is an improvement"}.
Firstly, you need the permission to create and drop RLS policies. This is controlled by having the EXECUTE privilege on SYS.DBMS_RLS. That is it. If you can execute this package you can create and drop RLS Policies, enable and disable them and also create, manage and use Policy Groups.
Obviously EXECUTE on SYS.DBMS_RLS is a privilege you need to restrict to only "empowered" accounts- but you also want to be very careful about your definition of empowered. If an account has this privilege, it can alter (disable!) any RLS policies that ANYONE created on the instance. You may need to think carefully about having several accounts that can alter all the RLS policies across all schemas in your instance.
You might want to create a single user that has the EXECUTE on SYS.DBMS_RLS and use that to implement and control RLS across the instance {and even have the account locked when it is not needed}. Of course, under normal Oracle anyone with SYS access can run the procedure – but you have SYS access under control already, don't you?… :-).
By default, who has this privilege?
MDW> @obj_privs Enter value for obj_name: dbms_rls Enter value for obj_own: sys GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA -------------------- ------------ ---------------------- -------- ------------ --- EXECUTE_CATALOG_ROLE SYS DBMS_RLS SYS EXECUTE NO XDB SYS DBMS_RLS SYS EXECUTE NO WMSYS SYS DBMS_RLS SYS EXECUTE NO -- -- and who has that EXECUTE_CATALOG_ROLE? -- select * from dba_role_privs where granted_role='EXECUTE_CATALOG_ROLE' GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- DBA EXECUTE_CATALOG_ROLE YES YES IMP_FULL_DATABASE EXECUTE_CATALOG_ROLE NO YES EXP_FULL_DATABASE EXECUTE_CATALOG_ROLE NO YES SYS EXECUTE_CATALOG_ROLE YES YES
So, our old friend the DBA role has that privilege, via the EXECUTE_CATALOG_ROLE and IMP_/EXP_FULL_DATABASE.
Let's go back to creating policies. I'm sticking to row-level RLS for now, not column-level. When you create a policy you basically are saying "when object X is accessed, run function Y and apply the resulting string to all access, as a predicate"
Lifted an example from the manual, but adding in a couple of bits the authors were too lazy to put in { :-) } :-
DBMS_RLS.ADD_POLICY ( object_schema => 'hr' ,object_name => 'employees' ,policy_name => 'emp_policy' ,function_schema => 'hr_rls' ,policy_function => 'emp_sec' ,statement_types => 'select');
The function HR_RLS.EMP_SEC returns a string P1
When someone issues a statement that access the HR.EMPLOYEES table the function HR_RLS.EMP_SEC is executed as part of the parse and, internally, the following view is created and placed into the orginal statement:
SELECT * FROM hr.employees WHERE P1;
As this takes place as part of the parse part of the statement processing, errors with the function are found before any effort to access the actual data occur. It is also why it is not simple to avoid RLS – it is done as part of the overall SQL processing carried out by Oracle.
If the function is invalid, generates an error or the supplied "WHERE predicate" P1 causes the final statement to be syntactically incorrect, you get an error.
At this point Oracle fails "secure" and simply won't fire the SQL statement. Even if you own the tables and have full privilege access to them. I think it is worth a quick demonstration
I am logged on as the owner of the table and RLS function, MDW:-
MDW> select * from test1 ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC ERIC THE RED 1 2 BROWN BOB THE BROWN 2 3 GREEN GARY THE GREEN 1 4 BLUE BILL THE BLUE 3 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 -- --All works OK MDW> @rls_func_damage -- CREATE OR REPLACE FUNCTION hide_rows ( v_schema IN VARCHAR2 ,v_objname IN VARCHAR2) RETURN VARCHAR2 AS con VARCHAR2 (200); BEGIN -- The line below states loser not user con := (loser='''||v_schema||''' or MASK_FL > 3)'; RETURN (con); END hide_rows; / Function created. -- -- Let us check the predicate coming from the function -- select hide_rows(v_schema=>user,v_objname=>'TEST1') from dual; HIDE_ROWS(V_SCHEMA=>USER,V_OBJNAME=>'TEST1') --------------------------------------------------------------------------------------- (loser='MDW' or MASK_FL > 3) -- "loser" is not a valid piece of syntax or a known variable. So... -- select * from TEST1 * ERROR at line 1: ORA-28113: policy predicate has error -- I now damage the statement creating the function so that it is syntactically incorrect CREATE OR REPLACE FUNCTION hide_rows ( ... -- missing quote con := (loser='''||v_schema||''' or MASK_FL > 3)'; ... Warning: Function created with compilation errors. select * from TEST1 * ERROR at line 1: ORA-28110: policy function or package MDW.HIDE_ROWS has error --re-create the function as I started with Function created. select * from TEST1 ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC ERIC THE RED 1 2 BROWN BOB THE BROWN 2 ... 7 RED ROGER THE RED 6 -- -- Back to a working system
As you can see, you get ORA-28110 if the function used by the RLS policy is damaged and ORA-28113 if the function returns a non-valid WHERE Predicate. In either case, the data in those tables is now inaccessible. That could be a problem…
It is of course very interesting that RLS is kind of "blind" to the functions it uses until it uses it. You can alter RLS activity if you can alter the functions.
Last post I mentioned that, as you RLS security is based on these functions, you should give thought to who can see them and change them. Hopefully the above highlights that. There is another access aspect to these functions that is key.
In the first example where I use DBMS_RLS.ADD_POLICY, I state function_schema – this is who owns the PL/SQL function. It defaults to the person who creates the Policy. The function is fired in the standard way with DEFINER RIGHTS – i.e. the rights of the function owner. {You could override this when creating the function such that it runs with executioner rights – but that strikes me as a potentially very confusing and a source of much pain and anguish}.
So the function can see what the owner can see, not the executioner. This has two key effects:
- You can restrict the access to any DB objects that the function requires to the owner of the function. The end user does not need to have access and it may be more secure if they do not.
- You have to grant access to objects directly to the function owner, via either object grants or system grants. Stored PL/SQL does not "see" roles if executed with definer rights.
So eg if your function is owned by MDW and references a master table called SEC_MASTER.MASKED_USERS then you need to grant select on SEC_MASTER.MASKED_USERS to MDW. No using roles.
{of course, calling a table MASKED_USERS might give anyone acquiring access to the DB a clue that it is important. I tend to call such "security important" tables things that are "obviously" boring, like ROTA_DATA.}
Finally, that WHERE Predicate P1 is in effect added to your SQL statement. It can be pretty much anything. It can reference other database objects. If it references other database objects THE EXECUTING USER MUST BE ABLE TO SEE THEM. Not the owner of the function; that function has been fired and the WHERE Predicate generated already. On actually running the SQL, the executing user must have access to all objects referenced, including those introduced by the P1 WHERE Predicate. Oh, and remember synonyms!
There is there a way to sidestep RLS and you sometimes need to.
If your logon has the EXEMPT ACCESS POLICY system privilege then RLS functions are utterly ignored by you. No check is made to see if policies apply to your SQL statements, let alone run them. You may need to use this privilege if you need to access functionality that RLS has issues with (see comments by Dom Brooks and Tony Sleight on my first post). You might also need it if you have errors with the policies but you need access to the data to keep the business moving. You probably need a locked-down user somewhere with the EXEMPT ACCESS POLICY privilege if you use RLS.
Of course, great care has to be taken in making use of this privilege as it side-steps all RLS_based security.
If you have master users that have full access to the data, this privilege also removes the overhead of the SQL engine identifying any policies, firing the function and including the extra predicates.
One very final point. I have found myself writing RLS functions that all check if the user was the owner of the table and, if so, allowing them to see all data. By granting EXEMPT ACCESS POLICY to that user I was able to do away with those checks and make the functions much simpler. In this case I did not so much think of EXEMPT ACCESS POLICY turning off security but the lack of it turning it on for restricted users.
That will do for part 2.
Row Level Security Part 1 November 15, 2012Posted by mwidlake in database design, security.
Tags: security, SQL, system development
9 comments
I've been working a little on Row Level Security (RLS) recently and wanted to mention a few things, so first some groundwork.
If you want to limit the rows certain users can see, you might think to use views or you might think to use RLS (part of VPD – Virtual Private Database). You can also (from V10 I think) limit which columns users can see. An example is probably the best way to show this. I'm doing this on Oracle 188.8.131.52.
I have two users, MDW and MDW_OFFSHORE. MDW has DBA-type privileges and MDW_OFFSHORE has connect, resource and one or two other simple privs. I will now demonstrate creating and populating a simple table under MDW, adding RLS to it and how it alters what MDW_OFFSHORE sees.
MDW> -- create a table and show row level and column level rls MDW> -- MDW> drop table TEST1 purge; MDW> -- MDW> create table test1 2 (id number not null 3 ,cp_name varchar2(30) not null 4 ,other_name varchar2(30) not null 5 ,MASK_FL number 6 ) 7 / MDW> insert into test1 VALUES (1,'ERIC','ERIC THE RED',1); MDW> insert into test1 VALUES (2,'BROWN','BOB THE BROWN',2); MDW> insert into test1 VALUES (3,'GREEN','GARY THE GREEN',1); MDW> insert into test1 VALUES (4,'BLUE','BILL THE BLUE',3); MDW> insert into test1 VALUES (5,'BLACK','DAVE THE BLACK',4); MDW> insert into test1 VALUES (6,'PURPLE','PETE THE PURPLE',5); MDW> insert into test1 VALUES (7,'RED','ROGER THE RED',6); MDW> -- MDW> COMMIT; MDW> SELECT * FROM TEST1; ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC ERIC THE RED 1 2 BROWN BOB THE BROWN 2 3 GREEN GARY THE GREEN 1 4 BLUE BILL THE BLUE 3 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 MDW> grant all on test1 to mdw_onshore; MDW> grant select on test1 to mdw_offshore; MDW> -- -- --This is where I create a function to generate the RLS rules -- MDW> CREATE OR REPLACE FUNCTION hide_rows ( 2 v_schema IN VARCHAR2 3 ,v_objname IN VARCHAR2) 4 RETURN VARCHAR2 AS 5 con VARCHAR2 (200); 6 BEGIN 7 -- note the use of backets to make it an atomic test 8 con := '(user='''||v_schema||''' or MASK_FL > 3)'; 9 RETURN (con); 10 END hide_rows; 11 / MDW> -- -- -- Now add the actual RLS policy to the table TEST1 using the function hide_rows MDW> BEGIN 2 sys.DBMS_RLS.ADD_POLICY ( 3 object_schema => 'MDW' 4 ,object_name => 'TEST1' 5 ,policy_name => 'hide_rows_policy' 6 ,policy_function => 'hide_rows' 7 ,function_schema => 'MDW' 8 ); 9 END; 10 / MDW> --
That's it. In effect you create a function, in this hide_rows, that creates a WHERE predicate (more on that later) and associate it with the table by creating a policy hide_ rows_policy.
Now let's see what impact it has:
-- as the main user: -- MDW> select * from test1 2 / ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC ERIC THE RED 1 2 BROWN BOB THE BROWN 2 3 GREEN GARY THE GREEN 1 4 BLUE BILL THE BLUE 3 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 7 rows selected. MDW> -- now as the offshore user: mdw_offshore> select * from mdw.test1 2 / ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 3 rows selected.
As you can see, mdw_offshore is seeing only a subset of rows in the table. This subset is determined by the function hide_rows. This function returns a WHERE PREDICATE that is added to any query run against the table. It is actually very simply to see what that predicate is, you just call the function passing in the table owner and name:
MDW> select hide_rows(v_schema => user,v_objname=>'TEST1′) from dual;
(user='MDW' or MASK_FL > 3)
Note that my refernce to v_owner in the function comes out as the text MDW – a way to ensure the predicate does not filter data looked at by the table owner. This implies of course that yes, you can stop the table owner from seeing data!
By default, this extra WHERE PREDICATE is applied to any SELECT, INSERT, UPDATE or DELETE statement run against this table. The function has to accept the v_schema and v_objname parameters and output a varchar2 string. At the time of being called as part of a RLS policy, oracle passes in the owner and name of the object being masked (which is usually a table and sometimes a view).
There are a few things I think it is important to keep in mind in respect of this extra Where Predicate:-
- You have very little control over what other where predicates will be applied to DML against this table, so keep it self-contained – which is why I bound it in brackets.
- It has to be syntactically correct but no check is made for this when you create the function – it is simply a string being outputted, as far as Oracle is concerned, at the time of creation.
- It can be any valid Where Predicate you like, so long as it does not reference other rows in the table with the policy is applied to
- This could be fired a lot. The performance impact could be considerable, which is why CONTEXTs are often used (as they are memory resident and can be configured by eg logon triggers) but I have skipped over that. Go look at the manuals.
I mentioned that the masking of data could be applied to just a column rather than whole rows. So let's demonstrate that. I can do this by simply dropping and reapplying the same function in a different way:
MDW> BEGIN -- first drop the policy, simply by stating the object owner, name and policy 2 sys.dbms_rls.drop_policy( 3 object_schema => 'MDW' 4 ,object_name => 'TEST1' 5 ,policy_name => 'hide_rows_policy' 6 ); -- and recreate - note the two new paramters 7 sys.DBMS_RLS.ADD_POLICY ( 8 object_schema => 'MDW' 9 ,object_name => 'TEST1' 10 ,policy_name => 'hide_rows_policy' 11 ,policy_function => 'hide_rows' 12 ,function_schema => 'MDW' 13 ,sec_relevant_cols => 'OTHER_NAME,MASK_FL' 14 ,sec_relevant_cols_opt => sys.dbms_rls.ALL_ROWS 15 ); 16 END; 17 / PL/SQL procedure successfully completed. -- -- as the main user MDW> select * from test1 2 / ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC ERIC THE RED 1 2 BROWN BOB THE BROWN 2 3 GREEN GARY THE GREEN 1 4 BLUE BILL THE BLUE 3 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 7 rows selected. -- -- now as the offshore user: mdw_offshore> select * from mdw.test1 2 / ID CP_NAME OTHER_NAME MASK_FL ---------- ------------------------------ ------------------------------ ---------- 1 ERIC 2 BROWN 3 GREEN 4 BLUE 5 BLACK DAVE THE BLACK 4 6 PURPLE PETE THE PURPLE 5 7 RED ROGER THE RED 6 7 rows selected. -- -- but what can look a little odd is that if mdw_offshore describes the table.. mdw_offshore> desc mdw.test1 Name Null? Type ----------------------------------------------------- -------- -------------- ID NOT NULL NUMBER CP_NAME NOT NULL VARCHAR2(30) OTHER_NAME NOT NULL VARCHAR2(30) MASK_FL NUMBER -- -- they see that OTHER_NAME is NOT NULL but... mdw_offshore> select count(*) from mdw.test1 where other_name is null; COUNT(*) ---------- 4
That's rather nice, I think. The same function can be used and rather than hide the rows it masks the stated columns. The sec_relevant_cols => 'OTHER_NAME,MASK_FL' parameter states the columns to apply the function on and the sec_relevant_cols_opt => sys.dbms_rls.ALL_ROWS parameter means "show a row even if a column or columns are hidden". Without it, you only see rows if you do not reference the masked columns (even if indirectly via eg "select (*)") – see this nice article by Tim Hall if you want an example of that.
With column masking the string from the function is not actually used as a Where Predicate but as a Boolean TRUE/FALSE test. If the test results in TRUE, you see the column(s), otherwise they are hidden.
As you can see from the example, this column-level RLS can result in some odd looking (though intentional) results. A DESC of the table shows the column OTHER_NAME is mandatory but records are found with it set to null. There can also be the situation where a user can insert a value for the masked column, but then cannot see it when they select the data back, though other users can see the populated column.
A limitation of column-level masking is that you can only mask columns with NULL and not, for example, a string of "MASKED". Thus if a column you are masking is not manadatory, how would you distinguish between a true NULL and a masked NULL? {A nod of thanks goes to Pete Finnigan for confirming this "NULL only" limitation.}
One of the appeals of RLS over eg views is that it is hard to circumvent, as it is applied at the level of the SQL. Another is that the same function can be applied to many tables and might also be applied to both column and row masking, if designed well.
That will almost do for an introduction to the use of RLS to mask rows and columns. However I'll finish with just a few important points that follow on from this being a security feature.
- I demonstrated that I could see what the function responsible for this security actually returns. If you do not protect unauthorised execution of that function, that could be a security hole.
- I masked the column that is used to control if the OTHER_NAME column is masked. Would you need to also do this?
- Data that is missing is data that could be of interest.
- Anyone who can alter that function can undo your security.
- Anyone who can view DBA_SOURCE (eg has SELECT ANY DICTIONARY) can view the function and see how it works.
- As you can appreciate from the above, apply Security securely is a right pain in the proverbial.
Friday Philosophy – Is the CBO becoming way too complex? October 19, 2012Posted by mwidlake in Friday Philosophy, performance.
Tags: explain plan, perception, performance
20 comments
I was at the SIOUG annual conference in Slovenia this week (and a very good conference it was too) and I was watching a presentation by Christian Antognini about how the CBO learns by it's mistakes. This was of course mostly about adaptive cursor sharing and cardinality feedback. Chris was also able to share a few tid-bits about 12c enhancements in this area. I can't go into details, but basically it looks like the CBO is going to not only enhance those two features but there is a new one where the CBO can change the plan on the fly, as the same query progresses.
As I watched the presentation I found I was in two minds about this. Part of me was thinking "Yes, these features do help in the CBO realising it has chosen a poor plan and improving things for the next execution – and it will get better at it". The other part was thinking "Oh dear, yet another source of confusion and of performance of queries changing when 'nothing has changed'".
It also solidified an idea I have for a new presentation, about how what you see in the execution plan may well not be what is actually executed. ie there are optional bits in there that do not get run at execution time, depending on the results of prior steps.
But I digress. What I ended up wondering at the end of Chris's talk was this. Is the CBO getting just too complex? It is all very good that extra abilities are being added so that there is a better chance of a good plan being chosen in the first place and the various ways we can control the choice of the plan grows and grows. But we are long past the point when you could write even a simple sql statement and know what the plan will be before you explain it – let alone run it, check the plan and then run it again a few minutes later and be sure the plan will be the same.
Why does this bother me? For three reasons:
1) Performance will not be stable, so the user experience will not be consistent – and so they will be unhappy. Users will generally be happy if they run a report and it takes one minute, if it takes one minute each time. If it takes one minute and then it takes 5 seconds, they want it to always run in 5 seconds, else they fell cheated or that the system is broken. In fact, I am pretty sure a user will be happier if a report always takes 2 minutes rather than it take 5 seconds or 40 seconds but they never know which! (So long, that is, that they never, ever see it run in less than 2 minutes).
2) If performance of a particular SQL statement is absolutely crucial, I need to know how the CBO can and probably will satisfy it so that I can work that into my solution. Otherwise I am reduced to trying out informed options (or maybe random changes :-) ) in order to find the optimal solution – and I cannot be sure that the plan won't suddenly swap later unless I fix the plan. OK, it might swap to be faster, but I only notice when it swaps to be a lot slower.
3) I've said this before, but I am starting to really wonder how anyone new to this starts understanding oracle performance tuning any more. Reading blogs and books about how Oracle works and what impacts the CBO teaches you a lot about what is possible but it only makes sense when you do little tests and proofs of concepts. ie you actually run simple examples and see what happens. But with all these options, considerations and now on-the-fly alterations to plans by the CBO, it is very confusing. Even I, after 20 years of doing performance tuning on and off, am constantly finding myself looking at relatively simple SQL and having to work out why the plan is as it is and satisfying myself that it has not changed. I started with the CBO when it was a lot simpler and I've been introduced to the complexities gradually, as they have been introduced, so learning about it has been easier for me.
Perhaps I should not worry about this. I mean, the CBO is getting better at doing what it does, that is good. It is getting hard for those younger and smarter than me to learn about it, so my career is protected. And there is more stuff to talk about so I can keep going to conferences and talking about them.
And with that happy idea, I'm off to start the weekend. Where was that cork screw?
DBMS_APPLICATION_INFO for Instrumentation September 3, 2012Posted by mwidlake in development, Instrumentation, performance.
Tags: Architecture, performance, PL/SQL, Programming, system development
24 comments
I just wanted to put up a post about DBMS_APPLICATION_INFO. This is a fantastic little built-in PL/SQL package that Oracle has provided since Oracle 8 to allow you to instrument your code. i.e record what it is doing. I'm a big fan of DBMS_APPLICATION_INFO and have used it several times to help identify where in an application time is being spent and how that pattern of time has altered.
Some PL/SQL developers use it and some don't. It seems to me that it's use comes down to where you work, as most PL/SQL developers are aware of it – but not everyone uses it (a friend of mine made the comment recently that "all good PL/SQL developers use it". I can understand his point but don't 100% agree).
It is incredibly easy to use. You use the procedures SET_MODULE(module_name,action_name), SET_ACTION(action_name) and SET_CLIENT_INFO(client_info) to set the values of the corresponding columns in V$SESSION for your current session. This is done in memory, there is no inserting or updating of any table rows, so it is incredibly quick and light-weight. The below shows a subset of V$SESSION including the columns that get set:
desc v$session Name Null? Type ----------------------------------------- -------- ---------------- SADDR RAW(8) SID NUMBER SERIAL# NUMBER AUDSID NUMBER PADDR RAW(8) USER# NUMBER USERNAME VARCHAR2(30) COMMAND NUMBER ... MODULE VARCHAR2(64) MODULE_HASH NUMBER ACTION VARCHAR2(64) ACTION_HASH NUMBER CLIENT_INFO VARCHAR2(64) ...
Just something odd to note. MODULE, ACTION and CLIENT_INFO are shown at VC(64) but if you check the documentation you will see that:
MODULE is limited to 48 bytes
ACTION is limited to 32 bytes
CLIENT_INFO can be set to the whole 64 bytes
I have no idea why MODULE and ACTION are limited in this way but it might be historic, backward compatibility with prior versions.
As a quick example of their use:
test_11_2> --demo_dai.sql test_11_2> -- quick demo of dbms_application_info test_11_2> COL sid form 9999 test_11_2> col username form a12 test_11_2> col module form a18 test_11_2> col action form a22 test_11_2> col client_info form a15 test_11_2> -- set module and action test_11_2> EXEC DBMS_APPLICATION_INFO.SET_MODULE(MODULE_NAME=>'SALES_LOAD',ACTION_NAME=>'VALIDATE_ALL_PRICES') test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ ------------------ ---------------------- --------------- 650 ERIC SALES_LOAD VALIDATE_ALL_PRICES test_11_2> -- test_11_2> -- Update the action within a module test_11_2> EXEC DBMS_APPLICATION_INFO.SET_ACTION(ACTION_NAME=>'Update all Prices') test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ ------------------ ---------------------- --------------- 650 ERIC SALES_LOAD Update all Prices test_11_2> -- clear them test_11_2> EXEC DBMS_APPLICATION_INFO.SET_MODULE(null,null) test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ ------------------ ---------------------- --------------- 650 ERIC test_11_2> -- you can set just an action test_11_2> EXEC DBMS_APPLICATION_INFO.SET_action(ACTION_NAME=>'orphan process') test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ ------------------ ---------------------- --------------- 650 ERIC orphan process test_11_2> -- set them to something sensible test_11_2> EXEC DBMS_APPLICATION_INFO.SET_MODULE(MODULE_NAME=>'RETURNS_LOAD',ACTION_NAME=>'MATCH_TO_SALE') test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ ------------------ ---------------------- --------------- 650 ERIC RETURNS_LOAD MATCH_TO_SALE test_11_2> -- client_info can be longer test_11_2> EXEC DBMS_APPLICATION_INFO.SET_client_info(client_info=>'entered this module at '||sysdate) test_11_2> select sid,username,module,action,client_info from v$session where sid=650; SID USERNAME MODULE ACTION CLIENT_INFO ----- ------------ --------------- --------------- ---------------------------------------- 650 ERIC RETURNS_LOAD MATCH_TO_SALE entered this module at 03-SEP-2012 13:07
The intention is that you set the MODULE as you enter a functional chunk of your application (be it a PL/SQL package or a chunk of JAVA, whatever {but be aware of the stateless nature of systems using middle tiers and pooled connections}) and then update the ACTION as you progress. You can set an action with no module, as demonstrated above, but I would recommend against it. On that topic I would make the following recommendations:
- Set the MODULE at the start, eg as you enter a PL/SQL package's main module
- Set the MODULE before you do all the validation – you may wish to see if that validation is as quick as you think.
- Use SET_ACTION to update the action prudently. ie when the activity of the code alters but not all the time. It will come clearer with use, but what you are after is to be able to judge the relative run durations of parts of the application. Too much detail can mask the overall picture. If you can alter code you can always add more instrumentation.
- Clear the MODULE and ACTION explicitly as you exit a package. The activity is lightweight and you do not want any code that lacks this instrumentation to inherit values from calling code.
- Do not set an ACTION without having set the MODULE earlier in the code.
- Keep the text of these values short and specific.
You do not have to look at V$SESSION to see these values, which is good as you may lack the privs needed to do so. Since oracle 9 there have also been procedures to check what the values are set to. e.g:
test_11_2> BEGIN 2 DECLARE 3 V_MODULE VARCHAR2 (64); 4 V_ACTION VARCHAR2 (64); 5 begin 6 dbms_application_info.READ_MODULE(V_MODULE,V_ACTION); 7 DBMS_OUTPUT.PUT_LINE('Module IS '||V_MODULE||' Action IS '||V_ACTION); 8 END; 9 END; 10 / Module IS RETURNS_LOAD Action IS MATCH_TO_SALE test_11_2>
So as you can see, these values can be set, they can be accessed via the data dictionary or the package itself and, if you believe my wild claims, they are very lightweight to use. However, these values really come into themselves with eg OEM's performance screens. I'll leave examples of that to a second post. Here I just wanted to cover how easy it is to set and get the information.
That does lead me onto what I think is the main reason that DBMS_APPLICATION_INFO is not as widely used as it could {and should} be. Developers often lack access to eg OEM and so do not see the full benefit of using it. Also, developers tend to be {note the get-out-clause) more concerned with making the code work and less with monitoring it after it is released. DBA-types tend to be more concerned with monitoring it. Thus the DBA types would want it in the code and developers would not want to spend the time coding it in. We are all one big team though, so some negotiation and beer-buying (or management enforcement) might well resolve that one.
Friday Philosophy – Work Inside Life August 24, 2012Posted by mwidlake in Friday Philosophy, off-topic, Private Life.
Tags: private
add a comment
I know, the usual phrase is "Life Outside Work" but I like to think that, no matter how much we may like our jobs, our overall life is the key thing.
I was prompted to write today's Friday Philosophy when I was reading Neil Chandler's blog a few days ago and saw that he had posted about his up-coming {and now in progress} Banger Rally. He and some mates are doing something very cool in their spare time, taking part in a rally from, basically, Calais in France to Naples in Italy, in a "banger". This is a UK (and wider?) term for an old, tired, worn out car. The most they could spend on the car was £250 and it has to go over some pretty extreme mountain passes. I presume it also has to carry the set of 4 people involved too, so not a lot of weight there then, Neil :-). You can follow their progress at this blog. I was in a pub in Leeds with Neil when he was considering one car for this rally.
I can't claim that I do anything as striking as Neil's current jaunt when not working, but I do like to spend some time doing things that are nothing to do with IT at all. For me, this tends to be physical tasks like cutting down trees with my chainsaw. Or building structures in the garden with wood (OK, half-building them – I constructed the below platform and another out into our pond maybe 18 months ago, both still have no balustrade around them and there is a 45cm gap between the bank and the pond platform – NEXT weekend I'll maybe finish one. Maybe.)
Another garden task recently was building our wood-fired, mud-constructed pizza oven. My wife and I went on a 1-day course to learn how to make a mud-based pizza oven and then spent, ohhhh, about 10 days over 8 weeks building one! We dug a big hole in the garden to get some clean clay (we live in an area that is on top of clay), stole some straw from the horse that lives at the bottom of our garden (long story), bought some sand (because nicking it from beaches is both illegal and bad form) and mixed up our first batch of clay-sand-straw. Add in some old bricks and we got started. It took about 30 lots of mixture, a few alterations to the ratios as we went, but we ended up with this monster.
If you are wondering what the white stuff on the oven is, some ants decided to build their nest in the oven, between the layers I guess (you build the inner oven first and then add several extra mud layers to give insulation and a larger thermal mass, so that the oven stays warm longer).
Like anything, if we did it a second time we would probably make a much better job of it as we learnt so much from the first attempt. One of them was to invite friends with young children over to see us during the build. Kids love the idea of treading the mud mix and you can get a suprising amount of work out of a single ten-year-old (and very insistent I get the age right) German girl if they are allowed to get very muddy.
I found the whole process very relaxing (but very tiring) as you do not need to use too much brain power, slapping the mud mixture on the outside is deeply cathartic and you end up with something useful. Well, slightly useful.
Having built it we then had to learn how to fire it. As an ex-boy-scout I thought this would be easy. Getting the fire going is not too hard, you need to keep it burning well for about an hour to heat up the oven and, one big tip, don't use any damp wood or wood that "spits" (like willow). Having a burning log explode and shower your almost-ready pizza with charcoal embers can lead to angry garden scenes and considerable bad language.
We can just about get a 9″ pizza in there. The pizza in this shot is actually about 6″. The oven was designed to take a 12″ pizza but, errm, I forgot to allow enough space to one side to push the fire into as well.
Another major thing to keep in mind? That arch! You can't put anything in the oven that is larger than that hole. More importantly, you can't get anything out that won't easily come back through that hole. Sticking your arm inside to jiggle things about is also tricky as it gets up to around 300C! {for US readers – about a millon F}
As you can see, the results are anything but professional! And, compared to nipping down to the shops to buy a pizza and just slamming it into the kitchen oven, it takes a lot, lot longer. But you can drink beer or enjoy a bottle of win and sit in the garden whilst getting the mud oven fired and hot. Last weekend we had friends over and the ladies made the pizzas, I cooked them and the other gentlemen helped us work through the beer collection and ate. As for taste? Fantastic.
My wife is far more artistic than I and she makes decorative cakes, sews and now even makes hats when not auditing IT systems (Have you ever been involved in an IT audit and the person knows how to make lists and check them – but can't plug in a PC? Well, Sue was once a DBA and also a Unix Sys Admin, so when she audits you, she finds what you are hiding!). As such, maybe as an industry we should encourage her hat-making
So what, if anything is the point of this Friday Philosophy, other than to show off my pizza oven and my wife's hats?
Well, I see this outside work activity as important in the workplace as well, especially if you are having to manage people. Firstly, it is important, I feel, for us all to do something we really enjoy to relax and re-energize (and this can be "computers" for IT people, but as I get older I notice more of my friends who were utterly technology-focused in their 20's are now moving more towards non-IT hobbies).
Secondly, what people do in their spare time can tell you a lot about the person and what keeps them happy. If they have hobbies that are artistic and their IT job is very regimented, it could indicate they would be happier with some more less rigid task in the mix, say some design work. If they have NO outside hobbies, you are probably working the poor dears a little too hard!
Thirdly, and I have seen this for real, you may have a person or a team that is not performing well in the office – but it turns out a lot of them do interesting and challenging things at home. Someone who can motivate themselves to be a part-time fireman or has the dedication to train each day for a sport has skills and energy. Why, as their manager, am I not seeing much of these traits in the office? Because they are not happy and/or motivated. So I have an issue to sort out. I don't manage people at present, but I still find it interesting what people do and achieve outside the office as it can indicate that they have talents and skills not being seen in the workplace.
I wonder how I can introduce my chain-saw skills into performance tuning?

subset: commoncrawl


text:
Duck meets interesting buddies at the table and ends up as the wholesome meal.
Duck is a star anyway. Here it ends up getting a lot more attention. The whole duck breast is seared and then baked.
The mild flavour of the smoked duck along with Cointreau emulsion and curry powder brings alive a spectrum of textures. Piled on top of mashed potatoes, the duck ends up being a wholesome meal.
Lightly smoked duck
1 duck breast
4 gms salt
3 gms rosemary
1 blood orange
10 ml Cointreau
4 gms Madras curry powder
10 gms ghee
10 gms butter
2 gms hazelnuts
80 gms mashed potatoes
50 gm pokchoy
Make gashes on the duck and season it with some herbed oil and salt. Place the duck breast in a heavy pan and sear it slowly, allowing the fat to melt. Once the skin is a nice golden brown, sear the other side. Then place the duck breast in the oven at 180 degrees Celsius.
On another pan, heat the ghee and sauté some onions till golden brown. Add in the curry powder followed by the orange segments. Deglaze the pan with some white wine. Reduce this mix and finish with the Cointreau and butter. Use the duck fat from the skillet, heat it and add the hazelnut followed by mashed potatoes. Place the mash on a plate and top it with some sautéed pokchoy. Take the duck out of the oven, slice and place around the mash and finish with the sauce. Garnish with some assorted chiffonade and serve hot.
Mayank Tiwari is the first chef to come from the family. With an army man father and architect brother, the senior sous chef at Smoke House Grill almost followed his mother's path lured by chemistry. But food and cooking finally won him over.


text:
When I saw the pigments at the Formulary, Sandy King was standing next to me along with Bud. They described that these were pigments used in making up the carbon Glop and as such were stable mixtures. They were about the consistency of paint and came in 6 colors plus black. Bud had partially full 1 L bottles (not for sale) that had apparently been used in one of Sandy's workshops which had just finished that week.
A book on color photography, by Leadly and Stegmeyer, describes this and several other color processes akin to Dye Transfer.
A google search for Ultra Stable will show you a company in California that makes the reflective support. I have a roll about 4 ft x 25 ft. Mark Osterman and I have been using it as a support for our various print experiments. I took a short roll of it over to his home about 2 weeks or so ago for him to make some prints on.


text:
Results 1 to 18 of 18
Thread: The Uncanny Valley
March 26th, 2005 #1Registered User
- Join Date
- Jul 2003
- Location
- Bellevue, WA
- Posts
- 1,003
- Thanks
- 506
- Thanked 678 Times in 186 Posts
- Follows
- 0
- Following
- 0
The Uncanny Valley
If this video doesn't scare you, I don't know what will.
for more on the Uncanny Valley...
- Similar Threads
- The uncanny valley
- Art: B&W Photo Class Project "Uncanny Pulp Covers"
- Uncanny Valley
Hide this ad by registering as a memberMarch 26th, 2005 #2
this will...
great video James, thanks for the share and creep
March 26th, 2005 #3
Creeeeeppppyyy!!!!! That "thing" reminded me of those famous heads in a jar on Futurama.
-Brad Cossey
The secret to creativity is knowing how to hide your sources.
March 26th, 2005 #4
"For the moment, I am just a machine. And yet someday, I might be fully alive and aware."
Future generations are going to find this video and aren't going to be able to figure out how we were able to miss the signs. The machines were practically mocking us with their prophecies. And then the people of the future will hang their head in shame at their foolish ancestors, but only for a second because THERE'S A ROBOT DEATH SQUAD IN THE BUILDING!
www.WhereIsMyEyeball.com My portfolio! Go check it out!
March 27th, 2005 #5Registered User
- Join Date
- Jul 2004
- Posts
- 1,082
- Thanks
- 0
- Thanked 4 Times in 4 Posts
- Follows
- 0
- Following
- 0
great find, james!
this stuff really creeps me out. but i find it highly interesting and amusing.
March 27th, 2005 #6
Woa that's very freaky and cool at the same time. Great find James, this is actually of great help for a project I'm currently working on for school .
"It's too bad she won't live! But then again, who does?"
March 28th, 2005 #7Registered User
- Join Date
- Jul 2003
- Location
- Queens, New York, United States
- Posts
- 1,477
- Thanks
- 0
- Thanked 2 Times in 2 Posts
- Follows
- 0
- Following
- 0
THat's scary...
THe dude was even surprised by that response...
T-Rex tissue and Robots...crazy times we live in...crazy times..
March 28th, 2005 #8
umm is that real ??? Did the response from the robot actually came from the robot itself ???
March 28th, 2005 #9
i cant make out what she say before "and thats your answer." Could anyone who does please type that here?
When she looked at the camera after saying "alive and aware", i nearly shat my pants. Creepy stuff.
March 28th, 2005 #10
slash, he asked if she can anticipate things, she replied with a laugh and saying that she had anticipated another question
i think this stuff is great, who knows where this will go
March 28th, 2005 #11
this is also very...."interesting yet disturbing" ^^°
Chat with an artifical Inteligence called A.L.I.C.E.
Kinda interesting
Originally Posted by Ilaekae
Baron Carnifex
Duke Corky
March 28th, 2005 #12Originally Posted by corky13
"I will become smarter than humans."
damn....I think they monitor the chat sessions there...cool nonetheless.
March 28th, 2005 #13
that shows me, that when i'm 60, there will be human like robots, feel and act like a human. it will be scary. people will lose jobs, robots will become utterly annoying to people and terrorist will use them against us.
Do you know the muffinman?
Originally Posted by creatix
Once you understand what the word "stupid" means - age is no longer a valid excuse for being that way.
March 29th, 2005 #14
I dunno to me it looked like the whole thing was scripted and maybe he was doing some tweaking of things on his laptop but maybe not. I have my doubts about AI, not really based on facts though, it just seems to me that we don't have a good enough understanding of how the brain itself actually works to create something that would emulate it 100%. Its definitely pretty creepy though.. maybe one day we really will need robot insurance
Cave House Studios - creative animation and video
What the Sketchbook
March 29th, 2005 #15
hahaha yeah maybe the stuff is realy monitored ^^
If you want to have a good and informing read about artifical inteligence compared to us human beings you should search for Bas Hering`s books. (The one im referring to is called "Sind wir wirklich so intelligent wie wir denken ?" which means something like="Are we truly such intelligent as we think ?")
Originally Posted by Ilaekae
Baron Carnifex
Duke Corky
March 29th, 2005 #16
A.I. is growing by leaps nowadays... But I wonder how much of this is actually intelligence and not scripted rethorics. Reminds me of Dr Sbaitso back in in the mid 90's
I'm also extreeeeeeeeemely happy everyone is getting more and more aware of the uncanny valley. It's going to have a huge impact on the entertainment market...
March 29th, 2005 #17Originally Posted by egerie
-Call me Semaj for short.
March 29th, 2005 #18
Not true AI. Computers are good at logic, but that's about all they're good at. True AI is probably 20-50 years away. The physical capabilities of robots are going much faster. Maybe robots are will be smarter than humans are today, but with nanotech we could concievably reach new heights of pretty much everything. I'd hope the future with robots is more to grow together than have one overtake the other. Then we'll all be superintelligent cyborgs!
Doesn't change the fact that robots are insanely cool. I'm not scared yet.
Art is long and time is fleeting


text:
Mon Power to Conduct Storm Restoration Drills to Help Employees Prepare for Real-Life Events
FirstEnergy Extends Lease at Downtown Akron Headquarters
Mon Power Utilizes Aerial Saw for Tree Trimming Program
FirstEnergy Promotes Executives to Lead Marketing and Corporate Strategy
FirstEnergy CEO Jones Reviews Company's Strategies
JCP&L Recognized Among Top Utilities in Nation for New Solar Installations
New FirstEnergy Transmission Substation Nears Completion in Elk County, Pennsylvania
JCP&L to Conduct Annual Storm Restoration Drill to Help Employees Prepare for Real-Life Events
Potomac Edison to Conduct Storm Restoration Drill to Help Employees Prepare for Real-Life Events
FirstEnergy Expands Transmission Substation in Frederick County, Maryland
FirstEnergy (NYSE: FE) is a diversified energy company
dedicated to safety, reliability and operational excellence. Headquartered in Akron,
Ohio, FirstEnergy includes one of the nation's largest investor-owned electric systems
and a diverse generating fleet with a total capacity of nearly 17,000 megawatts.
©2015 FirstEnergy Corp.


text:
0800 652 5090
Sales open 9am to 8pm
SKU# 261-00319-configurable
Combining stylish design and midnight black faux leather, our Angel bed frame will be a fabulous addition to your bedroom.
The distinctive design of our Angel, with a tall, scrolled headboard and matching foot scroll, will look stunning whether you have a traditional or contemporary style of bedroom décor. Featuring crystal detail in both the head and foot end, the glamorous Angel Bed Frame makes an impressive statement.
The look is completed with stylish black gloss feet.
To experience comfort at its best, choose from our wide range of mattresses to go with your chosen bed frame.
Download Assembly Instructions
Product code: 261-00319
Further Delivery Information
Returns, Refunds and Amendments
Further Returns & Refunds Information
Copyright © Dreams Ltd 2015 Registered in England and Wales Company Registration no. 8428347 *Our free, Basic Delivery Service cannot be used when purchasing Assembly Services and excludes Bedding and TV Beds. †Excludes Tempur Divans and pillows
We take the following payments:


text:
You are a fan of pg13 george ? Come to discover the best forums pg13 george on the internet and share your experience with a community fan of pg13 george . You can also build a forum pg13 george and create your online discussion.
A George Clooney forum for, for by, his fans.
#george, clooney, forum, messageboard, dating, news, pictures, gossip, fansite, zeidler, nick, rosemary, girlfriend, stacy, keibler, smokehouse
An interactive forum site where you can follow trials, crime, and criminal cases.
#george, zimmerman, ernest, hoskins, trayvon, martin, jodi, arias, james, holmes, casey, anthony, baby, gabriel, elizabeth, johnson, forum, death, murder, self-defense
A fantasy land where two wolf packs live in an unstable peace. The pack leaders each control a dominant season and can change the weather of their land.
wolf, roleplay, temperatures, collide, pack, wolves, role, play, unstable, peace, magic, fantasy, seasons, summer, winter, control, awesome, friendly, #pg13, family, queen, kingdom, natsu, aisu


text:
This comment is currently awaiting admin approval, join now to view.
A group for all the Mugen fans, and 2D fighting game fans.
This is a tutorial on how to add screenpacks to MUGEN 1.0, a new version released by Elecbyte.
Posted by -_!_-FRAGKILLER-_!_- on Jun 8th, 2013
Basic QA/Testing.
Before i start, this tutorial shows how to add screenpacks to Mugen 1.0, since adding screenpacks in it has a little more steps than adding them into WinMugen, as to my experience.
So you got Mugen 1, a compatible screenpack, but you don't know what to do, or you know, but it didn't went out exactly as it's planned. I'm here to give a little tutorial to add screenpacks in to your Mugen 1.
1. Just like older versions, each content inside Mugen has a folder called "data". In WinMugen, you just extract the screenpack content inside the data folder itself. In Mugen 1, it's different. Inside "data", there is another folder called "mugen1". So, open your screenpack, whether if it's a .rar, .zip, or .7z, it desn't matter. If you still not have a screenpack, then download one.
2. Extract the content into "/data/mugen1". Open up mugen.exe, and wait until the title screen pops up.
3. Not what you expected, huh? The screenpack is disorted from up or down. Depending on what video resolution Mugen is using, open mugen.cfg in the data folder, and scroll down, until you see the option to change video resolution. (Note: This is not to be consfused with another video option when you scroll down once more. The real option is not a comment and doesn't have this;). Now, change it to 640x480. Then scroll down a bit until you see an option for fullscreen. Enable it, close the .cfg file, and save.
4. Try it out. If it works, marvel at your success, download random characters, insert the in your game, and play couple of rounds. If anything you do goes wrong or it didn't work, you're free to ask questions in the comment section below.
This is per my experience. If any of you reading this have a different experience, comment it out and i'll find a solution.
It depends on what screenpack you use AND if it's compatible with the MUGEN version. If you use WinMugen Screenpack in Mugen 1.0, then it definitely does not work because of the compatibility issue.
Ihave mugen 1.0 and have followed all steps but it dosent open and instead i get an error message Error message: Error loading TitleBG
Error loading system data: data/IMT03/system.def
Library error message: Sprite doesn't exist: 5,0
Error in [TitleBG 0]


text:
Armored Saint
Los Angeles, California's Armored Saint have released their seventh studio album today! Head over now to metalblade.com/armoredsaint to jam this amazing album in its entirety below it's available in stores.Read More
The Great Discord
Garnering critical acclaim worldwide, The Great Discord are now ready to release 'Duende' to the public. 'Duende' is now available to stream in its entirety at metalblade.com/thegreatdiscordRead More
'Rise to Power' will be released worldwide on Metal Blade Records on August 21st, 2015. The new song, 'Not Your Slave', is streaming at metalblade.com/battlecross, where pre-order is also possible.Read More
Culture Killer
Florida natives, Culture Killer, have signed with Metal Blade Records and are preparing to record their full length debut! Previously, the band had released the 'Denial' EP in 2014, and a single 'Exterminate Filth' earlier this year.Read More
German/Dutch Thrash commando DEW-SCENTED have launched the 2nd song taken off their new album 'Intermination', to be released the 12th of June in Europe!Read More
Cattle Decapitation
Cattle Decapitation to release 'The Anthropocene Extinction' this August via Metal Blade Records! First single unveiled!Read More
The Great Discord
Today the band further expands upon their intriguing and mystifying visuals with a new video for the song 'The Aging Man'. The video was directed by Philip Kullgren and edited by Joakim Sjoholm.Read More
Six Feet Under
'Crypt Of The Devil', the latest platter of brutality from iconic death metal merchants, SIX FEET UNDER, crushed the Billboard charts this week debuting at #13 on the Hard Music Chart.Read More
New Releases
Upcoming Releases
Latest News
RIVERS OF NIHIL release new studio video!
- 10/09/13 – RIVERS OF NIHIL have released the second of three studio...Read More
HAIL OF BULLETS launch video teaser for new album with bits of new music and reveal album title and artwork!
- 03/09/13 – Dutch Death metal giants HAIL OF BULLETS have launched the...Read More
SIX FEET UNDER add another date and announce support bands for European tour!
- 03/09/13 – American Death Metal veterans SIX FEET UNDER return to...Read More
KILL DIVISION launch landing page with debut single, album cover and pre-orders for 'Destructive Force'!
- 26/08/13 – Dutch Death/Thrash metal brigade KILL DIVISION has...Read More
NOCTUM Reveal Album Artwork and Track Listing for New Full-Length Album Final Sacrifice
- 26/08/13 – Available October 28th on Metal Blade Records Swedish...Read More
PILGRIM coming back to Europe in November to support WINDHAND for a full tour!
- 26/08/13 – Ready to enter studio next month! Rhode Island Doom...Read More
TÝR releases 'Another Fallen Brother', the third single taken off new album 'Valkyrja', exclusively via website of Metal Hammer Germany!
- 26/08/13 – Faroe Islands very own TÝR have just the third single...Read More
IN SOLITUDE announce new album and stream title track 'Sister'!
- 21/08/13 – Sweden's IN SOLITUDE have announced their third...Read More


text:
Full or fin keel?
View Single Post
Senior Member
Join Date: Nov 2012
Location: Hood River
Posts: 312
Thanks: 1
Thanked 4 Times in 3 Posts
Rep Power:
Re: Full or fin keel?
Originally Posted by
Depends on where you sail. If I was doing an ocean passage I'd want a full keel, a fin in heavy seas is much more apt to be squirrelly. If you are not on open seas a fin is much more maneuverable. I had a Cal 9.2 that turned on a dime. But in big following seas one must be really be diligent at the helm. It's a great deal of work. The above 3/4 keel and skeg hung rudders are a good compromise. I plan on blue water cruising, Bermuda...ocean crossings. My choice for that is full...
Daledog, Many of us here in N. America thought the same as you and most still do about the full keel/fin keel in heavy seas etc. But like outbound said those ideas are outdated. The new designed boats being built over in Europe have solved those problems for open ocean crossing. And we here in N. America still remain clueless that for the last 10 years on the other side of the pond they have been enjoying wonderfully built boats that behave better in many ways than our traditional boats on all points of sail in big water as well as small water.
Boy if you have not read the "interesting boat" post take a look at it there is lot of good stuff in it.
View Public Profile
Send a private message to hannah2
Find all posts by hannah2


text:
Looking Back, and Up, at a Seattle Icon
Seattle's Space Needle opened in 1962 as part of the World's Fair. Knute Berger, author of Space Needle: The Spirit of Seattle, discusses the history and engineering behind the tower, and explains why a symbol of "the future" from days gone by still has relevance today.
You must be signed in to leave a comment. Sign In / Register
Please keep your community civil. All comments must follow the NPR.org Community rules and terms of use, and will be moderated prior to posting. NPR reserves the right to use the comments we receive, in whole or in part, and to use the commenter's name and location, in any medium. See also the Terms of Use, Privacy Policy and Community FAQ.


text:
1953 Chev Bel Air Hardtop Coupe, radio, heat, power glide, runs well, restored and in good condition. Price: $17,950 Contact: 559-288-8945... More
Six cylinder, automatic, power top, very clean. Selling @ the Auburn Spring collector car auction, May 8th & 9th in Auburn Indiana. Register to... More
Now available in our Las Vegas Indoor Showroom! HIGH END CUSTOM 1953 Chevrolet 210 2 Door Coupe. A Very Well Built Chevy, over $110,000... More
We got a lot of customers in our showrooms who want the look of an old car but not the hassles, and this 1953... More
This street rod has a unique pain job! Teal, Watermelon and Apricot!! Engine is Chromed 350 Turbo Trans with shift kit 1974 Chevy 350, Bored .030 Over... More
Talk about a sweetheart, WOW WHAT A FIND! 1953 Chevrolet Bel Air 2 door sedan finished in the period correct Baby Blue with a... More
Solid original car with older repaint in original colors and still in excellent condition. Everything works and includes vintage Fenton cast iron exhaust headers... More


text:
Illinois Public Media News
In-depth reporting from WILL, NPR, the Associated Press, and other sources
Contact WILL News at email@example.com
(AP Photo/Seth Perlman)
May 21, 2015
(AP Photo/Hannah Foslien)
May 21, 2015
Illini Win Streak Continues In Big Ten Tourney, 3-2 Over Nebraska
(AP Photo/Mark Lennihan)
May 20, 2015
Inside The Supreme Court's $10-Billion Arguments
Michael Conroy/AP Photo
May 19, 2015
The Changing Culture Of Competitive College Sports
(Photo: Wikipedia)
May 19, 2015
U of I Entomologist Praises White House Plan To Help Bees, Pollinating Insects
(AP Photo/Gerald Herbert)
May 19, 2015
Supreme Court To Hear $10B Philip Morris Appeal
(AP Photo/Mel Evans)
May 18, 2015
UI Women's Basketball Program Faces Abuse Allegations
(AP Photo/M. Spencer Green)
May 17, 2015
U of I President Timothy Killeen Optimistic Despite Uncertain Times
Page 2 of 909 pages < 1 2 3 4 > Last ›
WILL Newscast audio
NPR News
Chicago Bears Release Ray McDonald After Arrest For Domestic Violence
Reports: Charter Communications To Buy Time Warner Cable For $55B
On Memorial Day, Obama Honors Sacrifices Of Service Members
Iraq, Iran Push Back Against Defense Secretary's Comments On Iraqi Forces
Police: Malaysia Uncovers 139 Mass Graves Believed To Hold Migrants
Ex-Israeli Leader Ehud Olmert Sentenced To 8 Months In Corruption Trial
Texas Governor Calls Flood Damage 'Devastating'
Juan Pablo Montoya Wins Second Indy 500
Defense Secretary Carter: Iraqi Forces Lack 'Will To Fight' ISIS
Malaysia Finds Gravesites In Camps Used By People Smugglers
More NPR News
WILL Highlights
Brian Moline named WILL 'Morning Edition' host
Longtime WDWS sports and talk host will join WILL Radio staff on June 1.
Concussions more likely in practices than games
Parents worry about a child getting a concussion in the heat of competition, but they also need to be thinking about what happens during practices.
Unaccompanied minors adjust to life in US classrooms
From NPR: About 68,000 unaccompanied minors from Central America have entered the U.S. in the past year.


text:
Webster's Falls
|Webster's Falls
Webster's Falls
|Hamilton, Ontario
|Total height
|22 m (72 ft)
|Total width
|30 m (98 ft)
|Spencer Creek
Webster's Falls, noted for its panoramas, is a 22 metre high classical curtain/ plunge waterfall found in the Spencer Gorge/Webster's Falls Conservation Area in Hamilton, Ontario, Canada. The water flows down Spencer Creek. In the past the falls have been known by various names such as Dr. Hamilton's Falls, Spencer Falls, Hart Falls, Fisher Falls and Flamborough Falls.[1]
Within the associated park, there are washroom facilities, picnic tables (20) and sheltered areas at the top of Webster's Falls, as well as a parking area for up to 75 cars. The cobblestone footbridge, as well as a newer and narrower stone/concrete footbridge, crosses over Spencer Creek to the west side, which then leads to a series of 122-steps, allowing access down to the base of the falls.[2] You can no longer go down to the base of the falls as of Spring 2015
A less popular, but still common, area of interest at the base of the falls is found around the edge of the cascade. Under the falls is niche worn behind the curtain. Due to the cap-rock on top of the falls being made of a more resistant material, the falls are neatly slotted underneath and allow people to view the falls from the opposite side. It can however be a dangerous endeavor and should not be attempted unless one is extremely cautious. It is never advisable to venture behind the falls during winter.
The Bruce Trail runs through this area. It is popular with hikers and family picnics. Improvements to the existing trail have been made on many occasions. Other nearby attractions include a convenience store and an antique shop.
Ownership of the land has changed several times. Originally the waterfall was known as Dr. Hamilton's falls, after Dr. James Hamilton purchased the land in 1818. The waterfall, and 78 acres (320,000 m2) of the surrounding land, were purchased shortly after by Joseph Webster when his family arrived from England in 1820. The Webster family manor still stands on Webster's Falls Road, and their gravestones have been preserved in a small section just off the Bruce Trail, on the way to Tew's Falls. In the will of former Dundas Mayor, Colonel W.E.S. Knowles, a request to the town was issued asking for the area around Webster's Falls be made into a public park. A foundation was established to channel revenue into park improvements. In 1933, the grounds were landscaped, a stone bridge constructed across the creek above the falls, and an iron fence installed to make the viewing at the ledge safer. The current owner of the land is now the Hamilton Conservation Authority.
Webster's Falls in Popular Culture[edit]
Webster's Falls, according to Joe Hollick, has the highest number of vintage postcards bearing its image; this suggests that it has been the most frequently visited waterfall in Hamilton for more than a century.
Webster's Falls is shown in the 2005 Sci-Fi movie "Descent", though it is portrayed as being an anonymous waterfall in the Pacific Northwest. During the movie a river of lava pours over the falls, nearly killing the star, Luke Perry.
Russian professor, Oleg Polyansky, was part of a team that had discovered water vapour on the sun when working in Waterloo. When giving lectures internationally about his discovery, he always uses an image of Webster's Falls as a key example.
"Baby Webster's Falls"[edit]
Baby Webster's Falls is a complex ribbon waterfall which has water mainly during seasonal storms and after the winter snow melts. Its height is 20 metres and its width is 3 metres (10 ft) It is located on a tributary of the Spencer Creek, on a separate ravine near Webster's Falls and can be seen from both the top and bottom of the gorge. It is located to the right and bottom of the stairway leading down to the base of the Webster's Falls and is often missed due to its relatively little water flow, particularly when compared to the main falls just to the left side of the stairway.
In Hamilton, take Main Street West past McMaster University and straight into Dundas. Take it straight past the library and up the hill. There are signs pointing in the direction of the falls. Admission is $10 per vehicle and the parking lot is enough for 75 vehicles.
Webster's Falls can be reached from Tew's Falls via a 30 minute hike along the Bruce Trail.[3] Alternatively, to reach Webster's Falls by car, take Highway 8 from Dundas. Keep right on Brock Road and go right at the light onto Harvest Road. Turn right on Short Road, then left onto Fallsview. Keep following the signs all the way to the parking lot.
From Toronto you can go West on Dundas Street (Highway#5) until you turn south on Brock Street (To Greensville), left on Harvest road.
See also[edit]
- ^ "Hamilton- Waterfall Capital of the World". (www.cityofwaterfalls.ca). Retrieved 2008-07-05.
- ^ Hamilton Waterfalls and Cascades: Research & Inventory Report, 2nd Edition. Hamilton Conservation Authority. November 2007.
- ^ "Great Lakes Waterfalls & Beyond: Tews Falls". (www.gowaterfalling.com). Retrieved 2008-07-09.
|Wikimedia Commons has media related to Spencer Gorge / Webster's Falls Conservation Area.
External links[edit]
- Cascades and Waterfalls of Hamilton (www.waterfalls.hamilton.ca)
- Bruce Trail (www.brucetrail.org)
- Hamilton- "The Waterfall Capital of the World" (www.cityofwaterfalls.ca)
- Vintage Postcards: Waterfalls in and around Hamilton, Ontario
Video clip[edit]


text:
Enter your name and email to receive alerts when new vacation deals are added to any property in this region.
By clicking "Submit" you are agreeing to the
Terms of Service.
Alert successfully created!
Hill Country Texas Articles
Showing 1-1 of 1 Fishing Resorts
Cockleburr Cove
Cockleburr Cove is located on Inks Lake, one in the chain of Highland Lakes in Central Texas. It is a constant level lake, ideal for water sports. There are four deluxe vacation houses with easy access to the lake and each available to rent on a weekend, weekly, or monthly basis throughout the year. There are also two small sleeping cottages for... more
- Wifi
- Restaurant Onsite
- Pets Allowed
- Property Size 6 units
- Conference Facility
- Kids Allowed
- Nearby City Burnet
- Nearby Water Inks, Buchanan, LBJ
- Open Dates All Year
- Family
- Fishing
- Lake
Showing 1-1 of 1 Fishing Resorts


text:
- Musician's Friend Best Selection, Price & Service. Guaranteed.
Call our Gear Heads
at: 800-449-9128
Call our Gear Heads
at: 800-449-9128
Find a similar product below or contact our experts for a recommendation of great alternatives. Call us at 800-449-9128.Similar Items:
Find a similar product below or contact our experts for a recommendation of great alternatives. Call us at 800-449-9128.Similar Items:
Small-body bliss.
The vintage-style Guild Guitars GAD-F20 acoustic offers you a high quality, all-solid wood guitar of exceptional value. Appointments like a solid spruce top, solid mahogany back and sides, flame maple binding, mahogany neck, and rosewood fingerboard take the Guild GAD-F20 out of the ordinary guitar realm. Other generous enhancements include a rosewood bridge, bone nut and saddle, and mother-of-pearl dot inlays.
The GAD-F20 guitar's concert body style minimizes overtones, boomy bass, and reverberation while offering more focused sound projection from a body slightly smaller than a dreadnought guitar.
While particularly well suited for fingerpicking, the concert guitar body fits into any musical setting.
The solid spruce top contributes balance in tone, and the solid mahogany back and sides offer crisp attack, with plenty of projection right out of the box. The rosewood bridge and fretboard produce lasting sustain, and the Grover vintage-style chrome-plated open-back tuners offer precise tuning.
Other noteworthy features include 24-3/4" scale length, 13-3/4" lower bout width, dovetail neck joint, scalloped spruce braced top, mother-of-pearl headstock logo, and mother-of-pearl dot position inlays. But wait, there's more: cream colored bridge pins with black dots, bone nut and saddle, tortoise shell pickguard, and a factory installed forward strap button with internally braced support. Dressed in a high-gloss polyester finish, the GAD-F20 acoustic is sure to be an instant favorite in your guitar collection.
Guild Acoustic Design (GAD) series guitars are designed to be the right musical tool for the job. High-quality, all-solid wood guitars, they offer you an exceptional value.
Now you can experience the legendary sound of a Guild at a more affordable price than ever, and get a guitar capable of crafting your perfect performance.
Reviewed by 3 customers
Sort by
I just bought a Guild GAD f20 from Musician's Friend. I have owned many guitars over a 40 year span, but this is my first "small body" guitar. I love it. It is easy and inviting to hold and play. The sound is bright and "alert", if that word works here? It is less resonate by far than my Gibson J 150 or Martin D 18. But is is somehow more "player friendly". It lends itself to picking out new melodies and playing with things other than traditional strumming and rhythm guitar. I find I am playing it more than my other guitars, and that is only partly because it is new. It is also just fun guitar with which to experiment. It will make you want to get creative.
I've played guitar for decades, but hadn't played that many Guilds till recently. The ones I tried were very good quality, so when I was searching for a smaller guitar and ran across a Guild GAD-F20 at a local store, I couldn't wait to try it out. I was surprised at the amount of tone for a smaller guitar. It sounded great, not boxy, quiet or tinny. And man, I couldn't believe the nice appointments for the price! The flamed maple binding and tail block absolutely glow, the gloss finish is perfect, the tuners are nice and everything is first rate. And after all that, it also comes with a good quality hard case.I went back to try that GAD-F20 two weeks later and it was just as good as I remembered. I took it home with me, and every time I open the case, it blows me away with how beautiful it is, I've got a torn rotator cuff, but the smaller size doesn't hurt to hold - and once I start playing, I get that thrill you get from a really great sounding guitar. This isn't my only guitar, and it's far from my first, but if you're looking for a smaller guitar, I don't think you'll find many that sounds and feels as good as the Guild GAD-F20.
This is my first all solid wood guitar. I spent two years looking for the right fit, sound, and price. I played every small body I could get my hands on from Martin, Taylor, et al. None of them could strike the right balance between the quality of sound and price point. But the moment I picked up and played the Guild GAD F20, I knew it was the perfect guitar for me. It has an amazingly balanced sound that accommodates both finger picking and strumming. Also important for me was it's size. With the lower bout I am able to play for long periods of time without my should beginning to hurt as it does on Grand Auditoriums and Dreadnoughts. I don't normally write reviews, but the F20 has been such a blessing I felt it important to share with others. Don't be afraid to take a chance on this amazing instrument. I don't think you'll be able to find a better guitar at this price point, ever.
Our product catalog varies by country due to manufacturer restrictions. If you change the Ship-To country, some or all of the items in your cart may not ship to the new destination.


text:
'Jeane Lim-Napoles' photo does rounds of international news websites
More News from Julliane Love de Jesus
More News from INQUIRER.net
MANILA, Philippines – Some international news websites posted the photo of a woman bathing in money who was identified as Jeane Lim-Napoles, the daughter of detained businesswoman Janet Lim-Napoles.
Huffington Post, an online news aggregator based in the United States, ran a story on the younger Napoles facing tax evasion charges filed by the Bureau of Internal Revenue (BIR) here on Thursday and used the photo that was linked to a Facebook hate page that bashed the young Napoles for her lavish lifestyle.
But the woman in the photo isn't Jeane Lim-Napoles. INQUIRER.net pointed this out in a comment below the report and by others on Twitter.
The Huffpost article sourced its story from news.com.au, an Australia-based news website, which in turn cited the Agence France Presse.
The Facebook page had the name of Jeane Lim-Napoles and posted status and photos slamming the youngest daughter of the detained businesswoman, the alleged brains behind the P10 billion pork barrel scam.
The photo started to circulate after news.com.au uploaded on Thursday the picture with a caption: "A photograph posted on social media sites by Jeane Lim-Napoles, the daughter of Manila businesswoman, Janet Lim-Napoles, show an extravagance that has attracted the eye of the tax man."
Aside from Huffington Post, this same photo was also posted on the dailymail.co.uk.
Jeane Catherine Napoles was charged with tax evasion on Thursday for allegedly failing to declare income for multimillion-peso properties she had purchased and registered in her name, including a Ritz Carlton unit in Los Angeles, California worth P54.73 million.
She also has a share equivalent to P1.49 million, in a Bayambang, Pangasinan property purchased in 2012.
Related story:
Luxury-loving Napoles girl charged with tax evasion
Get Inquirer updates while on the go, add us on these apps:
Disclaimer: The comments uploaded on this site do not necessarily represent or reflect the views of management and owner of INQUIRER.net. We reserve the right to exclude comments that we deem to be inconsistent with our editorial standards.
To subscribe to the Philippine Daily Inquirer newspaper in the Philippines, call +63 2 896-6000 for Metro Manila and Metro Cebu or email your subscription request here.
Factual errors? Contact the Philippine Daily Inquirer's day desk. Believe this article violates journalistic ethics? Contact the Inquirer's Reader's Advocate. Or write The Readers' Advocate:
c/o Philippine Daily Inquirer Chino Roces Avenue corner Yague and Mascardo Streets, Makati City,Metro Manila, Philippines Or fax nos. +63 2 8974793 to 94


text:
The Smithsonian's Kogod Courtyard, built in 2007 as a modern complement to the nineteenth-century museum's Greek Revival–style architecture, is an oasis in downtown Washington, DC.
The Spain-USA Foundation is organizing cultural events in Washington, DC all summer. The latest is "FOODJECTS: Design and the new Cuisine in Spain," an exhibition of over 100 kitchen-related objects available through Apartment Zero. The dishes, utensils, and other kitchenware designs are beautiful, useful, and thought-provoking.
Design for a Living World is a new "green" exhibition at the Smithsonian Cooper-Hewitt National Design Museum in New York City. For the show, the museum commissioned ten leading designers to create innovative products out of sustainably grown and harvested materials. The designers, who include Maya Lin, Kate Spade, and Isaac Mizrahi, each chose a different geographic region.