포인트 할인의 함정

이번에 SK에서 멤버십 카드를 받았다. 그걸 갖고 편의점에 갔더니 더블할인이라는 것이 가능하다고 하는데, 그 내용은 다음과 같다.

10%할인 또는 5%포인트 적립 중 선택. 단 할인은 포인트에서 차감.

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 Class frmMain

Private c As Integer = 0

Private today As Integer = 0

Private beginning As Integer = 0

Private autoflag As Boolean = False

Private diaflag As Boolean = False

Private remoteFlag As Boolean = False

Private filenumber As Integer = 0

Private file As String()

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

클릭 세는 프로그램

이 프로그램은 화면에 마우스가 클릭되면 프로그램을 호출한다.

#Persistent

coordmode,mouse,screen

Run E:\setting.exe E:\count.txt

while 1{

KeyWait, LButton, D

RunWait E:\counter.exe E:\count.txt

Sleep 2000

}

ExitApp

이 프로그램은 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과목 시험보는데 프로그램 만들고 앉아있다.










내용이 0인 파일을 만드는 프로그램

이 프로그램은 말 그대로 내용이 0인 파일을 만든다.

#include

int main(int argc, char **argv){

FILE *count;

count = fopen(argv[1], “w+”);

if(argv==0 || count==NULL){

return 1;

}

fprintf(count, “%d”, 0);

fclose(count);

return 0;

}

gcc에서 잘 컴파일 된다.

계수기

파일을 읽어와서 +1 한 후에 저장한다.

확 그냥 만들어 버렸다.

#include

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;

}

더 이상의 설명은 생략한다.

www

인터넷은 찌질이들이 많다.

이것은 그 이름이 지어질 때부터 어쩔 수 없었다는 느낌이 든다.

인터넷은 월드와이드웹(World Wide Web)이라고도 부르는데, 영어 약자로 www이다. 이것은 한글 자판에서 ㅈ이 3번 나오게 되는데, 그것은 찌질이의 앞에 있는 두 글자의 초성인 ㅉㅈ과 같다.

그것은 필연이라는 것이다.

클릭 수 세기 아키텍처

자신이 아닌 다른 컴퓨터의 화면에 있는 특정 영역에 마우스 클릭이 몇번 이루어 졌는지 원격으로 세는 프로그램이 필요하다. (왜 필요하냐건… 웃지요 -_-;)

일단 Autohotkey를 이용해서 특정 영역에 마우스 클릭이 있으면, counts.txt 파일에 숫자 0을 기록한 후 Counting.exe 프로그램을 호출한다.

Counting.exe 프로그램은 호출 될 때마다 counts.txt 파일을 읽어와서 그 파일에 기록된 숫자에 1을 더한 후 다시 그 내용을 counts.txt 파일에 기록한다.

counter.exe 프로그램은 원격에 있는 counts.txt 파일을 네트워크로 읽어온다.

counter.exe 프로그램은 그동안 전체 클릭이 몇번이었는지 기록했다가, counts.txt 파일에 기록된 숫자를 최종 클릭 수에 더해서 전체 클릭 수와 오늘의 클릭 수를 화면에 표시한다.

간단한거 하는데 이런식으로 설계해야 할줄은 꿈에도 몰랐네. -_-;

아키텍처 설계의 중점사안.

1. 화면 영역에 마우스 클릭을 검출하는 루틴 설계는 할 생각 없음. 절대 없음.

2. 마우스 클릭이 있을 때 원격지로 신호를 보내서 카운트를 올리도록 하는 클라이언트-서버 프로그램을 만들 생각 없음.

이제 코딩만이…

신선한 회

며칠 전 옆건물 닭집 아줌마에게 받은 파프리카 5개중 1개다,

친구에게 요리법을 물어봤더니, 회쳐먹으면 된다고 해서.

썰었다.

또 다른 친구에게 물어봤더니 회쳐먹지 말고 세로로 얇게 썰어서 먹으라고…

…그게 회다.

이제 접시에 이쁘게 담아낸다.

파프리카가 무슨 맛인지는 다들 알 것이므로 감상은 따로 적지 않는다. 난 저걸 썩기전에 4개나 더 먹어야 한다. L햄버거 가거에서 파는 파프리카 베이컨 비프버거에 들어가는 파프리카랑 느낌이 다르다. 아무래도 나머지는 소고기 사다가 같이 볶아먹어야 할 것 같다.

빈곤한 자취방

오늘의 시험이 끝나고서 집을 잠시 청소했다.

청소하다가 파리의 시체가 발견되었다.

난 파리를 잡은 적도 없고 살충제를 쓴 적도 없다.

굶어 죽은 듯.