# 언어 설정  

sudo apt-get install language-pack-ko

sudo locale-gen ko_KR.UTF-8


sudo vi /etc/profile

LANG="ko_KR.EUC-KR"

LANG="ko_KR.UTF-8"


sudo vi /etc/environment

LANG="ko_KR.EUC-KR"

LANG="ko_KR.UTF-8"

LANGUAGE="ko_KR:ko:en_GB:en"


sudo vi /etc/default/locale

LANG=ko_KR.EUC-KR




# nginx 설치 

sudo apt-get install nginx




# php5 설치

# 의존성으로 php5 설치 됨

sudo apt-get install php5-fpm


# nginx, php5 유닉스 소켓으로 연결

sudo vi /etc/php5/fpm/pool.d/www.conf

; listen = 127.0.0.1:9000

listen = /var/run/php5-fpm.sock


sudo vi /etc/nginx/sites-enabled/default

location ~ \.php$ {

#   # With php5-fpm:

fastcgi_pass unix:/var/run/php5-fpm.sock;

fastcgi_index index.php;

include fastcgi_params;

}


sudo service php5-fpm restart

sudo service nginx restart



# oracle jdk 설치 및 tomcat 설치 

sudo apt-get install python-software-properties


sudo apt-add-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-jdk7-installer


sudo apt-get install tomcat7

sudo vi /etc/default/tomcat7

JAVA_HOME=/usr/lib/jvm/java-7-oracle


sudo vi /etc/nginx/sites-enabled/default

location ~ \.jsp$ {

proxy_pass http://localhost:8080;

}


sudo service tomcat7 start

sudo service nginx restart



postgresql 설치 

sudo apt-get install postgresql postgresql-contrib


postgresql databse 기본 언어 설정 (ko_KR.utf8)

sudo -u postgres psql

psql (9.0.3)

Type "help" for help.

 

update pg_database set datallowconn = TRUE where datname = 'template0';


\c template0


update pg_database set datistemplate = FALSE where datname = 'template1';


drop database template1;


create database template1 with template = template0 'UTF-8' LC_CTYPE = ko_KR.utf8' LC_COLLATE = 'ko_KR.utf8'


update pg_database set datistemplate = TRUE where datname = 'template1';


\c template1


template1=# update pg_database set datallowconn = FALSE where datname = 'template0';


postgresql 리모트 접근 허용 (9.1 기준)

sudo vi /etc/postgresql/9.1/main/postgresql.conf

listen_addresses = '*'      # what IP address(es) to listen on;

                    # comma-separated list of addresses;

                    # defaults to 'localhost', '*' = all

                    # (change requires restart)

port = 5432             # (change requires restart)



# 개발툴 설치 

# gcc, g++ 등

sudo apt-get install build-essential

sudo apt-get install libboost-all-dev



# mono

sudo apt-get install mono-complete





'Dev > Linux' 카테고리의 다른 글

Gitlab Backup & Restore 방법  (0) 2017.01.10

- DEC입사 RSX-11라는 OS 개발

- 유닉스를 대항하고자 만든 VMS OS 개발 (나중에 OpenVMS로 발전)

- 1988년 DEC은 차세대 OS 개발 도중 프로젝트 취소 시킴


- 빌게이츠는 유닉스에 대항하고자 새로운 OS 개발의 니즈를 느낌 

- 마침 DEC에서 퇴사한 커틀러팀을 모두 MS에 영입 

- IBM과 같이 OS/2 NT 프로젝트를 Windows NT라는 이름으로 바꾸고 커틀러 중심으로 바꿈 (후 IBM과 분쟁) 

- 1993년 Windows 3.1의 UI를 가져오고 하위 호환성을 가지는 첫번째 NT커널OS인  Windows NT 3.1 개발


- NT 커널 개발시 빌게이츠는 유닉스와 같은 모놀리식이 아닌 마이크로 커널의 특징으로 개발 하는 것에 대해서 많은 의구심을 가졌고 커틀러는 안정성이 중요 하다는 이유로 설계를 변경 하지 않았고 코딩 테크닉으로 극복 하겠다고 주장 (NT는 모놀리식안에 마이크로 성격이 들어있는 하이브리드 커널로 분리)


- 현재 MS에서 근무 하고 있으며 최근 XBOX 부서로 옮김 

- 1942년 생이고, OS 개발 3번이나 성공시킨 인물 

- Windows 7에도 아직 그의 코드가 들어 있다고 ;; 


http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039129985

http://www.jiniya.net/wp/archives/146

http://noaa.byus.net/blog?page=74

  1. Uninstall PostgreSQL
  2. Delete the postgres user if it still exists.

    net user postgres /delete
  3. Create the postgres user with a password you can remember

  4. Add the postgres user to the Administrators group
  5. Add the postgres user to the Power Users group
  6. Run a command window as the postgres user

    runas /user:postgres cmd.exe
  7. Run the install file from within the command window.

    C:\Download\postgresql-9.1.4-1-windows.exe

    This should run the installation successfully.

  8. Remove the postgres user from the Administrators group.


http://dba.stackexchange.com/questions/10241/postgresql-the-database-cluster-initialization-failed


Tcpdump의 옵션들


-a : Network & Broadcast 주소들을 이름들로 바꾼다.

-c Number : 제시된 수의 패킷을 받은 후 종료한다.

-d : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.

-dd : packet-matching code를 C program의 일부로 출력한다.

-ddd : packet-matching code를 숫자로 출력한다.

-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.

-f : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).

-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n : 모든 주소들을 번역하지 않는다(port,host address 등등)

-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.

-p : 인터페이스를 promiscuous mode로 두지 않는다.

-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)

-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.

-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.

-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.

-v : 좀 더 많은 정보들을 출력한다.

-vv : '-v'보다 좀 더 많은 정보들을 출력한다.

-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x : 각각의 패킷을 헥사코드로 출력한다.


사용 가능한 Primitive들

  • dst host HOST
    packet의 IP destination 항목이 HOST일때 참이 된다.
  • src host HOST
    packet의 IP source 항목이 HOST일때 참이 된다.
  • host HOST
    IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
  • ether dst ehost
    ethernet destination 주소가 ehost일 때 참이다.
  • ether src ehost
    ethernet source 주소가 ehost일 때 참이다.
  • ether host ehost
    ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
  • gateway host
    패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
  • dst net NET
    패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.
  • src net NET
    패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
  • net NET
    패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때 참이다.
  • net netmask mask
    IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
  • net net/len
    IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
  • dst port PORT
    패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다. port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.
  • src port PORT
    패킷의 source port의 값으로 PORT를 가지면 참이다.
  • port PORT
    패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
  • less length
    패킷이 length보다 짧거나 같으면 참이다.(len <= length)
  • greater length
    패킷이 length보다 짧거나 같으면 참이다.(len >= length)
  • ip proto protocol
    패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다.
  • ehter broadcast
    패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.
  • ip broadcast
    패킷이 IP broadcast 패킷이라면 참이다.
  • ether multicast
    패킷이 IP multicast 패킷이라면 참이다.
  • ether proto protocol
    패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.
  • decnet src host
    만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서만 사용 가능하다.
  • decnet dst host
    DECNET destination address가 host이면 참이다.
  • decnet host HOST
    DECNET source, destination address중의 하나라도 HOST이면 참이다.
  • ip, arp, rarp, decnet
    ether proto [ip|arp|rarp|decnet]의 약어
  • lat, moprc, mopdl
    ether proto [lat|moprc|mopdl]의 약어
  • tcp, udp, icmp
    ip proto [tcp|udp|icmp]의 약어
  • expr relop expr
    • EXPR
      proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다.
      • proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp
      • expr : indicate Byte offset of packet of proto
      • size : optional. indicate the size of bytes in field of interest
      • default is one, and can be two or four
    • RELOP
      !=, =, <=, >=, etc.

    이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.


Tcpdump의 사용 예제들

security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
# tcpdump host security

security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
# tcpdump host security and \( mazinga or getarobo \)

security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
# tcpdump ip host security and not elgaim

gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
# tcpdump 'gateway amurorei and ( port ftp or ftp-data )'

local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
# tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'

gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
# tcpdump 'gateway amurorei and ip[2:2] > 576'

Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
# tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'

Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
# tcpdump 'icmp[0] != 8 and icmp[0] != 0'



참고 : http://coffeenix.net/doc/misc/tcpdump.html


'Dev > Network' 카테고리의 다른 글

TCP Connection Establishment Procedure & Connection Termination Procedure  (0) 2012.03.30
SSL Protocol  (0) 2007.09.08
network protocol  (0) 2007.07.23

[문제]


컴퓨터에서 실행 중인 Windows 7 SP1 이나 Windows Server 2008 R2 SP1 나 설치 하는 kb983246가 다시 컴파일하십시오 다음 ADO 응용 프로그램 하위 수준 운영 체제에서 실행 되지 않습니다.


http://support.microsoft.com/kb/2517589



[해결책]


#1. Windows 7 의 SP1 을 올리지 않는다. (권장 안함)

-> 현재 시스템 상 자동 업데이트 되고 있고, 개발을 위해서 업그레이드를 미루는 것은 문제가 있을 듯 합니다.


#2. 개인 PC의 ADO 버전을 강제로 내린다 (권장 안함 )

  -> 문제가 있고 추후 상위 버전의 개발을 위해서도 바람직 하지 않습니다. 


#3. ADO 버전을 고정 시킨다 (권장)

-> 현재 사용되는 msado15.dll 버전을 사용하지 않고 아래의 버전중에 하나를 사용한다. 

  - Vista 이상의 환경에서의 컴파일 : #import msado60.tlb (권장)

  - XP 이상의 환경에서의 컴파일 : #import msado28.tlb (옵션)



AS-IS

#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename("EOF", "adoEOF")


TO-BE

#import "C:\Program Files\Common Files\System\ado\msado60.tlb" rename("EOF", "adoEOF")



[기타]

#. 해결책 

http://support.microsoft.com/kb/2640696


#. ADO 버전 

http://msdn.microsoft.com/ko-kr/library/windows/desktop/ms676506(v=vs.85).aspx



1. LUCENE.NET 


Lucene.Net is a port of the Lucene search engine library, written in C# and targeted at .NET runtime users. The Lucene search library is based on an inverted index. Lucene.Net has three primary goals:


Maintain the existing line-by-line port from Java to C#, fully automating and commoditizing the process such that the project can easily synchronize with the Java Lucene release schedule;

Maintaining the high-performance requirements expected of a first class C# search engine library;

Maximize usability and power when used within the .NET runtime. To that end, it will present a highly idiomatic, carefully tailored API that takes advantage of many of the special features of the .NET runtime.


자바의 유명한 검색 엔진인 Lucene을 이용하여 라인 단위 포팅한 프로젝트 

언어적인 특성으로 인해 C#의 언어의 특성에 맞게 구현 됨 


http://lucenenet.apache.org/


해당 사이트에서 바이너리를 받던가 소스를 받아서 컴파일 하면 됨 



2. Lucene 인덱싱 특징


(1) 디렉토리 단위로 다큐먼트라고 불리는 인덱싱 파일들이 생성 되며, 여러 정의된 스키마를 중복으로 통합 할 수 있음 


(2) 다큐먼드는 파일시스템과 같은 디스크와 메모리에 생성 할 수 있음 

- 메모리에 생성 함으로서 속도를 개선 할 수 있다고는 하나, 경험상 체감할 정도를 아니었음 


(3) 다큐먼트의 필드 특징 

- 기본적으로 텍스트 기반으로 필드를 저장함 


- Field.Index.NO : 필드에 대해서 단순 저장용 데이터로 사용

- Field.Index.ANALYZED : 분석기에 의해 토큰화 된 데이터 

- Field.Index.NOT_ANALYZED : 검색에는 사용되나 분석기를 사용 하지 않고 사용될 데이터


- Field.Store.NO : 원본 데이터를 저장 안함 (Field.Index.ANALYZED 필드에 대해서 공간 절약 할 용도)

- Field.Store.YES : 원본 데이터를 저장 함 


(4) 기본으로 제공 되는 Analyzer(토큰화 하여 분리 시켜 주는 분석기)는 4개가 제공됨 

- WhitespaceAnalyzer : (화이트)스페이스  단위로 토큰 분리 

- SimpleAnalyzer : Letter를 구분으로 토큰 분리 

- StopAnalyzer : SimpleAnalyzer 와 같지만 Stop 단어를 제거함 

- StandardAnalyzer : 문법 기반으로 토큰 분리, 영어권 언어에 적합 



3. Lucene 한글 이슈


(1) 형태소 분석기 및 사전화 인덱싱 

- 한글을 제대로 검색 하기 위해서는 형태소 분석기 및 사전화가 되어 있어야 하나, 이 또한 적합하지 않은 경우가 있음

- 형태소 분석기 및 사전화 작업에 따른 인덱싱 속도 저하와 복잡도 및 관리 리소스가 많이 투입 될 경우가 많음

- 물론 유지보수 및 관리 잘 된다면 검색 품질을 높일 수는 있으나, 요구 사항에 따른 검색 튜닝을 해야함

 

(2) Lucene.Net.Analysis.CJK.CJKAnalyzer 사용 

- 일반적인 쇼핑몰 등의 상품명 및 정보를 검색할 경우 CJK 분석기를 이용하는 것이 유연하게 대처 가능 하다고 봄

- 인덱싱 파일이 커지고 의미상 의미 없는 단어가 검색 되긴 하지만, 기계적으로 인덱싱 속도가 빠름

- 외래어나 기타 사전화 되지 않는 단어에 대해서도 검색이 용이함 

- 3.0,3 버전 이후 부터 contrib 형태로 제공 됨 



4. 인덱싱 및 검색 전략 (Lucene.Net.Analysis.CJK.CJKAnalyzer 사용한다는 전제)


(1) 병합 전략을 위해 유니크한 id 필드를 공통으로 정의 함 (병합시 삭제 + 추가를 위해)


(2) 분석기에 의해 토큰(Field.Index.ANALYZED)화 되어지는 필드를 정하고, 이를 기반으로 보조적인 검색 필드로 일반검색

(Field.Index.NOT_ANALYZED)필드 및 그외 조회되는 데이터(Field.Index.NO)를 정의함 


(3) Field.Index.NOT_ANALYZED의 경우 분석 되지 않는 데이터이므로 대소문자 대응을 해야 함 

- http://www.gossamer-threads.com/lists/lucene/java-dev/74936


(4) 검색의 정렬의 특성상 아래의 정렬 순서로 성능이 좋음 

- http://blog.richeton.com/2009/05/12/lucene-sort-tips/ 


-  SortField.SCORE(적중율), SortField.DOC(인덱싱 문서 순서)으로 정렬, 검색 되어지게 하는 것이 성능상 좋음 

- 사용자 정의 정렬은 되도록이면 SortField.INT 를 사용하여 정렬을 할 수 있도록 인덱싱 처리  

- SortField.STRING의 경우 데이터가 많이 검색 될 경우 위의 검색 옵션 보다 월등히 성능이 좋지 않음 


(5) Lucene 검색 문법

- http://lucene.apache.org/core/3_6_1/queryparsersyntax.html


- SQL 문과 같은 문법으로 사용하기 위해 SQL 파서는 무겁다고 판단

- 아래의 정규식을 이용하여 SQL을 분리해서 Lucene 검색 문법으로 변경 처리 할 수 있음 

* 정규식 : "(?:'(?:[^']|'')*'|-?\d+(?:\.\d+)?(?:[eE]-?\d+)?|\w+|[<>=]{2}|\S)"

select(sel) [ * | field, ... ] 

from    directory 

where   field1='val' and field2='val' or ... 

order by [_score | _doc | field1 [order_expression], ...] 

group by field1, ...   


( *order_expression : [ asc | desc | doc_asc | doc_desc | score_asc | score_desc | int_asc | int_desc ] ) 

( *group result fields : group (group by value), count (group by count) )


(6) 검색 팁 

- Analyzer의 종류에 따라 토큰으로 분리가 되는 데이터가 다르므로 와일드카드 검색등을 이용할 때 고려해야 함 

  (와일드카드 검색은 성능에 영향을 미침)

- CJKAnalyzer는 중국어, 일본어, 한국어에 대해서 두 음절씩 잘라 내므로 와일드카드 검색이 의미 없을 것으로 판단


- 분야별 개수를 가져오는 Faceted Search 같은 기법은 아직 쓸모 있어 보이지 않음 (내가 잘 모를수도..)

- 그냥 직접 해쉬 맵 객체를 이용하여 구현 함 


- 토큰 필드 색인시 기본 문자열 + 공백을 제거한 문자열을 같이 포함 시켜서 넣도록 함 

- 한 글자에 대해서 검색이 용이하게 하려면 단어별로 앞글자를 공백을 넣고 같이 인덱싱 데이터에 넣으면 효과가 있을 것임

- ex) "오페라의 유령 - 25주년 기념 내한공연" 

       -> "오 유 기 내 오페라의유령25주년기념내한공연 오페라의 유령 - 25주년 기념 내한공연"  


- 사용자 검색어에 대해서 공백 단위로 AND 조건 검색 하도록 쿼리 변경 


기타 일반적인 전략 : http://wiki.apache.org/jakarta-lucene/ImproveSearchingSpeed



'Dev > .NET' 카테고리의 다른 글

SerializeToXML - C#  (0) 2009.08.10
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
RCW, CCW  (0) 2007.10.04

http://msdn.microsoft.com/ko-kr/library/cc281953.aspx

서비스 계정 사용 권한

서비스는 운영 체제의 리소스 및 개체에 액세스하기 위해 계정에 로그온해야 합니다. 대부분의 서비스에서는 기본 로그온 계정을 변경할 수 없습니다. 기본 계정을 변경하면 서비스가 작동하지 않을 수 있습니다.

서비스로 로그온하는 사용 권한이 없는 계정을 선택하면 서비스 스냅인은 사용자가 관리하는 컴퓨터의 서비스로 로그온하는 데 필요한 사용자 권한을 해당 계정에 자동으로 부여합니다. 그러나 사용 권한을 부여받더라도 반드시 서비스가 시작되지는 않습니다.

서비스로 로그온하는 데 사용되는 사용자 계정은 속성 대화 상자에서 암호 사용 기간 제한 없음 확인란을 선택하고 강력한 암호를 사용하는 것이 좋습니다. 자세한 내용은 강력한 암호를 참조하십시오.

계정 잠금 정책을 사용 중이고 계정이 잠겨 있으면 서비스가 제대로 작동하지 않습니다. 자세한 내용은 계정 잠금 정책을 참조하십시오.

다음 표는 서비스 로그온 계정과 사용 방법에 대한 설명입니다.

 

로그온 계정설명

로컬 시스템 계정

로컬 시스템 계정은 도메인 컨트롤러의 디렉터리 서비스를 포함하여 시스템에 대한 완전한 액세스 권한을 갖고 있는 강력한 계정입니다. 서비스가 도메인 컨트롤러의 로컬 시스템 계정에 로그온하면 그 서비스는 전체 도메인에 대한 액세스 권한을 갖습니다. 일부 서비스는 기본적으로 로컬 시스템 계정에 로그온하도록 구성되어 있습니다. 기본 서비스 설정을 변경하지 마십시오.

로컬 서비스 계정

로컬 서비스 계정은 인증된 사용자 계정과 유사한 기본 제공되는 특별한 계정입니다. 로컬 서비스 계정은 리소스 및 개체에 대해 Users 그룹 구성원과 같은 수준의 권한을 갖습니다. 이렇게 제한된 액세스는 개별 서비스나 프로세스에 문제가 생길 경우 시스템을 보호합니다. 로컬 서비스 계정으로 실행되는 서비스는 자격 증명이 없는 Null 세션으로 네트워크 리소스에 액세스합니다.

네트워크 서비스 계정

네트워크 서비스 계정은 인증된 사용자 계정과 유사한 기본 제공되는 특별한 계정입니다. 네트워크 서비스 계정은 리소스 및 개체에 대해 Users 그룹 구성원과 같은 수준의 권한을 갖습니다. 이렇게 제한된 액세스는 개별 서비스나 프로세스에 문제가 생길 경우 시스템을 보호합니다. 네트워크 서비스 계정으로 실행되는 서비스는 컴퓨터 계정의 자격 증명을 사용하여 네트워크 리소스에 액세스합니다.

주의

  • 기본 서비스 설정을 변경하면 주요 서비스가 제대로 실행되지 않을 수 있습니다. 특히 자동으로 시작하도록 구성된 서비스의 시작 유형 및 다음 계정으로 로그온 설정을 변경할 경우에는 특별히 주의해야 합니다.
  • 대부분의 경우 서비스와 데스크톱 상호 작용 허용 설정을 변경하지 않는 것이 좋습니다. 서비스가 데스크톱과 상호 작용할 수 있게 허용되면 서비스가 데스크톱에 표시하는 모든 정보가 대화형 사용자의 데스크톱에도 표시됩니다. 악의 있는 사용자가 서비스 제어권을 가지거나 대화형 데스크톱에서 공격할 수 있습니다.

< DTC 서비스 조건 >


1. MSDTC 보안 구성 

  - 네트워크 DTC 엑세스 설정

  - 인바운드 및 아웃바운드 허용

  - 인증 필요 없음 


2. 웹서버 및 DB서버의 양방향 HOSTNAME(or 디렉토리 이름)으로 IP가 확인 가능

 

3. 양방향 RPC (135) 포트 접속 가능 


4. 양방향 동적 포트 대기 프로세스인 msdtc.exe 에 접속 가능




< MSCS 에서의 IP 설정 >


1. 클라이언트 서버에서의 DB서버의 접속은 MSCS의 DTC Group 의 IP로 접속 


2. DB 서버에서 클라이언트 접속은, MSCS의 DTC가 위치해 있는 노드의 물리적인 서버의 IP로 웹 서버로 접속 




Step by Step: 트랜잭션 오류에 대한 MSDTC 설정 확인하는 일반적인 방법

http://support.microsoft.com/kb/976963/ko



1) TCP “Three-Way Handshake” Connection Establishment Procedure



2) TCP Connection Termination Procedure



'Dev > Network' 카테고리의 다른 글

tcpdump 옵션  (0) 2013.04.08
SSL Protocol  (0) 2007.09.08
network protocol  (0) 2007.07.23

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""


레지스트리는 항상 조심.. 


'Dev > Windows' 카테고리의 다른 글

서비스 계정 사용 권한  (0) 2012.04.04
MS MTC 서비스 설정  (0) 2012.04.04
COM+ 패키지 활성화별 세션 상태 정리  (0) 2009.09.22
Redmine 세팅  (0) 2009.09.12
ATL Com Project VC++ 6 에서 VC++ 8 변환(업그레이드)  (0) 2009.03.27

- 메세지를 한번 주고 받고 세션을 종료하는 클라이언트 소켓
- boost::asio 라이브러리 사용 (boost 의 date_time, thread, system 컴파일 필요)
- boost::asio::deadline_timer 를 이용하여 timeout 기능 구현 
- 비동시 소켓으로 구현한 동기 소켓(?)



#pragma once

#include <algorithm>
using namespace std;

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>

using boost::asio::ip::tcp;


struct IsEOF_Basic
{
bool operator()(const std::string &)
{
return true;
}
};



template <class Ty = IsEOF_Basic>
class ClientSocket 
{
public:
ClientSocket() : socket_(io_service_), timeout_(io_service_), nResponse_(0) {}

~ClientSocket() 
{
Close();
}

bool Connect(const string &sIP, const string &sPort) 
{
bool bResult = false;

tcp::resolver resolver(io_service_);
tcp::resolver::query query(tcp::v4(), sIP, sPort);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;

boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end)
{
socket_.close();
socket_.connect(*endpoint_iterator++, error);
}

if (!error) {
bResult = true;
}
return bResult;
}

void Send(const string &s, const int nTimeout = 5)
{
copy(s.begin(), s.end(), szBuff);

socket_.async_write_some(boost::asio::buffer(szBuff, s.length()),
boost::bind(&ClientSocket::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

timeout_.expires_from_now(boost::posix_time::seconds(nTimeout));
timeout_.async_wait(boost::bind(&ClientSocket::Timeout, this));

handle_read_wait();
}

int WaitForResponse()
{
socket_.io_service().reset();

while (socket_.io_service().run_one()) 
{
if (nResponse_) break;
}

return nResponse_;
}

void Close()
{
socket_.close();
}

std::string GetReadBuffer()
{
return sReadBuff_;
}

enum { TIMEOUT = -1, READY = 0, SUCCESS = 1 };

private:
void Timeout()
{
nResponse_ = TIMEOUT;
}

void handle_read_wait() 
{
socket_.async_read_some(boost::asio::buffer(szBuff, BUFF_SIZE),
boost::bind(&ClientSocket::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

nResponse_ = READY;
}

void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
if (error) {
Close();
return;
}

sReadBuff_.append(szBuff, szBuff + bytes_transferred);

if (IsEOF(sReadBuff_)) {
nResponse_ = SUCCESS;
}
else {
handle_read_wait();
}
}

void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
{
if (error) {
Close();
return;
}
}

private:
boost::asio::io_service io_service_;

boost::asio::deadline_timer timeout_;
tcp::socket socket_;
std::string sReadBuff_;
volatile int nResponse_;

Ty IsEOF;
enum { BUFF_SIZE = 8192};
char szBuff[BUFF_SIZE];
};

int SendPacket (
LPCSTR strIP, LPCSTR strPort, int nTimeoutSecond, LPCSTR szMessage, LPSTR szRetMessage)
{
int nResult = -2;

try {
typedef ClientSocket<> ClientSocketType;
ClientSocketType socket;

if (!socket.Connect(strIP, strPort)) {
throw -1;
}

if (nTimeoutSecond == 0) nTimeoutSecond = 5;

socket.Send(szMessage, nTimeoutSecond);
int nResponse = socket.WaitForResponse();

if (nResponse == ClientSocketType::TIMEOUT) {
throw 0;
}

if (nResponse == ClientSocketType::SUCCESS) {
std::string s = socket.GetReadBuffer();
std::copy(s.begin(), s.end(), szRetMessage);

nResult = s.size();
}
}
catch (int nErr) {
nResult = nErr;
}
catch (...) {}

return nResult;
}



'Dev > C++' 카테고리의 다른 글

[C++11] Variadic template  (0) 2014.11.02
boost 설치  (0) 2013.11.20
이미지 변환 모듈 (모바일용, GDI+)  (0) 2010.06.22
C++0x, RValue Reference  (0) 2009.05.27
C++0x Lambda  (0) 2009.05.20
- 이미지의 포맷 변환 및 퀄러티, 크기조정(비율) 모듈 
- Windows 환경, C++, GDI+, Component


STDMETHODIMP CMobileImage::Convert(BSTR Src, BSTR Output, BSTR ImgFormat, long Quality, long Width, long Height, VARIANT_BOOL* pSuccess)
{
*pSuccess = VARIANT_FALSE;

_bstr_t bstrSrc(Src);
_bstr_t bstrOutput(Output);
_bstr_t bstrImgFormat(ImgFormat);

ULONG_PTR gdiToken;
Gdiplus::GdiplusStartupInput gdiInput;
Gdiplus::GdiplusStartup(&gdiToken, &gdiInput, NULL);

try {
std::auto_ptr<Gdiplus::Image> pImage(Gdiplus::Image::FromFile((LPCWSTR)bstrSrc));
if (!pImage.get()) {
throw -1;
}

CLSID m_pngClsid;
if (GetEncoderClsid((LPCWSTR)ImgFormat, &m_pngClsid) == -1) {
throw -1;
}
else {
Gdiplus::EncoderParameters params;
params.Count = 1;
params.Parameter[0].Guid = Gdiplus::EncoderQuality;
params.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
params.Parameter[0].NumberOfValues = 1;

long Value = Quality;
params.Parameter[0].Value = &Value;

if (Width > 0 && Height > 0) {
std::auto_ptr<Gdiplus::Bitmap> pResize(new Gdiplus::Bitmap(Width, Height, PixelFormat24bppRGB));
std::auto_ptr<Gdiplus::Graphics> pGrap(Gdiplus::Graphics::FromImage(pResize.get()));
pGrap->DrawImage(pImage.get(), 0, 0, Width, Height);

pResize->Save((LPCWSTR)bstrOutput, &m_pngClsid, &params);
}
else {
pImage->Save((LPCWSTR)bstrOutput, &m_pngClsid, &params);
}
}

*pSuccess = VARIANT_TRUE;
}
catch (...) { }

Gdiplus::GdiplusShutdown(gdiToken);

if (m_spObjectContext) { m_spObjectContext->SetComplete(); }

return S_OK;
}


int CMobileImage::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
using namespace Gdiplus;

UINT  num = 0;          // number of image encoders
UINT  size = 0;         // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

GetImageEncodersSize(&num, &size);
if(size == 0)
return -1;  // Failure

pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1;  // Failure

GetImageEncoders(num, size, pImageCodecInfo);

for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;  // Success
}    
}

free(pImageCodecInfo);
return -1;  // Failure
}

'Dev > C++' 카테고리의 다른 글

boost 설치  (0) 2013.11.20
boost::asio 클라이언트 소켓 (timeout 기능)  (0) 2010.10.14
C++0x, RValue Reference  (0) 2009.05.27
C++0x Lambda  (0) 2009.05.20
C++0x 지원 컴파일러 목록  (0) 2009.05.20

+ Recent posts