2010년 12월 6일 월요일

flex 3.0 life cycle

대충 봤는데도 좋은거 같다.

정말로 궁금해 하던 부분을 긁어 주는거 같다.

2010년 11월 11일 목요일

[sicp] 1.17, 1.18

#lang scheme
(define (even? n)
  (= (remainder n 2) 0))

(define (double a )
   (double-iter a 2 0))

(define (double-iter a counter product)
  (if (= counter 0)
      product
      (double-iter a (- counter 1) (+ a product))))


(define (mod a div)
  (- (/ a div) (/ 1 div)))

;; 1.18
(define (fast-multi-iter a counter product result )
  (cond ((= counter 1) (+ product  result ) )
        (( even? counter) (fast-multi-iter a (/ counter 2)  (double product) result ))
        (else (fast-multi-iter a (mod counter 2) (double product) (+ result product ) ) )))
 
(define (* a b)
  (fast-multi-iter a b a 0 )
  )

 

 

 

;; 1.17
(define (fast-multi b n)
  (cond ((= n 0) 0)
        ((even? n) (double (fast-multi b (/ n 2))))
        (else (+ b (fast-multi b (- n 1))))))

 

ps. 1.18 을 답을 보니 나만 틀렸네 ㅡㅡ

잘못된 방법으로 풀었음 .

역시 난 ㅠㅠ

영어 어려워서 책 질렀음

2010년 11월 5일 금요일

[sicp] 1.16

;;; sicp 1.16
#lang scheme
(define (square x) (* x x))

(define (even? n)
  (= (remainder n 2) 0))

(define (fast-expt-iter b counter product)
  (if (= counter 0)
      product
     (if (even? counter)
         (fast-expt-iter b
                (/ counter 2)
                (* b  product product))
         (fast-expt-iter b
                (- counter 1)
                (* b product))
          )
         ))
(define (fast-expt b n)
 (fast-expt-iter b n 1))

(fast-expt 2 16)

 

이것도 들렸다 ㅠㅠ

2010년 10월 22일 금요일

[flex] 메뉴 간격 줄이기

http://blog.flexexamples.com/2010/02/19/setting-a-variable-row-height-on-an-mx-menubar-control-in-flex/comment-page-1/#comment-8471

 

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2010/02/19/setting-a-variable-row-height-on-an-mx-menubar-control-in-flex/ -->
<mx:Application name="MenuBar_menuShow_menu_variableRowHeight_test"
        xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        backgroundColor="white">
 
    <mx:Script>
        <![CDATA[
            import mx.events.MenuEvent;
 
            protected function mBar_menuShowHandler(evt:MenuEvent):void {
                evt.menu.variableRowHeight = ch.selected;
                evt.menu.invalidateSize();
            }
        ]]>
    </mx:Script>
 
    <mx:ApplicationControlBar dock="true">
        <mx:CheckBox id="ch" label="variableRowHeight" />
    </mx:ApplicationControlBar>
 
    <mx:MenuBar id="mBar"
            labelField="@label"
            menuShow="mBar_menuShowHandler(event);">
        <mx:dataProvider>
            <mx:XMLListCollection>
                <mx:XMLList xmlns="">
                    <menu label="File...">
                        <item label="New" />
                        <item label="Open" />
                        <item label="Save" />
                        <item label="Save As" />
                        <fake type="separator" />
                        <item label="Exit" />
                    </menu>
                    <menu label="Edit...">
                        <item label="Cut" />
                        <item label="Copy" />
                        <item label="Paste" />
                        <fake type="separator" />
                        <item label="Undo" />
                        <item label="Redo" />
                        <fake type="separator" />
                        <item label="radio button" type="radio" toggled="true" />
                        <item label="check box" type="check" toggled="true" />
                    </menu>
                </mx:XMLList>
            </mx:XMLListCollection>
        </mx:dataProvider>
    </mx:MenuBar>
 
</mx:Application>

2010년 10월 1일 금요일

[ActionScript] addEventListener시 파라미터 추가

현재 상황

  • 화면상에 여러개의 버튼과 textfield를 추가
  • script로 for문을 돌려서 실행하였고 그걸 다시 line 별로 같은 line의 textfield값의 받아서 처리 해야함
  • script에서 new로 button을 생성하다보니.. addEventListener 처리를 하다보니 받을 수 있는 값은 event 밖에 없음

처리 방법

  • button 상속후 버튼에 사용할 propeties 정의 setter/getter 추가
  • script에서 for문 이용해서 button 생성시 id값 넘겨줌
  • event 처리부에서 event.currentTarget.새로정의한properties 값 받아서 처리

[code]package custom
{
 import mx.controls.Button;  public class ExtendButton extends Button
 {
 
  private var _currentId:String;  public function ExtendButton()
  {
   super();
  }
 
  public function get currentId():String {
   return _currentId;
  }
  public function set currentId(currentId:String):void {
   _currentId = currentId;
  }
 
 
 }
}[/code]

 

위 처러 만든 후에

[code]var button:ExtendButton = new ExtendButton();
 for(var i:int=1;i<10;i++) {
  button.currentId = "a"+i;
 }
 
 button.addEventListener(MouseEvent.CLICK,function(event:MouseEvent):void{
  trace(event.currentTarget.currentId)
 });[/code]

 

이렇게 만들었음

 

------------------------------------------------------------------------------

여기서 부터는 질문

 http://blog.flashplatform.kr/tag/keep-generated-actionscript

 

위의 링크방식대로 한다고 하면

 

generated라고 옵션은 줘서 as 스크립트를 전부 만들어서 거기에서 추가적으로

 

처리를 해야지 처리가 가능한거지?? ㅡㅡ;;

 

아니면 안되는건지 알고 싶습니다.

 

 

2010년 9월 30일 목요일

[sicp] 1.13

Exercise 1.13.  Prove that Fib(n) is the closest integer to n/5, where = (1 + 5)/2. Hint: Let = (1 - 5)/2. Use induction and the definition of the Fibonacci numbers (see section 1.2.2) to prove that Fib(n) = (n - n)/5.
0 1 1 2 3 5 8
fin n = 1  ((1+ 5)/2 - (1-5)/2 )/5 => 5/5 => 1
fin n = 2  (((1+ 5)/2)^2 - ((1-5)/2 )^2)/5
=> ( (1+ 5)/2 - (1-5)/2 )( (1+ 5)/2 + (1-5)/2 ) ) /5
=> 5/5 => 1

#lang scheme
(define (fib n)
  (fib-iter 1 0 n))

(define (fib-iter a b count)
  (if (= count 0)
      b
      (fib-iter (+ a b) a (- count 1))))

(define A
 (/   (+ 1 (expt 5 0.5))
     2))

(define B
 (/   (- 1 (expt 5 0.5))
     2))

(define (fib2 n)
 (/ (- (expt A n)
    (expt B n))
   (expt 5 0.5)))

(fib2 1) = 1.0
(fib 1) = 1
(fib2 2) = 1.0
(fib 2) = 1
(fib2 3) = 2.0
(fib 3) = 2
...
(fib2 40) = 102334155.00000013
(fib 40) = 102334155
(fib2 50) = 12586269025.00002
(fib 50) = 12586269025
...
(fib2 60) = 1548008755920.003
(fib 60) =1548008755920
(fib2 70) = 190392490709135.44
(fib 70) = 190392490709135

(fib2 80) = 23416728348467744.0
(fib 80) = 23416728348467685

70까지는 거의 근접하고 1~ 3까지는 확실히 똑같다. 3 이후부터는 소수점이 많이 늘어난다.

2010년 9월 29일 수요일

[sicp] 1.12

Exercise 1.12.  The following pattern of numbers is called Pascal's triangle.

The numbers at the edge of the triangle are all 1, and each number inside the triangle is the sum of the two numbers above it.35 Write a procedure that computes elements of Pascal's triangle by means of a recursive process.


#lang scheme
(define (pascal_triangle a b )
  (cond
       ((= a b) 1)
        ((= a 2) 1)
         ((= b 1) 1)
       (else (+ (pascal_triangle (- a 1) (- b 2))
               (pascal_triangle (- a 1) (- b 1))))))


--------------------------------------------------------------------------------

;;; sicp 1.12
#lang scheme
(define (pascal_triangle a b )
  (cond
       ((< a b) '틀렸음)
       ((= a b) 1)
         ((= b 1) 1)
       (else (+ (pascal_triangle (- a 1) (- b 1))
               (pascal_triangle (- a 1) b)))))

 

수정함


[sicp] 1.11

Exercise 1.11.  A function f is defined by the rule that f(n) = n if n<3 and f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) if n> 3. Write a procedure that computes f by means of a recursive process. Write a procedure that computes f by means of an iterative process.

- recursive process
#lang scheme

(define (f n)
  (cond ((= n 0) 0)
       ((= n 1) 1)
       ((= n 2) 2)
       (else (+ (f (- n 1))
               (* 2 (f (- n 2)))
               (* 3 (f (- n 3)))) ) ) )

- iterative process
#lang scheme

(define (f-iter a b c count)
   (if (= count 0)
     c
        (f-iter (+ a (* 2 b) (* 3 c) )
               a   b  (- count 1) ) ) )
    
(define (f n )
(f-iter 2 1 0 n) )



2010년 9월 26일 일요일

1.10

Exercise 1.10.  The following procedure computes a mathematical function called Ackermann's function.

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

What are the values of the following expressions?

(A 1 10)

(A 2 4)

(A 3 3)


Consider the following procedures, where A is the procedure defined above:

(define (f n) (A 0 n))

(define (g n) (A 1 n))

(define (h n) (A 2 n))

(define (k n) (* 5 n n))

Give concise mathematical definitions for the functions computed by the procedures f, g, and h for positive integer values of n. For example, (k n) computes 5n2.


(A 1 10 ) 풀이

( A 1 10 )  = > 1024

( A 1 ( A 1 9) )  = 512

( A 1 ( A 1 (A 1 8 ) )  = 256

( A  1 ( A 1 ( A 1 (A 1 7 ) ) ) = 128

( A  1 ( A  1 ( A 1 ( A 1 (A 1 6 ) ) ) ) )

....

( A 1 .... ( * 2 1 ) )


(A 2 4 ) 풀이


( A 2 1 )  = > 1

( A 2 2 ) = >  4 -> 2^2

( A 2 3 ) = >  16 -> 2^(2^2)

( A 2 4 ) = >  65536 -> (2^(2^(2^2)))


1. f => 2n

(define (f n) (A 0 n)) 일때 A 함수를 따르면

x = 0 이므로 ( * 2 y )  이다.

답은 f(n) = 2n

2. g => 2^n


3. h => if n = 0 :  f(x) = 0

            if n = 1 :  f(x) = 2^1

            if n >= 2 : f(x) = 2^f(x-1)


 나오는 순서도는 생략 ㅡㅡ 너무 쓰기 힘듬 ...

2010년 9월 14일 화요일

eclispse monkey

[code javascript] /* * Menu: Actionscript > Convention Generator * Key: M3+1 * DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript * Author: Yi Tan * MoreInfo: http://code.google.com/p/yis-eclipse-monkey-scripts-for-flash-builder/ */ /** * [What's this] * This script automatically converts input to class properties. * * For example: * * Your enter: * -propertyName:n= * * It will be converted to: * private var propertyName:Number= 0; * * * [Shortcut Key] * * Alt + 1 * * [How to use] * * Pleae check the how to slides * * http://www.slideshare.net/halfmile/convention-generator-yis-eclipse-monkey-scripts-for-flash-builder * * [Change log] * * 2009/11/11 Fix bug: fail to parse property name when there is input for the data type * 2009/11/6 Add condition checking for nil selection * 2009/10/31 First version * */ var ACCESS_TYPE_PUBLIC = "+"; var ACCESS_TYPE_PRIVATE = "-"; var ACCESS_TYPE_PROTECTED = "*"; var ALL_ACCESS_TYPES = "+-*"; var ACCESS_TYPES = {"+":"public", "-":"private", "*":"protected"}; var MEMBER_TYPE_METHOD = "method"; var MEMBER_TYPE_PROPERTY = "property"; var DATA_TYPE_DEFAULT_VALUES = { "Object":"{}", "String":'""', "Boolean":"false", "Array":"[]", "Number":"0", "int":"0", "uint":"0", "Vector":"new Vector.<>()", "XML":'""' }; var DATA_TYPE_ABBRES = { "o":"Object", "s":"String", "b":"Boolean", "a":"Array", "n":"Number", "i":"int", "u":"uint", "v":"Vector", "x":"XML" } function main() { var editor = editors.activeEditor var source = editor.source if (!editor.selectionRange) return; var range = editor.selectionRange; var offset = range.startingOffset; var text = (offset == range.endingOffset)? editor.source.split(editor.lineDelimiter)[editor.getLineAtOffset(editor.currentOffset)].replace(/^\s+|\s+$/g, ''): source.substring (offset, range.endingOffset); if (range.startingOffset == range.endingOffset) // when there is no selection offset -= text.length; if (text.length < 1) { alert("Please select your input."); return; } // auto TODO if (text == "td") { editor.applyEdit(offset, range.endingOffset - offset, "// TODO: Need Implementation "); return; } // detect property type var memberType = (text.search(/\(\)/) != -1) ? MEMBER_TYPE_METHOD : MEMBER_TYPE_PROPERTY; // add default access type if (ALL_ACCESS_TYPES.indexOf(text[0]) == -1) text = "+"+text; switch(memberType){ case MEMBER_TYPE_METHOD: // result = generateMethod(text); text = text.replace(text[0], ACCESS_TYPES[text[0]] + " function "); var dataType = text.match(/\:\w+/) if(! dataType) { text += ":void"; } else { dataType = dataType[0].replace(":",""); // parse data type abbrevations if (dataType.length == 1) { var fullDataType = DATA_TYPE_ABBRES[dataType.toLowerCase()] || dataType; // alert("fullDataType :"+fullDataType ); text = text.replace(":"+dataType, ":"+fullDataType); } } text += "\n{\n\n}" ; break; case MEMBER_TYPE_PROPERTY: // get propertyName and data type if(text.indexOf(":") != -1) { var propertyName = text.match(/\w+\:/)[0].replace(/\:/,""); var dataType = text.match(/\:\w+/)[0].replace(":",""); } else { // no input for data type var propertyName = text.match(/\w+/)[0]; var dataType = "* "; } // append declaration var declaration = " var "; if (text.indexOf("$$") != -1) // $$ -> static const { declaration = " static const "; text = text.replace(propertyName, propertyName.toUpperCase()); text = text.replace("$$", ""); } else if(text.indexOf("$") != -1) // $ -> static { declaration = " static var "; text = text.replace("$", ""); } text = text.replace(text[0], ACCESS_TYPES[text[0]] + declaration); // parse data type abbrevations if (dataType.length == 1) { var fullDataType = DATA_TYPE_ABBRES[dataType.toLowerCase()] || dataType; // alert("fullDataType :"+fullDataType ); text = text.replace(":"+dataType, ":"+fullDataType); dataType = fullDataType; } // append default value if required if (text.lastIndexOf("=") == text.length -1 ) { var defaultValue = DATA_TYPE_DEFAULT_VALUES[dataType] || "null" ; text += " "+defaultValue; } if (text.lastIndexOf("n") == text.length -1 ) { var defaultValue = DATA_TYPE_DEFAULT_VALUES[dataType] || " new "+dataType+"()" ; text = text.substr(0,text.lastIndexOf("n"))+defaultValue; } text += ";"; // auto getter and setter if(propertyName[0] == "_") { // alert("// auto getter and setter"); var accessorName = propertyName.substr(1); text += "\n\t\tpublic function get " + accessorName + "():" + dataType + " {"; text += "\n\t\t\treturn " + propertyName + ";"; text += "\n\t\t}\n\n"; text += "\t\tpublic function set " + accessorName + "("+accessorName+":" + dataType + "):void {"; text += "\n\t\t\t" + propertyName + " = "+accessorName+";"; text += "\n\t\t}\n"; } break; } // var result = "public static const " + text + ":String = '" + text.toLowerCase() + "';"; editor.applyEdit(offset, range.endingOffset - offset, text); } [/code] 원래 출처: http://code.google.com/p/yis-eclipse-monkey-scripts-for-flash-builder/
원본 저자: Yi Tan (yi2004@gmail.com)

eclipse monkey

몇가지 불편한거 추가..

setter/getter 이상한거 수정
property:Type= n -> 실행시
property:Type= new Type(); 으로 변환 되는 기능 추가

2010년 9월 10일 금요일

[flex] ContextMenu 기능 정리

1. ContextMenuItem 추가시에 사용하는 이름이 동일하면 한개만 출력된다.

2. ContextMenuItem 추가시에 사용하는 이름이 "삭제","Del" 이런거 전부 안된다.

 

위의 내용들은 디버거 써도 에러도 잡히지도 않는다. ㅡㅡ

 

이걸로 며칠을 고생했는지 ㅠㅠ

 

슬프다.

2010년 8월 12일 목요일

[struts2] struts2 poi excel result

struts2에서 excel를 출력할 경우가 있는데

인터넷 검색결과 내가 하고 싶은 방식으로 되어 있는 소스가 없었다.

 

그래서 spring mvc abstractExcelView를 참고해서 struts2용 AbstractView를 만들었다.

 

 

[code java]package pmis.common.excel; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Result; import com.opensymphony.xwork2.util.ValueStack; public abstract class AbstractExcelResult implements Result { /** The content type for an Excel response */ private static final String CONTENT_TYPE = "application/vnd.ms-excel"; /** The extension to look for existing templates */ private static final String EXTENSION = ".xls"; private String url; public void setUrl(String url) { this.url = url; } @Override public void execute(ActionInvocation invocation) throws Exception { try { HSSFWorkbook workbook; HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); String requestURI = request.getRequestURI(); workbook = new HSSFWorkbook(); buildExcelDocument(invocation.getStack(), workbook, ServletActionContext.getRequest(), ServletActionContext.getResponse()); // Set the content type. response.setContentType(CONTENT_TYPE); response.setHeader("Content-disposition", "attachment;filename="+StringUtils.defaultIfEmpty(url, StringUtils.substring(requestURI,StringUtils.lastIndexOf(requestURI, "/"), StringUtils.indexOf(requestURI, ".")))+EXTENSION); ServletOutputStream out = response.getOutputStream(); workbook.write(out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } protected abstract void buildExcelDocument( ValueStack valueStack, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception; protected HSSFCell getCell(HSSFSheet sheet, int row, int col) { HSSFRow sheetRow = sheet.getRow(row); if (sheetRow == null) { sheetRow = sheet.createRow(row); } HSSFCell cell = sheetRow.getCell(col); if (cell == null) { cell = sheetRow.createCell(col); } return cell; } } [/code]

 

위의 소스를 확장해서 각각의 페이지별로 Excel를 만들때는

 

 

[code java]package pmis.system.loginstat; import java.math.BigDecimal; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import pmis.common.excel.AbstractExcelResult; import com.opensymphony.xwork2.util.ValueStack; public class LoginStatExcelResult extends AbstractExcelResult { @Override protected void buildExcelDocument(ValueStack valueStack, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //여기에 구현 } } [/code]

 

그리고

xml 페이지에선

result type 선언

[code xml] [/code]

 

action 선언에선

[code xml] [/code]

2010년 8월 9일 월요일

[sicp] 1.9

1.9

첫번째 : iterative

a : counter

b : product

a가 1 감소할때마다 b는 1씩 증가해서 a가 0이 되면 b는 결과 출력

[code] #lang scheme (define ( inc a ) (- a -1)) (define (dec a) (- a 1)) (define (+ a b) (if (= a 0) b (+ (dec a) (inc b)))) (+ 4 5) [/code]
erlang 버젼
[code] -module(iterative). -export([inc/1,dec/1,plus/2]). inc(A)->A+1. dec(A)->A-1. plus(0,B) -> B; plus(A,B)-> plus(dec(A),inc(B)). [/code]
두번째 : recursive

전형적인 재귀
a가 1씩 감소할떄마다 재귀호출를 1번씩 해서 총 a가 감소만 만큼 재귀호출한 후에
a만큼 다시 더하는 방식

[code] #lang scheme (define ( inc a ) (- a -1)) (define (dec a) (- a 1)) (define (+ a b) (if (= a 0) b (inc (+ (dec a) b)))) (+ 4 5) [/code]

2010년 8월 3일 화요일

[scala] Scala에서 사용하는 Actor가 ...

http://codemonkeyism.com/actor-myths/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+stephansblog+%28Code+Monkeyism+%7C+Stephans+Blog%29

 

항상 thread safe 하지 않다는 내용이다.

 

Erlang부분까지는 기억이 안 나는데 연결된 링크까지 가서 보게 되면

 

scala에서 사용하는 Actor 모델은 결코 deadlock에 안전하지 않다는 내용이다.

 

정확하게 읽으신 분들이 태클 부탁드립니다.

2010년 6월 24일 목요일

sms

private Cursor getItemsToSync() { 
        ContentResolver r = getContentResolver(); 
        String selection = String.format("%s > ? AND %s <> ?", 
                SmsConsts.DATE, SmsConsts.TYPE); 
        String[] selectionArgs = new String[] { 
                String.valueOf(getMaxSyncedDate()), String.valueOf(SmsConsts.MESSAGE_TYPE_DRAFT) 
        }; 
        String sortOrder = SmsConsts.DATE; 
        return r.query(Uri.parse("content://sms"), null, selection, selectionArgs, sortOrder); 
    } 

2010년 2월 23일 화요일

[소설] 이름 없는 독

난 이번이 미야베 미유키님의 작품이 두번째 이다. 다른 사람들은 모방범이란 작품에서 많이 시작을 할지도 모르겠지만

그냥 중고로 산 책들이 이 책들이라서 보게 되었다. 이 책을 사게 된 이유를 들자면 모방범의 작가고 약간은 책의 제목이 자극적이라서 사게

됐다. 모방범의 설명을 보면 미사여구와 함께 엄청난 추리소설 작가처럼 써져 있어서 사게 됐는데 모방범을 보지 않아서 전체적인걸 판단은

못하겠다. 하지만 지금까지 두권의 작품을 읽었지만 내가 읽은 작품만 그런건지 이 작가의 세계관이 그런지 두 작품들의 내용들이 결코 쉬운

내용들은 아니었다. 스나크 사냥에서도 인간의 본성이라고 할까 하는 부분에 대해서 약간은 쓴거 같기도 하다. 이번 작품에서 예전의 내가 들

은 얘기가 있었다. 사람들에겐 분노를 하게 되면 볼 수는 없지만 분노의 에너지가 발생되고 누군가를 미워하게 되면 미움의 에너지가 발생해

서 미워하는 사람도 다치게 되지만 그 전에 우선은 자신부터 몸이 안 좋아진다고 그래서 결코 누군가를 너무 미워하지 말아야 한다.

이 책의 내용이 내가 들었던 내용들을 위주로 해서 쓰여져 있다. 이 책의 제목과 앞부분만 읽고 나서는 이 작가를 잘몰랐던 나는 아~ 이번에

뭔가 독살로 인해 이 연쇄 살인사건이 있고 이것에 대한 실마리를 풀어나가는게 책의 줄거리라고 생각을 했다.

하지만 읽으면 읽을 수록 사건이 해결되어가고 인물들의 관계가 밝혀지고 서로간의 관계를 알게되면서 그런 생각들은 산산조각이 점점 나

버리게 되었다. 우선은 이 책은 절대로 기존의 추리 소설의 관점에서 보면 안되는 작품이다.

 이 책은 단순하게 흥미위주로 볼 책이 아니다. 사회의 어두운 부분에 대해서 그 사람들의 생각을 조금씩 내 놓는거 같다. 마지막에 가다보

면 정확하진 않지만 주인공이 이런 이야기를 한다. 그사람은 자신의 내부의 독을 주체하지 못해서 남에게 독을 분출했지만 이 분출한

독으로 인해서 자기 자신에게 다시 더 큰 독이 되어서 고통스럽게 된다. 이 부분이 작가가 얘기 하고 싶은게 아닐까도 싶다.

책의 제목과도 비슷하고 눈에는 보이지 않지만 자신의 내부속에서 쌓여져 있는 분노들과 생각들에 대한 이야기들이 이 책에서 계속해서 나

왔다. 우리 주변에도 점점 사람들의 관계가 소홀해지고 서로 이웃에 누군가 살지도 모르는 부분들을 보면 점점 이름 없는 독을 쌓아 가는

사람들이 많아 지는 걸지도 모르겠다.

이 책을 봤다고 해서 다음엔 좀 사회에 관심을 가져야 할지도 모르겠지만 난 당장의 내가 먹고 살기가 힘들기 떄문에 패스다. ^^;;

암튼 이 책을 읽고 나니 그렇게 기분이 좋다고 할 수는 없다. 책의 내용도 어렵고 뒤끝도 그렇게 재미있다고 할 수는 없고

잠깐의 여운만이 나에게 남는 작품이었던거 같다.