데몬 스레드(Daemon Thread)

데몬(Daemon): 
리눅스 서버에서 주로 많이 사용되며, 백그라운드 상태에서 대기하고 있다가 처리할 요청이 
발생하거나 조건 상황이 맞으면 작업을 실행하는 프로그램.
(자바를 다루는 기술 vol.1 김병무 지음. 길벗)

즉, 자바에서 데몬 쓰레드로 이와 비슷한 동작을 할 수 있다. 데몬 쓰레드란 다른 쓰레드 일반 쓰레드를 보조하는 역할로 사용한다. 예를 들면 어플리케이션이 실행하는 동안 백그라운드에서 서비스를 제공하는 가비지컬렉터, 워드프로세서에서 정기적으로 파일을 저장하는 자동 저장기능 등을 말할 수 있다. (티스토리에서 글 작성시에 자동저장하는 기능도 데몬 쓰레드?)

사용 방법은 쓰레드를 실행하기 전에 Thread 클래스에서 제공하는 setDaemon(true) 메소드를 호출하면 된다.

특징으로는 일반 쓰레드(main 등)가 모두 종료되면 강제적으로 종료 된다.


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


캐릭터셋 확인하기


mysql> show variables like 'char%';


캐릭터셋 변경하기


MySQL이 설치된 곳에서 my.ini 파일에 아래 코드를 입력 후 mysql을 재가동시킨다.

없다면 my-default.ini 파일을 복사하여 이름을 바꾸어 준다.

# 2014-07-21 utf setting
character-set-client-handshake = FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8

[client]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


오토커밋(AUTOCOMMIT) 상태 확인, 변경하기


상태 확인하기
SQL> select @@autocommit;

변경하기
# 설정
SQL> set autocommit = 1;
SQL> set autocommit = TRUE;
# 해제
SQL> set autocommit = 0;
SQL> set autocommit = FALSE;


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


함수 만들기

DELIMITER $$
DROP FUNCTION IF EXISTS `db_name.function_name`$$
CREATE  FUNCTION `db_name.function_name`(stID int, endID int, line int) RETURNS int
    DETERMINISTIC
BEGIN

Declare stOrd int;
declare endOrd int;
declare result int;

select ord into stOrd 
from busstoplinelist 
where BusLineID = line and BusStopID = stID;

select ord into endOrd 
from busstoplinelist 
where BusLineID = line and BusStopID = endID;

RETURN endOrd - stOrd;
    END$$
DELIMITER ;

select function_name(421, 423, 1525);
DELIMITER : $$ 문장의 끝을 $$로 바꾸어준다는 뜻
DETERMINISTIC : Link

예외 처리

delimiter $$

DROP PROCEDURE IF EXISTS db_name.procedure_name$$

CREATE PROCEDURE db_name.procedure_name(IN num INT, IN ch VARCHAR(2))

BEGIN

     DECLARE err INT DEFAULT '0'; 
     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION  SET err = -1; 

     START TRANSACTION;

     INSERT INTO table_name VALUES (num, ch);     // 성공
     INSERT INTO table_name VALUES (ch, num);     // 실패

     IF err < 0 THEN 
          ROLLBACK; 
     ELSE 
          COMMIT; 

     END IF; 

END $$

delimiter ;


참고사이트 Link

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


문제점

컴퓨터 강제종료시 발생하는 것 같다. 

error log
2014-07-09 11:01:56 2280 [Note] Plugin 'FEDERATED' is disabled.
2014-07-09 11:01:56 1248 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
2014-07-09 11:01:56 2280 [Note] InnoDB: Using atomics to ref count buffer pool pages
2014-07-09 11:01:56 2280 [Note] InnoDB: The InnoDB memory heap is disabled
2014-07-09 11:01:56 2280 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2014-07-09 11:01:56 2280 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-07-09 11:01:56 2280 [Note] InnoDB: Not using CPU crc32 instructions
2014-07-09 11:01:56 2280 [Note] InnoDB: Initializing buffer pool, size = 165.0M
2014-07-09 11:01:56 2280 [Note] InnoDB: Completed initialization of buffer pool
2014-07-09 11:01:56 2280 [Note] InnoDB: Highest supported file format is Barracuda.
2014-07-09 11:01:56 2280 [Note] InnoDB: The log sequence numbers 1810266 and 1810266 in ibdata files do not match the log sequence number 1810276 in the ib_logfiles!
2014-07-09 11:01:56 2280 [Note] InnoDB: Database was not shutdown normally!
2014-07-09 11:01:56 2280 [Note] InnoDB: Starting crash recovery.
2014-07-09 11:01:56 2280 [Note] InnoDB: Reading tablespace information from the .ibd files...
2014-07-09 11:01:56 2280 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace bis/busstop uses space ID: 2 at filepath: .\bis\busstop.ibd. Cannot open tablespace mysql/innodb_index_stats which uses space ID: 2 at filepath: .\mysql\innodb_index_stats.ibd
InnoDB: Error: could not open single-table tablespace file .\mysql\innodb_index_stats.ibd
InnoDB: We do not continue the crash recovery, because the table may become
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.


해결방안

C:\Program Files\MySQL\MySQL Server 5.6\data\mysql 이나 data가 저장되는 폴더의 mysql폴더로 이동한다.

폴더를 하나 생성하고 아래와 같은 파일 이동시킨다. 즉 백업하고서 mysql 을 다시 실행 시킨다.

innodb_index_stats.frm 
innodb_index_stats.ibd 
innodb_table_stats.frm 
innodb_table_stats.ibd 
slave_master_info.ibd 
slave_relay_log_info.frm 
slave_relay_log_info.ibd 
slave_worker_info.frm 
slave_worker_info.ibd


참고사이트 링크1, 링크2, 링크3


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


테이블 이름 변경

ALTER TABLE [테이블명] RENAME [변경할 테이블명];

컬럼 이름 변경

ALTER TABLE [테이블명] CHANGE colname [변경할 컬럼명] [변경할 컬럼 타입];

컬럼 속성 수정

ALTER TABLE [테이블명] MODIFY [컬럼명] [변경할 컬럼 타입];

컬럼 추가

ALTER TABLE [테이블명] ADD [추가할 컬럼명] [추가할 컬럼 데이터형];

컬럼 삭제

ALTER TABLE [테이블명] DROP [삭제할 컬럼명];

다른 컬럼 다음으로 이동

ALTER TABLE [테이블명] MODIFY COLUMN [컬럼명 데이터형] AFTER [다른컬럼];

첫번째로 컬럼 이동

ALTER TABLE [테이블명] MODIFY COLUMN [컬럼명 데이터형] FIRST;

기존 컬럼을 지우고 맨 앞에 컬럼 추가

ALTER TABLE [테이블명] DROP [기존 컬럼], ADD [추가할 컬럼] [추카할 컬럼 데이터형] FIRST;

Primary key 속성 삭제

ALTER TABLE [테이블명] DROP PRIMARY KEY;


참고사이트 [1] [2] [3]

문제점

▶ 사용자 추가할때 에러 발생
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

해결방안

▶ mysql 버전이 높아지면서 보안관련 오류라고 한다. 사용자추가시 몇개의 필드를 추가한다.

로컬접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('localhost','사용자명',password('비밀번호'),'','','');

외부접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('%','사용자명',password('비밀번호'),'','','');



문제점


해결방안

▶ 아래 명령어 입력
mysqld --skip-grant-tables
▶ 확인하기
mysql -u root  mysql
mysql> show databases;


1. mysql-connector Librarie추가

현재 프로젝트 오른쪽 클릭 - Properties - Java Build Path - Add External JARs...

Download Connector/J Link

(mysql 설치시 Java Connector 도 같이 설치된다.)





2. MySQL DB, Java 코드로 연동하기

public class TestClass {
	public static void main(String[] args) {
		Connection con = null;
		Statement st = null;
		ResultSet rs = null;

		try {

			con = DriverManager.getConnection("jdbc:mysql://localhost", "root",
					"1234");

			st = con.createStatement();
			rs = st.executeQuery("SHOW DATABASES");

			if (st.execute("SHOW DATABASES")) {
				rs = st.getResultSet();
			}

			while (rs.next()) {
				String str = rs.getNString(1);
				System.out.println(str);
			}
		} catch (SQLException sqex) {
			System.out.println("SQLException: " + sqex.getMessage());
			System.out.println("SQLState: " + sqex.getSQLState());
		} finally {
			if (rs != null) { try { rs.close(); } catch (Exception e) {}}
			if (st != null) { try { st.close(); } catch (Exception e) {}}
			if (conn != null) { try {conn.close();} catch (Exception e) {}}
		}
	}
}

문제점

SQLException: No suitable driver found for jdbc:mysql://localhost
▶ 해결방법 : 위 1번 드라이버 추가했는지 확인할 것.


SQLException: Access denied for user 'root'@'localhost' (using password: YES)
▶ 해결방법 : 링크


문제점

SQLException: Access denied for user 'root'@'localhost' (using password: YES)
▶ root 계정 접속을 하려는데 아이디와 비밀번호를 입력하였는데 위와 같은 에러가 발생한다.

해결방안


▶ 분명 설치할때 비밀번호를 설정했는데 비밀번호가 사라진 것 같다... 비밀번호 부분을 공백으로 두고 접속하니 해결되었다.



이클립스 배경색 바꾸기

Window - Preferences - General - Editors - Text Editors - Background color 변경

테마(skin, theme ...) 변경하기



 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


MySQL data 디렉토리 변경하기

확실한 방법인지는 모르겠다. my.ini을 찾아보려해도 없어 WorkBench 를 이용해 바꾸어 보았다.

(이에 대한 문제는 책임지지 않는다.)


1. 먼저 MySQL 을 Stop한 뒤에 WorkBench를 실행하고 왼쪽에 Options File를 클릭하고 datadir의 경로를 바꾸어 주었다.


2. 기존 data 폴더에 있는 두개의 디렉토리를 복사하여 변경한 디렉토리에 넣어준다.


3. MySQL 을 Start 한다.


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


1. 엑셀파일 변환하기



먼저 엑셀파일을 구분자로 나눠진 파일로 변환한다. 

(1)쉼표로 분리한 .csv 파일이나 (2)탭으로 분리된 텍스트파일중 상황에 맞게 할 수 있다.


2. SQLite DB에 import하기

1) 위에서 생성한 파일을 android SDK가 설치된 디렉토리 내 tools 폴더로 이동한다. 

그리고 커맨트 창을 띄우고 tools 폴더로 이동한다.



2) .db 파일을 생성한다. sqlite2.exe [db파일명] 으로 생성하거나 기본의 db파일을 읽어온다.

테이블을 생성하고 테이블을 확인해보았다.


DB 명령문


3) .separator "[구분자]" 명령어를 통해 구분자를 구분하고, .import [구분되어진 파일] [테이블명] 으로 데이터를 가져온다. import할 파일은 확장자까지 입력한다. 

데이터가 import되었는지 확인하기 위해서는 sqlite>select * from [테이블명]; 으로 확인한다.




Android Studio(IntelliJ) 단축키 변경하기

평소 이클립스를 사용하다 안드로이드 스튜디오를 사용하려니 단축키가 많이 달라 불편한 점이 많았다. 하지만 이클립스 단축키를 그대로 사용하는 방법이 있다.

File - Settings 에서 Keymap 탭에서 Keymaps에서 Eclipse 를 선택한다.





환경변수 설정하기




MySQL 가 설치된 경로를 시스템변수 path 추가한다. 

즉, 편집을 누른 뒤 변수 값 제일 뒤에 ;C:\Program Files\MySQL\MySQL Server 5.6\bin 을 추가한다.

(주의, 변수값을 잘못 건들여 모두 지울 경우 포맷을 해야 할지도 모른다.)

파이썬(Python) 예약어

and  del  from  nonlacal  try  as  elif  global  not  while  assert  else  if  or  with  break  except  import  pass  yield  class  exec  in  print  continue  finally  is  raise  def  for  lambda  return


식사하는 철학자(Dining Philosopher) 문제 구현하기

이미 java.util.concurrent.Semaphore 로 세마포어를 사용할 수 있지만 직접 만들어 보도록 한다. 이 코드가 세마포어를 구현한 것인지 확실하진 않다. 단지 내가 이해한 세마포어를 구현해보았다. 

+ 세마포어란 하나의 공유변수를 사용하는데 아래 코드는 각 객체안의 변수를 사용하므로 모니터가 맞는것 같다...

코드 : 식사하는 4명의 철학자

DiningTable.java


Chopstick.java


Philosopher.java



결과화면

  



homework_0604.zip


LOAD DATA LOCAL INFILE 'D:/project/file.csv' 
INTO TABLE dbName.tableName
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
IGNORE 1 ROWS;

참조 Link

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat), Google APIs 4.4.2

 TEST : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


문제점

List의 중복된 값을 제거하고 정렬한다. 


해결방안

ArrayList<String> tempList = new ArrayList<String>();
ArrayList<String> dataList;

dataList = new ArrayList<String>(new HashSet<String>(tempList));
Collections.sort(dataList);

2019.10.11. 옛날 코드를 보니 다이아몬드 연산자도 안쓰고, 다형성도 활용하지 않고, 사이드이펙트있는 정렬 메서드 쓰고 있어서... 새로 수정 with 자바8람다

List<String> duplicateStringList = Arrays.asList("2", "2", "1", "3");
List<String> result = duplicateStringList.stream()
.distinct()
.sorted()
.collect(Collectors.toList());



앞뒤 공백 제거 함수, 앞뒤 공백 지우기

=TRIM(A1)
sql>password;
패스워드를 변경한다.

한글 깨지는 *.txt 파일 읽기

String path="fileName.txt";
BufferedReader reader = new BufferedReader(new InputStreamReader(
						new FileInputStream(path), "euc-kr"));

UTF-8 파일 쓰기

String path="fileName.txt";
BufferedWriterreader = new BufferedWriter(new OutputStreamWriter(
						new FileOutputStream(path), "utf-8"));




자바를 다루는 기술

저자
김병부 지음
출판사
길벗 | 2014-02-24 출간
카테고리
컴퓨터/IT
책소개
자바 언어의 기초 문법을 친절하고 자세하게 설명한다. 객체 지향...
가격비교

 

객체와 인스턴스의 차이점

 비슷한 개념이지만 정확히 구별하면 인스턴스가 객체보다 큰 의미이다. 객체는 어떤 클래스를 사용해서 만들어진 것을 의미한다. 그리고 그 객체가 메모리에 할당되어 실제 메모리를 차지하는 것을 인스턴스라고 한다.  


String str;
str = new String("Hello world");
System.out.println(str);

위와 같은 코드에서 객체와 인스턴스를 구별해보자.

먼저 str은 String 클래스를 사용하여 객체를 선언한 것이다. 즉 아직 str에 문자열이 할당되어 있지 않은 상태이다. 

그리고 다음 라인을 보자. new 키워드를 사용하여 JVM에 데이터가 생성된 것을 보여준다. 이렇게 객체를 실제로 메모리에 할당하는 과정을 인스턴스화(instantiate)라고 한다. 즉 객체 str에 "Hello world"라는 문자열을 할당해서 인스턴화하였다. 그리고 이렇게 인스턴스화된 것을 인스턴스라고 부른다.




JDK 개발 도구 명령어

java

컴파일된 바이트 코드 파일(*.class)을 실행하는 명령어

  • 사용법 : java [클래스명]
  • 사용예 : java Helloworld

javac

자바 컴파일 명령어로 자바 코드로 작성된 파일을 실행 가능한 '.class'로 컴파일해준다.

  • 사용법 : javac [Java 파일명]
  • 사용예 : javac Helloworld.java


jar

자바에서 사용되는 묶음 파일인 Jar 파일을 다루기 위한 명령어. Jar 파일은 클래스 파일들을 편리하고 효율적으로 배포하기 위해 실행에 필요한 여러 파일들을 묶어 하나의 파일로 만든 것이다. 주로 외부 라이브러리들을 배포하거나 애플리케이션을 패치하는데 많이 사용된다. 

  • 묶는 법 : jar -xvf [대상 디렉토리 혹은 Class 파일들]
  • 푸는 법 : jar -cvf [jar 파일 경오]


javadoc

Java 문서를 만들어주는 명령어.

  • 사용법 : javadoc [Java 파일 명]

jps

현재 실행 중인 자바 프로세스들의 이름과 프로세스 ID를 보여주는 명령어

  • 사용법 : jps

jmap

JVM의 힙 메모리 상태를 확인할 수 있는 명령어. JVM의 힙 영역의 상태를 확인하는 것을 메모리 덤프나 메모리 절단면이라고 한다. 애플리케이션의 유지 보수 혹은 애플리케이션에서 에러가 발생했을 때 원인을 찾기 위해서 많이 사용하는 명령어.

  • 사용법 : jmap -heap:format=b,file=[저장할 dump 파일명][pid]

jhat

jmap을 사용하여 생성한 메모리 덤프 파일을 분석해주는 명령어. 이 명령어를 이용하면 스스로 웹서버를 띄워서 html 형식으로 분석된 내용을 보여준다. 보통 jps, jmap 그리고 jhat은 에러의 원인 분석이나 JVM 상태를 모니터링 하기 위해서 사용한다.

  • 사용법 : jhat [저장한 dump 파일명]


참고도서  : 자바를 다루는 기술 

+ Recent posts