2013. 7. 12. 15:33

2013년 7월 12일(금)


얼마전 회사에서 운영되는 미소몰에 신규 프로젝트를 일시적으로 진행하게 되었다..

예전에 개편을 했다는데도 ASP을 사용하는 오래된(?) 환경이었다..

이걸 진행하면서 확인된 사항에 대해서 얘기하고자 한다..


오늘 말하고 싶은건 ADO Cursor Location에 대한 부분이다.

Cursor는 Server-Side Cursor, Client-Side Cursor가 있는데

간단하게 보면 결과셋이 Server에 있는가? Client에 있는가에 따라 결정되는 것이다..


여기서 이 Cursor Location의 중요성을 재조명하고 싶었다..

근데 뭐.. 워낙 오래되고 중요한 터라 많은 자료가 있더라;;;


ADO의 Cursor는 기본적으로 Server-Side Cursor를 사용한다..

(http://msdn.microsoft.com/en-us/library/windows/desktop/ms677542(v=vs.85).aspx)


그런데, 우리 사이트는...

관련된 설정이 없다... 

그래서.. 보다시피 Server-Side Cursor를 사용하고 있다..

몰라서 그냥 뒀기때문에 적용이 된건지, 이유가 있어서 사용을 하는 건지..

일단 담당자에게 건의를 해봐야겠다..




Cursor Location의 중요성에 대한 글

http://msdn.microsoft.com/en-us/library/windows/desktop/ms676564(v=vs.85).aspx


일반적인 웹기반 서비스를 위해서 Server-Side Cursor를 사용할 필요는 많이 없을 것이다.. (아닌가?)


물론, 위 링크의 글에서 말하듯이 Server-Side Cursor가 제공하는 장점도 있지만,

그것을 위해 일부러 사용한 것이 아니라면, Client-Side Cursor가 이용되어야 겠다..

서버의 자원을 중요하고... 또.. 비싸니까...



마지막으로.. 근데 이제 ASP는 그만 써도되지 않나.. 휴~;;;

(뭔가 보여주고 싶었는데.. 자료가 많아서 내가 또 쓸필요가 있나싶은 의구심이 들더니 이렇게 허무하게 끝나네;;)



Posted by 열라착한앙마

댓글을 달아 주세요

2013. 5. 20. 11:17

2013년 5월 20일(월)


오랜만에 웹 개발을 하려니 어질어질하구만...

더구나 Classic ASP라니..;;

(한달만 더하면 되니까 참고 참고 참자...)


내가 잘 모르던 것들도 이제는 너무나 대중적으로 잘 쓰이고 있고..

여러가지고 공부해야할 것이 많아서 걱정이구만;;

어떻게 따라간다냐...;;


오늘은 jQuery에 대해서 놀라움을 느끼고 있어~

익숙하지 않은 문법에 뭘하는지 모르는데 뭔가 막 만들어지고 있다 ㅋㅋㅋㅋ


Posted by 열라착한앙마

댓글을 달아 주세요

2012. 5. 21. 17:47

현재 담당하고 있는 모듈에서의 성능을 향상시키기 위해서 여러가지를 검토하던중에

그리드에 바인딩할 때 BeginUpdate, EndUpdate를 사용하면 성능적인 향상을 얻을 수 있다는 글을 발견하게 되었다



그래서 나의 소스에 적용할 수 있을지 확인해 보았더니 안된다...;;

델파이 4에서 사용불가...

델파이 2007에서 사용불가...

델파이 XE2에서는 사용 가능


상속구조를 따라가보니.. TControl에 virtual로 선언되어 있더라..

그런데 델파이4, 2007에서는 없다..

어느버전 부터 추가되었는지 모르겠지만...

현재 나의 모듈에서는 사용을 못한다는 소리다..

그렇다고... TControl을 상속받아서 BeginUpdate, EndUpdate를 구현해서 사용하기에는.. 

위험부담이 크다..

제길슨... 고민 좀 더 해보자...


뭔가 위험하지 않은 좋은 방법이 없을까...


Posted by 열라착한앙마

댓글을 달아 주세요

2012. 2. 9. 11:15


델파이에서 DBGrid에서 타이블여부를 확인하는 방법은 간단하다..

갑자기 포스팅한 이유는 DBGrid에서 더블클릭이벤트를 주면 제목과 상관없이 그리드에서 발생한 더블클릭이벤트에 대해서 모두 수행되는데, 가끔 제목은 제외하고 이용해야 할 경우가 발생하더라..

procedure ....
var
    aPoint : TPoint;
    aGridCoord : TGridCoord;
begin
    aPoint := fDbGrid.ScreenToClient(Mouse.CursorPos);
    aGridCoord := fDbGrid.MouseCoord(aPoint.x, aPoint.y);
   
    if (aGridCoord.Y <> 0) then
        ShowMessage('It is not a title.')
    else
        ShowMessage('It is a title.');
end;


쓰고보니..
참고할만한 링크가 있네;;
괜히 썼다.. 링크나 해둘껄.. ㅋㅋㅋㅋ

http://saja0405.tistory.com/3
http://delphi.about.com/od/usedbvcl/a/dbgrid_autofit.htm
Posted by 열라착한앙마

댓글을 달아 주세요

2010. 1. 6. 16:10


델파이 4로 만들어본 간단한 시간측정
DecodeTime을 이용하면 millisecond까지 측정이 간단하다..

귀찮으니 초절정 간단하게

Button1을 누른후 Button2를 누르면 그동안의 소요시간이 측정된다.

[실행폼]



[결과화면]


[소스]



DecodeTime




날짜도 뭐.. DecodeDate가 있긴하다



Posted by 열라착한앙마

댓글을 달아 주세요

2008. 12. 16. 13:36

Writing unit tests to validate a data access layer (DAL) can be a time consuming (but life saving) task. One of the biggest challanges of DAL unit tests is assuring that you have consistent data to pull from the database. Dedicating a database with static data for unit tests doesn’t always work. As unit tests are added to the project, data may need to be added to the database. This can cause previously created tests to fail, and a lot of time can be lost trying to resync everything.

One technique for getting around the unit test database consistency issue is to write data to the database you expect to find. The steps for doing this would be:

  • Begin a transaction in your unit test.
  • Write the data to the database that your data access layer will need.
  • Test the data access layer functionality against the inserted data.
  • Roll back the transaction.

Using a transaction has a couple of distinct advantages. Since you are running in the scope of an uncommitted transaction, your fellow developers running unit tests will not see your added data (isolation). Also, rolling back the transaction places the database back to the original state in which you found it.

Managing transactions by explicitly attaching them to the connection object doesn’t always work well when testing a data access layer. Since the DAL often contains code to retrieve its own connection, the following sequence often occurs:

  • Begin a transaction in your unit test.
  • Write the data to the database that your data access layer will need.
  • Call the Data Access Layer. The Data Access layer creates its own connection.
  • The DAL attempts to read the new data from the database. It is blocked, though, because it is in a different transaction than the unit test transaction, and will not be able to complete until the DAL commits.

The TransactionScope object helps alleviate this problem. It sits on top of the Distributed Transaction Coordinator, and will assign any code running within its context to the same transaction. In other words, a TransactionScope context within your unit tests will force your data access layer code to run within the same context. Isolation is maintained from other developers, but your DAL can access and manipulate the data as needed. (This does require that you have the Distributed Transaction Coordinator Service running on the box that handles the transaction.)

To demonstrate, let’s assume that I have a DAL method that I want to test that returns all users from a database. This method gets its own connection, retrieves the users, and returns them as a DataSet.

public DataSet GetUsers()
{
DataSet dataSet = new DataSet();
string connectionString = GetConnectionString();

using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string sql = "SELECT * FROM [User]";
SqlCommand command = new SqlCommand(sql, connection);
SqlDataAdapter adapter = new SqlDataAdapter(command);
adapter.Fill(dataSet);
}

return dataSet;
}

Here is the unit test to test this code. It doesn’t test nearly all of the functionality you would want to check in a real unit test, but it does demonstrate the TransactionScope. Note that the TransactionScope object doesn’t have an explicit RollBack() method. The Rollback occurs if the TransactionScope object is disposed without Complete() being called on it. This occurs at the end of the using block.

[TestMethod()]
public void GetUsersTest()
{
string connectionString = GetConnectionString();

using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
connection.Open();
DataLayer dataAccessLayer = new DataLayer();

DataSet dataSet = dataAccessLayer.GetUsers();
AddNewUser("Fred", connection);

dataSet = dataAccessLayer.GetUsers();
DataRow[] dr = dataSet.Tables[0].Select("[UserName] = 'Fred'");
Assert.AreEqual(1, dr.Length);
}
}
}

Hope this is helpful. Good luck and code safe!

MW


[ 출처 : http://dotnetthoughts.wordpress.com/2007/11/10/transactionscope-and-unit-tests/ ]


-----------------------------------------------------


ASP.NET에서 단위 테스트를 진행하던중..

DataSet으로 얻어진 값을 비교하는 방법이 있을지 고민해봤다..

과연.. Assert 클래스로 DataSet의 값을 비교할 수 있을까?

간단하게 테스트해보았지만 역시나 안되었고..

MSDN을 참고해보니 역시 그런건 없어.. Assert 클래스는... 정말 간단한... 젠장..

여기저기 검색을 해보니까 얻어진 DataSet의 길이를 비교하는게 있더군..

역시 얻어진 값을 비교할 수는 없는건가보다..

간접적으로 그 크기(길이)가 같으니 같은 값을 가질것이라고 여기는 방법뿐인가?

물론 값의 일부가 같은지 비교도 가능하지만..

노가다로 전체 값을 다 비교해보던지..후후;

암튼... asp.net에서의 단위테스트의 한계를 점차 느끼고 있다..;;; ㄷㄷ;;


혹시 이 부분에 대해서 조언을 주실분이 계신가요??

Posted by 열라착한앙마

댓글을 달아 주세요

2008. 12. 15. 13:21

참~ 문제도 많고 탈도 많은 IE6...
크로스 브라우징을 완전히 만족시킬라니까 IE6 이넘이 참~ 많은 문제를 일으킨다..

이번에는 세션, 쿠키값이 사라지는 원인과 해결책을 찾기위해 여러가지 검색을 해보았다..

* ASP에서 세션변수가 사라진다 
 -> 해결방안 : Why won't my session variables stick?

* Internet Explorer 6에서 FRAMESET을 사용하면 세션 변수가 손실된다

* IE6.0 P3P에 따른 로그인 , 쿠키, 세션 문제
* 세션이 생성되자마자 죽을 경우라면...

* IE6의 보안설정에 의한 쿠키 제한에 따른 웹서버 헤더추가

* IE6에서의 개인정보보호(P3P) 구현과 쿠키 관련 문제점

* P3P 관련 URL (여긴 연결안되는 링크도 좀 있구나;;)

* P3P 설정 예(IIS에서 설정하는 법)


소스단에서 추가?
[ASP]
<% Response.AddHeader "Set-Cookie" , "test=id=server&pwd=1234" %>

[PHP]
header(
'P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"'
);

[ASP.NET]
Response.AppendHeader 사용

[JAVA]
response.setHeader(
"P3P",
"CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"");

Posted by 열라착한앙마

댓글을 달아 주세요

2008. 12. 3. 14:13


현재 진행중인 프로젝트에서 공통 컨트롤을 개발하던 도중..
특정영역을 인쇄하는 기능을 구현하고 있었다..




이미 개발해본 기능이라 어렵지 않게 개발을 진행하고 있었는데...
이게 뭐야..

무슨 뽑기하듯이 인쇄 페이지에 글씨나 이미지 같은 객체가 표시가 되서 인쇄될 때도 있고,
표시가 안되서 빈페이지가 인쇄될때도 있는것이 아닌가...
(IE, FF에서 모두 이런 현상이 발생하였다..)

이때, 구현한 방식은..
인쇄할 팝업 파일(print.htm)을 생성하고 특정영역을 div로 감싸서 해당 innerHTML을
팝업의 div의 innerHTML로 설정하는 매우 보편적으로 사용하는 방법이었다..




그래서 다른방법으로 구현해보기로 했다..
window.onbeforeprint, window.onafterprint를 이용해서 구현해보았지만 역시 마찮가지였다..




아놔.. 어쩌라고...
그래서 최종적으로 작업한 것은..


팝업파일을 생성하지 말고..
팝업 페이지를 생성해서 내용을 작성해서 인쇄후 페이지를 닫는 방법으로 구현하는 것이다.
뭔소리인지 모르겠지...?? 백문이 불여일견!!



이 방법으로 인쇄도 잘 되고(IE, FF 모두)
UC에서 div 이름을 입력받아서 해당 부분을 출력할 수 있는 기능도 구현할 수 있게되었다.

그래서 난... 지금 완전 신나 ㅎㅎㅎ

아아.. 참고로 사용은
해당 UC를 웹페이지에 추가하고
웹 페이지에서 div로 인쇄할 영역을 설정하면 되겠다..
<div id="printArea"> 인쇄할 부분 </div>

또 UC의 속성중 PrintDivName값을 위 div의 id값으로 설정해주면 되겠지 ㅋㅋ

Posted by 열라착한앙마

댓글을 달아 주세요

2008. 10. 1. 16:52

AJAX 좀 사용할라했더니만.. 이런;;
우리팀의 새로운 프로젝트인 "e-고객 통합접점 솔루션 페이지"의 소스를 가져왔는데 오류가 났다..(dll파일들은 소스관리가 안되고 있었군..)
찾아보니깐 이런 오류가 참.. 자주 나더군..
해결방안도 여러가지가 나오긴 했는데...

일단, Ajax Extension ver 1.0 설치를 해야했다..
http://ajax.asp.net/files/Migration_Guide_Beta2_to_RC.aspx

설치파일은 여기서 받으면 되고..
http://ajax.asp.net/downloads/default.aspx?tabid=47 

dll파일 Bin 폴더에 넣어주고 참조 추가해주고..
빌드해줬더니 짜식.. 잘 도는군;;

Posted by 열라착한앙마

댓글을 달아 주세요

2008. 9. 3. 11:37

[JavaScript] 는 replace 함수 사용 시 한번 만 치환된다.
ex)
var a = "2008-08-28";
var b = a.replace("-","");
alert(b);

결과 값 : 200808-28

아래와 같이 split 함수와 join 함수를 쓰면 이러한 문제가 해결 된다.
ex)
var a = "2008-08-28";
var b = a.split("-").join("");
alert(b);

결과 값 : 20080828

[출처] [JavaScript] replace함수 한번만 치환되는 문제 해결 방안|작성자 유니혀니


---------------------------------------------------------------------------

함수로 만들어 쓰는게 낫겠지?
그렇다고 이렇게 할 건 없어...

function replaceAll(str, searchStr, replaceStr) {

    while (str.indexOf(searchStr) != -1) {
        str = str.replace(searchStr, replaceStr);
    }

    return str;

}


위에서 퍼온 글처럼 split과 join을 이용해서 구현하면 쉽자나~

function replaceAll(str,orgStr,repStr)
{
    return str.split(orgStr).join(repStr);
}
Posted by 열라착한앙마

댓글을 달아 주세요

  1. 2008.09.24 09:24  댓글주소  수정/삭제  댓글쓰기

    정규식을 쓰는거도 좋음

    • BlogIcon 열라착한앙마 2008.09.24 09:49 신고  댓글주소  수정/삭제

      그래 좋은 생각이야~ 정규식도~ ㅋㅋ
      지금와서 드는 생각인데~
      ASP, ASP.NET 개발도 꽤했는데...
      뭔가 공부가 부족했던 것 같다는 생각이 많이 든다..
      너무 했던방식으로만 코딩하고.. ㅎㅎ
      좀 더 많은 방법으로 경험을 해봤으면 좋았을텐데..ㅋ

  2. BlogIcon vbmania 2008.10.15 22:09 신고  댓글주소  수정/삭제  댓글쓰기

    참고로 정규표현식은
    var a = "2008-08-28";
    var b = a.replace(/-/g,"";);
    이렇게 하면 됩니다...

  3. BlogIcon 엽123 2013.07.09 12:02  댓글주소  수정/삭제  댓글쓰기

    오오 감사합니다 ㅎㅎ