2005년 5월 작성 레포트용

탭화면을 구현하기 StripTabs 도구를 이용것이며 StripTabs 의 탭 속성이 배열로 되어 있어 새탭을 추가할 때 배열을 하나 늘이는 방법을 이용합니다.
인터넷브라우저도 새탭이 추가 될 때 Load 명령으로 배열을 주어 추가 시킬수 있지만 로딩속도를 고려해서 처음에 10개를 로딩하여 사용 합니다.
그리고 활성화 된 탭의 번호에 해당하는 인터넷브라우저를 Enabled 시켜 탭기능을 구현 합니다.
팝업창 제어는 인터넷브라우저에 새창이 나타날 때 NewWindow2 이벤트가 발생되는데 이때 Fasle 로 리턴시키면 팝업창을 제어 합니다.
바로가기기능은 주소입력창에 입력된 값을 비교하여 환경설정에 등록된 단어로 치환하여 주소로 이동시키는 방법을 사용합니다.
소스보기는 자바스크립트로 소스를 볼 수 없게 만든 사이트에서 소스보기를 눌렀을때 소스를 바로 볼수 있게 만듭니다. 이때 보여주는 내용은 이전에 만들었던 메모장을 이용하는데 메모장의 Textbox 도구가 사용되어 64Kb 이상의 용량은 출력되지 않습니다.
----- 비베플로러.frm : 메인화면 소스 -----
Private Sub AddTabs()
' 인터넷브라우저와 탭번호를 혼동하지 않게 하기위에 0번탭을 사용하지 않음
PageTab.Tabs.Add
' 현재탭을 활성화 시킴
PageTab.Tabs(tabCount).Selected = True
' 현재탭번호변수를 최대탭 수로 넘김
tabCount = PageTab.Tabs.Count
' 마지막탭을 제외한 브라우저는 Disable 시킴
For j = 0 To 9 Step 1
If j = tabCount Then
' 활성화 된 탭과 같은 브라우저를 보여줌
WebBrowser.Item(j).Visible = True
WebBrowser.Item(j).GoHome
PageTab.Tabs(tabCount).Selected = True
Else
' 비활성화 탭과 같은 브라우저를 감춤
WebBrowser.Item(j).Visible = False
End If
Next
End Sub
Private Sub DelTabs()
' 탭을 지울때
Dim k
j = 0
k = 0
' 탭번호가 1 이면 그냥 둠
If PageTab.Tabs.Count = 1 Then
' 마지막 탭과 활성화된 탭이 같을때
ElseIf PageTab.Tabs.Count = tabCount Then
' 마지막 탭을 삭제 하고 브라우저를 숨김
WebBrowser.Item(PageTab.Tabs.Count).Visible = True
PageTab.Tabs.Remove (tabCount)
' 삭제 후 마지막 탭을 활성화 시킴
PageTab.Tabs(PageTab.Tabs.Count).Selected = True
tabCount = PageTab.Tabs.Count
Else
' 중간의 탭을 삭제시킬때 자신을 기준으로 값을 당겨옴
For j = 1 To PageTab.Tabs.Count
If j = tabCount Then
For k = tabCount To PageTab.Tabs.Count - 1
WebBrowser.Item(k).Navigate (WebBrowser.Item(k + 1).Location!URL)
PageTab.Tabs(k) = PageTab.Tabs(k + 1)
Next k
WebBrowser.Item(PageTab.Tabs.Count).Visible = False
PageTab.Tabs.Remove (PageTab.Tabs.Count)
PageTab.Tabs(tabCount).Selected = True
End If
Next j
End If
' 삭제 완료후 탭을 활성화 시킴
SelectTabs
End Sub
Private Sub getTabCount()
' 현재 탭번호를 받음
For j = 1 To PageTab.Tabs.Count
If PageTab.Tabs(j).Selected = True Then
tabCount = j
End If
Next j
End Sub
Private Sub SelectTabs()
' 현재 탭번호를 받아 해당 번호와 같은 브라우저를 활성화 시킴
getTabCount
For j = 0 To 9 Step 1
If j = tabCount Then
BrowserResize
WebBrowser.Item(j).Visible = True
Else
WebBrowser.Item(j).Visible = False
WebBrowser.Item(j).Navigate = "http://"
End If
Next
End Sub
Private Sub PageTab_Click()
SelectTabs
End Sub
Private Sub Form_Load()
' 처음 탭번호를 1로 두고 기본 환경 설정을 함
tabCount = 1
ToUrl(0) = "다음;http://www.daum.net"
ToUrl(1) = "네이버;http://www.naver.com"
ToUrl(2) = "구글;http://www.google.co.kr"
ToUrl(3) = "내블로그;http://battlej.nbloger.com"
ToUrl(4) = "파란;http://www.paran.com"
' 첫페이지는 설정된 홈페이지로 이동
WebBrowser.Item(1).GoHome
WebBrowser.Item(1).Visible = True
End Sub
Private Sub Form_Resize()
' 창 사이즈가 바뀔때 설치된 컨트롤의 크기도 같이 변경
GoPage.Left = 비베플로러.Width - 1335
Href.Width = 비베플로러.Width - 3240
PageTab.Width = 비베플로러.Width - 120
PageTab.Height = 비베플로러.Height - 1140
Popup.Left = 비베플로러.Width - 375
BrowserResize
End Sub
Private Sub BrowserResize()
' 창 사이즈가 바뀔때 설치된 브라우저의 크기도 변경
WebBrowser.Item(tabCount).Width = 비베플로러.Width - 360
WebBrowser.Item(tabCount).Height = 비베플로러.Height - 1620
End Sub
Private Sub GoHome_Click()
'홈으로 가기버튼 클릭시 Home 으로 이동
WebBrowser.Item(tabCount).GoHome
End Sub
Private Sub GoPage_Click()
' 바로가기 기능 구현
' 주소창의 단어와 같은 콜론(;) 전의 단어를 콜론(;) 뒤의 단어로 바꿈
Dim Pos
' 주소창의 단어의 길이가 1이상이고 http:// 로 시작되지 않을 경우 비교
If Len(Href.Text) <> "0" And InStr(1, Href.Text, "http://") = 0 Then
For j = 0 To 4
Pos = InStr(1, ToUrl(j), Href.Text)
If Pos > 0 Then
Href.Text = Mid(ToUrl(j), Len(Href.Text) + 2)
End If
Next j
End If
' 치환된 주소로 이동
WebBrowser.Item(tabCount).Navigate (Href.Text)
End Sub
Private Sub Href_KeyDown(KeyCode As Integer, Shift As Integer)
' 주소 입력창에 엔터키가 눌러지면 주소이동시킴
If KeyCode = vbKeyReturn Then
GoPage_Click
End If
End Sub
Private Sub MfileaTabClose_Click()
DelTabs
End Sub
Private Sub MfileClose_Click()
End
End Sub
Private Sub MfileNewWindow_Click(Index As Integer)
AddTabs
End Sub
Private Sub MfileOpen_Click()
' 열기 버튼 클릭시 주소를 입력받고 이동시킴
Dim location As String
location = InputBox("보고 싶은 URL 주소를 입력하세요. ex) http://www.naver.com", "주소열기", "http://")
' 주소단어의 길이가 4이상일때 이동
If Len(location) > 4 Then
WebBrowser.Item(tabCount).Navigate (location)
End If
End Sub
Private Sub MoptionTool_Click()
OptionTool.Show vbModal
End Sub
Private Sub MviewShowpopup_Click()
Popup.Value = 0
WebBrowser.Item(tabCount).Refresh
End Sub
Private Sub MviewSource_Click()
' 소스보기시 Dom 객체에 접근 최상위 Html 소스를 모두 Source 변수에 담음
' Source = Inet.OpenURL(WebBrowser.Item(tabCount).Location!URL) Inet 컨트롤을 이용해 소스를 받아 올시 사용
Source = WebBrowser.Item(tabCount).Document.documentElement.outerHTML
SourceUrl = WebBrowser.Item(tabCount).Location!URL
' 소스를 메모장에 출력시킴
mynotepad.Show
End Sub
Private Sub NextPage_Click()
On Error GoTo erro:
WebBrowser.Item(tabCount).GoForward
Exit Sub
erro:
End Sub
Private Sub Popup_Click()
' 팝업창 체크버튼을 쿨릭시 변수를 바꾸고 경고 박스를 보여줌
If Popup.Value = 0 Then
MsgBox ("팝업창을 보여줍니다.")
Else
MsgBox ("팝업창을 차단합니다.")
End If
End Sub
Private Sub PrevPage_Click()
On Error GoTo erro:
WebBrowser.Item(tabCount).GoBack
Exit Sub
erro:
End Sub
Private Sub Refresh_Click()
On Error GoTo erro:
WebBrowser.Item(tabCount).Refresh
Exit Sub
erro:
End Sub
Private Sub StopPage_Click()
On Error GoTo erro:
WebBrowser.Item(tabCount).Stop
Exit Sub
erro:
End Sub
Private Sub WebBrowser_DocumentComplete(Index As Integer, ByVal pDisp As
Object, URL As Variant)
' 페이지 로딩이 완료되었을때 제목을 탭이름으로 변경
Href.Text = WebBrowser.Item(tabCount).Location!URL
PageTab.Tabs(tabCount).Caption = WebBrowser.Item(tabCount).Location!Name
End Sub
Private Sub WebBrowser_NewWindow2(Index As Integer, ppDisp As Object,
Cancel As Boolean)
' 팝업창 변수가 1일때는 창을 띄우지 않음
If Popup.Value = 1 Then
Cancel = True
End If
End Sub
----- 비베플로러.frm : 메인화면 소스 끝-----
----- OptionTool.frm : 환경설정 소스 -----
Private Sub Form_Load()
' 환경변수 값을 받아출력시킴
For j = 0 To 4
OptionTool.ToUrl.Item(j).Text = ToUrl(j)
Next
End Sub
Private Sub ToUrl_Change(Index As Integer)
' 값이 바뀔때 해당 바로가기 변수에 값을 입력
ToUrl(Index) = ToUrl.Item(Index).Text
End Sub
----- OptionTool.frm : 환경설정 소스 끝 -----

$home 변수를 이용해 /home/ 에 필요한 계정만 백업 할 수 있도록 하였습니다.
크론탭으로 1일에 한번씩 실행시켜면 됩니다.
--------------- myhomebackup (id : root / chmod : 700 이상)-------------------
#!/usr/bin/php
$dir = '/home/';
$backupdir = '/backup/home/';
$makeday = 7;
$home[] = 'battlej';
$home[] = 'yourhome';
$home[] = 'etchome';
if (is_dir($backupdir)) {
if ($dh = opendir($backupdir)) {
while (($file = readdir($dh)) !== false) {
if(is_dir($backupdir.$file) && $file != '.' && $file != '..') {
$day = intval((strtotime("now") - strtotime($file))/86400);
if($day >= $makeday) {
exec("rm $backupdir$file -rf");
}
}
}
closedir($dh);
}
}
foreach($home as $file) {
if(is_dir($dir.$file)) {
$today = date('Ymd');
if(!is_dir($backupdir.$today)) {
exec("mkdir $backupdir$today");
}
exec("tar zcf $backupdir$today/$file.tar.gz $dir$file 2>/dev/null");
}
}
clearstatcache();
?>

/* *
* @contents 희소행렬의 3열 변환행렬입력 받아 여러 형태로 연산하는 클래스
* @ps 희소행렬의 변환데이터를 3열 변환데이터라 칭함
* * */
// 희소행렬 클래스
class SparseData {
// 자료를 저장할 2차원 배열, sparseData : 3열 변환데이터, matrixData : 희소행렬
int [][] sparseData;
int [][] matrixData;
// 생성자 : 희소행렬이나 3열 변환데이터를 입력받는다.
SparseData(int [][]count) {
// 입력된 데이터를 희소행렬인지 간략히 확인
if(count[0].length==3 && count[0][0]==count[0][1] && count[0][2]>1) {
// 3열 변환데이터를 희소행렬로 변환&저장
SparseDataToMatrix(count);
// 변환된 희소행렬을 3열 변환데이터로 변수에 저장
MatrixToSparseData(matrixData);
} else {
// 희소행렬을 3열 변환데이터로 저장
MatrixToSparseData(count);
// 변환된 데이터를 희소행렬 변수에 저장
SparseDataToMatrix(sparseData);
}
}
// 희소행렬을 3열 변환데이터로 변환
public void MatrixToSparseData(int [][]count) {
// 카운터 변수
int CountValue=0;
try {
// 값이 0이 아닌 데이터의 갯수를 구함
for(int i=0;i<count[0].length;i++) {
for(int j=0;j<count[0].length;j++) {
if(count[i][j] != 0) {
CountValue++;
}
}
}
// 멤버변수 sparseData 에 값이 없으면 초기화 시킨다.
if(sparseData==null) {
sparseData = new int[CountValue+1][3];
}
// 모든 값을 0으로 만든다.
for(int i=0;i<sparseData.length;i++) {
sparseData[i][0]=0;
sparseData[i][1]=0;
sparseData[i][2]=0;
}
// 첫행의 값을 등록한다. [행][열][갯수]
sparseData[0][0]=count.length;
sparseData[0][1]=count[0].length;
sparseData[0][2]=CountValue;
CountValue=1;
// 모든 배열의 값을 검사해 0이 아닌 값을 저장한다.
for(int i=0;i<count[0].length;i++) {
for(int j=0;j<count[0].length;j++) {
if(count[i][j] != 0) {
sparseData[CountValue][0] = i+1;
sparseData[CountValue][1] = j+1;
sparseData[CountValue++][2] = count[i][j];
}
}
}
} catch(Exception e) {
System.out.println("MatrixToSparseData 메쏘드 ArrayException 발생");
}
}
// 3열 변환데이터를 희소행렬로 변환
public void SparseDataToMatrix(int [][]count) {
// 희소행렬 변수가 없으면 초기화 한다.
if(matrixData==null) {
matrixData = new int[count[0][0]][count[0][1]];
}
try {
// 값을 0으로 초기화 시킨다.
for(int i=0;i<matrixData.length;i++) {
for(int j=0;j<matrixData[0].length;j++) {
matrixData[i][j]=0;
}
}
// 3열 변환데이터가 가지는 위치에 값을 저장한다.
for(int i=1;i<=count[0][2];i++) {
matrixData[count[i][0]-1][count[i][1]-1] = count[i][2];
}
} catch(Exception e) {
System.out.println("SparseDataToMatrix 메쏘드 ArrayException 발생");
}
}
public void SparseToTranspose() {
for(int i=1;i<sparseData.length;i++) {
sparseData[i][0]=sparseData[i][0]+sparseData[i][1];
sparseData[i][1]=sparseData[i][0]-sparseData[i][1];
sparseData[i][0]=sparseData[i][0]-sparseData[i][1];
}
SparseDataSort();
}
// 3열 변환데이터를 정렬한다.
private void SparseDataSort() {
// 3열 변환데이터를 희소행렬로 변환시켜 다시 3열 변환데이터를 얻어 정렬을 결과를 얻는다.
SparseDataToMatrix(sparseData);
MatrixToSparseData(matrixData);
}
// 희소행렬을 출력한다.
public String MatrixDataPrint() {
// 출력할 String 초기화
String Output = new String("");
try {
for(int i=0;i<matrixData.length;i++) {
for(int j=0;j<matrixData[0].length;j++) {
// String 변수에 결과 값을 저장시킨다.
Output+=matrixData[i][j]+"\t";
}
Output+="\n";
}
} catch(Exception e) {
System.out.println("MatrixDataPrint 메쏘드 ArrayException 발생");
}
return Output;
}
// 3열 변환데이터를 출력한다.
public String SparseDataPrint() {
// 출력할 String 초기화
String Output = new String("");
try {
for(int i=0;i<sparseData.length;i++) {
// String 변수에 결과 값을 저장시킨다.
Output+=sparseData[i][0]+"\t"+sparseData[i][1]+"\t"+sparseData[i][2]+"\n";
}
} catch(Exception e) {
System.out.println("SparseDataPrint 메쏘드 ArrayException 발생");
}
return Output;
}
// 3열 변환데이터에 입력된 3열 변환데이터를 2차원 배열로 리턴시킨다.
public int[][] SparseAdd(SparseData data) {
// 임시 변수 : 두데이터의 최대 행 갯수는 두 값*2이므로 초기화 시킨다.
int [][] tempData = new int[data.sparseData[0][2]+sparseData[0][2]+1][3];
// 3열 변환데이터가 없을경우 희소행렬에서 값을 가져온다.
if(sparseData==null) {
MatrixToSparseData(matrixData);
}
// 두 값이 3열 변환데이터의 조건이 맞는지 검사한다.
if(sparseData[0].length==3 && data.sparseData[0].length==3 && sparseData[0][0] == sparseData[0][0] && sparseData[0][1] == sparseData[0][1]) {
int check=1;
// 결과를 넣을 tempData 에 행,열의 값을 저장한다.
tempData[0][0] = data.sparseData[0][0];
tempData[0][1] = data.sparseData[0][1];
try {
// A데이터와 같은 B데이터를 합하고 0으로 저장한다.
for(int i=1;i<sparseData.length;i++) {
for(int j=1;j<data.sparseData.length;j++) {
if(sparseData[i][0]==data.sparseData[j][0] && sparseData[i][1]==data.sparseData[j][1]) {
sparseData[i][2] += data.sparseData[j][2];
data.sparseData[j][0] = 0;
data.sparseData[j][1] = 0;
data.sparseData[j][2] = 0;
}
}
}
// 같은 값의 합이 저장된 A데이터를 tempData로 저장한다.
for(int i=1;i<sparseData.length;i++) {
tempData[check][0] = sparseData[i][0];
tempData[check][1] = sparseData[i][1];
tempData[check++][2] = sparseData[i][2];
}
// B데이터는 같은값은 이미 0으로 초기화 되어 있으므로 0이 아닌값을 tempData로 저장한다.
for(int j=1;j<data.sparseData.length;j++) {
if(data.sparseData[j][0]!=0 && data.sparseData[j][1]!=0 && data.sparseData[j][2]!=0) {
tempData[check][0] = data.sparseData[j][0];
tempData[check][1] = data.sparseData[j][1];
tempData[check++][2] = data.sparseData[j][2];
}
}
// 총 값이 있는 데이터 갯수를 저장한다.
tempData[0][2] = check-1;
} catch(Exception e) {
System.out.println("SparseAdd 메쏘드 ArrayException 발생");
}
// 자신의 배열을 생성하여 정렬을 시키고 리턴시킨다.
//SparseDataSort();
return tempData;
} else {
// 두 값이 3열 변환데이터의 조건이 아니면 null 을 반환한다.
return null;
}
}
}
public class SparseMatrix {
public static void main(String [] arg) {
int [][]Array1 = {
{0,1,0,2,-2},
{2,0,0,0,0},
{0,4,0,-2,0},
{0,0,1,0,5},
{9,0,0,-6,0}
};
int [][]Array2 = {
{0,1,0,0,-1},
{0,0,5,0,0},
{0,15,0,8,0},
{0,0,0,0,1},
{-11,0,0,22,0}
};
/* 1) 희소행을 입력하여 3열 변환데이터로 바꾸는 함수 ( 생성자로 바로 실행 )
* MatrixToSparseData(int [][] count);
* 2) 앞의 방법으로 저장된 행렬을 원래의 행렬로 바꾸는 함수 ( 생성자로 바로 실행 )
* SparseDataToMatrix(int [][] count);
* 3) 앞의 방법으로 저장된 두 배열의 덧셈 함수
* SparseAdd(int [][] count);
* 4) 앞의 방법으로 저장된 배열의 전치행렬을 구하는 함수
* SparseToTranspose();
* 두 희소행렬을 입력하여 앞의 방법으로 바꾼 배열의 내용 출력하고,
* 이 두 행렬의 전치행렬을 4)의 함수를 이용하여 구하여 행렬 형식으로 출력하고,
* 입력한 두행렬의 합을 3)에서 작성한 함수를 이용하여 구하고 그 결과를 행렬 형식으로 출력하시오.
*/
// 2개의 희소 행렬 입력
SparseData newData = new SparseData(Array1);
SparseData newData2 = new SparseData(Array2);
// 3열 변환데이터 출력
System.out.println("출력결과\n");
System.out.println("1) 희소행을 입력하여 3열 변환데이터로 바꿈");
System.out.println(" A 희소행렬 변환결과");
System.out.println(newData.SparseDataPrint());
System.out.println(" B 희소행렬 변환결과");
System.out.println(newData2.SparseDataPrint());
// 두 배열의 전치행렬을 구함
newData.SparseToTranspose();
newData2.SparseToTranspose();
// 전치행렬을 행렬식으로 출력
System.out.println("4) 앞의 방법으로 저장된 배열의 전치행렬");
System.out.println(" A 전치행렬 변환결과");
System.out.println(newData.SparseDataPrint());
System.out.println(" B 전치행렬 변환결과");
System.out.println(newData2.SparseDataPrint());
// A와 B의 합을 addData 에 저장
SparseData addData;
System.out.println("3) 앞의 방법으로 저장된 두 배열의 덧셈");
addData = new SparseData(newData.SparseAdd(newData2));
System.out.println(addData.MatrixDataPrint());
}
}


