[카테고리:] 컴퓨터

  • SQLite on VB.net

    SQLite는 매우 가벼운 SQL DB프로그램이다. 서버가 없고, 프로그램에 붙어서 동작하는 DLL 또는 EXE파일 형태로 실행된다. 자세한 설명은 생략한다. Visual basic 2005에서 SQLite를 어떻게 사용하는지 알아보자.

    아래 링크에 가면 좀 더 상세한 설명과 Tutorial이 있다.


    http://www.kirupa.com/net/sqllite_vb_pg1.htm


    위 링크에서 제공하는 Tutorial은 VS 2008이나 VS 2010버전인 것 같다. 난 2005버전만 갖고 있어서 실행시킬 수가 없다.

    일단, 아래 링크에 가서 System.Data.SQLite 의 최신 버전을 받는다. 이것은 Visual Basic에서 SQLite를 쓸 수 있게 해주는 컴포넌트들을 모아둔 것이다.


    http://sqlite.phxsoftware.com/

    제대로 설치했다면

    도구상자에서 SQLite라는 것을 찾을 수 있을 것이다. 이제 시작이다.

    1단계 – DB생성하기

    뭘 하든지, 일단 갖고 놀 대상이 있어야 작업을 할 수 있다. DB를 만들어 보자.

    우선, SQLite.SQLiteConnection 객체 하나를 만들어야 한다. SQLconnect라는 인스턴스 이름을 주자.

    Dim SQLconnect As New SQLite.SQLiteConnection()

    이대로 선언하면, 아마 뭐가 없다고 할 것이다. 그러니까, 위에 도구상자에서 SQLiteConnection 하나를 끌어다가 창에 갖다 둔다.

    그럼 이제 SQLiteConnection을 쓸 수 있게 된다.

    방금 만든 SQLconnect를 DB에 열어야 하는데, 매우 간단하다. 다음의 세 문장이면 된다.

    SQLconnect.ConnectionString = “Data Source=” & dbfile & “;”

    SQLconnect.Open()

    SQLconnect.Close()

    여기서 dbfile은 DB로 사용할 파일의 경로이다. SQLite는 파일 확장자로 db3을 사용하며, 파일 1개가 DB 1개에 해당한다. dbfile의 경로는 SaveFileDialog 같은데서 적당히 지정해서 알려주면 된다.

    아무튼 여기까지 했으면 DB파일이 하나 생성되어 있을 것이다. 방금 우리가 한 것은 새로운 DB파일을 만들어서, 열었다가, 닫은 것이다.

    2단계 – DB에 테이블 만들기

    알다시피 SQL로 DB를 갖고 놀기 위해서는, DB가 있어야 하고, 그 안에 Table이 있어야 하고, 그 안에 Column과 Record가 있어야 한다. 순서대로 형성해야 하는데, 일단 테이블부터 만들자.

    이 작업은, 앞에 1단계에서 했던 명령어 중, 일단 SQLconnect.Open()까지는 똑같다. 왜냐하면, 뭔가 작업을 하려면 일단 DB를 열어야 하기 때문이다. 공책에 뭔가를 적기 위해서는 일단 공책을 펼쳐야 하지 않겠는가? 따라서, SQLconnect.Open()까지는 실행했다 치고, SQLconnect.Close()는 아직 실행하지 않은 상태이다. 즉, DB가 열려있는 상태에서 다음과 같은 코드를 써넣으면 된다.

    SQLcommand = SQLconnect.CreateCommand

    SQLcommand.CommandText = “CREATE TABLE tablename( tablespecification );”

    SQLcommand.ExecuteNonQuery()

    SQLcommand.Dispose()

    SQLcommand라는 객체를 도 만든다. 이 객체는 SQLconnect.CreateCommand라는 클래스의 객체이다. 하지만 이대로 하면 또 뭔가 안된다고 할 수도 있다.

    이 경우, 위와 같이 SQLiteCommand라는 컴포넌트를 갖다가 끼워준다. 그럼 이제 SQLconnect.CreateCommand를 쓸 수 있게 된다.

    그 다음, SQLcommand.CommandText에는 테이블을 만드는 SQL명령문이 들어가면 된다. 다들 알다시피 CREATE TABLE이 바로 그 명령이다. SQL에서 테이블을 어떻게 만드는지는 SQL책을 참고하자. 아무튼, 어떤 명령을 내릴 것인지 지정을 했으니까, 이제 SQLcommand.ExecuteNonQuery()를 실행시킨다. 이 명령어는 CREATE, INSERT, UPDATE, DELETE같은 DB의 내용을 바꾸는 것들에 대한 명령이다.

    눈치채야 하는 부분은, SQLite를 쓰려면 다음과 같이 하면 된다는 것이다.

    1. DB를 연다

    2. SQLCommand 객체에 SQL명령어를 입력한다.

    3. 그 명령어를 실행시킨다.

    4. 명령어 객체와 DB객체를 닫는다.

    그건 그렇고, 테이블 만드는건 CREATE로 하면 되고, 거기에 내용 넣는건 INSERT랑 UPDATE로 하면 되고 지울거면 DELETE로 하면 되는데, 넣은걸 읽어오려면?

    이제 SQL의 가장 중요한 구문인 SELECT를 해볼 차Ž?

    앞에서 SQLcommand의 SQLcommand.CommandText에다가 SELECT 명령어와 그에 따른 구문을 입력하는 것 까지는 똑같다. 그런데, 이번엔 실행시켜야 하는 명령어가 다르다.

    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()

    여기서 SQLreader는 그냥 평범한 배열이다. 별거 없다. TABLE에서 지정한 column이 순서대로 들어가 있을 뿐이다. SQLreader(0)하면 TABLE의 가장 첫번째 열에 있는 애들의 column이 쭉 들어가 있다.

    자세한건 좀 더 연구해 봐야겠다. 기록을 위한 글쓰기는 여기까지. 나도 잘 모름.

  • 첫 C++ 코딩

    처음으로, 학교 숙제때문에 C++로 코드를 만들었다. 워낙에 Visual basic으로 객체지향적인 코드를 만드는데 익숙해져 있어서 몇가지 C문법을 복구시킨 후에, 그다지 어렵지 않게 코드를 완성해가고 있다.

    유일한 문제라면, 이 코드의 컴파일된 바이너리를 윈도우용으로 해 가야만 하는지, 리눅스용으로 해도 괜찮은지다. 윈도우용으로 해야 한다면, 연구소로 갖고 가서 Visual studio를 써서 컴파일하든가, mingw를 설치해서 컴파일하든가 해야 한다. 아님 DevC++를 설치해서 빌드해도 나쁘지 않겠다.

    하지만 C랑 비슷해서 그런지, 객체지향적 코드의 느낌은 잘 나지 않았다. (아마 내가 코딩해서 그럴 수도 있다.) 숙제 결과물은 나중에 성적 발표되면 올려두도록 하겠다.

  • 터치패드 토글 스크립트

    노트북 터치패드를 껐다 켰다 하는 스크립트다.
    구글링의 도움을 받음
    http://forum.eeeuser.com/viewtopic.php?id=39170
    #!/bin/bash

    status=$(synclient -l | grep TouchpadOff)

    if [[ "$status" =~ $*0 ]]; then
    synclient TouchPadOff=1
    else
    synclient TouchPadOff=0
    fi
  • MB세팅중

    일러두기 : MB는 MacBook의 약자이다.

    MB한테서 이렇게 감동먹어보기도 처음일 것 같다. (분명 처음일 것이다.) 인수받고서 포맷하느라 맥OS DVD를 넣고 설치하는데, 2번 DVD로 바꾸기 위해서 디스크를 꺼내려고 하는데 이건 디스크 추출 버튼이 없네. 그래서 손을 가져다 댔더니 DVD가 튀어 나온다. 오오…

    단축키가 윈도우랑 달라서 그런지 좀 괴롭다. 그보다, Caps lock을 다른 키로 바꿀 수 없는건가?

    어딘가 키 맵퍼가 있을 것 같은데.

    아무튼 다음주쯤에는 리눅스 설치할 거니까…-_-;;;

    일단 맥에 파이어폭스를 세팅하여 계속 써보려고 한다. 다음 단계는 Adium과 Nateon 플러그인의 설치인데, 이건 역시 산넘어 산…;; 삽질을 동반한 삽풍이 예상된다. 그냥 맥OS용으로 나온 네이트온 메신저를 설치해버릴까. (하지만 네이트온 메신저는 광고도 있고 MSN과 함께 쓸 수가 없다.)

    한/영 전환키를 Ctrl+Space로 해놓고 Caps lock을 Ctrl로 바꿨더니 조금 쓸만하다. 하지만 윈도에서는 Shift+Space로 쓰고 있어서 사실 양쪽에 있는 Shift키를 모두 쓸 수 있어서 편했는데, 맥에서는 조금 불편한 것 같다. 적응이 안되니까.

    써보다가 안되면 리눅스로 갈아탈 생각인데, 리눅스에서 다른 기능은 다 괜찮을 것 같은데 전원관리 기능이 어떻게 작동할지 모르겠다.

    외부 마우스 꽂으면 터치패드가 자동으로 작동을 멈추는 기능은 매우 편리하다. 나의 LG엑스노트에서도 그런 기능이 있긴 한데, 제대로 작동하는 건 보지 못했다. 그리고 아예 Disable로 해 두더라도 절전모드에서 돌아오면 터치패드가 잘 작동한다. 상태는 여전히 Disable 모드인데도 불구하고 말이다.

    키보드의 느낌은 괜찮은 편이다. 예전에 썼었던 블루투스 매킨토시 무선 키보드보다 좀 더 부드럽다. 아마 오래 쓴 것과 묵직함이 있어서 그런 것 같다. 아무튼 맘에 든다. 원래 쓰던 분이 오래 써서 번들거림이 있지만 나는 번들거림을 좋아하는 사람이라… 알콜로 한번 닦아주고 그대로 쓰련다.

    한글 입력기는 조금 마음에 안든다. 한글 상태에서 Shift키를 누르고 쌍자음이나 이중모음이 아닌 키를 누르면 해당하는 영문 대문자가 입력된다. Shift키는 고속으로 입력하다보면 조금 더 오래 누를 수도 있는데 좀 너무한거 아닌가. 확 그냥 내가 새로 개발해 버리고 싶지만 난 맥OS에서 뭔가를 개발해볼 생각은 그닥 없다. (물론 리눅스에서도 뭔가를 개발할 생각은 없다. 내가 하고싶은건 코드네임 안장 프로젝트의 개발과 실험 분석에 사용하는 비주얼 베이직 프로그램 뿐이다. 아직은.)

    자석으로 달라붙는 전원공급장치는 혁신이라 불러도 좋을 것 같다. 다른 모든 장점보다 이것을 크게 칭찬하고 싶다. 놀랍다. 멀티터치보다 혁명적인 것 같다. (물론 멀티터치가 더 늦게 나왔을 거라고 생각한다.)

    일단은 불편한 점이라면 키보드 편집 키들이 익숙하지 않아서 그런 것 같다. 그래픽 인터페이스는 10분만에 적응했다. 어디에 뭐가 있는지 찾기 쉽게 되어 있다. 이제 소설을 집필하는데 쓸만한 텍스트 편집기를 찾아봐야겠다.

    메신저로 Adium을 설치하고 여기에 Nateon플러그인을 설치해서 이곳에서도 메신저를 잘 사용하게 되었다. 이제 Copy & Paste만 할줄 알면 사용하는데 문제가 없다. 오픈오피스 설치해서 Melotopia를 계속 집필해야겠다.

    하지만 그건 그거고 리눅스가 더 편한듯…-_-;

    결국 밀어버리고 쥐분투 설치했다. 더 빨리 설치되고 더 빠르게 작동하는 느낌이다.(설치는 확실히 엄청 빠르게 끝났다.) 문제는 터치패드인데, 마우스 이용시 또는 수동으로 터치패드를 끌 수 있어야 한다. 안그러면 문서 작업을 할 수가 없다.

    수동으로 끄는 대신에 syndaemon이라는 놈을 찾아냈다. 이것은 타이핑 하는 도중에는 정해진 시간만큼 터치패드의 입력을 받아들이지 않는 것이다. 자세한 사용법은 syndaemon 을 인터넷에서 검색하면 알 수 있다. 이것을 쓰니 확실히 편하다. ㅋㅋㅋ 역시 리눅스는 뭔가 더 좋은것이 있다.

    이제 다음 작업은 melotopia를 집필하기 위한 최적의 세팅을 마련하는 것이다. 그리고 Anjang프로젝트를 계속하기 위해서는 gcc를 설치해야겠다.

    헉…근데 얘는 왜 4채널 스피커지?? -_-;; 놀라운데. 그건 그렇고 트레이 아이콘에 있는 소리 조절바가 작동을 안한다. 원래는 그 위에서 스크롤하면 바로 소리 크기가 조절되어야 하는데 이놈은 굳이 소리 조절창을 열어서 봐야 되는 것 같다. 그렇다고 맥 전용 특수키가 작동하는 것도 아니고. 어째야 하나…그냥 소리 없이 조용한 환경에서 살아야 하나…

    맥북 세팅이 대강 끝난 것 같다. 어찌어찌 해서 배터리는 1시간 30분 정도 가는 것 같다는 보고를 받았다. 뭐…이건 대충 좀 써보다가 리필을 해야 할 것 같다. 밝기 조절은 여전히 희망이 없다. 소리 크기 조절은 희망이 생겼다. 근데 처음 켤 때 나는 시그널 소리가 너무 크다. 공공장소에서 켤 때는 민폐일듯 싶다. 맥북은 원래 안끄고 쓰는게 미덕인데 이놈은 어쩔 수 없을 것 같다.

    소리 크기 조절과 밝기 조절의 펑션키 사용은 pommed 를 써서 가능해졌다. 누군가 나에게 어떻게 했냐고 물으면 sudo apt-get install pommed 를 썼다고 말해줘야지. (나 자신에게도.)

    이제 마지막 문제는 처음 켤 때 나는 소리인데, 이건 켤때 F3를 누르고 있거나, 끄기 전에 mute를 시켜놓고 끄면 된다고 한다. 이 문제를 해결하기 위해서 맥OS에서는 뭔가 좋은 유틸리티가 나온 모양인데 리눅스용으로는 아직 없는 것 같다.

    포럼을 뒤져보다가 “처음 켤때 나는 소리는 끌 수 없는거냐?”라는 질문에 “아, 그건 불가능해. 그건 맥북의 일부야.”라는 마스터 요다 급의 답변만 달려 있다. 찾느라 한참 걸렸다.

    구글링해보니 누군가 답을 올려두었다. 역시 구글은 신이다.


    http://thpinfo.com/2007/11/disabling-startup-soundchime-on-macbook.html

    문제는 nvram에 쓰기가 안되는 것 같다는…-_-;

    어쨌든 F3을 하든 mute를 하든 리눅스에서 하는 걸로는 안된다. 맥OS를 설치하든가, 아님 그냥 닥치고 쓰든가 해야겠다. 샹…된다며…ㅜ_ㅜ

    고주파 소음은 어떻게 안되는 것 같다. 귀가 나빠지지 않았음을 자축하며 그냥 써야겠다.

    뭔가를 설치했다.

    cpu작동 주파수가 계속 1GHz로 나오길래 인터넷을 검색해서 acpi 모듈을 올려주기도 하고 cpufreqd를 설치하기도 했다. 이것저것 해줬더니 제대로 작동한다. 이제 배터리로 전환하면 CPU작동 속도가 느려지는 스피드스텝도 작동한다.

    덤으로 뭔가 설치된 배터리 관리기에서는 배터리 사용 용량이 2시간 20분이라고 나온다. 맥 OS에서 본 것과 비슷한 느낌이다. 문제는 이게 실제로 사용 가능한 시간이겠느냐는 건데, 뭐 그건 재봐야…;;;

    성능 좋은 노트북에 리눅스를 설치하였으니 이제 compiz를 세팅할 차례다.

    오…

    이것은. 윈도우7의 모든 효과를 거의 똑같이 따라할 수도 있을 뿐만 아니라 보기도 좋고 쓰기도 좋은 기능들이 잔뜩 쌓여있다. 보기만 해도 군침이 돈다.

    윈도우7을 써보진 않았지만, 윈도우 비스타랑 compiz의 효과를 비교한다면, 윈도우의 시각적 효과나 사용성은 리눅스의 compiz랑 비교하면 그냥 장난감이다. 개발하느라 삽질좀 했을텐데, 그냥 MS에서는 윈도우즈를 GPL로 전환하고 compiz를 갖다 쓰는게 어떨까.

    누가 보면 이게 바로 맥OS인줄로 알겠다. -_-;;;

    (계속 갱신됩니다…)

  • 기적 : 연말정산이…

    연말정산이 ActiveX를 걷어내고 운영체제/웹 브라우저 종류 상관없이 된다는 소식을 들었다.

    기적이라고 불러야 하는건가.


    http://openweb.or.kr/?p=2001

    올해는 새로 지른 맥북에서 맥OS나 리눅스를 이용해서 해봐야겠다.

  • 프로그램 처리 시간

    드디어 실험 결과 분석 프로그램을 자동화 시키는데 성공했다. 이제 데이터 파일과 설정파일을 넣고 돌리면 된다.

    두근두근하면서 실행시키는데, 1분쯤 지나더니 얘가 에러를 내뱉는다. 뭐라고 길게 써 있었지만 요점은 “이거 너무 오래 걸리는데? 프로그램 문제 있는거 아냐?” 라는 걱정스런…

    너무 친절하잖아!

    친절하지 않아도 됩니다. 제발…-_-;;;

    파일 2천개, 300MB분량의 데이터를 처리하는데 당연히 오래 걸리지…

    이러니 VB를 학술 연구용으로 안쓰지! 이래서야 시뮬레이션같은거 돌리겠나.

    이 문제를 해결하려면 MDA를 써서 뭔가를 어떻게 해서 멀티스레드를 돌리고 메시지 펌핑 어쩌고를 하면 된다고 친절하게 안내해 주었지만 내가 공부한 “초보자를 위한 Visual Basic 2005″에는 그런 고급 기술은 나와 있지 않다.

    프로그램에 버그 없어보이면 그냥 잔소리 없이 실행해주면 되는데 처리 시간이 오래 걸리는 것 까지 간섭이니?

  • 멍청한 코드

    이런 코드를 내가 썼었다.

    DIM configuredFlag as BOOLEAN

    (…something for nothing…)

    IF NOT(configuredFlag) THEN

    configuredFlag = TRUE

    END IF

    내가 이짓을 왜 했었지? -_-;

  • 기획은 부디 사용자 관점에서

    컴퓨터 프로그램을 쓰다 보면, 요즘은 GUI로 많이들 되어 있기 때문에 화려한 그림을 보여주며 굉장히 멋진 화면을 보여주는 경우가 많다. 하지만 기획이 엉망이면 아무리 화려해도 실제로 사용하는 입장에서는 매우 큰 불편함을 느낄 수밖에 없다. 정말, 어떤 기능들은 “이 기능을 개발한 개발자는 이 기능을 한번도 써본 적이 없는 개발자일것 같다”고 생각하는 기능들이 많다. 이런 기능들은 대부분 기획이 잘못된 경우다. 그리고 많은 경우 기획자와 개발자 사이의 의사소통이 제대로 안되어서 그런 경우일 것이다. 예전에 웹 서비스 기획도 해봤었고 지금은 프로그램 개발도 하고 있지만, 기획자랑 개발자 사이의 의사소통은 러시아 사람과 ET가 대화하는 것 만큼 힘든 사안일 것이다. 나? 난 개발자들한테 칭찬받는 기획자였다. “snowall씨는 개발자의 언어를 사용할 줄 알아서 참 좋아”라고. ㅋㅋ 요즘 내가 개발하고 있는 프로그램은 실험 결과를 분석하는 프로그램인데 3개월동안 삽질할 것을 1시간동안 삽질할 분량으로 줄여준다. 이 프로그램 개발하느라 12개월째 삽질하고 있다. 다른 일도 하면서 하느라 많이 늦어진 것이니까 그렇게 많이 늦어졌다고 생각하지는 않는다. 이 프로그램을 개발하면서 느낀 점은, 아무래도 난 좌뇌가 기획하고 우뇌가 코딩하는 것 같다는 생각을 떨칠수가 없다. 사람들이 말하기를 좌뇌는 이성적이고 분석적인 기능을 하고 우뇌는 감성적이고 직관적인 기능을 한다더라. 그런데 나는 분석적으로 기획하고 직관적으로 코딩한다. 덕분에 소스코드는 라면발을 방불케 하고 있으며 비주얼 베이직 언어를 사용하는데 포트란 같은 느낌을 떨칠수 없다. 그리고 프로그램 화면이 보여주는 UI는 누가 이공계 아니랄까봐 딱딱하며, 아기자기한 맛이나 이쁜 측면은 전혀 없다. 철저히 사용자 중심의 기획을 하였다. 왜냐하면 이 프로그램은 기획자, 사용자, 검사자, 개발자, 그 외 기타등등의 역할을 다 나 혼자 하고 있기 때문이다. 당연히 사용자 관점에서 기획이 될 수밖에 없고 요구사항은 그때그때 철저히 반영된다. 이런식으로 프로그램을 개발하다가 다른 사람이, 특히 내가 어쩔 수 없이 자주 사용해야 하는데 불편하게 만들어진 것들 – 예를 들면, 운영체제 같은 것 – 이 있으면 뜯어 고치고 싶다. 실력도 안되지만 어차피 내가 쓰는 운영체제는 소스코드조차 알아낼 수 없다. 가끔 맘에 드는 기능이 추가되는 경우도 있지만, 운영체제 수준의 프로그램들은 한번 개발되면 웬만해서는 바뀌지 않기 때문에 어떻게 해볼 도리가 없다. 가령, 윈도우즈 운영체제의 시작표시줄은 나에게 허용된 선택사항이 2개밖에 없다. “새 시작표시줄”과 “예전의 시작표시줄” 뿐이다. 이런 망할. 둘 다 맘에 들지 않을 뿐더러, 두가지 형태를 섞어 놓은 걸 원하는 사람도 있고 자기 맘대로 뭔가를 하고 싶어하는 사람도 있다. 그래서 프로그램 실행기를 따로 설치해서 dock이라는 것들을 쓰는 사람도 많다. 하지만 운영체제에서 기본적으로 제공할 수 있는 것들을 사용자가 컴퓨터 자원을 써 가면서 추가적으로 뭔가를 더 해야 하는지 잘 이해가 되지 않는다. 나는 내 컴퓨터가 오직 내가 하려는 업무에만 집중해 주었으면 한다. 내가 집중을 하지 못하기 때문이다.

    —–

    요즘들어 머릿속에서 수많은 생각이 비집고 튀어나오려고 하는 것 같다. 일부를 기록하여 둔다.

  • 운영체제

    진지하게 읽지 마세요.

    ——————————

    식당에서 주문을 하는 시스템을 관찰한 적이 있었다. 어차피 밥은 매일매일 먹으러 가니까 관찰하는데 일부러 신경써서 뭘 해야 하는건 없다.

    여기에 더불어 요즘 컴퓨터과학을 배우다 보니 운영체제가 사용자에게 서비스를 제공하는 방식에 대해서 공부를 하고 있다. 이것은 사실 식당의 발전 체계와 비슷한 것 같다.

    초기의 식당은 1명의 식당 주인이 주문 받고, 요리를 하고, 상을 차려서 내주고, 손님이 식사를 마치면 계산을 한다. 가령, 이런 것은 운영체제가 프로그램의 요청을 받아서 자원을 분배하고 회수하는 시스템과 닮아있다. 손님이 그다지 많지 않은 식당에서는 충분히 처리할 수 있다. 손님이 너무 오래 기다린다고 짜증내기 전에 식사를 내 올 수 있다.

    식당이 유명해 지게 되면 손님이 점점 많아지는데, 식당 주인은 가게를 확장해야 한다. 가게를 확장하게 되면 받을 수 있는 손님의 수가 많아지므로 더 많은 돈을 벌 수 있다. 그런데, 한번에 많은 수의 손님을 받게 되면 자리에서 대기하고 있는 손님이 많아지고, 결과적으로 손님의 평균 대기시간이 늘어나게 된다. 평균 대기시간이 늘어난다는 것은 맛이야 어떻든간에 서비스의 질적 하락을 나타내므로 좋지 않은 상황이다. 따라서 평균 대기시간을 줄이기 위한 방법을 생각해 봐야 한다.

    식당 주인이 쓰는 방법은 여러가지가 있다.

    식당 주인이 손님의 요청을 받고, 주문서를 갖다가 주문서 큐(Queue)에 올려두면 요리사가 순서대로 처리하는 방법이 있다. 식당 주인이 손님의 요청을 받는 사이에도 요리사는 요리를 할 수 있고, 주문서 큐를 잠깐만 참고하면 되기 때문에 이 방법은 요리사를 방해하지 않는다. 이런걸 DMA(Direct Memory Access)방법이라고 한다.

    요리사가 요리를 하기 전에 냉장고에서 미리 요리 재료를 꺼내서 도마 위에 올려둘 수가 있는데, 이걸 캐싱(Cacheing)이라고 부른다. 냉장고에서 꺼내 오는 것보다 도마 위에서 바로 손질하는 것이 훨씬 빠르기 때문에 잘만 하면 대기시간을 확 줄일 수 있다. 캐싱을 잘 하려면 어떤 요리가 주문될 것인가 예측하는 것이 대단히 중요하다. 예측의 정확도가 높을수록 대기시간이 줄어든다.

    한단계 더 나아가서, 납품받은 식재료를 미리 냉장고에 채워넣는 것은 버퍼링이라고 한다. 버퍼링이 없다면, 가령 간장 게장을 시킨 손님은 “아니, 요리사가 게잡으러 동해로 떠났어?”라고 생각하게 될 것이다.

    식사가 나오기 전에 밑반찬을 미리 내와서, “뭔가 진행중”이라는 생각을 갖도록 하여 손님을 붙잡아 두는 방법이 있다. 만약, 여기에 밑반찬을 미리 내오는 서빙 알바를 두고 식사를 서빙하는 알바를 둔다면 이것은 2단계 파이프라이닝이 되는 것이다. 물론 여기에서도 병목현상은 일어날 수 있는데, 알바가 1명이라면 손님이 몰려왔을 때 밑반찬 세팅에 대한 대기시간도 늦어질 수가 있다.

    처리하는 단계를 좀 더 세분화 해서, 물수건과 물컵과 식기를 세팅하는 알바를 두고, 주문을 받는 알바를 두고, 밑반찬을 내오는 알바를 두고, 식사를 서빙하는 알바를 두고, 계산대에서 식대 정산만 하는 알바를 둔다면 5단계 파이프라이닝이 된다.

    3, 4단계 파이프라이닝은 어떻게 하면 되는지 생각해 보자.

    요리사를 여러명 고용해서 한번에 여러개의 요리를 만들도록 하는 것도 방법이 될 수 있다. 이것은 요즘 유행하고 있는 다중 CPU 병렬 처리가 된다. 이 경우에는 어느 요리사에게 어떤 주문을 넣어주느냐를 분배하는 방법을 잘 고려해야 한다. MPI나 openMP같은 라이브러리를 알려주면 좋겠지만, 식품 공학과 컴퓨터 공학 사이에는 언어의 장벽이 있다. 아무튼 식당 주인은 주문을 받아서 잘 넣어주면 된다.

    요리사를 여러명 고용하다 보면 주방이 좁아지는 경우를 피할 수 없는데, 아예 다른 식당과 연합하여 한쪽으로 주문이 몰릴 때 다른 식당에서 요리를 해서 갖다 주는 방식을 생각해 볼 수 있다. 이 경우, 식당과 식당 사이에서 주문을 전달하고 요리를 받아오는 속도가 관건이 된다. 이것은 서버 다중화 기술에 해당한다.

    아예 손님이 주문 받는 창구를 단일화 해버리고, 주문은 한곳에서 받고 식사는 각각 적당한 곳에 배정해서 요리를 내오도록 하는 곳도 있다. 백화점 푸드코트에서 쓰는 방식인데, 이런 것을 클라우드 컴퓨팅이라고 한다. 좀 더 확장된 의미의 클라우드 컴퓨팅에서는 아무데서나 주문해도 적당한 곳에서 요리가 나오는 것이 가능하다. 요즘 각광받고 있다.

    한명의 요리사를 쓰더라도, 여러개의 요리를 동시에 처리하도록 할 수도 있는데, 가령 어떤 요리가 10분동안 물을 끓여야 하는 과정이 필요하다면 그 사이에 다른 요리의 다른 과정을 수행할 수 있는 것이다. 이 경우, 요리사의 지능이 높아야 한다는 제약조건이 필요하지만 어쨌든 평균 대기시간을 줄이는데 한몫 할 수 있다. 이것은 시분할 다중처리에 해당한다. 만약 한명의 요리사가 가스렌지를 쓰면서 전자렌지를 돌리고 도마에 양파를 다지면서 오븐에 닭을 굽고 있다면 이것은 하이퍼스레딩이 된다. 하이퍼스레딩이란 하나의 CPU를 두개 이상의 CPU처럼 보이게 하는 기술이다. 근데 손님이 적을 때는 하이퍼스레딩을 안하는 것이 더 빠르게 처리된다.

    손님 중에 변태끼가 있는 사람이 있어서 중국집에 가서 꽃등심 스테이크를 주문하는 사람이 있다면, 일반적으로 그런 손님은 욕먹으면서 내?기게 된다. 하지만 기왕에 온 손님을 내칠 수는 없다며 시장 확대를 위해 몸부림 치는 식당 주인이라면 에뮬레이션과 가상화를 고려하게 된다. 중국집 요리사보고 꽃등심 스테이크를 배워서 내놓으라고 한다. 이런 경우에는 중국집 요리사가 꽃등심 스테이크 만드는 법을 요리책을 보면서 해야 하기 때문에 주문이 느리게 처리될 것이다. 이것을 에뮬레이션이라고 부른다. 돈을 많이 받는 유명 중국집 요리사들은 아예 양식 요리사를 고용할 수도 있는데, 이것은 가상화가 된다. 물론, 진짜 변태스런 손님은 중국집에 가서 양식 요리사보고 탕수육을 만들어 오라고 할 수도 있다. 이 경우, 중국집 식당 주인이 융통성을 발휘해서 양식 요리사 대신에 원래 데리고 있던 중국음식 요리사에게 탕수육을 만들어서 양식 요리사보고 갖다 주라고 할 수도 있는데, 서비스 품질도 좋고 더 빨리 처리된다. 이것을 하드웨어 수준에서 지원하는 가상화라고 한다.

    손님이 주문을 한 순서대로 요리를 내가는 방법을 FIFO(First in First out)라고 한다. 이것은 Queue를 써서 주문을 처리하는데, 대부분의 소규모 식당에서 사용한다. 하지만 어떤 손님이 시간이 엄청 걸리는 요리를 주문했는데, 요리사가 한명 뿐이라면 다른 손님들의 평균 대기시간이 너무 길어질 것이다. 그래서 식당 주인들은 잔머리를 굴려서 주문에 우선순위를 주고 평균적으로 대기시간을 줄여서 몇명은 화를 내더라도 전체적으로는 만족스러운 주문 처리를 하는 방법을 개발해 냈다. 우선 한가지 알아두어야 하는 것은, 요리사한테 요리를 하다가 말고 다른 요리부터 먼저 하라고 시키는 방법을 선점형이라고 부르고, 하나 시작했으면 끝까지 마친 다음에 다른 요리를 시키는 방법을 비선점형이라고 한다.

    SJF(Shortest Job First)라는 방법이 있다. 이건 비선점형으로, 일단 시작한 요리는 완성한다. 그리고 나서 그 다음에 들어온 주문 중에, 가장 요리 시간이 짧을 것 같은 주문을 먼저 처리한다. 이 방법의 단점은, 요리시간이 짧은 주문이 계속 들어오면 상대적으로 시간이 길게 걸리는 주문은 무한정 기다릴 수 있다는 것이다. 그리고 요리시간에 대한 요리사의 추측이 틀리면 GG

    SRT(Shortest Remaining Time)방법은 SJF를 조금 바꾼 선점형 방법이다. 일단 요리를 시작하는데, 만약 지금 하고 있는 요리를 완성하는데 걸리는 시간보다 더 빨리 완성할 수 있는 요리의 주문이 들어오면 그걸 먼저 처리한다. 이건 SJF방법보다 요리사가 좀 더 부담스러운데, 계속해서 만드는 요리를 바꿔야 할 수 있기 때문에 머리털 쥐어 뜯게 만들 수 있다는 점이다.

    RR(Round Robin) 방법은 완전 잔머리 굴린 선점형 방법인데, 요리사가 일정 시간마다 계속해서 처리중인 요리를 바꾼다. 일정 시간이 지나면 순서대로 요리를 바꿔가면서 한다. 문제는, 재수없으면 모든 손님이 오래 기다릴 수 있다는 점이다. 그리고 마찬가지로 요리사가 머리가 좋아야 한다는 제약조건이 발생한다.

    그외에도 몇가지 방법이 더 있지만 생략한다.

    손님들의 주문이 몰려오다 보면 주방이 마비되는 일도 가끔 발생한다. 탕수육을 만들려면 가스렌지 위에 솥을 놓고 기름을 부어서 고기를 튀겨야 하는데, 밥을 하려면 가스렌지 위에 솥을 놓고 물을 끓여서 쌀을 익혀야 한다. 요리사 여러명이 하나의 솥을 놓고 쓰는데, 어떤 요리사가 솥에 기름을 넣고 가스렌지에서 기름을 데우면서 고기를 썰고 있는 사이에, 다른 요리사가 밥을 하겠다고 솥에 있는 기름을 버리고 물을 끓였다. 앞의 요리사가 고기를 썰어서 솥에 넣었더니 탕수육이 아니라 그냥 수육이 되어버렸다. 두 요리사가 싸우게 되고 손님은 무한정 기다리게 되는데, 이런 상황을 교착상태(Deadlock)라고 부른다. 식당 주인으로서는 제발 피하고 싶은 사태이다. 심정적으로는 눈물이 날 것이다.

    교착상태는 요리사가 여러명일 뿐만 아니라, 요리사가 한명이더라도 손님의 주문이 이상한 경우에 발생할 수 있다. 손님이 낙지 볶음과 돌솥 비빔밥을 주문했다고 하자. 돌솥 비빔밥을 만들려면 밥을 돌솥에 담고 야채와 고기를 넣고 고추장을 넣으면 된다. 근데, 요리사가 야채와 고기를 돌솥에 담아놓고 전기밥솥이 밥을 하는 사이에 요리사가 낙지를 볶았는데 고추장을 다 써 버렸다. 문제는 돌솥에 야채를 다 써버려서 낙지볶음을 완성시킬 수 없다는 것. 게다가 고추장을 다 써버렸으니 돌솥 비빔밥이라고 제대로 만들 수도 없다. 물론 이럴 때 현실의 요리사라면 낙지덮밥을 내놓는 비장의 수를 쓸 수 있겠지만 어쨌거나 주문대로 요리가 나오지 않았으니 고객 만족도는 떨어질 수밖에 없다.

    교착상태를 막으려면, 저런식으로 사용량이 제한된 자원은 계속 보충을 해줘야 한다. 또한, 만약 돌솥 비빔밥의 주문이 들어왔다면 돌솥 비빔밥을 만드는데 필요한 자원을 모두 모아놓고 다른데 쓰지 않는 전략이 필요하다. 이런식으로 일을 했다면 위의 요리사는 최소한 돌솥 비빔밥은 내갈 수 있었을 것이다.