축적의 시간II - 이정동 교수축적의 시간II - 이정동 교수

Posted at 2017. 7. 21. 00:13 | Posted in 좋은글

KBS 스페셜 - 축적의 시간II - 이정동 교수


아이디어는 발에 차일 정도로 널렸다

스케일업이 필요하다

끈기있게 하나씩 실험하고 연습하고 반복해서 노하우를 쌓아야 한다. 이것이 '스케일업' 이다.

오랜시간이 필요.

구글과 애플이 내놓는 혁신은 오랜시간 스케일업의 결과이다. 절대 반짝이는 아이디어 때문이 아니다.


지금 어려우니 조금 더 좋아지면 스케일업 하자. 이것은 틀렸다. 살기 위해서 지금 해야 한다!

구글 애플도 여유 없기는 매한가지다.


역량이 뛰어난 한국의 10년 경력 엔지니어는 100년동안 스케일업 해온 회사의 같은 경력을 가진 엔지니어를 '절대' 이길 수 없다. 이 엔지니어는 110년 경력의 엔지니어이기 때문이다.


소비자는 정체성이 있는 제품을 원한다. 자기만의 색깔이 있어야!


항상 새로운 아이디어를 요구하거나 선택과 집중을 이야기하는 리더는 '옛날' 리더이다.


//

어쩌다 어른어쩌다 어른

Posted at 2017. 7. 21. 00:03 | Posted in 좋은글

어쩌다어른 - 허태균 

한국사람의 심리를 파헤치다 


아이패드-신문을듣다 전화를보다 별을만지다 

한국-더크게 빠르게 더세게-패스트팔로어- 만드는지 모르는것이다 


실용성을 이기는 상징성-웨딩드레스


가상현실 - 아빠가 태워주는 자전거 


나만의 이유, 나만의 가치를 찾아라, 찾아줘라 


———————————————


감각을 파헤치다 - 김경일


다양한 경험을 해야 오래 산다


개발자들은 뭐든 만들수 있다고 말한다. 하지만 만들지를 모른다.

이건 경험이 부족해서이다 - 스티브잡스

비슷한 경험을 계속하면 시간이 빨리 간다.

다양한 경험을 해야 오래 산것 같은 느낌이 든다.

—> 귀차니즘을 타파해야 한다.


성공 거둔 사람은 미래가 절대 안변한다고 생각한다.

미래를 작게 예측하더라. —> 빌게이츠 640kb

//

How to install subversion 1.6.x on MacHow to install subversion 1.6.x on Mac

Posted at 2014. 7. 13. 01:14 | Posted in OS/Mac

check subversion versions (on OS X 10.9.3)

$ brew versions subversion

1.8.9    git checkout 9b75c92 /usr/local/Library/Formula/subversion.rb
1.8.8    git checkout c6cf8ac /usr/local/Library/Formula/subversion.rb
1.8.5    git checkout fa4311c /usr/local/Library/Formula/subversion.rb
1.8.4    git checkout ce669eb /usr/local/Library/Formula/subversion.rb
1.8.3    git checkout 9b438ce /usr/local/Library/Formula/subversion.rb
1.8.0    git checkout f56b641 /usr/local/Library/Formula/subversion.rb
1.8.1    git checkout 55577bb /usr/local/Library/Formula/subversion.rb
1.7.10   git checkout 0060dc3 /usr/local/Library/Formula/subversion.rb
1.7.9    git checkout b0e6223 /usr/local/Library/Formula/subversion.rb
1.7.8    git checkout f7a42d2 /usr/local/Library/Formula/subversion.rb
1.7.7    git checkout a6dcc41 /usr/local/Library/Formula/subversion.rb
1.7.6    git checkout 6b8d25f /usr/local/Library/Formula/subversion.rb
1.7.5    git checkout 5d5cd70 /usr/local/Library/Formula/subversion.rb
1.7.4    git checkout dc4245c /usr/local/Library/Formula/subversion.rb
1.7.3    git checkout eb97154 /usr/local/Library/Formula/subversion.rb
1.7.2    git checkout d89bf83 /usr/local/Library/Formula/subversion.rb
1.6.17   git checkout 6e2d550 /usr/local/Library/Formula/subversion.rb
1.6.16   git checkout 83ed494 /usr/local/Library/Formula/subversion.rb


get 1.6.16 version formula

$ git checkout 83ed494 /usr/local/Library/Formula/subversion.rb


install subversion

$ brew install subversion


If an error occurs like this... 만약 빌드 도중 이런 에러를 만나면..

checking whether Apache version is compatible with APR version... no
configure: error: Apache version incompatible with APR version

add --without-apx configure argument. configure 옵션에 --without-apxs 를 추가해준다.

/usr/local/Library/Formula/subversion.rb 파일을 열어 configure args에 --without-apxs 옵션을 추가.

https://github.com/Homebrew/homebrew-versions/issues/373
https://github.com/Homebrew/homebrew-versions/commit/1d203e29e6219967164337a00672fc071e355cec 참조


check subversion version

$ svn --version


If version is different, switch version

$ brew switch subversion 1.6.16


and re-check svn version on new terminal

$ svn --version
svn, version 1.6.16 (r1073529)
   compiled Jul 13 2014, 00:18:37

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.apache.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).


Completed.





//

[HBase] Client 개발 참고 사항[HBase] Client 개발 참고 사항

Posted at 2014. 3. 12. 14:50 | Posted in Server
HTable
- 인스턴스는 한번만 생성하고, 프로그램이 끝날때까지 재사용하라.
- Thread 별로 만들어라.(HTablePool 사용 하라.)
- HTablePool 사용 예(HTableInterfaceFactory 인터페이스로 한번 감싸서 사용하면 편하다)
public class BaseHTableInterfaceFactory implements HTableInterfaceFactory {
	
	private HTablePool hTablePool;
	
	public BaseHTableInterfaceFactory(Configuration config, int maxSize) {
		hTablePool = new HTablePool(config, maxSize);
	}
	
	@Override
	public HTableInterface createHTableInterface(Configuration config, byte[] tableName) {
		return hTablePool.getTable(tableName);
	}

	@Override
	public void releaseHTableInterface(HTableInterface table) throws IOException {
		table.close();
	}
}
- 내부적으로 병렬처리 thread를 가진다. 
  public HTable(Configuration conf, final byte [] tableName)
  throws IOException {
    ...
    int maxThreads = conf.getInt("hbase.htable.threads.max", Integer.MAX_VALUE);
    if (maxThreads == 0) {
      maxThreads = 1; // is there a better default?
    }
    long keepAliveTime = conf.getLong("hbase.htable.threads.keepalivetime", 60);

    // Using the "direct handoff" approach, new threads will only be created
    // if it is necessary and will grow unbounded. This could be bad but in HCM
    // we only create as many Runnables as there are region servers. It means
    // it also scales when new region servers are added.
    this.pool = new ThreadPoolExecutor(1, maxThreads,
        keepAliveTime, TimeUnit.SECONDS,
        new SynchronousQueue(),
        Threads.newDaemonThreadFactory("hbase-table"));
    ((ThreadPoolExecutor)this.pool).allowCoreThreadTimeOut(true);

    /* 설명:
     기본 생성자의 설정이다.
     coreThread=1, maxThreads=Integer.MAX_VALUE 이고, SynchronousQueue를 사용한다.
     따라서 region 서버 수만큼 Thread를 생성하고 keepAliveTime 동안 유지했다가 Thread를 죽인다.
     뜨문 뜨문 호출되는 경우 Thread가 만들어졌다 없어졌다를 반복할 것이므로, 환경에 맞게 조정해서 사용하라.
    */
  ...
  }

- HTable은 HConnection을 사용해서 원격서버와 통신하고, HConnectionManager가 이 커넥션을 관리한다.
- HBase 내부에서는 연결들이 맵 안에 저장되는데 현재 사용중인 Configuration 인스턴스가 키가된다. 동일한 Configuration을 참조하는 HTable 인스턴스를 여러개 만들었다면, 이들 모두는 HConnection 객체를 공유한다.

Put
- 쓰기 버퍼 크기를 늘리면, 클라이언트 뿐 아니라, 서버에서도 많은 메모리를 소비한다. 서버에서도 전송받은 데이터를 인스턴스화 하기 때문이다.(P.148)
- 크기가 큰 셀만을 저장한다면 로컬 버퍼는 덜 유용하다. 실제 데이터 전송 시간이 대부분일 것이고, 이럴 경우는 버퍼 크기를 늘리지 않는 쪽이 권장된다. (p.148)

batch()
- 일괄처리 연산은 Put처럼 쓰기버퍼를 사용하지 않는다. 동기적이며 바로 바로 처리한다.
- 각 작업에 대한 결과를 따로 보고 받을 수 있다. (Object results[])
- 일괄처리 명령은 NotServingRegionException(리전 이동을 알리는 예외)와 같은 일시적인 에러에는 여러 번 시도해본다. hbase.client.retries.number 속성이며 기본값은 10이다.

RowLock/Scanner
- hbase.regionserver.lease.period = 60000 (1분) 락 만료 시간 또는 스캐너 임대 만료 시간에 모두 사용됨.
  - 이 설정은 클라이언트측 Configure에 해봤자 무용지물이다. 리전서버 hbase-site.xml에 설정되어야 한다. (p200)

Scan
- Scan.next() 호출 시 RPC가 일어난다.
- setCaching() / hbase.client.scanner.caching (default=1) 를 조정하여 한번의 RPC에서 여러개의 row를 가져오도록 할 수 있다.
  - 데이터 큰 경우 클라이언트에 전송되는 데이터량이 많아져 수행시간이 길어지고, 메모리 문제로 이어질 수 있다. (p.200)
- setBatch()를 조절하여 한번에 읽어올 컬럼개수를 정할 수 있다. setBatch(5)일 때 컬럼이 17개면 Result인스턴스를 총 4번 받게되고, 세번은 5개, 한번은 2개를 반환할 것이다.(p201) --> RPC 횟수를 조절할 수 있다(p.202)

Filter
- 필터는 클라이언트측에서 생성된 후 RPC를 통해 서버로 전송돼 실행된다. (p.210)
- 사용자 정의 Filter는 jar로 묶어 리전서버 classpath에 넣어줘야 한다(hbase-env.sh). 재시작 필요 (p.244)
- 필터 요약(p.246)

보조처리기(Coprocessor)
- preCreateTable(), postCreateTable(), preGet(), postGet() ... 등
- 정적, 동적 로드 가능하나 0.92 버전 현재 동적 로드 API는 아직 없음. (p.262)

HTablePool
- maxSize는 HTableInterface 인스턴스 개수의 상한선의 의미하지 않는다. 5로 지정하고 getTable()을 10번 실행하면 HTable이 10개 생성된다. 이들을 반환하면 5개까지만 남고 나머지는 버려진다. 즉, Pool에 남겨둘 인스턴스의 상한선이다. (p.289)

HConnectionManager (p.292)
- 동일한 설정의 HTable은 모두 같은 HConnection객체를 공유한다. 
  - 이 공유는 같은 Configure객체를 사용할 때 적용된다. (p.293)
- hbase.client.pause = 1000
- hbase.client.retries.number = 10
- hbase.client.rpc.maxattempts = 1
- hbase.rpc.timeout = 60000
- hbase.client.prefetch.limit = 10


참고: 소스분석 & O'Reilly - HBase 완벽 가이드

//

[MySQL] 멀티 컬럼 select[MySQL] 멀티 컬럼 select

Posted at 2014. 3. 12. 11:03 | Posted in Server


CREATE TABLE `mytable` (
  `userid` bigint(20) NOT NULL,
  `groupid` bigint(20) NOT NULL,
  `state` tinyint(1) NOT NULL,
  `col1` bigint(20) DEFAULT NULL,
  `cal2` varchar(200) NOT NULL,
  `cal3` varchar(100) NOT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  PRIMARY KEY (`userid`,`groupid`),
  KEY `idx_userid_createtime` (`userid`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


(1) 컬럼 조합 IN 쿼리

EXPLAIN
SELECT *
FROM mytable
WHERE (userId, groupid) IN ((1526291770280964803,2679212559264916326),(1526292017760867305, 2679249801360511502),(1526421185616035771,2679342905646882845));

id|select_type|table  |type|possible_keys|key |key_len|ref |rows|Extra
1 |SIMPLE     |mytable|ALL |NULL         |NULL|NULL   |NULL|172 |Using where

index를 타지 않는다.


(2) FROM절 subquery

EXPLAIN
SELECT a.* FROM (SELECT * FROM mytable WHERE userid IN (1526291770280964803,1526292017760867305,1526421185616035771)) a
WHERE a.groupid IN (2679212559264916326, 2679249801360511502, 2679342905646882845);

id|select_type|table     |type |possible_keys|key|key_len|ref|rows|Extra
1 |PRIMARY    |<derived2>|ALL  |NULL|NULL|NULL|NULL|15|Using where
2 |DERIVED    |mytable   |range|PRIMARY,idx_userid_createtime|PRIMARY|8|NULL|15|Using where

userid가 index를 탄다. groupid도 인덱스를 걸어줘야 할 듯.


(3) 각 컬럼에 대해서 IN query

EXPLAIN
SELECT *
FROM mytable WHERE userid IN (1526291770280964803,1526292017760867305,1526421185616035771) AND groupid IN (2679212559264916326, 2679249801360511502, 2679342905646882845);

id|select_type|table  |type |possible_keys|key|key_len|ref|rows|Extra
1 |SIMPLE     |mytable|range|PRIMARY,idx_userid_createtime|PRIMARY|16|NULL|9|Using where


결론) 3번이 가장 나아보임.


//

[MySQL] 실행계획(EXPLAIN)[MySQL] 실행계획(EXPLAIN)

Posted at 2014. 3. 12. 10:39 | Posted in Server


type (나쁜것부터 좋은것 순)
- ALL: full scan (extra에 "Using ditict"/"not exists" 가 있거나 LIMIT있는 쿼리는 예외)
- index: full scan but index order. 장점:정렬할 필요 없다. 단점: 전체 테이블을 인덱스 순서로 읽어야해서 random access가 일어남(비용 큼). (extra에 "Using index"가 나오면 커버링 인덱스를 사용하는 것임.(인덱스의 데이터만을 스캔한다는 것임))
- range: 제한된 형태의 index 스캔. index보다는 나은 성능을 보인다. 범위에 따라 성능차가 있다.
- ref: 어떤 조건 하나에 매치되는 행들을 반환해주는 인덱스 접근 방식. 여러개의 행을 찾게 될 수도 있으므로 탐색과 스캔이 함계 사용된다. unique하지 않은 인덱스 검색이 걸릴때 사용된다.
- eq_ref: MySQL이 기껏해야 값 하나만을 반환한다는 것을 알때 사용됨. 기본 키 혹은 unique 인덱스에 걸릴때 사용.
- const, system: 쿼리의 일부를 상수로 대체해서 최적화 할 수 있는 경우.
- NULL: 인덱스나 테이블에 접근조차 하지 않는 경우.

key: MySQL이 최적화를 위해 어떤 키를 사용하기로 했는지를 나타냄.

key_len: MySQL이 인덱스에 얼마나 많은 바이트를 사용하는지를 보여줌.

ref: key 에 나와 있는 인덱스에서 값을 찾기 위해 선행 테이블의 어떤 컬럼(또는 상수(const))이 사용되었는지를 나타냄.

rows: 원하는 행을 찾기위해 얼마나 많은 행을 읽어야 할지에 대한 예측값. 예측값은 인덱스의 선택도와 테이블 통계 정보에 의존적이므로 정확도가 상당히 떨어질 수도 있다.
      MySQL이 조사해야 할 것이라고 생각하는 행 수를 의미할 뿐 결과에 있는 행 수를 의미하지 않는다. 여기서 보여지는 행 수가 그리 중요하지 않을 수도 있다. 예측한 모든 행을 읽지는 않을 것이며, 대체로도 그렇다.

extra: 앞 선 컬럼에 적합하지 않은 나머지 정보를 표시. (중요하고 빈번한 몇가지만 나열)
- Using index: 커버링 인덱스를 사용한다는 것을 알려줌.
- Using where: MySQL서버가 스토리지 엔진에서 값을 가져온 뒤 행을 필터링한다는 것을 의미.
- Using temporary: MySQL이 쿼리 결과를 정렬하기 위해 임시 테이블을 사용한다는 것을 의미.
- Using filesort: 이는 MySQL이 결과의 순서를 맞추기 위해 인덱스 순서로 테이블을 읽는 것이 아니라 외부 정렬을 사용해야 한다는 것을 의미. 메모리나 디스크에서 수행될 수 있으며, EXPLAIN으로는 어떤 방식을 사용하지는, 디스크에서 하는지 메모리에서 하는지 등은 알 수 없다.
- Range checked for each record(index map:N): 적합한 인덱스가 없으므로 각 레코드의 조인에서 각 인덱스들을 재평가한다는 것을 의미한다. N은 possible_keys에 나타나 있는 인덱스들의 비트맵 값이다.


//

status vs statestatus vs state

Posted at 2014. 1. 3. 16:30 | Posted in Etc


status == how are you? [good/bad]

state == what are you doing? [resting/working]

//

추억의 수학함수들추억의 수학함수들

Posted at 2013. 11. 20. 00:09 | Posted in Etc


로그함수(log func)

log2 8 = 3 (8이 되는 2의 지수를 구하는 함수. 항상 (1,0)을 지난다.)

곱하기 및 나누기의 계산을 간편하게 해내기 위해 존 네이피어가 발명한 것으로 알려져 있다.(위키피디아)

매우 큰 수를 다루기 위한 방법을 모색하던 중에 나온 함수. 곱셈을 덧셈으로 변환시킴으로써 천문학적 수를 계산하는 부담을 엄청나게 줄여 주었다.

은행에 예금한 돈이 언제 두 배가 되느냐 하는 문제를 풀어 본 기억이 있을 것이다.
꽤 복잡한 수식 이었다고 생각이 된다. 그러나 그 답은 아주 쉽게 얻을 수 있다. 
즉 0.7이란 수를 이율로 나눠 주기만 하면 된다. 
만일 연 이율이 14%라면 5년(0.7/0.14=5)이 걸리고 요즈음처럼 이자율이 내려가서 7%인 경우는 10년이 걸리는 셈이다. 

그러면 0.7이란 수는 과연 무엇일까. 
이는 2의 자연 로그인 것이다. 어떤 수의 자연로그는 그 수와 같아지는 e의 지수를 나타내므로, 2의 자연로그는 e0.7 =2에서 0.7이 된다.

상용로그의 밑은 10이다: 보통 밑(base)을 생략하고 log x 로 사용한다.


지수함수(exponential func)

y = a^x (a의 지수값을 구하는 함수. 항상 (0,1) (1,a)를 지나는 성질이 있고, x값은 0에 수렴한다. 0이 되지는 않는다. a>1 이어야 한다.)


미분(differential)

미세하게 쪼갠다는 의미이다. 곡선에서 가장 가까운 직선인 접선을 구하는 것이 미분이다.
이 접선의 기울기가 미분계수이며 곡선의 순간 변화율을 의미한다. '접선의 기울기의 함수'라고 보면 된다. 

기울기를 구해야 하므로, 두 접의 델타(차이)값으로 구한다. 

물리에선 시간에 대해서 "위치미분=속력", "속력미분=가속도"가 된다. 광학에서 곡선이나 곡면으로 빛을 쏘았을 때 반사되어 나가는 빛의 방향을 찾을 때 접선의 기울기를 구하면, '빛의 입사각과 반사각이 같다'는 단순한 원리로 알아낼 수 있다.(네이버캐스트 미분의 응용)

미분은 쪼개기, 적분은 합치기.


도함수(derivative)

함수 y=f(x)를 미분하여 얻은 f'(x)를 말하며, f(x)의 미분계수라고도 한다. 미분계수는 접선의 기울기이며 평균변화율의 극한값이다.


미분방정식

미분하여 f'(x)가 되는 x의 원래 함수 f(x)를 구하는 것을 미분방정식을 푼다라고 한다.


적분(integral)

'적'은 누적의 뜻. 적분은 미분의 역함수. 

일반함수를 적분하면 면적함수가 되고, 면적함수를 미분하면 일반함수가 된다. 

sum의 s를 길게 늘어뜨린게 적분기호 ∫ 인테그랄(integral)이다. 

"x를 a부터 b까지 변환시키면서 f(x)에 dx를 곱한 것을 전부 합쳐라"라는 의미. f(x)는 y값이고, dx는 x축의 임의의 델타값인데, 높이(y=f(x))와 밑변(dx)의 곱은 넓이(면적)이 나오게된다. 이 때 가로(밑변)길이를 1/2하여 무한히 반복하여 나누면(극한으로 보내면) 0은 아니지만 0에 가까운 값이 되는데 이것이 dx이며, 높이(y=f(x)) 곱하기 밑변(dx)을 하면 하나의 기다란 선처럼 될 것이다. 이 선들을 모두 sum하는 것이 적분이다. 즉 넓이(면적)을 구할 수 있게 된다. 

이것을 응용하여 이 함수 그래프를 x축을 중심으로 회전시키면 입체도형의 부피를 구할 수 있다.  높이(y=(fx)) 곱하기 밑변(dx)가 가느다란 선이므로, 이 선을 회전시킨다고 하면 이 선의 길이(=높이)는 반지름이 되게 된다. 이 반지름의 원 면적을 구해 sum하면 부피가 나오게 된다.


초월수

대수적 수(유리수를 계수로 가지는 다항방정식의 해가 될 수 있는 수)의 반대 개념.

계수가 유리수인 어떤 다항식의 해도 될 수 없는 수.


초월수 파이(π)

3.141592...


초월수 자연로그의 밑 e

자연로그는 상용로그과 구분하기 위해 ln x로 사용한다. 

e=1+1/1!+1/2!+1/3!+…=lim(1+1/x)^x = 2.71828… 

e는 자연로그의 값이 1이 되는 수이다??


//

[NoSQL] CAP 이론[NoSQL] CAP 이론

Posted at 2013. 11. 14. 11:27 | Posted in Server




//

흠.. 스팸댓글 때메 워드프레스로 옮길까 싶네..흠.. 스팸댓글 때메 워드프레스로 옮길까 싶네..

Posted at 2013. 11. 11. 01:10 | Posted in Etc

이번 스킨은 깔끔하니 맘에 드는데,

티스토리 스팸댓글 때문에 지저분해진다..

로그인 사용자에게만 댓글 허용하면 괜찮을라나?


아래 큼지막한 광고도 작을걸로 줄이고, 공사가 한번은 필요한 듯.

근데 너무 귀찮다..ㅎ


//