Have you ever heard a song that as you listened, your heart shouted,
"Thank You, Jesus!"? This is one of those for me...

"You Are Good"--Nicole Nordeman

When the Sun starts to rise and I open my eyes
You are Good, So Good
In the heat of the day with each stone that I lay
You are so Good

With every breath I take in
I'll tell You I'm grateful again
When the moon climbs high
before each kiss good night
You are Good

When the road starts to turn around each bend I've learned
You are good, So Good
And when somebody's hand holds me up, helps me stand
You are...So Good

With every breath I take in, I'll tell You I'm grateful again
'Cause It's more than enough just to know I am loved
and You are Good

So how can I thank You? What can I bring?
What can these poor hands lay at the feet of the King?
So I'll sing You a love song.
It's all that I have to tell You
I'm grateful for holding my life in Your hands.

When it's dark and it's cold and I can't find my soul
You are Good, So Good
When the world has gone gray and the rain's here to stay
You are STILL Good

With every breath I take in I'll tell You I'm grateful again
Though the storms they may swell, even then it is well and
You are Good

So how can I thank You? What can I bring?
What can these poor hands lay at the feet of the King?
So I'll sing You a love song.
It's all that I have to tell You
I'm grateful for holding my life in Your hands

You are holding my life in Your hands

 

....Does anyone want to learn to play this song so I can sing it??

'영어앤영문권' 카테고리의 다른 글

My Body  (0) 2008.05.06
You are holy  (0) 2008.04.27
Who is Israel Houghton?  (1) 2008.04.13
Friend of God - Israel Houghton  (0) 2008.04.13
Turn it around  (1) 2008.04.13
Posted by '김용환'
,

spark 2008

신앙 2008. 4. 26. 22:34

Hillsong교회의 달링 첵과 함꼐하는 성령집회가 4월 25일 금요일 저녁에 있었다.

 

힐송유나이티드(Hillsong United) 초청 영적대각성 집회였는데..

(1부: 스캇 브래너&레위지파 / 2부: 말씀과 기도 / 3부: 달린 첵 & 힐송밴드)

 

음 대단했다.

 

생전 처음 이런 콘서트 분위기 첨인데...

 

너무 좋았다.

 

Hill song의 노래들을 많이 들을 수 있었고, 감동받았다.

 

자세하게 찬양을 알 수 있어서 좋았다.

'신앙' 카테고리의 다른 글

내면 상태 측정기  (0) 2011.11.08
2009년 3월 11일 오전 0시 32분에 저장한 글입니다.  (1) 2009.03.11
You are so good.  (0) 2008.04.26
Posted by '김용환'
,

You are so good.

신앙 2008. 4. 26. 22:30

 

 

I love you Lord.

Thank you God

You are good.

You are kindess.

You are so good.

Every moment I take in,

I sing song for you Lord.

 

I love you Lord...

'신앙' 카테고리의 다른 글

내면 상태 측정기  (0) 2011.11.08
2009년 3월 11일 오전 0시 32분에 저장한 글입니다.  (1) 2009.03.11
spark 2008  (0) 2008.04.26
Posted by '김용환'
,

가장 강력하고 손쉬운 툴을 만드는 것이야 말로 정말 소프트웨어 개발자의 마인드라고 생각한다.

전보다 더 쉬고 편하게. 그리고 기능은 강력하게..

 

하지만, 실제로는 더 복잡해지고, 기능은 많아지고, 멀 해야될지 모를 정도로 복잡성이 늘고, 결국. 그것을 버리게 되는 일이 비일비재하다라는 것...

 

플랫폼 개발자는 상아탑에 있는 교수와 같다.

플랫폼 개발자는 서비스 개발자나 서비스 기획자로부터 피드백을 받는 곳에 있다면, 훌륭해 질 수 있으나, 대부분은 골방 개발자가 되는 것인 것 같다.

 

조직의 문제일까? 아니면, 개인의 문제일까??

 

디자인의 기본 원칙은 간단하면서도 강력한 것!!

 

출처

http://msdn2.microsoft.com/en-us/library/aa511332.aspx

 

 

Powerful and Simple

Powerful:

Powerful and simple:

The ideal Windows Vista®-based application is both powerful and simple. Of course you want your application to be powerful and of course you want it to be simple, but can you achieve both? There is a natural tension between these goals, but that tension is far from irreconcilable. You can achieve both power and simplicity through carefully balanced feature selection and presentation.

Powerful

What does "power" really mean in terms of software? An application might be considered powerful if it is jam-packed full of features, having a tremendous breadth of functionality in an attempt to be all things to all users. Such a design is not likely to be successful because an untargeted feature set is unlikely to satisfy the needs of anyone. This is not the type of power that we are after.

An application is powerful when it has the right combination of these characteristics:

  • Enabling. The application satisfies the needs of its target users, enabling them to perform tasks that they couldn't otherwise do and achieve their goals effectively.
  • Efficient. The application enables users to perform tasks with a level of productivity and scale that wasn't possible before.
  • Versatile. The application enables users to perform a wide range of tasks effectively in a variety of circumstances.
  • Direct. The application feels like it is directly helping users achieve their goals, instead of getting in the way or requiring unnecessary steps. Features like shortcuts, keyboard access, and macros improve the sense of directness.
  • Flexible. The application allows users complete, fine-grained control over their work.
  • Integrated. The application is well integrated with Microsoft® Windows®, allowing it to share data with other applications.
  • Advanced. The application has extraordinary, innovative, start-of-the-art features that are not found in competing solutions.

Some of these characteristics depend upon the perception of the user and are relative to users' current capabilities. What is considered powerful may change over time, so today's advanced search feature might be commonplace tomorrow.

All these characteristics can be combined into our definition of power:

An application is powerful when it enables its target users to realize their full potential efficiently.

Thus, the ultimate measure of power is productivity, not the number of features.

Different users need help in achieving their full potential in different ways. What is enabling to some users might harm versatility, directness, and control for others. Well-designed software must balance these characteristics appropriately. For example, a desktop publishing system designed for nonprofessionals might use wizards to walk users through complex tasks. Such wizards enable the target users to perform tasks that they otherwise wouldn't be able to perform. By contrast, a desktop publishing system for professionals might focus on directness, efficiency, and complete control. For users of such an application, wizards may be limiting and frustrating.

If you do only one thing...
Understand your target users' goals and craft a feature set that enables them to achieve those goals productively.

Simple

We define simplicity as follows:

Simplicity is the reduction or elimination of an attribute of a design that target users are aware of and consider unessential.

In practice, simplicity is achieved by selecting the right feature set and presenting the features in the right way. This reduces the unessential, both real and perceived.

Simplicity is dependent upon the perception of users. Consider how the effect of an automatic transmission depends on a user's perspective:

  • For the typical driver (the target user), an automatic transmission eliminates the need for a manual gear shift and clutch, making a car much easier to drive. A manual gear shift and clutch are not essential to the task of driving, so they are removed to achieve simplicity.
  • For a professional race car driver, having direct control over the transmission is essential to being competitive. An automatic transmission negatively affects the car's performance, so it is not regarded as resulting in simplicity.
  • For a mechanic, an automatic transmission is a more complex mechanism, and therefore isn't easier to repair or maintain than a manual transmission. Unlike the mechanic, the target user is blissfully unaware of this internal complexity.

While different users regard the automatic transmission differently, it's successful because it eliminates the need for unessential knowledge, skill, and effort from its target users. For the typical driver, automatic transmission is a great feature because it just works.

Simplicity vs. ease of use

Simplicity, when correctly applied, results in ease of use. But simplicity and ease of use are not the same concepts. Ease of use is achieved when users can perform a task successfully on their own without difficulty or confusion within a suitable amount of time. There are many ways to achieve ease of use, and simplicity—the reduction of the unessential—is just one of them.

All users, no matter how sophisticated, want to get their work done with a minimum amount of unnecessary effort. All users—even advanced users—are primarily motivated to get their work done, not to learn about computers or your application.

Simplicity is the most effective way to achieve ease of use, and ease of use equals use. Complex, hard-to-use features just don't get used. By contrast, simple, elegant designs that perform their function well are a joy to use. They invoke a positive, emotional response.

For example, consider the wireless networking support in Microsoft Windows XP. Microsoft could have added a wizard to walk users through the configuration process. This approach would have resulted in ease of use but not simplicity, because an unessential feature (the wizard) would have been added. Instead, Microsoft designed wireless networking to configure itself automatically. Users ultimately don't care about the configuration details, so long as it "just works" reliably and securely. This combination of power and simplicity in wireless networking technology has led to its popularity and rapid adoption.

If you do only one thing...
Start your design process with the simplest designs that do the job well.

If you're not satisfied with your current design, start by stripping away all the unessential elements. You will find that what remains is usually quite good.

Obtaining simplicity while maintaining power

Design principles

To obtain simplicity, always design for the probable, not the possible.

The possible

Design decisions based on what's possible lead to complex user interfaces like the Registry Editor, where all actions are equally possible and as a result require equal effort. Since anything can happen, user goals aren't considered in design decisions.

The probable

Design decisions based on the probable lead to simplified, goal- and task-based solutions, where the likely scenarios receive focus and require minimal effort to perform.

The simplicity design principle

To obtain simplicity, focus on what is likely; reduce, hide, or remove what is unlikely; and eliminate what is impossible.

What users will do is far more relevant to design than what they might do.

Design techniques

To obtain simplicity while maintaining power, choose the right set of features, locate the features in the right places, and reduce the effort to use them. This section gives some common techniques to achieve these goals.

Choosing the right feature set

"Perfection is achieved, not when there is nothing more to add,
but when there is nothing left to take away." —Antoine de Saint-Exupery

The following design techniques give your users the features they need while achieving simplicity through actual reduction or removal:

  • Determine the features your users need. Understand your users' needs through goal, scenario, and task analysis. Determine a set of features that realizes these objectives.
  • Remove unnecessary elements. Remove elements that aren't likely to be used or have preferable alternatives.
  • Remove unnecessary redundancy. There might be several effective ways to perform a task. To achieve simplicity, make the hard decision and choose the best one for your target users instead of providing all of them and making the choice an option.
  • Make it "just work" automatically. The element is necessary, but any user interaction to get it to work is not because there is an acceptable default behavior or configuration. To achieve simplicity, make it work automatically and either hide it from the user completely or reduce its exposure significantly.

Streamlining the presentation

"The ability to simplify means to eliminate the unnecessary
so that the necessary may speak." —Hans Hofmann

Use the following design techniques to preserve power, while achieving simplicity through the perception of reduction or removal:

  • Combine what should be combined. Put the essential features that support a task together so that a task can be performed in one place. The task's steps should have a unified, streamlined flow. Break down complex tasks into a set of easy, clear steps, so that "one" place might consist of several UI surfaces, such as a wizard.
  • Separate what should be separated. Not everything can be presented in one place, so always have clear, well-chosen boundaries. Make features that support core scenarios central and obvious, and hide optional functionality or make it peripheral. Separate individual tasks and provide links to related tasks. For example, tasks related to manipulating photos should be clearly separated from tasks related to managing collections of photos, but they should be readily accessible from each other.
  • Eliminate what can be eliminated. Take a printout of your design and highlight the elements used to perform the most important tasks. Even highlight the individual words in the UI text that communicate useful information. Now review what isn't highlighted and consider removing it from the design. If you remove the item, would anything bad happen? If not, remove it!
    Consistency, configurability, and generalization are often desirable qualities, but they can lead to unnecessary complexity. Review your design for misguided efforts in consistency (such as having redundant text), generalization (such as having any number of time zones when two is sufficient), and configurability (such as options that users aren't likely to change), and eliminate what can be eliminated.
  • Put the elements in the right place. Within a window, an element's location should follow its utility. Essential controls, instructions, and explanations should all be in context in logical order. If more options are needed, expose them in context by clicking a chevron or similar mechanism; if more information is needed, display an infotip on mouse hover. Place less important tasks, options, and Help information outside the main flow in a separate window or page. The technique of displaying additional detail as needed is called progressive disclosure.
  • Use meaningful high-level combinations. It is often simpler and more scalable to select and manipulate groups of related elements than individual elements. Examples of high-level combinations include folders, themes, styles, and user groups. Such combinations often map to a user goal or intention that isn't apparent from the individual elements. For example, the intention behind the High Contrast Black color scheme is far more apparent than that of a black window background.
  • Select the right controls. Design elements are embodied by the controls you use to represent them, so selecting the right control is crucial to efficient presentation. For example, the font selection box used by Microsoft Word shows both a preview of the font as well as the most recently used fonts. Similarly, the way Word shows potential spelling and grammar errors in place is much simpler than the dialog box alternative, as shown in the beginning of this article.

Reducing effort

"Simple things should be simple.
Complex things should be possible."—Alan Kay

The following design techniques result in reduced effort for users:

  • Make tasks discoverable and visible. All tasks, but especially frequent tasks, should be readily discoverable within the user interface. The steps required to perform tasks should be visible and should not rely on memorization.
  • Present tasks in the user's domain. Complex software requires users to map their problems to the technology. Simple software does that mapping for them by presenting what is natural. For example, a red-eye reduction feature maps directly to the problem space and doesn't require users to think in terms of details like hues and gradients.
  • Put domain knowledge into the program. Users shouldn't be required to access external information to use your application successfully. Domain knowledge can range from complex data and algorithms to simply making it clear what type of input is valid.
  • Use text that users understand. Well-crafted text is crucial to effective communication with users. Use concepts and terms familiar to your users. Fully explain what is being asked in plain language so that users can make intelligent, informed decisions.
  • Use safe, secure, probable defaults. If a setting has a value that applies to most users in most circumstances, and that setting is both safe and secure, use it as the default value. Make users specify values only when necessary.
  • Use constraints. If there are many ways to perform a task, but only some are correct, constrain the task to those correct ways. Users should not be allowed to make readily preventable mistakes.

Simplicity does not mean simplistic

"Everything should be made as simple as possible,
but not simpler."—Albert Einstein

We believe that simplicity is crucial to an effective, desirable user experience—but it is always possible to take a good thing too far. The essence of simplicity is the reduction or elimination of the unessential. Removal of the essential just produces a poor design. If your "simplification" results in users becoming frustrated, confused, unconfident, or unable to complete tasks successfully, you have removed too much.

Simplicity does mean more effort for you

"I have only made this letter longer because I have
not the time to make it shorter."—Blaise Pascal

Obtaining simplicity while preserving power often requires significant internal complexity. It is usually easier to design software that exposes all the technology plumbing than to design one that hides it—the latter requires an excellent understanding of your target users and their goals. Removing a feature requires discipline, as does deciding against adding that cool feature that really isn't practical. Simplicity requires making hard design choices instead of making everything configurable. Complex software often results from a misconception about users: that they value unused features or overly complex features they can't understand.

Powerful and simple

Power is all about enabling your users and making them productive. Simplicity is all about removing the unessential and presenting features the right way. By understanding your target users and achieving the right balance of features and presentation, you can design Windows Vista-based applications that do both.

Guidelines feedback 

 

 

Posted by '김용환'
,

기본에 충실하지 않고는 획기적인 것이 나올 수 없고, 방향성에 문제가 있을 수 있다. 그래서 반드시 중심에 있는 철학에 깊이 생각하고, 집중하는 것이 좋다.

MS의 있는 자료이다.  디자인에 대한 부분이긴 하지만, 여전히 아키텍처에도 충분한 적용할 수 있는 부분이 있다.

 

http://msdn2.microsoft.com/en-us/library/aa511335.aspx

 

1. 기본에 충실하라

2. 가장 탁월한 것이 되라

3. 모든 사람에게 모든 것을 제공하려 하지 말라

4. 어려운 결정을 내려라

5. 친밀한 대화 같은 경험을 만들어라

6. 가장 적합한 것을 디폴트로 하라.

7. 바로 동작하게 하라

8. 신중하게 질문하라

9. 사용하기에 즐겁게 하라

10. 보기에 즐겁게 하라

11. 간결하게 유지하라

12. 나쁜 경험을 막아라

13. 공통된 문제들을 위해 디자인 하라

14. 성가신 것이 되지 말라

15. 사용자의 수고, 지식, 생각을 줄여라

16. 가이드 라인을 따르라

17. 테스트하라.

 

 

 

 
How to Design a Great User Experience

While simply expressed, each of these ideas is profound. We could make each an article, but we'll give a short explanation instead. Fill in any missing details with examples from your own experience.

  1. Nail the basics
    The core :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl01',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511441.aspx">scenarios—the primary reasons people use your Windows Vista® program—are far more important than the fringe scenarios—things people might do but probably won't. Nail the basics! (And if you do, users will overlook fringe problems.)
  2. Be great at something
    Think about how real users (not the marketing or PR departments) will describe your program. Identify your target users and make sure they can say "I love this program! It does A, B, and C super well!" If users can't say that about your program, what's the point? Today, "good enough" is no longer good enough—make your users love it.
  3. Don't be all things to all people
    Your program is going to be more successful by delighting its target users than attempting to satisfy everyone.
  4. Make the hard decisions
    Do you really need that feature, command, or option? If so, do it well. If not, cut it! Don't avoid difficult decisions by making everything optional or configurable.
  5. Make the experience like a friendly conversation
    Think of your UI as a conversation between you and your target users. Suppose you're looking over a user's shoulder and he or she asks, "What do I do here?" Think about the explanation you would give...the steps, their order, the language you'd use, and the way you explain things. Also think about the things you don't say. That's what your UI should be—like a conversation between friends—rather than some arcane thing that users have to decipher.
  6. Do the right thing by default
    Sure, you can :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl02',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/bb545456.aspx">pile on options to allow users to change things, but why? Choose safe, secure, convenient default values. Also, make the default experience the right experience for your target users. Don't assume that they will configure their way out of a bad initial experience. They won't.
  7. Make it just work
    People want to use your program, not configure it or learn a bunch of things. Choose an initial configuration, make it obvious how to do the most common and important tasks, and get your program working right away.
  8. Ask questions carefully
    Avoid asking unessential questions using :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl03',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511268.aspx">modal dialogs—prefer modeless alternatives. If you must ask a question in your UI, express it in terms of users' :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl04',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/bb545456.aspx">goals and tasks, not in terms of technology. Provide options that users understand (again, phrased in terms of goals and tasks, not technology) and clearly differentiate. Make sure to provide enough information for users to make informed decisions.
  9. Make it a pleasure to use
    Make sure your program serves its purpose well. Have the right set of features and put the features in the right places. Pay :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl05',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511327.aspx">attention to detail.
  10. Make it a pleasure to see
    Use the standard Windows Vista look, including standard :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl06',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa974173.aspx">window frames, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl07',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511282.aspx">fonts, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl08',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511283.aspx">system colors, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl09',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511456.aspx">common controls and :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl10',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511268.aspx">dialog boxes, and standard :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl11',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511279.aspx">layout. Avoid custom UI and use :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl12',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511284.aspx">branding with restraint. Use standard Windows Vista :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl13',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511280.aspx">icons, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl14',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511281.aspx">graphics, and :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl15',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511285.aspx">animations whenever possible (and legal!) For your own graphics and icons, use a professional designer. (If you can't afford one, use a few simple graphics—or even none at all.)
    And don't assume that providing skins will compensate for an unexciting look. Most users won't bother with them and having one great look makes a much better impression than having dozens of not-so-great ones.
  11. Make it responsive
    Your program's responsiveness is crucial to its overall experience—users find unnecessarily slow and unresponsive programs unusable. For every feature where performance is an issue, first understand your users' goals and expectations, then choose the lightest weight design that achieves these goals. Generally, tasks that can take longer than 10 seconds need more informative feedback and the ability to cancel. Keep in mind that users' perception of speed is just as important as the actual speed, and the perception of speed is primarily determined by how quickly a program becomes responsive.
  12. Keep it simple
    Strive for the :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl16',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511332.aspx">simplest design that does the job well. Expand the design beyond that only as required. Don't have three ways to do something when one will do. Eliminate or reduce all that unnecessary junk!
  13. Avoid bad experiences
    Easier said than done, but users' overall perception of your program is more often determined by the quality of the bad experiences than of the good ones.
  14. Design for common problems
    Is your design great—until the user makes a mistake or the network connection is lost? Anticipate and design for common problems, user mistakes, and other errors. Consider things like the network being slow or unavailable, devices being not installed or unavailable, and users giving incorrect input or skipping steps. At each step in your program, ask yourself: What are the worst likely things that could happen? Then see how well your program behaves when they do happen. Make sure all :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl17',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511267.aspx">error messages clearly explain the problem and give an actionable solution.
  15. Don't be annoying
    Most likely, anything users routinely dismiss without performing any action should be redesigned or removed. This is especially true for anything users see repeatedly, such as error messages, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl18',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511263.aspx">warnings, :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl19',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511273.aspx">confirmations, and :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl20',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511497.aspx">notifications. Use :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl21',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511278.aspx">sound with extreme restraint. UI related to security and legal issues (for example, consent or license terms) are possible exceptions.
  16. Reduce effort, knowledge, and thought
    To reduce the effort, knowledge, and thought required to use your program:
  17. Follow the guidelines
    Of course! Consider UX Guide to be the minimum quality and consistency bar for Windows Vista-based programs. Use it to follow best practices, make routine decisions, and to just make your job easier. Focus your creative energy on the important things—whatever your program is all about—not the routine. Don't create that weird program that nobody can figure out how to use. Follow the guidelines and make your experience stand out while fitting in.
  18. Test your UI
    You won't know if you've got it right until you've tested your program with real target users with a :Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl25',this);" tabIndex=0 href="http://msdn2.microsoft.com/en-us/library/aa511441.aspx">usability study. Most likely, you'll be (unpleasantly) surprised by the results. Be glad to have your UI criticized—that's required for you to do your best work. And be sure to collect feedback after your program ships.

'디자인-아키텍쳐' 카테고리의 다른 글

Inhertiance와 composition  (0) 2009.03.16
캐쉬 서버 - 웹 어플리케이션 서버간.  (0) 2008.08.26
개발 프로세스 정립  (0) 2008.06.10
일일 빌드 시스템의 장점  (0) 2008.05.03
Powerful & Simple  (0) 2008.04.25
Posted by '김용환'
,

이 내용만큼 좋은 정보를 발견하지 못했다 추천!!

 

 

http://dev.mysql.com/doc/refman/5.0/en

 

 

 

5.5.1. MySQL Usernames and Passwords

A MySQL account is defined in terms of a username and the client host or hosts from which the user can connect to the server. The account also has a password. There are several distinctions between the way usernames and passwords are used by MySQL and the way they are used by your operating system:

  • Usernames, as used by MySQL for authentication purposes, have nothing to do with usernames (login names) as used by Windows or Unix. On Unix, most MySQL clients by default try to log in using the current Unix username as the MySQL username, but that is for convenience only. The default can be overridden easily, because client programs allow any username to be specified with a -u or --user option. Because this means that anyone can attempt to connect to the server using any username, you cannot make a database secure in any way unless all MySQL accounts have passwords. Anyone who specifies a username for an account that has no password is able to connect successfully to the server.
  • MySQL usernames can be up to 16 characters long. This limit is hard-coded in the MySQL servers and clients, and trying to circumvent it by modifying the definitions of the tables in the mysql database does not work.

Note

You should never alter any of the tables in the mysql database in any manner whatsoever except by means of the procedure prescribed by MySQL AB that is described in Section 4.4.9, “mysql_upgrade — Check Tables for MySQL Upgrade”. Attempting to redefine MySQL's system tables in any other fashion results in undefined (and unsupported!) behavior.

Operating system usernames are completely unrelated to MySQL usernames and may even be of a different maximum length. For example, Unix usernames typically are limited to eight characters.

  • MySQL passwords have nothing to do with passwords for logging in to your operating system. There is no necessary connection between the password you use to log in to a Windows or Unix machine and the password you use to access the MySQL server on that machine.
  • MySQL encrypts passwords using its own algorithm. This encryption is different from that used during the Unix login process. MySQL password encryption is the same as that implemented by the PASSWORD() SQL function. Unix password encryption is the same as that implemented by the ENCRYPT() SQL function. See the descriptions of the PASSWORD() and ENCRYPT() functions in Section 11.10.2, “Encryption and Compression Functions”. From version 4.1 on, MySQL employs a stronger authentication method that has better password protection during the connection process than in earlier versions. It is secure even if TCP/IP packets are sniffed or the mysql database is captured. (In earlier versions, even though passwords are stored in encrypted form in the user table, knowledge of the encrypted password value could be used to connect to the MySQL server.)

When you install MySQL, the grant tables are populated with an initial set of accounts. These accounts have names and access privileges that are described in Section 2.4.16.3, “Securing the Initial MySQL Accounts”, which also discusses how to assign passwords to them. Thereafter, you normally set up, modify, and remove MySQL accounts using statements such as GRANT and REVOKE. See Section 12.5.1, “Account Management Statements”.

When you connect to a MySQL server with a command-line client, you should specify the username and password for the account that you want to use:

shell> mysql --user=monty --password=guess db_name

If you prefer short options, the command looks like this:

shell> mysql -u monty -pguess db_name

There must be no space between the -p option and the following password value. See Section 5.4.4, “Connecting to the MySQL Server”.

The preceding commands include the password value on the command line, which can be a security risk. See Section 5.5.6, “Keeping Your Password Secure”. To avoid this problem, specify the --password or -p option without any following password value:

shell> mysql --user=monty --password db_name

shell> mysql -u monty -p db_name

When the password option has no password value, the client program prints a prompt and waits for you to enter the password. (In these examples, db_name is not interpreted as a password because it is separated from the preceding password option by a space.)

On some systems, the library routine that MySQL uses to prompt for a password automatically limits the password to eight characters. That is a problem with the system library, not with MySQL. Internally, MySQL doesn't have any limit for the length of the password. To work around the problem, change your MySQL password to a value that is eight or fewer characters long, or put your password in an option file.


 

 

5.5.2. Adding New User Accounts to MySQL

You can create MySQL accounts in two ways:

  • By using statements intended for creating accounts, such as CREATE USER or GRANT
  • By manipulating the MySQL grant tables directly with statements such as INSERT, UPDATE, or DELETE

The preferred method is to use account-creation statements because they are more concise and less error-prone. CREATE USER and GRANT are described in Section 12.5.1.1, “CREATE USER Syntax”, and Section 12.5.1.3, “GRANT Syntax”.

Another option for creating accounts is to use one of several available third-party programs that offer capabilities for MySQL account administration. phpMyAdmin is one such program.

The following examples show how to use the mysql client program to set up new users. These examples assume that privileges are set up according to the defaults described in Section 2.4.16.3, “Securing the Initial MySQL Accounts”. This means that to make changes, you must connect to the MySQL server as the MySQL root user, and the root account must have the INSERT privilege for the mysql database and the RELOAD administrative privilege.

As noted in the examples where appropriate, some of the statements will fail if you have the server's SQL mode has been set to enable certain restrictions. In particular, strict mode (STRICT_TRANS_TABLES, STRICT_ALL_TABLES) and NO_AUTO_CREATE_USER will prevent the server from accepting some of the statements. Workarounds are indicated for these cases. For more information about SQL modes and their effect on grant table manipulation, see Section 5.1.6, “SQL Modes”, and Section 12.5.1.3, “GRANT Syntax”.

First, use the mysql program to connect to the server as the MySQL root user:

shell> mysql --user=root mysql

If you have assigned a password to the root account, you'll also need to supply a --password or -p option for this mysql command and also for those later in this section.

After connecting to the server as root, you can add new accounts. The following statements use GRANT to set up four new accounts:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'

    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'

    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;

mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';

mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';

The accounts created by these GRANT statements have the following properties:

  • Two of the accounts have a username of monty and a password of some_pass. Both accounts are superuser accounts with full privileges to do anything. One account ('monty'@'localhost') can be used only when connecting from the local host. The other ('monty'@'%') can be used to connect from any other host. Note that it is necessary to have both accounts for monty to be able to connect from anywhere as monty. Without the localhost account, the anonymous-user account for localhost that is created by mysql_install_db would take precedence when monty connects from the local host. As a result, monty would be treated as an anonymous user. The reason for this is that the anonymous-user account has a more specific Host column value than the 'monty'@'%' account and thus comes earlier in the user table sort order. (user table sorting is discussed in Section 5.4.5, “Access Control, Stage 1: Connection Verification”.)
  • One account has a username of admin and no password. This account can be used only by connecting from the local host. It is granted the RELOAD and PROCESS administrative privileges. These privileges allow the admin user to execute the mysqladmin reload, mysqladmin refresh, and mysqladmin flush-xxx commands, as well as mysqladmin processlist . No privileges are granted for accessing any databases. You could add such privileges later by issuing additional GRANT statements.
  • One account has a username of dummy and no password. This account can be used only by connecting from the local host. No privileges are granted. The USAGE privilege in the GRANT statement enables you to create an account without giving it any privileges. It has the effect of setting all the global privileges to 'N'. It is assumed that you will grant specific privileges to the account later.
  • The statements that create accounts with no password will fail if the NO_AUTO_CREATE_USER SQL mode is enabled. To deal with this, use an IDENTIFIED BY clause that specifies a non-empty password.

As an alternative to GRANT, you can create the same accounts directly by issuing INSERT statements and then telling the server to reload the grant tables using FLUSH PRIVILEGES:

shell> mysql --user=root mysql

mysql> INSERT INTO user

    ->     VALUES('localhost','monty',PASSWORD('some_pass'),

    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO user

    ->     VALUES('%','monty',PASSWORD('some_pass'),

    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',

    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',

    ->     '','','','',0,0,0,0);

mysql> INSERT INTO user SET Host='localhost',User='admin',

    ->     Reload_priv='Y', Process_priv='Y';

mysql> INSERT INTO user (Host,User,Password)

    ->     VALUES('localhost','dummy','');

mysql> FLUSH PRIVILEGES;

The reason for using FLUSH PRIVILEGES when you create accounts with INSERT is to tell the server to re-read the grant tables. Otherwise, the changes go unnoticed until you restart the server. With GRANT, FLUSH PRIVILEGES is unnecessary.

The reason for using the PASSWORD() function with INSERT is to encrypt the password. The GRANT statement encrypts the password for you, so PASSWORD() is unnecessary.

The 'Y' values enable privileges for the accounts. Depending on your MySQL version, you may have to use a different number of 'Y' values in the first two INSERT statements. For the admin account, you may also employ the more readable extended INSERT syntax using SET.

In the INSERT statement for the dummy account, only the Host, User, and Password columns in the user table row are assigned values. None of the privilege columns are set explicitly, so MySQL assigns them all the default value of 'N'. This is equivalent to what GRANT USAGE does.

If strict SQL mode is enabled, all columns that have no default value must have a value specified. In this case, INSERT statements must explicitly specify values for the ssl_cipher, x509_issuer, and x509_subject columns.

Note that to set up a superuser account, it is necessary only to create a user table entry with the privilege columns set to 'Y'. user table privileges are global, so no entries in any of the other grant tables are needed.

The next examples create three accounts and give them access to specific databases. Each of them has a username of custom and password of obscure.

To create the accounts with GRANT, use the following statements:

shell> mysql --user=root mysql

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

    ->     ON bankaccount.*

    ->     TO 'custom'@'localhost'

    ->     IDENTIFIED BY 'obscure';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

    ->     ON expenses.*

    ->     TO 'custom'@'whitehouse.gov'

    ->     IDENTIFIED BY 'obscure';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

    ->     ON customer.*

    ->     TO 'custom'@'server.domain'

    ->     IDENTIFIED BY 'obscure';

The three accounts can be used as follows:

  • The first account can access the bankaccount database, but only from the local host.
  • The second account can access the expenses database, but only from the host whitehouse.gov.
  • The third account can access the customer database, but only from the host server.domain.

To set up the custom accounts without GRANT, use INSERT statements as follows to modify the grant tables directly:

shell> mysql --user=root mysql

mysql> INSERT INTO user (Host,User,Password)

    ->     VALUES('localhost','custom',PASSWORD('obscure'));

mysql> INSERT INTO user (Host,User,Password)

    ->     VALUES('whitehouse.gov','custom',PASSWORD('obscure'));

mysql> INSERT INTO user (Host,User,Password)

    ->     VALUES('server.domain','custom',PASSWORD('obscure'));

mysql> INSERT INTO db

    ->     (Host,Db,User,Select_priv,Insert_priv,

    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)

    ->     VALUES('localhost','bankaccount','custom',

    ->     'Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

    ->     (Host,Db,User,Select_priv,Insert_priv,

    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)

    ->     VALUES('whitehouse.gov','expenses','custom',

    ->     'Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

    ->     (Host,Db,User,Select_priv,Insert_priv,

    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)

    ->     VALUES('server.domain','customer','custom',

    ->     'Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES;

The first three INSERT statements add user table entries that allow the user custom to connect from the various hosts with the given password, but grant no global privileges (all privileges are set to the default value of 'N'). The next three INSERT statements add db table entries that grant privileges to custom for the bankaccount, expenses, and customer databases, but only when accessed from the proper hosts. As usual when you modify the grant tables directly, you must tell the server to reload them with FLUSH PRIVILEGES so that the privilege changes take effect.

If you want to give a specific user access from all machines in a given domain (for example, mydomain.com), you can issue a GRANT statement that uses the “%” wildcard character in the host part of the account name:

mysql> GRANT ...

    ->     ON *.*

    ->     TO 'myname'@'%.mydomain.com'

    ->     IDENTIFIED BY 'mypass';

To do the same thing by modifying the grant tables directly, do this:

mysql> INSERT INTO user (Host,User,Password,...)

    ->     VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);

mysql> FLUSH PRIVILEGES;

Previous / Next / Up / Table of Contents



User Comments

Posted by Jim Dennis on January 18 2005 9:05pm

[Delete] [Edit]

WARNING: ~/.mysql_history shows any PASSWORD('xxx') calls.

Just a note to admins and users out there; be sure to chmod
0600 your ~/.mysql_history as well as any ~/.my.cnf files.
Otherwise anyone with a local account might be able to read any
of your GRANT and SET PASSWORD statements.

Posted by Max on August 5 2006 6:12pm

[Delete] [Edit]

Indeed one solution to your password problem could lie in the value of 'host'.
Check it out by issuing "SELECT user()" using different interfaces (CLI, web server), and giving different values for 'host'.

On one server where I'm not admin but I have to work on, there happen strange things :
sometimes host='' defaults to 'localhost', sometimes to 'localhost.localdomain' (on the same mysql server !!) and the two corresponding accounts can have different passwords.
Or one may need a password, and the other one not.

Even worse, on this server:
<?php

mysql_connect('localhost'); 
print_rmysql_fetch_assocmysql_query"SELECT user()"))) 
?>
shows:
Array ( [user()] => nobody@localhost.localdomain )

i.e. it is IMPOSSIBLE to connect from PHP with host='localhost', while the CLI shows that there exist two different users,
nobody@localhost and nobody@localhost.localdomain
(and its the same for user='root'! and they have different privileges!)

In general, phpMyAdmin will do what you need for your PHP scripts, because it uses the same interface (as long as they run on the same web server), while the CLI does not (but allows for more direct and less 'default prone' access to the db server).

Also keep in mind the VARIOUS security risks using phpMyAdmin (among others, both Apache HTTP_AUTH passwords and MySQL passwords transit in clear text in the POST data, and might be available to 'everybody' as global variables (eg. if register_globals is on) ...) !

Posted by jon doe on October 27 2006 7:42am

[Delete] [Edit]

Say you wanted to add a couple of users,
but wanted to prevent access to the entire db to one of them -

mysql> grant all on DATABASENAME to USERNAME1 identified by 'PASSWORD';

This allows them all privs, but only to that database.

To restrict privs:
mysql>grant select (FIELD1, FIELD2) on DATABASENAME to USERNAME2 identified by 'PASSWORD';


 

5.5.3. Removing User Accounts from MySQL

To remove an account, use the DROP USER statement, which is described in Section 12.5.1.2, “DROP USER Syntax”.

12.5.1.2. DROP USER Syntax

DROP USER user [, user] ...

The DROP USER statement removes one or more MySQL accounts. To use it, you must have the global CREATE USER privilege or the DELETE privilege for the mysql database. Each account is named using the same format as for the GRANT statement; for example, 'jeffrey'@'localhost'. If you specify only the username part of the account name, a hostname part of '%' is used. For additional information about specifying account names, see Section 12.5.1.3, “GRANT Syntax”.

DROP USER as present in MySQL 5.0.0 removes only accounts that have no privileges. In MySQL 5.0.2, it was modified to remove account privileges as well. This means that the procedure for removing an account depends on your version of MySQL.

As of MySQL 5.0.2, you can remove an account and its privileges as follows:

DROP USER user;

The statement removes privilege rows for the account from all grant tables.

Before MySQL 5.0.2, DROP USER serves only to remove account rows from the user table for accounts that have no privileges. To remove a MySQL account completely (including all of its privileges), you should use the following procedure, performing these steps in the order shown:

  1. Use SHOW GRANTS to determine what privileges the account has. See Section 12.5.4.12, “SHOW GRANTS Syntax”.
  2. Use REVOKE to revoke the privileges displayed by SHOW GRANTS. This removes rows for the account from all the grant tables except the user table, and revokes any global privileges listed in the user table. See Section 12.5.1.3, “GRANT Syntax”.
  3. Delete the account by using DROP USER to remove the user table row.

Important

DROP USER does not automatically close any open user sessions. Rather, in the event that a user with an open session is dropped, the statement does not take effect until that user's session is closed. Once the session is closed, the user is dropped, and that user's next attempt to log in will fail. This is by design.

DROP USER does not automatically delete or invalidate any database objects that the user created. This applies to tables, views, stored routines, and triggers.

 


 

5.5.4. Limiting Account Resources

One means of limiting use of MySQL server resources is to set the max_user_connections system variable to a non-zero value. However, this method is strictly global, and does not allow for management of individual accounts. In addition, it limits only the number of simultaneous connections made using a single account, and not what a client can do once connected. Both types of control are of interest to many MySQL administrators, particularly those working for Internet Service Providers.

In MySQL 5.0, you can limit the following server resources for individual accounts:

  • The number of queries that an account can issue per hour
  • The number of updates that an account can issue per hour
  • The number of times an account can connect to the server per hour

Any statement that a client can issue counts against the query limit. Only statements that modify databases or tables count against the update limit.

From MySQL 5.0.3 on, it is also possible to limit the number of simultaneous connections to the server on a per-account basis.

Before MySQL 5.0.3, an “account” in this context is assessed against the actual host from which a user connects. Suppose that there is a row in the user table that has User and Host values of usera and %.example.com, to allow usera to connect from any host in the example.com domain. If usera connects simultaneously from host1.example.com and host2.example.com, the server applies the account resource limits separately to each connection. If usera connects again from host1.example.com, the server applies the limits for that connection together with the existing connection from that host.

As of MySQL 5.0.3, an “account” is assessed as a single row in the user table. That is, connections are assessed against the Host value in the user table row that applies to the connection. In this case, the server applies resource limits collectively to all connections by usera from any host in the example.com domain. The pre-5.0.3 method of accounting may be selected by starting the server with the --old-style-user-limits option.

As a prerequisite for using this feature, the user table in the mysql database must contain the resource-related columns. Resource limits are stored in the max_questions, max_updates, max_connections, and max_user_connections columns. If your user table doesn't have these columns, it must be upgraded; see Section 4.4.9, “mysql_upgrade — Check Tables for MySQL Upgrade”.

To set resource limits with a GRANT statement, use a WITH clause that names each resource to be limited and a per-hour count indicating the limit value. For example, to create a new account that can access the customer database, but only in a limited fashion, issue this statement:

mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'

    ->     IDENTIFIED BY 'frank'

    ->     WITH MAX_QUERIES_PER_HOUR 20

    ->          MAX_UPDATES_PER_HOUR 10

    ->          MAX_CONNECTIONS_PER_HOUR 5

    ->          MAX_USER_CONNECTIONS 2;

The limit types need not all be named in the WITH clause, but those named can be present in any order. The value for each per-hour limit should be an integer representing a count per hour. If the GRANT statement has no WITH clause, the limits are each set to the default value of zero (that is, no limit). For MAX_USER_CONNECTIONS, the limit is an integer indicating the maximum number of simultaneous connections the account can make at any one time. If the limit is set to the default value of zero, the max_user_connections system variable determines the number of simultaneous connections for the account.

To set or change limits for an existing account, use a GRANT USAGE statement at the global level (ON *.*). The following statement changes the query limit for francis to 100:

mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

    ->     WITH MAX_QUERIES_PER_HOUR 100;

This statement leaves the account's existing privileges unchanged and modifies only the limit values specified.

To remove an existing limit, set its value to zero. For example, to remove the limit on how many times per hour francis can connect, use this statement:

mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

    ->     WITH MAX_CONNECTIONS_PER_HOUR 0;

Resource-use counting takes place when any account has a non-zero limit placed on its use of any of the resources.

As the server runs, it counts the number of times each account uses resources. If an account reaches its limit on number of connections within the last hour, further connections for the account are rejected until that hour is up. Similarly, if the account reaches its limit on the number of queries or updates, further queries or updates are rejected until the hour is up. In all such cases, an appropriate error message is issued.

Resource counting is done per account, not per client. For example, if your account has a query limit of 50, you cannot increase your limit to 100 by making two simultaneous client connections to the server. Queries issued on both connections are counted together.

Queries for which results are served from the query cache do not count against the MAX_QUERIES_PER_HOUR limit.

The current per-hour resource-use counts can be reset globally for all accounts, or individually for a given account:

  • To reset the current counts to zero for all accounts, issue a FLUSH USER_RESOURCES statement. The counts also can be reset by reloading the grant tables (for example, with a FLUSH PRIVILEGES statement or a mysqladmin reload command).
  • The counts for an individual account can be set to zero by re-granting it any of its limits. To do this, use GRANT USAGE as described earlier and specify a limit value equal to the value that the account currently has.

Counter resets do not affect the MAX_USER_CONNECTIONS limit.

All counts begin at zero when the server starts; counts are not carried over through a restart.


 

5.5.5. Assigning Account Passwords

Passwords may be assigned from the command line by using the mysqladmin command:

shell> mysqladmin -u user_name -h host_name password "newpwd"

The account for which this command resets the password is the one with a user table row that matches user_name in the User column and the client host from which you connect in the Host column.

Another way to assign a password to an account is to issue a SET PASSWORD statement:

mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');

Only users such as root that have update access to the mysql database can change the password for other users. If you are not connected as an anonymous user, you can change your own password by omitting the FOR clause:

mysql> SET PASSWORD = PASSWORD('biscuit');

You can also use a GRANT USAGE statement at the global level (ON *.*) to assign a password to an account without affecting the account's current privileges:

mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

Although it is generally preferable to assign passwords using one of the preceding methods, you can also do so by modifying the user table directly:

  • To establish a password when creating a new account, provide a value for the Password column:

·         shell> mysql -u root mysql

·         mysql> INSERT INTO user (Host,User,Password)

·             -> VALUES('%','jeffrey',PASSWORD('biscuit'));

·         mysql> FLUSH PRIVILEGES;

  • To change the password for an existing account, use UPDATE to set the Password column value:

·         shell> mysql -u root mysql

·         mysql> UPDATE user SET Password = PASSWORD('bagel')

·             -> WHERE Host = '%' AND User = 'francis';

·         mysql> FLUSH PRIVILEGES;

When you assign an account a non-empty password using SET PASSWORD, INSERT, or UPDATE, you must use the PASSWORD() function to encrypt it. PASSWORD() is necessary because the user table stores passwords in encrypted form, not as plaintext. If you forget that fact, you are likely to set passwords like this:

shell> mysql -u root mysql

mysql> INSERT INTO user (Host,User,Password)

    -> VALUES('%','jeffrey','biscuit');

mysql> FLUSH PRIVILEGES;

The result is that the literal value 'biscuit' is stored as the password in the user table, not the encrypted value. When jeffrey attempts to connect to the server using this password, the value is encrypted and compared to the value stored in the user table. However, the stored value is the literal string 'biscuit', so the comparison fails and the server rejects the connection:

shell> mysql -u jeffrey -pbiscuit test

Access denied

If you assign passwords using the GRANT ... IDENTIFIED BY statement or the mysqladmin password command, they both take care of encrypting the password for you. In these cases, using PASSWORD() function is unnecessary. .5.6. Keeping Your Password Secure

On an administrative level, you should never grant access to the user grant table to any non-administrative accounts.

When you run a client program to connect to the MySQL server, it is inadvisable to specify your password in a way that exposes it to discovery by other users. The methods you can use to specify your password when you run client programs are listed here, along with an assessment of the risks of each method:

  • Use a -pyour_pass or --password=your_pass option on the command line. For example:

·         shell> mysql -u francis -pfrank db_name

This is convenient but insecure, because your password becomes visible to system status programs such as ps that may be invoked by other users to display command lines. MySQL clients typically overwrite the command-line password argument with zeros during their initialization sequence. However, there is still a brief interval during which the value is visible. On some systems this strategy is ineffective, anyway, and the password remains visible to ps. (SystemV Unix systems and perhaps others are subject to this problem.)

  • Use the -p or --password option with no password value specified. In this case, the client program solicits the password from the terminal:

·         shell> mysql -u francis -p db_name

·         Enter password: ********

The “*” characters indicate where you enter your password. The password is not displayed as you enter it.

It is more secure to enter your password this way than to specify it on the command line because it is not visible to other users. However, this method of entering a password is suitable only for programs that you run interactively. If you want to invoke a client from a script that runs non-interactively, there is no opportunity to enter the password from the terminal. On some systems, you may even find that the first line of your script is read and interpreted (incorrectly) as your password.

  • Store your password in an option file. For example, on Unix you can list your password in the [client] section of the .my.cnf file in your home directory:

·         [client]

·         password=your_pass

If you store your password in .my.cnf, the file should not be accessible to anyone but yourself. To ensure this, set the file access mode to 400 or 600. For example:

shell> chmod 600 .my.cnf

Section 4.2.2.2, “Using Option Files”, discusses option files in more detail.

  • Store your password in the MYSQL_PWD environment variable. This method of specifying your MySQL password must be considered extremely insecure and should not be used. Some versions of ps include an option to display the environment of running processes. If you set MYSQL_PWD, your password is exposed to any other user who runs ps. Even on systems without such a version of ps, it is unwise to assume that there are no other methods by which users can examine process environments. See Section 2.4.20, “Environment Variables”.

All in all, the safest methods are to have the client program prompt for the password or to specify the password in a properly protected option file.

NotePASSWORD() encryption is different from Unix password encryption. See Section 5.5.1, “MySQL Usernames and Passwords”.

 

Posted by '김용환'
,

mysql에서 row를 세로로 보기

아따 잼난다~

 

mysql> select * from user \G;

 

 

 *************************** 23. row ***************************
                 Host: 111.111.111.111
                 User: dd
             Password: dagd
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv:
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
         Show_db_priv: N
           Super_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
         Execute_priv: N
      Repl_slave_priv: N
     Repl_client_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
     Create_user_priv: N
             ssl_type:
           ssl_cipher:
          x509_issuer:
         x509_subject:
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
23 rows in set (0.00 sec)

Posted by '김용환'
,

 

-       어플단

n  웹 어플리케이션에서는 mod_security를 써서 적절하게 수치로 막고 있습니다.

n  도스 공격시에 서버마다 mod_jk timeout을 짧게 주어 처리가 안 되는 것은 timeout되게 하였습니다.

-       네트웍단

n  Dos 공격시 솔루션을 이용하여 ip차단하는 방법이 있습니다. 해당 솔루션이 반복적이거나 이상하게 ip가 들어오면 막습니다.

n  그 외 또한, 가끔씩 vip 주소를 바꿔주기도 하여, ip단위의 공격을 미리 방지했던 적이 있었습니다.

-       서버

n  리눅스의 커널을 높은 버전으로 패치하여 서버당 처리용량을 줄일 수 있습니다.

n  서버를 많이 늘려서 초기부터 Dos 공격이 이루어지더라도 버틸 수 있도록 되어 있습니다.

Posted by '김용환'
,

Toad 단축키.

DB 2008. 4. 19. 03:52

Table 3.1 SQL Editor Shortcuts by Keystroke

Shortcut

Description

Illustration

F1

Windows Help File


F2

Toggle Output Window

Figure 3.2

Shift+F2

Toggle Data Grid Window


F3

Find Next Occurrence


Shift+F3

Find Previous Occurrence


F4

Describe Table, View, Procedure, Function

Figure 3.26

F5

Execute SQL as a script

Figure 3.34

F6

Toggle between SQL Editor and Results Panel

Figure 3.1

F7

Clear All Text


F8

Recall Previous SQL Statement


F9

Execute Statement

Figure 3.33

Ctrl+F9

Set Code Execution Parameters

Figure 3.33

Shift+F9

Execute Current SQL statement at Cursor


F10 or right-click

Pop-up Menu

Figures 3.4, 3.10

Ctrl+F12

External Editor, Pass Contents

Figures 3.5, 3.6

Ctrl+A

Select All Text


Ctrl+C

Copy


Ctrl+E

Execute Explain Plan on the Current Statement

Figure 3.41

Ctrl+F

Find Text


Ctrl+G

Goto Line


Ctrl+L

Convert Text to Lowercase


Ctrl+M

Make Code Statement


Ctrl+N

Recall Named SQL Statement


Ctrl+O

Open a Text File


Ctrl+P

Strip Code Statement


Ctrl+R

Find and Replace


Ctrl+S

Save File


Shift+Ctrl+S

Save File As

Figure 3.18

Ctrl+T

Columns Drop-down


Shift+Ctrl+R

Alias Replacement


Shift+Ctrl+T

Columns Drop-Down no alias

Figure 3.19

Ctrl+Spacebar

Code Templates

Figure 3.30

Ctrl+U

Converts Text to Uppercase


Ctrl+V

Paste


Ctrl+X

Cut


Ctrl+Z

Undo Last Change


Ctrl+.

Display Pop-up List of Matching Table Names

Figure 3.16

Shift+Ctrl+Z

Redo Last Undo


Alt+Up Arrow

Display Previous Statement

Figure 3.7

Alt+Down Arrow

Display Next Statement (After Alt+Up Arrow)

Figure 3.7

Ctrl+Home

In the data grid: goes to the top of the record set


Ctrl+End

In the data grid: goes to the end of the record set


Ctrl+Tab

Cycles through the Collection of MDI Child Windows



TIP

The competent TOAD user makes use of Shift+F9 to execute SQL statements one at a time out of a script, and F8 to recall the previous SQL statement. The TOAD user also makes use of cut and paste to move code between TOAD windows.

Shift+F9 executes single SQL statements.

F8 recalls the previous SQL statement.

Table 3.2 SQL Editor Shortcuts by Description

Description

Shortcut

Illustration

Alias Replacement

Shift+Ctrl+R


Clear All Text

F7


Code Templates

Ctrl+Spacebar

Figure 3.30

Columns Drop-down

Ctrl+T

Figure 3.18

Columns Drop-down no alias

Shift+Ctrl+T

Figure 3.19

Convert Text to Lowercase

Ctrl+L


Convert Text to Uppercase

Ctrl+U


Copy

Ctrl+C


Cut

Ctrl+X


Cycles through the Collection of MDI Child Windows

Ctrl+Tab


Describe Table, View, Procedure, Function, or Package

F4

Display Next Statement (After Alt+Up Arrow)

Alt+Down Arrow

Figure 3.7

Display Previous Statement

Alt+Up Arrow

Figure 3.7

Display Pop-up List of Matching Table Names

Ctrl+.

Figure 3.16

Execute Current SQL Statement at Cursor

Shift+F9


Execute SQL as a Script

F5

Figure 3.35

Execute Explain Plan on the Current SQL Statement

Ctrl+E

Figure 3.41

Execute SQL Statement

F9

Figure 3.34

External Editor, Pass Contents

Ctrl+F12

Figure 3.5

Find and Replace

Ctrl+R


Find Next Occurrence

F3


Find Previous Occurrence

Shift+F3


Find Text

Ctrl+F


Goto Line

Ctrl+G


In the data grid: goes to the end of the record set

Ctrl+End


In the data grid: goes to the top of the record set

Ctrl+Home


Make Code Statement

Ctrl+M


Open a Text File

Ctrl+O


Paste

Ctrl+V


Pop-up Menu

F10 or RT-Mouse

Figures 3.4, 3.10

Recall Named SQL

Ctrl+N


Recall Previous SQL Statement

F8


Redo Last Undo

Shift+Ctrl+Z


Save File

Ctrl+S

Save File As

Shift+Ctrl+S

Select All Text

Ctrl+A


Strip Code Statement

Ctrl+P


Toggle between SQL Editor and Results Panel

F6

Figure 3.1

Toggle Full Screen Editor

F2

Figure 3.2

Undo Last Change

Ctrl+Z


Verify Statement Without Execution (Parse)

Ctrl+F9


Windows Help File

F1


 
Posted by '김용환'
,

Connection reset by peer, Connection reset, Broken Pipe

 

Tomcat 4.x 을 쓰는데. 자꾸 이런 에러가 난다.

 

 

찾아보니 이런 말을 찾았다.

- java.io.IOException: Broken pipe
  원인: receiver에서 송신받은 데이터를 제때 처리하지 못하는 상황(네트워크가 느리거나 서버의 CPU가 max인 경우 등)에서 sender가 계속 보내는 경우

 

정상적으로 데이터를 보내지만 받지 못하는 상황이 발생하기 때문에 문제가 된다.

 

톰캣을 5.x를 썼더니.. 빈도수가 확 줄어들었당... 톰캣 쪽 문제였는가??

 

음...

Posted by '김용환'
,