Programmer Application Note

2015년 11월 18일 수요일

2015년 11월 17일 화요일

c++ string replace all

오전 12:26 Posted by PAN.SPOT , No comments
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main()
{
   cout << "Hello World" << endl;
   string str = "ab0cd0e0fg";
   replace_if(str.begin(),str.end(),bind2nd(equal_to<char>(),char('0')),char('-'));
   cout << str << endl;
   return 0;
}

output:
        ab-cd-e-fg

2015년 10월 18일 일요일

jenkins 설치 및 gitlab 연결 하기

오후 6:40 Posted by PAN.SPOT , , No comments

1. Jenkins 

jenkins는 오픈소스 지속적통합 CI(continuouus intergration) tool

2. Install jenkins Debian packages 
This is the Debian package repository of Jenkins to automate installation and upgrade. To use this repository, first add the key to your system:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
Then add the following entry in your /etc/apt/sources.list:
deb http://pkg.jenkins-ci.org/debian binary/
Update your local package index, then finally install Jenkins:
sudo apt-get update
sudo apt-get install jenkins
See Wiki for more information, including notes regarding upgrade from Hudson.

※ 만약 8080포트가 사용 중이라면 /etc/default/jenkins에서 HTTP_PORT를 변경하여 재시작.

3. plugin 설치 

jenkins에 접속 하여 gitlab plugin 설치

4. ssh key 설정
sudo su - jenkins
git config --global user.name "jenkins"
git config --global user.email "jenkinse@DOMAIN"
ssh-keygen -t rsa -C "jenkins@DOMAIN"

gitlab의 jenkins에서 사용할 프로젝트의 설정에서 Deploy Keys로 추가하여 권한을 준다.





2015년 10월 14일 수요일

리눅스에서 윈도우 폴더 공유 시 권한문제 및 컴파일 시 Value too large for defined data type 문제

오후 8:37 Posted by PAN.SPOT No comments

윈도우에서 공유 설정을 한 후 리눅스에서 mount 하여 사용 할 때 권한 문제가 발생 한다면, 리눅스 계정의 uid,gid 설정을 하면 해결 된다.

해당 윈도우 폴더에서 리눅스 프로젝트를 컴파일 하였을 때
아래와 같은 오류가 발생한다면 nounix,noserverino 추가 한다.

Value too large for defined data type
정의한 자료형으로 쓰기엔 너무 큰 값

최종 마운트 방법

mount -t cifs //<Windows공유서버IP>/<윈도우공유폴더명> /<리눅스공유폴더명> -o username="<계정>",password="<암호>",uid=<xxx>,gid=<xxx>,nounix,noserverino

2015년 8월 26일 수요일

openvpn 설치

오후 7:06 Posted by PAN.SPOT , 1 comment
혼자 사용할때 설정이 간편한 openvpn-as 설치 방법 (ubuntu14.04 기준)

server 측 설정

$sudo apt-get install openvpn-as
$passwd openvpn //비밀번호 설정 (접속 비밀번호임)
  • https://serverip:943/admin 여기로 접속하면 사용자 추가등 기본 설정을 할 수 있음. 단 사용자는 2명이상일 때 추가 결재를 해야 사용가능한것으로 보임.
 

client 측 설정

windows 사용자 기준
  1. openvpn client 설치 https://openvpn.net/index.php/open-source/downloads.html
  2. https://serverip:943/ 여기로 접속
  1. openvpn connect를 설치 해도 되지만 다른os에서도 사용 하기위해 로그인으로 변경하여 로그인한다.
  1. openvpn 프로파일을 다운 받는다.
  1. C:\Program Files\OpenVPN\config 폴더에 다운받은 프로파일을 저장한다.
  2. openvpn client gui를 실행하여서 사용자와비밀번호를 입력하고 (추가하지 않았다면 openvpn/설정한비번) connect 한다.

2015년 8월 9일 일요일

복사생성자와대입연산자 코딩 시 주의 할 점

오후 6:05 Posted by PAN.SPOT , No comments
디폴트 대입연산자를 사용하지 않고 직접 코딩 한다면 우측 연관 연산을 고려하여 자기자신의 참조자를 반환하도록 하자. 또한 자기 대입에 대한 처리도 하자.
우측연관 연산의 예
x = y = z = 15;
자기 대입에 대한 예
x = x; , a[i] = a[j];
class Widget{
   Widget(const Widget& rhs); 
   Widget& operator=(const Widget& rhs);
}
Widget& Widget::operator=(const Widget& rhs)
{
   Widget temp (rhs); // 자기 대입에 대한 처리
   swap(temp); // 자기 대입에 대한 처리 
   return *this; //우측연관 연산 처리 
}
복사생성자와 대입연산자를 코딩할때는 모든 맴버를 복사하도록 하자
class Customer{
   Customer(const Customer& rhs); 
   Customer& operator=(const Customer& rhs);
private:
   sting str;
   Data data;
}
str,data도 반드시 복사 하도록 하자.
class ACustomer : Customer{
     Customer(const Customer& rhs) : Customer(rhs) 
     {
     .....   
     }
     Customer& operator=(const Customer& rhs)
     {
        Customer::operator=(rhs);
     }
}
위와 같이 베이스 클래스의 생성자와 대입연산자를 호출하여, 베이스 클래스의 복사도 해주자.

2015년 7월 27일 월요일

함수포인터

오후 5:04 Posted by PAN.SPOT , No comments
  • 함수 정의
void cStyleFunction(int param){...}

class Aclass {
 void classFunction(int param){...}
 static void classStaticFunction(int param){...}
};

namespace NameSpace{
 void namespaceFunction(int param){...}
}
  • 함수포인터 선언
void (*FunctionPointer) (int param);
typedef void (*TypedefFunctionPointer) (int param);
void (Aclass::*ClassFunctionPointer) (int param);
  • 함수포인터 사용
void (*FunctionPointer) (int param);
void main(){
 void (*FunctionPointer) (int param);
 FunctionPointer = cStyleFunction; //ok
 FunctionPointer = Aclass::classStaticFunction; //ok
 FunctionPointer = NameSpace::namespaceFunction; //ok 
 FunctionPointer = Aclass::classFunction; //error
 FunctionPointer(param);
}
typedef void (*TypedefFunctionPointer) (int param);
typedef void (*TypedefFunctionPointer) (int param);
void main(){
 TypedefFunctionPointer tfp;
 tfp = cStyleFunction; //ok
 tfp = Aclass::classStaticFunction; //ok
 tfp = NameSpace::namespaceFunction; //ok
 tfp = Aclass::classFunction; //error
 tfp(param);
}
typedef void (Aclass::*ClassFunctionPointer) (int param);
void main(){
 Aclass *a = new Aclass();
 void (Aclass::*ClassFunctionPointer) (int param);
 ClassFunctionPointer = &Aclass::classFunction; //ok
 (a->*ClassFunctionPointer)(param);
}

2015년 7월 23일 목요일

디폴트 생성자 , 소멸자, 복사 생성자 , 대입연산자

오후 5:22 Posted by PAN.SPOT , No comments

컴파일러가 자동으로 생성하는 것들

Empty() {...}; //기본 생성자
~Empty() {...};//기본 소멸자
Empty(const Empty& rhs) {...}; //복사 생성자
Empty& operator=(const Empty& rhs) {...}; //복사 대입 연산자
Empty e1; //기본 생성자,기본 소멸자 Empty e2(e1); // 복사 생성자 e2 = e1; //복사 대입 연산자

만약 하나밖에 없는 자원이라 복사생성자나 대입 연산자가 필요 없다면

pirvate:
    HomeForSale(const HomeForSale&);
    HomeForSale& operator=(const HomeForSale&);

임베디드 webkit browser 한글 폰트 설정

오후 4:20 Posted by PAN.SPOT , No comments
임베디드에서 webkit browser 한글이 깨져 나올때가 있다. 이때 fonts.conf 파일을 찾아서 
아래와 같이 변경 해준다. 

파일을 열어보면 다음과 같이 match 태그들을 볼 수 있다. 기본 폰트인 monospace,sans-serif 등을 볼 수 있는데 아래와 같이 기본폰트를 강제로 한글 표현이 가능한 폰트로 변경 한다. 

아래는 sans serif를 NanumGothic으로 변경한 예이다. 

<match target="pattern">
  <test qual="any" name="family">
          <string>sans serif</string>
  </test>
  <edit name="family" mode="assign" binding="strong">
          <string>NanumGothic</string>
  </edit>
</match>

위와 같은 방법으로 브라우저의 한글 폰트 설정을 강제로 변경 할 수 있다.

2015년 7월 21일 화요일

git 계통관계

오후 11:46 Posted by PAN.SPOT , , No comments
^ : 해당 커밋의 부모
^2 : 두번쨰 부모 (즉 부모가 두가지로 나눠져 있을 떄)
~: 해당 커밋의 부모
~2 : 해당 커밋의 부모의 부모

HEAD^^ = HEAD~2


2015년 7월 1일 수요일

If no other git process is currently running, this probably means a git process crashed in this repository earlier. Make sure no other git process is running and remove the file manually to continue.

오후 10:55 Posted by PAN.SPOT , No comments

git 사용중 아래와 같은 에러발생 시 

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
$rm /PROJECTDIR/.git/index.lock
$git reset

2015년 5월 5일 화요일

udev를 이용한 usb mount

오후 7:22 Posted by PAN.SPOT No comments

udev를 이용한 usb auto mount

임베디드 리눅스 시스템에서 usb를 auto mount/umount 할 수 있는 방법을 알아보자.
  1. 먼저 타켓 시스템에서 udevd daemon 동작 하고 있는지 확인 한다.
  • $ps -ef | grep udevd 검색되는게 없다면 데몬이 돌지 않는 것이다.
  • which udevd 또는 find / -name "udevd"로 설치되어 있는지 확인 한다.
  1. udevd daemon이 없다면, udev source 에서 다운받아서 타켓 시스템에 맞게 cross compile 후 타겟 시스템에 추가 한다.
  • 각각의 타켓 시스템에 맞게 컴파일 한 후 rootfs에 복사하여 적용 한다.
  1. 이벤트가 발생 할 때 실행 되는 rules 파일 생성 etc/udev/rules.d/XX-XXXX.rules
  • 기본적으로 etc/udev/rules.d/ 폴더에 있는 rules 스크립트를 차례로 실행 하게 되는데 해당 폴더에 스크립트를 작성한다. 여기서는 샘플로 파일명을 10-local.rules로 생성한다.
    udevd --daemon --debug로 실행 해보면 만약 rules.d 경로가 틀리면 error 메세지가 출력되며 폴더 경로가 어디인지 확인 할 수 있다.
     아래와 같이 스크립트를 작성 한다.스크립트 작성방법은 여러가지가 있다.
     
     ACTION=="add",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/usbmount.sh 1 %k"
     ACTION=="remove",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/cstusbmount.sh 2 %k"
     #ACTION=="remove",ENV{DEVNAME}=="/dev/sd[a-z][0-9]",SUBSYSTEM=="block",RUN+="/usr/local/etc/udev/rules.d/cstusbmount.sh 2 %k
    
    • ACTION : 이벤트가 발생 했을 때
    • KERNEL,SUBSYSTEM... : udevadm info를 이용하여 해당 usb를 삽입 한 후 정보를 확인 해보고 알맞는 정보를 사용 하면 된다.
    • RUN : 해당 상태가 맞으면 실행되는 스크립트
    첫번째줄은 해석 하면 삽입(add)이 발생 하였고 kernel 이 sdXX 이고 subsystem이 block 이면 usbmount.sh를 실행 하라는 스크립트 이다. 두번째,세번째줄은 반대로 usb가 제거 되었을때 umount 하려는 스크립트 이며 두개중에 아무거나 사용하여도 무방하다. 단 정보를 확인 하여 타겟시스템에 맞는 것을 사용하도록 한다. %k는 $KERNEL 과 같다. 보다 자세한 정보를 원한다면 udev rules를 이용 한다.
  1. 실제 usb를 마운트 하는 script 생성
     #!/bin/sh
     case $1 in
     1)
     #echo $2 >> /etc/udev/rules.d/add.txt
     mkdir -p /mnt/usb/$2
     mount /dev/$2 /mnt/usb/$2
     ;;
     2)
     #!/bin/sh
     #echo $2 > /etc/udev/rules.d/remove.txt
     umount /mnt/usb/$2
     rmdir /mnt/usb/$2
    
    단순히 rules 동작만 확인 하고 싶다면 RUN에 주석을 제거 하고 확인 해본다.
  2. 시작시에 udevd daemon이 동작 할 수 있도록 시작 script에 추가
    임베디드 리눅스의 경우 대부분 /etc/init.d/rcS에 추가 하면 된다. udevd --daemon 추가
참고로 busybox에서 제공하는 mdev도 있으니 mdev가 있다면 mdev를 사용하자.

predicate / function object / unary / binary

오후 5:38 Posted by PAN.SPOT , No comments

predicate / function object / unary / binary

용어정리

  • function object(함수객체 Functor) : 클래스에서 연산자 ()를 오버로딩 하여 해당 클래스의 인스턴스를 함수 형태로 호출할 수 있게 한 클래스 객체를 말한다.
  • predicate (술어) : 적어도 하나 이상의 개체를 전달받아서 bool 값을 반환 하는 함수 객체 이다.
  • unary : 단항
  • binary : 이항

STL 템플릿 예제로 확인 해보자.

예제

for_each

std::for_each
template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function fn);

parameters

매개변수를 확인 해보면 아래와 같다. 즉 iterator와 단항 함수 객체를 매개변수로 받는다.
*  @param  __first  An input iterator.
*  @param  __last   An input iterator.
*  @param  __f      A unary function object.

example

// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector

void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}

struct myclass {           // function object type: 
  void operator() (int i) {std::cout << ' ' << i;}
} myobject;

int main () {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  // or:
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';

  return 0;
}
Output:
myvector contains: 10 20 30
myvector contains: 10 20 30
  • int i 하나를 매개변수로 가지고 () 연산자를 오버로딩하여 for_each 3번째 인자인 Function에 전달할 단항 함수 객체를 생성
      struct myclass {           //unary function object type: 
      void operator() (int i) {std::cout << ' ' << i;}
      } myobject;
    
위의 예제에서 function object / unary / binary 3가지에 대해 알아보았으니 predicate에 대해 알아보자.

예제

find_if

std::find_if
template <class InputIterator, class UnaryPredicate>
   InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);

parameters

매개변수를 확인 해보면 , iterator 와 단항 술어 임을 확인 할 수 있다.
*  @param  __first  An input iterator.
*  @param  __last   An input iterator.
*  @param  __pred   A predicate.

example

// find_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector


struct myclass {           // unary predicate 
  bool operator() (int i) {return ((i%2)==1);}
} myobject;

int main () {
  std::vector<int> myvector;

  myvector.push_back(10);
  myvector.push_back(25);
  myvector.push_back(40);
  myvector.push_back(55);

  std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), myobject);
  std::cout << "The first odd value is " << *it << '\n';

  return 0;
}
Output:
The first odd value is 25
  • int i 하나를 매개변수로 가지고 () 연산자를 오버로딩하며 bool을 반환하는 find_if 3번째 인자인 Function에 전달할 단항 함수 개체를 생성 얼핏 보면 위의 예제와 다를 것이 없지만 bool을 반환 하는 함수 객체 즉 predicate라는 것을 알 수 있다.
      struct myclass {           // unary predicate 
        bool operator() (int i) {return ((i%2)==1);}
      } myobject;

2015년 5월 4일 월요일

메모리 계산 쉽게 하기

오전 1:28 Posted by PAN.SPOT No comments

메모리 계산

  • 2^10 = 1kbyte
  • 2^20 = 1Mbyte
  • 2^30 = 1Gbyte
  • 2^40 = 1Tbyte

주소번지로 메모리 용량 쉽게 계산하기

  • 만약 0x0 번지 부터 마지막 주소가 0x7FF이 마지막 주소인 메모리가 있다면?
      0번지 부터 메모리가 사용되므로 (0x7FF - 0x0) + 1  = 0x800
      대부분의 메모리 용량은 2진수로 변환 했을 때 1인 값이 하나밖에 없는 경우가 많다. 
      0x800 -> b100 0000 0000 (2^11 = 2kbyte)

ubuntu 64bit OS 32bit 컴파일 하기

오전 12:09 Posted by PAN.SPOT , No comments

설치

$ sudo dpkg --add-architecture i386 && sudo apt-get update

삭제

$ sudo dpkg --remove-architecture i386 && sudo apt-get update

패키지 설치

$apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386

2015년 4월 22일 수요일

git 삭제된 파일만 되돌리기

오후 4:59 Posted by PAN.SPOT , , No comments
svn을 쓰다가 git으로 넘어온 사람들을 보면 간혹 svn update와 같이 동작 하는것을 원하는 사람들이 있다.
삭제된 파일만 되돌리기를 하고 싶은경우 이다.
즉 여러개의 파일이 있을 때 수정된 파일을 제외 하고 삭제된 파일만 다시 reset 하고 싶을경우 이다.
먼저 UNDO 하는 방법을 알아보자.
1.모든 파일을 되돌릴 때
$git reset --hard HEAD
2.특정 파일만 되돌릴때
$git checkout -- file
2번을 이용하면 특정파일만 되돌릴 수 있으나 파일을 일일이 기입하는 것은 여간 귀찮은일이 아니다. 그래서 돌리고 싶은 파일만 삭제한 후 아래와 같이 입력한다.
$git ls-files -d | xargs git checkout --
파이프와 xargs를 이용한 방법으로 명령어를 해석해보면 다음과 같다.
- git ls-files -d 는 삭제된 파일만 출력한다.
- 파이프라인은 왼쪽에 있는 명령어의 출력을 오른쪽 명령의 입력으로 전달한다.
- 여기에서 xargs를 이용하면 git ls-files -d의 출력 결과를 checkout --의 인자로 전달하여 사용할 수 잇다.
자세한 사항을 알고 싶을경우 xargs에서 -t 옵션을 넣어서 확인해 본다.

2015년 4월 21일 화요일

Gitlab error “fatal: The remote end hung up unexpectedly”

오후 7:00 Posted by PAN.SPOT , No comments
최초 데이터를 push 할 때
"fatal: The remote end hung up unexpectedly"가 난다면?

1.chunked boad size가 작아서 error 나는지 log를 확인 한다.
$ su -
$ vi /var/opt/gitlab/nginx/logs/gitlab_error.log
[error] 23946#0: *885 client intended to send too large chunked body: 524304336 bytes, client: xxxx, server: xxxx
2.gitlab의 nginx max body size를 변경한다.
$ vi /etc/gitlab/gitlab.rb
nginx['client_max_body_size'] = 'XXXm' // XXXmbyte
$ sudo gitlab-ctl reconfigure
3. 로컬 저장소에서 git push 가 제대로 동작하는지 확인
4. 나의 경우에는 너무 큰용량(약 8기가) 이였고, http 프로토롤을 사용 하였기 때문에 git push가 더 이상 error는 나지 않는데 멈춰 있는 현상이 발생하였다. 그래서 ssh프로토콜로 변경 하여  push를 다시 시도 하여서 성공함. http 프로토콜은 느려서 대용량에는 적합하지 않은듯 하다.

참고 ssh 공개키 생성 하여 ssh로 접속하기
$ssh-keygen -t rsa -C "gltlab mail 주소"
$sudo chmod -R 700 ~/.ssh
$cat /home/계정/.ssh/id_rsa.pub
나오는 내용을 복사 하여 gitlab profile의 ssh key 등록에 추가.

만약 ssh포트도 변경해야 한다면?
$ vi /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 2222 // 22 port -> 2222 port
$ sudo gitlab-ctl reconfigure



git ignore 파일 쉽게 만들기

오후 5:45 Posted by PAN.SPOT , , No comments
리눅스 프로젝트를 하게 되면 make시에 각종 object 파일들이 생성되거나 변경 된다. 이 때 git에 적용하지 않을려면 .gitignore 파일에 무시할 폴더나 파일을 기록 하면 되는데 폴더가 많으면 쉽지 않다. 그렇때 아래의 커맨드를 이용해보자.

1. 최초 프로젝트를 make clean 한다.
$make clean 
2. 프로젝트를 git server에 push
$git add -A
$git push
3. 프로젝트를 컴파일 한다.
$make
4. git status를 하면 make시에 생성되는 파일들이 나온다.

5. make 후 생성된 모든 파일들을 .gitignore에 저장한다.
$git status --porcelain | grep '^??' | cut -c4- >>.gitignore
위의 커맨드를 분석하자면, 
git status --porcelain는 svn status 처럼 앞부분에 현재 상태를 출력된다. 
grep '^??'는 첫 단어가 ?? 으로 시작하는 untracked되는 파일들만 grep 한다.
cut -c4 는 앞에 ??를 삭제 하고 .gitignore에 저장하기 위함이다.

6.만약 추가되는 파일 이외에 수정된 파일도 제외 하려면
$git status --porcelain | grep '^ M' | cut -c4- >>.gitignore
7.수정된 파일들은 이미 버전관리 대상이기 때문에 버전관리 대상에서 지워준다.
$git rm -r --cached 제외할파일명
이때 파일은 그대로 남아 있다.
8.버전관리 대상에서 삭제한 파일들 커밋하기
$git commit -m 'delete file'
9.상태확인
$git status





2015년 4월 14일 화요일

/dev/null 과 2 > &1

오전 12:11 Posted by PAN.SPOT No comments

아래의 명령어에서 사용된 것을 하나씩 확인 해보자
backup.sh > /dev/null 2>&1
>(리다이렉션) : 표준 출력을 다음에 위치한 곳으로 우회 시킨다.
/dev/null : 모두 버려라
&j : j가 참조하고 있는곳
0:표준 입력,1:표준출력,2:표준에러

예)
$backup.sh > log.txt
backup.sh의 표준 출력을 log.txt로 보낸다.
$backup.sh 2> err.txt
backup.sh의 표준 에러를 err.txt로 보낸다.

이제 $backup.sh > /dev/null 2>&1 분석해보자.
backup.sh > /dev/null
- backup.sh의 표준 출력을 버려라.
2>&1
- 표준에러를 표춘 출력이 참조 하는곳으로 보내라.
backup.sh > /dev/null 2>&1
- backup.sh의 표준 출력을 버리고 표준 에러는 표준 출력이 참조하는곳(/dev/null)으로 보내라.

2015년 4월 13일 월요일

주기적인 작업 crontab

오후 11:53 Posted by PAN.SPOT No comments
crontab
설정된 시간에 따라 그 시간에 맞는 서비스를 실행 시키는 것
일반적으로 주기적으로 백업이 필요할 때 사용한다.

예약된 리스트
$crontab -l
작업 수정 및 등록
$crontab -e
작업 삭제
$crontab -r

아래의 폴더에 실행파일을 넣으면 끝
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

정밀하게 설정하기
$su - (root 권한)
$crontab -e
분(0-59) 시(0-23) 일(0-31) 월(1-12) 요일(0,7:일요일,1:월요일,.....) 명령어

예)
*/10 1-4 1,3 5 * backup.sh > /dev/null 2>&1

*/10 : 매 10분 간격으로
1-4 : 1,2,3,4 시에
1,3 : 1일과 3일에
5 : 5월에
* : 모든 요일에
즉 : 5/1 5/3일 1~4시 사에서 10분 간격으로 backup.sh을 실행하라는 뜻임.



gitlab backup

오후 11:17 Posted by PAN.SPOT , No comments

#gitlab backup
$sudo gitlab-rake gitlab:backup:create
$sudo ls /var/opt/gitlab/backups

#backup 위치 변경
$sudo vi /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = '변경될 위치'
$sudo gitlab-ctl reconfigure

# limit backup lifetime to 7 days - 604800 seconds
$sudo vi /etc/gitlab/gitlab.rb
gitlab_rails['backup_keep_time'] = 604800
$sudo gitlab-ctl reconfigure

# restoring backup
$sudo cp 1393513186_gitlab_backup.tar /var/opt/gitlab/backups/
# Stop processes that are connected to the database
$sudo gitlab-ctl stop unicorn
$sudo gitlab-ctl stop sidekiq
# This command will overwrite the contents of your GitLab database!
$sudo gitlab-rake gitlab:backup:restore BACKUP=1393513186
# Start GitLab
$sudo gitlab-ctl start
# Create satellites
$sudo gitlab-rake gitlab:satellites:create
# Check GitLab
$sudo gitlab-rake gitlab:check SANITIZE=true

#scheduling a backup
$crontab -e
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

gitlab git-data 위치 변경

오후 11:11 Posted by PAN.SPOT , No comments
git-data의 위치를 A서버에서 B서버로 변경 하려면??

A 서버 = gitlab server
B 서버 = data server (gitlab이 설치되어 있지않은 data server)

1. A서버의 git 계정의 uid와gid 정보를 가져옴.(uid:999,gid:999)
2. B서버에 git 계정을 추가
$sudo adduser --uid 999 git (A서버와 uid,gid를 일치 시킴 일치 시키지 않으면 permission denied 에러에 빠져 헤어나오지 못함.)
3. B서버(data가 저장될) 설정
$sudo mkdir git-data
$sudo chown git:git git-data/
4. B서버 삼바설정
$$sudo gitlab-ctl stop
$sudo system-config-samba (git-data 공유 설정)
$sudo service smbd restart
5. A서버(gitlab이 설치된) 설정
$sudo apt-get install cifs-utils
$sudo mkdir /mnt/git-data
$sudo mount -t cifs -o username=git,password=xxx //B서버주소/git-data /mnt/git-data
※A서버와 B서버의 git계정의 uid,gid를 동일 하게 변경 하였기 때문에 mount를 하면 A서버에도 git-data폴더는 git:git으로 표시된다. 만약 동일하지 않으면 B서버의 git계정의 (uid,gid)가 표기 되며, 이 후 작업 과정에서 permission denied 에러에 빠지게 될 것이다.
$sudo rsync -av /var/opt/gitlab/git-data/repositories /mnt/git-data/
$sudo vi /etc/gitlab/gitlab.rb
  git_data_dir '/mnt/git-data'
$sudo gitlab-ctl reconfigure
6.gitlab-satellites이 생성되었는지 확인
$sudo ls git-data/
7.gitlab 재시작
$sudo gitlab-ctl start
8.fstab 등록
$sudo vi /etc/fstab
//B서버주소/git-data    /mnt/git-data   cifs    username=git,password=xxxx  0   0
9.A서버 재부팅
$sudo reboot



2015년 4월 12일 일요일

gitlab 서버 구축

오후 5:52 Posted by PAN.SPOT , No comments
ubuntu 14.04 버전 (64bit)

1. Install and configure the necessary dependencies
$sudo apt-get install openssh-server
$sudo apt-get install postfix
2. Download the Omnibus package and install everything
$wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.2-omnibus-1_amd64.deb
$sudo dpkg -i gitlab_7.9.2-omnibus-1_amd64.deb
3. Configure and start GitLab
$sudo gitlab-ctl reconfigure
4. Browse to the hostname and login
Username: root
Password: 5iveL!fe

nginx web포트 변경
1. 8000 포트로 변경
$sudo vi /etc/gitlab/gitlab.rb
external_url 'http://localhost:8000'

※ 설치 후 기존 80포트는 apaches 서버로 사용 되고 있었기 때문에 포트를 변경할 필요가 있었다. 이때 생각 없이 8080포트로 변경 후 사용 하였을때, 아래와 같은 에러가 발생한다.
502 GitLab is not responding.
이유는 omnibus gitlab readme에서 확인 할 수 있다.
By default, Unicorn listens at TCP address 127.0.0.1:8080. Nginx listens on port 80 (HTTP) and/or 443 (HTTPS) on all interfaces.
그래서 포트를 8000으로 변경 해서 사용함.

2015년 4월 9일 목요일

C++ 표준

오후 4:52 Posted by PAN.SPOT , No comments
연도
C++ 표준
비공식 이름
2011
ISO/IEC 14882:2011
C++11 (c++0x)
2007
ISO/IEC TR 19768:2007
2003
ISO/IEC 14882:2003
C++03
1998
ISO/IEC 14882:1998
C++98

trac 서버 구축

오전 2:38 Posted by PAN.SPOT , No comments

ubuntu 14.04 기준

1.패키지 설치
$sudo apt-get install apache2
$sudo apt-get install apache2-utils
$sudo apt-get install trac libapache2-mod-python python-setuptools
$sudo apt-get install rcconf

2.apache authorization 파일 생성
최초 생성 시
$sudo htpasswd -c /etc/apache2/authorization.auth 사용자명
사용자 추가 시
$sudo htpasswd  /etc/apache2/authorization.auth 사용자명

3. apache2 trac 설정
$sudo vi /etc/apache2/mods-enable/svntrac.conf

<Location /trac>
SetHandler mod_python
SetEnv PYTHON_EGG_CACHE /home/trac/cache
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir trac경로
PythonOption TracUriRoot /trac
AuthType Basic
AuthName "This is your repository"
AuthUserFile /etc/apache2/authorization.auth
Require valid-user
</Location>

4.프로젝트 폴더 생성
$cd trac경로
$mkdir 프로젝트명
$chown -R www-data:www-data 프로젝트명
$trac-admin 프로젝트명 initenv
   - projectname : 프로젝트명
   - 디비 입력 : 그냥 엔터

5.시작 할때 마다 apache2 실행
$rcconf
apache2 선택

※ 기본 계정인 www-data를 변경 하고 싶다면?
$vi /etc/apache2/evnvars
export APACHE_RUN_USER=여기를 변경
export APACHE_RUN_GROUP=여기를 변경

svn 서버 구축

오전 2:38 Posted by PAN.SPOT , No comments
ubuntu 14.04 기준

1.패키지 설치
$sudo apt-get install apache2
$sudo apt-get install apache2-utils
$sudo apt-get install subversion libapache2-svn
$sudo apt-get install rcconf

2.apache authorization 파일 생성
최초 생성 시
$sudo htpasswd -c /etc/apache2/authorization.auth 사용자명
사용자 추가 시
$sudo htpasswd  /etc/apache2/authorization.auth 사용자명

3. apache2 svn 설정
$sudo vi /etc/apache2/mods-enable/svntrac.conf

<Location /svn>
DAV svn
SVNListParentPath On
SVNParentPath /home/svn
# How to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /etc/apache2/authorization.auth
# Only authenticated users may access
Require valid-user
</Location>

4.프로젝트 폴더 생성
$cd svn경로
$mkdir 프로젝트명
$svnadmin create 프로젝트명
$chown -R www-data:www-data 프로젝트명
$svn mkdir http://192.168.0.232/svn/supernova/trunk -m 'add trunk'
$svn mkdir http://192.168.0.232/svn/supernova/branches -m 'add branches'
$svn mkdir http://192.168.0.232/svn/supernova/tags -m 'add tags'

5.시작 할때 마다 apache2 실행
$rcconf
apache2 선택

※ 기본 계정인 www-data를 변경 하고 싶다면?
$vi /etc/apache2/evnvars
export APACHE_RUN_USER=여기를 변경
export APACHE_RUN_GROUP=여기를 변경

svn merge

오전 12:34 Posted by PAN.SPOT , No comments

● svn merge -r 옵션과 -c 옵션

svn merge -c 130 == svn merge -r 129:130
svn merge -c -130 == svn merge -r 130:129

● merge branches -> trunk 


       







▶ branches에서 수정된 30~34번까지의 내용을 trunk에 적용하려면?
$svn switch trunk URL : 작업사본을 trunk로 변경 (이미 trunk라면 생략)
$svn merge -r29:34 branches URL : 주의 할점은 30번 내용이 적용 될려면 29부터해야한다.

merge완료 후 commit 하면 R35(terminal:둥근모양) 상태가 된다.








▶ 만약 32번 내용만 빼고 merge 하려면?
$svn switch trunk URL : 작업사본을 trunk로 변경 (이미 trunk라면 생략)
$svn merge -r29:31 -r32:34 branches URL 

▶ cherry-pick 옵션을 이용한 리비전 선택 merge
$svn merge -c30,31,33,34 branches URL 

2015년 4월 7일 화요일

linux 쉘 명령어 모음

오후 8:26 Posted by PAN.SPOT No comments
$ll : ls -l
$Pushd : 현재디렉토리저장
$Popd : 저장한 디렉토리로 이동
$Dirs : 
저장된 디렉토리 표시
$chgrp 그룹명 파일또는폴더 :  그룹 변경
$df : 마운트된 파일 시스템의 사용 가능한 공간 확인
$du : 디렉토리의 파일용량
$free : 현재 메모리 사용량 및 사용가능한 메모리
$w : 현재 로그인한 사용자가 무엇을 하는지 알려줌 
$tty : 시스템에서 연결되어 사용하는 터미널 경로

svn url 변경

오후 7:07 Posted by PAN.SPOT , No comments
서버 저장소 주소 변경
$svn relocate

branches <-> trunk 간 주소 변경
$svn switch
   - switch는 하나의 로컬작업 저장소에서  branches로 일시 전환 했다가 trunk로 전환 할때 사용 한다.

svn 충돌 해결법

오후 6:54 Posted by PAN.SPOT , No comments

(e) edit - 병합된 파일을 편집기로 열기 
(df) diff-full - 병합된 파일을 보기 
(r) resolved - 병합된 파일을 채택하기 
(dc) display-conflict - 모든 충돌 사항을 보이기(잘 병합된 부분 제외) 
(mc) mine-conflict - 충돌 부분에 대하여 작업사본을 선택하기 
(tc) theirs-conflict - 충돌 부분에 대하여 저장소본을 선택하기
(mf) mine-full - 충돌난 파일에 대하여 작업사본 파일을 선택하기
(tf) theirs-full - 충돌난 파일에 대하여 저장소본 파일을 선택하기
(p) postpone - 나중에 해결할 것으로 표시해두기
(l) launch - 외부 툴을 실행하여 충돌을 해결
(s) show all - 옵션을 모두 출력

apt-get

오후 6:37 Posted by PAN.SPOT , No comments
apt-get(Advanced Packaging Tool)은 우분투(Ubuntu)를 포함안 데비안(Debian)계열의 리눅스에서 쓰이는 패키지 관리 명령어 도구입니다.

패키지 인덱스 인덱스 정보를 업데이트 : apt-get은 인덱스를 가지고 있는데 이 인덱스는 /etc/apt/sources.list에 있습니다. 이곳에 저장된 저장소에서 사용할 패키지의 정보를 얻습니다.
$sudo apt-get update

설치된 패키지 업그레이드 : 설치되어 있는 패키지를 모두 새버전으로 업그레이드 합니다.
$sudo apt-get  upgrade

의존성검사하며 설치하기
$sudo apt-get dist-upgrade

패키지 설치
$sudo apt-get install 패키지이름

패키지 재설치
$apt-get --reinstall install 패키지이름

패키지 삭제 : 설정파일은 지우지 않음
$sudo apt-get remove 패키지이름

패키지 삭제 : 설정파일까지 모두 지움
$sudo apt-get --purge remove 패키지이름

패키지 소스코드 다운로드
$sudo apt-get source 패키지이름

위에서 받은 소스코드를 의존성있게 빌드
$sudo apt-get build-dep 패키지이름

패키지 검색
$sudo apt-cache  search 패키지이름

패키지 정보 보기
$sudo apt-cache show 패키지이름

apt를 이용해서 설치된 deb패키지는 /var/cache/apt/archive/ 에 설치가 됩니다.