보고 싶은 책 목록 (또는 소유하고 싶은 책 목록 ^^;;;)
2008년 2월 11일 월요일
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)를 사용하고 있습니다.
- 다른 소프트웨어에서 라이브러리로 사용할 수 있는 기능도 제공되고 있습니다.
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 {1-2의 예제의 결과
// 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;
}
node의 shape이 record와 Mrecord의 label을 사용하여서 shape 내부에 수직 또는 수평의 box를 넣을 수 있습니다.
- label의 값을 구분하는 필드로 |를 사용할 수 있습니다. 연속하여 사용가능
rlable -> field('|'field)* - 수직/수평의 방향은 {}를 사용하여 정의할 수 있으며, 중첩해서 선언이 가능합니다.
- label 앞에 <>로 된 boxlabel을 선언할 수 있습니다.
field->boxLabel|"rlabel"
boxLabel -> ['<'string'>'][string]
digraph G {위 label의 결과는 다음과 같습니다.
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을 이용하여 클래스 다이어그램 만들기 [예제 출처: 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에서만 테스트 되어있습니다.
- Rhino 사이트
- Tutorial
- Examples
- JavaScript Shell - Rhino를 사용하여 js를 shell 상에서 실행하는 방법입니다.
jsdoc toolkit (JavaScript Toolkit)에서는 JavaScript Documentation을 생성하기 위해서 Rhino를 사용하고 있습니다. 소스 코드에서 JsIO.js를 보시면 Rhino를 사용하여서 어떻게 파일 입출력을 하는 지를 살펴보실 수 있습니다.
라벨:
잡학사전,
Java,
javascript,
rhino
2008년 2월 4일 월요일
전문가들의 발표자료는 이렇게 다르구나 -_-;;;;;
LukeW님의 VizThink 08: Visualizing the Presentation Ecosystem라는 글이 올라와서 읽었습니다.
VizThink 2008에서 Nancy Duarte이 발표한 "Visualizing the Presentation Ecosystem"이라는 세션에 관한 글인데요. 발표자료를 만드는 사람들을 대상으로 시각적인 요소들을 사용하여 어떻게 효과적으로 이야기를 전달할 지에 대한 강의 였다고 합니다.
시간이 되시는 경우, "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님에게 있습니다.
VizThink 2008에서 Nancy Duarte이 발표한 "Visualizing the Presentation Ecosystem"이라는 세션에 관한 글인데요. 발표자료를 만드는 사람들을 대상으로 시각적인 요소들을 사용하여 어떻게 효과적으로 이야기를 전달할 지에 대한 강의 였다고 합니다.
Nancy Duarte 님이 만든 Al Gore의 키노트입니다.
그런데, 전문가가 만들어서 그런지.... 대충 보기만 하였는데도 어떤 이야기를 하려는건지 바로 감이 오네요 -_-;; (역시, 공돌이들이 백날 만들어봤자 소용없다니까;;;;;;;;;;;;;;)
출처: VizThink 08: Visualizing the Presentation Ecosystem
P.S.1> VizThink 08: Visualizing the Presentation Ecosystem의 pdf자료도 유용하게 쓸 수 있을 것 같네요.
P.S.2> 고민을하다.. 자료를 캡쳐해 버렸습니다. 저작권은 Nancy Duarte님에게 있습니다.
more..
실제로 보시면 동적인 Presentation입니다. 처음에는 정적이다가 시간에 따라 변화하는 모습을 보여주거나 강조가 필요하는 경우에 동적인 움직임을 삽이하는 것이 인상적이네요.

















2008년 2월 3일 일요일
YUI - compressor
- js/css 모두에 사용할 수 있는 글로벌 옵션들
- -h, --help : 도움말을 출력합니다.
- --line-break <column>: 압축을 하는 경우 한 줄로 파일이 생성되게 되는데, 다음과 같은 이유로 특정 컬럼뒤에 line break를 삽입해 줍니다.
- 이렇게 압축된 파일은 읽기에도 불편할 뿐더러
- 디버깅하기 어려운 문제를 가지고 있습니다.
- 특정 소스 컨트롤 툴에서 문제가 될 수 있습니다.
- --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을 사용하지 않습니다.
사용법
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 이상의 버전을 필요로 합니다.
라벨:
잡학사전,
compressor,
JS(Library),
YUI
PHP 파일처리
파일과 관련된 PHP 함수 정리
1. file_exists [↗]
파일을 옮기거나, 복사하거나 파일의 내용을 읽을 때, 파일이 존재하는 지 여부를 체크하는 함수
2. file Information를 얻고 싶을 때
7. Renaming Files and Directories 디렉토리 다루기
관련자료: PHP Programming SOLUTIONS 6장 "Working with Files and Directories" 책 보면서 정리한 내용입니다.
PHP Programming SOLUTIONS
상세보기
P.S>
1. mixed end ( array &$array ) [↗] - Array의 내부 포인터를 마지막 element로 이동시킵니다. end($arr)를 출력하면 Array의 마지막 값이 출력됩니다.
2. $arr[] = 4; // array에 index 없이 값을 할당하는 경우 array의 마지막 index로 값이 할당되네요.
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
) [↗] - 파일이 실행될 수 있는 지 여부를 리턴합니다.
<?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으로 리턴합니다.
<?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
] ) [↗] - 파일포인터로부터 특정 길이만큼 파일의 내용을 읽어들입니다.
<?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 플래그를 사용하면, 데이타를 덮어쓰는게 아니라 덧붙여 써넣을 수 있습니다.
<?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을 걸지는 못합니다.
<?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 ) [↗] - 입력 배열의 모든 값을 숫자 키값과 함께 리턴합니다.
<?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
]] ) [↗] - 디렉토리안에 있는 파일과 디렉토리를 배열로 리턴합니다.
<?phpDirectoryIterator($path)는 $path를 인자로 받아서 생성하며 디렉토리의 파일/디렉토리를 이동하며 파일정보를 확인하거나 작업을 할 수 있는 클래스입니다.
$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();
}
?>
7. Renaming Files and Directories 디렉토리 다루기
<?phprename()은 파일이름 변경 및 파일의 위치 이동을 동시에 실행할 수 있는 함수입니다. 인자는 변경할 원 파일의 이름과 변경 대상이 되는 파일 두 개를 인자로 받습니다.
$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'");
}
?>
관련자료: PHP Programming SOLUTIONS 6장 "Working with Files and Directories" 책 보면서 정리한 내용입니다.
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> 계속해서 스팸을 보내는군요. -_-;;; 이런 회사 제품은 구매를 해서도 안됩니다. !!!! 게다가 스팸 항의글은 바로 삭제해 버렸군요. 헐~

1월30일~2월1일 ernage.tistory.com에 글이 대부분 올라와있고, 대부분의 카테고리에 글이 없고, 댓글도 더 이상 스팸을 보내지 말라는 댓글 하나만 올라와 있더군요.
전형적인 스팸/낚시성 블로그 같아서 어떤 회사인지 검색을 해봤습니다. www.erangemall.com에서 상호를 살펴봤습니다. (주)디앤디 전자로 되어 있더군요. 디앤디전자 사이트로 들어가니 다음의 메인 페이지가 나오더군요.
전기렌지인 www.erange.co.kr와 살균소독수 생성기 나오크린이라는 두 제품이 주력인 듯하였습니다.
'회사 소개> 회사 개요 > 홈 페이지'에 www.erangemall.com이 포함되지 않은걸로 봐서는 erangemall.com 자체는 만들어진지 얼마 안된 어쩌면 디앤디전자에서 웹에서의 전자상거래에 야심차게 뛰어든게 아닌가 하는 생각도 들더군요. (시작부터 스팸을 뿌려대서 사용자와 신뢰관계 자체를 포기해 버렸지만요.)
벌써 Q&A에 스팸 항의글이 올라왔습니다.
P.S> 계속해서 스팸을 보내는군요. -_-;;; 이런 회사 제품은 구매를 해서도 안됩니다. !!!! 게다가 스팸 항의글은 바로 삭제해 버렸군요. 헐~
라벨:
디앤디전자,
스팸,
이것저것,
erange,
erangemall.com
피드 구독하기:
글 (Atom)