2008년 2월 11일 월요일

읽고싶은 책 목록

보고 싶은 책 목록 (또는 소유하고 싶은 책 목록 ^^;;;)
로마: 고대 문명의 역사와 보물(세계 10대 문명사 3)(양장본) 상세보기
마리아 테레사 구아이톨리 지음 | 생각의나무 펴냄
눈앞에서 펼쳐지는 로마 문명의 박물관 세계 10대 문명을 생생한 도판으로 소개하는『세게 10대 문명사』시리즈. 세계적인 출판사인 이탈리아의 화이트스타와 공동으로 제작한 대형 판형의 자료집으로, 폭넓고 깊이 있는 설명과 화려하고 생생한 사진을 제공한다. 아울러 연대기적 구성을 통해 역사에 대한 이해를 돕고, 문명권 지도를 통해 공간적인 이해를 돕는다. 제3권 <로마>에서는 로마 문명의 역사를 살펴본다.

비잔티움 연대기 SET(전3권) 상세보기
존 줄리어스 노리치 지음 | 바다출판사 펴냄
<비잔티움 연대기>는 330년부터 1453년까지 인류 역사상 가장 오래 지속된 비잔티움 제국 1123년의 역사를 살펴보는 책이다. 서구의 주류 역사가들은 왜곡과 침묵으로 비잔티움 제국을 역사의 공백으로 만들었다. 동방적 색채가 강했던 비잔티움 제국이 로마의 정통성을 계승했음을 인정하지 않았던 것이다. 이 책은 그동안의 풍토를 깨고 비잔티움 제국 천년의 역사를 되찾고자 했다. 저자는 천년제국 비잔티움을 다스린 88

성경 왜곡의 역사 상세보기
바트 어만 지음 | 청림출판 펴냄
성경을 둘러싼 치열한 논쟁과 우리가 알지 못했던 성경 왜곡과 오기의 역사를 검토하는 책. 고대 사회의 필사 관행들, 필사 과정에서 일어날 수 있었던 오기의 예들, 오기가 일어날 수밖에 없었던 필연적인 이유들, 오기의 결과로 생겨난 다양한 이문들, 후대에 삽입된 본문들 등을 설득력 있게 제시하고 있다. 또한 흩어져 있는 사본들을 찾아 원본을 회복하기 위해 노력하는 사람들을 소개하면서, 그 사람들이 가장 이른 시기의

하느님의 이력서 상세보기
장 루이 푸르니에 지음 | 예담 펴냄
천지창조를 마치고 지루해진 하느님, 지구여행을 떠나다! 프랑스에서 소설가, 방송작가 겸 감독으로 활동하는 장 루이 푸르니에 장편소설. 천지창조를 끝내고 할 일이 없어진 하느님이 지상에서 직장을 구하기 위해 한 대기업 인사부장과 입사면접을 치르는 일주일간의 이야기를 재미있게 그려내고 있다. 하느님의 재치있는 답변을 통해 환경오염, 자연재난, 외모지상주의 등 현실에서 벌어지는 다양한 현상을 유쾌하게 풍자하

이집트: 고대 문명의 역사와 보물(세계 10대 문명사 1)(양장본) 상세보기
조르조 페레로 지음 | 생각의나무 펴냄
눈앞에서 펼쳐지는 이집트 문명의 박물관 세계 10대 문명을 생생한 도판으로 소개하는『세계 10대 문명사』시리즈. 세계적인 출판사인 이탈리아의 화이트스타와 공동으로 제작한 대형 판형의 자료집으로, 폭넓고 깊이 있는 설명과 화려하고 생생한 사진을 제공한다. 아울러 연대기적 구성을 통해 역사에 대한 이해를 돕고, 문명권 지도를 통해 공간적인 이해를 돕는다. 제1권 <이집트>에서는 이집트 문명의 역사를 살펴

이노베이션 신화의 진실과 오해 상세보기
스콧 버쿤 지음 | 한빛미디어 펴냄
전화기에서 구글에 이르기까지 신화를 만드는 이노베이션의 공식을 배운다! 『이노베이션 신화의 진실과 오해』는 주변에서 목격할 수 있는 '비약적 발명'들에 대해 사람들이 흔히 갖고 있는 신비감을 제거해줄 의도로 기획된 책이다. 그 신화를 깨기 위해, 저자는 우리가 어렸을 적 읽었던 세계위인전집에 늘 등장했던 위인들이 이뤄낸 발명이나 발견에 얽힌 신비를 벗겨낸다. 뿐만 아니라 역사적 보물 그리고 검색 기술의 지

집단지성 프로그래밍 (예약판매) 상세보기
토비 세가란 지음 | 한빛미디어 펴냄
검색&amp;랭킹, 추천시스템, 소셜 북마킹, 온라인 짝짓기 뒤에 숨겨진 원리로 '집단지성'이란 새 영역 소개! 『집단지성 프로그래밍』은 알고리즘 동작원리와 알고리즘이 데이터를 분할하는 방법을 알려주며, 방대한 데이터를 보다 쉽게 처리하기 위해 필요한 계산 기법을 친절히 설명한다. 본문에 등장하는 예제 코드는 파이썬(python)으로 작성되었으나 다른 언어 프로그래머도 이해할 수 있게 모든 알고리즘에 설명을 붙였다



2008년 2월 6일 수요일

Graphviz

Graphviz(Graph Visualization Software)
Graphviz를 처음 접하게 된 것은 Doxygen 때문이었습니다. Java로 프로그램을 문서화할 때 클래스 다이어그램을 짚어넣어 주었으면 하는 바램으로 여러 툴을 찾아봤었는데 당시에는 Doxygen 밖에 없더군요. Doxygen에서는 그래프를 그려주기 위해서 이 Graphviz를 사용하고 있구요.

Introduction
요즘에 만들고 있는 JavaScript Bulid 툴(실제로는 JsDoc-toolkit과 JsLint, YUI-Compressor 등을 한 번에 구동하는 php 프로그램입니다.)에 클래스 다이어그램이 있으면 좋겠다는 개인적인 생각에, Graphviz를 다시 보게 되었습니다.
사용자 삽입 이미지

Wikipedia의 소개에 따르면,
  • Graphviz는 AT&T의 연구소에서 DOT 스크립트 언어를 사용하여, 다이어그램을 그리기 위해서 만들어진 프로그램이라고 합니다.
  • 오픈소스이며, CPL(Common Public License)를 사용하고 있습니다.
  • 다른 소프트웨어에서 라이브러리로 사용할 수 있는 기능도 제공되고 있습니다.
Graphviz는 그래프를 묘사하는 언어인 DOT language를 사용하여 Graph를 정의하고 이 정의한 내용을 필터를 통해서 다양한 이미지 포멧으로 생성하게 됩니다.

Usage
1. Graphviz를 사이트에서 다운로드하여 설치한 후에, GVedit을 실행하면 다음과 같은 창이 뜹니다.
사용자 삽입 이미지

2. File > New 또는 툴바의 세번째 아이콘(New File)을 클릭해서 Graphviz 새 창을 띄웁니다. 다음과 같이 입력 합니다.
사용자 삽입 이미지

3. Graphviz Settings 창을 띄워서 Layout Engine과 출력 파일에 대한 내용을 입력하고 OK 버튼을 누릅니다.
(레이아웃 엔진은 dot- command line tool, neato-undirected graph, twopi-radial graph, circo-circular graph, fdp, dotty, lefty 을 사용할 수 있습니다.)
사용자 삽입 이미지

4. 생성된  Graph를 확인한 후 이미지로 저장합니다. (dot을 레이아웃 엔진으로 사용하는 경우, undirected graph의 선이 그려지지 않는군요.)
사용자 삽입 이미지

DOT language
DOT 언어는 다이어그램을 정의하는 언어로 graphs, nodes, edges들을 정의할 수 있습니다. 그래프의 레이아웃은 크게 방향성 그래프(directed graph)와 비방향성 그래프인(undirected graph) 두가지로 나눌 수 있습니다. 각각은 digraph, graph 명령어를 사용하여 정의할 수 있습니다.

dot 레이아웃 엔진을 사용하게 되면 directed graph를 그릴 수 있고, neato를 사용하게 되면 undirected graph를 그릴 수 있습니다. 제가 본 튜토리얼이 dot을 사용하기 때문에, 모든 그래프는 digraph를 사용합니다.

directed graph의 간단한 사용 예제
// digraph는 방향성 그래프를 정의, digraph 뒤의 값은 그래프의 이름입니다.
digraph
GraphName {
    main -> parse -> execute;
    main -> init;
    /* 주석은 일반적인 주석 모두 동작합니다. */
    main -> cleanup;
    execute -> make_string;
    // 방향 선은 항상 '->' 붙여져서 선언되어야 합니다. '- >' 로 선언되면 처리가 안됩니다.
    execute -> printf;
    init -> make_string;
    main -> printf;
    execute -> compare;
}
결과:
사용자 삽입 이미지


 1. Node and Edge
Node의 디폴트 값은 shape=ellipse, width=.75 height=.5로 값이 설정되며, node의 이름이 label이 됩니다.
shape에 들어갈 수 있는 다른 값들은 box, circle, record, plaintext 등이 있습니다.

Node는 크게 두 종류의 도형으로 나뉠 수 있습니다. 하나는 다각형 기반(Polygon-based)의 도형과 리코드 기반(Record-based) 도형 두 가지로 나뉩니다.

1-1. Node와 관련된 기본적인 문법을 사용하는 경우
digraph GraphName {
    // graph의 크기를 설정합니다.
    size="3,3";

    // 전체 노드들에게 Verdana 폰트를 사용하도록 설정합니다.
    node [fontname="Tahoma", fontsize="10"];

    // main의 shape을 정의합니다.
    main [shape=box;];    

    // (integer)weight는 node와 node 사이의 간격을 정합니다.
    main -> parse [weight=0];   
    parse -> execute;

    // main과 init을 잊는 edge 스타일을 정의합니다. bold, filled 등의 값 설정 가능.
    main -> init [style=dotted];
    main -> cleanup;

    // execute->make_string;execute->printf;를 한 번에 표기합니다.
    execute -> {make_string; printf};
    init -> make_string;

    // label 설정 및 peripheries(표면)을 두 개의 선으로 처리합니다.
    // label의 값은 escape string처리됩니다. 공백도 '\ '로 입력해야 합니다.

    make_string [label="make a\n string",peripheries=2];

    // 이하로 설정되는 edge의 색을 red로 설정합니다.

    edge [color=red];

    // main과 printf를 잊는 edge의 label을 설정합니다.
    main -> printf [style=bold,label="100 times",fontname="arial"];

    // node의 도형을 설정합니다. 위에 설정된 node 값에 대한 설정은 상속
    node [shape=box,style=filled,color=".7 .3 1.0"];
    execute -> compare;
}
위의 다이어그램으로 생성한 결과는 다음과 같습니다.
사용자 삽입 이미지

Shape에 관한 기본적인 내용을 보시려면 여기, "Node Shapes" 항목을 참조해서 보시면 되고, Node, Edge, Graph에 설정할 수 있는 세부 속성들을 보시려면 여기, "Node, Edge and Graph Attributes"를 보시면 됩니다.

1-2. shape이 polygon인 여러 도형을 정의하는 경우
digraph G {
    // lightblue로 채워져 있고 3개의 선으로 둘러싸인 오각형 도형을 정의
    a [shape=polygon,sides=5,peripheries=3,color=lightblue,style=filled];
    // 사각형이나 40도 정도 기울어진 hello world 레이블을 가진 도형
    c [shape=polygon,sides=4,skew=.4,label="hello world"];
    // 엎어진 삼각형
    d [shape=invtriangle];
    // 아래 쪽으로 들어간, 뒤틀린 사각형
    e [shape=polygon,sides=4,distortion=.7];
    a ->b ->c;
    b ->d;
}
1-2의 예제의 결과
사용자 삽입 이미지
  2. Labels
node의 shape이 record와 Mrecord의 label을 사용하여서 shape 내부에 수직 또는 수평의 box를 넣을 수 있습니다.
  • label의 값을 구분하는 필드로 |를 사용할 수 있습니다. 연속하여 사용가능
    rlable -> field('|'field)*
  • 수직/수평의 방향은 {}를 사용하여 정의할 수 있으며, 중첩해서 선언이 가능합니다.
  • label 앞에 <>로 된 boxlabel을 선언할 수 있습니다.
    field->boxLabel|"rlabel"
    boxLabel -> ['<'string'>'][string]
digraph G {
     struct1 [shape=record, label="<f0> left|<f1> mid\ dle|<f2> right"];
    struct2 [shape=record, label="<f0> one|<f1>two"];
    // Mrecord는 모서리가 둥근 것을 제외하고는 record와 동일
    struct3 [shape=Mrecord, label="hello\nworld|{b|{c|<here> d|e}|f}|g|h"];
    struct4 [shape=record,
        label="{className|method1\nmethod2|property1\nproperty2}"]
    struct1 -> struct2;
    struct1 -> struct3;
    struct1:f2 -> struct4;
    left_indicator -> struct1:f0;
    right_indicator -> struct1:f2;
}
위 label의 결과는 다음과 같습니다.
사용자 삽입 이미지

 label을 이용하여 클래스 다이어그램 만들기 [예제 출처: UML Diagrams Using Graphviz Dot]
digraph G {
    // graph의 폰트 정의
    fontname = "Bitstream Vera Sans"
    fontsize = 8

    // node 공통의 폰트, shape 정의
    node [
        fontname = "Bitstream Vera Sans"
        fontsize = 8
        shape = "record"
    ]

    // edge 공통의 폰트, shape 정의
    edge [
        fontname = "Bitstream Vera Sans"
        fontsize = 8   
    ]

    // Anaimal node 정의 \l을 사용하여 label의 align 정의
    // \r을 사용하면 right align이 됩니다.
    Animal [
        label = "{Animal|+ name : string\l+ age : int\l|+ die() : void\l}"
    ]

    // subgraph clusterAnimalImpl 정의
    subgraph clusterAnimalImpl {
        // subgraph의 label을 정의합니다.
        label = "Package animal.impl"

        //Dog 클래스를 정의
        Dog [
            label = "{Dog||+ bark() : void\l}"
        ]
       
        // Cat 클래스를 정의
        Cat [
            label = "{Cat||+ meow() : void\l}"
        ]
    }

    // cluster 내에서 사용할 edge를 정의
    edge [
        arrowhead = "empty"
    ]

    Dog -> Animal
    Cat -> Animal

    // Dog에서 Cat으로 가는 edge를 정의
    edge [
        arrowhead = "none"
        // edge의 head/tail의 label을 정의
        headlabel = "0..*"
        taillabel = "0..*"
    ]
    Dog -> Cat
}
결과값
사용자 삽입 이미지
관련자료:

2008년 2월 5일 화요일

Rhino - JavaScritp for Java

사용자 삽입 이미지

Rhino는 Java만 사용하여서 JavaScript를 구현한 오픈소스입니다. 세부 특징은 다음과 같습니다.
  • ECMA-262 edition3를 구현 - Rhino 1.5 부터
  • ECMA-357 ECMAScript for XML (E4X구현) - Rhino 1.6 부터
  • JavaAdapter구현 (JavaScript에서 Java로 접근할 수 있는 어댑터, Java의 모든 클래스에 접근가능)
  • Java 1.4 이상 버전이 필요하며, SUN의 JVM에서만 테스트 되어있습니다.
관련 링크들
P.S>
jsdoc toolkit (JavaScript Toolkit)에서는 JavaScript Documentation을 생성하기 위해서 Rhino를 사용하고 있습니다. 소스 코드에서 JsIO.js를 보시면 Rhino를 사용하여서 어떻게 파일 입출력을 하는 지를 살펴보실 수 있습니다.

2008년 2월 4일 월요일

전문가들의 발표자료는 이렇게 다르구나 -_-;;;;;

LukeW님의 VizThink 08: Visualizing the Presentation Ecosystem라는 글이 올라와서 읽었습니다.
VizThink 2008에서 Nancy Duarte이 발표한 "Visualizing the Presentation Ecosystem"이라는 세션에 관한 글인데요. 발표자료를 만드는 사람들을 대상으로 시각적인 요소들을 사용하여 어떻게 효과적으로 이야기를 전달할 지에 대한 강의 였다고 합니다.

사용자 삽입 이미지

Nancy Duarte 님이 만든 Al Gore의 키노트입니다.

시간이 되시는 경우, "Visualizing the Presentation Ecosystem"로 가셔서 Al Gore의 키노트 한 번 보시기를 추천합니다.

그런데, 전문가가 만들어서 그런지.... 대충 보기만 하였는데도 어떤 이야기를 하려는건지 바로 감이 오네요 -_-;; (역시, 공돌이들이 백날 만들어봤자 소용없다니까;;;;;;;;;;;;;;)

출처: VizThink 08: Visualizing the Presentation Ecosystem

P.S.1> VizThink 08: Visualizing the Presentation Ecosystem의 pdf자료도 유용하게 쓸 수 있을 것 같네요.
P.S.2> 고민을하다.. 자료를 캡쳐해 버렸습니다. 저작권은 Nancy Duarte님에게 있습니다.

more..

2008년 2월 3일 일요일

YUI - compressor

사용자 삽입 이미지
YUI Compressor는 Yahoo의 UI Library 중 하나로 javascript와 css 파일 크기를 최소화 시킴으로서 js,css 파일의 다운로드 속도를 개선하게 해주는 라이브러리입니다. YUI Compressor에서 줄 수 있는 옵션들은 다음과 같습니다.
  • js/css 모두에 사용할 수 있는 글로벌 옵션들
    • -h, --help : 도움말을 출력합니다.
    • --line-break <column>: 압축을 하는 경우 한 줄로 파일이 생성되게 되는데, 다음과 같은 이유로 특정  컬럼뒤에 line break를 삽입해 줍니다.
      1. 이렇게 압축된 파일은 읽기에도 불편할 뿐더러
      2. 디버깅하기 어려운 문제를 가지고 있습니다.
      3. 특정 소스 컨트롤 툴에서 문제가 될 수 있습니다.
    • --type <js|css>: YUI Compressor에서는 압축하는 파일의 확장자를 기반으로 js|css를 선택해서 압축하고 있습니다. 그러나, 입력 파일이 명시되지 않을 때나 확장자가 js 또는 css가 아닌 경우 사용되어야 합니다.
    • --charset <charset>: 입력 파일을 읽을 때 사용되난 charset입니다. 해당 옵션이 선언되지 않은 경우에 사용되는 플랫폼의 기본 charset을 사용하며, 출력 charset에도 동일한 charset이 사용됩니다.
    • -o <file>: 출력 파일을 지정합니다. 옵션이 선언되지 않은 경우 YUI Comressor의 기본 출력 폴더로 압축파일을 내보내게 됩니다.
    • -v, --verbose: 압축 시 발생하는 정보성 또는 경고 메시지를 출력하게 합니다.
  • js에서만 사용가능한 옵션들
    • --nomunge: 공백 제거만을 사용하며 로컬의 변수들의 이름을 변경하여 크기를 줄이는 obfuscation을 사용하지 않습니다.
    • --preserve-semi: 불필요한 세미콜론들을 삭제하지 않고 유지시킵니다. 예를 들면 } 바로 앞에 위치한 ;을 삭제하지 않고 유지시킵니다.
    • --disable-optimizations: built-in micro optimization을 사용하지 않습니다.
※ 2.3.1에 오면서 --warn 옵션과 --preserve-strings 옵션이 없어졌네요.

사용법
Usage: java -jar yuicompressor-x.y.z.jar [options] [input file]
[options]에는 위의 옵션들 중 필요한 사항들을 입력하시면 되고, [input file]에는 압축할 파일을 입력하시면 됩니다. 출력 파일은 [input file] 뒤에 입력해 주시면 되구요. yuicompressor-x.y.z의 x.y.z는 빌드 넘버입니다. 다운 받은 jar파일의 버전에 맞게 바꿔 주시면 됩니다.

사용 예
C:\java -jar -jar yuicompressor-2.3.1.jar --charset utf-8 --line-break 100 -v --preserve-semi C:\sample.js -o C:\dst\sample.js
- 저의 경우 2.3.1을 다운 받고, utf-8 설정과 100 컬럼당 라인 브레이크 추가 경고문 출력, 세미콜론을 보호하는 옵션을 주었습니다.

관련자료:
  • YUI Compressor - BSD License를 사용하고 있습니다. Java 1.4 이상의 버전을 필요로 합니다.


PHP 파일처리

파일과 관련된 PHP 함수 정리
1. file_exists []
파일을 옮기거나, 복사하거나 파일의 내용을 읽을 때, 파일이 존재하는 지 여부를 체크하는 함수
bool file_exists ( string $filename )
$filename은 파일의 경로와 이름을 인자로 받으며, $filename이 유효한지 여부를 리턴합니다.

2. file Information를 얻고 싶을 때
  • array stat ( string $filename ) [] - 파일의 통계정보를 리턴
  • string filetype ( string $filename ) [] - 파일타입을 리턴합니다. 리턴되는 타입은 fifo, char, dir, block, link, file, socket and unknown 이 리턴됩니다.
  • int filesize ( string $filename ) [] - 파일크기를 리턴합니다.
  • bool is_readable ( string $filename ) [] - 인자로 받은 파일을 읽을 수 있는 지 여부를 리턴합니다.
  • bool is_writable ( string $filename ) [] - 인자로 받는 $filename이 존재하고 쓸 수 있는 경우에 true를 리턴합니다.
  • bool is_executable ( string $filename ) [] - 파일이 실행될 수 있는 지 여부를 리턴합니다.
3. Reading Files, 파일을 읽고 싶을 때
<?php
  $filename = "sample.txt";
  $fileArr = file($filename);
  // or
  $fileStr = file_get_contents($filename);
?>
  • array file ( string $filename [, int $flags [, resource $context ]] ) [] - 전체 파일의 내용을 배열형태로 리턴합니다.
  • string file_get_contents ( string $filename [, int $flags [, resource $context [, int $offset [, int $maxlen ]]]] ) [] - 전체 파일의 내용을 string으로 리턴합니다.
file_get_contents()가 없는 오래된 PHP에서는 fread를 사용하여서 파일을 읽을 수 있습니다.
<?php
  $filename = "sample.txt"
  $fp = fopen($filename, "rb") or die("fopen failed");
  // 전체 파일을 읽을 때
  $fileStr = fread($fp, filesize($filename));

  // 또는 네트웤을 통해서 파일을 단위별로 읽어들일 때
  while(!feof($fp)) {
    $fileStr .= fgets($fp, 1024);
  }
  fclose($fp) or die("fclose failed");
?>
  • resource fopen ( string $filename , string $mode [, bool $use_include_path [, resource $context ]] ) [] - 파일을 열고 파일 스트림을 리턴합니다.
  • string fread ( resource $handle , int $length ) [] - 인자로 받은 $handle 파일의 내용을 $length만 큼 읽어들입니다.
  • bool fclose ( resource $handle ) [] - 인자로 받은 파일 포인터(스트림)를 닫습니다.
  • bool feof ( resource $handle ) [] - 파일 포인터가 eof(end of file)인 지를 체크합니다.
  • string fgets ( resource $handle [, int $length ] ) [] - 파일포인터로부터 특정 길이만큼 파일의 내용을 읽어들입니다.
4. Writing Files, 파일 쓰기
<?php
  $data = "file Data...";
  file_put_contents('sample.txt', $data) or die("file_put_contents failed");
?>
  • int file_put_contents ( string $filename , mixed $data [, int $flags [, resource $context ]] ) [] - 파일 이름과 파일이 데이타를 인자로 받아서 파일에 데이타를 쓰는 함수입니다. 세 번째 인자로 FILE_APPEND 플래그를 사용하면, 데이타를 덮어쓰는게 아니라 덧붙여 써넣을 수 있습니다.
file_get_contents()와 fopen()처럼 fwirte()를 사용하여 파일을 쓸 수도 있습니다.
<?php
  $data = "file Data...";
  $fp = fopen("sample.txt", wb+) or die("fopen failed");
  if(flock($fp, LOCK_EX)) {
    fwrite($fp, $data) or die("fwrite failed");
    flock($fp, LOCK_UN);
  }
  fclose($fp) or die("fclose failed");
?>
  • int fwrite ( resource $handle , string $string [, int $length ] ) [] - 파일 스트림과 파일에 쓸 데이타를 인자로 받아서 파일에 데이타를 씁니다. 세 번째 인자가 주어진 경우 주어진 길이까지만 파일이 써지게 됩니다.
  • bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) [] - 파일의 스트림과 $operation을 인자로 받아서 파일 락을 설정합니다. LOCK_EX(exclusive lock), LOCK_SH(shared lock), LOCK_UN(unlock), LOCK_NB를 설정할 수 있습니다.

    파일을 쓸 때 다른 프로그램이 동시에 하나의 파일에 엑세스해서 파일이 헝클어지는 것을 방지하기 위해서 lock을 설정합니다. php에서의 lock만 해당하며 php 외의 다른 프로그램에서 접근하는 것까지 lock을 걸지는 못합니다.
5. Removing file lines. 파일의 라인을 삭제하기
<?php
  $filename = "sample.txt";
  //file을 읽어들여서 배열형태로 $data를 읽어들입니다.
  $data = file($filename) or die("file failed"); 
  // 배열의 세 번째 라인을 삭제합니다.
  unset($data[2]); 
  // 배열을 인덱스를 새로 생성합니다.
  $data = array_values($data);
  file_put_contents($filename, implode($data)) or die("fipe_put_contents failed");
?>
  • void unset ( mixed $var [, mixed $var [, mixed $... ]] ) [] - 값을 삭제하는 함수로 인자의 타입에 따라서 다르게 동작합니다.
  • array array_values ( array $input ) [] - 입력 배열의 모든 값을 숫자 키값과 함께 리턴합니다.
6. Processing Directories 디렉토리 다루기
<?php
  $dir = "./sample";
  // 디렉토리에 들어있는 파일/디렉토리들을 배열형태로 리턴합니다.
  $fileList = scandir($dir) or die("scandir failed");
  // 배열을 루프로 돌면서 디렉토리에 들어있는 파일들에 작업을 수행합니다.
  foreach ($fileList as $file) {
    // 실제 파일인지 여부를 체크합니다.
    if( is_file("$dir/$file") && $file != '.' && $file != '..') {
      //...
    }
  }
?>
  • array scandir ( string $directory [, int $sorting_order [, resource $context ]] ) [] - 디렉토리안에 있는 파일과 디렉토리를 배열로 리턴합니다.
<?php
  $dir = "./sample";
  // DirectoryIterator를 생성합니다.
  $iterator = new DirectoryIterator($dir);
  // 내부의 iterator를 첫 element로 이동시킵니다.
  $iterator->rewind();
  // current element가 있는 지 여부를 확인한 후
  while($iterator->vaild()) {
    // 디렉토리가 아닌 실제 파일인지를 확인한 후 실제 작업을 수행합니다.
    if($iterator->isFile() && !$iterator->isDot()) {
      // ...
    }
    // 다음 element로 iterator를 넘깁니다.
    $iterator->next();
  }
?>
DirectoryIterator($path)는 $path를 인자로 받아서 생성하며 디렉토리의 파일/디렉토리를 이동하며 파일정보를 확인하거나 작업을 할 수 있는 클래스입니다.

7. Renaming  Files and Directories 디렉토리 다루기
<?php
   $oldFileName = "oldName.txt";
   $newFileName = "newName.txt";

   // 파일이 있는 지 여부를 체크합니다.
   if(file_exists($oldFileName)) {
     // 대상 파일의 이름을 수정합니다.
     rename($oldFileName, $newFileName) or die("Renaming file is failed.");
   } else {
      die("Cannot find file '$oldFileName'");
   }
?>
rename()은 파일이름 변경 및 파일의 위치 이동을 동시에 실행할 수 있는 함수입니다. 인자는 변경할 원 파일의 이름과 변경 대상이 되는 파일 두 개를 인자로 받습니다.

관련자료: PHP Programming SOLUTIONS 6장 "Working with Files and Directories" 책 보면서 정리한 내용입니다.
PHP Programming SOLUTIONS 상세보기
Vaswani, Vikram 지음 | McGraw-Hill 펴냄
Provides SOLUTIONS, functional code, and usage tips on creating Web applications using PHP.


P.S>
1. mixed end ( array &$array ) [] - Array의 내부 포인터를 마지막 element로 이동시킵니다. end($arr)를 출력하면 Array의 마지막 값이 출력됩니다.
2. $arr[] = 4; // array에 index 없이 값을 할당하는 경우 array의 마지막 index로 값이 할당되네요.

2008년 2월 2일 토요일

erangemall의 스팸

메일을 확인해보다 스팸메일통에서 ernage.tistory.com이란 곳에서 보낸 스팸메일을 확인하였습니다.
사용자 삽입 이미지

1월30일~2월1일 ernage.tistory.com에 글이 대부분 올라와있고, 대부분의 카테고리에 글이 없고, 댓글도 더 이상 스팸을 보내지 말라는 댓글 하나만 올라와 있더군요.

사용자 삽입 이미지

전형적인 스팸/낚시성 블로그 같아서 어떤 회사인지 검색을 해봤습니다. www.erangemall.com에서 상호를 살펴봤습니다. (주)디앤디 전자로 되어 있더군요. 디앤디전자 사이트로 들어가니 다음의 메인 페이지가 나오더군요.
사용자 삽입 이미지

전기렌지인 www.erange.co.kr와 살균소독수 생성기 나오크린이라는 두 제품이 주력인 듯하였습니다.
'회사 소개> 회사 개요 > 홈 페이지'에 www.erangemall.com이 포함되지 않은걸로 봐서는 erangemall.com 자체는 만들어진지 얼마 안된 어쩌면 디앤디전자에서 웹에서의 전자상거래에 야심차게 뛰어든게 아닌가 하는 생각도 들더군요. (시작부터 스팸을 뿌려대서 사용자와 신뢰관계 자체를 포기해 버렸지만요.)

벌써 Q&A에 스팸 항의글이 올라왔습니다.
사용자 삽입 이미지
디앤디 전자에서 어떤 의도로 시작했는 지는 모르겠지만, 스팸 발송 사과부터 하였으면 좋겠네요.

P.S> 계속해서 스팸을 보내는군요. -_-;;; 이런 회사 제품은 구매를 해서도 안됩니다. !!!! 게다가 스팸 항의글은 바로 삭제해 버렸군요. 헐~
사용자 삽입 이미지