레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시

2016년 11월 21일 월요일

자신의 앱이 셀프 DDoS를 가하는 상황을 피하기 위한 방법들..

참고 : http://www.infoworld.com/article/3138018/security/developers-dont-ddos-your-own-apps.html ,
https://cloudplatform.googleblog.com/2016/11/how-to-avoid-a-self-inflicted-DDoS-Attack-CRE-life-lessons.html

앱의 기본 데이터 리프레시 주기와 서버의 장애시 재시도 주기가 고정된 값을 갖는 경우 둘이 겹치는 상황에서 트래픽이 배가 되어 앱 스스로 자신의 서비스에 DDoS 공격과 유사한 상황을 야기하고 이러한 좋지않은 주기가 반복되는 문제에 대한 이야기인데..

구글 엔지니어가 이야기하는 3가지 해법은 다음과 같다.

지수의 형태로 증가하는 지연시간(exponential backoff)

고정된 짧은 재시도 주기를 사용할 경우 로드벨런서에 요청이 쌓이고 서버가 정상으로 돌아왔을 때 과부하 상황을 야기하기 좋기 때문에 고정된 재시도 주기가 아닌 1, 2, 4, 8, 16과 같은 형태로 재시도 주기를 증가 시키고 정상적인 상황의 동기화 주기가 15분이라면 재시도 주기는 최대 16 정도로 잡을 수 있다. 하지만 이역시 다수의 장비들의 재시도 주기가 동기화 되는 현상을 해결하기엔 부족하다..

무작위 주기를 더하거나 빼기(a little jitter)

장시간 서버의 다운타임을 겪게 되면 지수의 형태로 증가하는 지연시간을 이용하더라도 재시도 주기가 맞물리는 현상은 발생하며 이를 피하기 위해 지연시간에 +/- 고정 비율의 주기에서 랜덤하게 시간을 선택할 수 있다. 예를 들면 다음 재시도 주기가 4분에 30% 비율을 이용하기로 했다면 최소 2.8분 최대 5.2분 사이의 값을 랜덤하게 적용하도록 하는 것이다.

이 방법은 실생활에서 폰과 컴퓨터 사용자들의 수면과 기상 패턴과 같은 점을 고려 했을 때 일반적인 동기화 주기에 적용해도 효과가 있다고 한다.

재시도 횟수 기록하기(retry marking)

대규모 분산 시스템의 경우 장애에서 전체 처리량이 완전히 복구 되기 까지 어느정도 시간이 걸리기 때문에 앞의 두가지 방법 만으로는 충분하지 않다.

이를 해소하기 위한 손쉽고 효과적인 방법으로 클라이언트에서 정상적인 연결과 재시도 횟수의 비율을 기록해 백엔드에서 접속의 우선순위를 두는 것이며 이에대한 판단은 사업의 성격에 따라 다를 수 있다.

2016년 10월 28일 금요일

Cloud9에 Oracle JDK8 설치하기..

참고 : http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

여러 장비에서 해커랭크의 문제를 심심풀이로 풀다보니 소스코드 관리가 필요하지는 않지만 코드를 저장할 수 있는 언제 어디서나 접근 가능한 작업 공간이 필요해졌다. 방법을 생각하다보니 클라우드 기반 IDE가 적당한 솔루션인 것 같아 보였고 최근에 많이 쓰이는 서비스로 Cloud9, Codenvy, Codeanywhere가 있었다.

비교 자료를 보면 가장 강력한 툴로는 Codenvy가 언급되고 있기는 했지만 가볍게 알고리즘 문제 정도만 작성하고 실행해 볼 수있으면 되는 무료 툴을 원하다 보니 얼마전 아마존에서 인수한 Cloud9을 사용해 보기로 하였다.

기본적으로 우분투 리눅스 컨테이너 이미지를 기반으로 동작하며 Bash 콘솔을 제공하기 때문에 무료 사용자에게 허용된 시스템 리소스 한도 내에서는 원하는대로 세팅이 가능하며 그래서 인지 기본 세팅에서는 Java 어플리케이션 개발 환경이 정상적으로 세팅이 되어 있지 않다...

위 코드는 기존에 설치된 jre를 제거하고 Oracle JDK8을 설치하는 방법을 기술하고 있으며 여러개의 JDK가 설치되어 있는경우 Java 8을 기본 사용으로 설정하는 방법 역시 포함하고 있다.

2015년 12월 30일 수요일

AMD의 VSR + Fluid Motion 을 이용한 4K 60FPS 영상 감상

먼저 VSR과 Fluid Motion에 대해 간단히 소개 하자면 VSR은 Virtual Super Resolution의 약어로 모니터에서 정식으로 지원하지 않는 더 높은 해상도로 렌더링 해서 보여주는 기술입니다. 얻을 수 있는 장점은 안티앨리어싱(Anti-Aliasing, 이하 AA) 기능을 사용할 때와 비슷한 보정 효과를 얻을 수 있으며 개인적으로는 해상도를 높이는 쪽이 퍼포먼스 면에서 유리한 편이라 VSR기능을 AA보다 선호하는 편입니다. VSR 기능을 지원하는 비디오 카드는 다음과 같습니다.
  • AMD Radeon™ R9 Fury X
  • AMD Radeon™ R9 300 시리즈
  • AMD Radeon™ R7 300 시리즈
  • AMD Radeon™ R7 260 이상
  • AMD Radeon™ HD 7900 시리즈
  • AMD Radeon™ HD 7800 시리즈
  • AMD Radeon™ HD 7790과 AMD A 시리즈 APU들 (A6 7400K 이상)
모니터의 해상도에 따라 지원되는 VSR 해상도 역시 다르며 사용 가능한 VSR 해상도 목록은 다음 링크에서 확인 가능합니다. 일반적으로 4K라고 부를 수 있는 해상도인 3840 X 2160이나 3840 X 2400 해상도가 지원되는 경우는 모니터가 1920 X 1080 @60Hz이거나 1920 X 1200 @60Hz 이면서 GPU는 통가코어(R9 285, R9 380, 380X)나 퓨리 계열인 경우만 지원 된다고 되어 있습니다. 물론 꼭 4K가 아니더라도 VSR을 이용 가능하다면 업스케일 된 해상도를 이용하는 장점을 얻을 수 있습니다.

Fluid Motion 기능의 경우 Catalyst Omega(14.12) 이후 지원하기 시작한 기능으로 GCN 기반 카드의 경우 지원하는 것으로 보이며 일반적인 영상은 대부분 초당 24프레임으로 보여지지만 GPU를 이용해서 중간에 필요한 화면이 추가적으로 생성 된 60프레임으로 보여지도록 하는 기술입니다.

기능을 이용하기 위해 개인적으로 사용중인 소프트웨어 리스트는 다음과 같습니다.
세팅에 대해 살펴보면 먼저 K-Lite 코덱팩은 Mega 버전을 풀 패키지 설정으로 설치(설치 중간에 협찬 소프트를 같이 설치할 것인지 물어오는데 설치하지 않음으로 선택하면 코덱팩만 설치가능 합니다.) 하고 Default 옵션으로 세팅 하였습니다. 그렇기 때문에 비디오 플레이어는 Media Player Classic- Home Cinema(이하 MPC-HC) 버전에 렌더러는 Enhanced Video Renderer(이하 EVR) 코덱은 LAV 비디오 코덱을 이용하게 됩니다. Bluesky Frame Rate Converter는 MPC 플레이어나 다음의 팟플레이어에서 Fluid Motion 기능을 사용할 수 있도록 해주는 필터입니다.

2015년 5월 21일 목요일

IFTTT로 Slack 채널에 날씨정보 알리기

이 글은 일종의 잡 스케줄러 혹은 이벤트 트리거를 웹과 모바일에서 손쉽게 구현할 수 있는 IFTTT(IF This Then That)를 이용하여 팀챗 툴인 Slack의 특정 채팅 채널에 날씨 정보를 리포팅하는 방법을 다루고 있습니다.

기본적인 IFTTT의 활용법을 다루고 있지만 이를 응용하여 IFTTT와 연동되는 여러 서비스를 이용한 자신만의 서비스를 손쉽게 만들 수 있습니다.

"This"를 이용하여 "That"에 어떤 동작을 할것인지는 Recipe라는 항목에서 생성할 수 있는데 This와 That에 해당하는 항목이 바로 Channel이며 이를 이용하기 위해서는 먼저 자신이 원하는 채널을 설정을 해야합니다.

다음은 Weather 채널을 설정하는 절차입니다.


로그인 후 Channels 항목을 확인합니다.


Liftstyle 항목에 Weather channel이 존재하는 것을 확인 할 수 있습니다.(이미 연동된 상태에서는 이미지 하단에 CONNECTED라고 표시 됩니다)

채널을 클릭하면 Connect 버튼이 보이며 이를 클릭하면 다음과 같은 화면을 볼 수 있습니다.


원하는 지역의 이름을 이용하여 검색 후 Connect 버튼을 누릅니다.

이와 마찬가지로 Slack의 채널을 설정합니다.

자신이 이용중인 Slack 계정의 정보를 이용하여 IFTTT와 연동 시킵니다.

자 이제 Recipe를 생성할 차례입니다.


이미지에서는 이미 해당 레시피가 생성된 상태일때의 모습이며 Create a Recipe를 클릭합니다.


이제 this와 that 항목에 앞서 설정한 채널을 지정하는 일이 남았습니다. this를 클릭하여 이벤트 발생 조건을 선택합니다.


제공되는 이벤트 발생 조건은 다음과 같으며 여기서 오늘의 날씨 리포트를 선택하였습니다.



원하는 시각을 설정하고 Create Trigger를 클릭합니다.

이제 that 항목에 어떤 동작을 할 것인지 설정할 차례입니다.



Slack 채널에 메시지를 포스팅하는 액션을 선택합니다.


메시지를 포스팅 할 채널과 메시지 내용에 대한 설정을 완료한 후 Create Action을 선택합니다.


자 이제 마무리 단계입니다. 생성한 레시피가 어떤 동작을 하는지 간단한 정보를 타이틀에 기술하고 해당 레시피가 동작할 때 알림을 받을 것인지 선택한 후 Create Recipe를 선택하여 레시피 생성을 완료합니다.

이제 등록된 레시피를 통해 매일 아침 7시면 등록한 채널에 오늘의 날씨 정보가 자동으로 포스팅 되는 것을 확인하실 수 있을겁니다.

My Recipes 항목을 통해 자신이 생성한 레시피 정보에 대한 수정이나 삭제와 같은 관리 기능 또한 제공됩니다.

2014년 2월 15일 토요일

Springframework release 저장소 링크

Springframework의 라이브러리가 Maven이나 Gradle을 이용하여 프로젝트에 임포트 시키는 것을 권장하게 되면서 기존에 zip파일 형태로 다운 받을 수 있었던 링크 찾기에 애로사항이 꽃피는 관계로 해당 링크를 포스팅 합니다.

http://repo.spring.io/release/org/springframework/spring/

최상위 저장소 위치는 http://repo.spring.io/release/  입니다.

2014년 2월 10일 월요일

CentOS 6.5에 Oracle Database 11g R2 x86_64 설치하기

참고 : http://www.tecmint.com/oracle-database-11g-release-2-installation-in-linux/ , http://matthiashoys.wordpress.com/2012/04/20/automatically-start-oracle-11g-on-oracle-linux-6-2-after-server-reboot/ , http://www.binarytides.com/open-http-port-iptables-centos/ , http://www.transnexus.com/index.php/how-to-fix-oracle-dbconsole-after-hostname-or-ip-change

1. 선행 작업으로 의존성 해결을 위해 메뉴얼 방식이 아닌 오라클 공개 YUM 저장소의 "oracle-rdbms-server-11gR2-preinstall" 패키지를 설치합니다.

다음 일련의 작업들은 root 계정으로 수행합니다.

먼저 오라클의 저장소 정보와 키를 받아옵니다.
cd /etc/yum.repos.d
wget https://public-yum.oracle.com/public-yum-ol6.repo
wget https://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
oracle-rdbms-server-11gR2-preinstall 패키지를 설치합니다.
yum install oracle-rdbms-server-11gR2-preinstall
2. 호스트 네임과 관련한 정보를 수정합니다. HOSTNAME 값은 FQDN(Fully Qualified Domain Name)에 맞춰 설정합니다.
vi /etc/sysconfig/network
vi /etc/hosts
* hosts 파일에는 서버의 아이피에 HOSTNAME을 할당합니다.

3. 앞서 설치한 패키지에서 자동으로 생성된 oracle 계정에 대한 설정을 진행합니다.
passwd oracle
"/etc/security/limits.d/90-nproc.conf"에 다음 항목을 추가 합니다.
vi /etc/security/limits.d/90-nproc.conf

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     1024
# for Oracle database
* - nproc 16384
"/etc/selinux/config"를 열어 SELINUX 항목을 permissive로 변경합니다.
vi /etc/selinux/config

SELINUX=permissive
설정후 서버를 재시작 합니다.

다음 일련의 작업들은 앞서 생성한 oracle 계정으로 수행합니다. oracle 계정의 .bash_profile에 다음 내용을 추가합니다.
vi .bash_profile

# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=localhost; export ORACLE_HOSTNAME
ORACLE_UNQNAME=DB11G; export ORACLE_UNQNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=DB11G; export ORACLE_SID
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH export PATH
ORACLE_HOSTNAME을 앞서 설정한 HOSTNAME으로 변경합니다. ORACLE_UNQNAME, ORACLE_SID값을 설치에 앞서 확인합니다.

다음 작업을 위해 root로 계정을 변경합니다.

X Server에 oracle 계정이 접근할 수 있도록 다음을 실행합니다.
xhost +
설치를 위해 다음 디렉토리를 생성하고 권한을 수정합니다.
mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01
4. 다운로드 한 Oracle database의 설치를 위해 oracle 계정으로 전환 합니다.

"/home/oracle/ " 디렉토리에 다운로드한 파일의 압축을 해제합니다.
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
OUI(Oracle Universal Installer)를 실행 합니다.
cd database
./runInstaller
** 인스톨러를 통한 설치 항목은 비교적 단순하기에 생략합니다. 몇가지 체크할 사항으로 앞서 .bash_profile에 설정한 환경변수와 실재 값이 일치하도록 확인합니다. 필요 조건 체크와 관련한 페이지에서 Failed가 뜨는 항목은 "Fix & Check Again"을 통해 문제를 해결이 가능한데 제 경우는 패키지를 YUM 저장소에서도 찾을 수 없는 것들이 존재해서 "Ignore All"을 체크하고 넘어갔으나 별다른 문제는 발생하지 않는 것 같습니다.

설치 마지막 즈음 나오는 2개의 스크립트를 root 계정으로 실행하라는 메시지를 확인하고 계정을 전환하여 다음의 작업들을 진행합니다.
cd /u01/app/oraInventory
./orainstRoot.sh
cd /u01/app/oracle/product/11.2.0/dbhome_1/
./root.sh
5. 방화벽에 Oracle EM(Enterprise Manager Console)과 LISTENER에 접근 가능 하도록 포트를 등록합니다.
iptables --line -vnL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        1   328 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5        3   234 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT 13 packets, 808 bytes)
num   pkts bytes target     prot opt in     out     source               destination
iptables -I INPUT 5 -m state --state NEW -m tcp -p tcp --dport 1158 -j ACCEPT
iptables -I INPUT 6 -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT
service iptables save
service iptables restart
iptables 정보를 조회하여 INPUT 체인의 REJECT항목보다 선행 넘버로 해당 포트를 등록합니다. 해당 설정 값은 "/etc/sysconfig/iptables" 파일을 수정하여 변경이 가능합니다.

6. 스크립트와 서비스등록을 위해 oracle 계정으로 전환합니다. 데이터베이스의 인스턴스를 자동으로 실행할 수 있도록 하기 위해 앞서 root.sh 스크립트를 실행하여 생성된 "/etc/oratab" 파일을 수정합니다.
vi /etc/oratab

# This file is used by ORACLE utilities.  It is created by root.sh
# and updated by the Database Configuration Assistant when creating
# a database.

# A colon, ':', is used as the field terminator.  A new line terminates
# the entry.  Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
#   $ORACLE_SID:$ORACLE_HOME:[N|Y]:
#
# The first and second fields are the system identifier and home
# directory of the database respectively.  The third filed indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
DB11G:/u01/app/oracle/product/11.2.0/dbhome_1:Y
다음의 실행과 종료 스크립트를 생성합니다.
vi /home/oracle/scripts/ora_start.sh

#!/bin/bash
 
# script to start the Oracle database, listener and dbconsole
 
. ~/.bash_profile
 
# start the listener and the database
$ORACLE_HOME/bin/dbstart $ORACLE_HOME
 
# start the Enterprise Manager db console
$ORACLE_HOME/bin/emctl start dbconsole
 
exit 0
vi /home/oracle/scripts/ora_stop.sh

#!/bin/bash
 
# script to stop the Oracle database, listener and dbconsole
 
. ~/.bash_profile
 
# stop the Enterprise Manager db console
$ORACLE_HOME/bin/emctl stop dbconsole
 
# stop the listener and the database
$ORACLE_HOME/bin/dbshut $ORACLE_HOME
 
exit 0
스크립트에 실행할 수 있는 권한을 줍니다.
chmod u+x ora_start.sh ora_stop.sh
서비스 등록을 위해 root 계정으로 전환 합니다. "/etc/init.d/oracle" 스크립트 파일을 생성합니다.
vi /etc/init.d/oracle

#!/bin/bash
# chkconfig: 345 99 10
# description: Oracle auto start-stop script.
 
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.
 
ORA_OWNER=oracle
RETVAL=0
 
case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c "/home/oracle/scripts/ora_start.sh"
        touch /var/lock/subsys/oracle
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c "/home/oracle/scripts/ora_stop.sh"
        rm -f /var/lock/subsys/oracle
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        RETVAL=1
esac
exit $RETVAL
생성한 스크립트의 권한을 변경합니다.
chmod 750 /etc/init.d/oracle
oracle 스크립트를 서비스에 등록합니다.
chkconfig --add oracle

2014년 2월 1일 토요일

java.util.logging.Logger의 콘솔 출력 레벨 변경

java.util.logging.Logger를 사용하는 경우 로깅 레벨을 코드상에서 변경 하더라도 콘솔에 출력되는 항목은 INFO 레벨 이상만 표시되게 된다. 이유는 기본적으로 참조하는 JAVA_HOME\jre\lib\logging.properties 파일에 콘솔항목은 INFO레벨 이상일 경우만 출력 하도록 되어 있으며 코드상에서 레벨을 변경 하더라도 둘의 교집합 영역만 표시되기 때문이다.

콘솔 출력과 관련한 기본 설정 값은 다음과 같다.

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

로깅 레벨은 "java.util.logging.ConsoleHandler.level = INFO" 항목을 수정하여 변경할 수 있다. 참고로 java.util.logging.Logger에서 제공하는 로깅 레벨은 다음과 같다.
  • SEVERE (highest value)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (lowest value)
참조하는 프로퍼티 파일의 위치를 변경하고 싶다면 VM 변수 "-Djava.util.logging.config.file=[프로퍼티 파일 위치]" 로 지정이 가능하다.

2013년 12월 3일 화요일

Windows 7에서 2개의 오디오 장치간 사운드 스트림 공유하기

이 글은 USB 헤드셋과 PC 스피커 사용시 기본장치 설정 전환 없이 두 장비에서 동시에 같은 사운드를 청취하고자 하는 분들을 위한 가이드 입니다. 물론 여타 장비(HDMI 출력과 같은)에도 적용이 가능합니다.

1. 작업표시줄 알림아이콘의 스피커 아이콘을 마우스 우클릭 -> 재생장치


평소 스피커 출력을 이용하던 장치가 기본 장치로 세팅되어 있음을 확인할 수 있습니다. USB 헤드셋 장비 또한 리스트에 표시 될 것 입니다.

2013년 11월 30일 토요일

웹페이지에서 .js파일 비동기 방식으로 로드하기

참고 :  http://www.phpied.com/async-javascript-callbacks/ , http://stackoverflow.com/questions/1834077/which-browsers-support-script-async-async , https://developers.google.com/analytics/devguides/collection/gajs/asyncTracking

본 문서는 Google Analytics Tracking Code 삽입과 관련한 예제를 바탕으로 작성 되었습니다.

웹페이지 호출 시 일반적으로 .js 파일은 다운로드 되고 파싱되는 절차를 거치게 되며 이 작업이 완료되기까지 대기 상태를 거쳐 페이지 로드가 완료되게 됩니다. 이 경우 .js 파일의 용량이 클 경우 페이지 로딩 시간이 길어지는 문제가 발생하게 되고 HTML5에서는 이를 보완하여 non-blocking한 동작을 지원하기 위해 Script 태그에 Async 속성이 추가 되었습니다.

HTML5의 경우 아직 Draft단계이기 때문에 추후 변동사항이 발생할 가능성이 있습니다. 의존 관계를 갖지 않는 단일 파일의 비동기 방식 로딩에 대한 예제는 다음과 같습니다.

(function() {
    var foo = document.createElement('script'); foo.type = 'text/javascript'; foo.async = true;
    foo.src = 'foo.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(foo, s);
})();

위 코드를 이용해서 의존 관계를 갖는 .js 파일의 로딩이나 코드의 수행을 위해 다음과 같이 수정해 보았습니다.

(function() {
    var foo = document.createElement('script'); foo.type = 'text/javascript'; foo.async = true;
    foo.src = 'foo.js';
    foo.onload = foo.onreadystatechange = function() {
        //subsequent executions..

        foo.onload = foo.onreadystatechange = null;
    }
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore foo, s);
})();

만약 jQuery를 사용할 수 있는 환경이라면 $.getScript(url, successCallback)을 사용 할 수 있습니다.

위 코드는 레거시 코드를 혼용해서 작성한 코드이기 때문에 IE7 모드 부터 동작하는 것을 확인 하였지만(본 블로그의 SyntaxHighlighter에 적용되어 있습니다 xD) 제가 알지 못하는 최신 브라우저에서만 지원하는 튜닝요소가 존재할 수 있습니다. 해당 기능을 정식으로 지원하는 브라우저는 다음과 같다고 합니다.
  • IE10+ (Preview2 이상)
  • Chrome 12+
  • Safari 5.1+
  • Firefox 4+

2013년 11월 27일 수요일

MSI Star-USB3 Firmware & Driver Update

펌웨어와 드라이버를 업데이트할 대상이 되는 제품의 정보는 이곳에서..

전원 관리 기능의 버그로 종종 USB3 외장 드라이브가 사라지면서 인식이 안되는 문제 때문에 골머리 썩고 있던 중.. 펌웨어 릴리즈 노트를 확인 했더니 혹시나 했더니 역시나 드라이버와 펌웨어에 버그가 있었던 모양..

공식 사이트에서는 가장 최근 드라이버와 펌웨어를 지원하지 않기 때문에 이곳에서 펌웨어와 드라이버를 구해서 업데이트 하였다.


제품 정보는 위의 이미지와 같고 설치 된 OS가 Windows 7 64bit 버전이기 때문에 드라이버는 Version 2.1.39.0을 설치 하였고 펌웨어는 uPD720200의 마지막 버전인 3.0.3.4를 설치 하였다.

설치 후 드라이버와 펌웨어 정보를 확인한 결과는 다음과 같다.

  

혹시 업데이트를 하게 될 경우 펌웨어 업데이트는 본인이 리스크를 감수하고 진행해야 함을 잊지않길 바라며..

2013년 5월 28일 화요일

Ubuntu Server 13.04에서 SSH 활성화 하기

참조 : http://linuxg.net/how-to-enable-ssh-on-ubuntu-13-04/

openssh-server 패키지를 설치하게 되면 SSH기능이 기본설정 상태로 활성화 된다.
  • 설치 방법은 다음과 같다.
$ sudo apt-get install openssh-server
  • 서비스를 재시작 하는 방법은 다음과 같다.
$ sudo /etc/init.d/ssh restart
  • 서비스와 관련된 설정 값은 /etc/ssh/sshd_config 파일을 수정하면 된다.
$ sudo vi /etc/ssh/sshd_config

2013년 2월 3일 일요일

MIRC 7.x에서 한글이 깨지는 문제

MIRC 7.x 버전부터 codepage 지원을 중단하고 메시지 처리가 UTF-8 방식으로 바뀌면서 기존의 cp949인코딩 문자가 깨지는 문제가 있다(기타 다른 코드페이지를 참조하는 문자도 동일). 자세한 내용은 링크 참고.

irc.hanirc.org 서버의 경우 UTF-8으로 전환 하려는 움직임은 있는듯 한데 아직 cp949 인코딩을 사용하기 때문에 역시 문자가 깨져보이는 문제가 있다. 한글을 정상적으로 보기 위해서는 codepage를 지원하는 마지막 버전인 MIRC 6.35 버전을 사용해야 하고 다운로드 페이지의 다음 링크에서 구할 수 있다.


해당 옵션 체크는 다음과 같다.


물론 UTF-8 인코딩을 지원하는 서버에 접속할 경우 UTF-8 display를 체크하면 정상적으로 메시지를 볼 수 있다.

오랜시간 유용하게 사용했던 클라이언트라 IRC를 다시 사용하기로 하면서 $20에 구매하게 됐는데 이런 문제가 있을줄은-.- 여튼 사용자 라이선스는 하위 버전에도 호환이 되니 정식 라이선스 구매 유저는 6.35버전도 라이선스 문제없이 사용이 가능하다.

2012년 3월 19일 월요일

Intel Centrino 카드를 데스크탑에서 사용하기..

이 글은 팁이라고 하기도 그렇고 뭔가 광고성 글이 될듯한 느낌이..-_-;

노트북에 보통 사용되는 Intel의 센트리노 카드를 데스크탑용 아답터를 이용해서 설치할 수 있습니다. 센트리노 카드의 경우 노트북에서 사용하는 m-PCIe 인터페이스 이고 데스크탑은 일반 PCIe 인터페이스를 사용하기 때문에 이를 변환해주는 아답터가 필요한데 대만의 Bplus라는 회사의 제품에 대해 이야기 해보도록 하겠습니다.



PCIe 1x 슬롯에 장착되는 타입이며 인텔의 Centrino Ultimate-N 6300을 장착하고 있습니다. 제품명은 MP2W-6300H이며 설치후 드라이버는 인텔 웹사이트에서 받아서 설치하면 정상 작동하게 됩니다. 노트북을 사용하면 볼 수 있었던 익숙한 제어판 화면을 데스크탑에서도 볼 수 있게 되는 것이죠.. : )


아답터의 경우는 기본 장착 된 인텔 센트리노 카드 이외에 다른 카드들도 장착이 가능합니다.. 일부는 아답터의 USB 포트를 이용해서 노트북에 연결이 가능하기도 합니다(홈페이지의 호환성과 관련한 스펙시트 참고) . 물론 장착된 m-PCIe카드를 노트북에 직접 설치 하는 것 또한 가능 합니다.

일단 이 제품을 구매하게 된 이유가 기존에 사용하던 USB 타입 제품의 드라이버 문제로 시스템 행이 자주 걸렸던 것과 유선을 사용할 수 없는 문제(아무래도 이게 제일 컸던 --;) 때문에 구매하게 되었는데 가격은 꽤 비쌌지만(배송비 포함 배추14장 정도 들었습니다..) 만족스럽게 사용하고 있습니다.

혹시 제품을 구매하길 원하는 분을 위한 팁을 몇가지 알려드리자면 일단 결제 가능한 페이팔 계정이 있어야 합니다. 계정의 개인 정보 또한 정확히 입력이 되어 있어야 하며(해당 페이팔 계정 정보의 이메일로 배송 정보를 알려오며 배송지 또한 계정에 입력한 주소로 발송이 됩니다..) 발송이 되면 DHL 특송으로 발송되기 때문에 수도권 기준으로 다음날이면 받아 보실 수 있습니다.

제품의 장단점을 몇가지 짚어보자면 다음과 같습니다.

+요소 :
드라이버가 안정적인 편이며 인텔의 업데이트를 받을 수 있다.
아답터와 장착된 카드의 개별 활용이 가능하다.
기존에 사용하던 일반적인 USB타입의 제품에 비해 안정적인 속도를 제공한다(공유기 제한 150Mbps에 144Mbps 정도 나오는군요..).

-요소:
가격이 비싸다.
6300N의 경우 블루투스 기능이 포함되어 있지만 사용할 수 없다(드라이버 문제인지 해당 아답터로는 지원이 불가능한건지 확인해보지 않았습니다..)
간혹 제품이 인식이 안되는 경우가 있다.(최초 설치 할때 인식이 안되는 문제를 겪었습니다. 메인보드의 슬롯에서 뽑았다 다시 설치했더니 인식을 하더군요.. 보드와의 호환성 문제인건지 모르겠지만 PC전원을 완전히 셧다운 한적이 있었는데 동일 증상이 발생해서 같은 방법으로 해결 했습니다.)

** 참고로 Windows 7에서 AMD의 bulldozer혹은 piledriver 코어의 Microcode 업데이트를 적용한 시스템에서 인텔 Wifi 드라이버와 충돌로 인해 블루스크린이 발생하는 문제가 있어 현재는 사용하지 않고 있습니다.

2012년 3월 18일 일요일

USB 저장장치로 Windows 7을 설치해보자!

ODD가 없을경우 OS를 설치하기 위해서 USB 저장 장치를 이용하고자 할때 기본적으로 USB 저장 장치는 부팅이 불가능한 상태이기 때문에 약간의 작업이 필요합니다.


커맨드 라인에서 diskpart를 실행합니다.


list disk 명령어를 이용하여 크기를 확인 후 연결된 USB 저장장치를 확인합니다. 여기에서는 disk 3 입니다.(잘못 선택하면 엉뚱한 디스크가 날아가니 주의 요망!)


select 명령어를 이용해서 disk를 선택한 뒤 clean 명령어를 이용하여 디스크를 초기화 하고 create partition primary명령어를 이용해서 주 파티션을 생성합니다. list partition 명령어를 이용하여 파티션이 생성된 것을 확인합니다.


select partition 명령어를 이용하여 생성된 1번 파티션을 선택하고 active 명령어로 활성 상태로 설정합니다. 마지막으로 NTFS 파일 시스템으로 빠른 포멧을 진행합니다.

이제 USB 저장 장치에 OS 설치 디스크를 통째로 복사하시면 USB 저장장치로 부팅해서 설치가 가능합니다.

이 방법은 USB인터페이스를 갖는 HDD, 플래시메모리 모두 가능한 방법입니다 : )

2012년 3월 16일 금요일

작업관리자의 프로세스 우선순위를 기억시켜보자!

윈도 기본 탑제의 작업관리자에서 특정 어플리케이션 퍼포먼스를 위해서 프로세서 우선순위를 변경할 수 있지만 기억시켜주는 기능은 존재하지 않는다. 하지만 이를 해결할 방법이 있으니..

Prio(개인 사용시 프리웨어)라는 어플리케이션을 설치하면 다음과 같은 화면을 볼 수 있다.



Ctrl + Shift + Esc 키를 누르면 TCP/IP라는 탭이 상단에 추가되어 있고 프로세스 정보를 보면 Save Priority라는 항목이 존재하는 것을 확인 할 수있다.. 그렇다 이제 설정한 값이 기억이 되는 것이다..

물론 설정을 변경하게되면 시스템 크래쉬를 야기할 수 있다는 경고문구는 그대로 뜨며 --; 최적의 설정값은 직접 테스트 해보는 방법밖에는 없다는 숙제가 남겨지게 된다..

p.s Silent Elevation옵션은 UAC가 활성화 되어 있을때 해당 프로세스를 관리자 권한으로 실행하게 해주는 옵션임..


2011년 10월 11일 화요일

TOMCAT Multi-Instance & Service Regist (Windows)

* 이 글은 윈도우즈 시스템 및 JDK1.6, TOMCAT6를 기반으로 작성 되었습니다.

TOMCAT의 인스턴스가 이미 디폴트 상태로 존재하고 있음을 가정으로 진행한다.
신규 인스턴스는 C:\TestServer 폴더에 생성하는 것으로 가정한다.
배치 스크립트명은 다음과 같이 정한다. 인스턴스 시작 : startup.bat, 인스턴스 종료 : shutdown.bat, 서비스 등록 : TomcatServiceRegist.bat
신규 인스턴스의 TOMCAT 서비스명은 TomcatService로 등록한다. 

  • C:\TestServer 폴더를 생성한다.
  • 생성한 C:\TestServer 폴더 내부에 최초 설치된 톰켓과 동일하게 비어있는 폴더(bin, conf, logs, temp, webapps)를 생성한다.
  • 기존에 등록된 인스턴스의 conf 폴더에서 server.xml, web.xml 파일을 신규 생성할 인스턴스의 C:\TestServer 내부의 conf 폴더로 복사한다.
    • server.xml 파일의 port 정보를 기존에 등록 된 인스턴스의 포트와 중복되지 않게 설정한다.
  • C:\TestServer 폴더 내부의 bin 폴더에 다음의 스크립트를 생성한다.

startup.bat (인스턴스 시작 스크립트)
set JAVA_HOME=D:\Java\JDK1.6      (JAVA_HOME을 설정한다.)
set CATALINA_HOME=D:\Tomcat 6    (TOMCAT이 설치된 경로를 설정한다.)
set CATALINA_BASE=C:\TestServer   (신규 생성할 인스턴스 경로를 설정한다.)

%CATALINA_HOME%/bin/startup.bat   (기존 TOMCAT 인스턴스의 startup.bat 파일을 호출한다.)

shutdown.bat (인스턴스 종료 스크립트)
set JAVA_HOME=D:\Java\JDK1.6     (JAVA_HOME을 설정한다.)
set CATALINA_HOME=D:\Tomcat 6   (TOMCAT이 설치된 경로를 설정한다.)
set CATALINA_BASE=C:\TestServer  (신규 생성할 인스턴스 경로를 설정한다.)

%CATALINA_HOME%/bin/shutdown.bat  (기존의 TOMCAT 인스턴스의 shutdown.bat 파일을 호출한다.)

* 웹어플리케이션의 디플로이 경로는 C:\TestServer\webapps\SampleWebApp\에 하는 것으로 가정한다.

TomcatServiceRegist.bat (서비스 등록 스크립트, 환경에 따라 수정 필요)
D:\Tomcat 6\bin\tomcat.exe -install TomcatService D:\Java\JDK1.6\jre\bin\server\jvm.dll -Djava.library.path=C:\TestServer\webapps\SampleWebApp\WEB-INF\lib -Djava.class.path=C:\TestServer\webapps\SampleWebApp\WEB-INF\lib\sample-lib.jar;C:\TestServer\webapps\SampleWebApp\WEB-INF\classes;C:\TestServer\webapps\SampleWebApp\WEB-INF\classes\sample;D:\Tomcat 6\bin\bootstrap.jar; -Dcatalina.base=C:\TestServer -Dcatalina.home=D:\Tomcat 6 -server -Xmx256M -Xms256M -Xrs -Xnoclassgc -start org.apache.catalina.startup.Bootstrap -params start
@echo Please start the TomcatService now.
@pause

스크립트 작성 완료 후 웹어플리케이션을 디플로이 한다.
신규 인스턴스를 시작하여 웹어플리케이션이 정상적으로 동작하는지 확인한다.
신규 인스턴스를 종료하고 서비스등록 스크립트를 실행하여 Windows Service로 등록하고 정상적으로 등록이 되었는지 확인한다.

2011년 9월 5일 월요일

Oracle Weblogic 11g HTTP Basic Authentication 문제

흔히 웹로직 엔지니어들이 이야기하는 고객들이 '톰캣에서는 되는데 왜 웹로직에서는 안되요?'라고 묻는 문제중 하나일듯 싶은 케이스 -ㄴ-; 웹로직 엔지니어는 아니지만 워낙 잡다하게 많이 하다보니..

웹로직 보안 정책상 디폴트 상태는 Authorization 헤더 데이터를 어플리케이션으로 직접 전달 할 수 없도록 막아둔 상태인데 config.xml 파일을 열어 <security-configuration>항목에 다음을 추가하면 정상적으로 데이터가 전달 됨.. 좀더 베스트 케이스가 있는지는 아직 모르겠음;

<security-configuration>

...

<enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials>

</security-configuration>
ps. 그러고보니.. 이거 9.2부터 해당되는 문제라는걸 빼먹은..;

2011년 8월 30일 화요일

Eclipse - Resource is out of sync with the file system: ERROR MESSAGE

Eclipse에서 J2EE 기반 프로젝트 Deploy시 Resource is out of sync with the file system: 라는 메시지의 에러를 보인다면.. Project Explorer 창에서 해당 프로젝트 를 클릭하고 F5키를 눌러 source를 리프레시 해주면 해결됨..

좀 허무한 팁인가; Eclipse에서 소스 자동 싱크 기능이 오작동 하는 경우가 있던..

2011년 8월 1일 월요일

JDK 1.7 환경에서 Android SDK 설치하기



Android SDK 인스톨러가 버전업 되면 해결될 문제이지만 현 시점에선 버그인지 JDK1.7만 설치 된 상태에서는 JDK를 찾지 못하는 현상이 있음.

해결 방법은 추가로 1.6버전의 JDK만 설치하고 다시 Android SDK 인스톨러를 실행하면 JDK 1.7 버전을 찾았다는 메시지를 보이며 정상적으로 설치가됨-.- 설치후 JDK 1.6은 언인스톨 하면 되고  JDK 1.7이 하위 호환성을 제공하기는 하지만 릴리즈 노트 대충 훑어보니 일부 호환되지 않는 부분도 있는듯 해서 조만간 새로운 버전의 SDK가 나오지 않을까 싶기도 한..

2011년 7월 3일 일요일

작업관리자의 서비스탭 클릭 시 ActiveX 문제

언제 부터인가 작업 관리자의 서비스 탭을 클릭할 경우 서비스의 확장탭을 볼 수 없고 ActiveX 항목을 표시 할 수 없다고 메시지가 나오기 시작했다..(해외 포럼을 뒤지다 보니 플래시 플레이어의 버그라는 설이..;)

(정상 상태일때의 화면)

문제는 이녀석만 정상적으로 동작하지 않는게 아니라 ActiveX 기반 일부 어플리케이션들도 정상적으로 동작하지 않는 문제가 발생한다는거다-ㄴ-;

이를 해결하기 위해서는 먼저 실행창에서 regedit.exe를 실행해서 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 항목을 찾아간다 항목들이 0, 1, 2.. 와 같은 숫자가 붙은 녀석 이외에 특수문자로 되어 있는 녀석이 하나 있을것이다. 이 항목을 삭제하면 서비스의 확장탭이 정상적으로 표시 될 것이다.