Permalink
Browse files

Port articles

  - Convert Markdown files to Asciidoctor files
  - Use highlight.js for syntax highlighting
  - Change syntax highlight theme
  - Add 127.0.0.1 to internal host list
  - Minor CSS changes
  • Loading branch information...
chiwanpark committed May 12, 2018
1 parent 44de3e1 commit 714a42f9f729200615ebbf660b732dfe1d4cade6
@@ -1,22 +1,16 @@
---
type: article
title: 데이터 관리
date: Feb 9, 2013
summary: 기록 덕후의 데이터 저장 관리 방법
---
= 데이터 관리
:page-layout: article
:page-date: 2013-02-09 00:00:00 +0900
:page-summary: 기록 덕후의 데이터 저장 관리 방법

어렸을 때 부터 손으로 써서든 타이핑을 해서든, 무언가를 만드는 일을 계속 해오다 보니 나는 남들보다 내가 만든 또는 내가 얻은 데이터에 대해 애착을 갖는 편이다. 애착을 갖는 다는 것은 별다르게 특별한 것을 의미하는 것은 아니고, 언제나 내가 했던 기록을 열어볼 수 있는 정도로 정리해놓는 것을 의미한다. 쉽게 열어볼 수 있도록 폴더 구조를 잘 구축해 놓는 것도 내가 데이터에게 해주는 작업 중 하나이다.

주로 프로그래밍을 많이 했기 때문에, 대부분의 가지고 있는 데이터는 디지털로 되어있지만, 일부 데이터(예를 들면, 고등학교 때 푼 수능 문제의 풀이과정[^1]이라던가, 지인들에게 받은 편지들 등)는 아날로그로 되어있기도 하다.
주로 프로그래밍을 많이 했기 때문에, 대부분의 가지고 있는 데이터는 디지털로 되어있지만, 일부 데이터(예를 들면, 고등학교 때 푼 수능 문제의 풀이과정footnote:[문제집과 공부할 때 사용했던 노트를 버리지 않고 가지고 있다.]이라던가, 지인들에게 받은 편지들 등)는 아날로그로 되어있기도 하다.

최근에 데이터 관리하는 방법을 변경하려 조금씩 작업을 진행하고 있는데, 눈여겨볼 만한 변화라면 모든 문서의 LaTeX 소스코드화와 소스코드 저장소 호스팅을 적극적으로 이용하는 문서 저장이라고 할 수 있다.

LaTeX이 기존의 문서와 다른 점은 문서가 코드로 존재하기 때문에 텍스트 형식으로 존재한다는 점이다. 따라서 소스코드 관리 시스템으로 쉽게 관리할 수 있다는 장점이 있다. 협업도 당연히 쉬워지는 편이다. 출력해서 종이로 만드는 경우를 위해 탄생된 시스템이라 출력된 결과물도 이쁘게 뽑을 수 있다.[^2] 또 하나의 특징은 큰 틀에서 표현과 내용을 분리할 수 있다는 점이다. 다만, 완벽하지는 않다.
LaTeX이 기존의 문서와 다른 점은 문서가 코드로 존재하기 때문에 텍스트 형식으로 존재한다는 점이다. 따라서 소스코드 관리 시스템으로 쉽게 관리할 수 있다는 장점이 있다. 협업도 당연히 쉬워지는 편이다. 출력해서 종이로 만드는 경우를 위해 탄생된 시스템이라 출력된 결과물도 이쁘게 뽑을 수 있다.footnote:[저게 사실상의 장점의 전부고, 사실 단점도 만만찮게 많다. 수식을 깔끔하게 입력할 수 있다는 장점도 있으나, 일반적인 문서에서 수식을 자주 쓰지는 않기 때문에 아주 큰 메리트라고 보기는 어렵다. 문서 작성시간도 일반적인 워드프로세서에 비해 평균적으로 오래걸리는 편이며, 커스터마이징을 하려면 대단한 노력이 필요하다. 협업을 하려해도 협업에 참여하는 모든 사람이 LaTeX에 수준급의 실력을 갖추고 있어야한다.] 또 하나의 특징은 큰 틀에서 표현과 내용을 분리할 수 있다는 점이다. 다만, 완벽하지는 않다.

시간이 되는 대로, 대학교 때 썼던 레포트들을 LaTeX 형태로 변환하여 소스코드 저장소에 저장하고 있다. 코드는 Bitbucket 저장소에 공개되어 있으며, 다운로드 페이지에서 PDF로 변환된 문서도 받아볼 수 있다. 언제나 그렇듯이 레포트를 작성하는 시점에 내 의견과 지금의 내 의견은 다를 수도 있고 또 약간 과장하거나 사실인지 불분명한 내용이 들어있기도 하다. 그것도 나의 생각이었으니 숨기지 않고 공개해야겠다는 마음으로 변환 작업을 계속하고 있다.

이제 2개 수업에서 작성했던 문서를 변환했는데, 아직도 많은 문서가 남아있다. 틈틈이 또 꾸준히 바꿔서 졸업하기 전에 모든 문서를 LaTeX로 바꿀 수 있도록 해야겠다.

[^1]: 문제집과 공부할 때 사용했던 노트를 버리지 않고 가지고 있다.

[^2]: 저게 사실상의 장점의 전부고, 사실 단점도 만만찮게 많다. 수식을 깔끔하게 입력할 수 있다는 장점도 있으나, 일반적인 문서에서 수식을 자주 쓰지는 않기 때문에 아주 큰 메리트라고 보기는 어렵다. 문서 작성시간도 일반적인 워드프로세서에 비해 평균적으로 오래걸리는 편이며, 커스터마이징을 하려면 대단한 노력이 필요하다. 협업을 하려해도 협업에 참여하는 모든 사람이 LaTeX에 수준급의 실력을 갖추고 있어야한다.
@@ -0,0 +1,10 @@
= 지적 욕심
:page-layout: article
:page-date: 2013-01-31 00:00:00 +0900
:page-summary: 시험 기간에는 공부만 빼고는 모든게 재밌다.

주어진 일을 제시간에 끝내지 못하는 이유에는 여러가지가 있을 수 있지만, 내 경우 지적 욕심에 의한 해찰footnote:[이런 상황을 표현하는 적합한 표준어를 잘 모르고 있었는데, 후배랑 이런 얘기를 하다가 알게되었다.]이 주를 이룬다. 예를 들어, 시간이 정해진 A라는 일이 있는데 일을 하기 위해 자료를 찾다 B라는 흥미 있는 주제를 발견하면 나는 거의 A를 잠시 접고 B에 대해서 내 지적 욕심이 채워질 때 까지 찾아 본다. 채워지면 대게는 A로 돌아오지만 가끔 시간이 너무 늦거나 하여 A를 수행하는 것을 포기하는 경우도 있다. 아니, 있다 정도가 아니라 상당히 많다. 이러한 지적 욕심의 방해로 일어나는 일은 작게는 친구와의 약속에 늦거나 하는 것에서 부터 시작해 크게는 수업에 결석하거나 프로젝트 마감을 미루거나 하는 일도 생긴다. 덕분에 여기저기서 욕도 많이 먹고 있다. 심지어 마감을 앞두고 있는 일이 너댓개는 되는 시점에 쓰는 이 글 조차도 지적 욕심에 의한 정리병 같은 거라고 볼 수 있다.

그렇다고 지적 욕심이 나쁜 것만은 아니다. 지금 내가 써먹고 있는 지식footnote:[특히, 컴퓨터에 관한 지식 아니면 사람들에게 잡지식이라고 분류되는 지식]은 거의 다 지적 욕심에 의한 해찰하는 과정을 통해 습득한 지식들이다. 문제는 앞의 경우와 같이 살아가면서 주어진 시간내에 해결해야 하는 일을 해야하는 경우에 발생한다.

억제해야하는 걸 억제하지 못하니까 자꾸 사고를 친다. 이런걸 슬기롭게 다스리는 방법이 없을까?
@@ -1,25 +1,24 @@
---
type: article
title: Introduction to Apache Flink
date: Dec 01, 2014
summary: A platform for efficient, distributed, general-purpose data processing.
---
= Introduction to Apache Flink
:page-layout: article
:page-date: 2014-12-01 00:00:00 +0900
:page-summary: A platform for efficient, distributed, general-purpose data processing.

Hadoop의 MapReduce 프레임워크를 통해서 데이터 처리를 해본 사람들은 알겠지만, 사실 MapReduce 프레임워크를 통해 데이터를 처리하는 것은 불편한 점이 한 둘이 아니다. 기본적으로 지원하는 연산이 Map과 Reduce 둘 만 제공되어 모든 알고리즘을 Map, Reduce의 반복을 통해 구현해야 하는 점[^1], 병렬 최적화를 사실상 수동으로 수행해야해서 복잡한 알고리즘의 경우 최적화가 어려운 점, 중간 결과물도 HDFS에 저장해야해서 많은 I/O를 발생시키는 점[^2] 등이 대표적이다. 특히 MapReduce 프레임워크가 HDFS랑 밀접하게 붙어 작동하는 것은 성능 저하에 꽤 큰 부분을 차지했는데 특히 반복 기반으로 작동되는 알고리즘들은 중간 결과물이 많아져 복잡한 처리를 하지 않으면 성능이 급격하게 떨어진다.
Hadoop의 MapReduce 프레임워크를 통해서 데이터 처리를 해본 사람들은 알겠지만, 사실 MapReduce 프레임워크를 통해 데이터를 처리하는 것은 불편한 점이 한 둘이 아니다. 기본적으로 지원하는 연산이 Map과 Reduce 둘 만 제공되어 모든 알고리즘을 Map, Reduce의 반복을 통해 구현해야 하는 점footnote:[MapReduce 기반의 알고리즘들이 복잡해지는 주요 원인이 된다.], 병렬 최적화를 사실상 수동으로 수행해야해서 복잡한 알고리즘의 경우 최적화가 어려운 점, 중간 결과물도 HDFS에 저장해야해서 많은 I/O를 발생시키는 점footnote:[물론 InputFormat, OutputFormat을 직접 만들어 메모리에 저장하거나 할 수도 있긴 하다.] 등이 대표적이다. 특히 MapReduce 프레임워크가 HDFS랑 밀접하게 붙어 작동하는 것은 성능 저하에 꽤 큰 부분을 차지했는데 특히 반복 기반으로 작동되는 알고리즘들은 중간 결과물이 많아져 복잡한 처리를 하지 않으면 성능이 급격하게 떨어진다.

위와 같은 문제점 들을 해결하기 위해, MapReduce 프레임워크 위의 다른 프론트엔드[^3]를 사용하거나 다른 패러다임의 데이터 처리 프레임워크[^4]를 사용하는 추세가 이어지고 있다.
위와 같은 문제점 들을 해결하기 위해, MapReduce 프레임워크 위의 다른 프론트엔드footnote:[데이터 처리를 위한 스크립트 언어를 제공하는 link:http://pig.apache.org[Apache Pig]나 SQL과 비슷한 구문으로 데이터 처리를 수행하도록 도와주는 link:http://hive.apache.org[Apache Hive] 등이 대표적인 예다.]를 사용하거나 다른 패러다임의 데이터 처리 프레임워크footnote:[link:http://spark.apache.org[Apache Spark], link:http://tez.apache.org[Apache Tez] 등이 대표적인 예다.]를 사용하는 추세가 이어지고 있다.

Apache Flink는 MapReduce 프레임워크를 쓰지 않는 독자적인 데이터 처리 프레임워크로 반복 기반의 알고리즘을 처리할 때 대폭적인 성능 향상을 보인다. 모든 데이터는 Read-Only 이며, 모든 연산은 새로운 데이터 셋을 계속해서 생성하는 형태로 수행된다. 함수형 프로그래밍의 특징을 그대로 계승하므로 병렬 최적화를 높은 수준으로 수행할 수 있다.

Flink의 데이터 단위는 DataSet 이며, DataSet을 연산할 수 있는 Operator가 존재한다. 프로그램은 DataSet에 다양한 Operator를 적용해 데이터를 처리하는 형태로 구성된다.

![Concept of Apache Flink Dataflow](/assets/introduction-to-apache-flink-01.png)
image:/assets/introduction-to-apache-flink-01.png[Concept of Apache Flink Dataflow]

또한, Map, Reduce 이외에도 Join, CoGroup, Union, Iterate, **Delta Iterate**, Filter, FlatMap, GroupReduce, Project, Aggregate, Distinct, Accumulation 등 다양한 연산을 지원하여 MapReduce 프레임워크 보다 훨씬 쉽게 알고리즘을 구현할 수 있다.

아래의 소스 코드는 Hadoop 관련 예제에 많이 등장하는 WordCount 예제다. MapReduce 보다 훨씬 간결하게 코드를 작성할 수 있다.[^3]
아래의 소스 코드는 Hadoop 관련 예제에 많이 등장하는 WordCount 예제다. MapReduce 보다 훨씬 간결하게 코드를 작성할 수 있다.

```java
[source,java]
----
DataSet<String> input = env.readTextFile(inputPath);
DataSet<Tuple2<String, Long>> words = input.flatMap((value, out) -> {
@@ -29,15 +28,10 @@ DataSet<Tuple2<String, Long>> words = input.flatMap((value, out) -> {
});
words.groupBy(0).sum(1).writeAsText(outputPath);
```
----

Apache Flink는 Delta Iterate라는 특이한 연산을 지원하는데, 간단히 소개하자면 한번 반복이 진행 된 후 다음에 계산할 필요가 있는 후보들만 계속해서 반복함으로써 반복의 수를 줄여 수행 시간을 단축하는 데 도움을 준다. Delta Iterate 연산은 특히 그래프 내에서 Propagation 등을 수행하는 경우 유용하다.

Hadoop과의 호환성도 좋아서 Hadoop에서 사용하던 InputFormat, OutputFormat, Map Function, Reduce Function 등도 그대로 사용할 수 있고 YARN 클러스터 위에서 작동 할 수도 있다.

[https://github.com/chiwanpark/flink-example](https://github.com/chiwanpark/flink-example)에 Apache Flink를 사용한 예제 구현을 만들어봤다. 100줄도 안되는 코드로 분산 클러스터에서 작동하는 PageRank 알고리즘을 구현할 수 있었다.

[^1]: MapReduce 기반의 알고리즘들이 복잡해지는 주요 원인이 된다.
[^2]: 물론 InputFormat, OutputFormat을 직접 만들어 메모리에 저장하거나 할 수도 있긴 하다.
[^3]: 데이터 처리를 위한 스크립트 언어를 제공하는 [Apache Pig](http://pig.apache.org)나 SQL과 비슷한 구문으로 데이터 처리를 수행하도록 도와주는 [Apache Hive](http://hive.apache.org) 등이 대표적인 예다.
[^4]: [Apache Spark](http://spark.apache.org), [Apache Tez](http://tez.apache.org) 등이 대표적인 예다.
link:https://github.com/chiwanpark/flink-example[Github]에 Apache Flink를 사용한 예제 구현을 만들어 코드를 올려봤다. 100줄도 안되는 코드로 분산 클러스터에서 작동하는 PageRank 알고리즘을 구현할 수 있었다.
@@ -1,9 +1,7 @@
---
type: article
title: Lessons learned in recent 3 months
date: Sep 29, 2013
summary: 최근 3개월간 참여했던 프로젝트에서 답답하다고 느낀 점
---
= Lessons learned in recent 3 months
:page-layout: article
:page-date: 2013-09-29 00:00:00 +0900
:page-summary: 최근 3개월간 참여했던 프로젝트에서 답답하다고 느낀 점

지난 글 이후로, 계속 글을 써야지 하고 생각만 하고 쓰지는 않고 있었는데 벌써 그로부터 몇 개월이 흘렀다. SW Maestro 과정은 끝이 났고 운이 좋게도, 또 주변 사람들이 잘 봐주시는 덕분에 과정이 끝남과 동시에 새로운 일들이 들어왔다. 하나는 새로 시작하는 스타트업, 하나는 멘토님으로부터 받는 아르바이트, 그리고 나머지는 학교 프로젝트들이다. 그렇게 벌써 석 달이 흘렀는데 아래 내용은 석 달 동안 배운 것들 중에서 블로그에 쓸 수 있는 일부만 적어본 것이다.

@@ -19,7 +17,7 @@ Dirty Code는 일단 대충 구현해 놓고, 나중에 Clean Code로 바꾸겠

그러니까 Dirty 하게 코드 짜지 말자. 될 수 있으면, Clean Code 짜도록 노력하자. Clean Code와 잘 작성된 테스트 케이스는 결국 개발 속도를 빠르게 한다.

아마 [이 글](http://youngrok.com/QuickAndDirty)이 꽤 도움이 될 것이다. 나와 완벽히 같은 의견은 아니지만, 참고할 만한 부분이 많다. 이 글의 몇몇 표현은 저 글에서 가져왔다.
아마 link:http://youngrok.com/QuickAndDirty[이 글]이 꽤 도움이 될 것이다. 나와 완벽히 같은 의견은 아니지만, 참고할 만한 부분이 많다. 이 글의 몇몇 표현은 저 글에서 가져왔다.

## Responsibility is important

@@ -0,0 +1,32 @@
= Office 365 Custom Install
:page-layout: article
:page-date: 2015-05-02 00:00:00 +0900
:page-summary: Office 365 설치할 때 필요한 컴포넌트만 설치하기

예전에는 학교에서 나눠주는 Office를 외부 컴퓨터에 설치하는 것이 금지되어 있어서 꼭 학교 IP로 인증을 받아야 했다. 얼마 전부터는 학교에서 Office 365를 제공해주면서 외부에서도 사용할 수 있게 되었다. 그런데 학교에서 배포한 Office 365에는 Word, Powerpoint, Excel 말고도 Lync, Outlook, Publisher, Access 등 안 쓰는 프로그램이 잔뜩 설치되는 또 다른 문제가 있었다. 설치 프로그램을 실행하자마자, 다짜고짜 설치를 진행하는데 불필요한 프로그램을 제외할 수도 없어 난감했다. 어찌어찌해서 선택 설치에 성공했고 선택 설치를 하기 위해서, 해야 하는 몇 가지 작업을 잘 기억해두기 위해 블로그에 적어둔다.

먼저 아래의 코드를 다운 받아 xml 확장자 파일로 저장하자. 이 파일을 적용하면, 64-bit 버전으로 Word, Powerpoint, Excel 이외의 프로그램은 설치되지 않는다. 여기서는 `setup.xml` 이라는 이름으로 저장했다고 가정한다.

[source,xml]
----
<Configuration>
<Add OfficeClientEdition="64">
<Product ID="O365ProPlusRetail">
<Language ID="ko-kr"/>
<ExcludeApp ID="Access"/>
<ExcludeApp ID="InfoPath"/>
<ExcludeApp ID="Groove"/>
<ExcludeApp ID="Lync"/>
<ExcludeApp ID="OneNote"/>
<ExcludeApp ID="Outlook"/>
<ExcludeApp ID="Project"/>
<ExcludeApp ID="Publisher"/>
<ExcludeApp ID="SharePointDesigner"/>
<ExcludeApp ID="Visio"/>
</Product>
</Add>
</Configuration>
----

그다음, 배포 관련 툴을 link:https://www.microsoft.com/en-us/download/details.aspx?id=49117[공식 홈페이지]에서 다운 받는다. 다운 받은 프로그램을 실행하면 압축이 풀리면서 `setup.exe` , `configuration.xml` 이 생성된다.
이후 명령 프롬프트에서 `setup.exe /configure setup.xml` 명령을 실행하면 설치가 진행된다.
Oops, something went wrong.

0 comments on commit 714a42f

Please sign in to comment.