2009/10/26
블로그의 소스 문법강조 스크립트 SyntaxHighlighter 2.1.364 Released!!
SyntaxHighlighter 는 웹페이지의 프로그램 소스를 아주 보기 좋게 문법강조해 주는 스크립트로 현재 블로그에도 사용하는 스크립트 인데 오랜만에 가 업데이트 되었다.
이번 버전에서는 ColdFusion brush가 추가 되었고 많은 버그가 수정되었다.
자세한 변경 사항은 프로젝트 사이트를 참고하면 된다.
SyntaxHighlighter
SyntaxHighlighter:Changes:2.1.364
SyntaxHighlighter:Hosting
Original Post : http://neodreamer-dev.tistory.com/338
이번 버전에서는 ColdFusion brush가 추가 되었고 많은 버그가 수정되었다.
자세한 변경 사항은 프로젝트 사이트를 참고하면 된다.
SyntaxHighlighter
SyntaxHighlighter:Changes:2.1.364
SyntaxHighlighter:Hosting
Original Post : http://neodreamer-dev.tistory.com/338
Labels:
syntaxhighlighter
,
SyntaxHighlighter 2.0
,
TistoryOldPost
,
소스 문법 강조
Redmine 한글 PDF 출력 문제
얼마전 부터 Redmine 을 활용하여 프로젝트 관리를 해오고 있는데 Redmine 에서 지원하는 Gantt Chart 와 업무리스트를 PDF 로 출력을 시도해 보았는데 한글이 모두 이상한 문자로 출력이 되었다. 수정할 수 있는지 해서 인터넷에 검색을 해 보았는데 해당 문건이 많지 않았다.
검색된 자료 중 "Redmine pdf export 시 한글 깨지는 문제" 문서를 참조하여 해결을 하였다.
해결 방법은 PDF 출력 루틴과 한국어 출력 부분인데 "Redmine pdf export 시 한글 깨지는 문제" 문서에서 제시한 해결책이 그대로 적용되었다. 단, 버전의 차이에서 인지 수정해야할 파일들의 위치가 달랐다. 검색된 문서에서 제시된 redmine 버전은 0.8이고 현재 설치된 버전은 그 보다 상위 버전인 0.8.5 이다.
우선 PDF 출력 파일을 수정하였다.
파일의 위치는 lib\redmine\export\pdf.rb 이다. 이 파일의 내용중 "zh-tw" 의 내용을 복사하여 한글에 맞도록 수정한다.
다음 수정 사항은 폰트에 대한 것인데, 기본 적으로 명조체 출력을 지원하고 있는데 이 부분을 고딕체로 수정하는 내용이다. 명조체로 출력을 원하면 수정하지 않으면 된다.
수정해야할 파일은 vendor\plugins\rfpdf\lib\rfpdf\korean.rb
그리고 MultiCell 함수와 MBMultiCell 함수를 chinese.rb에서 복사해 온다.
아래 내용을 복사해 온 내용이다.
이제 redmine 을 재시작하고 Gantt Chart 나 작업 목록에서 PDF로 출력을 해보면 한글이 깨끗하게 나오는 걸 확인할 수 있다
Original Post : http://neodreamer-dev.tistory.com/337
검색된 자료 중 "Redmine pdf export 시 한글 깨지는 문제" 문서를 참조하여 해결을 하였다.
해결 방법은 PDF 출력 루틴과 한국어 출력 부분인데 "Redmine pdf export 시 한글 깨지는 문제" 문서에서 제시한 해결책이 그대로 적용되었다. 단, 버전의 차이에서 인지 수정해야할 파일들의 위치가 달랐다. 검색된 문서에서 제시된 redmine 버전은 0.8이고 현재 설치된 버전은 그 보다 상위 버전인 0.8.5 이다.
우선 PDF 출력 파일을 수정하였다.
파일의 위치는 lib\redmine\export\pdf.rb 이다. 이 파일의 내용중 "zh-tw" 의 내용을 복사하여 한글에 맞도록 수정한다.
when 'zh-tw'
extend(PDF_Chinese)
AddBig5Font()
@font_for_content = 'Big5'
@font_for_footer = 'Big5'
# 한글 출력을 위해 추가된 부분
when 'ko'
extend(PDF_Korean)
AddUHCFont()
@font_for_content = 'UHC'
@font_for_footer = 'UHC'
다음 수정 사항은 폰트에 대한 것인데, 기본 적으로 명조체 출력을 지원하고 있는데 이 부분을 고딕체로 수정하는 내용이다. 명조체로 출력을 원하면 수정하지 않으면 된다.
수정해야할 파일은 vendor\plugins\rfpdf\lib\rfpdf\korean.rb
# HYSMyeongJoStd-Medium-Acro 를 HYGoThic-Medium로 바꾼다.
def AddUHCFont(family='UHC',name='HYGoThic-Medium')
#Add UHC font with proportional Latin
cw=UHC_widths
cMap='KSCms-UHC-H'
registry={'ordering'=>'Korea1','supplement'=>1}
AddCIDFonts(family,name,cw,cMap,registry)
end
def AddUHChwFont(family='UHC-hw',name='HYGoThic-Medium')
#Add UHC font with half-witdh Latin
32.upto(126) do |i|
cw[i.chr]=500
end
cMap='KSCms-UHC-HW-H'
registry={'ordering'=>'Korea1','supplement'=>1}
AddCIDFonts(family,name,cw,cMap,registry)
end
그리고 MultiCell 함수와 MBMultiCell 함수를 chinese.rb에서 복사해 온다.
아래 내용을 복사해 온 내용이다.
def MultiCell(w,h,txt,border=0,align='L',fill=0)
if(@CurrentFont['type']=='Type0')
MBMultiCell(w,h,txt,border,align,fill)
else
super(w,h,txt,border,align,fill)
end
end
def MBMultiCell(w,h,txt,border=0,align='L',fill=0)
#Multi-byte version of MultiCell()
cw=@CurrentFont['cw']
if(w==0)
w=@w-@rMargin-@x
end
wmax=(w-2*@cMargin)*1000/@FontSize
s=txt.gsub("\r",'')
nb=s.length
if(nb>0 and s[nb-1]=="\n")
nb-=1
end
b=0
if(border)
if(border==1)
border='LTRB'
b='LRT'
b2='LR'
else
b2=''
if(border.to_s.index('L'))
b2+='L'
end
if(border.to_s.index('R'))
b2+='R'
end
b=border.to_s.index('T') ? b2+'T' : b2
end
end
sep=-1
i=0
j=0
l=0
nl=1
while(i<nb)
#Get next character
c=s[i]
#Check if ASCII or MB
ascii=(c<128)
if(c.chr=="\n")
#Explicit line break
Cell(w,h,s[j,i-j],b,2,align,fill)
i+=1
sep=-1
j=i
l=0
nl+=1
if(border and nl==2)
b=b2
end
next
end
if(!ascii)
sep=i
ls=l
elsif(c==' ')
sep=i
ls=l
end
l+=ascii ? (cw[c.chr] || 0) : 1100
if(l>wmax)
#Automatic line break
if(sep==-1 or i==j)
if(i==j)
i+=ascii ? 1 : 3
end
Cell(w,h,s[j,i-j],b,2,align,fill)
else
Cell(w,h,s[j,sep-j],b,2,align,fill)
i=(s[sep]==' ') ? sep+1 : sep
end
sep=-1
j=i
l=0
# nl+=1
if(border and nl==2)
b=b2
end
else
i+=ascii ? 1 : 3
end
end
#Last chunk
if(border and not border.to_s.index('B').nil?)
b+='B'
end
Cell(w,h,s[j,i-j],b,2,align,fill)
@x=@lMargin
end
이제 redmine 을 재시작하고 Gantt Chart 나 작업 목록에서 PDF로 출력을 해보면 한글이 깨끗하게 나오는 걸 확인할 수 있다
Original Post : http://neodreamer-dev.tistory.com/337
Labels:
PDF
,
PDF Export
,
PDF 한글
,
Redmine
,
TistoryOldPost
,
한글
2009/10/24
SQLite 3.6.19 Libraries ( Dynamic & Static )
Visual C++ 과 C++ Builder 용 동적라이브러리와 정적라이브러리
Visual C++ 은 32비트용과 64비트용이 포함되어 있음.
Original Post : http://neodreamer-dev.tistory.com/336
Visual C++ 은 32비트용과 64비트용이 포함되어 있음.
Original Post : http://neodreamer-dev.tistory.com/336
Labels:
SQLite
,
SQLite for C++ Builder
,
SQLite for Visual C++
,
SQLite library
,
SQLite Library for C++ Builder
,
SQLite Library for Visual C++
,
SQLite Static Library
,
TistoryOldPost
2009/10/15
SQLite 3.6.19 Released
이번 버전에서 수정된 사항
SQLite homepage
SQLite download
Original Post : http://neodreamer-dev.tistory.com/335
- Added support for foreign key constraints. Foreign key constraints are disabled by default. Use the foreign_keys pragma to turn them on.
- Generalized the IS and IS NOT operators to take arbitrary expressions on their right-hand side.
- The TCL Interface has been enhanced to use the Non-Recursive Engine (NRE) interface to the TCL interpreter when linked against TCL 8.6 or later.
- Fix a bug introduced in 3.6.18 that can lead to a segfault when an attempt is made to write on a read-only database.
SQLite homepage
SQLite download
Original Post : http://neodreamer-dev.tistory.com/335
Labels:
Local Database
,
SQLite
,
TistoryOldPost
,
로컬 데이터베이스
2009/10/10
CTreeCtrl의 각 노드에 사용자 정의 데이터 할당하기
MFC의 CTreeCtrl 의 함수 중 잘 사용하지 않지만 아주 유용한 멤버함수가 있다.
SetItemData(), GetItemData() 가 바로 그것 인데 이들 함수는 트리의 각 노드에 특정 데이트를 할당하거나 조회할 때 사용하는 함수이다.
데이터 형은 DWORD 형으로 32비트 포인터를 담을 수 있다. Visual Studio 2008 에서는 DWORD_PTR 로 변경되어 64비트 포인터를 담을 수 있다. 어떤 버전부터 DWORD_PTR 로 바뀌었는지는 모르겠지만 64비트 프로그래밍을 지원하는 버전에서는 DWORD_PTR 일 것으로 생각된다.
이 함수를 이용하면 트리의 각 노드에 포인터를 담고 있을 수 있어 어떠한 자료든지 쉽게 할당 할 수 있다.
아래 소스는 트리의 각 노드에 데이터를 할당하고 조회하여 사용하는 간단한 예이다.
이는 노드에 포인터를 할당하는 것으로 메모리 관리에 신경을 써야 한다. 그렇지 않을 경우에는 아래와 비슷한 메모리 누수 메세지를 보게 된다.
Original Post : http://neodreamer-dev.tistory.com/334
SetItemData(), GetItemData() 가 바로 그것 인데 이들 함수는 트리의 각 노드에 특정 데이트를 할당하거나 조회할 때 사용하는 함수이다.
데이터 형은 DWORD 형으로 32비트 포인터를 담을 수 있다. Visual Studio 2008 에서는 DWORD_PTR 로 변경되어 64비트 포인터를 담을 수 있다. 어떤 버전부터 DWORD_PTR 로 바뀌었는지는 모르겠지만 64비트 프로그래밍을 지원하는 버전에서는 DWORD_PTR 일 것으로 생각된다.
이 함수를 이용하면 트리의 각 노드에 포인터를 담고 있을 수 있어 어떠한 자료든지 쉽게 할당 할 수 있다.
아래 소스는 트리의 각 노드에 데이터를 할당하고 조회하여 사용하는 간단한 예이다.
// 트리 노드에 할당할 데이터 구조체
struct MyItem
{
int a;
float b;
double c;
};
// 트리에 노드를 추가하고 데이터 포인터 할당하기
HTREEITEM hRoot = m_tree.GetRootItem();
for ( int i = 0; i < 3; ++i )
{
CString strID;
strID.Format( "%d", i );
HTREEITEM hItem = m_tree.InsertItem( strID, hRoot );
// 노드에 할당할 데이터 객체 생성
MyItem* pMyItem = new MyItem;
pMyItem->a = i * 2;
pMyItem->b = (float)(i * 2.0f);
pMyItem->c = (double)(i * 2.0);
// 데이터 포인터 할당
m_tree.SetItemData( hItem, (DWORD)pMyItem );
CString strData;
strData.Format( "%p", hItem );
int nColumn = 1;
m_tree.SetItemText( hItem, nColumn++, strData );
}
// 각각의 노드와 노드에 할당되어 있는 데이터 조회하기
HTREEITEM hItem = m_tree.GetRootItem();
while ( hItem )
{
CString strData;
strData = m_tree.GetItemText( hItem, 0 );
// 노드에 할당되어 있는 데이터 포인터 가져오기
MyItem* pMyItem = (MyItem*)m_tree.GetItemData( hItem );
if ( pMyItem )
{
TRACE( "%s => %p (%d, %f, %f) \n"
, strData, hItem
, pMyItem->a, pMyItem->b, pMyItem->c
);
}
else
{
TRACE( "%s => %p \n", strData, hItem );
}
hItem = m_tree.GetNextSiblingItem( hItem );
}
// 조회 결과
0 => 00601CB8 (0, 0.000000, 0.000000)
1 => 00601D18 (2, 2.000000, 2.000000)
2 => 00601D78 (4, 4.000000, 4.000000)
이는 노드에 포인터를 할당하는 것으로 메모리 관리에 신경을 써야 한다. 그렇지 않을 경우에는 아래와 비슷한 메모리 누수 메세지를 보게 된다.
// 객체 삭제를 하지 않을 경우 보게되는 메모리 누수 메세지
Detected memory leaks!
Dumping objects ->
d:\xxx.cpp(134) : {559} normal block at 0x005BA618, 16 bytes long.
Data: < @ @> 04 00 00 00 00 00 80 40 00 00 00 00 00 00 10 40
d:\xxx.cpp(134) : {545} normal block at 0x005BA4F0, 16 bytes long.
Data: < @ @> 02 00 00 00 00 00 00 40 00 00 00 00 00 00 00 40
d:\xxx.cpp(134) : {531} normal block at 0x005BA450, 16 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
<Original Post : http://neodreamer-dev.tistory.com/334
Labels:
C++
,
CTreeCtrl
,
GetItemData
,
MFC
,
SetItemData
,
TistoryOldPost
CTreeCtrl 에 추가된 Item의 핸들(HTREEITEM)은 변하지 않는군...
특정 데이터를 Tree 컨트롤을 이용해 표현해 주고 트리 컨트롤의 조작으로 데이터를 조작해야 하는데 Tree 의 각 노드의 핸들이 고유한 값을 갖고 있는지 테스트 해 보았다.
간단한 트리를 만들고 각각의 노드의 핸들을 출력해 보고 트리를 정렬한 후 핸들을 출력해 보았다.
<
Original Post : http://neodreamer-dev.tistory.com/333
간단한 트리를 만들고 각각의 노드의 핸들을 출력해 보고 트리를 정렬한 후 핸들을 출력해 보았다.
초기
0 => 00611CB8
0-0 => 00611D18
0-1 => 00611D78
0-2 => 00611DD8
1 => 00611E38
1-0 => 00611E98
1-1 => 00611EF8
1-2 => 00611F58
2 => 00611FB8
2-0 => 00612018
2-1 => 00612078
2-2 => 006120D8
3 => 00612138
3-0 => 00612198
3-1 => 006121F8
3-2 => 00612258
4 => 006122B8
4-0 => 00612318
4-1 => 00612378
4-2 => 006123D8
정렬 후
4 => 006122B8
4-2 => 006123D8
4-1 => 00612378
4-0 => 00612318
3 => 00612138
3-2 => 00612258
3-1 => 006121F8
3-0 => 00612198
2 => 00611FB8
2-2 => 006120D8
2-1 => 00612078
2-0 => 00612018
1 => 00611E38
1-2 => 00611F58
1-1 => 00611EF8
1-0 => 00611E98
0 => 00611CB8
0-2 => 00611DD8
0-1 => 00611D78
0-0 => 00611D18
<
Original Post : http://neodreamer-dev.tistory.com/333
2009/10/07
vector 복사하기
// copy 알고리즘을 이용한 복사
vDst.resize( (int)(vSrc.size()) );
std::copy( vSrc.begin(), vSrc.end(), vDst.begin() );
std::copy( vSrc.begin() + 2, vSrc.begin() + 5, vDst.begin() );
// assign 을 이용한 복사
vDst.clear();
vDst.assign( vSrc.begin(), vSrc.end() ); // 전체 복사
vDst.assign( vSrc.begin() + 1, vSrc.begin() + 4 );
Original Post : http://neodreamer-dev.tistory.com/331
Subscribe to:
Posts
(
Atom
)