[작성자:] snowall

  • 수식 없이 에너지 보존법칙 이해하기 3

    별 이유 없이 글이 3편까지 왔다.

    입자가 벽에 수직으로 충돌하는 경우, 운동량이 보존된다고 하면 당연히 에너지도 보존된다. 그럼 입자 2개가 충돌하는 경우를 제대로 생각해 보자. 일단 쉽게 생각해 보려면, 입자 2개가 정면충돌한다고 해 보자. 입자 2개가 똑같다고 하고 탄성계수는 1이라고 하자. 그럼 충돌 전과 충돌 후에 입자가 가지는 속도는 변하지 않을 것이고 서로 가던 방향의 반대 방향으로 제 갈길을 가게 된다. 그럼 운동량도 변하지 않고 각각의 운동량의 제곱도 변하지 않는다. 따라서 에너지도 변하지 않는다. 모든 충돌은 거의 대부분 입자 2개의 충돌로 근사할 수 있고, 보는 각도와 속도를 잘 바꾸면 항상 정면충돌로 바꿔서 볼 수 있다. 이제 열에너지를 운동에너지로 간주한다면 모든 충돌은 완전탄성충돌이므로 입자의 충돌에서 운동에너지는 항상 보존된다는 것을 알 수 있다.



    [각주:

    1

    ]


    이제, 에너지 보존법칙의 본질에 조금 더 다가가 보자. “보존”이라는 말은 “시간이 지나도 크기가 변하지 않음”을 뜻한다. 에너지는 두 종류가 있는데, 그중 운동 에너지는 충돌에서 보존된다는 걸 알 수 있었다. 이제, 운동에너지와 위치에너지의 합이 보존되는 경우를 살펴보자.

    ——-

    이 글의 연재를 잠시 중단합니다. -_-;

    그냥 쉽게 에너지 보존법칙을 이해해 보려고 했는데, “왜 물은 위에서 아래로 흐르나요?”라는 2000년도 넘은 질문을 이해해야 하는 불상사가 일어나는 바람에 고민 좀 더 해보고 쓰겠습니다.

    아마 “힘의 본질”에 대해서 이해하는 다른 글을 쓴 이후에 이 글을 계속할 것 같네요.

    1. 물론 Deep Inelastic Scattering 실험 같은 경우에는 양성자를 비탄성 충돌 시키는 실험이지만, 어쨌든 이 경우에도 “내부 구조의 열 에너지” 대신에 위치 에너지를 사용할 수 있다. 어려운 얘기는 일단 뒤로 쓱 밀어둔다.

      [본문으로]

  • 개발 환경

    정신 차려보니 내가 가진 컴퓨터가 6대다.

    솔직히 말하자면 노트북 2대 빼고 나머지는 세팅도 못했다. -_-;

    클러스터링 세팅 해야 하는데…

    가장 왼쪽에 있는 놈은 LCD의 백라이트가 고장났다. 용산 가서 고쳐야 한다.

  • 자동 샷 카운터 프로그램 배포

    이걸 써먹을 곳이 우리 연구소 말고 어디에 있을까 싶긴 하지만 써보고 싶은 사람은 써도 좋다.

    이 프로그램은 GNU Public License의 적용을 받는다.

    압축은 7-zip을 이용해서 실행하였으니 아마 잘 될 것이다.

    아, 참고로 윈도우 전용이다. 어쩔 수 없다. -_-;

    개발 플랫폼은 Visual Studio 2005 (= .Net Framework 2.0)과 AutoHotkey와 MinGW(= gcc)라는 막장 조합이다.

    (막강 조합이 아님에 유의)

  • 포인트 할인의 함정

    이번에 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번 나오게 되는데, 그것은 찌질이의 앞에 있는 두 글자의 초성인 ㅉㅈ과 같다.

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