MY-SQL 설치는 간단하게
$sudo apt-get install mysql-server
으로 설치 하였습니다.
먼저 외부에서 접속이 가능하도록 설정파일을 수정
$sudo vim /etc/mysql/my.cnf
으로 파일을 연뒤
bind-address = 127.0.0.1 <– 이부분을 #으로 주석처리 해줍니다. bind-address는 접속가능한 주소를 설정해주는 부분인데, 특정한 곳에서만 접속하고 싶다면 이 부분에 특정한 곳의 IP 주소를 입력해주면 됩니다.
그 다음으로 해야 할 일이 mysql에서 접속가능하도록 아이디를 설정해주는 부분입니다. 이 부분을 해주지 않으면
access denied for user ‘root’@~~~~~~ 라는 에러가 뜹니다.
$mysql -u root -p
입력하면
Enter password:
가 뜨는데 mysql을 설치할때 설정한 루트 비밀번호를 입력하시면 됩니다
그럼 mysql가 실행되었으면 mysql>으로 프롬프트가 바뀌게 됩니다.
mysql> use mysql;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '루트비밀번호' WITH GRANT OPTION;
이렇게 하면 root가 mysql에 접속할 권한을 가지게 됩니다.
다른 아이디에게 접속 권하을 주려면 root자리에 해당 아이디를, 루트비밀번호에 해당 아이디의 비밀번호를 넣으시면 됩니다.
QT 응용프로그램에서 OpenGl를 사용하기 위해서는 QtOpenGL과 OpenGL 라이브러리에 링크를 해야 합니다. 라이브러리와 링크하기 위해서는 프로젝트 파일에 QT+= opengl 를 추가해주어야 합니다.
QGLWidget을 이용하면 표준 OpenGl 함수를 그대로 이용할 수 있습니다.
protected에 선언된 paintGL()는 위젯이 그려질때마다 호출되는 paint()이벤트를 재정의 한것이고, mousePressEvent(), mouseMoveEvent()는 각각 마우스를 눌렀을때와 움직였을때를 재정의한 것입니다.
private에 선언된 함수와 변수들은 실제로 OpelGl를 그리기 위한 함수와 변수들입니다.
자세한 코드는 첨부파일을 받으셔서 보시기 바랍니다.
QT에서는 위젯을 디자인하는 것이 프로그래밍과 분리가 되어있습니다.
QT 디자이너로 비주얼 스튜디오에서 C# 폼을 디자인하듯이 위젯에 여러 컨트롤들을 손쉽게 추가할 수 있습니다.
하지만 이렇게 디자인된 위젯을 바로 적용 할 수는 없습니다. 물론 QT Creator를 이용하면 디자이너에와 연동을 하여 바로 적용이 되게 할 수는 있지만 내부적으로는 다이렉트로 연결 된 것은 아닙니다.
QT 디자이너는 디자인된 위젯을 클래스 형태의 코드로 바꿔주는것 뿐이고 이를 QT 프로그램에서 상속을 받거나 객체를 생성하여 사용하게 됩니다.
먼저 QT 디자이너를 실행 합니다.
처음 실행하면 뜨는 창으로 생성할 위젯 형식을 지정해줍니다.
전체적인 QT 디자이너 창입니다. 기존의 IDE들과 거의 비슷합니다.
왼쪽에 컨트롤들이 있어 이를 가운데 있는 위젯에 드래그 하면 추가됩니다.
오른쪽에 있는 속성창들을 이용하여 좀 더 세부적인 디자인을 할 수 있습니다.
간단하게 PushButton버튼 하나를 추가하여 저장해보겠습니다. 저장을 하면 확장자가 .ui인 파일이 생성이 됩니다. 이 파일은 위젯을 xml로 표현한 파일인데 qmake 실행시 자동으로 QT의 유저 인터페이스 컴파일러인 uic를 통해 ui_파일이름.h 파일로 변환되게 됩니다.
즉, untitled.ui로 저장을 하면 ui_untitled.h 파일로 변환되어 저장이 되는 것입니다.
이렇게 생성된 클래스를 적용하는 방법에는 2가지 방법이 있는데, 하나는 클래스를 상송 받는 것이고, 나머지 하나는 setupui()를 정의하여 이 함수를 호출하여 세팅하는 것입니다.
main.cpp와 untitled.ui 파일을 같은 파일에 넣은 뒤
$qmake -proect
$qmake
를 수행하면 ui_untitled.h 파일과 MakeFile이 생성됩니다.
ui_untitled.h 파일 안에 보시면 setupUi()가 정의되어 있고 이 함수에서 디자이너에서 디자인했던 컨트롤들이 생성되는 코드들이 자동으로 생성되어 들어가 있는 것을 볼 수 있습니다.
그리고 소스 밑에 보시면 namespace UI 로 지정되어 있는데 이를 이용하여 main.cpp에서 접근 하시면 됩니다.
우분투 배포판을 설치할때 개발자 툴도 함께 설치 하였으면 설치 되어있겟지만 설치가 되어 있지 않다면 설치해줍니다.
#sudo apt-get install qt4-dev-tools
qt4-dev-tools에는 qt4를 개발하기 위한 몇가지 툴들이 포함되어 있습니다.
물론 위의 툴들을 사용하지 않고 문서 편집기를 이용하여 코딩하여 컴파일 하는 것도 가능 합니다만, 이러한 툴들을 사용하여 프로그래밍 하는 것이 당연히 더 편리하겠지요
QT는 C++로 코딩을 하고 qmake를 가지고 프로젝트 파일이라는 프로그램 환경 파일만든 후 make를 이용하여 프로그래밍하게 됩니다.
대부분의 프로그래밍 언어를 공부할 때 가장 처음 보게 되는 Hello Word 프로그램입니다.
#include <QApplication>
#include <QLabel>
//QT의 모든 클래스는 자신의 이름과 똑같은 이름으로 된 헤더 파일에 정의되어 있습니다.
QApplication app(arc, argv);
//QT 응용 프로그램에서의 자원 관리를 위해 QApplication 객체를 생성합니다. 매개변수로 main에서 받은 값들을 넘겨줍니다.
QLabel *label = new QLabel("Hello World!");
label.show();
//위젯에 Hello Word를 출력하기 위한 라벨을 생성하고 보여줍니다.
return app.exec();
//마지막으로 응용프로그램의 제어를 QT에게 넘겨주고 있습니다. 이렇게 함으로써 프로그램은 마우스 클릭과 같은 이벤트를 대기하는 이벤트 루프에 진입하게 됩니다.
$qmake -project
qmake로 프로젝트파일을 생성합니다.
다시한번 qmake를 하면 이 프로젝트 파일을 이용하여 Makefile이 생성되고 이 Makefile을 이용하여 컴파일이 됩니다.
QMAKESPEC를 환경변수에 등록시켜주어야 합니다.
만약 제대로 등록되어 있지 않으면 qmake 수행시 Failure to read QMAKESPEC conf file 오류가 발생하게됩니다
$export QMAKESPEC=/QT설치 경로/mkspecs/qws/리눅스 버전-g++/
$qmake
$make
$./hello
간단한 팁이지만 잊어버릴까봐 남겨두고자 합니다.
C#에서 문자는 유니코드로 표현됩니다. 유니코드는 영어 뿐만 아니라 다른 언어들도 표현하기 위한 코드로 세계 대부분의 언어를 표현할수 있습니다. 정확한 알고 있는 것은 아니지만 아시아의 4개 국가(일본, 중국, 한국, 베트남)이 같은 카테고리로 묶여 있는 것으로 알고 있습니다. 어찌되었든 System.Globalization.UnicodeCategory에 보시면 여러가지 카테고리들이 있습니다. 한글은 OtherLetter에 포함되어 있구요. 밑에 코드 처럼 판별하고자 하는 문자와 같은 카테고리의 속한 경우를 체크하면 한글인지, 영어인지, 숫자인지 등을 판단할 수 있을것입니다.
static void Main(string[] args)
{
string s = "가나다";
char[] charArr = s.ToCharArray();
foreach(char c in charArr)
{
if(char.GetUnicodeCategory(c) == System.Globalization.UnicodeCategory.OtherLetter)
{
Console.WriteLine("한글입니다");
}
}
Console.Read();
}
위 코드로는 영어/숫자/그외 언어(한글,한자,일어 등) 정도로 구분할 수 있습니다. 좀 더 정확한 판단을 위해서는 해당 문자열의 유니코드 코드를 구해 비교해야 합니다. (참고 URL : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1294&rssMode=1&wtype=0)
.NET 프레임워크에서는 프린터로 출력하기위한 여러가지 출력 기능을 제공해줍니다.
바로 PrintPreviewDialog 클래스와 PrintDocument 클래스입니다.
PrintPreviewDialog 클래스는 미리보기를 생성해주는 클래스고 PrintDocument 클래스는 출력하기 위한 데이터를 지정해주는 클래스입니다.
즉 PrintPrewviewDialog 클래스로 미리보기 창을 생성해주고 PrintDocument 클래스로 데이터를 넘겨준다음 PrintPreviewDialog 클래스와 연결시켜주면 됩니다.
여러 페이지를 출력하고자 할때는 e.HasMorePages을 true로 주시면 됩니다. e.HasMorePages는 출력하고자 하는 페이지가 더 있는지를 체크해주는 값으로 false이면 뒤에 더이상 데이터가 없다는 것을 나타냅니다.
여기서 한가지 주의해야 할 점은 출력해야 할 페이지가 여러페이지일 경우 document 객체에 BeginPrint 이벤트를 재정의 해주어야 한다는 것입니다. 왜냐하면 미리보기에서 프린트 버튼을 클릭해서 출력하려고 할때 BeginPrint 이벤트가 호출되면서 다시 한번 document를 전부 호출해서 출력하기 때문입니다. 만약에 BeginPrint를 재정의 하지 않으면 미리보기 창을 띄울 때 curpageNumber이 감소되어 0이 되어 있기 떄문에 마지막 페이지만 출력이 될 수 도 있습니다.
public partial class Form1 : Form
{
internal PrintPreviewDialog PrintPreviewDialog1;
private System.Drawing.Printing.PrintDocument document = new System.Drawing.Printing.PrintDocument();
private int curPageNumber;
private int curPageNumber_bak;
public Form1()
{
InitializeComponent();
this.PrintPreviewDialog1 = new PrintPreviewDialog();
curPageNumber = 1;
//Set the size, location, and name.
this.PrintPreviewDialog1.ClientSize =
new System.Drawing.Size(400, 300);
this.PrintPreviewDialog1.Location =
new System.Drawing.Point(29, 29);
this.PrintPreviewDialog1.Name = "PrintPreviewDialog1";
// Associate the event-handling method with the
// document's PrintPage event.
this.document.PrintPage +=
new System.Drawing.Printing.PrintPageEventHandler
(document_PrintPage);
this.document.BeginPrint += new System.Drawing.Printing.PrintEventHandler(document_BeginPrint);
// Set the minimum size the dialog can be resized to.
this.PrintPreviewDialog1.MinimumSize =
new System.Drawing.Size(700, 700);
// Set the UseAntiAlias property to true, which will allow the
// operating system to smooth fonts.
this.PrintPreviewDialog1.UseAntiAlias = true;
curPageNumber = 2;
curPageNumber_bak = 2;
}
void document_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
curPageNumber = curPageNumber_bak;
//throw new NotImplementedException();
}
private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
System.Drawing.Font printFont = new System.Drawing.Font("휴먼모음T", 25, System.Drawing.FontStyle.Regular);
e.Graphics.DrawString("- " + (curPageNumber) + " -", printFont, System.Drawing.Brushes.Black, 400, 400);
if (curPageNumber == 0)
{
e.HasMorePages = false;
}
else
{
e.HasMorePages = true;
curPageNumber--;
}
}
private void button1_Click(object sender, EventArgs e)
{
PrintPreviewDialog1.Document = document;
// Call the ShowDialog method. This will trigger the document's
// PrintPage event.
PrintPreviewDialog1.ShowDialog();
}
}