콘텐츠로 건너뛰기
Home » 21세기소년 » Page 9

21세기소년

21세기소년 / IT / 정보기술 / 인터넷 / 프로그래밍 / 미래 / 과학 / 과학지식 / 물리 / 화학 / 천문 / 생물학 / 이과생이나 관심가질 법한 자질구레한 이야기들

protocol and operator

프로토콜과 연산자 Equatable과 같은 프로토콜은 메소드가 아닌 연산자에 의한 연산을 정의한다. 보통 프로토콜은 특정 타입이 구현해야 하는 메소드나 프로퍼티를 정의하는 것인데, 연산자에 의한 연산은 어떻게 정의할 수 있을까? 답 연산자는 특별한 종류의 함수이다. 연산자는 연산자의 이름이 될 수 있는 특별한 패턴이 있으므로 프로토콜 내에서 정의되었을 때 연산자로 인지하게 된다. 수정 (2016-10-04) : 프로토콜이 특정 연산자의 기능을 선언하거나 오버로드하는 경우, 이를 구현하는 타입의 정의 내에서 일반 메소드와 마찬가지로 연산자 오버로딩을 작성할 수 있다. infix operator ~~= { associativity left } protocol… 더 보기 »protocol and operator

연습문제(벽과 폭탄)

벽과 폭탄

각 테스트 케이스마다 ‘W’, ‘B’로 이루어진 문자열이 입력된다. B는 폭탄을, W는 벽을 의미하는데, 폭탄이 하나 터지면 폭탄을 중심으로 반경 2칸 이내의 벽이 모두 폭파된다. 이 때 폭탄이 일시에 터졌을 때 폭파되는 벽의 개수를 출력하라. (https://www.hackerearth.com/problem/algorithm/bob-and-bombs-cake-walk/description/)

BWW, BW, WB, WWB에 해당하는 W의 수를 세는 문제이므로, 이는 간단하게 정규식으로 해결할 수 있다.
더 보기 »연습문제(벽과 폭탄)

(연재) m.render – 가상 DOM 렌더링하기 – Mithril

m.render vs m.mount 미스릴은 virtual dom node를 생성하고, 이 가상 노드를 문서내의 특정 요소에 렌더링하거나 마운트한다. 가상 노드를 생성하는 컴포넌트를 작성하고, 해당 컴포넌트의 내용을 화면에 표시하기 위해서는 이미 존재하는 HTML 문서 내의 특정 DOM의 내부를 가상 노드로 채워주게 된다. 이 때 사용하는 함수로 m.render() 와 m.mount()가 있다. m.render()는 1회성으로 가상 노드를 렌더링하며, m.mount()는 특정 DOM에 가상 노드 컴포넌트를 마운트하는데, mithril은 마운트된 DOM 내에서 발생하는 이벤트를 체크하여 내부적으로 m.render()를 다시 호출해서 이벤트에 의해서 변경된 데이터가 UI에 반영될 수 있도록 자동으로 다시… 더 보기 »(연재) m.render – 가상 DOM 렌더링하기 – Mithril

(Javascript | mithril ) m.component – 앱을 컴포넌트화하기

본격 mithril 탐구. 가독성을 위해서 본 문서에서는 LiveScript로 예제를 작성합니다.

mithril 관련 글

  1. mithril 앱의 기본 구성 및 m()
  2. m.render – 가상 DOM 렌더링하기
  3. m.mountmithril을 이용한 양방향 바인딩 & 템플릿 렌더링
  4. m.prop 양방향 바인딩을 위한 데이터 래퍼
  5. m.withAttr 양방향 바인딩을 위한 이벤트 매퍼
  6. * m.componentmithril 앱을 컴포넌트화하기
  7. Todo
  8. m.route – 단일페이지 애플리케이션 및 라우팅 규칙
  9. m.request – 서버 API와 통신하기

m.componentcontroller + view로 이루어진 컴포넌트를 다른 컴포넌트 내에 임베드할 수 있게 하는 기능이다. 페이지마다 반복되거나, 페이지 내에서 반복되는 요소에 대해서 컴포넌트를 작성하여 재사용한다.
컴포넌트는 그 자체로 하나의 인스턴스가 아니라 컴포넌트를 사용할 때 그 사본이 생성되므로, 각각의 컴포넌트 인스턴스 간의 컨트롤러는 이벤트나 데이터가 간섭을 일으키지 않는다.
더 보기 »(Javascript | mithril ) m.component – 앱을 컴포넌트화하기

jquery 기본

좀 뒤늦게 jquery 기본 사용법(?)에 대해서 정리. 처음에는 JS문법으로 예제를 썼지만, 뒤로 갈 수록 LS문법을 씁니다.(괄호라든지 괄호라든지 괄호때문에…) jQuery Object jQuery 객체는 DOM 요소(단일요소 혹은 집합)에 대해 $()를 이용하여 생성한 객체를 의미한다. 이는 내부적으로 DOM 요소를 참조하면서 jQuery에 의해 제공되는 공통 API를 적용받게 된다. 속성들 .attr() 메소드는 getter/setter로 동작하며, 해당 DOM요소의 속성을 얻거나 변경할 수 있다. $('a').attr('href', 'allMyHrefsAreTheSameNow.html'); $('a').attr({ title: 'all titles are the same too!', href: 'somethingnew.html' }); $('a').attr('href'); //=> 첫 A 요소의 'href' 값을 리턴한다. 요소 선택 요소… 더 보기 »jquery 기본

Javacript – constructor

constructor Object.prototype.constructor constructor는 특정 객체 인스턴스를 생성한 함수 객체를 리턴한다. 나역시 prototype이니, constructor니 하는 것이 보이는 것이 그리 탐탁치는 않지만, 객체 인스턴스를 대량으로 생성해야 하는 상황이라면 이에 대한 기본 지식을 조금 알고 있는 것이 여러 모로 도움이 될 수 있다. var o = {}; o.constructor === Object; // true var a = []; a.constructor === Array; // true var n = new Number(3); n.constructor === Number; // true 컨스트럭터와 프로토타입 다음은 매우 평이한 컨스트럭터 예제이다. 객체가 새롭게 호출되면, 객체는 name이라는… 더 보기 »Javacript – constructor

편집거리 (단어의 유사도 분석)

편집거리 구하기

편집거리(edit distance)는 단어의 유사도를 측정하는 방법 중 하나이다. 한 단어에서 글자를 추가/제거/교체하여 다른 단어로 바꿀 때 필요한 최소한의 편집 액션의 횟수로 결정한다.  computer라는 단어와 commuter라는 단어는 매우 유사한데, p -> m으로 한글자만 변경하면 처음 단어에서 두 번째 단어로 바뀌게 된다. 비슷하게 sport라는 단어는 sort라는 단어로 바꾸기 위해서는 p 한글자를 지우면 된다. 혹은 sort에서 p한 글자를 추가하면 된다.

단어의 유사도를 측정하는 방법에는 편집 거리외에도 자카드 유사도 등의 여러 방법이 있다.

편집거리는 두 문자열 s1, s2에서 몇 번의 추가/삭제/변경으로 변환할 수 있는가를 나타내는 개념이다. 이러한 변경에는

  1. 글자를 교환하기
  2. 글자를 삽입하기
  3. 글자를 삭제하기

의 세 종류의 변경 연산을 할 수 있다. 이를 이용해서 두 단어 사이의 편집거리를 구하는 재귀 함수를 생각해보자.

d('', '') = 0 -- 빈 문자열은 0번
d(s, '') = d('', s) = |s| -- 빈문자열로 변경하는데는 s의 길이만큼의 삭제필요
d(s1+ch1, s2+ch2)
 = min( d(s1, s2) + if ch1 = ch2 then 0 else 1, -- 교환
        d(s1+ch1, s2) + 1, -- 삽입
        d(s2, s2+ch2) + 1  -- 삭제
      )

먼저 빈 문자열 두 개 사이의 편집거리는 0이다. 그리고 한글자로 된 문자열과 빈 문자열 간의 편집거리는 당연히 1이다. 그렇다면 빈 문자열과 길이가 n인 문자열의 편집 거리는 n이 된다.
이제 길이가 0이 아닌 두 문자열의 편집거리를 보자. 두 단어 springprint를 예로 들어보겠다.

  1. 변경: sprin + gprin + t로 볼 때 sprin -> prin으로 변경한 후 g -> t로 바꾸는 변경을 1회 수행한다. 이 때 편집거리는 d(sprin, print) + 1이 될 수 있다. 만약 마지막 글자가 동일하다면 1이 아닌 0을 더한다.
  2. 추가: 혹은 springprint + t로 본다면 spring -> prin으로 변경한 후 t를 추가하는 것이므로 편집거리에 1을 더한 d(spring, prin) + 1이 될 수도 있다.
  3. 삭제: 반대로 sprin + gprint로 본다면 sprin -> print로 변경한 후 g를 삭제하는 것이므로 d(sprin, print) + 1이 될 수 있다.

결국 두 단어의 최소 편집 거리는 변경, 추가, 삭제에 의한 결과 중에서 최소값을 사용한다. 그리고 이는 점점 작은 단위로 내려가서 비교하게 되기에 동적계획법으로 풀어낼 수 있다. 이 단계를 추적해보자.더 보기 »편집거리 (단어의 유사도 분석)

how lazy evaluation works in haskell

Lazy evaluation이 동작하는 방식 게으른 평가(lazy evaluation)는 하스켈 프로그램이 실행될 때 광범위하게 사용된다. 게으른 평가의 적용은 코드를 보다 단순하게 만들어줄 수 있지만, 초보자에게는 종종 메모리 사용과 관련된 함정이 되기도 한다. 예를 들어 foldl (+) 0 [1..10^8] 이라는 간단한 표현식은 계산에 있어 수기가바이트의 메모리를 요구한다. 게으른 평가는 일종의 트레이드 오프이다. 이는 코드를 단순하게 만들어주지만 그것이 튺정한 프로그램에서 실제로 어떻게 평가하는지 완전히 이해할 수는 없게 된다. (케바케라서…) 그래프 축약 하스켈 프로그램은 표현식을 평가하는 것으로 실행된다. 다음 함수를 예로 들어보자. square x =… 더 보기 »how lazy evaluation works in haskell