방명록

은빛소나기의 개발 노트에 오신것을 환영합니다 ^_^



여긴 방명록입니다.

by layil | 2010/12/31 23:59 | Guest | 트랙백 | 덧글(39)

남이섬에서 다람쥐를 봤습니다.





여친님이랑 남이섬에서 오솔길을 걷던 중에 갑자기 튀어나온 녀석입니다.

갑자기 튀어나올땐 놀랐는데, 보니까 다람쥐더라구요.

뭔가를 먹고 있는 모습이 귀엽더군요.

아무래도 이날의 포토재닉은 다람쥐가 가져간듯 하네요!

by 은빛소나기 | 2009/10/26 17:08 | Diray | 트랙백 | 덧글(1)

신세계몰 밉다 ㅠㅠ

내이름은_한글이_아니래.jpg



뭔가요 신세계몰 ㅠㅠ

이름을 부정하다니 ㅠㅠ

by 은빛소나기 | 2009/09/25 10:43 | Diray | 트랙백 | 덧글(0)

[신림 아이스베리]쟁반 빙수


언제였는지 기억이 잘안나지만 신림에 있는 아이스베리에 갔습니다.
팥빙수가 먹고싶어서요!

여자친구님(?)이랑 둘이서 가서 쟁반빙수 2인 을 시켰더니.
엄청나게 많이 나오더군요!


있을건 다있습니다!
바나나, 수박, 산딸기 파인애플, 키위 등등
거대한 아이스크림도 맛있구요.
안타깝게도 가격이 정확히 기억이 나지 않네요.
부담없는 가격대였던걸로 기억합니다.








마지막 짤로 신림 아이스베리 바깥에 있는 동상....

뭔가 정밀 묘사 되어있어요.

by 은빛소나기 | 2009/08/05 11:33 | Diray | 트랙백 | 덧글(3)

[C]알고리즘을 왜 배워야 하는가?

최근 동아리 신입생 교육에 대해서 골머리를 앓던중에 갑자기 이런생각이 들었다.

신입생들에게 과연 알고리즘을 왜 배워야하는지 설명하려면 어떻게 해야할까?

단순히 백과사전처럼 알고리즘이란

어떤 문제의 해결을 위해 컴퓨터가 사용 가능한 정확한 방법을 말한다. 알고리즘은 여러 단계의 유한한 집합으로 구성되는데, 여기서 각 단계는 하나 또는 그 이상의 연산을 필요로 한다.


이라고 설명해줘야할까?

그건 아니라고 본다. 분명히 이해도 못할 뿐더러 필요성도 못느낄것이리라는 생각이 들었다.

하여 고민중에 이런 생각이 들었다.

자 제군들 1부터 100까지 더하는 프로그램을 만들어라.

아마 대부분 다음과 같은 프로그램을 코딩할것이다.

#include <stdio.h>
#include <conio.h>

int main(){
    
     int sum, maxplus;
    
     sum = 0;
    
     maxplus = 100;
    
     for(int i = 1; i <= maxplus; i++)
             sum += i;

     printf("%d\n",sum);
    
     getch();
            
     return 0;
      
}


그러나 알고리즘을 알고 있다거나 조금 머리가 비상한 친구는 다음과 같이 코딩을 할 수도 있을 것이다.


#include <stdio.h>
#include <conio.h>

int main(){
    
     int sum, maxplus;
    
     sum = 0;
    
     maxplus = 100;

    sum = (maxplus+1)*(maxplus/2);
     
     printf("%d\n",sum );
    
     getch();
      
     return 0;
      
}


차이가 느껴지는지 모르겠다.

1부터 100까지 더하는 프로그램을 코딩할때 단순히 100번의 루프를 돌리면 간단하다.

하지만 조금더 생각해본다면 우리가 초등학교 중학교때 배웠던 방법을 응용할 수 있다.

바로 더하려는 최대값(100)의 절반값(50)이 총 최대값 + 1 만큼(101) 반복 된다는 것.

즉 1~100의 합을 구하기 위해서는 아래와 같은 식을 이용할 수 있다는 것이다.

(x/2) * (x + 1) = r
(ex: 50 * 101 = 5050)

지금 당장 이런 루틴에 머리 아프게 이런 식을 써야 하나 라는 생각을 할 수 있지만, 만약 1부터 백만까지의 수를 더해야하는 경우가 발생하다면 단순 루프의 반복보다는 계산식이 좀더 효율적일 것이다.

나는 이것이 알고리즘의 필요성을 한 절반정도 느낄 수 있게 해주리라 믿는다.

사실 알고리즘은 특정한 문제를 해결하기 위한 최적화 된 방법이기도 하지만,

어떤 문제에 부딪쳤을때 해결방법을 제시해주는 역할도 한다고 생각한다.

이 부분에 대해서는 조금 더 생각하여 쉽게 가르칠 수 있는 방법을 연구해야할것 같다.


ps1.
연산 시간에 대해서 테스트를 해봤다.
결과는 다음과 같다.



by 은빛소나기 | 2009/07/27 11:48 | Development | 트랙백 | 덧글(17)

[ASP]INPUT 배열 받아오기

종종 Form 객체에서 Input 배열을 받아야할때가 있다.

예를 들어 다음과 같은 From 구조가 존재한다고 가정하자.

<input type="text" name="temp" id="temp" value="0" />
<input type="text" name="temp" id="temp" value="1" />
<input type="text" name="temp" id="temp" value="2" />
<input type="text" name="temp" id="temp" value="3" />



위 폼 구조는 temp 라는 이름의 배열로 존재하게 되는데,
ASP에서 이 값을 폼으로 전달 받기 위해서는

Request.Form("temp")(index)의 형태로 받아와야한다.
즉 결과를 보자면 다음과 같다.

Request.Form("temp")(1) = 0
Request.Form("temp")(2) = 1
Request.Form("temp")(3) = 2
Request.Form("temp")(4) = 3


하지만 항상 Request 객체를 호출하여 값을 받아오려면 그에 따른 오버헤드가 있기 마련이다.
하여 이를 변수로 받고자 한다면, 다음과 같이 ASP 코드를 작성하면 된다.


Dim arrRequestVar

Set arrRequestVar = Request.Form("temp")

arrRequestVar (1) = 0
arrRequestVar (2) = 1
arrRequestVar (3) = 2
arrRequestVar (4) = 3

by 은빛소나기 | 2009/07/20 11:36 | Development | 트랙백 | 덧글(0)

[MSSQL] 테이블 중복검사

저장프로시저를 통해 혹은 동적 쿼리를 이용하여 테이블을 생성할 때

같은 이름의 테이블이 존재하면 에러메세지와 함께 프로그램이 종료(해당 처리가 되어 있을 경우)가 되게 된다.

이를 막기 위해서는 두가지 가정을 할 수 있는데

 

P) 같은 이름의 테이블이 존재한다면

     1. 해당 테이블을 삭제 하고 테이블을 새로 생성

     2. 해당 테이블이 있으므로 생성하지 않음

 

이런경우 우리는 쿼리를 이용하여 두가지 경우 모두를 해결할 수 있다.

 

바로

IF EXISTS()

IF NOT EXISTS()

구문이다

 

이는 해당 조건을 만족하면 실행하고 그렇지 않을경우 실행하지 않는 것인데,

이를 이용하면 동적으로 테이블을 생성할 경우 중복 테이블을 방지 할 수 있다.

 

1. 해당 테이블을 삭제 하고 테이블을 새로 생성

IFEXISTS(SELECT name
   FROM   sysobjects
   WHERE  name = N'table_name'
   AND   type = 'U')

        DROP TABLE table_name


GO

 

CREATE TABLE table_name (
<column_1, sysname, c1> <datatype_for_column_1, , int> NULL,
<column_2, sysname, c2> <datatype_for_column_2, , int> NOT NULL)

 

GO

 

 

2. 해당 테이블이 없으면 테이블을 생성함

IFNOT EXISTS(SELECT name
   FROM   sysobjects
   WHERE  name = N'table_name'
   AND   type = 'U')

        BEGIN

 

            CREATE TABLE table_name (
            <column_1, sysname, c1> <datatype_for_column_1, , int> NULL,
            <column_2, sysname, c2> <datatype_for_column_2, , int> NOT NULL)

 

        END

 
예전에 작성해둔것이었는데 이게 은근히 헷갈린다.

하여 다시 포스팅을 했다.

by 은빛소나기 | 2009/07/20 10:46 | DBMS | 트랙백 | 덧글(0)

[ASP] 저장프로시저의 CreateParameter 이용시


ASP로 웹 프로그램을 작성하다보면 보안과 관련하여 저장프로시저를 이용하게 된다.

이때 CreateParameter 를 이용하여 저장프로시저를 실행하게 되는데
(정확히는 저장프로시저 실행하기 위한 매개변수 전달을 위한 함수이다)

저장프로시저의 파라미터의 자료형에 따라 다른 상수를 적용해야한다.

그 상수표가 아래와 같다.

ps. 꽤 오래전에 어느 사이트에서 보고 워드 문서로 저장해둔것이었는데, 정확한 출처 기록이 남아있지 않다. 문제가 되면 삭제하도록 하겠다.

상수설명
adBigInt208 바이트의 부호 있는 정수(DBTYPE_I8)를 나타낸다.
adBinary128이진 값(DBTYPE_BYTES)을 나타낸다.
adBoolean11Boolean 값(DBTYPE_BOOL)을 나타낸다.
adBSTR8Null 종결 문자열(유니코드)(DBTYPE_BSTR)을 나타낸다.
adChapter136Child RowSet에서 Row를 식별하기 위해서 사용되는 4 바이트 Chapter 값(DBTYPE_HCHAPTER)을 나타낸다.
adChar129String 값(DBTYPE_STR)을 나타낸다.
adCurrency6Currency 값(DBTYPE_CY)을 나타낸다. Currency는 소수점 이하의 자릿수가 4개인 고정 자릿수이다. 이 값은 10,000으로 환산된 8바이트의 부호 있는 정수로 저장된다.
adDate7Date 값(DBTYPE_DATE)을 나타낸다. 날짜는 Double 형식으로 저장되며, 정수 부분은 1899년 12월 30일 이후의 날짜수이며 소수 부분은 하루 중 시간을 나타낸다.
adDBDate133날짜 값(yyyymmdd)(DBTYPE_DBDATE)을 나타낸다.
adDBFileTime137파일-시간 값(DBTYPE_DBFILETIME)을 나타낸다.
adDBTime134시간 값(hhmmss)(DBTYPE_DBTIME)을 나타낸다.
adDBTimeStamp135날짜-시간 스탬프(yyyymmddhhmmss에 10억분의 1초 단위가 추가된)(DBTYPE_DBTIMESTAMP)를 나타낸다.
adDecimal14고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_DECIMAL)을 나타낸다.
adDouble5배정도의 부동 소수점 값(DBTYPE_R8)을 나타낸다.
adEmpty0지정된 값 없음(DBTYPE_EMPTY)을 나타낸다.
adError1032 비트 오류 코드(DBTYPE_ERROR)를 나타낸다.
adFileTime641601년 1월 1일 이후의 1000만분의 1초 간격의 숫자를 표현하는 64 비트 값(DBTYPE_FILETIME)을 나타낸다.
adGUID72전역 고유 식별자(GUID)(DBTYPE_GUID)를 나타낸다.
adIDispatch9OLE 개체에서 IDispatch 인터페이스에 대한 포인터(DBTYPE_IDISPATCH)를 나타낸다.참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.
adInteger34바이트의 부호 있는 정수(DBTYPE_I4)를 나타낸다.
adIUnknown13OLE 개체에서 IUnknown 인터페이스에 대한 포인터(DBTYPE_IUNKNOWN)를 나타낸다.참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.
adLongVarBinary205Long 이진 값(Parameter 개체만 해당)을 나타낸다.
adLongVarChar201Long String 값(Parameter 개체만 해당)을 나타낸다.
adLongVarWChar203Long Null 종결 문자열 값(Parameter 개체만 해당)을 나타낸다.
adNumeric131고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_NUMERIC)을 나타낸다.
adPropVariant138자동화 PROPVARIANT(DBTYPE_PROP_VARIANT)를 나타낸다.
adSingle4단정도의 부동 소수점 값(DBTYPE_R4)을 나타낸다.
adSmallInt22 바이트의 부호 있는 정수(DBTYPE_I2)를 나타낸다.
adTinyInt161 바이트의 부호 있는 정수(DBTYPE_I1)를 나타낸다.
adUnsignedBigInt218 바이트의 부호 없는 정수(DBTYPE_UI8)를 나타낸다.
adUnsignedInt194 바이트의 부호 없는 정수(DBTYPE_UI4)를 나타낸다.
adUnsignedSmallInt182 바이트의 부호 없는 정수(DBTYPE_UI2)를 나타낸다.
adUnsignedTinyInt171 바이트의 부호 없는 정수(DBTYPE_UI1)를 나타낸다.
adUserDefined132사용자 정의 변수(DBTYPE_UDT)를 나타낸다.
adVarBinary204이진 값(Parameter 개체만 해당)을 나타낸다.
adVarChar200String 값(Parameter 개체만 해당)을 나타낸다.
adVariant12자동화 Variant(DBTYPE_VARIANT)를 나타낸다.
adVarNumeric139숫자 값(Parameter 개체만 해당)을 나타낸다.
adVarWChar202Null 종결 유니코드 문자열(Parameter 개체만 해당)을 나타낸다.
adWChar130Null 종결 유니코드 문자열(DBTYPE_WSTR)을 나타낸다.

by 은빛소나기 | 2009/07/03 11:35 | Web | 트랙백 | 덧글(2)

[MSSQL] 주문번호 등 코드를 생성하는 쿼리

종종 프로그래밍을 하다보면 코드 번호를 생성해야하는 경우가 있다.
코드번호가 거창한것이 아니라 특정 자리수의 코드를 만든다던가 날짜가 들어간 코드를 만든다던가 하는 것을 의미한다



 -- 00000000 코드 생성 쿼리
SELECT right(cast(( SELECT isnull(MAX([CODE_FIELD_NAME]),1) + 1 FROM [TABLE_NAME] ) + 100000000 as char(9)), 8)


-- 2007032500001 코드 생성 쿼리
SELECT Convert(char(8),getdate(),112) + right(cast(( SELECT isnull(MAX([CODE_FIELD_NAME]),1) + 1 FROM [TABLE_NAME] WHERE Convert(char(8),getdate(),112) = Convert(char(8),[DATE_FIELD_NAME],112) ) + 100000 as char(6)), 5)



대괄호로 묶여진 부분은 자신의 DB 환경에 맞게 수정해야하는 것으로 각각 다음과 같은 의미를 지닌다


[TABLE_NAME] : 코드를 생성할 테이블 이름
[DATE_FIELD_NAME] : 해당 테이블의 날짜 필드 이름
[CODE_FIELD_NAME] : 해당 테이블의 기 생성된 코드 필드 이름

by 은빛소나기 | 2009/07/02 16:03 | Development | 트랙백 | 덧글(2)

이번달 지름

아. 예 간만에 포스팅 한다는게 지름 포스팅이네요.

월급도 받았겠다. 요새 한동안 옷도 못샀겠다 싶어서 그냥 펑펑 질렀습니다.

간단한 케주얼 정장 느낌 나는 코디를 하고 싶어서 반팔 스프라이트 셔츠, 그레이 면바지, 운동화, 막구두, 벨트 이렇게 질렀습니다.

언제 배송올지 기대되네요!

...근데 막상 사고보니 면바지 색이 좀 아니군요. 베이지나 화이트로 갈걸 그랬네요

짤은 다음과 같습니다

by 은빛소나기 | 2009/06/25 09:16 | Fashion | 트랙백 | 덧글(3)

◀ 이전 페이지          다음 페이지 ▶