<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Untitled</title><generator>Tumblr (3.0; @wonnyz)</generator><link>http://wonnyz.tumblr.com/</link><item><title>MongoDB 스키마 디자인의 함정</title><description>&lt;p&gt;&lt;em&gt;&lt;span&gt;역주: &lt;/span&gt;&lt;/em&gt;&lt;em&gt;&lt;a href="http://d.hatena.ne.jp/hiroppon/20130326/1364265864"&gt;&lt;a href="http://d.hatena.ne.jp/hiroppon/20130326/1364265864"&gt;http://d.hatena.ne.jp/hiroppon/20130326/1364265864&lt;/a&gt;&lt;/a&gt; 의 글을 번역.&lt;br/&gt;&lt;/em&gt;&lt;em&gt;위의 글은 다음 글을 일본어로 번역하면서 코멘트를 추가한 것임&lt;br/&gt;&lt;/em&gt;&lt;em&gt;&lt;a href="http://blog.serverdensity.com/mongodb-schema-design-pitfalls/"&gt;&lt;a href="http://blog.serverdensity.com/mongodb-schema-design-pitfalls/"&gt;http://blog.serverdensity.com/mongodb-schema-design-pitfalls/&lt;/a&gt;&lt;/a&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;MongoDB를 간단하게 시작할 수 있는 이유 중 하나는 &amp;#8220;스키마 디자인을 생각하지 않아도 된다&amp;#8221;는 것이다. 단순히 데이터를 넣고 나중에 쿼리하면 된다. 따라서 초기에 개발을 시작할 때 편리하며 나중에 문서의 구조를 변경할 때에도 이점이 된다. 그러나…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schemaless가 스키마 설계를 하지 않아도 된다는 의미는 아니다!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;따라서 다른 데이터베이스들처럼 성능 향상 및 확장 가능하게 하기 위해서는 역시 스키마 디자인을 고려해야 한다.&lt;br/&gt; 이러한 점은 다음의 기사에서도 언급되고 있다.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.mongodb.org/manual/core/data-modeling/"&gt;&lt;a href="http://docs.mongodb.org/manual/core/data-modeling/"&gt;http://docs.mongodb.org/manual/core/data-modeling/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.mongodb.org/post/38467892360/mongodb-schema-design-insights-and-tradeoffs-from"&gt;&lt;a href="http://blog.mongodb.org/post/38467892360/mongodb-schema-design-insights-and-tradeoffs-from"&gt;http://blog.mongodb.org/post/38467892360/mongodb-schema-design-insights-and-tradeoffs-from&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/jrosoff/mongodb-advanced-schema-design-inboxes"&gt;&lt;a href="http://www.slideshare.net/jrosoff/mongodb-advanced-schema-design-inboxes"&gt;http://www.slideshare.net/jrosoff/mongodb-advanced-schema-design-inboxes&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;본 글에서는 MongoDB의 스키마 설계의 함정에 대해 다룬다.&lt;/p&gt;
&lt;h2&gt;문서를 키우지 않는다&lt;/h2&gt;
&lt;p&gt;기존 문서에 새로운 필드를 추가하거나 크기를 크게 하거나 (필드 이름 + 값) 하면 원래의 영역에 맞지 않게 되어 문서를 데이터 파일의 &lt;a href="http://docs.mongodb.org/manual/core/data-modeling/#document-growth"&gt;빈 영역으로 이동&lt;/a&gt;해야 한다. 이 작업은 데이터가 다시 쓰이게 되므로 성능에 영향을 준다. 또한 이러한 일이 대량으로 발생하면 MongoDB는 문서에 대한 &lt;a href="http://docs.mongodb.org/manual/core/write-operations/#padding-factor"&gt;여백 비율 (padding factor)&lt;/a&gt;을 조정한다. 따라서 문서는 기본적으로 더 많은 공간을 소비하게 된다. 그러나 원 영역 내에서의 (in-place) 업데이트는 빠르다.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://docs.mongodb.org/manual/reference/database-profiler/"&gt;프로파일러를 사용&lt;/a&gt;해서 문서가 이동된 것을 감지 할 수 있다. 만약 moved 필드가 true인 경우 문서는 재작성 (이동) 된 것이다. 이것을 시정하면 성능 개선의 여지가 있다. (아래)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MongoDB 문서를 디스크에 저장할 때 어느 정도의 패딩을 한다. 따라서 추후 문서를 업데이트할 때 약간의 크기 증가가 있었다고 해도 in-place update가 가능하다. 패딩 양은 문서 크기에 대한 비율로, 예를 들면 1.001과 같이 설정되어 있다.&lt;/p&gt;
&lt;p&gt;위와 같이 업데이트에 따른 문서 이동이 많으면 이 값이 커진다 (1.0 ~ 2.0, default&amp;#160;: 1.0 = nopad). 만약 이 값이 2.0이라면 문서를 저장할 때는 그 2배의 공간이 필요하게 된다. 당연히 이렇게 되면 디스크나 메모리의 소비가 효율적이지 않고 성능이 떨어진다.&lt;/p&gt;
&lt;p&gt;이전에는 이 값은 커지기만 하고 완전히 제어할 수 없었지만, 2.2에서 compact나 각종 tool 등으로 지정할 수 있도록 했다. 또한 2.4 소스에서 업데이트시 축소 방향으로도 조정이 들어가 있는 것으로 보인다. (별로 신경 쓰지 않아도 되게 바뀌었는지도 모른다 → 확인 필요)&lt;/p&gt;
&lt;h3&gt;프로필의 예&lt;/h3&gt;
&lt;pre&gt;// 이 DB의 프로필 (레벨 2)를 활성화
PRIMARY&amp;gt; db.setProfilingLevel (2);

// 필드 추가
PRIMARY&amp;gt; db.testcol.update ({_id : ObjectId ( "514ac4666bff1b5721ca1bc1")}, {$ set {value3 : "a"}})

// 프로파일 결과는 system.profile에 저장되어 있다

PRIMARY&amp;gt; db.system.profile.find ({op : 'update'})
{
     "op": "update" 
     "ns": "testdb.testcol"
     "query": { "_id": ObjectId ( "514ac4666bff1b5721ca1bc1")}
     "updateobj": { "$ set": { "value3": "a"}}
     "idhack": true, 
     "moved": true,
     "nmoved": 1,
     "nupdated": 1,
     "keyUpdates": 0,
     "numYield": 0,
     "lockStats": { "timeLockedMicros": { "r": NumberLong (0) "w": NumberLong (394)} "timeAcquiringMicros": { "r": NumberLong (0) "w": NumberLong (8 )}}
     "millis": 0,
     "ts": ISODate ( "2013-03-22T04 : 30:35.504 Z")
     "client": "192.168.159.142", "allUsers": [{ "user": "crumb", "userSource": "admin"}], "user": "crumb @ admin" 
}&lt;/pre&gt;
&lt;h3&gt;paddingFactor의 증감 확인&lt;/h3&gt;
&lt;p&gt;매번 update마다 평가되어 적당한 값으로 조정되는 모양.&lt;/p&gt;
&lt;p&gt;또한 compact로 지정할 수 있는 paddingFactor는 compact를 위한 일시적인 값이며, 위의 paddingFactor에 관계없이 padding한다. 또한 범위도 1.0 ~ 4.0이다. 머리가 좋아진 반면 예측이 어려워진 것일까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;필드 연산자를 사용&lt;/h2&gt;
&lt;p&gt;전체 문서를 업데이트하지 않고 필드 지정을 사용하여 필요한 필드만 업데이트할 수 있다. 새 문서 전체를 전송하는 대신 업데이트할 필드에 &lt;a href="http://docs.mongodb.org/manual/reference/operator/set/#_S_set"&gt;set&lt;/a&gt; 및 &lt;a href="http://docs.mongodb.org/manual/reference/operator/unset/#_S_unset"&gt;remove&lt;/a&gt; 연산자를 지정할 수있다. 또한 &lt;a href="http://docs.mongodb.org/manual/reference/operator/inc/#_S_inc"&gt;increment&lt;/a&gt; 와 같이 특정 작업을 수행하는 연산자도 몇 가지 있다. 이들은 데이터베이스 통신뿐만 아니라 데이터 파일 처리면에서도 매우 효율적이다.&lt;/p&gt;
&lt;h2&gt;BSON 데이터 형식에 유의&lt;/h2&gt;
&lt;p&gt;문서는 필드의 데이터 형식을 변경하기만 해도 이동될 수 있다. 데이터를 저장할 때 그 형식도 고려할 필요가 있다. 예를 들면 (float) 0.0 (int) 0으로 한 경우 &lt;a href="http://bsonspec.org/#/specification"&gt;BSON data type&lt;/a&gt;이 달라서 문서의 이동을 일으키는 경우가 있다.&lt;/p&gt;
&lt;h2&gt;문서를 사전 할당(preallocate)한다&lt;/h2&gt;
&lt;p&gt;나중에 문서의 필드가 추가될 것을 알고 있다면 임시 값으로 미리 할당해 두었다가 나중에 $set 연산자로 실제 값으로 업데이트하여 문서의 크기가 증가하는 것을 막을 수 있다. 이때 위와 같이 데이터 형식을 명심해야 한다. 특히 null은 다른 데이터 형식이다!&lt;/p&gt;
&lt;p&gt;그러나 사전 할당은 랜덤하게 일으켜야 한다. 갑자기 대량의 문서 insert가 발생하면 시스템에 부담이 될 것이다. 한번에 모든 작업이 일어나게 하지 말고, 미리 적절한 시간대에 작업해두는 것이 좋을 것이다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;여기서는 한 문서의 필드를 미리 할당할 뿐만 아니라 앞으로 사용할 예정인 레코드도 어느 정도 사전 배분 해두라고 하는 것 같다. 확실히 피크 시간대에는 &amp;#8220;쓰기 작업이 한계다&amp;#8221;라거나 &amp;#8220;데이터 파일 추가 (2GB)&amp;#8221;와 같은 갑작스런 I/O가 문제다 라고는 생각할 수 있지만, 솔직히 별로 어려운 점은 없었다.&lt;/p&gt;
&lt;p&gt;단지 (나의 환경에서도) 새 insert보다 (in-place) update 쪽이 (모든 필드를 업데이트했다고 해도) 배 가까이 빠르기 때문에 곤란한 사람은 해볼만한 가치가 있을 것 같다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;필드 이름도 공간을 차지한다&lt;/h2&gt;
&lt;p&gt;수백만개 정도의 레코드 수에서는 별로 중요하지 않다. 그러나 수십억의 레코드를 처리할 경우 &lt;a href="http://blog.serverdensity.com/on-shortened-field-names-in-mongodb/"&gt;인덱스 크기에도 꽤나 영향을 끼친다&lt;/a&gt;. 디스크 용량은 상관없다 해도 메모리는 다르다. 데이터가 가능한 메모리에 올라와 있기를 바랄 것이다.&lt;/p&gt;
&lt;h2&gt;_id를 활용할 것&lt;/h2&gt;
&lt;p&gt;모든 컬렉션은 _id 인덱스를 가지고 있다. 따라서 이것을 어플리케이션 용도의 고유 인덱스로 활용할 수 있다. 예를 들면 (자사의) &lt;a href="http://www.serverdensity.com/"&gt;Server Density&lt;/a&gt; 용 서버 모니터링 정보로 날짜, 계정 ID, 서버 ID와 같은 구조를 가진 컬렉션의 경우, 문서를 확인하기 위해 이러한 필드 복합 인덱스 (날짜, 계정 ID, 서버 ID) 대신 _id를 사용하여 쿼리 할 수​​ 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;당연하다면 당연한 것이지만 애플리케이션 차원에서 _id를 적극적으로 쓰세요- 라는 것이다. 귀가 아플 정도&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;covered index를 사용하고 있는가?&lt;/h2&gt;
&lt;p&gt;만약 쿼리를​​ 실행할 때 사용할 인덱스에 모든 반환 필드가 포함 된 경우 쿼리는 인덱스 참조로 끝나며 MongoDB는 데이터 파일을 읽을 필요가 없다. 따라서 성능을 최대한 높이기 위해 모든 데이터를 메모리에 올릴 필요성이 줄어든다. (역주: 인덱스만 메모리에 올려도 된다는 말) 이것을 &lt;a href="http://docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queries"&gt;covered query&lt;/a&gt;라고 한다. covered query를 사용하면 &lt;a href="http://docs.mongodb.org/manual/reference/explain/"&gt;explain&lt;/a&gt; 결과가 indexOnly = true 로 나온다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;일반적인 RDBMS 에도 비슷한 기능이 있기 때문에 MongoDB가 특별한 것은 아니고 오히려 일반적인 방법. 적극적으로 사용할 것.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;컬렉션이나 데이터베이스를 최대한 잘 사용한다&lt;/h2&gt;
&lt;p&gt;여러 컬렉션 및 데이터베이스에 데이터를 분할하는 것을 고려한다.&lt;/p&gt;
&lt;p&gt;컬렉션의 drop은 모든 문서를 remove하는 것보다 훨씬 빠르다. 이것은 데이터 보존 기간을 다룰 때 도움이 된다. 예를 들어 일 단위로 컬렉션을 나누어 대량의 컬렉션을 다루더라도 일반적인 처리 방법과 크게 다르지 않다. 단지 &lt;a href="http://docs.mongodb.org/manual/core/data-modeling/#large-number-of-collections"&gt;네임스페이스의 제한 등 몇 가지 주의&lt;/a&gt;가 필요한 항목이다.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.serverdensity.com/goodbye-global-lock-mongodb-2-0-vs-2-2/"&gt;데이터베이스 수준 잠금&lt;/a&gt;이 있으므로, 데이터베이스를 분리하여 부하 집중을 피할 수 있다. 예를 들어 인증 DB에서 처리량이 높은 로그 DB를 분리할 수 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;전체적으로 약간 알기 어려워서 대강 설명&lt;/h3&gt;
&lt;p&gt;일마다 컬렉션을 나누어두면 보관 기간이 만료된 문서의 삭제 처리는 컬렉션 drop으로 끝이므로 빨라진다. 컬렉션이 늘어나고 복잡해지는 것은 별거 아니니까 앱으로 처리하라고..&lt;/p&gt;
&lt;h3&gt;네임스페이스의 제한&lt;/h3&gt;
&lt;p&gt;- nssize 옵션에서 네임스페이스 의 데이터 파일 크기를 지정할 수 있다. 이 크기는 데이터베이스에 저장할 수있는 컬렉션 수와 직결된다. 보통 초기 값 16M으로 충분하지만 (나는 4M에서 사용함) 수만의 컬렉션을 만들고 싶다면 튜닝이 필요&lt;/p&gt;
&lt;h3&gt;데이터베이스 수준 잠금&lt;/h3&gt;
&lt;p&gt;본문의 인증 DB의 예는 이해가 어렵다. 인증 DB (admin)가 잠기면 모든 쿼리가 멈추잖아! 라고 말하고 싶은가?&lt;/p&gt;
&lt;p&gt;MongoDB 2.2부터 전역 잠금 (mongod 전체 잠금)에서 데이터베이스 수준 잠금 (특정 DB의 처리를 잠금)로 변경되었다.&lt;br/&gt; 알기 쉬운 예로, compact 명령이나 repairDatabase 등의 명령으로 디스크 공간의 청소를 하려면 게시된 데이터베이스는 청소가 끝날 때까지 잠기지만 다른 데이터베이스 작업은 잠금의 영향을 받지 않는다.&lt;br/&gt; 그 밖에도 데이터 파일이 추가될 때의 잠금 등 여러가지 고려해야 하는 것이 잠금 타이밍이다.&lt;/p&gt;
&lt;p&gt;어? 그런데 compact 명령이 어느새 DB를 잠그지 않는 모양.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;모든 것을 테스트하라&lt;/h2&gt;
&lt;p&gt;많은 사람들이 MongoDB의 확장성을 오해하고 있다. 그 자체가 간단한 것은 아니다. 잘 생각하고 이해하고 테스트하는 수밖에 없다. 프로파일러 및 explan을 활용하여 생각대로 동작하는지 시험하라. 그리고 라이브 코드에서도 일정 기간 동안은 벤치마크를 해볼 것. 이 글에서 다루지 못한 훌륭한 예제를 다룬 &lt;a href="http://blog.pythonisito.com/2012/09/mongodb-schema-design-at-scale.html"&gt;링크&lt;/a&gt;가 있다.&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/50724564555</link><guid>http://wonnyz.tumblr.com/post/50724564555</guid><pubDate>Sat, 18 May 2013 08:50:00 -0400</pubDate></item><item><title>exists / apply를 이용한 쿼리 비교</title><description>&lt;p&gt;일별로 데이터를 집계해 넣는 테이블이 있다. 원본 데이터가 제 날짜에 들어오지 않았다면 그 날의 데이터는 빈다. 일별 데이터 건수는 몇만에서 십만단위가 될 수도 있다. (더 많을 수도 있고)&lt;/p&gt;
&lt;p&gt;목표는 데이터가 들어온 날만 찝어서 알려주는 쿼리 작성.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="http://media.tumblr.com/1da4a5cca00b6076b433d958a255d5e3/tumblr_inline_mhgwvo2DSK1r0k4b5.png"/&gt;&lt;/p&gt;
&lt;p&gt;처음에는 위에 있는 exists를 이용한 서브쿼리를 짰는데, 나중에 비슷한 것을 다시 만들면서 2005부터 추가된 apply 구문을 사용했다. 이게 훨씬 빠른데..&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="http://media.tumblr.com/48e8faf03bb00addfc96977d9edbb175/tumblr_inline_mhgwx39JbL1r0k4b5.png"/&gt;&lt;/p&gt;
&lt;p&gt;위 exist 구문의 상관쿼리를 any 연산자를 사용하여 다음과 같이 변경할 수 있다.&lt;/p&gt;
&lt;pre&gt;select dt
from
	dbo.bdt_Date d
where
	d.dt between @monStart and @monend
	and
	d.dt = any (
		select sDate from dbo.SomeLog
	)
order by 1&lt;/pre&gt;
&lt;p&gt;둘다 NL 조인으로 풀어내며, 양쪽 모두 (12월 1일~12월 31일) 31번 index seek 들어간다. 이렇게만 놓고 보면 큰 차이가 없어야 하는데.. 차이는 다른 곳에서 난다.&lt;/p&gt;
&lt;pre&gt;set statistics io on
go
dbcc freeproccache
dbcc dropcleanbuffers

...쿼리1...
go
dbcc freeproccache
dbcc dropcleanbuffers

...쿼리2...
&lt;/pre&gt;
&lt;p&gt;했을 때 결과는 다음과 같다.&lt;/p&gt;
&lt;pre&gt;DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

(29 row(s) affected)
테이블 'SomeLog'. 검색 수 31, 논리적 읽기 수 &lt;em&gt;281&lt;/em&gt;, 물리적 읽기 수 3, 미리 읽기 수 &lt;em&gt;693&lt;/em&gt;, 
LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'bdt_date'. 검색 수 1, 논리적 읽기 수 2, 물리적 읽기 수 2, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(1 row(s) affected)
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

(29 row(s) affected)
테이블 'SomeLog'. 검색 수 31, 논리적 읽기 수 &lt;em&gt;245&lt;/em&gt;, 물리적 읽기 수 2, 미리 읽기 수 &lt;em&gt;36&lt;/em&gt;, 
LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 'bdt_date'. 검색 수 1, 논리적 읽기 수 2, 물리적 읽기 수 2, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

(1 row(s) affected)
&lt;/pre&gt;
&lt;p&gt;이걸 연 수준 데이터로 확대하면 차이는 더 늘어난다.&lt;/p&gt;
&lt;pre&gt;(363 row(s) affected)
테이블 'SomeLog'. 검색 수 366, 논리적 읽기 수 &lt;em&gt;3224&lt;/em&gt;, 물리적 읽기 수 8, 미리 읽기 수 &lt;em&gt;6977&lt;/em&gt;

(363 row(s) affected)
테이블 'SomeLog'. 검색 수 366, 논리적 읽기 수 &lt;em&gt;2784&lt;/em&gt;, 물리적 읽기 수 8, 미리 읽기 수 &lt;em&gt;394&lt;/em&gt;
&lt;/pre&gt;
&lt;p&gt;물리적 읽기 수는 큰 차이가 없는데.. 미리 읽기에서 작두를 잘못탄게 아닌가 하는 생각이 좀 들고, 논리적 읽기 (버퍼 캐시에서 읽어들이는) 차이가 좀 나는 것도 있고.. 하여튼 결론은 apply ( select top(1) ) 쓰는게 낫다는 것.&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/41914675155</link><guid>http://wonnyz.tumblr.com/post/41914675155</guid><pubDate>Wed, 30 Jan 2013 21:39:00 -0500</pubDate></item><item><title>SQL Server Agent 작업 실행중인지 판단</title><description>&lt;p&gt;필요해서 급조해봄&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use msdb
go

-- 해당 작업이 현재 실행중인가?
create function dbo.fn_JobIsRunning (
    @job_id uniqueidentifier
) RETURNS TABLE AS 
RETURN
    select is_running = case when stop_execution_date is null then 1 else 0 end
    from msdb.dbo.sysjobactivity ja 
    where ja.job_id = @job_id and ja.session_id = (
        SELECT top 1 session_id from msdb.dbo.syssessions
        order by session_id desc
    )
go

-- 낮은 권한에서도 실행할 수 있도록 함
grant select on fn_jobisrunning to SQLAgentUserRole
go

-- TEST
execute as user='agentUser'
select * from dbo.fn_jobisrunning ('48A9CAD5-41C2-4FD9-9B45-67B485122F09')
revert
&lt;/code&gt;&lt;/pre&gt;</description><link>http://wonnyz.tumblr.com/post/40820809408</link><guid>http://wonnyz.tumblr.com/post/40820809408</guid><pubDate>Thu, 17 Jan 2013 23:40:28 -0500</pubDate></item><item><title>저장 프로시저 레코드셋 조사</title><description>&lt;p&gt;당연한 이야기지만 소스를 가지고 있거나 스펙을 받거나 하는 것이 좋다.&lt;br/&gt;
그러나 불가피한 경우에는 다음과 같이 조사할 수 있다.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;SQL Server 2012 이상:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/ko-kr/library/ff878602.aspx"&gt;sp_describe_first_result_set&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SQL Server 2008 R2 이하:&lt;br/&gt;
바로 볼 수 있는 방법이 없어서 다음과 같이 돌아가야 함.&lt;br/&gt;
linked server 설정 변경이므로 좀 높은 권한이 필요할 듯&lt;/p&gt;

&lt;p&gt;아래 예제에서 서버 이름은 SERVER00, 실행시킬 프로시저는 msdb..sp_help_jobstep&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-- 로컬 서버에 대해 잠시 data access를 켠다. 권한 필요.  
exec sp_serveroption 'SERVER00', 'data access', 'true'

-- 결과를 임시 테이블에 저장
select * into #tmp from openquery ([SERVER00], 'set fmtonly on exec msdb..sp_help_jobstep')

-- 서버 설정 원래대로
exec sp_serveroption 'SERVER00', 'data access', 'false'

-- 테이블 형식 조회
exec tempdb..sp_help '#tmp'
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://wonnyz.tumblr.com/post/40504592517</link><guid>http://wonnyz.tumblr.com/post/40504592517</guid><pubDate>Mon, 14 Jan 2013 01:49:54 -0500</pubDate></item><item><title>관리자 계정이 아닌 계정으로 예약된 작업 돌리기</title><description>&lt;h2&gt;참고 링크&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://support.microsoft.com/kb/867466/ko"&gt;http://support.microsoft.com/kb/867466/ko&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;도메인 멤버 서버에서&lt;/li&gt;
&lt;li&gt;예약된 작업을 돌릴 때&lt;/li&gt;
&lt;li&gt;Run As에 지정된 계정이 관리자 그룹에 속하지 않음&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;이러면 작업 스케줄러에서 실행이 안되고 로그 &lt;em&gt;(c:\windows\tasks\SchedLgu.txt)&lt;/em&gt; 에는 다음과 같이 남게 됨&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;** 오류 **&lt;br/&gt;
  작업을 시작할 수 없습니다..&lt;br/&gt;
  특정 오류:&lt;br/&gt;
  0x80070005: 액세스가 거부되었습니다.&lt;br/&gt;
  [작업 페이지 찾기] 단추를 사용하여 응용 프로그램을 찾으십시오..&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;해결&lt;/strong&gt;: CACLS를 이용해서 CMD.EXE 사용 권한 변경&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CACLS %COMSPEC% /E /G "NT AUTHORITY\BATCH":R
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;일괄 작업 계정 셋업&lt;/h2&gt;

&lt;p&gt;작업을 돌리기 위한 전용 계정을 만들었다면 그룹 정책의 일괄 작업으로 로그온에 추가해줄 것
(화면에서 더블 클릭하고 &lt;strong&gt;사용자 또는 그룹 추가&lt;/strong&gt; 클릭)
&lt;img src="http://media.tumblr.com/3a976bfc6fedbfdd7d7c5ff82f78a671/tumblr_inline_mggny69zL91r0k4b5.png" alt=""/&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/40250412410</link><guid>http://wonnyz.tumblr.com/post/40250412410</guid><pubDate>Fri, 11 Jan 2013 07:30:00 -0500</pubDate></item><item><title>파워셸 원격 세션에 non-admin 계정 사용 연결</title><description>&lt;h3&gt;선결 조건&lt;/h3&gt;
&lt;p&gt;서버 (ServerA로 칭함), 클라이언트 (ClientA) 에서 같은 이름, 같은 패스워드의 계정이 필요함.&lt;br/&gt; ex) 서버: ServerA\AccountA, 클라이언트: ClientA\AccountA&lt;/p&gt;
&lt;h3&gt;서버 설정&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;(관리자 권한) WinRM으로 접근 허가
&lt;pre&gt;winrm quickconfig
winrm set winrm/config/client @{TrustedHosts="172.16.0.1"}

(파워셸이라면)
set-item wsman:\localhost\client\TrustedHosts "172.16.0.1"&lt;/pre&gt;
예제의 172.16.0.1은 클라이언트의 IP로 대체&lt;/li&gt;
&lt;li&gt;(파워셸에서, 관리자 권한) Non-Admin 계정도 세션을 열 수 있도록 설정
&lt;pre&gt;set-pssessionconfiguration microsoft.powershell -showsecuritydescriptor
&lt;/pre&gt;
창이 뜨면 접속을 원하는 계정 (서버이므로 ServerA\accountA) 추가 후 실행 (Invoke) 추가&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;클라이언트 설정&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;workgroup 컴퓨터에 대해 Negotiate 사용 (관리자 권한 필요)
&lt;pre&gt;winrm set winrm/config/client @{TrustedHosts="&amp;lt;local&amp;gt;"}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;(파워셸에서) 인증 정보 생성
&lt;pre&gt;$c = get-credential clientA\accountA
&lt;/pre&gt;
패스워드 입력창이 뜨고 입력해준다.&lt;/li&gt;
&lt;li&gt;(파워셸에서) 세션 생성
&lt;pre&gt;new-pssession -computername serverA -credential $c -Authentication Negotiate
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;a href="http://pubs.vmware.com/orchestrator-plugins/index.jsp?topic=/com.vmware.using.powershell.plugin.doc_10/GUID-D4ACA4EF-D018-448A-866A-DECDDA5CC3C1.html"&gt;Configure WinRM to Use HTTP&lt;/a&gt; &lt;br/&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa384372(VS.85).aspx"&gt;Installation and Configuration for Windows Remote Management&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;파워셸에서 winrm 명령 입력시에는 &amp;#8216;@{~}&amp;#8217; 이렇게 양쪽을 홑따옴표로 감싸줌.&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/39639289454</link><guid>http://wonnyz.tumblr.com/post/39639289454</guid><pubDate>Fri, 04 Jan 2013 01:47:00 -0500</pubDate></item><item><title>js 고속화 노하우 (잡지 요약)</title><description>&lt;p&gt;기술잡지를 버리려다가 JS 고속화 노하우라는게 보여서 납득이 간 것만 추려서 정리해봄. 아마 다른 곳에도 많을 거라고 생각은 하지만..&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;기본 오브젝트 확장시 속도가 느려질 수 있음
&lt;ul&gt;&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;RegExp&lt;/li&gt;
&lt;li&gt;Number&lt;/li&gt;
&lt;/ul&gt;
또한 window 개체에 직접 함수나 변수를 추가하는 것을 global 오염이라고 하는데, 이 경우 기능 충돌이나 변수 덮어쓰기 등을 불러일으킬 수 있음.
&lt;pre class="prettyprint"&gt;Array.prototype["ex1"] = function(){};
String.prototype["ex2"] = function(){};
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;범위 해결 (Scope resolution) 비용
&lt;pre class="prettyprint"&gt;var flat = function() {};
var nest = {
	lv2: {
		lv3: function() {
			//..
		}
	}
};
&lt;/pre&gt;
flat() 보다 nest.lv2.lv3() 이 더 느린 것은 말할 것도 없음.&lt;/li&gt;
&lt;li&gt;자주 쓰는 배열 / 해시는 alias (또는 참조 변수)로 참조
&lt;pre class="prettyprint"&gt;var matrixA = [1,0,0,0,1,0,0,0,1];
var matrixB = [1,0,0,0,0,1,0,1,0];

function matrixMultiply1() {
	var a = matrixA;
	var b = matrixB;

	return [a[0]*b[0]+a[1]*b[3]+a[2]*b[6],
			/* 중간 생략 */
			a[6]*b[2]+a[7]*b[5]+a[8]*b[8]];
}

function matrixMultiply2() {
	var a = matrixA;
	var b = matrixB;

	var a11=a[0], b11=b[0];
	/* 생략 */
	var a33=a[8], b33=b[8];

	return [a11*b11 + a12*b21 + a13*b31,
			/* 중간 생략 */
			a31*b13 + a32*b23 + a33*b33];
}
&lt;/pre&gt;
예로 든 행렬의 곱셈에서는 배열의 한 항목당 세번씩 참조되는데, 이것을 참조로 두고 계산하면 반복작업시 속도 향상이 있음. 해시나 노드 리스트 등에서도 사용 가능
&lt;pre class="prettyprint"&gt;function all1() {
	var v=[], list=document.getElementsByTagName("A"), k=list.length;

	for(var i=0,j=-1; i &amp;lt; k; i++) {
		if (list[i].nodeType == 1) {
			v[++j] = list[i];
		}
	}
	return v;
}

function all2() {
	var v=[], list=document.getElementsByTagName("A"), k=list.length, t;

	for(var i=0,j=-1; i &amp;lt; k; i++) {
		t = list[i];
		if (t.nodeType == 1) {
			v[++j] = t;
		}
	}
	return v;
}&lt;/pre&gt;
단 this는 alias로 써봐야 의미 없음.&lt;/li&gt;
&lt;li&gt;GC를 자주 일으키지 말 것 &lt;br/&gt;특히 루프문 안에서 사용될 개체를 반복 선언하는 등의 일은 피할 것.
&lt;pre class="prettyprint"&gt;var bad = {
	inline: function() {
		for (i=0; i &amp;lt; 3; i++) {
			({"a":1,"b":2,"c":3})[i];
		}
	}
};

var hash = {"a":1,"b":2,"c":3};
var good = {
	inline: function() {
		for (i=0; i &amp;lt; 3; i++) {
			hash[i];
		}
	}
};

var hash = {"a":1,"b":2,"c":3};
var good_alias = {
	inline: function() {
		var t = hash;
		for (i=0; i &amp;lt; 3; i++) {
			hash[i];
		}
	}
};&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;가변인수는 피할 것
&lt;pre class="prettyprint"&gt;function sum_bad() {
	var t = 0;
	var i = 0, l = arguments.length;
	for (; i &amp;lt; l; i++) {
		t += arguments[i];
	}
	return t;
}

// 최대 5개
function sum5(a,b,c,d,e) {
	return a+(b||0)+(c||0)+(d||0)+(e||0);
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Function.apply 대신 Function.call을, 가급적이면 그것도 쓰지 말 것
&lt;pre class="prettyprint"&gt;function fn (a, b) { /* ... */ }

// 제일느림
fn.apply(this, [1, 2]);

// 그다음 느림
fn.call(this, 1, 2);

// 빠름
fn(1, 2);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;from Web DB Press Vol.57&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/39387335033</link><guid>http://wonnyz.tumblr.com/post/39387335033</guid><pubDate>Tue, 01 Jan 2013 11:34:15 -0500</pubDate></item><item><title>SQLSafeCmd Freeware Edition (4.9.635)</title><description>&lt;p&gt;뭘 잘못먹었나 인스톨러가 꼭 Trial로만 설치하는데, FreeEdition 이라고 DWORD값을 추가하고 값은 1을 넣어주면 됨. 서버 인스턴스명으로 자동 추가된 키값은 건드리지 말 것&lt;/p&gt;
&lt;p&gt;레지스트리 Export:&lt;/p&gt;
&lt;pre&gt;Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Idera\SQLsafe\Backup Agent\Licenses]
"FreeEdition"=dword:00000001&lt;/pre&gt;</description><link>http://wonnyz.tumblr.com/post/37161891586</link><guid>http://wonnyz.tumblr.com/post/37161891586</guid><pubDate>Mon, 03 Dec 2012 22:15:55 -0500</pubDate></item><item><title>증가 추세선 구하기 (선형, 최소제곱법)</title><description>&lt;p&gt;아래 예제에서 tmp_daily_db_usage 테이블은 데이터베이스의 일별 용량을 파악하여 기록한 것이며, usage_type에는 데이터 / 로그 구분이 들어간다. 구별 카테고리를 세개나 뒀더니 (DB명, 데이터/로그, 사용량/잔여량) 쿼리가 복잡해진 것은 안자랑 ㅡㅡ&lt;/p&gt;
&lt;pre class="prettyprint"&gt;DECLARE @dateA CHAR(10) = '2012-10-20'
DECLARE @dateB CHAR(10) = '2012-10-30'

;WITH 
ds (input_dt,Cat1,Cat2,Cat3,Value) 
AS (
	SELECT	input_dt,[dbname],usage_type,'used',usedspacemb
	FROM	dbo.tmp_daily_db_usage
	WHERE	input_dt BETWEEN @dateA AND @dateB
	UNION ALL	
	SELECT	input_dt,[dbname],usage_type,'free',freespacemb
	FROM	dbo.tmp_daily_db_usage
	WHERE	input_dt BETWEEN @dateA AND @dateB
),
ds_rnk (Cat1,Cat2,Cat3,x,y) 
AS (
	SELECT 
		Cat1,Cat2,Cat3
		,RANK() OVER (
			PARTITION BY Cat1,Cat2,Cat3 
			ORDER BY input_dt
		),CAST(Value AS FLOAT)
	FROM	ds
	WHERE Cat1 NOT IN ('master','msdb','model','tempdb')
),
average_estimate (Cat1,Cat2,Cat3,xbar,ybar) 
AS (
	SELECT	Cat1,Cat2,Cat3,AVG(x),AVG(y)
	FROM	ds_rnk
	GROUP BY Cat1,Cat2,Cat3
),
beta_estimate (Cat1,Cat2,Cat3,beta) 
AS (
	SELECT 
		t.Cat1,t.Cat2,t.Cat3
		,CASE COALESCE(SUM((x - xbar) * (x - xbar)), 0)
			WHEN 0 THEN NULL
			ELSE SUM((x - xbar) * (y - ybar)) / SUM((x - xbar) * (x - xbar))
			END AS Beta
	FROM ds_rnk t
	INNER JOIN average_estimate te ON (
		t.Cat1 = te.Cat1 
		AND t.Cat2 = te.Cat2 
		AND t.Cat3 = te.Cat3
	)
	GROUP BY t.Cat1,t.Cat2,t.Cat3
),
alpha_estimate (Cat1,Cat2,Cat3,alpha)
AS (
	SELECT 
		tb.Cat1,tb.Cat2,tb.Cat3,ybar - xbar * tb.Beta
	FROM beta_estimate tb
	INNER JOIN average_estimate ta ON (
		tb.Cat1 = ta.Cat1
		AND tb.Cat2 = ta.Cat2
		AND tb.Cat3 = ta.Cat3
	)
),
sumsquares_estimate (Cat1,Cat2,Cat3,SS_tot,SS_err)
AS (
	SELECT 
		ta.Cat1,ta.Cat2
		,ta.Cat3
		,SUM((y - ybar) * (y - ybar))
		,SUM((y - (Alpha + Beta * x)) * (y - (Alpha + Beta * x)))
	FROM alpha_estimate ta
	INNER JOIN beta_estimate tb ON (
		ta.Cat1 = tb.Cat1
		AND ta.Cat2 = tb.Cat2
		AND ta.Cat3 = tb.Cat3
	)
	INNER JOIN ds_rnk t ON (
		ta.Cat1 = t.Cat1
		AND ta.Cat2 = t.Cat2
		AND ta.Cat3 = t.Cat3
	)
	INNER JOIN average_estimate te ON (
		ta.Cat1 = te.Cat1
		AND ta.Cat2 = te.Cat2
		AND ta.Cat3 = te.Cat3
	)
	GROUP BY ta.Cat1
		,ta.Cat2
		,ta.Cat3
)
SELECT 
	ta.Cat1,ta.Cat2,ta.Cat3,Alpha,Beta
	,CASE SS_tot
		WHEN 0 THEN 1.0
		ELSE 1.0 - SS_err / SS_tot
		END AS R2
FROM alpha_estimate ta
INNER JOIN beta_estimate tb ON (
	ta.Cat1 = tb.Cat1
	AND ta.Cat2 = tb.Cat2
	AND ta.Cat3 = tb.Cat3
)
INNER JOIN sumsquares_estimate ss ON (
	ta.Cat1 = ss.Cat1
	AND ta.Cat2 = ss.Cat2
	AND ta.Cat3 = ss.Cat3
)
WHERE ta.Cat3 = 'Used'
&lt;/pre&gt;
&lt;p&gt;&lt;img alt="image" src="http://media.tumblr.com/tumblr_mcovboC1ZD1r0k4b5.png"/&gt;&lt;/p&gt;
&lt;p&gt;Thanks to: &lt;a href="http://stackoverflow.com/questions/2536895/are-there-any-linear-regression-function-in-sql-server"&gt;Are there any Linear Regression Function in SQL Server?&lt;/a&gt; - stackoverflow&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/34620444401</link><guid>http://wonnyz.tumblr.com/post/34620444401</guid><pubDate>Tue, 30 Oct 2012 00:33:00 -0400</pubDate></item><item><title>SQL Server Agent 작업항목 나열</title><description>&lt;p&gt;컬럼 설명:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;job_id: 작업 UUID (추적용)&lt;/li&gt;
&lt;li&gt;schedule_id: 스케줄 ID (작업:스케줄의 관계는 1:N임)&lt;/li&gt;
&lt;li&gt;job_name: 작업 이름&lt;/li&gt;
&lt;li&gt;job_desc: 작업 설명&lt;/li&gt;
&lt;li&gt;Running: 실행중인가 (1/0)&lt;/li&gt;
&lt;li&gt;NextRun: 다음 실행 시각&lt;/li&gt;
&lt;li&gt;LastRun: 마지막 실행 시각&lt;/li&gt;
&lt;li&gt;LastStatus: 실행 결과 (sysjobhistory.run_status), 0: 실패&lt;/li&gt;
&lt;li&gt;LastDuration: 실행 시간 (초)&lt;/li&gt;
&lt;li&gt;job_time: 실행 시점 (하루중) (ex: 오전 8시, 매 5분 등)&lt;/li&gt;
&lt;li&gt;job_freq: 실행 시점 (월중) (ex: 매일, 매주 일요일, 매 2일 등)&lt;/li&gt;
&lt;li&gt;DateStart: 이 날부터 일정 사용&lt;/li&gt;
&lt;li&gt;DateEnd: 이 날까지 일정 사용&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="prettyprint"&gt;SELECT
	j.job_id,
	s.schedule_id,
	job_name = j.name,
	job_desc = j.description,
	run.Running,
	NextRun = n.NextRun,
	LastRun = l.LastRun,
	LastStatus = l.run_status,
	LastDuration = l.run_duration,
	job_time = tm_day.TimeOfDay,
	job_freq = F_Frq.Frequency,
	DateStart = eff.StDate,
	DateEnd = eff.EnDate
FROM
	msdb.dbo.sysjobs j
	inner join msdb.dbo.sysjobschedules js on j.job_id = js.job_id
	inner join msdb.dbo.sysschedules s on js.schedule_id = s.schedule_id
	cross apply (
		select case when stop_execution_date is null then 1 else 0 end
		from msdb.dbo.sysjobactivity ja 
		where ja.job_id = j.job_id and ja.session_id = (
			SELECT top 1 session_id from msdb.dbo.syssessions
			order by session_id desc
		)
	) run(Running)
	cross apply (
		select StDate=convert(datetime,convert(varchar(8),active_start_date))
			,EnDate=convert(datetime,convert(varchar(8),active_end_date))
			,StTimeStr=stuff(stuff(right(1000000+active_start_time,6),3,0,N':'),6,0,N':')
			,EnTimeStr=stuff(stuff(right(1000000+active_end_time,6),3,0,N':'),6,0,N':')
	) eff
	cross apply (
		SELECT CASE js.next_run_date 
			when 0 THEN NULL
			ELSE CAST(right(100000000 + js.next_run_date, 8) as datetime) +
				CAST(RIGHT(STUFF(STUFF(
					CAST(1000000+js.next_run_time as varchar(9))
					,4,0,':'),7,0,':'), 8) as datetime)
			END
	) n(NextRun)
	outer apply (
		SELECT TOP 1
			run_status, 
			CAST(right(100000000 + run_date, 8) as datetime) +
			CAST(RIGHT(STUFF(STUFF(
				CAST(1000000+run_time as varchar(9))
				,4,0,':'),7,0,':'), 8) as datetime) as LastRun,
			run_duration/*, message*/
		from msdb.dbo.sysjobhistory h
		where h.step_id = 0 and h.job_id = j.job_id
		order by instance_id desc
	) l
	cross apply (	/* timeofday */
		select case freq_subday_type
			when 0 then ''
			when 1 then 'at ' + StTimeStr
			else 'Every '+convert(varchar(10), freq_subday_interval)
				+' '+case freq_subday_type
					when 2 then 'Sec.'
					when 4 then 'Min.'
					when 8 then 'Hr.'
				end + ' from ' + StTimeStr + ' to ' + EnTimeStr
			end
	) tm_day(TimeOfDay)
	cross apply (
		SELECT case s.freq_type
			when 1 then N'One Time Only'
			when 4 then N'Every ' +
				case s.freq_interval 
					when 1 then N'Day'
					else convert(nvarchar(10),s.freq_interval)+N' Days'
				end
			when 8 then N'Every ' +
				case s.freq_recurrence_factor
					when 1 then N''
					else convert(nvarchar(10),s.freq_recurrence_factor)+N' Weeks on '
				end + 
				stuff(case when freq_interval&amp;amp; 1&amp;lt;&amp;gt;0 then N', Sun' else N'' end
					+case when freq_interval&amp;amp; 2&amp;lt;&amp;gt;0 then N', Mon' else N'' end
					+case when freq_interval&amp;amp; 4&amp;lt;&amp;gt;0 then N', Tue' else N'' end
					+case when freq_interval&amp;amp; 8&amp;lt;&amp;gt;0 then N', Wed' else N'' end
					+case when freq_interval&amp;amp;16&amp;lt;&amp;gt;0 then N', Thu' else N'' end
					+case when freq_interval&amp;amp;32&amp;lt;&amp;gt;0 then N', Fri' else N'' end
					+case when freq_interval&amp;amp;64&amp;lt;&amp;gt;0 then N', Sat' else N'' end
					,1,2,N'')
			when 16 then N'Every ' +
				case freq_recurrence_factor 
					when 1 then 'Month'
					else convert(nvarchar(10),freq_recurrence_factor)+N' Months'
				end + ' on the ' +
				convert(nvarchar(10),freq_interval) +
				case 
					when freq_interval in (1,21,31) then N'st'
					when freq_interval in (2,22) then N'nd'
					when freq_interval in (3,23) then N'rd'
					else N'th'
				 end + ' of the Month'
			when 32 then N'Every ' +
				case freq_recurrence_factor 
					when 1 then N'Month'
					else convert(nvarchar(10),freq_recurrence_factor)+N' Months'
				end + ' on the ' +
				case freq_relative_interval 
					when  1 then N'1st '
					when  2 then N'2nd '
					when  4 then N'3rd '
					when  8 then N'4th '
					when 16 then N'Last '
				end + 
				case freq_interval 
					when  1 then N'Sun'
					when  2 then N'Mon'
					when  3 then N'Tue'
					when  4 then N'Wed'
					when  5 then N'Thu'
					when  6 then N'Fri'
					when  7 then N'Sat'
					when  8 then N'Day'
					when  9 then N'Weekday'
					when 10 then N'Weekend Day'
				 end + ' of the Month'
			when 64 then 'When SQL Server Agent Starts'
			when 128 then 'Whenever the CPUs become Idle'
			else 'Unknown'
		  end
	) F_Frq(Frequency)
where
	j.Enabled = 1
&lt;/pre&gt;
&lt;hr&gt;&lt;p&gt;Thanks to: &lt;a href="http://bradsruminations.blogspot.com/2011/04/documenting-your-sql-agent-jobs.html"&gt;Documenting Your SQL Agent Jobs - SELECT BLOG FROM BRAD.SCHULZ CROSS APPLY SQL.SERVER()&lt;/a&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/34349899829</link><guid>http://wonnyz.tumblr.com/post/34349899829</guid><pubDate>Fri, 26 Oct 2012 03:21:00 -0400</pubDate></item><item><title>파티션 현황 조회용 한방쿼리</title><description>&lt;pre&gt;/*
	fg_name: 인덱스 또는 테이블 파티션의 PS에서 지정된 파일그룹
	Ps_name: partition scheme
	Pf_name: partition function
	Reserved / used: 페이지 단위 (8K)
	Compressed: 압축 상황 (NONE / ROW / PAGE)
*/
SELECT 
	  [table_name] = OBJECT_NAME(ddps.object_id)
	, [boundary] = prv.value
	, [rows] = ddps.row_count
	, [reserved] = ddps.reserved_page_count
	, [used] = ddps.used_page_count
	, [compressed] = p.data_compression_desc
	, [partno] = ddps.partition_number
	, [index_name] = i.name 
	, [fg_name] = ds.name
	, [ps_name] = ps.name
	, [pf_name] = pf.name
FROM
	sys.dm_db_partition_stats ddps
	inner join sys.indexes i on ddps.object_id = i.object_id and ddps.index_id = i.index_id
	inner join sys.partition_schemes ps on i.data_space_id = ps.data_space_id
	inner join sys.partition_functions pf on ps.function_id = pf.function_id
	inner join sys.partition_range_values prv 
		on pf.function_id = prv.function_id and (
			(pf.boundary_value_on_right = 1 and ddps.partition_number = prv.boundary_id + 1)
			or (pf.boundary_value_on_right = 0 and ddps.partition_number = prv.boundary_id)
		)
	inner join sys.partitions p on ddps.partition_id = p.partition_id
	inner join sys.allocation_units au on p.partition_id = au.container_id
	inner join sys.data_spaces ds on au.data_space_id = ds.data_space_id
order by
	ddps.object_id, i.index_id, ddps.partition_number
&lt;/pre&gt;
&lt;p&gt;스크린샷&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_mc4hdwe1VA1r0k4b5.png"/&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/33877576995</link><guid>http://wonnyz.tumblr.com/post/33877576995</guid><pubDate>Fri, 19 Oct 2012 00:10:00 -0400</pubDate></item><item><title>(구상) 파티셔닝하면서 보관을 편리하게</title><description>&lt;p&gt;2013년 1분기 (2013Q1) 데이터를 담아야 한다고 가정하자. &lt;/p&gt;
&lt;h3&gt;먼저 DWDATA_2013Q1 파일그룹을 준비한다.&lt;/h3&gt;
&lt;pre&gt;ALTER DATABASE XXX ADD FILEGROUP [DWDATA_2013Q1]
ALTER DATABASE XXX ADD FILE (NAME = 'DWDATA_2013Q1', FILENAME = 'E:\DBDATA\DWDATA\DWDATA_2013Q1.NDF', SIZE=100MB, FILEGROWTH=100MB) TO FILEGROUP [DWDATA_2013Q1]
&lt;/pre&gt;
&lt;h3&gt;1분기 &amp;#8216;보관용&amp;#8217; 데이터 전체를 담기 위해 파티션을 쪼갠다&lt;/h3&gt;
&lt;pre&gt;-- Quarterly 
ALTER PARTITION SCHEME PS_XXX NEXT USED [DWDATA_2013Q1]
ALTER PARTITION FUNCTION PF_XXX () SPLIT RANGE ( '2013-01-01' )

Declare @seq int
SELECT @SEQ = $PARTITION.PF_XXX('2013-01-01')

/*
이 파티션에 배치되는 순간 페이지 압축이 되도록 관련 테이블들에 대해 EXEC 등으로 다음과 같은 코드를 조립해서 실행
ALTER TABLE [SomeTable] REBUILD PARTITION {@SEQ} with (DATA_COMPRESSION=PAGE)
*/
&lt;/pre&gt;
&lt;h3&gt;매월 데이터를 담기 위해 파티션을 쪼갠다&lt;/h3&gt;
&lt;pre&gt;-- 매 월
ALTER PARTITION SCHEME PS_XXX NEXT USED [DWDATA_LIVE]
ALTER PARTITION FUNCTION PF_XXX () SPLIT RANGE ( '2013-01-01 00:00:01' )

ALTER PARTITION SCHEME PS_XXX NEXT USED [DWDATA_LIVE]
ALTER PARTITION FUNCTION PF_XXX () SPLIT RANGE ( '2013-02-01 00:00:01' )

ALTER PARTITION SCHEME PS_XXX NEXT USED [DWDATA_LIVE]
ALTER PARTITION FUNCTION PF_XXX () SPLIT RANGE ( '2013-03-01 00:00:01' )
&lt;/pre&gt;
&lt;p&gt;즉 월 데이터에 대해서는 00:00:01으로 파티션을 나눈다. 00:00:00.003으로 해도 좋음.&lt;/p&gt;
&lt;p&gt;파티션은 다음과 같이 나뉘게 된다. (뒤는 파일그룹)&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;~ 2013-01-01&amp;#160;00:00:00 이전&lt;/li&gt;
&lt;li&gt;2013-01-01&amp;#160;00:00:00 ~ 2013-01-01&amp;#160;00:00:01 이전 / [DWDATA_2013Q1]&lt;/li&gt;
&lt;li&gt;2013-01-01&amp;#160;00:00:01 ~ 2013-02-01&amp;#160;00:00:01 이전 / [DWDATA_LIVE]&lt;/li&gt;
&lt;li&gt;2013-02-01&amp;#160;00:00:01 ~ 2013-03-01&amp;#160;00:00:01 이전 / [DWDATA_LIVE]&lt;/li&gt;
&lt;li&gt;2013-03-01&amp;#160;00:00:01 ~ / [DWDATA_LIVE]&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;이후에 Q2 데이터를 쪼개면 위와 같은 형식으로 2013-04-01부터 범위를 잡아 쪼개면 된다.&lt;/p&gt;
&lt;h3&gt;전 달 데이터를 보관할 시점이 오면&lt;/h3&gt;
&lt;pre&gt;-- ARCHIVING
ALTER PARTITION FUNCTION PF_XXX () MERGE RANGE ( '2013-01-01 00:00:01' )
&lt;/pre&gt;
&lt;p&gt;이렇게 하면 2013-01-01&amp;#160;00:00:01 범위가 사라져서 2013-01-01 ~ 2013-02-01&amp;#160;00:00:01의 데이터가 모두 보관된다.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;~ 2013-01-01&amp;#160;00:00:00 이전&lt;/li&gt;
&lt;li&gt;2013-01-01&amp;#160;00:00:00 ~ 2013-02-01&amp;#160;00:00:01 이전 / [DWDATA_2013Q1]&lt;/li&gt;
&lt;li&gt;2013-02-01&amp;#160;00:00:01 ~ 2013-03-01&amp;#160;00:00:01 이전 / [DWDATA_LIVE]&lt;/li&gt;
&lt;li&gt;2013-03-01&amp;#160;00:00:01 ~ / [DWDATA_LIVE]&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;이때 위에서처럼 DWDATA_2013Q1 파일그룹에 배치된 파티션에 대해서는 압축을 기본 적용해놓으면 데이터가 쌓이고 있는 파티션에 대해서는 압축을 적용하지 않았더라도 보관 작업 시에 테이블 압축이 자동으로 실행되게 된다.&lt;/p&gt;
&lt;p&gt;이론은 별 문제 없는 것 같은데 증명을 해봐야 함 ;ㅂ;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/33832225204</link><guid>http://wonnyz.tumblr.com/post/33832225204</guid><pubDate>Thu, 18 Oct 2012 08:02:00 -0400</pubDate></item><item><title>SID to Hex</title><description>&lt;p&gt;간만에 SharePoint 작업을 하고 있는데, Windows 계정으로 등록된 사용자는 Contents 데이터베이스의 UserInfo 테이블에 등록될 때 tp_SystemID 값에 SID가 들어간다.&lt;/p&gt;
&lt;p&gt;그런데 wmic 등에서 보여주는 값은 S-1-5-21-WWWW-XXXX-YYYY-ZZZZ 인데, 저 필드에는 Binary로 바뀌어서 들어가기 때문에 이걸 바꿔주는 프로시저를 찾음. &lt;/p&gt;
&lt;p&gt;출처는 &lt;a href="http://jadnb.wordpress.com/2010/01/14/coverting-text-sid-to-binary-in-t-sql/"&gt;&lt;a href="http://jadnb.wordpress.com/2010/01/14/coverting-text-sid-to-binary-in-t-sql/"&gt;http://jadnb.wordpress.com/2010/01/14/coverting-text-sid-to-binary-in-t-sql/&lt;/a&gt;&lt;/a&gt; 이고, 버그가 하나 있어서 코드 중간에 int -&amp;gt; bigint로 바꿔준 부분이 있다.&lt;/p&gt;
&lt;pre&gt;CREATE FUNCTION [dbo].[SidToHex] (@textsid nvarchar(max))
RETURNS varbinary(256)
AS
BEGIN
    DECLARE @pos int,
    @currentBlock nvarchar(max),
    @blockno nvarchar(max),
    @nextHyphen int,
    @revision int,
    @binarysid varbinary(256),
    @blockval bigint;

    SET @pos = 1
    SET @blockno = 0
    SET @binarysid = 0x

    WHILE @pos &amp;lt; LEN(@textsid)
    BEGIN
        SET @nextHyphen = CHARINDEX('-', @textsid, @pos)
        SET @nextHyphen = CASE @nextHyphen WHEN 0 THEN LEN(@textsid) + 1 ELSE @nextHyphen END
        SET @currentBlock = SUBSTRING(@textsid, @pos, @nextHyphen - @pos)
        SET @blockno = @blockno + 1
        SET @pos = @nextHyphen + 1
 
        IF @blockno = 1
        BEGIN
            IF @currentBlock &amp;lt;&amp;gt; 'S'
            RETURN -1
        END
        ELSE IF @blockno = 2
            SET @revision = CONVERT(int, @currentBlock)
        ELSE IF @blockno = 3
            SET @binarysid = @binarysid + CAST(CONVERT(int, @currentBlock) as binary(6))
        ELSE
        BEGIN
            SET @blockVal = CONVERT(bigint, @currentBlock)
            SET @blockVal =
            ((@blockVal &amp;amp; 0x000000FF) * 0x1000000) |
            ((@blockVal &amp;amp; 0x0000FF00) * 0x100) |
            ((@blockVal &amp;amp; 0x00FF0000) / 0x100) |
            ((@blockVal &amp;amp; 0xFF000000) / 0x1000000)
            SET @binarysid = @binarysid + CAST(@blockVal as binary(4))
        END
    END
 
    RETURN CAST(@revision as binary(1)) + CAST(@blockno - 3 as binary(1)) + @binarysid;
END
&lt;/pre&gt;</description><link>http://wonnyz.tumblr.com/post/31377440632</link><guid>http://wonnyz.tumblr.com/post/31377440632</guid><pubDate>Tue, 11 Sep 2012 22:27:07 -0400</pubDate></item><item><title>C#의 익명 대리자 내의 변수 캡쳐 </title><description>&lt;p&gt;딱 다음과 같은 상황: &lt;a href="http://ideone.com/PD1eY"&gt;&lt;a href="http://ideone.com/PD1eY"&gt;http://ideone.com/PD1eY&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre class="de1"&gt;using System&lt;span class="sy0"&gt;;&lt;/span&gt;
using System.&lt;span class="me1"&gt;Collections&lt;/span&gt;.&lt;span class="me1"&gt;Generic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
 
class Test
&lt;span class="br0"&gt;{&lt;/span&gt;
        public &lt;span class="kw4"&gt;static&lt;/span&gt; string&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt; tables &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="st0"&gt;"1"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"2"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"3"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"4"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"5"&lt;/span&gt; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        public delegate string Method&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        public &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; Main&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
        &lt;span class="br0"&gt;{&lt;/span&gt;
                var dict &lt;span class="sy0"&gt;=&lt;/span&gt; new Dictionary&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;string&lt;span class="sy0"&gt;,&lt;/span&gt; Method&lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                foreach&lt;span class="br0"&gt;(&lt;/span&gt;var name in tables&lt;span class="br0"&gt;)&lt;/span&gt;
                &lt;span class="br0"&gt;{&lt;/span&gt;
                        dict.&lt;span class="me1"&gt;Add&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;name&lt;span class="sy0"&gt;,&lt;/span&gt; new Method&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; name&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="br0"&gt;}&lt;/span&gt;
                Console.&lt;span class="me1"&gt;WriteLine&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;dict&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="st0"&gt;"1"&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="br0"&gt;}&lt;/span&gt;
&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;이러면 1→1, 2→2, 3→3, 4→4, 5→5 이렇게 들어가 있을 것 같지만 천만의 말씀이다. &lt;br/&gt;실제로는 1→5, 2→5, 3→5, 4→5, 5→5 가 들어가 있다.&lt;/p&gt;
&lt;p&gt;해결하려면 루프문 안에 로컬 변수를 선언해서 받아주면 된다. &lt;a href="http://ideone.com/xo346"&gt;&lt;a href="http://ideone.com/xo346"&gt;http://ideone.com/xo346&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre class="de1"&gt;using System&lt;span class="sy0"&gt;;&lt;/span&gt;
using System.&lt;span class="me1"&gt;Collections&lt;/span&gt;.&lt;span class="me1"&gt;Generic&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
 
class Test
&lt;span class="br0"&gt;{&lt;/span&gt;
        public &lt;span class="kw4"&gt;static&lt;/span&gt; string&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt; tables &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="st0"&gt;"1"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"2"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"3"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"4"&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;"5"&lt;/span&gt; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        public delegate string Method&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        public &lt;span class="kw4"&gt;static&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; Main&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
        &lt;span class="br0"&gt;{&lt;/span&gt;
                var dict &lt;span class="sy0"&gt;=&lt;/span&gt; new Dictionary&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;string&lt;span class="sy0"&gt;,&lt;/span&gt; Method&lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                foreach&lt;span class="br0"&gt;(&lt;/span&gt;var name in tables&lt;span class="br0"&gt;)&lt;/span&gt;
                &lt;span class="br0"&gt;{&lt;/span&gt;
                        &lt;strong&gt;string dummy_name &lt;span class="sy0"&gt;=&lt;/span&gt; name&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/strong&gt;
                        dict.&lt;span class="me1"&gt;Add&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;name&lt;span class="sy0"&gt;,&lt;/span&gt; new Method&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="kw1"&gt;return&lt;/span&gt; &lt;strong&gt;dummy_name&lt;/strong&gt;&lt;span class="sy0"&gt;;&lt;/span&gt; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
                &lt;span class="br0"&gt;}&lt;/span&gt;
                Console.&lt;span class="me1"&gt;WriteLine&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;dict&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="st0"&gt;"1"&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
        &lt;span class="br0"&gt;}&lt;/span&gt;
&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;for, foreach, while 등의 반복문 모두 마찬가지이며 C# 5.0에서는 바뀐다는 듯.&lt;br/&gt;&lt;a href="http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop"&gt;&lt;a href="http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop"&gt;http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ps. 그런데 만약 변수 주소를 참조로 넘겨서 저렇게 된다면 변수가 유효한 범위를 넘어갔을 경우 어떻게 되려나? 싶다.&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/27112947227</link><guid>http://wonnyz.tumblr.com/post/27112947227</guid><pubDate>Fri, 13 Jul 2012 03:52:00 -0400</pubDate></item><item><title>일부 다른 기종의 눝 주파수표</title><description>&lt;p&gt;&lt;h3&gt;new iPad WiFi + Cellular&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;국내 인증 신청시 3G에 대해서만 인증을 받음 (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000050755"&gt;A1430&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;LTE Band 4 (1710-1755 / 2110-2155) 및 Band 17 (704-716, 734-746) 지원이며, 이는 미국 내에서 AT&amp;amp;T Mobility (Band 4 및 17), 캐나다의 Rogers, Telus, Bell (Band 4)에 해당한다.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Galaxy Note (국내판)&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;SKT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201131987"&gt;SHV-E160S&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE UL: 824-839, DL: 869-884&lt;/li&gt;
&lt;li&gt;UMTS UL: 1922.8-1977.2, DL: 2112.8-2167.2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;KT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201135882"&gt;SHV-E160K&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE UL: 1745-1755, DL: 1840-1850&lt;/li&gt;
&lt;li&gt;UMTS UL: 1922.8-1977.2, DL: 2112.8-2167.2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;U+ (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201135749"&gt;SHV-E160L&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE UL: 839-849, DL: 884-894&lt;/li&gt;
&lt;li&gt;PCS UL: 1751.25-1778.75, DL: 1841.25-1868.75&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;VEGA Racer 2&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;SKT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000069369"&gt;IM-A830S&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE 대역 추가 UL: 1745-1785, DL: 1840-1880&lt;/li&gt;
&lt;li&gt;나머지 갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;KT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000069355"&gt;IM-A830K&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;U+ (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000067404"&gt;IM-A830L&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Galaxy S3 (국내판)&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;SKT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000086820"&gt;SHV-E210S&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE 대역 추가 UL: 1745-1785, DL: 1840-1880&lt;/li&gt;
&lt;li&gt;나머지 갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;KT (SHV-E210K: 전파인증 미완료)
&lt;ul&gt;&lt;li&gt;알 수 없음&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;U+ (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000086295"&gt;SHV-E210L&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE 대역 추가 UL: 1920-1930, DL: 2110-2120&lt;/li&gt;
&lt;li&gt;나머지 갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Galaxy R Style (국내판)&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;SKT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000075663"&gt;SHV-E170S&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;LTE 대역 추가 UL: 1745-1785, DL: 1840-1880&lt;/li&gt;
&lt;li&gt;나머지 갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;KT (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000081025"&gt;SHV-E170K&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;U+ (&lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000080286"&gt;SHV-E170L&lt;/a&gt;)
&lt;ul&gt;&lt;li&gt;갤럭시 노트와 동일&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;참고 자료&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;LTE Frequency band &lt;a href="http://niviuk.free.fr/lte_band.php"&gt;&lt;a href="http://niviuk.free.fr/lte_band.php"&gt;http://niviuk.free.fr/lte_band.php&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPad Specifications &lt;a href="http://www.apple.com/ipad/specs/"&gt;&lt;a href="http://www.apple.com/ipad/specs/"&gt;http://www.apple.com/ipad/specs/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.extremetech.com/computing/122005-the-new-ipad-most-connected-device-ever"&gt;&lt;a href="http://www.extremetech.com/computing/122005-the-new-ipad-most-connected-device-ever"&gt;http://www.extremetech.com/computing/122005-the-new-ipad-most-connected-device-ever&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/24750520380</link><guid>http://wonnyz.tumblr.com/post/24750520380</guid><pubDate>Sat, 09 Jun 2012 12:08:00 -0400</pubDate></item><item><title>옵눝2로 본 국내 눝 주파수</title><description>&lt;h3&gt;SKT&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;E-UTRA Band 5 (824-849&amp;#160;MHz / 869-894&amp;#160;MHz)&lt;/li&gt;
&lt;li&gt;LTE UL: 829-839&amp;#160;MHz / DL: 874-884&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;UMTS UL: 1942.8-1977.2&amp;#160;MHz / 2132.8-2167.2&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;음성통화 방식: CSFB, Legacy 통신방식: HSPA+&lt;/li&gt;
&lt;li&gt;출처: &lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000056761"&gt;LG-F160S 단말기 인증현황 자료&lt;/a&gt;, &lt;a href="http://&amp;lt;a%20href="&gt;LG-F160S 단말기 소개&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;KT&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;E-UTRA Band 3 (1710-1785&amp;#160;MHz / 1805-1880&amp;#160;MHz)&lt;/li&gt;
&lt;li&gt;LTE UL: 1745-1755&amp;#160;MHz / DL: 1840-1850&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;UMTS UL: 1942.8-1977.2&amp;#160;MHz / 2132.8-2167.2&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;음성통화 방식: CSFB, Legacy 통신방식: HSPA+&lt;/li&gt;
&lt;li&gt;출처: &lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000056757"&gt;LG-F160K 단말기 인증현황 자료&lt;/a&gt;, &lt;a href="http://&amp;lt;a%20href="&gt;LG-F160K 단말기 소개&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;LG U+&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;E-UTRA Band 5 (824-849&amp;#160;MHz / 869-894&amp;#160;MHz)&lt;/li&gt;
&lt;li&gt;LTE UL: 839-849&amp;#160;MHz / DL: 884-894&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;PCS UL: 1751.25-1778.75&amp;#160;MHz / DL: 1841.25-1868.75&amp;#160;MHz&lt;/li&gt;
&lt;li&gt;음성통화 방식 SVLTE, Legacy 통신방식: EV-DO Rev.A&lt;/li&gt;
&lt;li&gt;출처: &lt;a href="http://rra.go.kr/approval/status/icrs_view.jsp?app_no=201215701000057343"&gt;LG-F160L 단말기 인증현황 자료&lt;/a&gt;, &lt;a href="http://&amp;lt;a%20href="&gt;LG-F160L 단말기 소개&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;기타&lt;/h3&gt;
&lt;p&gt;옵티머스 LTE 2 U+용은 &lt;strike&gt;PCS / LTE 전용 단말이라 UMTS 해외 로밍을 지원하지 않음&lt;/strike&gt; 국내에서 UMTS를 사용한 통신을 막아놨으므로 (캐리어락) 인증을 받지 않았음. 스펙상 SKT / KT용 단말기는 UMTS Band 1 (1920-1980, 2110-2170) 을 통한 3G 로밍을 지원하며, 2G (GSM) 통신은 국내에서 지원하지 않으므로 인증을 받지 않아서 지원 주파수를 알 수 없음.&lt;/p&gt;
&lt;h3&gt;참고 자료:&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://niviuk.free.fr/lte_band.php"&gt;&lt;a href="http://niviuk.free.fr/lte_band.php"&gt;http://niviuk.free.fr/lte_band.php&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/E-UTRA#Frequency_bands_and_channel_bandwidths"&gt;&lt;a href="http://en.wikipedia.org/wiki/E-UTRA#Frequency_bands_and_channel_bandwidths"&gt;http://en.wikipedia.org/wiki/E-UTRA#Frequency_bands_and_channel_bandwidths&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://wonnyz.tumblr.com/post/24747504559</link><guid>http://wonnyz.tumblr.com/post/24747504559</guid><pubDate>Sat, 09 Jun 2012 11:10:00 -0400</pubDate></item><item><title>mssql에서 읽기 전용 인스턴스 생성 간단히.</title><description>&lt;p&gt;SQL Server에서 read-only DB를 만들기 위한 방법이 몇 가지가 있긴 한데,&lt;/p&gt;
&lt;h3&gt;복제 (Transactional / Snapshot)&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;개체 단위 (테이블, 뷰 등), 컬럼 등의 세부 지정 가능&lt;/li&gt;
&lt;li&gt;스냅샷 생성시 복제에 참가하는 테이블에 공유 잠금이 걸림 (!!!!)&lt;br/&gt;→ 대상 DB에 백업본을 복원하고 스냅샷 생성을 생략하도록 많이 설정함&lt;br/&gt;→ 복제 대상 테이블만 추려서 넣어놓고 이후 업데이트만 받거나 하는 것도 가능&lt;/li&gt;
&lt;li&gt;3단계 구조: 게시자 (publisher) - 배포자 (distributor) - 구독자 (subscriber) 구성&lt;br/&gt;→ 물론 게시-배포, 배포-구독 식으로 묶을 수도 있음&lt;/li&gt;
&lt;li&gt;구독을 여럿 두는 것도 물론 가능&lt;/li&gt;
&lt;li&gt;Log Reader가 트랜잭션 로그를 읽어서 복제 sp 명령을 생성하여 구독자에 기록함. &lt;br/&gt;원본에만 있고 대상에는 없는 인덱스 등을 사용하는 갱신 작업이 있었다면 &amp;#8230; 아아악&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Log Shipping 후 READ ONLY로 복원 (RESTORE ..WITH STANDBY)&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;데이터베이스 단위&lt;/li&gt;
&lt;li&gt;원본 DB 백업본과 트랜잭션 로그를 사용해서 복원함&lt;/li&gt;
&lt;li&gt;따라서 시간차만 있는 원본 DB와 100% 동일한 복제본이 생성됨&lt;/li&gt;
&lt;li&gt;복사본은 못 건드림(!!!)&lt;br/&gt;→ 복사본 인스턴스에 접근하는 계정을 만들려면 원본에도 생성해야 함&lt;br/&gt;→ SQL Server Login이라면 원본에 계정 만들고 SID를 딴 다음에 그 SID 그대로 대상 DB에 create login .. with sid = xxx 로 생성해야 함&lt;/li&gt;
&lt;li&gt;내장 에이전트 대신 스크립팅으로 처리하거나 한다면 여러 대로 복제할 수도 있음&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;백업 후 복원하기&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;데이터베이스 단위&lt;/li&gt;
&lt;li&gt;풀백업을 정기적으로 뜨고 조회 서버로 옮긴 다음에 복원하는 작업 -_- 을 자동화&lt;/li&gt;
&lt;li&gt;백업 데이터량이 많아지면 많아질수록 당연히 복원이 오래 걸린다 -_-&lt;/li&gt;
&lt;li&gt;장단점이 분명하므로 더 적을 필요 없을듯.. &lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;데이터베이스 미러링&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;데이터베이스 단위&lt;/li&gt;
&lt;li&gt;비동기식이 아니면 미러 서버에 커밋까지 끝나야 데이터가 커밋됨 &lt;br/&gt;→ 느릴 수밖에 없다&lt;/li&gt;
&lt;li&gt;Failover 가능 - 근데 여기서는 생각하지 않기로 해요&lt;/li&gt;
&lt;li&gt;한 대의 서버로만 미러링이 가능함&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;하아 100% 일치를 보장하지 않아도 좋으니 적당히 MySQL 식으로 데이터베이스 단위의 명령 기반 복제를 제공했으면 좋겠다. 내장 복제 기능은 생각보다 알아야 할 것이 많고 유지보수가 꽤 빡셈. 전업 DBA가 아닌 사람이 챙기기는 쉽지 않다. 가끔은 전업인 사람도 짜증난다.&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/23719510236</link><guid>http://wonnyz.tumblr.com/post/23719510236</guid><pubDate>Fri, 25 May 2012 01:05:00 -0400</pubDate></item><item><title>SharePoint 2010 폼인증 제작</title><description>&lt;p&gt;ASP.NET 2.0에 추가된 MembershipProvider / RoleProvider 구조를 기반으로 하며, 각각의 상위 추상 클래스를 상속해서 반드시 구현해야 하는 메소드는 다음과 같다.&lt;/p&gt;
&lt;h3&gt;MembershipProvider&lt;/h3&gt;
&lt;pre&gt;public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
public override MembershipUser GetUser(string username, bool userIsOnline)
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
public override string GetUserNameByEmail(string email)
public override bool ValidateUser(string username, string password)
&lt;/pre&gt;
&lt;h3&gt;RoleProvider&lt;/h3&gt;
&lt;pre&gt;public override string[] GetAllRoles()
public override string[] GetRolesForUser(string username)
public override string[] GetUsersInRole(string rolename)
public override bool IsUserInRole(string username, string rolename)
public override bool RoleExists(string rolename)
public override string[] FindUsersInRole(string rolename, string usernameToMatch)
&lt;/pre&gt;
&lt;p&gt;일단 멤버십 구조에서는 사용자 이름을 구별하지 않는다. username은 있어도 userid는 없는데.. 그냥 username이 userid 대용으로 쓰이는게 아닐까. ValidateUser는 bool 리턴인데, 이 다음에 사용자 정보를 알기 위해 GetUser를 호출할 때 GetUser(string, bool)이 들어올까, GetUser(object, bool)이 들어올까? 일단 땜빵으로 GetUser(string, bool)이 들어온다는 것을 가정해서 아이디 검색으로 구현해놓기는 했다. 테스트를 해봐야 알겠지만..&lt;/p&gt;
&lt;p&gt;또한 검색에서 like &amp;#8216;%xx%&amp;#8217; 형태 검색을 하거나 해야 한다는 문제가 있지만, 내부용 사이트니까 회원 수는 많아봐야 몇백명이니 무시하기로.&lt;/p&gt;
&lt;p&gt;으 이제 RoleProvider를 구현해야 하는데 인증구조가 역할기반이 아닌데 끼워맞춰야 하는군 ㅜㅜ&lt;/p&gt;
&lt;p&gt;참고자료:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.sharedove.com/adisjugo/index.php/2011/01/05/writing-a-custom-membership-provider-and-using-it-for-fba-forms-based-authentication-in-sharepoint-2010-from-the-scratch/"&gt;&lt;a href="http://blog.sharedove.com/adisjugo/index.php/2011/01/05/writing-a-custom-membership-provider-and-using-it-for-fba-forms-based-authentication-in-sharepoint-2010-from-the-scratch/"&gt;http://blog.sharedove.com/adisjugo/index.php/2011/01/05/writing-a-custom-membership-provider-and-using-it-for-fba-forms-based-authentication-in-sharepoint-2010-from-the-scratch/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/17029536919</link><guid>http://wonnyz.tumblr.com/post/17029536919</guid><pubDate>Sat, 04 Feb 2012 09:22:43 -0500</pubDate></item><item><title>SharePoint 2010 Foundation 설치하다가 늙는 중</title><description>&lt;p&gt;(서버는 2008 R2 x64)&lt;/p&gt;
&lt;h2&gt;Prerequisite:&lt;/h2&gt;
&lt;p&gt;요새 마소 프로그램들은 갈수록 설치 요구사항이 늘어나는 것 같다. 설치해준 것은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;SQL Native Client (SQLNCLI) - SQL Server 2008 SP3 feature pack 뒤져서 받음&lt;/li&gt;
&lt;li&gt;Sync Framework Runtime - 위와 동일&lt;/li&gt;
&lt;li&gt;Filter Pack 2.0 (x64) - 오피스 2010용 쓰면 된다&lt;/li&gt;
&lt;li&gt;KB976462-v2-x64 - 가서 받자&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;보안정책상 인터넷 연결이 안되어 자동 다운로드를 쓸 수 없었다. 필요한 프로그램을 찾을 때 인스톨러 실행해보고 헤딩해도 말리지는 않겠다. &lt;/p&gt;
&lt;h2&gt;관리 사이트 구성&lt;/h2&gt;
&lt;p&gt;제품 구성 마법사로 진행하던 도중에 (새 서버팜 구성으로 함) 팜 구성 패스워드를 입력하고 넘어가지를 않는다. 로그 (C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\LOGS) 파일을 찾아보니 중앙 관리 사이트에 사용할 빈 포트 번호를 찾는데, IPv6 구성 때문인지, 자기 자신의 주소로 접속하려고 했는지 IPSec에서 막혀서 그런지 꼬이고 있었다. hosts 파일에 127.0.0.1 hostname 추가해줬다.&lt;/p&gt;
&lt;p&gt;구성이 끝나고 Forms Based Authentication을 설치하려는데 자꾸 응용프로그램이 2010의 Claims 인증이 아니라 Classic Mode로 동작해서 폼 인증을 쓸 수가 없었다. 일단 &lt;a href="http://blogs.technet.com/b/mahesm/archive/2010/04/07/configure-forms-based-authentication-fba-with-sharepoint-2010.aspx"&gt;&lt;a href="http://blogs.technet.com/b/mahesm/archive/2010/04/07/configure-forms-based-authentication-fba-with-sharepoint-2010.aspx"&gt;http://blogs.technet.com/b/mahesm/archive/2010/04/07/configure-forms-based-authentication-fba-with-sharepoint-2010.aspx&lt;/a&gt;&lt;/a&gt; 에서 해답을 찾아서 진행했다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(SharePoint 2010 관리 셸을 관리자 모드로 띄운다)&lt;br/&gt;$app = get-spwebapplication "http://hostname/"&lt;br/&gt;$app.UseClaimsAuthentication&lt;br/&gt;-&amp;gt; False (아오빡..)&lt;br/&gt;$app.UseClaimsAuthentication = "True"&lt;br/&gt;$app.Update()&lt;br/&gt;$app.UseClaimsAuthentication&lt;br/&gt;-&amp;gt; True (됐다!)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;그 다음부터는 http://ranaictiu-technicalblog.blogspot.com/2011/01/sharepoint-2010-form-based.html 에 맞춰서 진행중. &lt;/p&gt;
&lt;p&gt;* 중간 분투기: 사이트 설정이 원하는대로 안되어서 지우고 다시만들고 했더니 꼬이길래 짜증나서 싹 지우고 재설치. 또 마법사로 만들었더니 Windows 인증이라 Claims 기반으로 변경. 대체로 문제 없으나 로그아웃 시에 에러남. 무시하기로 했음 *&lt;/p&gt;
&lt;h2&gt;SharePoint Workspace 연동하기&lt;/h2&gt;
&lt;p&gt;역시나 한방에 되면 얘가 셰어포인트가 아님. &lt;a href="http://weblogs.asp.net/jeffwids/archive/2010/05/06/configuring-sharepoint-foundation-2010-for-sharepoint-workspace-2010.aspx"&gt;&lt;a href="http://weblogs.asp.net/jeffwids/archive/2010/05/06/configuring-sharepoint-foundation-2010-for-sharepoint-workspace-2010.aspx"&gt;http://weblogs.asp.net/jeffwids/archive/2010/05/06/configuring-sharepoint-foundation-2010-for-sharepoint-workspace-2010.aspx&lt;/a&gt;&lt;/a&gt; 참조해서 다음과 같이 설정.&lt;/p&gt;
&lt;h3&gt;원격 차등 압축 (Remote Differential Compression) 설정&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;(파워셸 창을 관리자로 열고)&lt;br/&gt; import-module servermanager &lt;br/&gt;add-windowsfeature RDC&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;또는 서버 관리자 열어서 기능 추가한 다음에 &amp;#8216;&lt;strong&gt;원격 차등 압축&lt;/strong&gt;&amp;#8216;을 켜주면 됨&lt;/p&gt;
&lt;h3&gt;대체 액세스 매핑 설정&lt;/h3&gt;
&lt;p&gt;중앙 관리 사이트 열어서 시스템 설정 - 대체 액세스 매핑 구성.&lt;/p&gt;
&lt;p&gt;(사진이 안올라가서 일단 다음 기회에) &lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/16857461587</link><guid>http://wonnyz.tumblr.com/post/16857461587</guid><pubDate>Wed, 01 Feb 2012 03:40:00 -0500</pubDate></item><item><title>NAT 관련 급정리</title><description>&lt;h3&gt;Full Cone NAT&lt;/h3&gt;
&lt;p&gt;All requests from the same internal IP address and port are mapped to the same external IP address and port. Furthermore, any external host can send a packet to the internal host, by sending a packet to the mapped external address.&lt;/p&gt;
&lt;h3&gt;Restricted Cone NAT&lt;/h3&gt;
&lt;p&gt;All requests from the same internal IP address and port are mapped to the same external IP address and port. Unlike a Full Cone NAT, an external host (with IP address A) can send a packet to the internal host only if the internal host had previously sent a packet to IP address A&lt;/p&gt;
&lt;h3&gt;Port restricted cone NAT&lt;/h3&gt;
&lt;p&gt;This behaves like a Restricted Cone NAT, but the restriction includes port numbers. Speciﬁcally, an external host can send a packet, with source IP address A and source port P, to the internal host only if the internal host had previously sent a packet to IP address A and port P.&lt;/p&gt;
&lt;h3&gt;Symmetric NAT&lt;/h3&gt;
&lt;p&gt;All requests from the same internal IP address and port, to a speciﬁc destination IP address and port, are mapped to the same external IP address and port. If the same host sends a packet with the same source address and port, but to a different destination, a different mapping is used. Furthermore, only the external host that receives a packet can send a UDP packet back to the internal host.&lt;/p&gt;
&lt;p&gt;Since the address mapping policy for Symmetric NAT is endpoint dependent, it is very difﬁcult to predict which external port will be used for which destination. This behaviour represents a big threat to P2P communication without adding any security beneﬁt and is therefore strongly discouraged by the IETF [11].&lt;/p&gt;
&lt;p&gt;&lt;img alt="Classic STUN NAT characterization algorithm" height="661" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/STUN_Algorithm3.svg/614px-STUN_Algorithm3.svg.png" width="614"/&gt;&lt;/p&gt;
&lt;h3&gt;STUN&lt;/h3&gt;
&lt;p&gt;상대방의 주소를 알려주는 정도의 기능&lt;/p&gt;
&lt;h3&gt;TURN&lt;/h3&gt;
&lt;p&gt;릴레이 서버&lt;/p&gt;
&lt;p&gt;자료: &lt;br/&gt;A Measurement of NAT &amp;amp; Firewall Characteristics in Peer to Peer Systems&lt;br/&gt;&lt;a href="http://www.st.ewi.tudelft.nl/~lucia/publications/measurement_asci.pdf"&gt;&lt;a href="http://www.st.ewi.tudelft.nl/~lucia/publications/measurement_asci.pdf"&gt;http://www.st.ewi.tudelft.nl/~lucia/publications/measurement_asci.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[11] F. Audet and C. Jennings, RFC4787 - Network Address Translation (NAT) Behavioral Requirements for Unicast UDP, January 2007.&lt;br/&gt;&lt;a href="http://tools.ietf.org/html/rfc4787"&gt;&lt;a href="http://tools.ietf.org/html/rfc4787"&gt;http://tools.ietf.org/html/rfc4787&lt;/a&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;[13] J. Rosenberg, R. Mahy, P. Matthews, D. Wing, RFC5389 - Session Traversal Utilities for NAT (STUN), October 2008.&lt;br/&gt;&lt;a href="http://tools.ietf.org/html/rfc5389"&gt;&lt;a href="http://tools.ietf.org/html/rfc5389"&gt;http://tools.ietf.org/html/rfc5389&lt;/a&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)&lt;br/&gt;&lt;a href="http://tools.ietf.org/html/rfc5766"&gt;&lt;a href="http://tools.ietf.org/html/rfc5766"&gt;http://tools.ietf.org/html/rfc5766&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols&lt;br/&gt;&lt;a href="http://tools.ietf.org/html/rfc5245"&gt;&lt;a href="http://tools.ietf.org/html/rfc5245"&gt;http://tools.ietf.org/html/rfc5245&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[VoIP SIP 알자/10. NAT와 방화벽/STUN/TURN/ICE/SBC]&lt;a href="http://mongu2.blog.me/140123112694"&gt;&lt;br/&gt;&lt;a href="http://mongu2.blog.me/140123112694"&gt;http://mongu2.blog.me/140123112694&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://wonnyz.tumblr.com/post/16468515905</link><guid>http://wonnyz.tumblr.com/post/16468515905</guid><pubDate>Wed, 25 Jan 2012 11:43:44 -0500</pubDate></item></channel></rss>
