현재 까지 모은 만화들


에서 오늘것과 비교해봤다. 

예전에는 한 층에 1단만 있었는데, 지금은 앞, 뒤 2단 구성에 읽느라 빠진 자리 빼고는 거의 꽉 차서 더이상 들어갈데도 잘 않보인다. 



박스에 들어 있는 책까지 하면 대략 3천권정도 되는것 같은데
군대 갔다오니 사라진 예전 책이 아직까지 있었다면 방이 감당이 않될거 같다. 


참 나도 징하게 만화책을 모으는것 같기는 하다. 





[번역] Batch Fetching - 객체 그래프 로딩을 최적화 하기 (JPA/ECLIPSELINK) - 3(마지막) 기술

자, 여태까지 설명한 내용이 무엇을 의미할까? 흠, 모든 환경과 유스케이스는 서로 다르며, 그렇기 때문에 모든 경우에 적합한 완전한 해결책은 없다는 것이다. 서로 다른 쿼리 최적화는 서로 다른 상황에 적합하다. 다음에 설명한 벤치마크 결과는 앞서 설명한 방식들의  잠재적인 성능 향상을 보여줄 것이다. 

 

다음 벤치마크 결과는 로컬 네트워크 상의 저렴한 하드웨어에서 오라클을 java se 환경에서 단일 쓰래드로 구동시켜 나온 결과이다. 각 테스트는 60초간 실행 되었고, 실행된 횟수를 기록했다. 각 테스트는 5번 반복 했다. 최소/최대 값은 제외 했다. 숫자 자체는 별 의미가 없으며 각 방식에 대한 % 차이를 살펴 보기 바란다. 

 

벤치마크에서는 최적화되지 않은 쿼리, join fetching, batch fetching을 적용했다. 

 

Simple run (fetch address, phoneNumbers)

Query

Average (queries/minute)

%STD

%DIF (of standard)

standard

5897

0.5%

0

join fetch

14024

1.1%

+137%

batch fetch (JOIN)

11190

4.5%

+89%

batch fetch (EXISTS)

13764

0.4%

+133%

batch fetch (IN)

14341

0.6%

+143%

 

 

첫번쨰 결과만 보면 join fetch가 상당히 좋아 보인다.  첫번째 테스트에서는 2개의 관계만 읽어 왔다. 더 많은 관계를 읽어 오면 어떻게 될까?

 

 

 

Complex run (fetch address, phoneNumbers, projects, manager, managedEmployees, emailAddresses, responsibilities, jobTitle, degrees)

Query

Average (queries/minute)

%STD

%DIF (of standard)

standard

1438

0.7%

0%

join fetch

1121

0.4%

-22%

batch fetch (JOIN)

3395

3.8%

+136%

batch fetch (EXISTS)

3768

2.6%

+162%

batch fetch (IN)

3893

0.5%

+170%

 

 

두번째 테스트를 보면 join fetch의 문제점이 들어 난다. join fetch는 실제로는  최적화 되지 않는 쿼리보다 느려진다. (-22%). 이건 본질적으로 여러 테이블을 조인하면 더 많은 데이터를 가져와서 처리해야 하기 때문이다.  반면에  batch fetch는 여전히 우월한 성능을 보여준다. 


[번역] Batch Fetching - 객체 그래프 로딩을 최적화 하기 (JPA/ECLIPSELINK) - 2 기술

Join Fetch는 여러 경우에 최고의 솔류션이지만, 대단히 관계 DB 중심의 접근이기도 하다. 더 창의적이고 객체 지향적은 솔류션은 Batch Fetching 이다. Batch Fetching은 전통적인 관계중심의 사고방식으로는 더 어렵게 느껴지겠지만, 일단 이해하고 나면 훨씬 강력하다. 

JPA는 join fetch만 정의하고 있다. batch fetching 을 사용하기 위해서는 eclipselink의 쿼리힌트 "eclipselink.batch"를 사용한다. 

Batch fetch query hint

query.setHint("eclipselink.batch", "e.address");
query.setHint("eclipselink.batch", "e.phones");

batch fetch 를 실행해도 원래 쿼리가 실행된다. (단순히 employee만 가져오는). 차이점은 연관된 객체를 가져오는 방식에 있다.  일단 employee의 목록을 얻어온후 어느 한 employee의 address를 사용하기 위해 접근할때, 오직  앞서 SELECTED 된  모든 employee들의 모든 address를 가져온다.  batch fetching에는 여러 유형이 있으며,  JOIN 타입의 batch fetch의 SQL은 다음과 같이 생성된다. 

SQL for batch fetch (JOIN)

SELECT E.* FROM EMPLOYEE E WHERE E.STATUS = 'Part-time'
 
SELECT A.* FROM EMPLOYEE E, ADDRESS A WHERE E.ADDR_ID = A.ADDRESS_ID AND E.STATUS = 'Part-time'
  
SELECT P.* FROM EMPLOYEE E, PHONE P WHERE E.EMP_ID = P.OWNER_ID AND E.STATUS = 'Part-time' 


처음 볼때 join fetch를 사용한 1개의 sql 대신 3개의 sql이 실행된것을 볼수 있다. 3개의 쿼리가 실행 되었으니 더 느릴 것이라고 생각하기 쉽지만, 실제로는 대부분의 경우에 더 빠르다. 1번 과  3번의 select의 차이는  거의 없다 (Pretty minimal).  최적화 되지 않은 예전 경우의 가장 큰 이슈가 N 번의 쿼리가 실행되는 것이였고, 그때는 차이가 100초가 1000초가 될수도 있었다. 

 

batch fetching의 주요한 장점은 오직 필요한 정보만 select 된다는 것이다. join fetch의 경우, EMPLOYEE와 ADDRESS 의 데이터가 PHONE의 결과마다 중복 된다는 것이였다. (역자주: 별도의 group by  나 distinct 를 주어서 해결할수도 있지만, 쿼리가 느려진다. ) ToMany 관계에서  이런 현상이 발생하며, 만약 여러개의 또는 중첩된 ToMany 관계를 읽어오려고 하면  얼어붙은것 처럼 될것이다. 예를 들어  직원의 프로젝트 목록을 join fetch하고, 각 프로젝트의 milestone을 join fetch할때,  직원당 5개의 프로젝트가 있고 프로젝트당 10개의 마일스톤이 있다고 하면 직원정보는 50배 중복된다(프로젝트 정보는 10배 중복된다)  복잡한 객체 모델이라면 이런 현상은 큰 이슈가 된다. 

 

join fetching은 직원이 주소나 전화번호가 없는 경우를 처리 하기 위해 일반적으로  outer 조인을 사용해야 하다. outer 조인은 DB에서 일반적으로 비효율적으로 처리되며, 결과에 null인 row를 추가한다. 

batch fetching은 만약 직원이 주소나 전화번호가 없다면, 그냥 batch fetch 결과에 없을 뿐이고 훨씬 적은 데이터를 읽어 오게 된다.  Batch fetching을 이용하면 ManyToOne 관계에서 distinct를 허용한다. 예를 들어 직원의 관리자가 batch fetch 된다면, distinct 는 유니크한 관리자가 select 되게 하고, 중복된 데이터를 읽어 오지 않게 한다. 

 

JOIN batch fetch의 단점은 원래 쿼리가 여러번 실행 된다는 것이다. 만약 원래 쿼리가 비용이 비싼 쿼리라면 join fetch가 더 효율적일수 있다.  또다른 경우인, 단 하나의 결과만 select 한다면, batch fetch는 아무런 이익을 제공해주지 못하지만 join fetch는 쿼리를 단 한번만 실행하기 때문에 실행할 쿼리를 줄여줄수 있다. 

 

Batch Fetching은 여러 형태가 있는데 Eclipselink 2.1에서는 JOIN, EXISTS,IN 3가지 타입을 지원한다. (BatchFetchType  enum에 정의 되어 있다.)  batch fetch 타입의 지정은 쿼리 힌트 "eclipselink.batch.type"을 통해 지정할수 있다.  관계에 대해 상상 batch fetching을 사용하고자 한다면 @BatchFetch 어노테이션을 붙여 주면 된다. 

 

Batch fetch query hints and annotations

query.setHint("eclipselink.batch.type", "EXISTS"); 
 
@BatchFetch(type=BatchFetchType.EXISTS)  

 

EXISTS 옵션은 JOIN 옵션관 비슷하지만, Join 대신 exists와  sub-select 를 사용한다. 이 옵션의 장점은 lob이나 복잡한 쿼리를 에서 distinct 를 사용할 필요가 없다는 것이다. 

 SQL for batch fetch (EXISTS)

SELECT E.* FROM EMPLOYEE E WHERE E.STATUS = 'Part-time'
  
SELECT A.* FROM ADDRESS A WHERE EXISTS (SELECT E.EMP_ID FROM EMPLOYEE E WHERE E.ADDR_ID = A.ADDRESS_ID AND E.STATUS = 'Part-time')
  
SELECT P.* FROM PHONE P WHERE EXISTS (SELECT E.EMP_ID FROM EMPLOYEE E, WHERE E.EMP_ID = P.OWNER_ID AND E.STATUS = 'Part-time'

 

IN 옵션은 JOIN이나 EXISTS옵션과 많이 다르다. IN 옵션은 원래 select 쿼리를 사용하지 않고, 대신 객체의 ID를 IN 구절을 이용해 사용한다. IN 옵션의 장점은 원래 쿼리를 다시 실행할 필요가 없다는 것이고, 이것은 원래 쿼리가 복잡할수록 큰 이득을 준다. IN 옵션은 페이징 기능도 지원하며, 다른 옵션이 무조건 전체 객체를 읽어 와야 하는 것에 비해  커서의 사용도 잘 지원한다. Eclipselink에서 IN 옵션은 캐쉬도 지원하기 때문에 캐쉬에 없는 것만 IN에 넣어 가져 오기 때문에 더 적은 분량만 읽어 오게 된다. 

 

IN 옵션의 이슈는 이미 읽어온 세트가 너무 많으면 IN 구절이 너무 커져서 DB에서 처리하는데 비효율적이 될수 있다는 것이다.  그리고 복합키가 문제가 될수 있다.  Eclipselink는 in 구절에서 복합키를 지원하하며 , Oracle같은 DB는 SQL 의 in 구절에서 복합키를 지원하지만 다른 DB에서는 IN 구절에서 복합키를 지원하지 않는 경우도 있다.  IN 옵션은 또한 SQL의 IN  파트가 동적으로 생성되는것이 지원되는 DB여야 한다.  

SQL for batch fetch (IN)

SELECT E.* FROM EMPLOYEE E WHERE E.STATUS = 'Part-time'
  
SELECT A.* FROM ADDRESS A WHERE A.ADDRESS_ID IN (1, 2, 5, ...)
  
SELECT P.* FROM PHONE P WHERE P.OWNER_ID IN (12, 10, 30, ...) 

 

Batch fetching은 쿼리 힌트에 점(.) 표기를 이용해 중첩시킬수 있다.  

Nested batch fetch query hint

query.setHint("eclipselink.batch", "e.projects.milestones"); 


Batch fetching의 기능중 join fetch에서 제공되지  않는 것중에 하나가 바로 최적화된 트리 구조 읽기이다.  만약 트리구조에서 자식 관계에 @BatchFetch를 설정하면, 단일 쿼리가 각 레벨을 위해 실행된다. 

  


[번역] Batch Fetching - 객체 그래프 로딩을 최적화 하기 (JPA/ECLIPSELINK) - 1 기술

자주 들여다 보는 문서라 아예 번역해 봤습니다. 

(이글루스가 긴글을 지원 못해 잘랐습니다)


출처: http://java-persistence-performance.blogspot.kr/search/label/batch-fetch

원문 2010.9.9 에 작성됨 

 

객체 지향적인 객체 모델과, 관계 DB 관계 모델간의 가장 큰 임피던스(impedance) 차이를 보이는 부분은 데이터에  접근하는 방식이다. 

 

관계 모델에서는, 특정 유스케이스나 서비스 요청에 적합한 데이터를 모든 데이터를 조인 걸어서 가져 오는 단일 한방 쿼리를 작성한다. 가져와야 하는 데이터가 복잡할수록 쿼리도 복잡해진다. 최적화는 불필요한 조인을 제거하고, 중복 데이터를 가져오는 것을 제거하는 것으로 수행된다. 

 

객체 모델에서는 객체 하나 또는 몇개의 세트를 얻어 온후, 객체의 관계를 추적(traverse)하여 데이터를 수집한다. 

 

객체-관계-매퍼(ORM/JPA)를 사용하면 일반적으로 여러번의 쿼리가 실행되게 되며, 이것은 "N queries"라고 알려진 문제로 발전하게 된다. 또는 결과 세트(Result set)안에 포함된 객체 마다 별개의 쿼리를 실행하게 된다. 

 

예제로써 EMPLOYEE, ADDRESS, PHONE 테이블을 가지고 생각해자. 

EMPLOYEE는 ADDRESS ADDRESS_ID로 향하는 외부키 ADDR_ID를 가진다. PHONE은 EMPLOYEE EMP_ID로 향하는 외부키 EMP_ID를 가진다. 

 

파트타임 직원 목록을 주소와 전화번호를 포함하여 표시하고자 할때 다음과 같은 SQL을 작성할것이다. 

 

Big database query(한방쿼리)

SELECT E.*, A.*, P.* FROM EMPLOYEE E, ADDRESS A, PHONE P WHERE E.ADDR_ID = A.ADDRESS_ID AND E.EMP_ID = P.OWNER_ID AND E.STATUS = 'Part-time'

 

이렇게 나온 데이터는 각 직원 마다 전화 번호를 출력하깅 위해 그루핑한후 포메팅해야 한다. 

 

...

ID

Name

Address

Phone

6578

Bob Jones

17 Mountainview Dr., Ottawa

519-456-1111, 613-798-2222

7890

Jill Betty

606 Hurdman Ave., Ottawa

613-711-4566, 613-223-5678

 

 

위 예에 대응하는 객체 모델은 Employy, Address, Phone 클래스를 정의한다. 

JPA에서 Employee는 Address와 OneToOne 관계이고, Phone과 OneToMany 관계이다. Phone은 Employee와 ManyToOne 관계이다.

 

 

파트타임 직원 목록을 주소와 전화번호를 포함하여 표시하고자 할때 다음과 같은 JPQL을 작성할것이다.  

 

Simple JPQL

Select e from Employee e where e.status = 'Part-time'

 

역자 주서: 

Criteria API로 작성하면  다음과 같이 된다. 

 

 

직원 정보를  출력하기 위해서는  Employee에서 Address를 가져오고, 마찬가지로 모든 Phone을 가져오면된다.  출력된 결과는 SQL 버전과 동일하지만, JPA를 통해 생성된  SQL은 매우 다르다. 

 

...

ID

Name

Address

Phone

6578

Bob Jones

17 Mountainview Dr., Ottawa

519-456-1111, 613-798-2222

7890

Jill Betty

606 Hurdman Ave., Ottawa

613-711-4566, 613-223-5678

 

 

N+1 queries problem

SELECT E.* FROM EMPLOYEE E WHERE E.STATUS = 'Part-time'

...  실행된 다음 N개(선택된 employee의 수)만큼의  Address를 select한다. 

SELECT A.* FROM ADDRESS A WHERE A.ADDRESS_ID = 123
SELECT A.* FROM ADDRESS A WHERE A.ADDRESS_ID = 456 

 

...

 

...  실행된 다음 N개(선택된 employee의 수)만큼의  Phone를 select한다. 

SELECT P.* FROM PHONE P WHERE P.OWNER_ID = 789
SELECT P.* FROM PHONE P WHERE P.OWNER_ID = 135 

...

 

이것은 상당히 끔찍한 성능을 보여줄 것이다.(모든 객체가 메모리에 이미 캐쉬 되어 있지 않는한). JPA에서 이 문제를 해결하는 방법이 여럿 있다. 가장 흔하게 사용되는 방식은 Join fetching 이다. join fetch는 객체,  그 객체와 연관된 객체를 단일 쿼리를 통해 fetch하는 것이다.  JPQL에서 이것은 꽤나 쉽게 할수 있고, Join을 정의 하는 것과 유사하다. 

 

JPQL with join fetch

Select e from Employee e join fetch e.address, join fetch e.phones where e.status = 'Part-time' 


 

 

역자 주석

Criteria API 버전

 

 

이 JPQL은  SQL 버전과 동일한 SQL을 생성해 낸다. 

 

SQL for JPQL with join fetch

SELECT E.*, A.*, P.* FROM EMPLOYEE E, ADDRESS A, PHONE P WHERE E.ADDR_ID = A.ADDRESS_ID AND E.EMP_ID = P.OWNER_ID AND E.STATUS = 'Part-time' 

 

이 코드는 동일한 결과를 보여 줄수 있으면서, 객체는 더욱 효율적으로 읽어오게 된다. 

 

JPA는 join fetch를 JPQL을 통해서만 지정할수 있으나, Eclipselink는 @JoinFetch  어노테이션을 이용해 특정 관계에 대해 항상 Join Fetch를  수행하게 할수 있다.  다른 JPA 구현체들 중에는  EAGER 관계의 객체를 항상 join fetch하는 것도 있는데, 이것은 일견 좋은 아이디어 인거 같지만, 실제로는 매우 나쁜 아이디어이다. EARGER는 관계를 읽어 와야 하는 가를 정의하지, 데이터베이스에 어떻게 접근하느냐를 정의하는 것이 아니다. 어떤 사용자가 객체의 모든 관계를 읽어 오게 하려고 할때, 만약 모든 관계를 join fetch를 이용해 가져온다면, 모든 ToMany 관계에 대한 거대한 조인(Outer 조인이 사용된다)을 걸게 되고, 거대한 중복 데이터를 읽어고게 된다. 또한 parent, owner, manager 같은 ManyToOne 관계는 원래 공유 객체여야 하는데(보통은 cache된), join fech는 모든 child에 대해 중복된 부모 객체를 생성하게 되며, 이런 동작은 별개의 독리된 쿼리를 던지는 것(또는 캐쉬된)보다 나쁜 성능을 낼수 있다. 

 

JPA는 join fetch에 대한 aliasing을 지원하지 않기때문에, 추가적으로 가져오고자 하는 관계에 대해 두번 조인해 주어야 한다. JPA 내부적으로 ToOne 관계에 대해서는 단일 조인으로 최적화되다. ToMany에 대해서는 진짜로 두번째 Join이 필요하며 이 조인은 연관된 객체를 필터링하기 위해 사용된다. 어떤 JPA 구현체는 join fetch 에 대한 alias를 지원하지만, JPA 표준에서는 허용하지 않고, eclipselink도 아직 지원하지 않는다. 

 

중첩된(Nested) join fetch는 JPQL에서 직접 지원하지 않는다. eclipselink는 중첩된 join fetch를 지원하는데, 쿼리 힌트인 "eclipselink.join-fetch"와 "eclipselink.left-join-fetch" 를 이용하면 된다. 

 

Nested join fetch query hint


query.setHint("eclipselink.join-fetch", "e.projects.milestones"); 



12월 1주 관심이 갔던것들 기술

[프로그래밍]

대표적인 자바 빌드 툴들(Gradle, Maven, Ant+Ivy)의 의존성 관리 방식을 설명합니다. 
Java Build Tools: How Dependency Management Works with Maven, Gradle and Ant + Ivy | zeroturnaround.com


Github의 문서 시스템도  나쁜편은 아니지만 Trello 좋아 하시는 분들 많죠. 트렐로의 Open API를 이용해 Github와 연동 시키는 방법을 기술하는 문서입니다. 
Github + Trello 연동하기

이번 NSA건등등으로 인해 HTTPS에 대한 신뢰가 떨어지자 나온 트위터의 보안 프로토콜.  이런 시도가 앞으로 많아질거라 봅니다. 
Twitter implements new encryption measures using Perfect Forward Secrecy

오픈소스기반의 시스템 관리 시스템 목록. 모니터링, 로깅, 이벤트 관리, 비주얼라이제이션, 패키징, 설정, ..... 등 대부분의 관리 영역에 대한 오픈소스에 대해 일람할수 있습니다.  
Open-Source Management Systems


How I Learned to Stop Worrying and to Love Flexible Scope | Stephen Janaway


API에 대한 무료 이북 20권
20 Free eBooks On API



프로그래머가 작업 중 일 때 건드리면 안되는 이유
http://www.albireo.net/index.php?threads/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EA%B0%80-%EC%9E%91%EC%97%85-%EC%A4%91-%EC%9D%BC-%EB%95%8C-%EA%B1%B4%EB%93%9C%EB%A6%AC%EB%A9%B4-%EC%95%88%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%2E.43022/


구글의 C++ 스타일 가이드. 이런 류의 스타일 가이드는 가이드 그 자체 보다는 왜 저런 스타일을 표준으로 삼았는가를 생각해 보는게 좋습니다. 물론 그냥 종교 논쟁이 되는 경우도 많지만 말이죠 ^^

웹 개발자를 위한 무료 툴 10개. 
10 Free and Awesome Web Development Tools For Developers


프론트엔드 개발자들에게 학습용으로 내볼수 있는 퀴즈 사이트. 
Front End Web Development Quiz By David Shariff

iOS용 오픈소스 바코드 라이브러리 
http://cocoadocs.org/docsets/ZXingObjC/2.2.2/


절차형 프로그래밍을 하던 사람이 함수형 프로그래밍으로 넘어가면서 배우는 내용을 올린 글
articles/switching_from_imperative_to_functional_programming_with_games_in_Elm.md at master · Dobiasd/articles · GitHub
https://github.com/Dobiasd/articles/blob/master/switching_from_imperative_to_functional_programming_with_games_in_Elm.md


구글, 웹기반 개발툴 '스파크' 공개
http://m.clien.net/cs3/board?bo_table=news&bo_style=view&wr_id=1727693


Plain Cloud, iCloud에 저장된 파일들을 Finder에서 쉽게 보여준다.
http://m.blog.naver.com/mjspdr23/110174460688


클라이언트부터 서버까지 풀스택 자바스크립트에 대한 소개글. node.js 의 등장 이후 단일언어 개발 환경에 대한 트렌드가 가속되고 있지만, 반대로 특정도메인의 문제를 쉽게 해결하는 언어를 섞어 쓰는 경향도 늘고 있죠.
An Introduction To Full-Stack JavaScript
http://coding.smashingmagazine.com/2013/11/21/introduction-to-full-stack-javascript/


DOM 이벤트에 대한 소개글
An Introduction To DOM Events
http://coding.smashingmagazine.com/2013/11/12/an-introduction-to-dom-events/


‘제다이급’ 자바스크립트 고수들이 전하는 6가지 개발팁
http://www.itworld.co.kr/news/84870


파이썬 django로 온라인 서비스 만들어보기 - 코드잡
http://codejob.co.kr/scode/373
 

유명 소프트웨어의 코드 라인수
http://www.informationisbeautiful.net/visualizations/million-lines-of-code/?utm_content=buffercb050&utm_source=buffer&utm_medium=twitter&utm_campaign=Buffer



자바 웹 프레임워크 비교. 여기저기서 인용은 많이 되는 제로턴어라운드의 문서
Java Web Frameworks Comparison
http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/


게임메이커 스튜디오가 무료가 되었네요
GameMaker Studio Standard Edition Is Currently Free ($50 Value) | Game Maker Blog
http://gamemakerblog.com/2013/11/25/gamemaker-studio-standard-edition-is-currently-free-50-value/


스칼라 무료 이북 12권
12 Free eBooks On Scala
http://www.efytimes.com/e1/fullnews.asp?edid=122757



서브라임 에디터에서 Markdown table 에디터
vkocubinsky/SublimeTableEditor · GitHub
https://github.com/vkocubinsky/SublimeTableEditor


Agile Testing & BDD eXchange 2013: Gojko Adz
http://skillsmatter.com/podcast/home/keynote-gojko-adzic

jQueyr 무료 이북 10권
10 Free jQuery eBooks For Programmers
http://efytimes.com/e1/fullnews.asp?edid=117488


[디자인/아트]

23개의 무료 폰트입니다. 모두 영어이긴 합니다만^^ 
23 Must-Have, Free Fonts for Graphic Designers
http://vector.tutsplus.com/articles/web-roundups/23-must-have-free-fonts-for-graphic-designers/


품질이 꽤 좋은 벡터 아이콘입니다. 
디자이너.개발자도 놀란 300가지 벡터 아이콘이 무료 :: 디자인로그(DESIGN LOG)
http://www.designlog.org/2512454#.UpQZWpEfnrA.twitter


유용한 264가지 벡터 아이콘 팩 'IKONS', 무료 다운로드
http://www.designlog.org/2512452


여러 회사와 단체들의 디자인 원칙들을 모아둔 사이트. 꽤나 많은 내용이지만 유명하거나 맘에 드는 단체의 디자인 원칙은 한번쯤 봐두면 좋습니다. 
Design Principles FTW
http://designprinciplesftw.com/


많은 짐을 실을수 있는 전기 스쿠터 킥스타트
Meet kubo: an electric scooter to carry all your stuff!
http://www.kickstarter.com/projects/1120003274/introducing-kubo-a-unique-and-fun-way-to-get-aroun?ref=category


RT @tobyyun: 최근 크롬이 가상컨텐츠(generated contents) :before, :after를 인스펙터에서 명확히 보여줌에 따라 작업하기가 훨씬 수월해졌습니다. 간결한 마크업을 선호하시는 분께는 참 좋은 도구죠. .…
http://twitter.com/tobyyun/status/405630708762173440/photo/1


아이트래킹 연구가 알려준 사용자 경험 디자인 4가지 필수 규칙 :: 디자인로그(DESIGN LOG)
http://www.designlog.org/2512456#.UpbkgD03XJU


10 graphic design cheat sheets • Inspired Magazine
http://inspiredm.com/10-graphic-design-cheat-sheets/


구글에서 웹 폰트를 CDN으로 제공한다는걸 아십니까? 한글 폰트들도 포함해서 말이죠 ^^
Google Fonts
http://www.google.com/fonts?1#Analytics:total


[비지니스/과학]
스타트업에 대한 좋은 조언을 올라오는 블로그
http://brokenwolf.tumblr.com


안드로이드에서 금융앱 사용이 자폭인 이유
http://ryueyes11.tistory.com/m/3088


구글이 끊임없이 혁신할 수 있는 9가지 비결
http://kwang82.hankyung.com/2013/11/9.html


기존의 논문들을 머신러닝해서 새로운 논문을 만들어내는 시도
Software Mines Science Papers to Make New Discoveries
http://www.technologyreview.com/news/520461/software-mines-science-papers-to-make-new-discoveries/


잡스가 말하는 청소부와 VP의 차이
http://mimul.com/pebble/default/2013/11/22/1385113423546.html


페이스북, 1명이 서버 2만대 관리하는 비결
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20131126100541


美 핵무기코드 비번 15년간 ‘00000000’이었다…충격사실 드러나 : 네이버 뉴스
http://news.naver.com/main/ranking/read.nhn?aid=0002380365&date=20131201&mid=etc&oid=081&rankingSectionId=104&rankingSeq=6&rankingType=popular_day&sid1=111&type=1


기억하기 쉽고 추측하기 어려운 비밀번호 만들기
http://www.itworld.co.kr/news/84840


대기업에서 보고팠던 창의력과 도전, 한 작은 개발사에 있었습니다
http://www.inven.co.kr/webzine/news/?news=66884


창의성을 향상하기 위한 50가지 레슨
Extreme Creative Ideas – 50 Lessons to Improve Creativity Dramatically | The Brainzooming Group
http://brainzooming.com/extreme-creative-ideas-50-lessons-to-improve-creativity-dramatically/13086/


2013년 가을에 펼쳐진 여러 데모들 가운데 선정된 데모
http://www.technewsworld.com/story/79223.html

구글은 어떻게 맥을 관리하는가? (현재 구글의 #1 개발 머신은 맥임)
Managing Macs at Google Scale | USENIX
https://www.usenix.org/conference/lisa13/managing-macs-google-scale


향후 10년 부동산 3단계 하락...더 늦기 전에 탈출하라!
http://unsoundsociety.tistory.com/751


"요즘 누가 TV를 한국에서 삽니까"…한국은 봉?:SBS뉴스
http://news.sbs.co.kr/section_news/news_read.jsp?news_id=N1002109760


번개장터 Exit 경험을 통해 얻은 다섯가지 교훈
https://www.facebook.com/note.php?note_id=10151832355673494


날로 발전하는 소비자 트래킹 기술들 | techNeedle
http://techneedle.com/archives/13646


[문화]

아닌강 - 그래비티를 보셨다면 필견!!
Aningaaq :: The otherside of Gravity
http://www.youtube.com/watch?v=fo2j5ziXtws


트위터 파워 계산 공식
들녘37.2 (@Field372)
"새누리당 총선 공천 당시 최초SNS역량지수 공식은 "(팔로어 수-팔로잉 수)+팔로어 수×0.1+트윗량×0.1+#리트윗수", 이준석 버젼은 log[(팔로어 수+팔로잉 수)/1000]/10+1}×∑[1+트윗 수+#리트윗수/100]} #리트윗이_안중요해?"


'직관'에 대한 좋은 글
http://blog.gorekun.com/1540


좋은 아이디어들에 대한 플립보드
Innovation Factory - Flipboard
https://flipboard.com/section/innovation-factory-bjCaPN


클리앙 > 모두의공원 > (펌)드래곤라자라도 괜찮은 거야!?
http://www.clien.net/cs2/bbs/board.php?bo_table=park&wr_id=25579343


충격과 공포의 사에군 (@eclipser99)
"전에 들은 술자리 얘기중 '징역 2,3년이면 가벼운 처벌이 아닌데 공감하지 못하는 이유는 국민들이 초중고 12년 징역형을 살고 나온데다 남자들은 군대 2년까지 겹쳐 가벼운 처벌로 생각하는 경향이 있다.'라는 말을 들었는데 묘하게 인상에 남는다."


Hakkyu Kim (@cheydohundaddy)
"고수가 되는 법의 세가지 요소를 behavior tree를 만들어나가는 관점에서 본다면, 복기는 selector의 priority를 조절하는 부분, 타인관찰은 새로운 behavior 추가. 반복훈련은 기존 behavior의 완성도 강화."
"회사에 철권을 뒤늦게 배워 고수가 된 팀원이 있는데, 예전에 behavior tree에 대한 강좌를 하면서 너의 철권 전략도를 그려보라고 했더니 바로 술술 그려냄. 그 트리를 보고 있노라니 그 친구의 전략이 이해가 가면서 각자의트리에 대해 생각하게됨"
"철권을 계속 해도 실력이 안 느는 사람에겐 특히 복기의 중요성을 강조하고 싶음. 대전게임은 결국 심리전략전인데, 승리에 가장 큰 걸림돌은 나쁜 습관. 나쁜 습관을 고치려면 내 나쁜 습관을 관찰자의 눈으로 직접 봐야함."
"다른사람관찰 활동의 예 - 유투브 영상들 시청, 도장 깨기, 오프라인 미팅 참가, 학원같은 기관 활용, 관련 유명 인사들의 블로그나 트위터 페북 팔로우.등등.. 좋은 선생님을 만나서 배우는 것은 결국 앞선 세가지 활동들의 조합."
"반복훈련의 예. 철권 - 주요 공중 콤보의 숙달. 언어 - 주요 관용어구의 발음 등등... 양질의 입문서에서 제시하는 idiom 들을 완벽에 도달할 때까지 반복. 복기의 예 - 자기 플레이를 영상으로 녹화한 후 자기 피드백. 스마트폰을 이용하면 간단"
"(독학으로) 고수가 되는 방법의 삼요소. 반복훈련, 복기, 다른사람 관찰. 철권같은 대전게임부터 악기연주, 프리젠테이션능력, 어학, 스포츠 등 많은 분야에 적용 가능. 세가지 요소가 균형을 이루도록 시간을 배분하는 것이 중요."


얼굴 형태에 맞는 안경테 고르기 
The Best Glasses For Your Face Shape
https://www.youtube.com/watch?v=jKV-odZZGtk

11월 4째주 관심이 갔던 것 들 기술


게임 버그로 시작해서 의학 연구 논문으로까지 쓰이게 '오염된 ' 사건

http://www.instiz.net//bbs/list.php?id=pt&no=1624047&page=77&page_num=17



Noise-Canceling Window Treatment Is Everything You Need For A Better Night's Sleep (VIDEO)

http://m.huffpost.com/us/entry/4171667



RT @parkto: 구글 클라우드 2,000$ 어치를 무료로 써볼 있는 코드 #fb

http://twitter.com/parkto/status/400798420455006208/photo/1



법률까지 정한다! 페리아 연대기의마을 건설

http://www.thisisgame.com/special/page/event/gstar/2013/nboard/219/?n=50974




30 Things You No Longer Need Because of Smartphones

https://www.youtube.com/watch?v=HCowytZ0qV4



모토로라 무약정 19만원대 모토G 출시

http://ryueyes11.tistory.com/3041




Tiny Excel-like app in vanilla JS  - 멋집니다. 몇라인 되지 않는 소스로 엑셀 같은 그리드! 계산까지!

http://jsfiddle.net/ondras/hYfN3/




RT @agebreak: 아마도 프로그래머가 라인당 시급을 받았나보다.. RT @LKasumi: 이것도 보고 VB에서 2차원 배열을 지원 안했었나..하고 구글도 뒤져보고..관련 함수도 변수 개수만큼 되어있어서 리팩토링도 하드코어.. .…

http://twitter.com/LKasumi/status/400849400013934593/photo/1




역습의 일러스트레이터, 터무니 없는 보수를 강요하는 회사에 대한 복수? (일본의 사례)

http://alonestar.egloos.com/4839743



달의 미소녀전사는 부녀자 선생님이 되셨습니다

http://eldlan.egloos.com/5782358



Steve Jobs Inducted Into Bay Area Business Hall of Fame, Eddy Cue Gives Heartfelt Acceptance Speech | TechCrunch

http://techcrunch.com/2013/11/12/steve-jobs-inducted-into-bay-area-business-hall-of-fame-eddy-cue-gives-heartfelt-acceptance-speech/




Secrets of Specification By Example

http://agilitrix.com/2013/11/secrets-of-specification-by-example/




노무현 대통령의 대화록 지시 전문

http://ccoccoma.blogspot.fr/2013/11/blog-post_4628.html




js2js - 자바스크립트를 자바스크립트로 컴파일한다....?? (유머로 생각하시면 됩니다)

http://eleks.github.io/js2js/



만두 - 찐만두, 군만두, 물만두 국물을 곁들여 조리하지 않은 만두 정리

http://blog.naver.com/PostView.nhn?blogId=howmanyroads&categoryNo=44&from=postView&isShowPopularPosts=false&logNo=70175950416&parentCategoryNo=&viewDate=




대만의 공립 사립 전문 200곳에 달하는 학교 여학생 교복을 망라한 "유니폼

구글맵 베이스로 지도상의 빨간 깃발이 학교 위치. 클릭하면 사진이 뜹니다.

http://twitter.com/cailia/status/401548846607499264/photo/1




Moon Taeksoo (@Mophius)

"하루동안 잠을 안자면 4일동안 사고력에 손상을 일으킨다니.. 아 시바 내가 어쩐지 밤새고 마감 한번 하면 3~4일간 머리 쥐어뜯다가 다시 마감다가오고서야 급하게 바바박하는 이유가 거기에......!!"



Smallest effective difference - 차이를 효과적으로 인식할 있는 최소한으로 시각화하라는 일종의 원칙

http://www.ecogwiki.com/Smallest_effective_difference



링크만으로 정보를 구조화하기

http://www.ecogwiki.com/%EB%A7%81%ED%81%AC%EB%A7%8C%EC%9C%BC%EB%A1%9C_%EC%A0%95%EB%B3%B4%EB%A5%BC_%EA%B5%AC%EC%A1%B0%ED%99%94%ED%95%98%EA%B8%B0




5천억원짜리 SW버그가 주는 메시지

http://www.zdnet.co.kr/column/column_view.asp?artice_id=20131118093913



고기 - 테러

http://kuroro.net/pork



Cailia (@cailia)

"리눅스:리눅스 최강 

윈도우:오피스 

맥:포토샵 

리눅스:리,리브레오피스랑 김프가 있다 

윈도우:마야 

맥:로직 

리눅스:블렌더…아더… 

윈/맥:마이너 주제에 닥쳐 

리눅스:히이익 

프리BSD:못써!메이져님에게 살해당한다고 

쵸칸지:그래.우리는 조용히 지내는게 최고야"






지뇽뇽의 사회심리학 이야기 (@imaum0217)

"주변 사람들이 힘들게 버티는(야근? 다이어트 등) 모습을 곁에서 생생하게 지켜보면 본인도 상당한 정신력을 소모하게 된다는 연구가 있었는데(타인의 자기통제 과정을 머리 속에서 '시뮬레이션' 하면 자신의 자기통제력이 떨어짐), Ackerman09"


지뇽뇽의 사회심리학 이야기 (@imaum0217)

"부모와 친밀하다고 느낀 대학생들은 그렇지 않은 학생들에 비해 30년 후에도 ‘힘들 때 믿고 기댈 수 있는 사람들이 있다’ 같은 안정감이 더 높았다고. 성격적인 영향도 있겠지만 부모님으로부터 느끼는 사회적 지지는 중요하긴 한 듯, Graves등1998"




High Scalability - High Scalability - GOV.UK

http://highscalability.com/blog/2013/6/3/govuk-not-your-fathers-stack.html



These Are The Secret Little Tools Apple Uses To Repair The iPhone 5s

http://www.cultofmac.com/252956/genius-bar-repair-gifcity/


혁신에 필요한 가지 요소 | NewsPeppermint

http://newspeppermint.com/2013/11/19/thefourcsofinnovation/



Pencil | FiftyThree

http://www.fiftythree.com/pencil



Five lifestyle apps that'll keep you moving with the M7 motion coprocessor - TUAW  - 저는 moves 사용합니다

http://m.tuaw.com/2013/11/19/five-lifestyle-apps-thatll-keep-you-moving-with-the-m7-motion-c/?utm_source=buffer&utm_campaign=Buffer&utm_content=buffer0144a&utm_medium=facebook



아이폰5s 찍고 아이포토로 다듬어 아이무비로 영상 만들기

http://kwang82.hankyung.com/2013/11/5s.html




한국 vs 미국 직장 1mm 차이 - 수시로 시행하는 연봉 조정 12

http://storyball.daum.net/episode/1544



브라우저 MMO 글리치, 그래픽과 코드 공공재로 공개

http://gamemook.com/617



Katrina the Tester: Mind Maps and Automation

http://katrinatester.blogspot.co.nz/2013/11/mind-maps-and-automation.html



Dangerous Code: How to be Unsafe with Java Classes & Objects in Memory 

http://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/



rkh starred bundestag/gesetze

https://github.com/bundestag/gesetze



[그래비티] '아닌강' 단편 공개

http://www.cinefringe.kr/3437




본격 스타크래프트만화 - 부제 게임산업의 미래편

http://bbs2.ruliweb.daum.net/gaia/do/ruliweb/family/217/read?articleId=19280419&bbsId=G005&itemId=64&pageIndex=1




핀란드 모바일게임 산업, 노키아 빈자리 채운다

http://m.media.daum.net/m/media/digital/newsview/20131121030313091




- DOM 이벤트 처리에 관한 글들 


A crash course in how DOM events work  

http://bitovi.com/blog/2010/10/a-crash-course-in-how-dom-events-work.html



RT @nanhapark: An Introduction To DOM Events 또다른 bubbling 설명 그림이 좋네요.

http://twitter.com/nanhapark/status/402353867951595520/photo/1



An Introduction To DOM Events | Smashing Coding

http://coding.smashingmagazine.com/2013/11/12/an-introduction-to-dom-events/






Eclipse에서 라이브러리 소스 보기(Attach source)가 동작하지 않는 증세 해결 방법 기술

이클립스 웹 프로젝트일 경우, Java Build Path -> Order and Export 에서 Web App Library 가 다른 라이브러리보다 위에 있으면 소스보기가 정상적으로 되지 않는 경우가 있습니다. 이럴경우 Web App Libary를 최하단으로 순서를 변경하면 소스 보기가 됩니다. 


gradle을 사용하는 경우에는 다음을 실행시켜 주면 Web App Library를 최하단으로 내리게 됩니다. 

eclipse.classpath.file {
// Classpath entry for Eclipse which changes the order of classpathentries; otherwise no sources for 3rd party jars are shown
withXml { xml ->
def node = xml.asNode()
node.remove( node.find { it.@path == 'org.eclipse.jst.j2ee.internal.web.container' } )
node.appendNode( 'classpathentry', [ kind: 'con', path: 'org.eclipse.jst.j2ee.internal.web.container', exported: 'true'])
}
}


참고:
http://stackoverflow.com/questions/12836089/why-is-eclipse-not-attaching-3rd-party-libs-source-files-to-a-wtp-faceted-gradle

지난 한 주동안 관심있게 본 링크들입니다. 기술

지난 한 주동안 관심있게 본 링크들입니다. 



디자이너에게 부탁하기 

http://blog.dahlia.kr/post/66778859403?og=1



효과적인 운동에 관한 보디빌더의 조언 

http://blog.naver.com/mnfkorea1990/130179741385



Airbnb JavaScript 스타일 가이드

https://github.com/tipjs/javascript-style-guide



배명훈 (@KiyikKiyik) Posted at 2013 11 13 오후 9:41 on 트위터

"세계는 "객관적 사물 + 세계관 + 규범(혹은 제도)" 쯤으로 이해할 있는데(말은 쉽지만 이거 이해하는 4년은 걸렸음), 그래서 geek스럽게 접근하지 않아도 세계관이나 규칙쪽에 밝으면 충분히 재미있는 SF 나올 있다고 생각."



asm.js 무엇인가 그리고 무엇이 아닌가

http://ujinbot.blogspot.kr/2013/07/asmjs.html?m=1




소프트웨어 개발자와 영어의

http://www.zdnet.co.kr/column/column_view.asp?artice_id=20131111104547




깔끔한 그래프를 만드는 방법, “지우기

http://slowalk.tistory.com/1760



RT @chrisfrancis27: Feeling agile today.

http://twitter.com/chrisfrancis27/status/350617453526659072/photo/1



시장 점유율의 함정

http://yoonjiman.net/2013/11/09/problem-of-market-share/



Objective-C를 위한 Best Practice를 정기적으로 배포하는 사이트

http://www.objc.io/



30 Of The Most Powerful Images Ever | Bored Panda

http://www.boredpanda.com/must-see-powerful-photos/



CSS for iOS

http://www.pixate.com/



High Performance Browser Networking 

http://chimera.labs.oreilly.com/books/1230000000545/index.html



웹 클라이언트 앱을 위한 Pattern Library

http://ux.mailchimp.com/patterns/



그루브샤크 어떻게 차단되었나: 침해정보심의팀 일문일답

http://slownews.kr/15204



Mannequins, like people, get larger

http://www.nbcnews.com/video/nightly-news/53481148



Skydivers’ miraculous escape as planes collide

http://www.nbcnews.com/video/nightly-news/53461411



Thymeleaf Interactive Tutorial - 최근 가장 Hot 자바 서버 템플릿 엔진 

http://thymeleaf-itutorial.appspot.com




21st Century Logging

http://java.dzone.com/articles/21st-century-logging




[SPA] Single Page Application 기본개념 잡기

http://mobicon.tistory.com/154



자바스크립트 객체

http://www.clearboth.org/45_objects_in_javascript/



Understanding Twitter Bootstrap 3

http://www.sitepoint.com/understanding-twitter-bootstrap-3/



버전 관리 시스템 유랑기, 그리고 Git 적응기

http://blog.benelog.net/2937766


BeanUtils 성능비교 - Apache commons, Opensymphony, Spring 

http://blog.benelog.net/2626007



Effective & Agile Java Generics 

http://blog.benelog.net/2173103




Stepwise Refinement  - 구조적 프로그래밍을 배우기 아주 좋은 글

http://www.seas.gwu.edu/~drum/java/lectures/appendix/stepwise.html



The Code That Made Me Cry - 나를 울린 코드... 저런 코드 유지보수하라면 정말 눈물 나올듯 

http://java.dzone.com/articles/code-made-me-cry



Beautiful REST + JSON APIs

http://java.dzone.com/articles/beautiful-rest-json-apis-les



JSP, Freemarker에서 한글 속성명 사용하기 기술

JSP와 Freemarker에서는 기본적으로 변수명으로 US-ASCII  만 지원합니다. 
${age} 이런 식으로 말이죠 

그런데 다음과 같이 한글로 된 클래스와, 속성명이 있으면 곤란해집니다..

@Getter @Setter
public class 회원정보 {
String 이름;
회원요약정보 요약정보;
}

@Getter @Setter
public class 회원요약정보 {
int 가입후_지난날자;
}



이를 극복하는 방법은 다음과 같습니다. (깔끔하게 되지는 않습니다)

1) JSP 
requestScpe를 이용하면 됩니다. 

Java:
response.addAttirbute(“회원”, new 회원정보());

JSP:
${requestScope['회원']['이름']}




2) Freemarker

빌트인 변수인 .vars 를 사용하면 됩니다. 

java:
Object root = new 회원정보();
...

temp.process(root, out);

FTL:
${.vars['회원요약정보']['가입후_지난날자']}





이것 때문에 고생좀 하다가 정리차원에서 적어 봅니다. 

자바 한글 UTF Normalize 예제 기술

import static org.junit.Assert.*;

import java.text.Normalizer;

import org.junit.Test;

public class KoreanNormalizeTest {
private void printIt(String string) {
System.out.println(string);
System.out.println("Len:" + string.length());

for (int i = 0; i < string.length(); i++) {
System.out.print(String.format("U+%04X ", string.codePointAt(i)));
}
System.out.println();
}

/**
*  참조 : http://helloworld.naver.com/helloworld/76650 
*  
* NFD : 조합형 NFC : 완성형
*/
@Test
public void test() {
String han = "한";
assertEquals("자바소스를 컴파일하면 기본적으로는  NFC 형태를 사용하기에 1글자", 1, han.length());
assertEquals(Integer.parseInt("D55C", 16), "한".codePointAt(0));
printIt(han);

String nfd = Normalizer.normalize(han, Normalizer.Form.NFD);
assertEquals("NFD 형식으로 분해하면 ㅎ ㅏ ㄴ 해서 3글자", 3, nfd.length());
assertEquals(Integer.parseInt("1112", 16), nfd.codePointAt(0));
assertEquals(Integer.parseInt("1161", 16), nfd.codePointAt(1));
assertEquals(Integer.parseInt("11AB", 16), nfd.codePointAt(2));
printIt(nfd);

String subHan = Normalizer.normalize("하", Normalizer.Form.NFD);
printIt(subHan);
assertTrue("NFD 로 분해하면 자소 단위의 비교가 가능하다.  startsWith등을 이용해 자동완성 같은 기능에 쓸수 있다", nfd.startsWith(subHan));

String subHan2 = Normalizer.normalize("ㅎ", Normalizer.Form.NFD);
printIt(subHan2);
assertEquals("단, 단일 자소로 구성된 문자열을 NFD 로 노말라이즈를 해주지 못한다. 만약  NFD노말라이즈가 되었다면  코드 포인트가  1112 가 되어야 한다. ",
Integer.parseInt("314E", 16), subHan2.codePointAt(0));

String nfd2 = Normalizer.normalize(nfd, Normalizer.Form.NFD);
assertEquals("NFD 를 또 NFD 로 노말라이즈 해도 변화는 없다", 3, nfd2.length());
assertEquals(Integer.parseInt("1112", 16), nfd2.codePointAt(0));
assertEquals(Integer.parseInt("1161", 16), nfd2.codePointAt(1));
assertEquals(Integer.parseInt("11AB", 16), nfd2.codePointAt(2));
printIt(nfd2);

String nfc = Normalizer.normalize(nfd, Normalizer.Form.NFC);
assertEquals("NFD를  NFC 로 노말라이즈하면 다시 1글자", 1, nfc.length());
assertEquals(Integer.parseInt("D55C", 16), nfc.codePointAt(0));
printIt(nfc);

}

}


1 2 3 4 5 6 7 8 9 10 다음