이 프로그램은 GNU Public License의 적용을 받는다.
압축은 7-zip을 이용해서 실행하였으니 아마 잘 될 것이다.
아, 참고로 윈도우 전용이다. 어쩔 수 없다. -_-;
개발 플랫폼은 Visual Studio 2005 (= .Net Framework 2.0)과 AutoHotkey와 MinGW(= gcc)라는 막장 조합이다.
(막강 조합이 아님에 유의)
압축은 7-zip을 이용해서 실행하였으니 아마 잘 될 것이다.
아, 참고로 윈도우 전용이다. 어쩔 수 없다. -_-;
개발 플랫폼은 Visual Studio 2005 (= .Net Framework 2.0)과 AutoHotkey와 MinGW(= gcc)라는 막장 조합이다.
(막강 조합이 아님에 유의)
10%할인이면 꽤 많은 것 같지만 사실은 다음과 같다.
1000원짜리를 산다 – 50원 적립.
1000원짜리를 산다 – 50원 적립.
이제 100원이 적립되었으므로
1000원짜리를 산다 – 100원 할인 = 900원에 구입
내가 얻은 것은 3000원어치이고 낸 돈은 2900원이므로 실제 할인율은 1/30정도로, 약 3%가 된다.
SK가 나쁘단 건 아니고, 그냥 포인트 할인이라는 것이 그렇단 얘기다. 10%할인이라고 좋아하기 전에, 실제로는 3%정도 할인이라는건 알고 나서 좋아하자.
어제 밤에 야식 사먹다가 기분이 발효될 뻔 했다.
1.
아침에 출근하자마자 행정실에 있는 선생님이 나를 부른다. “이 보고서를 특수연구동에 있는 각 박사님들에게 전달해 주세요”라는 임무를 맡긴다. 사람들은 모두 21명이고, 보고서는 500페이지 짜리 3부작이다.
반지의 제왕도 아닌 것이, 매트릭스도 아닌 것이, 보고서 주제에 3부작이라니 -_-;
표지는 같지만 다 다른 내용이다.
2.
저녁때 실험이 8시쯤 끝났다. 퇴근하려고 집에 가는 길에 전화가 왔다. “다시 출근해 주세요 제발”
헐.
난데없는 야근에 주어진 임무는 사진 모델. 실험실 챔버 사진을 찍어야 하는데 아무도 없으면 썰렁하니까, 셀카는 못 찍겠고 나보고 모델을 해달라고 한다. 이 사진은 연구소 평가위원회에 제출할 연구 성과 보고서 표지로 사용된다고 한다.
헐.
그런걸 나한테 맡겨도 되는건가. 뭐 표지모델이 못생겼다고 평가 점수가 깎이진 않겠지. -_-; 설마 평가위원들이 표지만 보고 심사하겠어? 내용도 좀 보지 않을까? 그런 생각을 했지만, 아침에 나눠준 연구성과 보고서 3부작 대하드라마는 내가 공부하는걸 아무리 좋아해도 읽기 싫다.
내년쯤엔 연구소 망할지도…(설마)
추가 – snowall 실험실 안에서 셀카놀이 ㅋ
뒤에 보이는건 조금 작은 챔버의 일부다. 보안상 많이 잘라냈음을 이해 바란다 -_-;
참고로 저 고글은
http://snowall.tistory.com/1286
에서 소개된 나름 비싼 고글이다. 개당 30만원정도.
실험실에서는 굴러다니지만… (진짜로 바닥에 굴러다닌다 -_-;)
이게 어쩌다 이렇게 된건지는 모르겠지만 이번에도 자세한 설명은 생략한다. 아무튼, 원하는대로 프로그램을 만들었다. 이것으로 레이저 한번 쏠 때마다 몇번 쐈는지 기록해 주는 프로그램을 작동시킬 사람 1명을 “절약”할 수 있게 되었다. 날림으로 만든 코드이며 매우 쉬우므로 소스코드 분석은 각자 해보기 바란다. 이런 프로그램을 다른데서 쓸 사람이 있을지는 모르겠지만 만약 사용하고 싶다면, 개인적인 용도로는 마음껏 써도 되지만 어딘가에 공표할 때에는 snowall의 명시적 허락을 받고 사용하길 바란다. (저작권료를 따로 청구하지는 않을 것이다.)
Public Property intcount() As Integer
Get
Return c
End Get
Set(ByVal value As Integer)
If value < 0 Then
c = 0
Else
c = value
End If
counting()
End Set
End Property
Private Sub counting()
txtCount.Text = intcount.ToString
txtPresent.Text = (intcount – 1).ToString
‘txtToday.Text = today.ToString
System.IO.File.WriteAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”, txtCount.Text)
End Sub
Private Sub up()
intcount += 1
txtToday.Text = CInt(txtToday.Text) + 1
End Sub
Private Sub down()
intcount -= 1
txtToday.Text = CInt(txtToday.Text) – 1
End Sub
Private Sub reset()
intcount = 0
beginning = intcount
txtToday.Text = 0
End Sub
Private Sub setting()
Try
intcount = CInt(txtSetCount.Text)
beginning = intcount
txtToday.Text = 0
Catch
End Try
End Sub
Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click
reset()
End Sub
Private Sub btnUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUp.Click
up()
End Sub
Private Sub btnDown_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDown.Click
down()
End Sub
Private Sub btnSet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSet.Click
setting()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
intcount = System.IO.File.ReadAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”)
beginning = intcount
txtToday.Text = “0”
Catch
intcount = 0
End Try
txtDate.Text = System.DateTime.Today
End Sub
Private Sub btnFontSize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFontSize.Click
Dim fnt As Font
fnt = New Font(System.Drawing.FontFamily.GenericSansSerif, CInt(txtFontSize.Text))
txtCount.Font = fnt
End Sub
Private Sub btnAuto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAuto.Click
If diaflag Or remoteFlag Then
If autoflag Then
btnAuto.Text = “Auto” & vbCr & “count”
Else
btnAuto.Text = “Stop” & vbCr & “count”
End If
autoflag = Not (autoflag)
Timer1.Enabled = autoflag
Exit Sub
End If
If Not diaflag Then
MsgBox(“First, Select auditing folder!”)
Exit Sub
End If
If Not remoteFlag Then
MsgBox(“First, Select auditing file!”)
Exit Sub
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If diaflag Then
If filenumber <> System.IO.Directory.GetFiles(diaFolder.SelectedPath).Length Then
file = System.IO.Directory.GetFiles(diaFolder.SelectedPath)
txtCount.Text = CInt(filenameWashing(file, diaFolder.SelectedPath.Length)) + 1
Me.txtPresent.Text = CInt(filenameWashing(file, diaFolder.SelectedPath.Length))
txtToday.Text = CInt(txtToday.Text) + 1
Else
Exit Sub
End If
filenumber = System.IO.Directory.GetFiles(diaFolder.SelectedPath).Length
End If
If remoteFlag Then
Dim n As New System.IO.StreamReader(OpenFileDialog1.FileName)
Dim k As String
k = n.ReadLine
If txtToday.Text <> k Then
txtPresent.Text = txtCount.Text
txtCount.Text = CInt(txtCount.Text) + 1
txtToday.Text = k ‘CInt(txtToday.Text) + 1
End If
n.Close()
n.Dispose()
End If
System.IO.File.WriteAllText(My.Application.Info.DirectoryPath & “\APRICounter.txt”, txtCount.Text)
End Sub
Private Sub btnDir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDir.Click
If diaFolder.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
flagClean()
diaflag = True
End If
End Sub
Private Sub btnSetToday_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetToday.Click
txtToday.Text = txtSetCount.Text
End Sub
Private Function filenameWashing(ByVal filename() As String, ByVal baseLength As Integer) As String
‘Dim f As String
Dim files As Integer()
ReDim files(filename.Length)
Dim i As Integer
Dim regexPattern As String = “[^0-9]”
Dim regex As New System.Text.RegularExpressions.Regex(regexPattern)
For i = 0 To filename.Length – 1
files(i) = CInt(regex.Replace(filename(i).Substring(baseLength, filename(i).Length – 4 – baseLength), regexPattern, “”)) ‘CAUTION!!! This code will work WRONG
Next
Array.Sort(files)
Return files(files.Length – 1)
End Function
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnRemote_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemote.Click
If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.Cancel Then
flagClean()
remoteFlag = True
txtToday.Text = 0
End If
End Sub
Private Sub flagClean()
remoteFlag = False
diaflag = False
autoflag = False
End Sub
End Class
이 프로그램은 AutoHotkey를 사용해야 한다.
이 프로그램의 최대 문제점은 한번 클릭했는데 숫자가 5에서 10정도 쑥쑥 올라간다는 것이다. 아무래도 while 문이 한번 클릭할 때 여러번 작동하는 것 같다. 이 문제를 해결하거나, 아니면 VC++에 MFC를 써서 새로운 프로그램을 만들어야 한다.
다음의 문서를 참고해야겠다.
http://visual-c.itags.org/visual-c-c++/85168/
http://msdn.microsoft.com/en-us/library/3158baat%28vs.71%29.aspx
http://www.databaseforum.info/29/1038446.aspx
결국 count.exe 프로그램을 한번 실행시킨 다음에 2초동안 재워버렸다. 2초 내에 2번 클릭하는 일은 절대 없을 것이기 때문이다. (이 프로그램의 용도는 특수 목적이기 때문에 2초 내에 2회 이상 클릭하는 일은 없어야만 한다.)
역시, 시험기간에 딴짓을 해야 효율이 좋다. ㅋㅋ
젠장. -_-; 내일 5과목 시험보는데 프로그램 만들고 앉아있다.
int main(int argc, char **argv){
FILE *count;
count = fopen(argv[1], “r”);
if(argv==0 || count==NULL){
return 1;
}
int c = 0;
fscanf(count, “%d”, &c);
fclose(count);
count = fopen(argv[1], “w”);
fprintf(count, “%d”, ++c);
fclose(count);
return 0;
}
더 이상의 설명은 생략한다.
일단 Autohotkey를 이용해서 특정 영역에 마우스 클릭이 있으면, counts.txt 파일에 숫자 0을 기록한 후 Counting.exe 프로그램을 호출한다.
Counting.exe 프로그램은 호출 될 때마다 counts.txt 파일을 읽어와서 그 파일에 기록된 숫자에 1을 더한 후 다시 그 내용을 counts.txt 파일에 기록한다.
counter.exe 프로그램은 원격에 있는 counts.txt 파일을 네트워크로 읽어온다.
counter.exe 프로그램은 그동안 전체 클릭이 몇번이었는지 기록했다가, counts.txt 파일에 기록된 숫자를 최종 클릭 수에 더해서 전체 클릭 수와 오늘의 클릭 수를 화면에 표시한다.
간단한거 하는데 이런식으로 설계해야 할줄은 꿈에도 몰랐네. -_-;
아키텍처 설계의 중점사안.
1. 화면 영역에 마우스 클릭을 검출하는 루틴 설계는 할 생각 없음. 절대 없음.
2. 마우스 클릭이 있을 때 원격지로 신호를 보내서 카운트를 올리도록 하는 클라이언트-서버 프로그램을 만들 생각 없음.
이제 코딩만이…