/etc/init.d/tomcat7 start
/etc/init.d/tomcat7 stop
/etc/init.d/tomcat7 restart


booting시에 자동으로 시작하는 기능은

$ sudo update-rc.d tomcat(7) defaults


제외는

$ sudo update-rc.d -f tomcat(7) remove

라고 입력합니다.


 

CentOS는 여기 참조: Ref-Site

Posted by yongary
,

hostname 변경

Linux 2014. 11. 14. 17:29

[Redhat계열] Linux hostname변경

$ hostname    : 이건 그냥 조회

$ hostname   abc_server   : 이렇게 세팅가능하며,  리부팅이 되면 원복이 되는 문제점 존재.


리부팅 시에도 적용되게 하려면

/etc/sysconfig/network  여기서 

HOSTNAME=abc_server 이렇게 수정하도록 한다.

Posted by yongary
,

autoFTP.sh

Linux/Linux:sh개발 2014. 10. 29. 11:02

ftp에 접속해서 파일을 다 가져오는 shell script는 다음과 같다.

여기서 EOF 대신에 ENDFILE등 다른 임의의 단어를 사용해도 된다.

 

 

< autoFTP.sh 내용>

 

ftp -n 127.0.0.1 << EOF
user root pass1234
cd ftpserver
prompt off

binary
mget *.out
bye
EOF

Posted by yongary
,

 

흔히 보는 linux의 파일권한 type은 다음과 같다.

-rwsrwsrwt 

 

1. 여기서 현재 '-'로 표시되어 있는
첫 글자가 c/b인 경우라면 device file을 뜻한다. 

(모두 나열하면)
     c:
캐릭터 입출력하는 device

b: 블록 단위로 입출력하는 device
p: named pipe

s: socket
D: door

 

2. 그리고

 네번째, 일곱번째 글자가 s일경우 set-uid 또는 set-gid 비트임.
  
돌리는 동안 잠깐 super (root)가 된다. ps로 확인 가능
    (/
usr/bin/passwd 참고. ) 보안체크시 필수체크항목


3. 마지막 글자가

 

 

  t:sticky  폴더는 타인이 못지우게  /tmp/

 

 

 

 

0. 추가적으로 옵션설정방법:

chmod 에 6777 옵션을 줄 수 있는데

처음 6표시된 자리는

  4: set-uid

  2: set-gid

  1: sticky

과 같은 용도로 사용한다.

Posted by yongary
,

iNode 구조

Linux 2014. 10. 28. 17:34

Linux 및 unix에서는 파일이

 

[File: inode번지] 로 관리가 된다.  (ls i 하면 inode 조회 가능하다) 

 

여기서 inode번지는

è   <inode table 구조>    를 참조하게 된다: (ls –l하면 나오는 정보들이라고 보면 된다)
1File Type
2Permission
3Hard Link Count
(inode 번지 복사) 하드링크시 사용. ( 용법:  ln f1 f2 이며 그 후에 :  rm f1 해도 됨. ) 
                
, 파티션이 다르면 번지중복으로 사용 불가
4Owner
5Group
6Size
7Time
8Point 
à data block저장소를 가르킴
              
symbolic link의 경우 point에 원본위치 있음 (ln -s f1 f2 로 지정)

 Symbolic link
장점: 1. 디렉토리도 된다
                            2.
파티션 달라도 된다.


 

solaris에서는 하드링크를 주로 사용하고

linux에서는 심볼릭 링크(소프트 링크)를 주로 사용하게 된다.

 

 

Posted by yongary
,

Linux Run_Level

Linux 2014. 10. 28. 17:31

 

LINUX RUN LEVEL

<부팅 순서>

1. POST    (파워스위치?)
2. Kernel   
3. init  ( PID 0) => /etc/inittab 참고 함

 

Run-level

0  linux:halt   solaris: PROM모드

1  Single모드

2  Multi user 모드 (약간 제외 – NFS, samba제외)

3  Multi user 모드 모든서비스 가동

4  X

5. GUI까지 구동( linux에만 존재)

 

 

/etc/init.d/ 원본script가 있는데
/etc/
rc1.d/kxxx sxxxx   로 링크 함.
    (
rc1=runLevel  K=stop,  S=Start 프로세서 )
    rc2, rc3….
여러 링크 폴더 존재
    
run_level 스테이징 순서대로 구동 됨.

Posted by yongary
,

remount

Linux 2014. 10. 21. 11:51


linux 커널을 빌드해서 설치하다 보니

/etc가 read-Only인 경우가 발생했다. 

=> (원인은 cloud다 보니, XenServer 에서 발생.. /var/log/messages에 blkfront: barrier: empty write xvdb op failed )


확인:  

$ cat /proc/mounts  해보면  

 /dev/xvda3 / ext3 ro,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0

이렇게 ro가 보인다. 


$cat /etc/fstab 해보면 부팅시 mount되는 type /위치를 알 수 있다. 


이 때 remount를 하면 되는데

$ mount -o rw,remount -t ext3 /dev/xvda3 / 

   =>  mount: cannot remount block device /dev/xvda3 read-write, is write-protected 

또 에러가 난다.



제대로 된 remount를 하려면

/etc/fstab 에다가 옵션이 defaults일 경우 ext3 rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 라고 가정하고

 옵션을 defaults ==>  ext3 rw,relatime,errors=continue,user_xattr,acl,barrier=0,data=ordered 으로 수정해서 한번 해본다. 


Posted by yongary
,

ubuntu 14.04 chkconfig

Linux 2014. 10. 17. 13:51

기존에는 chkconfig이란 명령어로 init.d 데몬들을 관리했지만


ubuntu 14.04부터는

update-rc.d 명령어로 하게 되었다.


만약 tomcat7을 startup시에 실행하고 싶지 않다면


$ update-rc.d   -f  tomcat7  remove


로 하면된다.

Posted by yongary
,

Linux 커널 빌드

Linux 2014. 10. 14. 11:47

Linux 커널 빌드



소스를 받은 후에


1) $ uname -r 해서 현재 linux 커널 버전 확인

   2.6.32-281-blabla.


2) 필요시에만.. 즉 재빌드 하는 경우 등에 이전 빌드 clean해 놓기

  $make clean && make mrproper    


3) 현재 config을 .config로 복사 

cp /boot/config-2.6.32-281-blabla ./.config

4)

$make menuconfig 해서 GUI화면이 뜨게 되면 그냥 exit하면서 save=Yes 로 답하면 됨.


5)

$make all   (혹은 make -j4 all :   4 core cpu일 경우 4배 빨리 build)



6)혹은 rpm으로 build하기 위해서는 rpm-build 툴이 깔려있어야 한다. 그 후에 (   예)yum install rpm-build ) 

$make rpm



해당 rpm을 설치시에는

$rpm -ivh kernel-x.x.xxblabla.rpm 하면 됨.



<개인적인 firmware conflict발생 및 conflict해결>

$yum list kernel kernel-firmware

$yum remove kernel kernel-firmware.noarch  까지 해서 해결.

 


<설치 완료후 grub설정 을 하려는데..> 

1. initramfs파일이 /boot에 없어서

  $dracut initramfs-2.6.39.4.img 2.6.39.4


2. /boot/grub/grub.conf 수정.

- 0번자리(즉 윗자리)에 4줄 복사해서 추가하고   vmlnuz-버전과  initramfs 버전 수정. 

Posted by yongary
,

netstat 명령어 활용

Linux 2014. 10. 8. 14:35

Linux에서 네트웍 진단이나 통계시에

netstat 커맨드가 매우 유용하게 쓰인다.



netstat에는 여러가지 옵션이 존재하는데, 이 중에서 비교적 많이 쓰게 되는 옵션은 다음과 같다.


  -   netstat -nap  (n:숫자로 표시,  a:all,  p:프로세스 ID)  : 즉 프로세서별로 통계

  -   netstat -ntl  (tcp 리스닝),  -nul (udp 리스닝)  : tcp/udp 리스닝 상태

  -   netstat -su (s:통계, u=udp)   : udp통계  



  그 외에 nmap이라는 유틸리티를 설치할 경우 특정 IP에 대한 상대방 진단이 가능한데

 사용법은 

   -   nmap -sU -p 100-2000 +상대ip   (s:스캔,  U=UDP  -p: 포트대역)

Posted by yongary
,

TCP UDP 버퍼 길이 확인

Linux 2014. 10. 8. 10:29

특정 기능을 개발하다 보면,

TCP나 UDP의 버퍼길이까지 튜닝하여야 하는 경우가 발생한다.  (예: heartbeat 데몬 등)


이 때 TCP/UDP의 버퍼길이 조정을 하는 api는 주로 setsockopt를 통해 하게 되는데

min이나 max가 제한되어 있으므로 이를 미리 확인하는게 좋다.


Linux에서


/sbin/sysctl -a   | grep net.core 와

/sbin/sysctl -a   | grep net.ipv4 로 확인이 가능하다.



//아래 예제에서 wmem:sendBuf,  rmem: receive Buf

net.core.wmem_max = 5242880   

net.core.rmem_max = 5242880

net.core.wmem_default = 2097152

net.core.rmem_default = 2097152


net.ipv4.tcp_mem = 196608       262144  393216

net.ipv4.tcp_wmem = 16384       122880  204800

net.ipv4.tcp_rmem = 16384       122880  204800


net.ipv4.udp_mem = 761952       1015936 1523904

net.ipv4.udp_rmem_min = 2097152

net.ipv4.udp_wmem_min = 2097152




아직 테스트 중이라 확실치 않은 부분이 있긴한데

setsockopt 함수를 사용하면 sendbuf는 2048, receiveBuf는 256까지 min으로 설정이 되는 것으로 보인다.

 (설정값 *2 로 세팅이 되므로 함수 호출시에는 그 반으로 해야함) 

Posted by yongary
,

redis를 사용하는 유명회사들에 대해선

redis.io 웹사이트에 다음과 같은 회사들이 언급되어 있다.


Blizzard에서 Wow 아바타 서비스에도 사용한다고 하는데 아직 확실치는 않다..

Posted by yongary
,

SW Engineering

IT 2014. 9. 29. 08:54

소프트웨어 공학의 최근 흐름으로는 관점 지향(Aspect), 애자일(Agile), 모델 주도(Model-Driven) 등이 있다.



Agile 방법론의 기본 개념 "반복적으로 프로토 타입을 고객에 전달함으로써 고객의 요구사항 변화에 민첩하게 대응한다"


Agile 방법론의 대표주자XP(익스트림 프로그래밍) 




XP(익스트림 프로그래밍) 개발 프로세스 :


XP의 목적은 '고객이 원하는 양질의 소프트웨어를 빠른 시간안에 전달하는 것'이다. 
수시로 발생하는 고객의 요구사항에 대처하고, 고객이 원하는 SW를 고객이 원하는 시간에 인도하기 위해서는 고객과 팀원간의 대화를 통해 해결한다.


XP에는 7가지 항목이 정의되어 있는데, 7가지 항목 중 특히 공감이 가는 항목은 아래와 같이 4항목이다.

1.Simple-Design

2.Test-Driven

Test_driven은 다른 애자일 방법론과 구분되는 XP만의 특징이기도 하다.

프로그래머들이 코딩을 할 때에, 테스트 코드를 작성하도록 함과 동시에 테스트를 기반으로 프로젝트를 완성시켜 나간다.

3. Pair-Prograimming 

두명 혹은 그 이상의 프로그래머가 함께 코딩을 하는 것을 말한다. 두명의 프로그래머가 함께 코딩을 하고 테스트를 통해서 개발을 할 수도 있고, 한명은 코딩을 하고 한명은 Quality Assurance 역할 통해서 테스트에만 집중을 할 수도 있다.

4. Whole-Team 

기획자, 설계자 심지어는 Tester, User까지도 하나의 팀이 되어 개발을 진행하는 방법이다.


나머지 3항목은 

Planning Game, Small Release, Customer Test이다.








Posted by yongary
,

Linux 버전 확인

Linux 2014. 9. 26. 16:50

Linux kernel 버전 확인:  uname -a    
                                 or  lsb_release -a


OS 버전 확인:

redhat계열:  cat /etc/redhad-release

ubuntu 계열:  cat /etc/issue

Mac: sw_vers

 

32 / 64 bit 확인 :

$ getconf LONG_BIT 

 


 


 

Posted by yongary
,

vim 탭설정

Linux 2014. 9. 25. 10:43

vim 에디터가 요즘 대세인데. 탭 기능이 다소 불편할 수 있다.


Vim에서는 Ctrl+Tab단축키(혹은 linux에서 Ctrl+Shift+Tab단축키)가  기본적으로는 분할된 (:sp 명령어로) 화면간 전환에 쓰이기 때문인데..



개인적으로 애용하는 방법은

.vimrc 파일에  아래와 같이 3줄 추가하는 것이다.


map  <C-l> :tabn<CR>

map  <C-h> :tabp<CR>

map  <C-n> :tabnew<CR>



Windows의 경우에는 

C:\Program Files\Vim\_vimrc 파일에 추가.

 

 

기타 특수명령어

 Shift + j   :  라인구분(엔터키)가 하나씩 없어진다

set list  / set unlist  :  특수키를 다 구경할 수 있다.

Posted by yongary
,

redis를 HA로 구성했을 경우, SDR(spring-data-redis 1.4) 와 jedis커넥션을 이용한 spring과 redis 연동.


RedisSentinelConfiguration 클래스를 이용하면, HA를 지원하는 redis의 이중화 상태에서도 spring을 이용한 redis연동이 가능하다.

java코드로 연동하는 방법은 여러곳에서 나와있으므로, 본 글 에서는

xml을 이용한 DI(Dependency Injection)방식으로   spring과 HA redis를 연동하는 방식을 설명한다.



1. pom.xml 수정   (SDR , jedis를 추가)

이전글과 동일하다. 단 common-pool 대신에 이를 상속받은 JedisPoolConfig을 써봄으로 인해 common-pool은 제거.


<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-redis</artifactId>

<version>1.4.0.RELEASE</version>

</dependency>


<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.5.1</version>

<type>jar</type>

<scope>compile</scope>

</dependency>




2. application-config.xml 수정


2.1 네임스페이스에  xmlns:p,c, util 추가.


2.2.1 mymaster와 setntinels을 xml로 구성


2.2.2 RedisSentinelContiguration을 이용해서 HA구성.

         => SDR에 미흡한 부분이 하나 존재하여, MySentinelConfiguration  를 별도로 생성해서 이용하도록 함.

             (이유는 아래 xml의 코멘트 참조)   


2.2.3 jedis를 이용한 Pool과 connection구성.


이렇게만 하면 이전 예제와 동일하게 그냥 redisTemplate만을 이용해서 개발하면 자동으로 HA구성을 지원하는 개발이 된다.




<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:c="http://www.springframework.org/schema/c"

xmlns:util="http://www.springframework.org/schema/util"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">


<!-- Uncomment and add your base-package here:-->

<context:component-scan base-package="my"/>


<!-- myster -->

<bean id="myMaster" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="6379" p:name="mymaster"/>


<!-- Sentinels -->

<bean id="mySent1" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="26379"/>

<bean id="mySent2" class= "org.springframework.data.redis.connection.RedisNode" c:host="127.0.0.1" c:port="26381"/>

<bean id="mySents" class= "java.util.HashSet">

 <constructor-arg>

  <list>

   <ref bean="mySent1" />

   <ref bean="mySent2" />

  </list>

 </constructor-arg>

</bean>


<!-- RedisSentinelConfiguration: org.springframework.data.redis.connection.RedisSentinelConfiguration" 

2.2.2 이 부분이 유일하게 아직 SDR에서 미흡한 부분이다.  이 부분은 ReidsSentinelConfiguration class 가 

getter와 setter 파라미터가 다른 오류가 발생하므로, 자체 class를 하나 만들어서 해결하였다.

-->

<bean id="redisSentinelConf" class="my.MySentinelConfiguration"

p:master-ref="myMaster"

p:mySentinels-ref="mySents"

/>

<!-- p:sentinels-ref="mySents" : ERROR 발생-->



<!--2.2.3 POOL & Connection-->

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"/>

<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"

    p:use-pool="true"

    p:poolConfig-ref="jedisPoolConfig"

    c:sentinelConfig-ref="redisSentinelConf"

/>

<!--p:host-name="127.0.0.1" p:port="6379" -->



<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

<!-- redis template definition -->

<bean id="redisTemplate"

class="org.springframework.data.redis.core.RedisTemplate"

p:connection-factory-ref="jedisConnFactory"

p:keySerializer-ref="stringRedisSerializer"

p:hashKeySerializer-ref="stringRedisSerializer"

p:valueSerializer-ref="stringRedisSerializer"/>

</beans>





3. JAVA  코드 - 유일하게 추가한 MySentinelConfiguration코드이다.  추가만 해 놓으면 된다.


- 단지, SDR의 getter와 setter의 오류를 피하기 위한 클래스이다. 향후에는 SDR에서 개선이 될 것으로 기대된다.


public class MySentinelConfiguration extends RedisSentinelConfiguration {

MySentinelConfiguration(){

super();

}


public Set<RedisNode> getMySentinels(){

Set<RedisNode> sets=super.getSentinels();

return sets;

}


public void setMySentinels( Set<RedisNode> sentinels){

super.setSentinels(sentinels);

}


}


Posted by yongary
,

spring과 redis연동

Spring 2014. 9. 18. 09:26

SDR(spring-data-redis) 와 jedis커넥션을 이용한 spring을 이용한 redis 연동.


spring에서 redis를 연결하기 위한 기본적인 방법을 커넥션 위주로 설명.

실제로는 redis에 저장할 데이타 class를 별도로 만들어 serialize기능을 이용해 {key,class}형태로 저장하는 방식이 바람직하지만, 여기서는 이 부분은 생략하고 기본적인 연결과정만 설명한다. 


1. pom.xml 수정   (SDR , common-pool,  jedis를 추가)


<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-redis</artifactId>

<version>1.4.0.RELEASE</version>

</dependency>

<dependency>

<groupId>commons-pool</groupId>

<artifactId>commons-pool</artifactId>

<version>1.6</version>

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

<version>2.0</version>

</dependency>

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.5.1</version>

<type>jar</type>

<scope>compile</scope>

</dependency>






2. application-config.xml 수정


2.1 네임스페이스에  xmlns:p 추가.

2.2  jedisConnnection, Serializer, redisTemplate 추가.


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <!-- Uncomment and add your base-package here:-->

    <context:component-scan base-package="my"/>


<bean id="jedisConnFactory"

    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"

    p:use-pool="true" p:host-name="127.0.0.1" p:port="6379" />


<bean id="stringRedisSerializer"

    class="org.springframework.data.redis.serializer.StringRedisSerializer"/>


<!-- redis template definition -->

<bean id="redisTemplate"

class="org.springframework.data.redis.core.RedisTemplate"

p:connection-factory-ref="jedisConnFactory"

p:keySerializer-ref="stringRedisSerializer"

p:hashKeySerializer-ref="stringRedisSerializer"

p:valueSerializer-ref="stringRedisSerializer"/>


</beans>



  이 중에서 serializer는 추가하지 않아도 동작은 잘 되지만, 

 기본 serializer로 동작하게 되면 redis에 데이타가 들어갈 때, 앞 부분에 xac xed x00 x05t x00 등의 character가 몇개 들어가게 된다.

(이런 이상한 캐릭터들은 standard serializer에서 사용하는 class정보이다.)




3. JAVA Service 코드


 @Service

public class RedisService implements IRedisService{


@Autowired

private RedisTemplate<String,String> redisTemplate;


public Set<String> keysAll() {


//값을 넣고 싶을 땐, 이렇게..

//redisTemplate.opsForValue().set("abcKey", "valueABC");


return redisTemplate.keys("*");

}



}     


Posted by yongary
,

redis 실행법

mongoDB, redis 2014. 9. 16. 17:49

redis 설치 완료 후, src 폴더로 이동해서


1. stand-alone 모드 실행.

./redis-server  로 서버실행

./redis-cli  로 client 실행.

==> stand alone 모드로 default세팅 되어 실행된다.


reds> info          하면 정보 조회가능(데이타 개수도 있음)

redis>  keys *     하면 모든키 조회 가능(데이타가 많을경우는 조심)

 1)"MPx_TYPE_Audiox"  

 2)"FS_HB"

 3)"MP_TYPE_CTRL"
 4)"XCOD_ROOM_x"

 5)"CNFR_ROOM_x"

 

 



2. 마스터-슬레이브 모드

만약, master-slave모드로 테스트를 해보고 싶으면  redis-server를 아래명령으로 하나 더 실행한다.


$>./redis-server --port 6380 --slaveof 127.0.0.1 6379    



혹시, 이 상태에서 상태를 확인해보고 싶으면 client창에서


127.0.0.1:6379>  info  를 입력하면

#Replication 영역에

role:master

connected_slaves:1

      임을  을 확인할 수 있다.  즉 6379서버의 slave가 잘 뜬 것이다. 




3. Sentinel감시를 통한 HA 구성


위의 1,2번이 된 상태에서  아래와 같이 sentinel을 2개 정도 실행시키고....

$> src/redis-server sentinel1.conf --sentinel

$> src/redis-server sentinel2.conf --sentinel

==> 이러면 기본적인 HA완성.


이 때 1번 서버를 kill등으로 죽이면, 절체(HA)가 발생한다.


절체발생 후, 

client는 새로이 아래와 같은 명령으로 접속한다. 즉 2번 서버로 접속한다. 

$> redis-cli -p 6380  



ㅁ 좀 더 쉽게 절체를 발생시키는 방법은

redis-cli -p 26379 로 센티널로 cli접속을 한 다음에

>  sentinel failover mymaster    를 입력하면 바로 절체가 발생한다. 


  ( http://redis.io/topics/sentinel  참조)

  







 

Posted by yongary
,

vi에디터 한글세팅

Linux 2014. 9. 16. 17:12

한글인코딩을 euc-kr로 할지, utf-8로 할지 고민이 되는 경우,

한국에서만 쓸 것이라면 둘 다 상관이 없고 euc-kr이 좀 더 나을 수도 있을 것 같고

혹시 외국에서도 쓸지 모른다는 생각이 든다면 utf-8이 좋을 것 같다.


대세는 utf-8이라고 보고.. utf-8로 세팅하는 방법을 보면 다음과 같다.


$> env  혹은 locale 을 해보면  os의 LANG을 알 수 있다.

대부분 xx_xx.utf-8 로 되어있다면 문제가 없다.


1. vi 에디터에서 파일변환

:set fileencodings=utf-8  후에 :w 하고 다시 시작.



2. 프롬프트 상에서 파일변환은

iconv  -f euc-kr -t utf-8   euc-kr.html > utf8.html



혹시 

3. vi에디터에서 안보이면

:set enc=utf-8 




참고:   http://www.technet.co.kr/bbs/board.php?bo_table=tip&wr_id=263&page=3 

인코딩 설명:  http://helloworld.naver.com/helloworld/19187 

Posted by yongary
,

< 함수의 실행시간을 milisecond단위로 측정하는 방법. > 



struct timeval을 이용하여 함수의 실행시간을 측정하는 방법인데,


 struct timeval은 초와 micro초로 이루어져 있으므로,

- 초에는 *1000을 

 - micro초에는 /1000 을 해야 milisecond가 된다.


struct timeval { long tv_sec; // 초 long tv_usec; // micro }



=======사용예제================================================

#include <sys/time.h>


struct timeval before,after;  //선언


//사용 
    gettimeofday(&before,NULL);
    run_my_function( );
    gettimeofday(&after,NULL);

    printf("function running time[ms] : %ld\n",
         1000*(after.tv_sec-before.tv_sec) +   
         (after.tv_usec-before.tv_usec)/1000);





Posted by yongary
,


Linux에서 c언어 개발 중,


make는 완료 했으나

실행 중에 .so(공유 library)를 못 찾는 경우 다음과 같이 해결하면 된다.

(이 때, 에러메시지:  cannot open shared object file - no such file or directory)



(UBUNTU)

1. /etc/ld.so.conf.d/  밑에  myApp.conf 파일 추가

2. myApp.conf 파일 첫 줄에

  /usr/lib/myApp/lib  과 같이 특정한 위치 지정    

3. sudo ldconfig (Reload임)



(Debian)

1. /etc/ld.so.conf 편집

2. 마지막 줄에 /usr/lib/myApp/lib 과 같은 특정한 위치 추가

3. ldconfig (Reload임)    (조회는 ldconfig -v)



참조: http://blog.andrewbeacock.com/2007/10/how-to-add-shared-libraries-to-linuxs.html 



또다른 간단한 방법으로는

run 쉘스크립트를 하나 만드는 것이다.


#!/bin/bash

LD_LIBRARY_PATH=/home/myid/common/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

./test_program

Posted by yongary
,

spring을 이용해서 mongoDB를 연동할 경우 방법은 다음과 같다.


1. pom.xml 수정 : spring-data-mongodb 추가


         <dependency>

       <groupId>org.springframework.data</groupId>

       <artifactId>spring-data-mongodb</artifactId>

       <version>1.5.1.RELEASE</version>

</dependency>

        

      참고: http://projects.spring.io/spring-data-mongodb/

      




2. application-config.xml 수정.   ( 주로 resources/spring/ 밑에 위치)


    2.1 네임스페이스 수정   :  xmlns:mongo 한 줄 및  xsi:schemaLocation 2줄 추가.

    2.2 mongo:db-factory 추가 및  mongoTemplate 추가



   <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mongo="http://www.springframework.org/schema/data/mongo"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/data/mongo

        http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">

    

<!-- Uncomment and add your base-package here:-->

    <context:annotation-config /> 

    <context:component-scan base-package="my"/> 

   

    <mongo:mongo host="localhost" port="27017"/>

    <mongo:db-factory   dbname="kcdb"/>   


    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">

 <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>

    </bean>  

</beans>





3. Vo(value object) 와 유사한   java파일 작성. ( @Document와  @Id를 포함하도록 한다. )

       

    @Document    //mongoDB에서 persistent한 도메인으로 인식하게 되는 어노테이션. 즉 테이블로 인식.

     public class User{


@Id       // mongoDB의 테이블(category)에서 데이타별 고유id로 자동생성 되는 id에 매핑하기 위함) 

private String id;


private String username;


//setters & getters ... 

}




4. Service에서 mongoTemplate를 이용한 query작성.

 

  @Service

  public class MongoService implements IMongoService{


@Autowired

private MongoTemplate mongoTemplate;

     

  public User getUser(String userName) {


Query query = new Query( where("username").is(userName) );

User user=mongoTemplate.findOne(query, User.class);

return user;

}


   }

Posted by yongary
,

스마트폰을 이용한 서비스를 개발하다 보면

DB에 사용자를 저장하거나, 사용자별로 정보를 관리하거나 하기 위해서 사용자의 고유ID가 필요하게 된다.


고유ID로 제일 쉬운 방법으로는


1. 회원ID: 회원가입 유도 후 사용자별 ID생성  (혹은 eMail ID 등) 


그러나 회원가입 자체를 부담스러워 하는 서비스도 많으므로,

회원가입없이 유저별로 구분을 하려면

2, 3, 4번과 같이 전화번호나 기기의 고유번호를 사용할 수 있다.


2. MSISDN: 전화번호  =  국가코드(82) + 전화번호(010-1234-5678 )      

3. IMSI: 통신사가입 아이디(15자리) = MCC(3자리) + MNC(2~3자리) + MSIN(9~10자리)   

                                            = 450(한국) + 05(특정이통사) + 1234567890


4. IMEI :  하드웨어 고유값 (15자리) - 휴대폰에서  *#06# 을 입력하면 확인 됨.  
                                              (전화통화를 위해서 기기에 꼭 필요)



(최근에는 주민번호에 이어 전화번호도 수집하지 못하게 한다는~~

그리고 2,3,4번의 경우 WiFi전용 갤플레이어나 IPod 같은 경우 값이 없다,

 - 2,3번은 USIM카드에 있고, 4번은 usim장착이 가능한 기기에 박혀 나옴)


따라서 스마트폰 뿐 아니라 WiFi전용기기도 수용하는 서비스의 경우에는 아래 5번을 이용하는 방법을 고려한다.


5. android_ID 및 인스턴스ID( IOS)

   => 기기 초기화나 리셋시에 값이 바뀌는 문제는 존재



요약하면, 모든 상황을 커버할 수 있는 최적의 고유ID는 없으므로

서비스의 상황에 가장 적합한 항목을

상기 항목들 중에 선택해서 서비스를 개발해야 할 것이다.  




     

Posted by yongary
,

우분투 14.04 LTS를 설치하고 나서 눈에 띄는 불편함 및 해결 포인트는 


1. 터미널은 어떻게 실행하지?

   CTRL+ALT+T 로 실행.

   ->  한 번 실행만 하면, 사이드 바에 뜨므로 이 때 사이드 바의 아이콘에 우측마우스를 클릭해서 고정이 가능하다.



2.  한글입력이 안된다. (혹은 한영 전환이 안된다)

   - 상단 status바에 한글(태극기 마크 아이콘)을 우측클릭한다.

   - "텍스트 입력창 설정..." 메뉴를 선택한다.

   -  좌측 사용할 입력 소스:  에다가 영어(혹은 English)를 추가한다.

      => 우측 소스 전환시 키를 바꿀 수 있다.  (보통 Shift + 스페이스  선호.)



3. 화면밝기 조절이 안된다. 

   - Intel 그래픽 카드로 설정이 안되서 그런 경우..    아래 파일 추가.

    $> vi  /usr/share/X11/xorg.conf.d/20-intel.conf

  Section "Device"

Identifier "card0" Driver "intel" Option "Backlight" "intel_backlight" BusID "PCI:0:2:0" EndSection

     ( http://itsfoss.com/fix-brightness-ubuntu-1310/  참고)




4. 밝기 조절은 되지만, 껐다 켜면 reset이 되는 경우.  
   ( xbacklight 를 설치하고,   .profile에 값 설정.)


    - sudo apt-get install xbacklight

- 홈 디렉토리의 .profile에 xbacklight -set 40 이라고 삽입. (값은 0~100 백분률임)



5. ipv6관련 오류가 한번씩 뜨는 게 감지되어서 ipv6 disable. (이것으로 인해 대기모드나 절전모드로 자동으로 한번씩 빠졌음) 


$> vi /etc/sysctl.conf

해서 아래 3~4줄 추가.    

#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

   시스템 rebooting 후

   $>  cat /proc/sys/net/ipv6/conf/all/disable_ipv6  해보고,

       1  

    이라고 나오면 정상적으로 ipv6기능이 disable된 것임.



==>(한달 후)  추가적으로 특정 wifi에 접속시 avahi데몬 오류가 나는 경우도 발생되어

/etc/avahi/avahi-daemon.conf  에서 use_ipv6=no 로 수정.



Posted by yongary
,

Ubuntu설치 완료 후, windows를 설치하고 싶어졌다.

windows 노트북이 따로 있긴 하지만, 휴대성이 불편해서 간혹 필요할지도 모르는 windows를 설치하게되었다.



1. Windows용 NTFS 파티션 확보 필요.


  - 우분투의 /home 폴더를 분할해서 NTFS파티션 확보 필요

  - 우분투에 Gparted를 설치해서 파티션을 분할하면 되지만, Gparted에서 /home영역은 마운트 해제가 되지 않는다.

        => 왜냐하면, 로그인한 유저가 /home을 사용하고 있기 때문이다.


  - 그래서, 부랴부랴 새로운 유저를 /tmphome이라는 폴더를 home 사용하도록 만듦.

     $> adduser tmpuser -d /tmphome      참고) http://mintnlatte.tistory.com/256 


  - 그 후 tmpuser로 로그인해서, Gparted에서 마운트해제 후  파티션을 재조정 함.    (Windows NTFS용으로 주 파티션 24G 확보)



2. WIndows USB를 만들어서, Windows 설치.

   

   - 자세한 사항은 고수분들 사이트 참조:       http://deviantcj.tistory.com/469      http://jjorae.com/posts/394  




3. WIndows 설치가 완료되면 항상 Window로 부팅이 됨. boot-repair를 설치하여  GRUB 수정 필요 

  

     boot-repair설치 명령이 14.04에서 좀 바뀜. ( http://askubuntu.com/questions/449428/unable-to-locate-package-boot-repair-in-14-04 )

   - sudo add-apt-repository ppa:yannubuntu/boot-repair

- sudo sh -c "sed -i 's/trusty/saucy/g' /etc/apt/sources.list.d/yannubuntu-boot-repair-trusty.list"

- sudo apt-get update sudo apt-get install -y boot-repair && boot-repair



4. 완료. 

Posted by yongary
,

오랜시간 개발환경을 windows PC에서만 유지하다가,

redis등을 테스트하면서 windows에 한계를 느껴 (redis 최신버전에 windows는 미지원)

Linux로 개발환경을 구축하기로 결정하였다.


1. 노트북 결정

 - 화면이 작은 노트북을 선호하는 관계로 Lenovo S210 i3 모델로 결정. 

 - 128G SSD 장착. (ideaPad S210이 좀 작은 SSD로 볼 수 있는 m-SATA를 지원하는 줄 알았다가 약간 실망)

 


2. Linux 결정 

 - Linux 서버로는 Redhat계열인 CentOS도 많이 쓰이지만, Desktop버전은 ubuntu가 대세로 판단.

 - 최신 버전인 Ubuntu14.04 LTS( Long Term Support : 즉 안정화된 버전으로서 오랫동안 지속 유지된다는 의미) 로 결정.



3. Ubuntu설치용 USB만들어 설치.

- http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/    Universal USB Install 1.9.5.5 이용해서 우분투 USB생성. 

 - 고수분들의 웹 사이트를 참조해서 설치.  http://deviantcj.tistory.com/473


  파티션은 다음과 같이 결정

   - ROOT / 20G

   - SWAP영역 8G (향후 8G RAM을 꽂을 것을 대비)

   - 나머지 /home  (약 95G ?) 



Posted by yongary
,

간단히 NO-SQL 몇 개를 초급 수준에서 비교해 보았다. 


몽고DB :  Java를 이용하여 서버를 개발하는 인디/소호 개발의 관점에서 볼 때 최적!

  - json으로 DB에 기록을 해버리니, java개발자 입장에서는 java class가 바로 DB에 저장된다고 느낄 수 있다.
    (document 저장 방식이라고 부름)

 - geoSpace인덱싱이 매우 뛰어나서 혹시라도 지리적인 위치정보를 저장하는 경우, 조회에 관련된 많은 함수들이
    제공되고 속도도 빠르다. 지리 시스템이라면 초 강추!

 - 단점으로는 lock이 전체적으로 걸려서 write가 많은 시스템에선 비추라네요
  => (15.11월 글 참조) mongoDB3.0 부터는 wiredTiger엔진 사용시 row레벨lock(즉, document레벨락)지원.

 - Replication + failOver(장애복구)기능은 존재.

 - Clustering + 샤딩기능 : 존재하고, 확장(scaling or scale out)도 지원..    
     (참조:  http://yakoola.tistory.com/57 ) 


 Redis :  속도가 최우선인 시스템에 적합

   - 메모리 DB인 만큼 속도가 최우선시 되는 시스템에서 필수로 고려해야 한다.

    - 기초적인 사용법은 mySql수준이라서, 입문은 간단.

    - Replication 기능은 존재하지만 Async방식이라서 cluster상에서 일부 유실이 가능한 구조이다. 

    - failOver기능: 원래는 없었으나, 근래에는 sentinel기능이 도입되어 안정화 단계이다.

     - Clustering + 샤딩기능: 없으나 개발완료 단계이다. 올 여름 redis 3.0부터 배포가 되며, 16384개의 hash slot을
         미리 나눠좋고 샤딩을 하는 방식이다. 물론 slot조정이나 이동이 가능하다.
         (이전 버전에서는 clustering이 지원이 안되므로 zookeeper과 혼합해서 사용하는 방법이 혼용되었다)

 


Cassandra: 안정적인 시스템이며 write가 많은 초 대용량 시스템에 유리

      - 읽기보다 쓰기가 더 빠르다는데 시간을 재보진 않아서 믿지는 못하고 있지만
      -  Clustering기능이 뛰어나 안정된 시스템이라는 인상을 많이 준다. 



Posted by yongary
,

간단한 SQL의 경우 Vo를 바로 return하면 되지만,

복잡한 return형식이 필요할 경우 resultMap을 사용하는 게 편리하다. 


resultMap을 사용해서 데이타를 가져오는 경우

java코드는 100%동일하게 사용하고

mapper xml만 바꿔서 resultMap을 이용하는 예제로 만들어 보면 다음과 같다.


( 이전 글 예제에서 변경되는 부분만 기술 )



4.  UserMapper.xml 에서 resultMap을 사용하도록만 설정.


    <mapper namespace="my.UserMapper">

<resultMap id="userMap" type="my.UserVo">      //UserVo가 실질적인 return type이 됨.

        <id     property="username"    column="username" />

        <result property="age"     column="age" />

      </resultMap>

 

      <select id="user" resultMap="userMap">              //위에서 정의한 userMap을 지칭.

        SELECT  username,age

        FROM    user

        WHERE   username=#{name}

      </select>

    </mapper>




5. VO안에 또 객체가 있다던지 하는 복잡한 경우는 associationcollection으로 해결.  REF

   그리고, 어떤 값에 따라 다른  SQL을 실행할 수 있는 discriminator가 있다.

Posted by yongary
,

사설 IP 대역

IT 2014. 7. 31. 09:38

사설 IP 대역은 아래와 같이 3가지 이다.


1.  192.168.0.0/16

2.  10.0.0.0/8

3.  172.16.0.0/12, 


슬래쉬(/) 뒷부분은 masking이므로


1. 192.168.0.0 의 경우 앞에서 부터 16비트 즉 2byte는 고정된다는 말이므로 192.168로 시작하는 모든 IP가 사설IP이다.

 

2. 10.0.0.0/8 의 경우는 8bite=1byte  즉 10만 고정되므로 10.x.x.x 모든 대역이 사설 IP이다.


3. 172.16.0.0/12의 경우는 좀 어려운데  172.16  에서 두번째 16의 앞부분 4bit만 고정되므로 16을 2진수로 표현해 보면 00010000 , 즉 앞 부분 0001을 고정시키면  뒷부분의 경우 0000~1111까지 변화가 가능하다.

즉 00010000~00011111까지가 가능하므로  172.16.x.x~172.31.x.x 까지가 사설 IP이다. 

Posted by yongary
,

국내 이동통신 방식의 진화과정은


AMPS(1G)   ->  

CDMA (2G)  ->

WCMDA (3G, 2Mbps)  ->  

HSDPA (3.5G, 15Mbps) ->

LTE (3.9세대, 75Mbps) ->    

LTE-A (3.91세대?, 150Mbps) ->

LTE-Advanced (진짜 4세대, 500Mbps When?)



국내에는 현재 LTE-A라는 변형된 용어를 쓰고 있지만, 이는 정확한 4G는 아니다.

실제 4G는 LTE-Advanced인 반면, 현재 통용되고 있는 LTE-A는 LTE기술에 CA(Carrier Aggregation)기술을 추가로 이용하여 두 개의 주파수를 잡는 변형된 LTE라고 볼 수 있다.


원래의 4G는 기존 LTE보다 무선전송속도를 높이고, 단위비용을 낮추고, 셀 커버리지 및 용량확대 및 근거리 접속기술을 강화한 몇가지 기술들로 구성된 LTE Advanced와 WiBro Evolution 2가지를 일컫는다.


4G의 요소기술을 나열해보면 다음과 같다.

- OFDM LTE 우수한 직교성 특성에 의해 성능과 용량증가.

- 능동적인 대역폭 할당.(1FA 1.4~20MHz)

- 주요 제어신호를 대역폭의 가운데 (1.4MHz)로만 전송하기 때문에 RF대역폭이 다른기지국간에도 원론적으로 핸드오버 가능.

- 물리층 제어기술 향상, MIMO 다중안테나 성능향상기술.

- 간섭완화 성능향상 기술.(FFR:주파수 재사용, 셀간 협력스케줄기술 )

- 무선접속기술 향상.(FMIPv6) CR,SDR등의 유연한 스펙트럼 이용기술 (Cognitive Radio, SW defined Radio)

- QoS 연결제어 향상 기술 (보이스 QoS 위해 VOD,MOD속도 가중치 낮게조절)

- 단말전력 절약기술 단말 위치등록기술

- 고속핸드오버기술

- IP멀티캐스트 트래픽
- LBS, MBS, MBMS 같은 브로드캐스팅 기술, 자동셀구성 펨토셀 기술,



Posted by yongary
,