• 카테고리
    • 전체 글

    • 카테고리1
    • 카테고리2
    • 카테고리3
    • 카테고리4
  • 태그
  • 방명록

'2012/09'에 해당되는 글 6건

  • 2012.09.25 DataRow 유틸-Util 함수를 만들자
  • 2012.09.24 MVNO ( mobile virtual network operator )-TPlus 가입!
  • 2012.09.20 iOS6 업그레이드
  • 2012.09.18 자기 주도성 Paradox
  • 2012.09.12 사용자 암호 관리
  • 2012.09.06 아이폰 3GS로 변경 4

DataRow 유틸-Util 함수를 만들자

기술자료/.NET 2012. 9. 25. 09:34

서두

System.Data.DataRow

데이터베이스 기반의 CS나 Web 관련 개발을 하면 DataTable을 많이 활용하는데, 이 때 데이터들은 DataRow를 통해서 전달 받게 된다. 그런데, 이 DataRow에 담긴 값들은 모두 Object 형식으로 담겨 있는데, 이 때 데이터를 끄집어 내는데, 그냥 ASP 시절의 웹 프로그래밍 방식을 따르게 되면 오류 발생율이 높다. 물론 의도적으로 try ~ catch 문에서 끄집어 내기 위해서 만들기도 하지만, 단순히 데이터를 끄집어 오는데, try ~ catch로 잡아야 될 정도면 개인적으로는 아니다 싶을 때가 많다.

 

본문

예를 들면, Person 이라는 테이블이 있는데, Name - varchar(50), Age – int, Address – varchar(100) 의 형태의 테이블이 있다고 하자.

Name Age Address
Goshe Mack 12 Gangnam
Park Sung-ook 23 [NULL]
Sonia Aka 22 Mapo

데이터테이블이 dtResult 라는 변수에 담겨 있다고 한다면,

   
string sName = dtResult.Rows[0]["Name"].ToSting();

하면 그 해당하는 값인 “Goshe Mack” 이라는 데이터가 나온다.

여기서 발생할 수 있는 오류의 형태는 2가지.

첫번째로는 데이터가 없을 때다. 즉 dtResult 안에 DataRow가 하나도 없으면 저기서 에러가 난다. [0] 부분은 0번째 Row를 가져오겠다는 말인데, 그 안에 앖이 없으면 Null 이고 Null에 대한 [Name]은 없으므로 에러다.

두번째로는 Name 부분이 DbNull 인 경우다. 이 경우 [0][Name] 결과가 null 이 되므로, null의 ToString 에서 오류가 발생하게 된다.

그렇다면 이제 Null을 피해보도록 하자.

첫번째의 경우.

foreach(DataRow row in dtResult.Rows)
{
       string sName = row["Name"].ToString();
}

라고 하면 일단 Data가 없는 경우에 발생되는 문제는 피할 수 있다. 왜냐면 foreach를 할 때, dtResult 안에 Row가 없으면 더 이상 안의 내용을 처리하지 않기 때문이다.

두번째의 경우는 어떻게 할까?

위의 경우 처럼 직관적으로 표현하자면 이렇게 할 수 있을 것이다.

foreach(DataRow row in dtResult.Rows)
{
    if(row["Name"] != null || row["Name"] != DBNull.Value)
    {
        string sName = row["Name"].ToString();
    }
}

조금 더 다듬어 보자.

row["Name"]
이 너무 자주 나온다!  이것을 조금 더 개선 시키는 방향은 아예 값을 밖으로 빼서 하나의 변수에 넣고, 그 값을 돌려 쓰는 방식을 취한다. 이러면 딱 한번만 row[“Name”] 을 부를 뿐 실제 값은 변수에서 직접 가져와 쓰게 된다.
foreach(DataRow row in dtResult.Rows)
{
    object value = row["Name"];
    if(value != null || value != DBNull.Value)
    {
        string sName = value.ToString();
    }
}

만일 Null 일 때 Default 값을 설정하고 싶다면? 더 간단하다. 이번에는 sName 부분을 위로 끄집어 올린다.

foreach(DataRow row in dtResult.Rows)
{
    string sName = "DEFAULT";
    object value = row["Name"];
    if(value != null || value != DBNull.Value)
    {
        sName = value.ToString();
    }
}

여기까지는 좋다고 생각된다. 그런데, 만일, 여러 개의 필드일 때는 어떻게 할까? 더욱이 String도 아닌 Int 같은 필드 인 경우 ToString 으로 해결도 안된다. 한번 위의 방식대로 코드를 짜보자

foreach(DataRow row in dtResult.Rows)
{
    string sName = "DEFAULT";
    int nAge = 0;
    string sAddress = "DEFAULT";

    object value = row["Name"];
    if(value != null || value != DBNull.Value)
    {
        sName = value.ToString();
    }

    object value = row["Address"];
    if(value != null || value != DBNull.Value)
    {
        sAddress = value.ToString();
    }

    object value = row["Age"];
    if(value != null || value != DBNull.Value)
    {
        string sTemp = value.ToString();
        try
        {
            nAge = int.Parse(sTemp);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

}

갑자기 길어지는 코드!!!!

지금은 값이 세 개니까, 저렇지 만일 필드수가 10개 이상된다고 하면, 값 한번 조회하는 코드만 100라인 넘게 된다. 까잇거 Copy&Paste 신공이 있는데! 라고 외치며 무식하게 짜시는 분이 계신다면, 나중에 그 코드를 유지보수해야 할 때 참여하는 자신 혹은 남을 위해 자제해주셨으면 한다. 제발 ㅋ

그래서 아예 값을 별도로 처리하기 위한 Util 형태의 Static 클래스를 만들어 사용하는 방법을 추천한다.

/// 
/// System.Data.DataRow의 데이터를 쉽게 접근하기 위해서 사용되는 함수 모음
/// 
static public class DBUtils
{

    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 문자열을 읽어온다.
    /// 별도 기본값을 제공하여 읽어오는데 실패한 경우 입력받은 기본값으로 돌려준다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름
    /// 읽어오는 것을 실패한 경우 돌려줄 기본값
    /// 읽어온 문자열 값
    public static string ReadString(DataRow row, string sColumnName, string sDefaultValue)
    {
        string sResult = sDefaultValue;
        if (row.Table.Columns.Contains(sColumnName))
        {
            object value = row[sColumnName];
            if ((value is DBNull) == false && value != null)
            {
                sResult = value.ToString();
                    
            }
        }
        sResult = sResult.Trim();
        return sResult;
    }

    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 문자열을 읽어온다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름    
    /// 읽어온 문자열 값
    public static string ReadString(DataRow row, string sColumnName)
    {
        return ReadString(row, sColumnName, string.Empty);
    }


    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 숫자값을 읽어온다.
    /// 별도 기본값을 제공하여 읽어오는데 실패한 경우 입력받은 기본값으로 돌려준다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름
    /// 읽어오는 것을 실패한 경우 돌려줄 기본값
    /// 읽어온 숫자 값
    public static int ReadInteger(DataRow row, string sColumnName, int nDefaultValue)
    {
        int nResult = nDefaultValue;
        if (row.Table.Columns.Contains(sColumnName))
        {
            object value = row[sColumnName];
            if ((value is DBNull) == false && value != null)
            {
                string sValue = value.ToString();
                if (int.TryParse(sValue, out nResult) == false)
                    nResult = nDefaultValue;
            }
        }
        return nResult;
    }

    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 숫자값을 읽어온다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름
    /// 읽어온 숫자 값
    public static int ReadInteger(DataRow row, string sColumnName)
    {
        return ReadInteger(row, sColumnName, 0);
    }

    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 DateTime값을 읽어온다.
    /// 별도 기본값을 제공하여 읽어오는데 실패한 경우 입력받은 기본값으로 돌려준다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름
    /// 읽어오는 것을 실패한 경우 돌려줄 기본값
    /// 읽어온 DateTime 값
    public static DateTime ReadDateTime(DataRow row, string sColumnName, DateTime defaultTime)
    {
        DateTime result = defaultTime;
            
        if (row.Table.Columns.Contains(sColumnName))
        {
            object value = row[sColumnName];
            if ((value is DBNull) == false && value != null)
            {
                try
                {
                    result = (DateTime)value;
                }
                catch (Exception ex)
                {
                    Core.LogWriter.Current.Write(ex);
                }
                //try
                //{
                //    result = DateTime.Parse(sValue);
                //}
                //catch
                //{
                //}
            }
        }
        return result;
    }


    /// 
    /// DataRow 상에서 특정 Coloumn 이름에 해당하는 DateTime값을 읽어온다.
    /// 
    /// 읽어올 데이터가 담긴 DataRow
    /// 읽어올 데이터의 Column 이름
    /// 읽어온 DateTime 값
    public static DateTime ReadDateTime(DataRow row, string sColumnName)
    {
        return ReadDateTime(row, sColumnName, DateTime.MinValue);
    }

    public static System.Data.SqlTypes.SqlBinary ReadSQLBinary(DataRow row, string sColumnName)
    {
        System.Data.SqlTypes.SqlBinary result = System.Data.SqlTypes.SqlBinary.Null;

        if (row.Table.Columns.Contains(sColumnName))
        {
            object value = row[sColumnName];
            if ((value is DBNull) == false && value != null)
            {
                try
                {
                    result = new System.Data.SqlTypes.SqlBinary((byte[])value);                        
                }
                catch (Exception ex)
                {
                    Core.LogWriter.Current.Write(ex);
                }
                //try
                //{
                //    result = DateTime.Parse(sValue);
                //}
                //catch
                //{
                //}
            }
        }
        return result;

    }
}

저런 클래스를 만들면 위에서 제시한 예제 코드는 다음 형태로 변하게 된다.

foreach(DataRow row in dtResult.Rows)
{
    string sName = DBUtils.ReadString(row,"Name","DEFAULT");
    int nAge = DBUtils.ReadInteger(row,"Age",0);
    string sAddress = DBUtils.ReadString(row,"Address","DEFAULT");
}

 

정리

반복적인 작업을 보다 효율적으로 빠르게 처리하라고 있는 컴퓨터에서 노가다하고 있는 우리네 현실을 보면 조금 답답한 것 같다. 사실 C#에는 프로그래머에게 보다 더 편리하고 간단하게 짜라는 장치가 많다. 하지만, 100% 현실에 맞는 것은 아닌 것 같다.

하나씩 자신만의 Util을 만들어 자신의 코드 내에 있는 노가다의 요소들을 정리해보는 것은 어떨까?

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

MVNO ( mobile virtual network operator )-TPlus 가입!

잡글 2012. 9. 24. 16:34

장모님 휴대폰을 스마트폰으로 바꾸기 위해서 이곳 저곳을 기웃거렸다. 최초에는 갤럭시S3 대란 때 부흥하여 타려고 했다가, 결국 내 Nexus S로 교체하려고 마음을 먹었다.

그래서 기존의 스마트폰에 싣게 될 USIM만으로 가입하려고 했다. 기왕이면 온가족 할인 끼기 위해 SKT로 하려고 했는데, 왠걸 가입비만 3만 9천원인가 되고, USIM은 9000원. 대략 4만원돈이 든다고 한다. 더욱이 주말밖에 시간이 안되서 어려운 발걸음 해줬는데, 주말에는 발급이 안된다고 했다. 결국 SKT든, KT든 처리가 힘들어졌다.

그런데 뽐뿌갔다가, MVNO 관련 프로모션이 있다고 해서 찾았다.
    “[옥션 - SK MVNO] 신규, 6개월 약정시 연아햅틱 무료증정”

image

image

image

처음에는 폰 팔이인줄 알았는데, MVNO 신규 가입 및 번호 이동에 대한 프로모션이였다.

그레이트 한점이 25000원 요금제라는게 있는데 SKT의 34요금제와 같은 형태, 150분/150건/100M 이게 25인데다가, 약정 걸면 할인 되서 2만원! 자율 요금제도 괜찮은것 같았다.

그래서 오늘 오전에 연락했고, 가입신청을 했다.

지금 행사를 이곳저곳에서 연계해서 하는지 옥션에서 구매하면, 일단 옥션에서 주문 완료 한 뒤에 나오는 신청서를 작성하라고 떴다. 그래서 배송지 처리만 하고, 가입 신청을 시작했다. SKT 에서 하는 웹 기반의 본인 인증이라서 생각보다 간단하게 일처리가 되었다.

USIM 칩이 배달 갈 주소 및 연락처, 핸드폰 명의, 신청 방식(신규가입 또는 번호이동), 지불 방식 , 휴대폰의 시리얼 번호등을 최종적으로 본인 인증 방식을 택해서 넣으라고 되어 있어. 휴대폰을 택해서 처리했다.

모두 완료되자, 2~3시간 후 본인 확인차 콜이 들어왔다. 간단한 확인 후 일사 천리.

배송지로 택배를 통해 USIM을 발송한다고 했다. – 다만 추석있는 주다 보니, 즉시 배송은 어렵고, 약간의 지연은 있을 예정이라고 한다. -

미개통 상태로 보내고, USIM 연결 후 직접 개통하는 형태로 발송해준다고 했다.

 

한달 요금 2만2천원이면 괜찮을듯.

일단 USIM 와서 연결한 뒤에 봐야 겠다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

iOS6 업그레이드

기술자료/모바일 2012. 9. 20. 09:53

10년치 생일선물을 한 큐에 받는 센스로 New IPAD를 받았다! 행복 행복..
그러다가, 갑자기 무슨생각이 들었는지 장모님께 효도폰 만들어 드린다고, 뜬금 넥서스 S 받고 IPhone 3GS를 받는 기묘한 일을 벌였다.

내 Mobile 체계는 Apple계로 돌아서게 되었다.
그 덕에 이번 iOS6 업그레이드에 눈독을 들이게 되었다.

그래서 어제 9월 19일 부터 전 장비를 백업했다. 미국 태평양 표준시 기준으로 9월 19일이라고 해서 어제 오후 6~7시까지 기다려 봤지만, 역시 출근한 뒤에 배포할 요량인지, 최소한 회사에 있는 동안에는 업그레이드를 시행하지 못했다. 그냥, 장비의 전체 백업만 한채 집으로 발길을 돌렸다.

그러다 오전에 뉴스를 하나 봤는데, 미국 태평양시 기준으로 9월 19일 오전 10시에 배포되었다고 한다. 한국 시간으로는 한밤 새벽 2시에 배포된 것이다.

iOS6, 국내서 어떻게 달라졌나

이야 하는 마음으로 Apple 홈페이지에 가보니, 예전에 달려있던 Comming Soon은 없어졌고!

드디어 ITunes를 이용해 IPAD를 연결했고, 업데이트를 눌렀다! 그러자 다운로드.

최초 10분이였지만, 역시 High Traffic으로 거의 1시간 정도의 시간이 소요되었다.

생각 보다 업그레이드 방법은 어렵지 않았고, 그냥 연결해놓고 가만히 있으니 알아서 업그레이드가 완료되었다.

완료된 IPAD는 늘 띄워놓은 잠금화면에서 멈추었다. 그래서 슬쩍 잠금 화면을 푸니까, 최초 운영체제 설치했던 것 처럼 업그레이 완료를 위한 화면이 떴다.

 

계속~ 터치!

위치 정보 공유 작업인데, 뭐 특별히 숨길것도 없어 “위치 서비스 활성화”를 터치하고 상단의 다음을 터치!

이제 iCloud, iMessage, FaceTime 등의 서비스를 이용하기 위해서는 Apple 계정이 필요한데, 이 계정에 대한 암호를 새로 입력해야 한다. 업그레이드다 보니, 이전에 설정된 정보는 그대로 남아 있고, 다만 암호만 새로 입력해야 한다. 입력하고 다음을 터치한다.

다음으로 넘어가면 자동으로 iCloud 서비스에 대한 설정화면이 잠깐 나왔다 사라진다. 워낙 순식간에 벌어져서 캡쳐 불가 ㅋ

이제 iMessage와 FaceTime 연결에 사용할 계정을 선택한다. 미리 다 선택은 되어 있으니, 그냥 기본값으로 두면 될 듯. 물론 받기 싫으면 체크를 꺼주면 된다.

두둥! 드디어 나오다. “Siri”!!!  당연 사용 사용! 물론 한국내에서는 미국에서 처럼 다양한 분야에서는 활용이 불가능하다고는 하지만, 그래도 ㅋㅋ 사용 사용!

드디어 끝! 이제 모든 설정은 완료되었고! 이제 늘 쓰던 그 IPAD로 사용하면 된다.

업그레이드 인증 샷! 버전은 6.0 / 롬 번호는 10A403.

최초 시작을 들어가면 홈 키를 오래 누르면 시리가 뜬다고 나온다.

그래서 길게 눌러봤더니 뭔 예제가 “용빈이에게 FaceTime 걸어줘” ㅋㅋ

 

이제 더 써보고 난 뒤 이런 저런 포스팅 예정이다. 조금 두근 거린다

대체 뭐가 좋아졌을라나?

 

PS. 지금 iPhone 3GS 업그레이드를 위해 업데이트 시도하려고 연결하니 77분 남았다고 뜬다 ㄷㄷㄷ ;;;;

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

자기 주도성 Paradox

잡글 2012. 9. 18. 08:52

Xper 메일링 리스트를 보면 참 좋은 글이 많다.

이번에도 좋은글!

주넥님이 쓰신 "자기 주도성"에 대한 이야기.

Agile이기에 단순히 전산 업무에서만 사용된다고 생각하겠지만, 실제로는 직장 동료간의 관계, 부부와의 관계 등등 인간과 인간이 만나 소통하는 모든 분야에서도 충분히 응용된다고 생각된다.

특히 다음 글 중에서 I-Message 라는 방법의 화법이 있는데, 다시 읽어 보고 또 읽어보면서 스스로를 생각하면서 다듬어 나가야 겠다.

그래서 나중에 다시 읽어볼 수 있도록 블로그에 게시한다. (원본 글 그대로)




2012년 8월 16일 목요일 오후 3시 50분 1초 UTC+9, 주넥 님의 말:

안녕하세요.

그간 눈팅만 하다 정말 오랫만에 글 올리네요.

Agile 을 처음 접한 이후,

팀에 Agile Practice들을 도입할려고 시도 했었는데 쉽지 않은 것 같습니다.

특히 시스템적으로 지원될 수 있는

지속적 통합(Continous Integration) 과 같은 부분은 그나마 쉬운 편이구요.

개개인의 습관과 관련된 TDD는 어려워 지고,

나아가 Agile의 여러 Pratice들에 근간이 되는 자기 주도성은

조직 문화와 관련되어 더 더욱 어렵습니다.

습관이나 문화와 관련된 부분이 내재화에 성공하자면 적지 않은 시간이 걸리는데,

이 시간동안 Agile 도입에 대한 열정을 점점 사그라 들게 되지요.

오늘 최근에 받은 Agile과 전혀 상관없는 경영 교육에서

자기 주도성 Paradox라는 내용이 있었는데 가슴에 와 닿는 부분이 있어서 공유할 까 해서 글 적습니다.

Agile의 Scrum활동 중 팀내에서 이번 주기내에서 해야할 Story 들에 대해서 정하고

Task를 나누고 계획하고 하는 주기 계획 활동에서 자기 주도성은 굉장히 중요한 부분입니다.

이러한 주기 계획 활동이 조직 문화가 뒷받침 해주지 않으면

팀장이 주기에 할 모든 Story를 꺼집어 내고 task로 나누고 선정하는 식으로

상명하복식으로 흐르게 될 가능성이 아주 큽니다.

주도성 Paradox는

미국 Bowling Green State University의 D. J. Campbell 교수의 2000년 논문에 정의된 것으로

자기 주도성을 헤치는 환경이나 상황을 일컫는 말입니다.

통상 기업환경에서는 아래와 같은 상황들이 있다고 합니다.

1. 주도적으로 일할 여유를 주기는 했는가?

회사에서 시키는 일 하기도 바쁜데 어떻게 주도적으로 일을 계획할 수 있는가? 하는 부분입니다.

제가 팀내에서 회고를 진행해보니 회고에서 많은 팀 운영관련 혹은 업무 효율성을 높일 좋은 아이디어들이 나와도

팀원들이 우려하는 것이 바쁜 업무들이 있는데, 언제 아이디어들을 적용해보지? 라는 부분들이 있었습니다.

마치, 코드 리패토링을 해야하는 데 주어진 업무들이 바빠서 리팩토링을 못하고 계속 가게 되는...

    (결국에는 더 큰 문제를 야기할 손 치더라도... 당장은 여유가 없다는 것이지요.)

이를 극복하자면 결국 팀장급들, 매니저급들이 의도적으로 팀원들이

자기 주도성을 보호하기 위해 의도적으로 시간을 할애해 주는 수밖에 없는데... 쉽지 않은 일인듯 합니다.

2. 기회를 주고도 끊임없이 개입하지는 않았나?

개입성 상사보다는 격려성 상사가 성과를 내는 것은 여러 경영 사례에서 밝혀졌다고 합니다.

    Agile에서도 팀리더들이 경우 일을 시키는 사람이라기보다 Coach가 되라고 하지요.

    Scrum practice가 성공하자면 결국 팀리더들이 Coach가 되기 위해서

제대로 된 Coaching 교육을 받아 훈련되어야 합니다.

연공서열형의 우리나라의 조직 문화에서 쉽지 않은 부분인 듯 합니다.

3. 결과에 대한 책임을 묻지 않았나?

자기 주도적으로 계획해서 실천했는데,

결과에 대해서 자꾸 위에서 뭐라하면 더이상 자기 주도적으로 되기 쉽지 않습니다.

그렇다고 팀리더 입장에서 잘못된 결과나 실수를 눈감고 그냥 지나칠 수도 없지요.

우선 자기 주도적 계획과 수행 과정에 대해서 칭찬하고 격려를 하고,

결과에 대해서는 개선이 될 수 있도록 기분 나쁘지 않게 지적하는 것이 필요하다고 합니다.

결국 여기서도 코칭을 잘해서 팀원들을 비난이 아닌 격려로 나쁜 결과가 반복되지 않도록

지도하는 것이 필요합니다.

흔히 직장 상급자가 직장 하급자를 야단 치는

    "너가 XXX 하면 어쩌자구, 정신이 있니 없니?" 식의

비난성의 YOU-message보다

    "나는 이번에 XXX결과가 나와서, 외적으로 YYY하고 ZZZ상황들이 초래될까 상당히 걱정이 된다."는 식의

    I-message를 통한 지적이 경영학적으로 코칭에 좋다고 합니다.

최근에 최초 올림픽 동메달을 획득한 홍명보 감독의 리더쉽에 대한 이야기들이 많은데요.

홍감독이 이런말을 했다고 합니다.

    "너희들은 팀을 위해서 죽어라!"

    "나는 너희들을 위해서 죽겠다.!"

결국 팀원들의 실수에 대한 책임은 팀리더가 지겠다는 각오와 행동으로 팀원들을 코칭해야

자기 주도성이 지속될 수 있겠지요.

주도성 Paradox 참고글

IGM (세계경영연구원) 이계평 교수님의 주도성 Paradox에 대한 글

http://s.hankyung.com/news/app/newsview.php?aid=2012050307041&sid=01102013&nid=291&type=0

LG 경제연구원 주도성 Paradox에 대한 글

http://www.lgeri.com/management/organization/article.asp?grouping=01020200&seq=489

I-message 참고글

구글링해보면 많은 글들이 나옵니다. 그중 하나...

http://blog.daum.net/ilovechina/11349722

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

사용자 암호 관리

기술자료/.NET 2012. 9. 12. 09:51

원본 : http://msdn.microsoft.com/ko-kr/library/ms180915(VS.80).aspx

(즐겨찾기에 있는 정보로 링크 변경이나, 사이트 변경에 따라 정보가 유실될 것 같아 홈페이지에 등록합니다. 아래의 문건의 권리는 모두 Microsoft 에 귀속됩니다.)


이 항목에는 사용자 암호 관리에 대한 정보 및 코드 예가 들어 있습니다.

다음 C# 코드 예에서는 IADsUser::SetPasswordadsi.iadsuser_setpassword 메서드를 호출하여 사용자 암호를 설정하는 방법을 보여 줍니다. IADsUser::SetPassword에 대한 자세한 내용은 MSDN Library(http://msdn.microsoft.com/library)의 "IADsUser::SetPassword"를 참조하십시오.

 
usr.Invoke("SetPassword", SecurelyStoredPassword);

다음 C# 코드 예에서는 IADsUser::ChangePasswordadsi.iadsuser_changepassword 메서드를 호출하여 사용자 암호를 변경하는 방법을 보여 줍니다. IADsUser::ChangePassword에 대한 자세한 내용은 MSDN Library(http://msdn.microsoft.com/library)의 "IADsUser::ChangePassword"를 참조하십시오.

 
usr.Invoke("ChangePassword", OldSecurelyStoredPassword, NewSecurelyStoredPassword);

다음 C# 코드 예에서는 다음 로그온 시 사용자 암호를 변경할 수 있도록 설정하는 방법을 보여 줍니다. 이 경우 pwdLastSetadschema.a_pwdlastset 속성을 off(-1)로 설정합니다. adschema pwdLastSet 특성에 대한 자세한 내용은 MSDN Library(http://msdn.microsoft.com/library)의 "pwdLastSet" 또는 "Pwd-Last-Set attribute"를 참조하십시오.

 
usr.Properties["pwdLastSet"].Value = -1; // To turn on, set this value to 0.
usr.CommitChanges();

 

다음 C# 코드 예에서는 암호를 변경하는 사용자 권한을 거부하도록 ACE를 설정하는 기능을 보여 줍니다. 이 경우 ntSecurityDescriptor 속성을 가져올 수 있도록 IADsSecurityDescriptor에 액세스하는 데 ADSI 액세스에 COM 상호 운용성 사용를 사용합니다. 그런 다음 IADsAccessControlList를 사용하여 보안 설명자의 DACL을 가져오고 IADsAccessControlEntry를 사용하여 AceType, AceFlags, Trustee, Flags, ObjectType 및 AccessMask 속성을 가져옵니다. AceType 플래그는 ADS_ACETYPE_ENUM에 정의되어 있습니다. AceFlags는 ADS_FLAGTYPE_ENUM에 정의되어 있습니다. AccessMask 플래그는 ADS_RIGHTS_ENUM에 정의되어 있습니다.

 
using System;
using System.DirectoryServices;
using ActiveDs;

static void DenyChangePassword(DirectoryEntry User)
{

	const string PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}";
	const int ADS_UF_PASSWORD_EXPIRED=0x800000;
	const int ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION=0x1000000;

	string[] trustees = new string[]{@"NT AUTHORITY\SELF","EVERYONE"};
	

	ActiveDs.IADsSecurityDescriptor sd = (ActiveDs.IADsSecurityDescriptor)

	User.Properties["ntSecurityDescriptor"].Value;

	ActiveDs.IADsAccessControlList acl = (ActiveDs.IADsAccessControlList) sd.DiscretionaryAcl;

	ActiveDs.IADsAccessControlEntry ace = new ActiveDs.AccessControlEntry();

	foreach(string trustee in trustees)
	{
		ace.Trustee = trustee;
		ace.AceFlags = 0;
		ace.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT;
		ace.Flags = (int)ActiveDs.ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT;
		ace.ObjectType = PASSWORD_GUID;
		ace.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS;
		acl.AddAce(ace);
	}

	sd.DiscretionaryAcl = acl;
	User.Properties["ntSecurityDescriptor"].Value = sd;
	User.CommitChanges();
}

다음 C# 예에서는 암호를 변경하는 사용자 권한을 거부하도록 ACE를 설정하는 기능을 보여 줍니다. 이 예에서는 .NET Framework 2.0에서 사용할 수 있는 관리되는 ACL 기능을 사용합니다.

using System;
using System.DirectoryServices;
using System.Security.Principal;
using System.Security.AccessControl;

static void DenyChangePassword(DirectoryEntry user)
{
    // Create a Guid that identifies the Change Password right.
    Guid changePasswordGuid = 
        new Guid("{AB721A53-1E2F-11D0-9819-00AA0040529B}");

    // Get the ActiveDirectorySecurity for the user.
    ActiveDirectorySecurity userSecurity = user.ObjectSecurity;

    // Create a SecurityIdentifier object for "everyone".
    SecurityIdentifier everyoneSid = 
        new SecurityIdentifier(WellKnownSidType.WorldSid, null);

    // Create a SecurityIdentifier object for "self".
    SecurityIdentifier selfSid = 
        new SecurityIdentifier(WellKnownSidType.SelfSid, null);

    // Create an access rule to allow everyone the change password 
    // right. 
    // This is used to remove any existing access rules.
    ActiveDirectoryAccessRule allowEveryone = 
        new ActiveDirectoryAccessRule(
            everyoneSid,
            ActiveDirectoryRights.ExtendedRight, 
            AccessControlType.Allow, 
            changePasswordGuid);

    // Create an access rule to deny everyone the change password right.
    ActiveDirectoryAccessRule denyEveryone =
        new ActiveDirectoryAccessRule(
            everyoneSid,
            ActiveDirectoryRights.ExtendedRight,
            AccessControlType.Deny,
            changePasswordGuid);

    // Create an access rule to allow self the change password right.
    // This is used to remove any existing access rules.
    ActiveDirectoryAccessRule allowSelf =
        new ActiveDirectoryAccessRule(
            selfSid,
            ActiveDirectoryRights.ExtendedRight,
            AccessControlType.Allow,
            changePasswordGuid);

    // Create an access rule to deny self the change password right.
    ActiveDirectoryAccessRule denySelf =
        new ActiveDirectoryAccessRule(
            selfSid,
            ActiveDirectoryRights.ExtendedRight,
            AccessControlType.Deny,
            changePasswordGuid);

    // Remove any existing rule that gives "everyone" the change 
    // password right.
    userSecurity.RemoveAccessRuleSpecific(allowEveryone);

    // Add a new access rule to deny "everyone" the change password 
    // right.
    userSecurity.AddAccessRule(denyEveryone);

    // Remove any existing rule that gives "self" the change password 
    // right.
    userSecurity.RemoveAccessRuleSpecific(allowSelf);

    // Add a new access rule to deny "self" the change password right.
    userSecurity.AddAccessRule(denySelf);

    // Commit the changes.
    user.CommitChanges();
}

다음 코드 예에서는 암호가 만료되지 않도록 설정하는 방법을 보여 줍니다. 이 경우 ADS_USER_FLAG_ENUM에 정의되어 있는 ADS_UF_DONT_EXPIRE_PASSWD 플래그를 설정할 수 있도록 userAccountControl 속성에 액세스하기 위해 Properties 메서드를 사용합니다.

using System;
using System.DirectoryServices;
using ActiveDs;

static void DontExpirePassword(DirectoryEntry User)
{
    int val;
    const int ADS_UF_DONT_EXPIRE_PASSWD =0x10000;
    val = (int) User.Properties["userAccountControl"].Value;
    User.Properties["userAccountControl"].Value = val | 
        ADS_UF_DONT_EXPIRE_PASSWD;
    User.CommitChanges();
}


728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

아이폰 3GS로 변경

잡글 2012. 9. 6. 14:29

장모님 핸드폰을 스마트 폰으로 변경해드리고 싶은 마음에 8월 말에 기계값 1000원 대란에 동참하려는 찰나, 여러가지 문제로 인해 결국 실패했고 9월이 넘어가자 모든 정책들은 종료하게 되고 결국 대란은 잠들어 지금은 잠잠한 시기.
( 뽐뿌 휴대폰 게시판 기준 : 2012/09/06 )

별 매리트 없어 보이는 기계 할부 원가가 10여만원이 넘거나 해서 그렇게 매력적이지 않은 물건만 가득차 결국 중고폰을 마련해서 하나 해드려야 겠다는 생각이 들었다.

 

뽐뿌와 함께 클리앙 중고사이트를 들락 거리던 중, 이런 저런 중고 핸드폰들을 보고 있는데, 요 근래 아이폰 물건이 많이들 쏟아지고 있었다. 원래는 갤럭시 노트 정도로 생각하고 뒤지고 있었는데, 대략 가격이 25~45만원 선에 걸쳐 있어 고민을 무척했다. 사실 그 정도 금액이면 옥션 중고로 해서 구매하면, 카드 결제와 같은 부분도 있어 차라리 옥션 중고로 넘어갈까도 생각했다.

그러다 어느날 아이폰 3GS 중고가 9만원에 올라와 있었다. 설마 했다. 뭔가 큰 하자가... 심한 전투형이거나, 아니면 부품용 아닐까? 했는데, 사진을 보니 그리 나빠보이진 않았다. 그리고 저녁에 결심하고 문자를 보냈다.

다행이 답변은 도착했고, 긍정적인 흐름이였다. 그런데, 갑자기 판매자에게서 다양한 사진들이 올라오면서 "이래도 사실래요?" 라는 .... 문자가...

C139917e1e0fC139917e1e4aC139917e1e30C1399168db35C13991773665Untitled

"엥 뭐가?" 라는 느낌으로 바라보는데, 의외로 좀 문제가...

첫번째로는 전원 버튼이 없었다. 뭐 게시물에도 언급되어 있지만, 막상 없으니...

두번째로는 액정 한가운데에 짧게 긁힌 상처가... 저 여자 사진 부분인데, 크게 보면 무슨 흉터 처럼 위에서 아래로 길게 상처가 있는데, 그 부분이다. 대충 보면 모르는데, 동영상이나 사진등을 보면 해당 위치가 마치 액정 나간거 처럼 여러가지 빛깔로...

세번째는 여기저기 스크래치도 있고, 약간의 크랙과 특유의 기름과 먼지가 뭉쳐진 곳도 많았다.

사실 고민이 되었다. 어떻게 할까... 생각해보니, 저것들 외에도 배터리나 기타 미처 발견하지 못한 하자부분을 A/S 맡길 예정인데, 견적이 쎄게 나올까 걱정이 들었다. 그렇다면, 9 + 10여만원(미정) 해도 20만원 찍는거 아닌가?

갑작스레 후회가....

그리고 다음날... 일단 구매하는걸로 문자를 때리고, 대신 가격을 8만원으로 낮추었다. 개인적인 욕심으로는 5만원까지 떨굴까도 했지만, 뭐....능력 밖.

결국 저녁에 만나 물건을 받았다. 처음 내 USIM 칩을 박았는데 ,잘 안되는데, 알고 봤더니, 꼽고 한번 켠 뒤에 다시 재 부팅을 하면 인식을 했던 것이다. 간신히 재부팅해서 이것 저것을 해보았다.

집사람 폰이 아이폰4 라서 몇 번 만져본 경험에 따르면, 일단 해상도가 꽝. 진짜 보기가 영 아니올씨다 였다. 심지어 지금 내가 들고다니는 폰인 넥서스S에 비하면 한참이 떨어지는.. 그런 해상도

제일 중요한 부분. 어르신을 위한 편의 장치를 찾아보았다. 조금 기대를 했는데, 생각했던 것과는 전혀 달랐다. 일단 키보드 부분. 이건 애플에서 완전 Lock을 걸어 놓았는지, 조그만한 기본 쿼티 키보드만 나온다. 물론 나를 포함한 3~40대 전 세대에게는 익숙한 자판이고, 어렵지는 않지만, 나이드신 장모님에게는 GG.

게다가 화면의 전반적인 Text를 키우고 싶어도 방법이 전혀 없었다. 화면 자체를 Zoom In/Out 하는 기능은 있지만, 손가락 세개를 가지고 여기저기를 누비는 것도 한계가 있고 여러가지로 마음에 많이 걸렸다.

이런 저런 편의성 도구들을 찾아보다가, 결국 포기했다. 도무지 답이 없었다.

그러다 문득... 안드로이드 폰이면? 이라는 생각으로 내 폰을 이용해서 이런저런 작업을 해보았고, 결론을 내릴 수 밖에 없었다.

"내 폰은 장모님께, 나는 아이폰 3GS"

 

의도하지도 생각치도 않았는데, 아이폰을 쓸 수 밖에 없었다.

 

IMG_20120906_130218IMG_20120906_130227IMG_20120906_130303IMG_20120906_130323IMG_20120906_130339

하얀색... 마음에는 들지만, 제대로 쓸려면.. 일단 A/S 부터 해야 하겠다. ㄷㄷㄷ

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

  • «
  • 1
  • »
250x250

블로그 내에 소스 코드 삽입 이사온 기념 스킨도... RSS 전문 기능 비활성화 관련. 스킨 바꾸어 보았습니다. 서버 파일 정리 좀 했습니다.

«   2012/09   »
일 월 화 수 목 금 토
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

지름신 불만 친구 좀 java twi2me Tutorial 비스킷 WSS 오류 인터파크 e-book moss me2photo 블로그 2010 SharePoint MOSS 2007 것 Buscuit Google Apps Engine me2sms me2dayzm 매뉴얼 Azure 협업 개발환경 수 windows Visual Studio

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015-2025 Socialdev. All Rights Reserved.

Copyright © 2015-2025 Socialdev. All Rights Reserved.

티스토리툴바