Categories
Blog Development

PC에서 카카오톡 공유기능 지원 – korea SNS Pro

screenshot 5

Korea SNS Pro v1.1부터 카카오톡 공유 기능을 스마트폰 뿐만 아니라 PC, 매킨토시 에서도 사용할 수 있습니다.

 

아래와 같이 PC 웹브라우저에서도 카카오톡 버튼을 클릭할 수 있습니다.

screenshot 3

 

카카오톡 버튼을 클릭하면 로그인 과정을 거쳐

스마트폰에서와 같이 공유할 친구를 선택하는 창이 나타납니다.

메시지를 보낼 친구를 선택한 후 하단의 “~공유하기”를 클릭 합니다.

screenshot

공유 성공 메시지가 나왔습니다.

screenshot 2

카카오톡 채팅방에서 정상적으로 메시지가 발송되었음을 확인할 수 있습니다.

screenshot 4

 

 

http://blog.icansoft.com/product/korea-sns-pro/

 

Categories
Blog Development

Korea SNS 카카오톡 서비스 종료 안내

screenshot 2

2018년 6월부터 korea SNS의 카카오톡 공유 기능이 작동되지 않았습니다.

확인결과 카카오 측 구버전 API 차단으로 인해

이로인해 Korea SNS의 카카오톡 공유 기능이 작동되지 않음을 확인하였습니다.

카카오스토리 공유기능은 문제없이 작동되고 있습니다.

이에 긴급 업데이트(v1.5.7)를 통해 카카오톡 버튼을 제거하였습니다.

 

Korea SNS Pro

Korea SNS Pro 에는 최신 API가 적용되어있어 카카오톡 버튼이 정상작동합니다.

그리고, 모바일 뿐만아니라 데스크탑PC에서도 카카오톡 공유기능을 사용할 수 있습니다.

Korea SNS Pro 구입한 분들에게는 1년간 무상 업그레이드를 지원하고 있습니다.

http://blog.icansoft.com/product/korea-sns-pro/

Categories
Development Wordpress

Korea SNS를 위젯에 추가하는 방법

Image8

Korea SNS는 기본적으로 포스트나 페이지 또는 요약글 위아래에 배치된다.

글 주변이 아닌 헤더 상단이나 맨 하단 등에 위치하려면 PHP 소스코드를 수정해야 하는데 개발자가 아닌 경우 어려움이 많다.

위젯에 쇼트코드를 사용하여 Korea SNS 버튼을 추가하는 방법을 정리하였다.

설명에 사용된 테마는 기본 포함 테마인 Twenty Sixteen 이다. 다른 테마도 위젯이 있는 경우 응용할 수 있다.

스크린샷 2016-05-09 오전 10.02.31

우측 사이드바 최상단에 공유 버튼을 추가해 보려고 한다.

 

위젯에 쇼트코드 허용하기

아래는 위젯 설정 화면이다. 데쉬보드->외모->위젯에 위치해 있다.

스크린샷 2016-05-09 오전 10.00.16

“텍스트” 아이템을 사이드바 그룹 “검색” 바로 위로 드래그앤 드롭 해보자.

컨텐트 항목에 아래 처럼 쇼트코드를 추가하고 저장하기를 누른다.

스크린샷 2016-05-09 오전 10.03.11

브라우저에서 확인해보면 버튼이 보이지 않고 텍스트가 그대로 노출된 것을 볼 수 있다.

위젯에 기본으로 쇼트코드가 허용되어있지 않기 때문이다.

스크린샷 2016-05-09 오전 10.38.06

위젯에 쇼트코드를 허용하려면 테마의 function.php 파일을 조금 수정해야한다.

보통 function 파일의 경로는 아래와 같다.

/wp-content/themes/테마폴더/function.php

function.php 맨 하단에 아래 코드를 추가하자.

add_filter('widget_text', 'do_shortcode');

스크린샷 2016-05-09 오전 10.16.55

다시 브라우저에서 사이트를 확인해보면 버튼이 나타날 것이다.

스크린샷 2016-05-09 오전 10.18.40

추가된 버튼을 눌러보면 현재 포스트 주소를 공유하는 것을 확인할 수 있다.

스크린샷 2016-05-09 오전 10.18.50

 

특정 URL 지정하기

위젯에 추가된 쇼트코드는 강제로 삽입하는 방식이라 일부 상황에서 문제가 있다.

Korea SNS 버튼이 특정 포스트나 페이지에서 보여질 때 해당 URL을 가리키고 있지만,

검색 결과나 카테고리 목록 등 여러 글이 표시될 경우 마지막 글을 가리킨다.

현재 글이 아닌 사이트 자체를 공유하고 싶은 경우에는 쇼트코드 확장 기능이 포함된 Korea SNS Pro로 가능하다.

스크린샷 2016-05-09 오전 10.24.29

스크린샷 2016-05-09 오전 10.24.20

 

Korea SNS Pro로 업그레이드 하기

http://blog.icansoft.com/product/korea-sns-pro/

Categories
Blog Development MAC Story Wordpress

맥에서 페러렐즈 우분투를 이용한 개발환경 구축하기

리눅스를 기반으로 하는 개발 프로젝트에서는 일반적으로 테스트 서버를 따로두어 릴리즈를 준비한다.

단순히 APM이나 기본 리눅스 환경이 필요하다면 테스트 서버 하나만으로도 충분할 것이다.

그런데, 리눅스의 튜닝 테스트가 필요하다면 리눅스 설치 무한 반복이라는 복병이 기다리고 있다.

튜닝 과정에서 시험삼아 프레임워크를  설치하거나 버전업한 후 다시 다운그레이드를 하다보면 OS 상태가 이상하게 꼬이기도 한다. 결국 테스트 서버를 다시 구축하는 상황까지 이르게 된다.

OSX 터미널로 리눅스와 유사한 환경을 만들 수 있으나, 완전히 동일하지는 못하다. (참고 : OSX 웹개발 환경 준비하기)

페러렐즈를 통해 우분투를 설치하여 부담없는 개발 환경을 구축하는 과정을 정리해 보았다.

 

페러렐즈에서 우분투 설치하기

페러렐즈 실행 후 파일->새로만들기를 하면 아래와 같은 화면이 나온다.

무료 시스템 3번째 항목에 “Ubuntu 다운로드”를 클릭해보자.

스크린샷 2016-04-09 오전 11.45.16

우분투 설치파일을 다운로드한다. 용량이 2.3G가량된다.

위 메뉴의 우분투는 데스크탑 버전이다. 서버 버전이 필요하다면 우분투 사이트에서 다운로드 받아 이미지로 설치하면 되겠다.

스크린샷 2016-04-09 오전 11.45.32

설치까지 단번에 완료된다.

최초 로그인 과정에서 parallels 계정이 주어지고 암호를 설정할 수 있다.

스크린샷 2016-04-09 오후 12.03.36

최초 로그인하면 페러렐즈 툴이 자동실행된다. 관리자권한이 필요하여 비밀번호를 요구하는 창이 뜬다. 방금 설정한 암호를 넣어주자.

스크린샷 2016-04-09 오후 12.04.06

페러렐즈 툴 설치 후 재부팅을 요구한다. 재부팅까지 완료하고 재로그인하여 바탕화면까지 나왔다.

스크린샷 2016-04-09 오후 12.05.47

 

고정 아이피 설정하기

현재 상태로를 단순히 가상 OS로서의 우분투이다. 테스트 서버 처럼 외부에서 접속하여 뭔가를 하지 못한다. 물론 우분투 콘솔이 편한 유저라면 그대로 가상 OS 화면에서 바로 개발하면 된다.

맥 환경에서 개발을 하려면 SSH, FTP, Apache, … 등 여러가지 서버를 설치하고 외부접속 환경을 만들어 줘야한다.

페러렐즈 가상OS 기본 설정에서는 “네트워크 공유”로 되어있다.

다시말해 인터넷공유기 처럼 가상+유동 IP를 이용하여 OS별로 네트워크로 연결되어있다.

테스트 서버라면 최소한 고정IP여야 한다. 매번 아이피를 확인하는 것은 매우 번거로울 것이다.

우분투 화면 좌측 System Settings를 클릭한 후 Network 아이콘을 누르면 아래와 같은 화면이 나온다.

스크린샷 2016-04-09 오후 12.06.04

IPv4 Address 항목을 보면 10.211.55.6 이라고 되어있다.

DHCP를 통해 자동으로 부여받은 아이피이므로 다음 부팅 때 다른 아이피가 부여될 수도 있다.

Options를 누르고 IPv4 Settings 탭을 눌러보자.

스크린샷 2016-04-09 오후 12.06.16

Method 항목 Automatic 을 Manual 로 변경한 후 Addresses 우측의 Add를 누르자.

한줄이 생기고 입력할 수 있는 상태가 된다.

아래처럼 Address, Netmask, Gateway, DNS를 설정해 주자.

스크린샷 2016-04-09 오후 12.11.19

필자는 아이피 끝 번호를 100으로 설정하였다.

물론 이론상으로 가상OS 를 99개 띄우면 충돌날 수도 있다. CPU 코어가 그렇게 많다면 가능하겠다. 이 또한 눈에거슬린다면 페러렐즈 상의 모든 가상 OS를 고정 아이피로 설정하면 된다.

 

외부 접속 환경 만들기

아이피 설정까지 마쳤지만 외부에서 접속가능한 상태는 아니다.

터미널 접속이 가능하려면 ssh를 설치해야한다.

웹 개발을 한다면 FTP, APM 등을 설치해야할 것이다.

그 전에 설치모듈 업그레이드가 필요하다. ssh든 뭐든 설치파일이 필요하다. 우분투에서는 apt-get  이라는 유틸리티로 설치 및 의존성 관리를 한다.

먼저 우분투 좌측 메뉴 첫번째 로고를 클릭하고  검색창에 Terminal 이라고 입력하자. t만 입력해도 terminal 아이콘이 보일 것이다. 클릭해서 실행하자.

스크린샷 2016-04-09 오후 12.17.14

아래 명령을 입력하고 엔터키를 누르자.

$ sudo apt-get upgrade

설치모듈이 저장된 서버( 기본값 ubuntu.com)에서 최신 설치모듈을 다운로드받고, 현재 설치된 프로그램들을 업그레이드한다. 보안상 업그레이드에 신경써야하나 내 PC안에 가상OS이니 필요할 때만 하자.

openssh 를 설치하자.

$ sudo apt-get install openssh-server

설치가 완료되었다면 맥의 터미널을 실행하여 접속을 시도해보자.

$ ssh parallels@10.211.55.100

접속에 성공했다면 아래와 같은 화면이 나왔을 것이다.

스크린샷 2016-04-10 오전 12.45.36

나머지 개발 환경은 프로젝트에 맞게 준비하면 되겠다.

주로 사용하는 설치 명령어들을 정리하였다.

# FTP

$ sudo apt-get install vsftpd

# 아파치 웹서버

$ sudo apt-get install -y apache2

# PHP

$ sudo apt-get install -y php5 php5-gd php5-mysql

# MySQL

$ sudo apt-get install -y mysql-server mysql-client

# PHP My Admin

sudo apt-get install -y phpmyadmin

 

우분투 기본 설치 관련 명령어 모음을 참고

http://blog.naver.com/kimsreal/220504976380

 

가상 OS 백업하기

우분투 내에서 백업툴을 구동할 수도 있으나 가상 OS특성상 가상본 파일을 그대로 백업하면 끝!

어느정도 기본 설치가 끝났다고 생각되면 가상OS파일을 따로 복사해두자.

페러렐즈 가상OS파일은 기본으로 아래 경로에 생성된다.

계정폴더/도큐먼트/Parallels

 

Categories
Blog Development

Korea SNS – 카카오링크 아이콘 바꾸기

스크린샷 2015-06-22 오전 10.57.05

 

Korea SNS 플러그인을 통해 카카오톡으로 포스트를 보내면 아래 이미지처럼 APP 라고 적힌 부분이 보인다. 이것은 실행할 앱의 아이콘인데 따로 설정하지 않으면 기본 아이콘이 노출된다.

스크린샷 2015-06-22 오전 10.47.07

 

아이콘 바꾸기

아이콘은 카카오톡 개발자 사이트에 아이콘 이미지를 업로드하여 바꿀 수 있다.

아래 링크를 통해 개발자 사이트의 앱 목록으로 이동하자.

https://developers.kakao.com/apps

로그인 안되었다면 로그인 후 아래처럼 등록한 앱 목록이 보인다.

스크린샷 2015-06-22 오전 10.27.01

아이콘을 바꾸고자하는 앱을 선택하면 앱 개요 화면이 나온다.

 

 

 

스크린샷 2015-06-22 오전 10.27.17

앱 정보 항목 우측에 “설정”을 클릭하자.

스크린샷 2015-06-22 오전 10.27.43

앱 아이콘에 “Edit”라고 나오면 된다. 이것을 클릭하면 이미지를 업로드할 수 있다.

스크린샷 2015-06-22 오전 10.57.54

 

png, jpg, gif, ico 등을 선택할 수 있다.

업로드가 제대로 되었다면 아래와 같이 앱 아이콘이 바뀐 것을 볼 수 있다.

 

스크린샷 2015-06-22 오전 10.29.04

이제 사이트에서 포스트를 공유해보자.

App 아이콘 대신 내가 올린 아이콘을 볼 수 있다.

스크린샷 2015-06-22 오전 10.47.38

Categories
Development Wordpress

카카오톡 웹 공유를 위한 API 키 발급 받기

스크린샷 2014-12-23 오후 5.27.29

카카오톡 오픈 API 정책으로 2014년 12월부터 구 버전 API가 차단되었다.

최신 API를 사용하려면 “카카오톡 개발자 사이트(Kakao Developer)“에 API 키를 발급받아야 한다. 네이버 오픈 API와 비슷하다고 보면 되겠다.

웹용 API 키 발급 절차

1. 개발자 사이트 접속 – 로그인

2. 앱 생성

3. 도메인 등록

1. 개발자 사이트 접속 – 로그인

카카오톡 개발자 사이트(Kakao Developer)“에 접속하면 우측  상단에 로그인 버튼이 보인다.

로그인 계정은 카톡 가입할 때 사용한 이메일 주소와 비밀번호이다. 카카오톡 PC버전에 접속할 때도 사용한다.

잘 모르겠다면 스마트폰 카톡 앱 설정에서 계정을 확인하면 된다.

스크린샷 2014-12-23 오후 1.05.55

2. 앱 생성

로그인하면 “내 애플리케이션” 화면이 나타난다.

좌측에 “앱 만들기” 버튼을 누른다.

스크린샷 2014-12-23 오후 1.06.23

앱 이름을 하나 지어주자. 아무거나 적되 이왕이면 영어로 띄어쓰기 없이 적자.

스크린샷 2014-12-23 오후 1.06.33

이 포스트에서는 “test1” 이라는 앱을 만들었다.

앱을 만들면 4개의 키를 사용할 수 있다.

스크린샷 2014-12-23 오후 1.07.08

여러 키 중에 웹 페이지에서 사용할 수 있는  javascript 키가 보인다. 나중에 메뉴에서 다시 확인할 수 있다.

3. 도메인 등록

웹용 javascript 키는 도메인을 등록하고 해당 도메인 내에서만 작동이 된다.

이전 화면 하단에 “설정”을 누르면 아래 화면이 나온다.

스크린샷 2014-12-23 오후 1.07.20

하단에 “플렛폼 추가”를 누른다.

웹에서 사용할 예정이므로 “웹”을 선택하고 도메인을 적어준다.

하단 “추가”버튼을 누른다.

스크린샷 2014-12-23 오후 1.07.37

“저장되었습니다”라고 나오면 끝!

스크린샷 2014-12-23 오후 1.07.50

메인도메인을 적더라도 서브도메인 ???.mydomain.com에서 작동되지는 않는 것 같다.

사용할 서브도메인이 있다면 모두 적어주자.

네이버 처럼 *.mydomain.com 으로 모든 서브도메인을 포함하는 지는 모르겠다. 나중에 테스트해봐야겠다.

이제 javascript 키를 가지고 등록된 도메인 내에서 카톡 API를 사용할 수 있게되었다.

앱 키 당 하루 3만 건의 전송 처리만 가능하다. 그 이상은 제휴를 통해서 가능하다고 함.

Categories
Development

클라우드 서버 직접 구축하기

스크린샷 2014-08-04 오후 2.30.27

이제는 클라우드 서비스 없이 PC를 논할 수 없는 시대에 왔다. 그런데, 용량은 많은데 클라이언트 SW가 자꾸 튕기고, SW가 안정적인데 용량은 쥐꼬리만하고 속도는 왜이렇게 느린지.. 속도가 빠른데 무료 설치는 단 2대, PC간 동기화 서비스는 중단.

안정적이면서도 용량도 많고 속도도 좀 나오는 그런 클라우드 어디 없나?

그래서 직접 설치하는 방법을 찾아봤다. 이미 활약중인 여러가지 오픈소스 툴들 중에 ownCloud를 선택하였다.

스크린샷 2014-08-04 오후 3.17.14

 

순서

1. ownCloud 서버 설치하기

2. ownCloud 웹 접속

3. ownCloud 클라이언트 설치하기

4. ownCloud 모바일 앱 소개

5. ownCloud 폴더별 동기화

6. 앱 추가로 기능확장하기

7. 정리

 

1. ownCloud 서버 설치하기

http://owncloud.org 에서 다운로드 할 수 있다.

첫 화면 좌측 상단의 “Install”을 누르면 아래와 같이 설치 페이지가 나온다.

스크린샷 2014-07-30 오후 4.36.49

 

ownCloud는 클라우드 서버 + 클라우드 웹 + 클라우드 클랑이언트(PC + Mobile) 로 구성된다. 한마디로 NDrive나 Dropbox를 직접 구축하고 동기화 처리까지 할 수 있다는 것이다.

다운로드 사이트에서 첫 번째 “Install ownCloud Server” 밑에 “Archive File”을 클릭하면 아래 팝업이 나온다.

스크린샷 2014-08-04 오전 9.52.37

 

Unix(Linux), Window 모두 지원한다.

여기서는 Ubuntu 터미널에서 설치하는 과정을 설명한다.

APM (아파치, PHP, MySQL)이 설치되어있다는 가정 하에 진행한다.

 

1) 우선 필요한 라이브러리를 설치한다.

$ sudo apt-get install php5-gd php-xml-parser php5-intl smbclient curl libcurl3 php5-curl

아파치 모듈을 활성화 시키고

$ sudo a2enmod rewrite

$ sudo a2enmod headers

아파치 설정 파일(sites-default)을 열어 접근 권한을 수정한다.

$ sudo vi /etc/apache2/sites-default

<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None -> AllowOverride All
Order allow,deny
allow from all
</Directory>

sites-default 파일이 없다면 복사 후 수정한다.

$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-default

아파치 재구동
$ sudo service apache2 restart

 

* 위 설정의 경우 웹 주소가 http://도메인명/owncloud 와 같이 폴더로 접근한다.

필자의 경우 가상 호스트로 서브도메인(http://cloud.도메인명)을 설정하였는데 가상 호스트의 경우 파일명만 다르고 구성은 동일하다.

$ sudo vi /etc/apache2/sites-available/도메인명 <– 가상호스트 구성 시 만든 파일명

<VirtualHost *:80>
ServerAdmin test@domain.com
ServerName domain.com
ServerAlias domain.com
DocumentRoot /home/cloud/www

<Directory /home/cloud/www/>
Options FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

 

2) ownCloud 서버 설치

wget으로 ownCloud 서버를 다운로드 받자.

$ sudo wget http://download.owncloud.org/community/owncloud-latest.tar.bz2

압축을 해제하고

$ sudo tar -xjf owncloud-latest.tar.bz2

웹 루트로 옮긴다.

$ mv owncloud /var/www

폴더 권한 수정하기

$ sudo chown -R www-data:www-data /var/www/owncloud

 

3) DB 준비

 

mySQL에 접속하여

$ mysql -u root -p

owncloud 라는 이름의 DB를 생성한다. 다른 이름도 가능하다.

mysql> CREATE DATABASE owncloud;

owncloud 계정을 만들어 owncloud DB에 권한을 준다.

mysql> GRANT ALL ON owncloud.* TO ‘owncloud’@’localhost’ IDENTIFIED BY ‘비밀번호’;

 

2. ownCloud 웹 접속

웹 브라우저에서 설치한 웹 경로로 접속해 보자.

위 예제에서는 http://도메인명/owncloud 가 되겠다.

스크린샷 2014-07-30 오후 4.58.49

 

한글이 보인다. 다국어 처리도 꼼꼼히 되어있는 듯 하다.

우선 관리자 계정으로 사용한 ID/PW를 정한다.

데이터 폴더는 위 예제대로라면 /var/www/owncloud/data 이다.

아래 DB 설정도 채워넣은뒤 “설치 완료” 버튼을 누르자.

짜~잔. N드라이브와 비슷한? 화면이 나타났다.

스크린샷 2014-07-30 오후 4.22.23

기본으로 들어있는 예제 폴더, 파일들이 보인다. 삭제해도 무방하다.

상단 “파일”을 클릭해보자.

스크린샷 2014-08-04 오후 2.16.57

파일 : 파일목록보기

활동 : 변경사항 요약보기

문서 : 문서 파일만보기

사진 : 사진 파일만 보기 (이미지 썸네일 지원)

달력 : 자체 달력 서비스

연락처 : 자체 연락처 서비스

앱 : 서비스의 기본 기능의 옵션을 변경할 수 있다. 액티비티 사용/사용안함, 암호화 사용/사용안함 과 같은 항목이다. 앱을 추가하여 기능 확장을 할 수도 있다. 자세한 사항은 후반부에 설명하겠다.

좌측에 “Shared with others” 메뉴가 있는 것으로 보아 구축된 클라우드 서버에 여러 사용자 계정을 만들 수도 있겠다.

“Share by link”는 계정없는 유저에게 메일이나 문자로 해당 파일을 다운로드 받을 수 있는 URL을 만들어 주는 메뉴이다.

 

좌측 하단의 기어 모양의 아이콘을 눌러보자.

WebDAV 라는 것이 나온다.

스크린샷 2014-08-04 오후 1.50.52

WebDAV는 Web-based Distributed Authoring and Versioning(웹기반 분산형 저작 및 버전관리)의 약자로 쉽게말해 “웹에서 파일 관리 하기”라고 보면 되겠다.

보통 WebDAV 주소는 아래와 같다.

http://도메인명/owncloud/remote.php/webdav/

해당 주소를 웹브라우저에 넣어보면 아래와 같이 파일, 폴더 목록이 나온다.

스크린샷 2014-08-04 오후 1.52.56

그리고, OS X의 파인더에서 접속(“서버에 연결” 사용)하면 원격 폴더 처럼 접근할 수 있다.

스크린샷 2014-08-04 오후 1.53.48

 

루트폴더에 있는 pdf 파일을 열어보았다.

스크린샷 2014-07-30 오후 4.59.45

 

페이지 썸네일 표시도 잘되고, 인쇄도 해보았는데 문제가 없었다.

 

3. ownCloud 클라이언트 설치하기

이제 PC간 동기화를 해보자.

(필자는 OS X 10.9.4 (메버릭스)의 아이맥과 맥북으로 동기화 테스트를 해보았다.)

설치 페이지( http://owncloud.org/install ) 2번째 항목 “Install Desktop Client”에서 PC의 OS에 맞는 클라이언트를 다운로드 받아 설치한다.

설치 후 첫 실행화면이다. 서버 주소를 입력하자. 주소는 “http://도메인명/owncloud” 처럼 ownCloud 루트 폴더까지 입력해야한다. 전용 또는 서브도메인인 경우 도메인만 입력하면된다.

스크린샷 2014-07-30 오후 5.01.56

ID/PW를 입력한다.

참고로 owncloud.com 에서 클라우드 서비스를 하고 있으니 서버 구축이 어려우면 해당 서비스를 받을 수도 있겠다.

스크린샷 2014-07-30 오후 5.02.22

서버와 계정에 문제가 없다면 아래처럼 동기화 폴더를 구성하는화면이 나온다.

dropbox 처럼 클라우드 데이터 전체를 PC에 동기화 시키는 방식이다.

스크린샷 2014-07-30 오후 5.02.33

 

Connect를 누르면 아래와 같이 설치 완료 화면이 나온다. Finish를 누르자.

 

스크린샷 2014-07-30 오후 4.22.09

 

상태바에 ownCloud 아이콘이 생겼다.

스크린샷 2014-08-04 오전 11.58.15

 

클릭하면 메뉴가 나온다.

스크린샷 2014-08-04 오전 11.59.04

서버 전체 용량 중 사용량이 보인다.

Recent Changes 최근 변경된 사항을 확인하는 메뉴이다. Settings->Activity 에서도 확인할 수 있다.

스크린샷 2014-07-30 오후 4.29.02

 

 

Settings를 클릭해 보자.

스크린샷 2014-08-04 오후 12.05.00

동기화 폴더 설정화면이 나온다.

최초 서버에 기본으로 탑재된 파일들이 PC로 다운로드 되었을 것이다.

동기화 폴더에 파일을 넣으면 상태바의 아이콘이 아래와 같이 바뀌면서 동기화를 시작한다.

update_icon

 

4. ownCloud 모바일 앱 소개

ownCloud 스마트폰용 앱에서도 구축된 서버에 접속할 수 있다. 현재 $0.99에 판매되고 있다.

애플 앱스토어

https://itunes.apple.com/us/app/owncloud/id543672169?ls=1&mt=8

구글 플레이 스토어

https://play.google.com/store/apps/details?id=com.owncloud.android

스크린샷 2014-08-04 오후 1.08.27

파일을 보거나 다운로드하여 보관하는 등 기능상 다른 포털 클라우드 서비스와 유사했다.

단, 음악파일을 바로 재생(스트리밍)하지 않고, 파일을 폰으로 다운로드 받은 후 재생할 수 있었다.

 

5. ownCloud 폴더별 동기화

여러 PC를 사용하는 환경에서 특히, 회사, 집, 노트북 등 다른 목적으로 PC를 사용한다면 동기화 해야할 자료가 다를 수도 있다.

필자의 경우 집에서는 회사 관련자료 + 음악파일, 회사 PC에서는 회사 관련 자료, 노트북에는 음악파일만 동기화가 필요하다.

ownCloud도 Dropbox 처럼 일부 동기화를 지원한다. 추가로 로컬 상의 Dropbox 폴더 뿐만아니라 어떤 폴더에도 연결할 수 있다.

이 것은 본인의 PC 폴더 관리 규칙을 바꾸지 않아도 됨을 뜻한다.

폴더별 동기화를 하려면 우선 기존에 전체 동기화 설정을 삭제한다.

Image2

Add Folder을 클릭한다.

Choose를 눌러 동기화 시킬 폴더를 선택하고, Continue 버튼을 클릭한다.

스크린샷 2014-08-04 오후 1.40.48

 

로컬 동기화 폴더를 선택했으면, 이제 서버 동기화 폴더를 선택할 차례이다.

서버 상의 특정 폴더 또는 우측 “Add Folder”을 눌러 새롭게 폴더를 만들어준다.

선택 후 하단의 “Add Folder”를 누른다.

스크린샷 2014-08-04 오후 1.41.00

폴더를 추가하면 바로 동기화를 시작한다.

Image1

위 이미지 처럼 여러개의 폴더를 각각 동기화 설정함으로써 PC마다 다른 동기화 설정이 가능하다.

 

6. 앱 추가로 기능 확장하기

최 상단 메뉴 하단에 “앱”이라는 메뉴가 보인다. 모바일 어플리케이션이 아닌 “응용기능”의 의미이다.

스크린샷 2014-08-04 오후 2.16.57

 

클릭하고 들어가면 아래와 같은 화면이 나온다.

스크린샷 2014-08-04 오후 2.59.52

진한 회색 부분은 현재 작동중인 앱이고, 하단에 밝은 회색의 앱 중지된 앱이다.

각 앱을 클릭하여 바로 설정을 수정할 수도 있다.

스크린샷 2014-08-04 오후 3.00.09

 

맨 아래 “더 많은 앱”을 눌러보자.

http://apps.owncloud.com 사이트가 나온다.

스크린샷 2014-08-04 오후 3.08.32

이 사이트를 통해 ownCloud의 확장 앱을 구해서 설치할 수 있다.

대충 목록을 보면, roundcube는 웹메일 프로그램이고, Files Tree는 파일 목록을 트리형태로 보여주는 앱이다.

필자는 웹 상에서 음악을 바로 재생해 주는 “music” 앱을 설치해 보았다.

다운로드 받은 앱 파일은 서버의 아래 경로에 붙여넣으면 된다.

owncloud 폴더/apps

업로드 후 최상위 메뉴를 클릭해보자.

스크린샷 2014-08-04 오후 3.13.03

전에 없던 “음악”이라는 메뉴가 생겼다. 클릭해보자.

스크린샷 2014-08-04 오후 2.55.49

일부 한글이 깨지기는 하지만 앨범과 음악들이 나온다.

음악을 클릭해보니 재생이 잘 된다. 같은 앨범 내의 음악은 이어서 재생해 준다. 전체 이어서 재생 기능은 아직 개발되지 않은 듯 하다. 아마추어의 작품이니 이정도는 눈감아 줘야한다. 필요하면 직접 만들어 쓰지뭐~^^

이런게 오픈 소스의 힘!이 아니겠는가.

 

 7. 정리

다수의 유저가 사용하는 포털 클라우드 서비스들과 ownCloud를 그대로 비교하는 것은 문제가 있다.

그러나, 서버를 어느정도 다룰 수 있는 파워유저 이상의 능력자라면 단연 ownCloud를 추천한다.

필자가 중요하게 체크한 부분은 서버/클라이언트 프로그램의 안전성과 작동의 편의성이다.

용량은 서버 스펙에 영향은 받는 요소이지만, 월 5천원만 투자해도 20G짜리 가상 서버를 마련할 수 있으니, 이 또한 저렴하다고 할 수 있다.

일부 서비스가 갑자기 중지되거나, 개인정보 유출의 우려도 걱정할 필요가 없다.

직접 cloud 서버를 구축함으로써 포털 클라우드들의 단점을 해결할 수 있다면 한 번 해볼만 하지 않은가.

Categories
Development

Dropbox를 이용한 git 저장소 동기화

dropbox_git

 

요즘 git의 도움으로 코딩 작업이 한결 수월해 졌다.

특히 별도의 압축->백업 관리의 잔업이 없어졌고

웹작업 시 coda2에서 localhost로 미리보기까지 해주어 편하게 작업하고 있다.

(coda2에서 publish 전에 http://localhost/~ID 에서 미리보기 하면서 디버깅한다.)

한가지 아쉬운 점이 있는데, 상황에 따라 데스트탑, 노트북을 번갈아가면서 작업하다 보니,

작업 PC를 바꾸기 전에 반드시! git commit  후 원격저장소에 push -> 옮겨갈 PC 에서 pull 해야만 작업을 이어갈 수 있다.

간혹 실수로 push 하지않고 작업을 하다가 다시 이전 PC에서 push하고 mergy 하는 해프닝이 발생하기도 한다.

또한 이렇게 작업을 하다보면 commit가 무수히 많아져 history를 지저분하게 한다.

Cloud 를 이용하여 PC가 git 로컬저장소를 동기화 할 수 있다면 이런 불편함이 없어지지 않을까? 하여 시도해 보았다.

 

작업 환경

OS : OS X 메버릭 10.9.4

웹서버 : 아파치 (OS X 기본제공)

 

Cloud 서비스 선택

필자는 UCloud의 빠른 속도에 반해 2년여 동안 사용하다가 최근 PC간 동기화 서비스가 중단되어 NDrive로 갈아탔다.

그러나, NDrive로 숨김폴더인 .git 폴더 파일들을 동기화 할 때 오류가 발생했다.

속도는 좀 느리지만 Dropbox는 이러한 오류가 발생하지 않았다.

Dropbox : git 저장소 동기화 가능

NDrive :  git 저장소 동기화 오류 발생

UCloud : PC간 동기화 안됨

dropbox-logo1

 

동기화 폴더 설정

Dropbox의 동기화 루트 폴더명은 반드시 “Dropbox”로 해야한다.

웹 개발 시 로컬 파일의 미리보기 시도 시 보통 “http://localhost/~ID” URL로 본다.

그런데, Dropbox 폴더 또는 그 하위 폴더를 해당 도큐먼트 루트로 설정하면 403 에러가 발생하게된다.

일반적으로 /USers/ID/Sites 폴더를 웹 루트로 사용하는데 /Users/ID/Dropbox로 변경하면 호출이 안된다.

Sites 폴더명 이외의 것을 사용하는 것이 문제인 듯 한데,

이 문제로 서치 해 본 결과 여러가지 트릭들이 있는데 그 중에서 아래 방법이 가장 간편해 보였다.

 

$ rm -r /Users/계정명/Sites <– 기존 웹 루트 폴더를 삭제한다.

$ ln -s /Users/계정명/Dropbox /Users/Sites

 

git 로컬 저장소 동기화의 문제점

PC2대에서 동시에 git 저장소 관리툴(Sourcetree)를 실행해보니 index, FETCH_HEAD 파일이 계속 수정되면서 Dropbox 동기화가 발생하였다.

아마도 .git 폴더 내에 해당 PC에 국한된 정보가 있는게 아닌가 생각된다. 그러나, 작업 시 특별한 문제는 발생하지 않았다.

단, 무한 동기화를 방지하려면 동시에 여러 PC에서 해당 git 프로젝트 작업을 하지 않는 것이 좋겠다.

 

Categories
Development

애플 Swift 메뉴얼 번역본 – A Swift Tour # 1

스크린샷 2014-07-04 오전 10.29.25

Swift 매뉴얼의 기본 섹션만 번역하고자 한다.

원문은 iBooks에서 무료로 볼 수 있다.

https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

필자는 영어 전공자가 아니므로 다소 번역이 서툴더라도 양해바랍니다.

 

 

A Swift Tour

 

Tradition suggests that the first program in a new language should print the words “Hello, world” on the screen. In Swift, this can be done in a single line:

새로운 언어의 첫번째 프로그램은 화면에 “Hello, world”를 출력하는 것이 전통이다. Swift에서는 이것을 한 라인으로 수행할 수 있다.

 

println(“Hello, world”)

 

If you have written code in C or Objective-C, this syntax looks familiar to you—in Swift, this line of code is a complete program. You don’t need to import a separate library for functionality like input/output or string handling. Code written at global scope is used as the entry point for the program, so you don’t need a main function. You also don’t need to write semicolons at the end of every statement.

C 혹은 Object-C를 이용해 본 경험이 있다면 이 문법은 익숙할 것이다. Swift에서 이 코드 라인은 완성된 프로그램이다. 별도로 입출력이나 문자열 처리와 같은 별도의 라이브러리를 참조할 필요가 없다. 전역으로 작성된 코드는 프로그램의 진입점으로 사용되기 때문에 main 함수가 필요없다. 또한 문장의 끝마다 세미콜론을 입력할 필요가 없다.

 

This tour gives you enough information to start writing code in Swift by showing you how to accomplish a variety of programming tasks. Don’t worry if you don’t understand something—everything introduced in this tour is explained in detail in the rest of this book.

이 투어는 프로그래밍 작업의 다양한 방법으로 Swift 코드 작성을 시작하는데 충분한 정보를 제공한다. 일부 이해가 되지않더라고 걱정하지 말라. 모든 내용이 이 책의 나머지 부분에 자세히 설명되어 있다.

 

NOTE

For the best experience, open this chapter as a playground in Xcode. Playgrounds allow you to edit the code listings and see the result immediately.

최고의 경험을 위해 Xcode의 놀이터로서 본 챕터를 시작한다. 놀이터에서는 코드 목록을 편집하고 바로 결과를 확인할 수 있다.

 

‌Simple Values

Use let to make a constant and var to make a variable. The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once. This means you can use constants to name a value that you determine once but use in many places.

상수를 만드는 “let”와 변수를 만드는 “var”을 사용한다. 상수 값은 컴파일 시점에 확인할 필요가 없지만 정확히 한 번에 값을 할당해야한다. 이는 한 번 선언하지만 해당 이름을 많은 곳에서 사용할 수 있다는 것을 의미한다.

 

 

var myVariable = 42

myVariable = 50

let myConstant = 42

 

 

A constant or variable must have the same type as the value you want to assign to it. However, you don’t always have to write the type explicitly. Providing a value when you create a constant or variable lets the compiler infer its type. In the example above, the compiler infers that myVariable is an integer because its initial value is a integer.’

상수와 변수는 할당할 값에 해당하는 타입이어야 한다. 그러나, 항상 유형을 명시할 필요는 없다.컴파일 단계에서 상수나 변수의 형식을 유추하여 제공한다. 위 예제에서 초기값이 정수이므로 컴파일러는 myVariable을 정수로 간주한다.

 

If the initial value doesn’t provide enough information (or if there is no initial value), specify the type by writing it after the variable, separated by a colon.

초기 값이 충분한 정보를 제공하지 못하면(또는 초기 값을 지정하지 않은 경우), 변수 뒤에 콜론으로 구분하여 명시하라.

 

 

let implicitInteger = 70

let implicitDouble = 70.0

let explicitDouble: Double = 70

 

 

EXPERIMENT

Create a constant with an explicit type of Float and a value of 4.

실수형이고 4 값을 가진 상수를 만드시오.

 

 

Values are never implicitly converted to another type. If you need to convert a value to a different type, explicitly make an instance of the desired type.

값은 암묵적으로 다른 타입으로 절대 변하지 않는다. 다른 타입으로 변환이 필요한 경우, 명시적으로 변환할 형식의 인스턴스를 만든다.

 

 

let label = “The width is “

let width = 94

let widthLabel = label + String(width)

 

 

EXPERIMENT

Try removing the conversion to String from the last line. What error do you get?

위 예제 마지막 줄에서 String 변환을 제거하여 실행하라. 어떤 에러가 발생했는가?

 

There’s an even simpler way to include values in strings: Write the value in parentheses, and write a backslash (\) before the parentheses. For example:

문자열을 연결하는 더 간단한 방법 : 괄호 안에 값을 적고 앞에 역슬레시(\)를 붙인다. 예를들면:

 

let apples = 3

let oranges = 5

let appleSummary = “I have \(apples) apples.”

let fruitSummary = “I have \(apples + oranges) pieces of fruit.”

 

 

EXPERIMENT

Use \() to include a floating-point calculation in a string and to include someone’s name in a greeting.

문자열에 실수 계산이 포함된 \()을 사용하여 인사말에 있는 사람의 이름을 포함할 수 있다.

 

Create arrays and dictionaries using brackets ([]), and access their elements by writing the index or key in brackets.

대괄호([])를 사용하여 배열과 dictionary를 만들고, 괄호 안에 인덱스나 키를 적어 요소에 접근할 수 있다.

 

 

var shoppingList = [“catfish”, “water”, “tulips”, “blue paint”]

shoppingList[1] = “bottle of water”

 

var occupations = [

“Malcolm”: “Captain”,

“Kaylee”: “Mechanic”,

]

 

occupations[“Jayne”] = “Public Relations”

 

 

To create an empty array or dictionary, use the initializer syntax.

배열이나 dictionary 를 생성을 위해 초기화 문법을 사용하라.

 

 

let emptyArray = String[]()

let emptyDictionary = Dictionary<String, Float>()

 

 

If type information can be inferred, you can write an empty array as [] and an empty dictionary as [:]—for example, when you set a new value for a variable or pass an argument to a function.

타입이 유추가능하면 [:] 처럼 빈 배열과 빈 dictionary 를 만들 수 있다. — 예를들면, 변수의 새 값을 배정하거나 함수에 인자를 전달한다.

 

shoppingList = []   // Went shopping and bought everything.

Categories
Development

애플 Swift 사용법

swift

최근 발표된 애플의 새 프로그래밍 언어 “Swift”의 시작 방법과 초급 단계의 문법을 알아보고자 한다.

아래 순서로 진행하고자 한다.

 

1. Xcode 6 설치

2. Playground 로 시작

3. Xcode 프로젝트로 시작

4. 메뉴얼 번역본 (Swift Tour 부분)

 

1. Xcode 6 설치

Swift는 Xcode 6 부터 사용할 수 있는데 현재 베타2 버전을 설치할 수 있다.

개발자 계정이 있다면 아래 링크에서 다운로드 할 수 있다.

https://developer.apple.com/devcenter/ios/index.action

스크린샷 2014-07-04 오전 10.13.19

혹시 기존 Xcode 5 가 삭제-업그레이드 되지 않을까 걱정하고 있다면,

별도 앱으로 설치되니 걱정하지 않아도 된다.

스크린샷 2014-07-04 오전 10.13.40

 

2. Playground 로 시작

Xcode6를 실행하면 기존 버전과 유사한 시작 윈도우가 나온다.

 

스크린샷 2014-07-04 오전 10.14.16

 

Get started with a playground : 놀이터? 로 시작하기. swift 연습 모드 정도로 보면 된다.

Create a new Xcode project :  기존 Xcode 프로젝트 생성과 동일함. swift 언어를 선택할 수 있는 단계가 나온다.

Check out an existing project : SVN, git 과 같은 SCM 저장소에서 프로젝트를 가져와 작업하기 위한 메뉴이다. 협업 개발에 주로 사용.

 

“Get started with a playground”를 클릭하면 프로젝트명을 입력하라고 나온다.

스크린샷 2014-07-04 오전 10.14.52

Create를 누르면 샘플 코드가 나온다,

 

스크린샷 2014-07-04 오전 10.15.05

좌측 흰 바탕이 소스코드 영역이고, 우측 회색 영역은 결과 창이다.

연습모드인 만큼 각 라인별로 결과 값을 우측에 알려준다.

생성된 프로젝트 파일은 아래와 같이 playground 확장자 명으로 생성된다.

 

 

스크린샷 2014-07-04 오전 10.15.26

 

대부분의 맥 파일들이 그렇듯이 파일처럼 처리되나 디렉토리다.

패키지 내용을 보면 3개의 파일이 나온다.

contents.xcplayground : 프로젝트 정보

result.playgrounddata : 실행 결과 정보

section-1.swift : 소스코드

스크린샷 2014-07-04 오전 10.50.36

 

 

3. Xcode 프로젝트로 시작

 

간단한 프로젝트를 위해 Command Line Tool 로 생성해 보자.

스크린샷 2014-07-04 오전 10.16.04

 

프로젝트 명을 지정하고,

Language 부분에서 Swift를 선택하자.

스크린샷 2014-07-04 오전 10.16.15

좌우 사이드 영역은 기존 Object-C 프로젝트 화면과 유사하다.

 

스크린샷 2014-07-04 오전 10.17.10

 

 

4. 메뉴얼 번역본 (Swift Tour 부분)

 

스크린샷 2014-07-04 오전 10.29.25

iBooks의 “The Swift Programming Language” 중 첫 섹션인 “Swift Tour” 부분만 번역해 보았다.

필자도 영어가 능숙지 못해 처음에는 소스코드만 눈에 들어왔고, 이를 단순히 내가 알고있는 기존 언어를 기준으로 유추해 나갔었다.

그러나, 번역을 해보니 잘못 유추한 부분이 너무 많았다. 그리고 훨씬 더 확실히 이해가 되었다.

Swift Tour 부분은 아주 기본적인 문법에 대한 설명이지만 새 언어를 시작하는데 무리가 없다.

Swift가 어느정도 활성화되면 전체 한글 번역본이나 관련 서적이 등장할 것이다.

 

포스팅이 길어져 별도의 포스트로 분리하였습니다.

애플 Swift 메뉴얼 – A Swift Tour #1

 

Categories
Development

Redmine + git 기반 통합 개발환경 구축

스크린샷 2014-06-13 오후 12.24.45

 

이전에는 워드, 엑셀, 파워포인트, 한글, 구글문서, 블로그 문서 등 난립하고 흩어진 문서들로 프로젝트를 관리하곤 했다.

프로젝트 규모가 조금씩 커질수록 한계와 관리의 피로감이 더해져 효율적인 관리방법을 찾는 중이다.

 

그리하여… 오픈소스 기반으로 통합 개발환경 구축을 시도하고 있다.

현재 팀 내에 적용하여 시행착오를 거치는 중이다.

구축 보다 더 중요한 것이 운영이다. 구축된 시스템을 어떻게 활용하느냐에 따라 목표인 개발 결과물 획득의 질과 개발의 효율성이 결정된다.

위 구성의 목표

프로젝트관리,협업 개발, 업무 공유, 히스토리 추적, 문서화, 이슈 관리, 소스코드 버전관리, 백업, 원격개발, 커뮤니티… 등이다.

 

위 이미지의 5개의 툴을 간략히 설명한다.

 

Redmine

스크린샷 2014-06-13 오후 12.34.39

웹 기반 프로젝트 관리도구이다.

형상관리, 간트차트, 게시판, SCM 등 여러 복합적인 기능들이 어우러져 있다.

스크린샷 2014-06-13 오후 1.10.40

MS Project, Open Proj 등 로컬 기반 관리툴 보다 성능은 다소 미흡하나 웹 기반에 실시간 업데이트를 생각하면 꽤 쓸만하다.

모바일 앱도 여럿 있는 듯..

 

Sourcetree

스크린샷 2014-06-13 오후 12.34.33

 

git 기반 프로젝트를 관리하는데 최적화된 UI를 자랑한다.

일반적인 텍스트 기반 프로젝트에 그대로 사용할 수 있다. bitbucket 운영사에서 개발한 듯..

참고로, github도 편리하지만 private 저장소가 유료인데 반해 bitbucket은 어느정도까지 무료로 private 저장소를 만들 수 있다.

스크린샷 2014-06-13 오후 1.01.51

 

Coda 2

스크린샷 2014-06-13 오후 12.34.46

 

FTP + Editor + SCM 으로 보면 될듯..

Filezilla와 UltraEdit를 사용하다가 Coda로 넘어왔는데 너무 편함.

최소한 웹 프로젝트에서는 publish 기능으로 업데이트 편리함.

iCloud로 PC간 서버 계정 관리가 한방에 되서 너무 좋음.

SCM 지원은 되나 Publish와 별개로 작동하여 2% 부족한 느낌..

 

Eclipse

스크린샷 2014-06-13 오후 12.34.53

대표 개발툴 답게 여러 보조도구들이 있다.

git 저장소 관리를 위해 egit 설치하여 협업 개발에 활용중.

처음 프로젝트 셋팅할 때 gitignore로 일부 폴더 push를 막아 둘 것…

그렇지 않으면 매일 수많은 에러에 질리게 됨.

 

Xcode

스크린샷 2014-06-13 오후 12.35.00

 

아이폰, 맥 앱을 만드는 기본 툴.

git을 알고나서 xcode의 위대함을 보았다.

실행 첫 화면에 new project와 SCM Checkout 선택 메뉴가 나온다. 예전엔 SCM이 먼지 몰라 클릭해볼 생각도 안했었다.

스크린샷 2014-06-13 오후 12.57.56

일단 eclipse 처럼 gitignore가 필요없다. xcode가 알아서 해준다.

xcode를 git과 함께 사용할 때는 다른 git Client GUI에서 절대 push하지 말것….

그리고 히스토리에서 소스코드 비교 기능이 뛰어나다. 한눈에 보인다.

스크린샷 2014-06-13 오후 1.08.08

 

계획

초입에서도 언급했듯이 구축보다 운영이 더 중요하다.

현재 외부 문서(오피스, 한글, 구글 드라이브 등)의 도움 없이 위 구성 안에서 모든 것을 해결하려 한다.

Redmine에서 작성하는 문서는 MCE(워드프레스)처럼 화려한 웹 문서 작성을 지원하지는 않는다.

여러 플러그인들 특히 CK Editor 을 적용해 보려한다.

구글 드라이브의 문서 작성기능만 어느정도 지원되면좋겠다… 특히 표 작성!  (어렵겠지?)

뭣도 모르고 들었던 “프로젝트 관리” 강의 자료를 다시 뒤져봐야겠다.

 

스크린샷 2014-06-13 오후 12.24.45

Categories
Development

Redmine + git 서버 연동하기

redmine

프로젝트 관리 도구로서 Redmine을 설치하고 git 저장소를 연결해 보고자 한다.

 

설치 환경은 UBUNTU Server 12.04 이고, 가상호스트를 구성하였다.

 

순서

1. Redmine  설치

2. Redmine 설정

3. git 서버 설치

4. redmine git 저장소 등록

5. git push

 

1. Redmine  설치

우선 기본적인 APM 환경을 조성한다.

$ sudo apt-get install apache2

$ sudo apt-get install php5 php5-gd php5-mysql

$ sudo apt-get install mysql-server mysql-client

 

Redmine은 rails 기반이므로 passenger를 설치한다.

$ sudo apt-get install libapache2-mod-passenger

 

최신 redmine을 설치해보자.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/redmine
$ sudo apt-get update
$ sudo apt-get install redmine redmine-mysql

 

Redmine은 웹 기반이므로 상황에 따라 웹 경로하에 링크를 두자.

일반적인 경우
$ sudo ln -s /usr/share/redmine/public /var/www/red-mine

가상 호스트를 구성할 경우 관리계정하에 폴더를 두자.
$ sudo ln -s /usr/share/redmine/public /home/your_id/redmine

 

passenger가 웹 실행권한( www-data)으로 작동하게 하자.
$ vi /etc/apache2/mods-available/passenger.conf
아래 내용 추가
PassengerDefaultUser www-data

 

호스트 설정 1 (일반적인 경우)
$ sudo vi /etc/apache2/sites-available/default

<Directory /var/www/redmine>
RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on
</Directory>

 

호스트 설정 2 (가상 호스트인 경우)
서브 도메인을 project.domain.com로 설정해 보자.

$ vi /etc/apache2/sites-available/yourdomain.com

<VirtualHost *:80>
ServerName project.domain.com
ServerAdmin id@domain.com
DocumentRoot /home/your_id/redmine
<Directory “/home/your_id/redmine”>
RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on
Options Indexes ExecCGI FollowSymLinks
Order allow,deny
Allow from all
AllowOverride all
</Directory>
</VirtualHost>

 

passenger 모듈을 활성화 하자.
$ a2enmod passenger

 

마지막으로 아파치를 재시작하고
$ sudo service apache2 restart

 

브라우저에서 redmine에 접속해 보자.

http://yourdomain.com/redmine

또는

http://project.yourdomain.com

 

우측 상단의 “login” 또는 “로그인”을 클릭하고 기본 관리자 계정(admin)과 기본 패스워드(admin)을 입력하고 로그인해보자.

rd3

2. Redmine 설정

로그인 후 상단메뉴에서 “관리->설정->표시방식”으로 들어가보자.

기본 표시방식들을 설정해주자. 보통 처음엔 영어로 되어있다.

안해줘도되지만 새로 참여하는 유저들이 매번 같은 설정을 해주는 불편함을 감수해야한다.

스크린샷 2014-06-10 오전 3.28.15

메일 알림 설정으로 들어가보자.

다른 설정을 안했다면 “SMTP가 어쩌구 저쩌구…” 나올것이다.

환경설정파일 편집을 해보자.

최초 환경설정 파일이 없으므로 샘플 환경파일을 가져와서 수정한다.

$ sudo cp /usr/share/redmine/config/configuration.yml.example /etc/redmine/default/configuration.yml

$ sudo vi /etc/redmine/default/configuration.yml

 

“default:” 항목을 찾아보자.

따로 SMTP가 구성되어있으면 해당 정보를 입력하고,

아니면, 아래 처럼 그냥 gmail을 활용하자.

# default configuration options for all environments
default:
# Outgoing emails configuration (see examples above)
email_delivery:
delivery_method: :smtp
smtp_settings:
address: smtp.gmail.com
port: 587
domain: smtp.gmail.com
authentication: :plain
user_name: “yourid@gmail.com”
password: “yourpassword”

 

redmine에서 다시 로그인 하자.

이제 메일 알람 설정을 할 수 있다.

스크린샷 2014-06-10 오전 3.26.44

 

 

3. git 서버 설치

아래 포스트를 참고하여 git 서버를 설치하자.

coda2 + git 서버 연동하기

 

Redmine에 git 경로를 설정해 주자.

$ sudo vi /etc/redmine/default/configuration.yml

아래 라인의 주석을 풀고 git 경로를 지정해주자.

scm_git_command:        /usr/bin/git                        # (default: git)

 

git 설치가 완료되었으면 저장소 설정으로 들어가보자.

스크린샷 2014-06-10 오전 3.27.30

여러 SCM을 지원한다.

redmine에서 git 설정이 정상이면 위 그림과 같이 git 항목 우측에 녹색 체크 표시가 된다.

중간 박스에 WS, API키 등은 원격 git 저장소 구성에 사용되는 듯 하다.

본 포스트에서는 동일 서버내에 redmine과 git 서버가 설치되는 환경이므로 별도의 구성은 하지 않겠다.

 

4. redmine git 저장소 등록

프로젝트를 하나 만들고 “설정->저장소”로 들어가보자.

rd1

형상관리시스템을 “git”으로 설정하고,

저장소 경로에 새로 만든 저장소 로컬 주소를 입력하고 “저장”을 누른다.

 

5. git push

git client 툴에서 push까지 완료한 후 “저장소”로 들어가보자.

스크린샷 2014-06-10 오전 4.29.00

 

commit된 내용이 나타났다.

하단에 개정판을 클릭하면 상세정보와 파일 변경 내용 비교까지 할 수 있다.

Categories
Development

coda2 + git 서버 연동하기

Image2

 

coda2의 프로젝트 관리능력을 체험하고 버전관리기능까지 테스트해 보았다.

웹프로젝트에 활용할 때 깔끔한 publish 기능과 버전관리를 위한 svn과 git까지 전천후 개발툴로 손색이 없는 듯 하다.

직접 git 서버를 구축하여 coda에 연결함으로써 협업 개발 환경 구축을 하고자 한다.

git 관련 유틸리티들로 저장소를 관리하고 웹에서 접근할 수도 있으나 coda2를 비롯한 좋은 gui툴들만으로도 충분하다.

아래 순서로 진행됨.

 

1. git 서버 설치 (우분투)

2. git repository 생성

3. coda2 git 서버 설정

4. coda2 git push

 

1. git 서버 설치 (우분투)

아래 명령어로 간단히 설치할 수 있다.

$ sudo apt-get install git

보통 git 관리를 위해 보안상의 이유로 별도의 계정을 둔다.

$ sudo adduser git

ssh로 git 저장소에 접속해야하므로 ssh 접속이 가능하게 해야한다.

만일 특정 계정만 접속하게 되어있다면 아래 과정을 실행하자.

$ sudo vi /etc/ssh/sshd_config

# 아래 항목이 있으면 맨 끝에 git 관리용 계정을 추가해주자.
# AllowUsers가 없다면 안만드는 것이 좋다. git만 접속되고 나머지 계정은 차단된다.
AllowUsers 아이디, 아이디, …. , git

$ service ssh restart
이제 git 계정으로 ssh 접속이 될 것이다.

 

2. git repository 생성

저장소를 만들기 위해 폴더를 하나 만든다.

경로는 짧을 수록 좋으므로 필자는 보통 루트 경로에 git이 접근할 수 있는 폴더를 만들어준다.

아래 부분은 root 또는 sudo 권한이 있는 계정으로 실행할 수 있다.

$ cd /

$ sudo mkdir repos

git 에게 폴더 접근 권한을 주자.

$ sudo chown git /repos

이제부터 git 계정으로 작업한다.

$ su – git

$ cd /repos

repos 폴더 안에 여러 개의 git 저장소를 만들어 작업을 구분해 주는 개념이다.

$ mkdir hello_world.git

$ cd hello_world.git

저장소를 초기화 해주자.

$ git init –bare –shared

Initialized empty shared Git repository in /repos/hellow_world.git/

저장소를 초기화하면 아래와 같이 기본 파일과 폴더들이 만들어진다.

$ ls

HEAD  branches  config  description  hooks  info  objects  refs

 

3. coda2 git 서버 설정

coda2에서 add site로 사이트 생성화면을 띄웠다.

스크린샷 2014-06-05 오전 9.56.16

Nicname을 정하고,

Local Root 경로를 지정해 주자. 필자는 도큐먼트에 “hellow_world”폴더를 만들어 사용하였다.

나머지 항목은 본 글과 직접적인 연관이 없으므로 생략한다.

상단 메뉴에 Source 로 들어가보자.

스크린샷 2014-06-05 오전 9.58.18

1번째 Clone Git… 은 원격 또는 로컬상의 이미 생성된 저장소와 연동하겠다는 것이다.

2번째 Initialize … 는 빈 저장소를 만들겠다는 것인데 로컬에 생성된다.

3번째는 svn 연동 메뉴이다.

원격 git 서버 연동이 목적이므로 첫번째 버튼을 누른다.

스크린샷 2014-06-05 오전 9.59.16

경로와 비번을 입력하라고 나온다.

앞서 git 계정이 ssh 접근이 되도록 설정했으므로 URL은 아래와 같이 지정하면된다.

ssh://git@yourdomain.com/repos/hellow_world.git

비번 입력 후 “Clone”를 누르자.

스크린샷 2014-06-05 오전 10.00.21

 

버전 문제인지 모르겠으나 간혹 위 그림처럼 멍텅구리 상태가 되기도 한다.

정상인 경우 펼침목록에는 “local”, “origin” 항목이 나와야한다.

저장소 설정을 복구하는 방법이 여러가지 있겠으나,

필자는 다른 SCM툴(“source tree” 등)로 clone한 뒤 최소 1회 commit-push 한 뒤

clone한 폴더를 coda2의 로컬 경로로 설정하여 해결하였다. 빈 저장소를 clone 하면 발생하는 듯 하다.

더 간단한 방법이 있으면 알려주세요~^^;

정상적인 경우라면 아래와 같이 나온다. “Local”로 선택된 항목을 “origin”으로 변경하면 git 원격 저장소 정보가 나온다.

처음 설정한다면 비어있는 Password 항목에 git 원격 저장소 계정의 암호를 입력한다.

스크린샷 2014-06-05 오전 10.19.36

save로 저장한다.

 

4. coda2 git push

coda2에서 hellow_world 프로젝트를 열고 파일을 하나 생성해보자.

bbb.txt파일을 하나 생성한 후 우측 상단 집모양 아이콘을 눌러보자.

스크린샷 2014-06-05 오전 10.23.09

 

SCM항목에 1이라고 표시되어있다. 버전관리툴에 업데이트해줄 항목이 생겼다는 것이다.

SCM을 눌러보자.

스크린샷 2014-06-05 오전 10.23.24

 

변화된 항목이 있다. 변경사항(파일생성) 항목 저장을 위한  “Add”버튼이 보인다.

Add를 누르면 잠시 후 commit 버튼으로 바뀐다.

commit 를 누르면 메모할 수 있는 창이 나오는데 설명을 간단히 적고 commit 해주자.

스크린샷 2014-06-05 오전 10.28.02

commit하면 아래와 같이 잠깐 Activity 박스가 나왔다가 사라진다.

스크린샷 2014-06-05 오전 10.28.08

로컬 저장소는 업데이트 되었고 원격 저장소로 push 해주자.

스크린샷 2014-06-05 오전 11.36.18

우측 상단의 숫자5는 push할 변경사항이 5개 존재한다는 뜻이다.

이제 다른 PC에서 같은 방법으로 pull하여 프로젝트를 구성해보자.

협업 환경이 준비되었으니 이제 코딩~~^^

Categories
Blog Development

오픈 API로 구글 트랜드 따라잡기

스크린샷 2014-05-12 오후 3.20.52

 

구글 트랜드는 심플하고 세련되게 검색어들을 나열하여 현재 네티즌들이 어떤 것에 관심이 있는지 알려준다.

화면 보호기로도 사용할 수 있어 활용도가 높다.

그런데, 국내에서는 구글 검색엔진을 많이 사용하지 않아서인지 가만히 보다보면 오래된 내용이 올라오기도 한다.

우선 구현에 앞서 구글 트랜드의 불편한 점들을 나열해 보았다.

 

1) 국내 유저가 적어 국내 트랜드를 읽어낼 수 없다. -> 네이버로 바꾸면 되겠군

2) 검색어만 보다가 보면 저 말이 왜 올라왔는지 무지무지 궁금하다. 상세내용을 보고 싶다.

3) 사진이 나와주면 더 좋겠다. 보통 검색할 때 사진을 많이들 참조하니..

4) 이왕이면 사진, 뉴스, 블로그 모두 요약해서 보여주면 좋겠다.

 

가능성 알아보기

네이버에서도 오픈API를 지원하니 어디까지 지원되는지 보자.

네이버 개발자 센터(http://developer.naver.com) 상단 메뉴에 오픈API 메뉴가 있다.

스크린샷 2014-05-12 오후 3.41.50

 

검색을 할 것이니 “검색 API”로 들어왔다. 여러가지 검색옵션들이 보이는데..

처리한도가 25,000건이란다. 아껴써야겠다.

블로그, 뉴스, 이미지 모두 검색할 수 있고, “실시간 급상승어” 항목도 있었는데 내가 못찾는건지 메뉴에는 안나와있다.

참고로 실시간 급상승어 URL은 아래와 같다.

http://openapi.naver.com/search?key=키&query=nexearch&target=rank

오픈API를 사용하려면 키를 발급받아 사용해야 한다. 키 발급은 우측 상단에 “키발급/관리”에서 할 수 있다.

 

구현 계획

우선 10개의 “실시간 급상승어” 목록을 가져온 다음 각 “검색어”를 가지고 이미지, 뉴스, 블로그의 내용(제목)을 가져와 출력한다.

내용이 많을 수 있으므로 화면에는 10개의 결과를 돌아가면서 출력할 것이다.

1번 쿼리하는데, 모든 쿼리를 합하면 25건 가량된다. 1분에 1번 쿼리한다면 하루 36,000건을 소진해야하므로 부족하다.

5분 정도로 하면 7200건이면 되지만, 나혼자 사용한다면 상관없지만 지인들이나 사이트 방문자들에게도 서비스하려면 하루 25,000개의 쿼리로는 부족하다.

결과를 공유하는 방법을 사용하기로 했다.

누군가 접속해서 쿼리를 소진하면 그 쿼리 결과를 웹서버에 저장해 뒀다가 5분 이상 경과했을 때만 저장된 것을 업데이트 하자.

그러면 여러명이 접속해도 “최대 7200건“이 된다.

 

구현

구현에는 php와 javascript를 이용하였다.

1. 실시간 급상승어 가져오기 (search_save.php)

<?php

$strRes = HttpRequest(“openapi.naver.com”, “/search?key=”.$strKey.”&query=nexearch&target=rank”);

if( $strRes == “” ){ return; }

$parser = new XMLParser($strRes);
$parser->Parse();
$arRank[0] = $parser->document->item[0]->r1[0]->k[0]->tagData;
$arRank[1] = $parser->document->item[0]->r2[0]->k[0]->tagData;

$arRank[9] = $parser->document->item[0]->r10[0]->k[0]->tagData;

?>

2. 실시간 급상승어로 상세 검색결과 얻기 (search_save.php)

// 오류 방지를 위해 공문자를 제거하자. (URL코드 변환 방법도 좋다.)

$strWord = str_replace(” “, “”, $arRank[$i]);

//////////////////////// Image ////////////////////////

$strUrl = “/search?key=”.$strKey.”&query=”.$strWord.”&target=image&start=1&display=5″;
$strNewRes = HttpRequest(“openapi.naver.com”, $strUrl);
$parser2 = new XMLParser($strNewRes);
$parser2->Parse();

$strNewsDetail .= ‘<div class=”image_detail”>’;
for($j=0 ; $j<5 ; $j++)
{
$strImageURL = $parser2->document->channel[0]->item[$j]->link[0]->tagData;
$strNewsDetail .= “<div style=\”background-image:url(‘”.$strImageURL.”‘);\” class=\”image_detail_src\”></div>”;
}
$strNewsDetail .= ‘</div>’;

//////////////////////// News ////////////////////////
$strUrl = “/search?key=”.$strKey.”&query=”.$strWord.”&target=blog&sort=sim&start=1&display=5″;
$strNewRes = HttpRequest(“openapi.naver.com”, $strUrl);
$parser2 = new XMLParser($strNewRes);
$parser2->Parse();

$strNewsDetail .= ‘<div class=”news_detail”>’;
$strNewsDetail .= ‘<div class=”news_detail_title”>NEWS</div>’;
for($j=0 ; $j<5 ; $j++)
{
$strTitle = $parser2->document->channel[0]->item[$j]->title[0]->tagData;
$strLink = $parser2->document->channel[0]->item[$j]->link[0]->tagData;
$strNewsDetail .= ‘<div class=”news_detail_item”><a href=”‘.$strLink.'” target=”_blank”>’.$strTitle.'</a></div>’;
}
$strNewsDetail .= ‘</div>’;

//////////////////////// Blog ////////////////////////
$strUrl = “/search?key=”.$strKey.”&query=”.$strWord.”&target=news&start=1&display=5″;
$strNewRes = HttpRequest(“openapi.naver.com”, $strUrl);
$parser2 = new XMLParser($strNewRes);
$parser2->Parse();

$strNewsDetail .= ‘<div class=”blog_detail”>’;
$strNewsDetail .= ‘<div class=”blog_detail_title”>BLOG</div>’;
for($j=0 ; $j<5 ; $j++)
{
$strTitle = $parser2->document->channel[0]->item[$j]->title[0]->tagData;
$strLink = $parser2->document->channel[0]->item[$j]->link[0]->tagData;
$strNewsDetail .= ‘<div class=”blog_detail_item”><a href=”‘.$strLink.'” target=”_blank”>’.$strTitle.'</a></div>’;
}

3. 검색 결과 파일로 저장하기 (search_save.php)

// 함수를 따로 만들어 주었다.

function SetSavedNews($strValue)
{
$fp = fopen(“news_save.txt”,”w”);
fwrite($fp, $strValue);
fclose($fp);
}

// 저장된 내용을 가져올 때에는

function GetSavedNews()
{
$fp = fopen(“news_save.txt”,”r”);
if( $fp == null ){ return “”; }

while(!feof($fp)){
$data .= fgets($fp);
}

fclose($fp);

return $data;
}

4. 5분 경과시에만 새로 쿼리하기 (search_save.php)

<?

// 현재시간 확인
$strNowTime = GetNowTime();

// 최종 업데이트 시간 확인
$strOldTime = GetUpdateTime();

if( GetTimeGap($strOldTime, $strNowTime) > 4 )
{
// 새 뉴스 가져오기
$strNews = GetNews();

// 파일로 덮어쓰기기
SetSavedNews( $strNews );

// 업데이트 시간 갱신
SetUpdateTime($strNowTime);
}
else{
// 저장 뉴스 가져오기
$strNews = GetSavedNews();
}

// 출력
echo $strNews;

?>

 

5. 브라우저에서 주기적으로 쿼리 확인하기 (index.php)

function UpdateNews()
{
clearTimeout(g_hDetailUpdateTimer);

$.ajax({//Make the Ajax Request
type: “GET”,
url: “http://domain.com/search_save.php”,
data: “”,
beforeSend: function() {
},
contentType: “application/x-www-form-urlencoded; charset=utf-8”,
success: function(html){
$(“#data_request”).html(html);
}
});

var d = new Date();
g_nUpdateTimeH = d.getHours();
g_nUpdateTimeM = d.getMinutes();

g_nItemPos = -1;

// 상세 결과 돌아가면서 보여주기
g_hDetailUpdateTimer = setInterval(“ShowNextDetail()”, 5000);

return false;
}

 

function ShowNextDetail()
{
nItemPos = g_nItemPos + 1;

// 10개 모두 돌아가면서 보여주었으면
if( nItemPos > 9 )
{
nItemPos = 0;
var d = new Date();

// 최종 쿼리 시간과 현재 시간의 차이를 구해서
var nTimeGapM = GetTimeGap(g_nUpdateTimeH, g_nUpdateTimeM, d.getHours(), d.getMinutes());

// 4분 초과(5분)이 되었으면
if( nTimeGapM > 4 )
{

// 서버에서 쿼리를 다시 가져올 것
UpdateNews();
return;
}
}

ShowDetail(nItemPos);

return false;
}

 

실행

http://trend.icansoft.com

스크린샷 2014-05-12 오후 4.50.42

화려한 애니메이션을 주려다가 간단히 fadein 만 넣었다.

화면 한켠에 띄워두고 웹써핑이나 해볼까~

 

 

 

Categories
Blog Development

HADOOP – Fully distributed Mode

스크린샷 2014-05-08 오후 5.54.25

하둡으로 삽질한지 거의 한달이 되었다.

일주일 정도 작업해서 싱글로 워드카운트 예제 성공한 후 분산모드를 위해

서버도 32비트에서 64비트 최신으로 업데이트했으나 연이은 실패…

한달여만에 2대로 분산처리에 성공하였다.

인터넷 자료가 많은 도움이 되었으나 구 버전 설명을 그대로 이용하다가 여러번 시행착오를 겪기도 했다.

본 글에서는 하둡 2.3.0 버전을 사용하였다.

 

구성

서버 : 듀얼코드, RAM 4G – 2대

OS : 우분투 데스트탑 12.10 i386

Hadoop 2.3.0

우분투 i386에서 싱글로 성공한 뒤 amd64로 갈아업었지만

이번엔 엄청난 실행 오류를 맞이했었다.

서칭해보니 하둡사이트에는 32비트용으로 올라가있고 64bit에서 실행하려면

리빌드해야한단다. 설치도 겨우하고있던터라 포기하고 다시 32비트로 깔았다.

우분투만 10번 설치한것 같다.

편의상 2대의 아이피는 아래와 같이 기재하였다.

xxx.xxx.xxx.1 hmaster
xxx.xxx.xxx.2 hslave

 

OS 준비

(리눅스가 처음인 분들을 위해 상세히 적었습니다. 양해부탁드려요^^;)

우분투 설치 시 편의상 계정을 hadoop로 하고 호스트명을 각각 hmaster, hslave로 정하였다.
atp-get으로 기본 프로그램들을 설치한다.

$ sudo apt-get install ssh //ssh 설치

$ sudo apt-get install vsftpd // ftp 설치

$ sudo vi /etc/vsftpd.conf // ftp 환경파일 수

// 아래 항목만 수정하면됩니다. 주석으로 된 부분 주석 제거
anonymous_enable=no
local_enable=Yes
write_enable=Yes
local_unmask=022

$ sudo service vsftpd restart // ftp 재시작

// jdk 설치 (하둡은 java기반이므로..)
$ sudo apt-get -y install openjdk-7-jdk

 

하둡 설치

http://hadoop.apache.org 에서 하둡 프로그램 파일을 다운로드 받아 ftp로 업로드한다.

계정 홈에서 압축해제한다.

$ sudo tar xvf hadoop-2.3.0.tar

압축해제한 폴더를 usr/local로 옮겨 준다.

$ sudo cp -r hadoop-2.3.0 /usr/local/hadoop

hadoop 게정에 위 디렉토리 권한이 없는 경우 아래 명령으로 해결한다.

$ sudo chown -R hadoop:hadoop /usr/local/hadoop

 

* 하둡 계정을 별도로 생성해서 관리하고자 할 경우

아래와 같이 계정 생성해준다.
$ sudo addgroup hadoop
$ sudo adduser –ingroup hadoop hadoop

// 프로파일 수정

$ vi ~/.profile

# JDK 7.0

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386/jre

# hadoop home

export HADOOP_HOME=/usr/local/hadoop

# hadoop bin

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

// 프로파일 재로딩
$ source ~/.profile

// 변수 확인
$ echo $JAVA_HOME  –  $HADOOP_HOME
// 아래 내용이 출력되어야 함
/usr/lib/jvm/java-7-openjdk-i386/jre – /usr/local/hadoop

// ssh자동로그인을 위한 rsa키 만들기
$ ssh-keygen -t rsa -P “”

생성후 인증키 복사 ~/.ssh/authorized_keys 가 존재 할지도 모르니 cat >> 이용

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 755 ~/.ssh/authorized_keys

// 비번없이 접속테스트
$ ssh hadoop@localhost

하둡 셋팅

$ vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
// 아래 내용 수정
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
// site.xml 수정

vi /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://hmaster:9000</value>
  </property>
</configuration>

 

vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>

  <property>
    <name>dfs.name.dir</name>
    <value>/usr/local/hadoop/dfs/name</value>
  </property>

  <property>
    <name>dfs.data.dir</name>
    <value>/usr/local/hadoop/dfs/data</value>
  </property>
</configuration>
$ cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.tem* /usr/local/hadoop/etc/hadoop/mapred-site.xml
$ vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>hmaster:9001</value>
  </property>
</configuration>
$  vi /usr/local/hadoop/etc/hadoop/mapred-env.sh

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

호스트 설정

$ sudo vi /etc/hosts

127.0.0.1 localhost
#127.0.1.1 hmaster
xxx.xxx.xxx.1 hmaster
xxx.xxx.xxx.2 hslave

여기까지 2대 모두 동일하게 셋팅한다 .

 

ssh 공개키 공유 

// hmaster에서
$ scp ~/.ssh/id_rsa.pub hadoop@hslave:~/hmaster_key

// hslave에서
$ scp ~/.ssh/id_rsa.pub hadoop@hmaster:~/hslave_key

// hmaster에서
$ cat ~/hslave_key >> ~/.ssh/authorized_keys

// hslave에서
$ cat ~/hmaster_key >> ~/.ssh/authorized_keys

하둡 실행

여기서 부터는 hmaster에서 실행합니다.
// namenode 포멧
$ /usr/local/hadoop/bin/hadoop namenode -format

// 하둡 실행
$ /usr/local/hadoop/sbin/start-all.sh

// 제대로 실행되었는지 데몬 확인하기
hadoop@hmaster:~$ jps
429 ResourceManager
2298 Jps
32477 NameNode
32746 SecondaryNameNode

hadoop@hslave:~$ jps
19787 DataNode
20270 Jps

// 웹브라우저에서 모니터링하기
http://xxx.xxx.xxx.1:50070  으로 접속해 보자.
하둡 데몬이 실행중이면 아래와 같은 화면이 나온다.

데쉬보드 메뉴를 클릭해보자.
hslave 항목이 들어있다.


datanode 에 아무것도 없으면 데이터 입출력을 할 수 없다.

예제 실행

인터넷에 돌아다니는 wordcount 예제 파일을 사용하였다.
계정 홈에 jar 파일과 분석할 입력파일(텍스트)을 업로드한다.
~/in/* 에 입력파일들이 있다고 가정하고

// dfs 디렉토리 준비

hadoop@hmaster:~$ hadoop dfs -mkdir /input

// dfs로 입력파일 전달
hadoop@hmaster:~$ hadoop dfs -put ./in/* /input/*
// 예제 실행

hadoop@hmaster:~$ hadoop jar wordcount.jar kr.bigmark.wordcount.WordCount /input /output

처리결과 확인

hadoop dfs -cat /output/*00000

의미없는 로그파일을 넣었더니 위와같이 나왔다.

왼쪽이 단어, 오른쪽이 단어 개수이다.

 

예제를 다시 실행하려면 output을 날려주어야한다.

$ hadoop dfs -rmr /output

 

참고

http://sidcode.tistory.com/213

http://mymailcool.tistory.com/entry/hadoop-Fully-distributed-Mode-구축

http://jy86.tistory.com/entry/ㅇ-1

http://ragon.tistory.com/entry/하둡-완전-분산-설치4개의-노드로-1대는-마스터-3대는-계산노드로-사용

 

Categories
Blog Development

우분투 웹메일서버 구축하기

스크린샷 2014-04-27 오후 6.58.23

 

우분투에 메일 서버를 설치한 후 외부 메일 프로그램이나 포털 등에서 메일을 불러와서 확인해야 했다.

외부의 도움 없이 서버 안에서 웹메일을 구축하여 독립할 방법을 찾아보았다.

quirrelMail, Roundcube를 많이 사용하는 듯한데 최근 자료에는 Roundcube가 많이 등장하는 듯 하다.

roundcube.net에 들어가보니 마침 이번달에 1.0 정식 버전이 올라와 있었다.

따로 다운로드 받아 설치하려다 혹시나 해서 apt-get으로 두드려보니 있었다.

Roundcube 설치전 준비사항

웹메일서버 작동을 위해 기본적으로 sendmail과 같은 메일 서버가 설치되어 있어야 한다.

필자는 postfix 메일서버로 설치한 상태이다. roundcube 설치과정에서 php, sendmail 라이브러리가 자동으로 업데이트 되는 것으로보아 메일서버도 함께 설치되는지도 모르겠다.

함께 설치되더라도 메일 서버 설정은 직접해줘야 할것이다.

메일서버 설치는 아래 링크를 참조바람.

http://blog.icansoft.com/?p=841

 

Roundcube 설치

apt-get install roundcube roundcube-plugins roundcube-plugins-extra

설치 단계에서 몇 가지 설정단계가 나온다. 일단 잘 모르겠으면 예 를 선택하자.

 

스크린샷 2014-04-27 오후 6.44.11

 

 

 

 

 

 

 

roundcube는 DB기반인데 MySQL 과 postgres 중 선택할 수 있다. root 계정을 알려주면 알아서 roundcube용 DB가 준비된다.

스크린샷 2014-04-27 오후 6.47.27

추가로 roundcube 전용 DB계정에 대한 패스워드 설정단계가 있다.

 

roundcube 설정

vi /var/lib/roundcube/config/main.inc.php

위와같이 환경설정 파일을 열면 아래 변수가 비어있을 것이다. localhost로 설정한다.

$rcmail_config[‘default_host’] = ‘localhost‘;

 

웹에서 접속할 수 있게 roundcube 경로를 웹 경로에 링크시킨다.

ln -s /var/lib/roundcube /var/www/roundcube

 

필자의 서버에서는 가상호스트로 webmail.도메인.com 를 추가하고, 아래와 같이 roundcube 메인 경로를 링크하였다.

ln -s /var/lib/roundcube /home/***/webmail

 

roundcube 접속

웹브라우저에서 웹 경로(webmail.도메인.com)로 접속해보자.

정상적으로 설정을 마쳤다면 아래와 같이 로그인 화면이 나온다. 한글도 잘 출력된다.

 

스크린샷 2014-04-27 오후 6.55.17

메일 계정은 미리 생성된 계정으로 접속해 보았다.

스크린샷 2014-04-27 오후 6.55.05

 

외부 메일 응용프로그램과 포털의 외부 메일 가져오기도 잘 작동됨을 확인하였다.

기존의 설정된 메일서버 기능을 훼손하지는 않는 것 같다.

 

참고

http://roundcube.net
https://www.exratione.com/2013/07/installing-roundcube-on-ubuntu-1204/
Categories
Blog Development

우분투 메일서버 구축

Postfix-logo

많이들 설치하고있는 postfix를 이용하여 메일서버를 구축하고자한다.

편의상 sudo는 생략한다.

postfix 설치

apt-get install postfix
설치 과정에서 설정 UI가 나오는데
대부분 그냥 확인을 선택해 넘어가고,
시스템 메일이름, 관리자 메일 주소는 직접 입력한다.
필자의 경우 “인터넷 프로토콜” 단계에서 모두(ipv6 + ipv4)를 선택했더니
서버가 ipv6 지원이 안되는 상태라 오류가 발생했다.
이런 경우 ipv4만 선택하면되겠다.
procmail은 사용안함으로 설정할 것

설치 과정에 나온 설정을 다시 하고싶다면 아래 명령어를 입력한다.
dpkg-reconfigure postfix

메일폴더 설정

postconf -e ‘home_mailbox = Maildir/’
기본 메일 경로는 /var/mail/유저아이디 인데 이 경로는 외부에서 일반 계정으로 접근이 안되는 경로이다.
위와같이 메일 경로를 해당 계정 하위에 두어 해당 계정 아이디/비번으로 들어와 메일을 가져갈 수 있게 해야한다.

SMTP인증 설정

postconf -e ‘smtpd_sasl_local_domain =’
postconf -e ‘smtpd_sasl_auth_enable = yes’
postconf -e ‘smtpd_sasl_security_options = noanonymous’
postconf -e ‘broken_sasl_auth_clients = yes’
postconf -e ‘smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination’
postconf -e ‘inet_interfaces = all’

vi /etc/postfix/sasl/smtpd.conf
아래 내용 추가
pwcheck_method: saslauthd
mech_list: plain login

TLS인증서 준비

openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
mv smtpd.key /etc/ssl/private/
mv smtpd.crt /etc/ssl/certs/
mv cakey.pem /etc/ssl/private/
mv cacert.pem /etc/ssl/certs/

TLS 관련 postfix 설정

postconf -e ‘smtpd_tls_auth_only = no’
postconf -e ‘smtp_use_tls = yes’
postconf -e ‘smtpd_use_tls = yes’
postconf -e ‘smtp_tls_note_starttls_offer = yes’
postconf -e ‘smtpd_tls_key_file = /etc/ssl/private/smtpd.key’
postconf -e ‘smtpd_tls_cert_file = /etc/ssl/certs/smtpd.crt’
postconf -e ‘smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem’
postconf -e ‘smtpd_tls_loglevel = 1’
postconf -e ‘smtpd_tls_received_header = yes’
postconf -e ‘smtpd_tls_session_cache_timeout = 3600s’
postconf -e ‘tls_random_source = dev:/dev/urandom’
postconf -e ‘myhostname = server1.example.com’

sasl2 설치

외부에서 이 서버로 메일을 보내는데 필요함.
apt-get install libsasl2 libsasl2-modules sasl2-bin

필자의 경우 libsasl2가 없고 libsasl2_2로 대체 설치되었다. 버전업 된듯하다.

saslauthd 설정

vi /etc/default/saslauthd
아래 항목 수정
START=yes
PWDIR=”/var/spool/postfix/var/run/saslauthd”
PARAMS=”-m ${PWDIR}”
PIDFILE=”${PWDIR}/saslauthd.pid”
OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd”

dpkg 업데이트

dpkg-statoverride –force –update –add root sasl 755 /var/spool/postfix/var/run/saslauthd

saslauthd 실행
/etc/init.d/saslauthd start

POP3 및 IMAP 설치

아웃룩 처럼 외부에서 메일을 가져가기 위하 필요함.
POP3도 좋지만 여러 단말기에서 메일을 확인한다면 IMAP가 편리할 수도 있다.
필요한 것으로 설치한다. 필자는 둘 다 설치했다.
sudo apt-get install courier-pop
sudo apt-get install courier-imap

메일 경로 설정

maildirmake /etc/skel/Maildir
maildirmake /etc/skel/Maildir/.Drafts
maildirmake /etc/skel/Maildir/.Sent
maildirmake /etc/skel/Maildir/.Trash
maildirmake /etc/skel/Maildir/.Templates

새로 생성되는 유저는 메일 경로가 자동으로 만들어지지만
이미 생성된 유저는 메일 경로를 일일이 만들어 주어야한다.

cp -r /etc/skel/Maildir /home/myuser/
chown -R myuser:usergroup /home/myuser/Maildir
chmod -R 700 /home/myuser/Maildir

메일 유저 생성

터미널을 사용할 경우 아래와 같이 생성한다.
sudo useradd -m -s /bin/bash 계정아이디
sudo passwd 계정아이디

메일만 사용하는 계정인 경우 굳이 터미널 권한을 주지 않아도 된다.
sudo useradd -m -s /sbin/nologin 계정아이디
sudo passwd 계정아이디

메일 주고 받기 테스트

테스트는 아래 사이트 참고…
참고사이트

https://help.ubuntu.com/community/Postfix
http://kairess.net/5771
http://justin.kr/?p=123