VBScript : Levenshtein Distance

Levenshtein Distance은 두 문자열의 유사도를 구할 때 사용할 수 있는 알고리듬이다. 이 알고리듬은 첫번째 문자열을 두번째 문자열로 변환하기 위해서 필요한 작업수를 구한다.

예로 GeorgeGeordie 두 문자열을 생각해 보자. George를 Geordie로 바꾸기 위해서는 다음과 같이 2개의 문자 변환 작업이 필요하다.

  1. George -> Geordie (‘g’를 ‘d’로 치환)
  2. Georde -> Geordie (‘d’와 ‘e’ 사이에 ‘i’ 추가)

이미지 출처 : http://www.codeproject.com/Articles/162790/Fuzzy-String-Matching-with-Edit-Distance

다음은 VBScript로 이를 구현한 소스이다.

Function LevenshteinDistance(string1, string2)
    Dim i, j, len1, len2, distance(), result

    len1 = Len(string1) : len2 = Len(string2)
    ReDim distance(len1, len2)
    For i = 0 To len1 : distance(i, 0) = i : Next
    For j = 0 To len2 : distance(0, j) = j : Next

    For i = 1 To len1
        For j = 1 To len2
            If Asc(Mid(string1, i, 1)) = Asc(Mid(string2, j, 1)) Then
                distance(i, j) = distance(i - 1, j - 1)
            Else
                distance(i, j) = Min3(distance(i - 1, j) + 1, distance(i, j - 1) + 1, distance(i - 1, j - 1) + 1)
            End If
        Next
    Next

    LevenshteinDistance = distance(len1, len2)
End Function

Function Min3(a, b, c)
    Dim result

    result = a
    if (b < result) then result = b
    if (c < result) then result = c

    Min3 = result
End Function

Laravel 4 설치

install-laravel.sh 란 이름으로 다음의 파일을 작성해서 사용하면 아직 정식 릴리즈가 되지않은 상황에서 편하게 설치할 수 있다.

#!/bin/sh

git clone https://github.com/laravel/laravel.git $1
cd $1

# Required for getting L4 dev
git reset --hard HEAD
git checkout develop
git remote rename origin upstream

# Do the house cleaning
chmod -R 0777 app/storage
curl -s https://getcomposer.org/installer | php
php composer.phar install
php artisan key:generate

참고
– http://niallobrien.me/category/laravel/
– https://coderwall.com/p/spwlea
http://forums.laravel.io/viewtopic.php?id=7310

워드프레스 포스트 수정일 표시하기

워드프레스에서 제공하는 Twenty Eleven 템플릿에는 포스트 수정일이 표시가 되지 않는다. 수정일은 get_the_modified_date() API를 이용해서 구할 수 있고, Twenty Eleven 템플릿에서 등록일 표시는 /wp/wp-content/themes/twentyeleven/functions.php 파일의 twentyeleven_posted_on() 함수에서 담당하고 있다.

twentyeleven_posted_on() 함수를 다음과 같이 수정하면 수정일이 작성일 뒤에 표시가 된다. 작성일과 등록일이 같은 날이면 표시를 하지 않는다.

function twentyeleven_posted_on() {
    $u_time = get_the_date();
    $u_modified_time = get_the_modified_date();

    /* 작성일과 수정일을 비교한다. 같은 날이면 수정일은 표시하지 않는다 */
    if ($u_modified_time != $u_time) {
        printf( __( '<span class="sep">Posted on </span><a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s" pubdate>%4$s</time></a> and last modified on <a href="%1$s" title="%5$s" rel="bookmark"><time class="entry-date" datetime="%6$s" moddate>%7$s</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="%8$s" title="%9$s" rel="author">%10$s</a></span></span>', 'twentyeleven' ),
            esc_url( get_permalink() ),
            esc_attr( get_the_time() ),
            esc_attr( get_the_date( 'c' ) ),
            esc_html( get_the_date() ),
            esc_attr( get_the_modified_time() ),
            esc_attr( get_the_modified_date( 'c' ) ),
            esc_html( get_the_modified_date() ),
            esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
            esc_attr( sprintf( __( 'View all posts by %s', 'twentyeleven' ), get_the_author() ) ),
            get_the_author()
        );
    } else {
        printf( __( '<span class="sep">Posted on </span><a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s" pubdate>%4$s</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="%5$s" title="%6$s" rel="author">%7$s</a></span></span>', 'twentyeleven' ),
            esc_url( get_permalink() ),
            esc_attr( get_the_time() ),
            esc_attr( get_the_date( 'c' ) ),
            esc_html( get_the_date() ),
            esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
            esc_attr( sprintf( __( 'View all posts by %s', 'twentyeleven' ), get_the_author() ) ),
            get_the_author()
        );
    }
}