패키지 업데이트 및 업그레이드

$ sudo apt-get update
( 혹은 $ sudo apt-get upgrade )
$ sudo shutdown -r now

라즈베리 파이 설정

$ sudo raspi-config
1. Expand Filesystem : 메모리 공간 확장
2. Change User Password : 암호 변경
3. Enable Boot to Deaktop : 부팅시 X-윈도우 바로실행
4. Internationalisation Options : 지역 설정 - 'ko_KR.UTF-8 UTF-8', 기본 설정 추천
  4-1. Change Timezone : 시간 설정 - 'Seoul'
  4-2. Change Keyboard Layout : 키보드 레이아웃 변경, 기본 설정
5. Enable Camera : 카메라 활성화
6. Add to Rastrack : 라즈베리 파이 사용자 분포 체크
7. Overclock
8. Advanced Options
  8-1. Overscan : 디스플레이 맞도록 설정
  8-2. Hostname : 호스트네임 변경
  8-3. Memory Split : 메모리 할당 관련 설정
  8-4. SSH : SSH 사용 여부 설정
  8-5. Update : raspi-config 툴 업데이트
9. About raspi-config : raspi-config 툴 설명
$ sudo reboot

유/무선랜 설정

유선 정적/동적 IP 지정하기 링크

무선 설정 링크

(iptime 공유기에서 외부접속 링크)

SSH 접속하기

링크

XRDP 접속

설치(라즈베리 파이)
$ sudo apt-get install xrdp
접속(윈도우)
실행(wind + R) > 'mstsc' 입력(원격 데스크톱 연결) > ip 입력후 접속

삼바 접속

1. 설치
$ sudo apt-get install samba samba-common-bin
2. 유저 추가 및 패스워드 설정
$ sudo smbpasswd -a pi
3. 설정
$ sudo vi /etc/samba/smb.conf
  [pi]
  comment  = rpi samba server
  # 공유할 폴더 지정
  path = /home/pi
  # 사용 가능한 유저 지정
  valid user = pi
  # 쓰기 가능 여부
  writable = yes
  # 공유 폴더 목록 보여주기 여부
  browseable = yes
4. 재실행
$ sudo service samba restart


아두이노에서 날짜, 시간 출력하기.

먼저 아두이노에서 링크를 통해 Time 라이브러리는 받는다. 압축을 해제하고 각 폴더들을 아두이노 라이브러리폴더안에 넣는다. (그냥 압축 풀고 통째로 넣으면 헤더파일을 읽어오지 못한다.)



다운로드 주소
http://playground.arduino.cc/Code/Time
아두이노 라이브러리 경로
C:\Program Files (x86)\Arduino\libraries 혹은
C:\Users\사용자명\Documents\Arduino\libraries

라이브러리를 사용하는 2가지 방법이 있다. 먼저 아두이노 설치경로안에 libraries 폴더 안에 넣거나, Documents 폴더내의 아두이노 폴더에 넣는 방법이다. 다른 점은 크게 없고, 어떻게 화면에 나누어지는가의 차이인 것 같다. 아래 사진은 Documents 폴더 내의 아두이노 라이브러리에 넣은 화면이다.(초록색)


실행하기

코드는 라이브러리 설치 후에 '파일 > 예제'에 있는 TimeRTC 코드를 조금 수정한 것으로, RTC(Real Time Clock)칩에 저장된 값을 불러와서 출력한다.

#include <Time.h>  
#include <Wire.h>  
#include <DS1307RTC.h> 

void setup()  {
  Serial.begin(9600);
  setSyncProvider(RTC.get);  
  setTime(17,39,0,24,2,15);
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

void loop()
{
   digitalClockDisplay();  
   delay(1000);
}

void digitalClockDisplay(){
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}
시간 설정
setTime(hr, min, sec, day, month, year);
예 : setTime(17,39,0,24,2,15); // 2015.2.24 17:39:00

업로드하고 난 뒤에, 시리얼 모니터를 확인하면 다음과 같은 화면을 보여준다.



관련 문제점

에러 : 'BYTE' was not declared in this scope

에러 : must be const in order to be put into read-only section by means of '__attribute__((progmem))'


결론

먼저 실행하기 전에 컴파일단계에서 에러때문에 꽤나 답답하였다. 위 코드에서 문제점은 현재시각을 출력하지 않는다는 점이다. 앞으로 컴퓨터나 핸드폰의 시간을 받아와서 출력하도록 해봐야겠다. 혹은 인터넷의 시간을 가져오는 방법도 찾아봐야겠다.


참고사이트 링크링크, 링크


문제점

Time.h 을 사용하려는데 발생하는 에러.


해결방안

Time 라이브러리가 있는 디렉토리에서 DateStrings.cpp 파일에서 PROGMEM을 모두 지우고 실행하였더니 에러가 발생하지않았다. 아래 파일은 PROGMEM을 지운 파일이다.

DateStrings.cpp


문제점

아래 코드에서 발생하는 에러

  int  value = 1;
  Serial.print(value, BYTE);
'BYTE' was not declared in this scope

해결방안

  int  value = 1;
  Serial.write(value);

참고사이트 링크

아두이노 온도 센서 사용하기

온도 센서에는 여러 종류가 있다. LM34, LM35, LM36 등이 있으며 각각 온도를 구하는 공식이 약간 다르다. 

LM35 = (5.0 * reading * 100.0) / 1024.0;
TMP36 = (((reading * 5.0) / 1024.0) - 0.5) * 100

이번 실험에는 LM35 를 사용한다. 생김새는 아래 그림과 같이 뒷부분에 LM35라고 적혀있으며 반대쪽은 둥근형태이다. Output은 Analog In에 연결한다.


사진 출처

사진 출처


실험결과

따로 저항도 필요없고 쉽게 연결할 수 있어서 매우 편리하다. 코드는 아래와 같이 간단하며, 두번째 사진은 실행결과이다. 이 점에서 값을 구하는 식이 다르다는 점을 반드시 확인하여야한다. 아무것도 모르고 있을 땐, 센서가 고장난 줄 알고 한참을 헤매였다.




"본 제품은 아이씨뱅큐 무상체험단 21기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."


참고 사이트 링크, 링크, 링크

아두이노 편집기(IDE) 폰트 변경하기

먼저 '파일 > 환경설정'을 선택하면, 아래 추가적인 환경 설정은 직접 편집할수 있다고 알려준다. 그 경로를 선택한다.


font 부분에 자신의 원하는 폰트를 입력한다.

나눔고딕일 경우 > NanumGothic


블루스택 화면 사이즈, 메모리 변경하기


화면 사이즈 변경
실행(윈도우키 + R) → regedit 실행 → 
HKEY_LOCAL_MACHINE → SOFTWARE → BlueStacks → Guests → Android → FrameBuffer → 0
WindowHeight, WindowWidth 값 변경

메모리 변경
실행(윈도우키 + R) → regedit 실행 →
"HKEY_LOCAL_MACHINE → SOFTWARE → BlueStacks → Guests → Android"
Memory 값 변경

변경 후 재부팅


'대학 생활 > Develop' 카테고리의 다른 글

HTTP 프로토콜의 상태 코드  (0) 2015.01.21
언론사/포탈 뉴스 RSS 목록  (0) 2014.11.18
주요 RSS 목록  (0) 2014.11.18
[Sublime Text 2] Gits에 코드 발행하고 가져오기  (0) 2014.09.10

안녕하세요. DFRduino UNO R3 Beginner Kit 개봉기를 올려보려고합니다.

ICBanQ 21기 체험단을 지원했을 때 그냥 '아두이노 비기너 킷'이라고만 생각하고 지원하였습니다.

그런데 검은색으로 평소 생각했던 파랑색의 아두이노와 달라서 긴가민가했습니다.

찾아보니 이 제품은 아두이노의 호환보드로 DFTobot에서 만든 DFRduino라고 합니다.

(하지만 기존의 아두이노와 100% 호환되며, 성능과 사용법이 모두 같다고 하네요. 참고)

 

먼저 박스를 개봉하고 제품의 모습입니다.


받기전에 사진을 보았을 땐 아주 컸던것 같은데, 직접보니 손바닥 크기로 생각보다 작았습니다.


박스를 열고 난 모습입니다. 첫 느낌은 정리가 아주 잘되어있다고 느꼈습니다.

오른쪽에는 들어있는 제품들의 목록이 적혀있고, 왼쪽엔 각각의 부품, 센서들을 사용하는 방법들이 그려져있는 카드가 들어있습니다. (회로에 대해서는 많이 부족한 저에게 정말 필요한 것이라서 아주 마음에 들었습니다.)


사용설명서와 리스트를 걷어내면 아주 잘 정리된 부품들을 볼 수 있었습니다.


하나하나 빼면서 나열하는데 정말 차곡차곡 잘 정리되어있었고, 처음 시작하기에 알맞은 많은 부품들이 있었습니다.


DFRduino UNO R3의 모습입니다. 라즈베리파이보다 조금 더 작은 크기같고, 기존 아두이노랑 거의 똑같이 생겼습니다.


쉴드 장착후 컴퓨터에 연결하고 테스트 해보았습니다. LED 불 들어오는 것만으로도 엄청난 성취감을 느꼈습니다..

그리고 기존의 아두이노는 ON LED가 파랑색인데 디에프알두이노는 빨간색인 것 같습니다. 처음엔 에러가 난건지 계속 고민했는데 그냥 빨간색 인것 같습니다..(제것만 그런건가요..?)

(그리고 노랑색 LED가 불량이라서 좀 아쉬웠습니다..하나는 브레드보드에 꼽았을 때 치칙!하면서 아예 타버려서 놀랐습니다..)

 

비기너 킷을 개봉하면서 많은 구성물(스위치, 모터, 리모콘, 센서, 알람, 세그먼트, 팬 등)과 잘 정돈되고 각 하나하나 스티커가 부탁되어있음으로 처음하는 사람들에게 아주 괜찮은 것 같습니다. 또한 많은 응용을 할 수 있을것 같습니다.

결과적으로 아주 아주 만족스러운 제품인 것 같습니다.

 

"본 제품은 아이씨뱅큐 무상체험단 21기 활동의 일환으로 체험 제품을 제공받아 작성되었습니다."

equals() 와 hashCode() 는 함께 오버라이드 할 것.

자료형

해시 값 계산 방법

boolean

(value ? 1 : 0)

byte, char short, int

(int) value

float

Float.floatToIneBits(value)

double

Double.doubleToLongBits(value)

 String 및 기타 객체

"test".hashCode() 

package Test;

public class Test {
	int intVal;
	String strVal;

	public Test(int intVal, String strVal) {
		this.intVal = intVal;
		this.strVal = strVal;
	}

	public int getIntVal() {
		return intVal;
	}

	public void setIntVal(int intVal) {
		this.intVal = intVal;
	}

	public String getStrVal() {
		return strVal;
	}

	public void setStrVal(String strVal) {
		this.strVal = strVal;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + intVal;
		result = prime * result + ((strVal == null) ? 0 : strVal.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Test other = (Test) obj;
		if (intVal != other.intVal)
			return false;
		if (strVal == null) {
			if (other.strVal != null)
				return false;
		} else if (!strVal.equals(other.strVal))
			return false;
		return true;
	}

}

이클립스에서는 만드는 방법

단축키 Shift + Alt + S 

Generate hashCode() and equals()... 선택




문제점

Dialog를 화면에 띄우려고할 때, 발생하는 에러.

BadTokenException: Unable to add window -- token null is not for an application

해결방안

대화상자 객체 생성시 파라미터를 확인할 것.

getApplicationContext()를 사용하지 말고, 액티비티명.this를 사용할 것

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

int(정수)를 String(문자열)로 바꾸는 여러가지 방법

평소에 정수타입의 변수를 문자열로 바꿀 때 +"" 를 자주 사용하였다. 편리하기도하고 습관이 되었기 때문이다. 그러다가 갑자기 궁금해져서 바꾸는 방법에 대해서 페이스북 생활코딩 그룹에 도움을 청했다. 댓글을 통해서 2012년도에 작성된 String.valueOf(int) vs ""+int라는 글을 보았고, 몇가지 더 추가해서 실험해보았다. 실험에 사용된 코드는 아래와 같다.

코드

package Test1;

import java.io.IOException;

public class TestClass {
	public static void main(String... args) throws IOException {
		for (int i = 0; i < 10; i++) {
			long svo = perfStringValueOf();
			long qqp = perfQuoteQuotePlus();
			long its = perfIntegerToString();
			long sf = perfStringFormat();
			System.out.printf("String.valueOf() : %.3f\t", svo / 1e3);
			System.out.printf("Integer.toString() : %.3f\t", its / 1e3);
			System.out.printf("\"\"+ : %.3f\t", qqp / 1e3);
			System.out.printf("String.Format() : %.3f\n", sf / 1e3);
		}
	}

	private static long perfStringValueOf() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = String.valueOf(i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfQuoteQuotePlus() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = "" + i * i;
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfIntegerToString() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = Integer.toString(i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}

	private static long perfStringFormat() {
		long start = System.nanoTime();
		final int runs = 100000;
		String s;
		for (int i = 0; i < runs; i++) {
			s = String.format("%d", i * i);
			if (s.length() < 1)
				throw new AssertionError();
		}
		long time = System.nanoTime() - start;
		return time / runs;
	}
}

결과


첫 실행 속도로 보았을 땐 Integer.toString() < String.valueOf() < ""+ < String.Format()  이다. 하지만 여러번 반복하고 평균적으로 보았을 땐 ""+ < Integer.toString() < String.valueOf() < String.Format() 이었다.

속도와 간단함으로 보았을 땐 ""+ 이었지만 추후에 좀더 성능을 고려해서 다시 실험해보아야겠다.

 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

라즈베리파이 모션센서 사용하기



PIR Sensor를 라즈베리파이와 연결하고 간단한 테스트를 한다.

준비물
라즈베리파이, 점퍼선 3개, PIR 센서

PIR 센서, 라즈베리파이와 연결하기

아래 사진과 같이 PIR 센서의 핀과 라즈베리파이의 GPIO(핀 확인)와 연결한다. 센서는 아래를 확인하거나, 커버(?)를 떼어보면 확인할 수 있다.

출처 링크

코딩

1. 파이썬 파일 생성.

$ vi pir.py

2. 코드 작성

2-1. 예제 1.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
PIR_PIN = 7

GPIO.setup(PIR_PIN, GPIO.IN)

try:
	print “PIR Module Test (CTRL+C to exit)”
	time.sleep(2)
	print “Ready”
	
	while True:
		if GPIO.input(PIR_PIN):
			t = time.localtime()
			print “%d:%d:%d Motion Detected!" % (t.tm_hour, t.tm_min, t.tm_sec)
		time.sleep(0.05)

except KeyboardInterrupt:
	print “ Quit”
	GPIO.cleanup()

2-2. 예제 2.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
PIR_PIN = 7
GPIO.setup(PIR_PIN, GPIO.IN)

def MOTION(PIR_PIN):
	print "Motion Detected!"

print "PIR Module Test(CTRL+C to exit)"
time.sleep(2)
print "Ready"

try:
	GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=MOTION)
 	while 1:
 		time.sleep(100)

except KeyboardInterrupt:
	print "Quit"
 	GPIO.cleanup()

3. 실행

sudo python pir.py


 반응속도는 0.5초가량 늦게 나타는 것 같으며, 감지하는 능력은 손가락 하나 움직이는 것도 인식할만큼 적은 움직임에도 반응한다. 또한 바로 정면에 있는 것만 인식하지 않고 넓은 부분을 모두 감지하는 것 같다.


참고사이트 Link, Link, Link, Link



 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

문제점

라즈베리파이에 FTP 서버를 구축하고 사용한다.

해결 방안

1. 라즈베이파이에 vsftpd를 설치한다.

sudo apt-get install vsftpd

2. 설정파일을 자신에 맞게 변경한다.

sudo vi /etc/vsftpd.conf

vsftpd_setting.txt

개인적으로 변경한 부분.
'anonymous_enable = YES' 이 부분 찾아서 주석 처리하고 아래 내용 추가
(아래 내용들은 파일에 다 주석처리되어있어서 찾아서 변경하는 것보다 그냥 넣어주는 것이 편하다.)

#anonymous_enable=YES

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

#chroot_local_user=YES
#user_sub_token=$USER
#local_root=/home/$USER/ftp

force_dot_files=YES
anon_max_rate=0
local_max_rate=0
trans_chunk_size=0

dirmessage_enable=YES
xferlog_enable=YES

connect_from_port_20=YES
xferlog_std_format=YES

idle_session_timeout=600
data_connection_timeout=120

ftpd_banner=Welcome to MDSL FTP service.
listen=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
항목별 기능(추후 추가)
anonymous_enable : 익명사용자 접속 허용 여부

3. vsftpd 재시작

sudo service vsftpd restart

* 문제가 생길 때 vsftpd 제거후 다시 설치 방법

sudo apt-get remove --purge vsftpd
sudo apt-get install vsftpd

참고사이트 Link, LinkLink, Link, Link

 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

문제점

라즈베리파이에서 vim에디터를 사용하려한다.

혹은, .vimrc 파일을 넣었을 때 아래와 같은 에러가 발생한다.(설정파일 변경시)

'sorry the command is not available in this version syntax on'

해결 방안

1. 아래 명령어를 통해 vim을 설치한다.

sudo apt-get install vim

2. 작업하기 편리하게 설정파일을 편집한다.

개인적인 .vimrc 파일(아래 파일 첨부)

let g:MultipleSearchMaxColors = 8

hi Search0 ctermbg=blue guibg=blue ctermfg=white guifg=white
hi Search1 ctermbg=green guibg=green ctermfg=black guifg=black
hi Search2 ctermbg=magenta guibg=magenta ctermfg=white guifg=white
hi Search3 ctermbg=cyan guibg=cyan ctermfg=black guifg=black
hi Search4 ctermbg=brown guibg=brown ctermfg=white guifg=white
hi Search5 ctermbg=gray guibg=gray ctermfg=black guifg=black
hi Search6 ctermbg=red guibg=red ctermfg=white guifg=white
hi Search7 ctermbg=yellow guibg=yellow ctermfg=black guifg=black

map <F1> :wq<cr>
map <F2> :wq<cr>
map <F3> :w<cr>
map <F4> :q<cr>

"=========================================================
"  filetype setting
"=========================================================
filetype plugin on
filetype indent on

"=========================================================
" C compile
"=========================================================
au FileType c map <F5> :w!<CR>:!gcc % -o %<<CR>
au FileType c map <F6> :!./%<<CR>

"=========================================================
" CPP compile
"=========================================================
au FileType cpp map <F5> :w!<CR>:!g++ -o %< %<CR>
au FileType cpp map <F6> :!./%<<CR>

"=========================================================
" JAVA compile
"=========================================================
au FileType java map <F5>:w!<CR> :!javac % <CR>
au FileType java map <F6> :!java %<<CR>

"=========================================================
" Python Mapping
"=========================================================
au FileType python map <F5> :!python &<CR>
au FileType python map <F6> :!python &<CR>

"=========================================================
" C compile with Network socket func
"=========================================================
map <F9> :w! <CR> :!gcc % -o %< -lsocket -lnsl <CR>
map <F10> :!./%<<CR>

"=========================================================
" C Debug
"=========================================================
map <F11> :w! <CR> :!gcc % -o %< -ggdb <CR>
map <F11> :w! <CR> :!gcc % -o %< -ggdb -lsocket -nsl <CR>

"=========================================================
"=========================================================
set number	"line number
set ai
set tabstop=4   "tab키 설정
syntax on	"구문강조 사용
set hlsearch
set background=dark	"하이라이팅
set ruler	"커서의 줄, 칸 위치 표시
set title
set ignorecase	"검색시 대소문자 무시
set hlsearch	"검색어 강조
set cindent	"C언어용 자동 들여쓰기
set smartindent	"스마트한 들여쓰기
set autoindent	"자동 들여쓰기
set showmode	"현재 모드 표기
set shiftwidth=4  "자동 들여쓰기할 때 여백
set showmatch   "괄호를 맞춰줌
set history=50		" vi 편집기록 기억갯수
"set visualbell "키는 잘못눌렀을 때 화면 프레시
set showcmd		" display incomplete commands
set incsearch	"키워드 검색시 점진적 검색
"colorscheme desert  " vi 색상 테마 설정
set bs=indent,eol,start	"백스페이스 사용

.vimrc



 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

문제점

인터넷 접속을 위해 고정 ip설정과 유동 ip 설정을 하기 위한 방법.

해결 방안


1. interfaces 파일을 편집기를 통해 실행한다.

sudo vi /etc/network/interfaces

2. 유동IP로 되어있는 기본 설정을 주석처리하고 고정IP를 추가한다.

#iface lo inet loopback
#iface eth0 inet dhcp

auto eth0
iface eth0 inet static
address [ip 주소]
network [ip주소에 마지막을 0으로]
netmask [서브넷마스크]
gateway [기본 게이트웨이]
broadcast [기본DNS서버]

3. 저장한 뒤, 네트웍을 재시작한다.

/etc/init.d/networking restart 혹은 sudo /etc/init.d/networking restart

오류 사항

에러메세지
ifup failed to open statefile /run/network/ifstate permission denied
해결방안
위와 같은 에러 메시지가 발생할 경우 라즈베리파이를 재부팅하였더니 해결되었다.
에러메세지
Running /etc/init.d/networking restart is deprecated because it may not re-enable some interfaces
해결방안
$ sudo ifdown eth0
$ sudo ifup eth0

참고사이트 Link, Link

 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

문제점

라즈베리파이에서 ssh를 이용해 원격 접속하기

해결 방안

1. Raspberry Pi Software Configuration 으로 이동하기.
터미널에 아래와 같이 입력.
sudo raspi-config
2. '8. Advanced Options' 선택.
3. 'A4 SSH' 선택 후 Enable 설정.

1. window
putty 등의 프로그램으로 라즈베리파이의 IP주소로 접속한다.
2. mac
터미널에서 자신의 서버주소와 사용자명에 맞게 아래와 같이 입력
ssh [USER]@[IP]
ssh pi@192.168.0.2


참고사이트 Link, Link


 Model

 Raspberry PI B+

 OS

 RASPBIAN 3.12

문제점

라즈베리 처음 설치 할때 us로 변경하지 못한 경우나, 처음 부팅하고 다른 키가 입력될 때.

해결방안

1. 맨드창에서 아래와 같이 입력. sudo vi /etc/default/keyboard 2. 아래 내용 중 XKBLAYOUT 값 us로 변경 # KEYBOARD CONFIGURATION FILE # Consult the keyboard(5) manual page. ... XKBLAYOUT="us" ...



state

설명

100

[Continue] 서버에서는 클라이언트로부터 HTTP Request를 받았음을 의미한다. 그래서 클라이언트로 하여금 계속해서 HTTP Request를 보내라는 의미다.

200

[OK] 클라이언트에서 전송한 HTTP Request가 성공적으로 처리되었음을 의미한다.

201

[Created] PUT 메소드에 의해서 서버에 파일이 정상적으로 생성되었음을 의미한다.

202

[Accepted] HTTP 서버가 정상적으로 HTTP Method를 수신하였음을 의미한다.

204 

[No content] 클라이언트의 Request를 정상 수신했지만 서버에서 클라이언트로 전송할 데이터가 없음을 의미한다.

301 

[Moved permanently] 요청한 URL 정보를 다른 URL에 요청한다. 요청한 URL은 영구적으로 다른 URL로 옮겨졌음을 의미한다. 

302

[Moved temporarily] 요청한 URL 정보를 다른 URL에 요청한다. 요청한 URL은 실제로 다른 URL위에 위치하고 있음을 의미한다. 

400 

[Bed request] 클라이언트에서 전송한 HTTP Request의 문법이 잘못되어 서버에서 처리할 수 없음을 의미한다.

401 

[Unauthorized] 인증이 필요한 페이지를 요청한 경우 HTTP Request 헤더에 Authorization 필드가 비어 있어 인증을 할 수 없음을 의미한다. 

403

[Forbidden] 접근이 금지된 데이터를 클라이언트가 요청한 경우 발생한다. 

404 

[Not found] 클라이언트가 요청한 페이지가 없을 때 발생한다. 

408 

[Request timeout] 요청 시간이 지났음을 의미한다.

500 

[Internal server error] 내부 서버의 오류에 의해서 정상적으로 데이터를 전송할 수 없음을 의미한다. 

503 

[Service unavailable] 서버의 문제로 인하여 HTTP 서비스를 할 수 없음을 의미한다. 대부분 HTTP 서버의 과부하 때문에 발생하는 에러다. 

505

[HTTP Version not supported] 클라이언트에서 전송하는 HTTP Request의 HTTP 버전을 서버가 지워하지 못할 떄 서버가 내려주는 상태 코드이다. 


메서드 배열 만들기

public class Node {
    ...
    public void goNorth() { ... }
    public void goSouth() { ... }
    public void goEast() { ... }
    public void goWest() { ... }

    interface MoveAction {
        void move();
    }

    private MoveAction[] moveActions = new MoveAction[] {
        new MoveAction() { public void move() { goNorth(); } },
        new MoveAction() { public void move() { goSouth(); } },
        new MoveAction() { public void move() { goEast(); } },
        new MoveAction() { public void move() { goWest(); } },
    };

    public void move(int index) {
        moveActions[i].move();
    }
    public void allMove() {
        for (MoveAction m : moveActions)
            m.move();
    }
}

참고


toArray() 사용법

보톤 반복문을 통해 하나하나 배열에 넣는 방법을 사용하는데, 속도도 느리고 효율성도 좋지 않다고 한다. 또한 arr = (String[])list.toArray(); 와 같은 코드를 사용한다면 List의 요소가 정확히 어떤 형태로 형변환을 해야 할지 명시하지 않아 java.lang.ClassCastException이 발생한다.


package Test;

import java.util.ArrayList;
import java.util.List;

public class Example {
	public static void main(String[] args) {
		List list = new ArrayList<>();
		list.add("test1");
		list.add("test2");
		list.add("test3");

		String[] arr = (String[]) list.toArray(new String[list.size()]);
		for (String str : list) {
			System.out.println(str);
		}
	}

}

IP주소는 하드코딩을 피해라.

책 '자바 코딩, 이럴 땐 이렇게'에서 이번에도 꼭 알아두어야 할 것 같은 부분을 보고 남기려고 한다. 서버 프로그램을 작성할 때 서버의 IP를 소스코드에 하드코딩하는 습관이 바람직하지 않다고 한다.

첫 번째 이유는 관리적인 측면과 유지보수의 측면에서 볼 수 있다. 말 그대로 서버의 IP가 바뀌었거나, 소스 수정을 할 때 하나하나 찾아가며 바꿔야 하기 때문이다. 

두 번째 이유는 보안적인 측면인데, 자바 소스는 디컴파일(decompile)이 가능하기 때문이다. 즉 JVM이 인식하는 코드 .class코드가 유출된다면 IP정보가 쉽게 유출된다는 점이다.


해결 방안

package Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Example {
	private static final String DEFAULT_PROPERTIES_PATH = "d://test.properties";

	private static String serverIP;

	public static void main(String[] args) throws Exception {
		setServerIP(Example.getKey("serverIp"));
	}

	public static String getKey(String key) throws Exception {
		String value = null;
		InputStream is = new FileInputStream(DEFAULT_PROPERTIES_PATH);
		Properties properties = null;
		try {
			properties = new Properties();
			properties.load(is);
			value = properties.getProperty(key);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();

		} finally {
			try {
				is.close();
			} catch (IOException e) {

			}
		}
		return value;
	}

	public static String getServerIP() {
		return serverIP;
	}

	public static void setServerIP(String serverIP) {
		Example.serverIP = serverIP;
	}

}

varargs : Variable Argument List

매개변수가 가변적일 때 사용하는 가변인자. 즉, 여러개의 파라미터를 가변적으로 사용할 때 사용된다. 

방법은 아래와 같이 사용한다. API


    public void printFormat(String... strs) {
        System.out.println("size : " + strs.length);
        for (String str : strs) {
            System.out.printf(" %15s", str);
        }
    }


PreparedStatement 에서 SQL 문 확인하기

System.out.println(preparedStatement);

https://stackoverflow.com/questions/2683214/get-query-from-java-sql-preparedstatement

BigDecimal 객체 생성 방법, 비교

객체를 생성할 때 실수가 아닌 String 형태 혹은 valueOf()를 사용하고 비교할 때는 compareTo()를 사용한다.

import java.math.BigDecimal;
public class Example {
    public static void main(String[] args) {
        BigDecimal val1 = BigDecimal.valueOf(1.234);
        BigDecimal val2 = new BigDecimal("1.234");

        System.out.println(val1.compareTo(val2) == 0);
    }
}

+ Recent posts