0. 현재상황

중계서버를 만들고 있다. 개발하다 보면 흔히 있는 일인데, 앞단(통칭 A)에서 전달해주는 JSON Key와 우리가 전달해줘야 하는 뒷단(통칭 B)의 JSON Key가 다른 경우가 있다. 같은 의미의 파라미터라고 하더라도, A서버는 "testEMail" 이라는 Key로 전달해줄 때, B서버는 "test_email"이라는 key로 받아야 한다. 그럴 땐 대충 아래와 같이 작업하는 편이다.

1
2
3
4
5
Map<String, Object> bMap = new HashMap<String, Object>();
//bMap에 담아서 B서버로 전달
if ( jsonResult.containsKey("testEMail")) {
   bMap.put("test_email", jsonResult.get("testEMail"));              
}
cs

뭐 근데 쓰다보면 불편한 점이 참 많다. 간단하게 한두개야 이렇게 한다손 치더라도, 후에는 오류가 생길 수 있다. 담당 개발자가 바뀐다거나 또는 Parameter Key가 변경된다거나 하는 정도로. 그래서 이래저래 고민하다 찾아보니 Enum이 있더라. 그래서 냅다 바꿨다.

 

1. Enum class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Getter
public enum aParamMapper {
    //좌측 - a서버 , 우측 - b서버
    testNm("testNm""test_nm"),    //사용자명
    testTelNo("testTelNo""test_tel_no"), //사용자전화번호
    testEMail("testEMail""test_email"), //사용자이메일
    ;
 
    private String aParam;
    private String bParam;
 
    bParamMapper(String aParam, String bParam) {
        this.aParam = aParam;
        this.bParam = bParam;
    }
}
 
cs

enum class를 하나 만들어서, 4~6번 라인과 같이 매칭시켜줄 것들을 만든다. 타입에는 arraylist도 들어가고 많은데, 아직 그런 활용성은 생기지 않았다.

 

2. 사용

1
2
3
4
5
6
7
8
Map<String, Object> bMap = new HashMap<String, Object>();
//bMap에 담아서 B서버로 전달
if ( jsonResult.containsKey(bParamMapper.testNm.getbParam())) {
   bMap.put(
       bParamMapper.testNm.getbParam()
       , jsonResult.get(bParamMapper.testNm.getaParam())
        );
}
cs

* 소스가 좀  길어져서 임의로 줄바꿈 함

0. 현재상황 의 4번 라인은 key/value 값이 각각 String 인자값으로 하드코딩 되어있는데 반해, 2.사용 의 5~6번 라인은 key/value 값을 enum을 통해 가져오는 방식으로 바뀌었다.

한두군데에서 쓰는 방식이라면 굳이 enum을 써야하나 싶긴 한데, 이를 활용하면 공통되는 부분을 모두 대체할 수 있는 데다가, 향후 Parameter Key가 변경되었을 때의 대처방안, 대소문자 구분자에 대한 해결방안 등도 모두 대응할 수 있을 것으로 생각된다. 

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

어느날 유튜브를 보다가 유튜버 숙성맨https://youtu.be/OKSbILK3Wqs 님의 영상을 보고 잠봉을 만들어보았다. 글을 쓰는 현재 총 두 종의 고기로 잠봉을 만들어보았고 모두 다 성공적이었다.

 

기본적인 염지액으로 아래와 같이 계량하였다.

 

[주의] 피클링 솔트(아질산나트륨, 아질산염)는 인체에 매우 치명적이므로, 절대적으로 계량을 필히 하여 사용할 것.

 

1. 염지액 준비 및 고기 다듬기

돼지 안심 한 근(600g)을 구매하여 300g씩 소분, 고기는 대충 근막을 잘라내고 불순물을 없애기 위해 차가운 물로 씻었다. 그 후에는 키친타올 등으로 고기의 수분을 모두 제거해주었다.

처음 만들어보는 것이기에 각각의 염지액을 다르게 만들어보았다.

기본 염지액은 다음과 같다.

 

기본 염지액

0. 물 500ml 기준, 염농도 4%, 아질산염 900ppm을 목표로 계량함

1. 피클링 스파이스 2.5g

2. 마늘 파우더 2.5g

3. 소금(필자는 천일염 사용) 15g

4. 피클링 솔트 5g

 

여기에 다른 염지액은 기본 염지액에 하단과 같이 첨가하였다

1. 기본염지액

2. 피클링 스파이스 1.1g

3. 페퍼론치노 4.3g

4. 흑후추 2.5g

 

뭐 대충 이런 느낌

2. 염지 - 32시간 소요

고기의 크기(두께)에 따라 염지시간은 다르게 가져가는 것이 옳다고 본다. 돼지 안심의 경우에는 고기의 두께가 그리 두껍지 않으므로, 32시간 정도면 충분한 것으로 보인다.

필자는 21.01.20 23시에 염지를 시작하였고, 21.01.22 07시에 염지를 종료하였다.

염지가 끝난 후에는 고기를 차가운 물에 씻고, 키친타올로 다시 수분을 없애준 다음 체반과 같은 곳에 담아 냉장고에서 레스팅 시간을 가졌다.

 

* 염지가 끝난 후에 차가운 물에 고기를 씻어내는 이유는 "염분 농도 조절"과 "불순물 제거"가 주 목적이 된다. 후에 4% 염도의 경우에 시식을 해 본 결과 그리 짜다는 생각이 들진 않았으므로, 나는 그냥 불순물 제거를 주 목적으로 삼았다.

 

이땐 몰랐다. 차라리 요리용 실로 묶어줬으면 더 예뻤을텐데

이대로 냉장고에 직행, 12시간의 레스팅을 갖을것이다.

 

3. 레스팅 - 12시간, 수비드 64도 - 12시간

레스팅 종료 후에는 크게 할 것이 없었다. 그대로 진공포장기에 넣어 진공을 잡고, 64도의 수비드로 12시간을 돌려줄 것이다.

수비드머신은 오래전 스테이크를 해먹기 위해 알리익스프레스에서 구매한 60달러 정도의 저렴한 머신이다.

 

레스팅은 21.01.22 19시에 종료하였으며, 수비드는 즉시 실행하였다. 21.01.23 07시경에 수비드를 종료할 것이다.

 

4. 수비드 종료, 칠링 30분

자고 일어나서 수비드를 종료했다. 그리고 얼음물을 준비하여 바로 칠링작업을 거쳤다. 64도에서는 식중독 균 등 인체에 해가 될만한 세균이 모두 사멸하지 않는 온도로, 세균이 아주 활발하게 작용을 할 40~50도의 온도를 빠르게 지나쳐, 저온살균을 하기 위한 목적을 갖고 있다. 이는 "수비드 요리 방식 중, 보관"을 위한 작업으로 만약 바로 섭취를 한다면 칠링작업은 건너뛰어도 문제되지는 않는다. 하지만 우리가 이번에 만드는 잠봉과 같은 경우에는 냉장고에 보관을 할 것이기 때문에 "칠링 작업은 필수"이다.

 

5. 완성

칠링까지 끝내고 모두 완성이 되었다. 제작에 걸린 총 시간은 약 56시간 정도로, 실질적으로 손이 가는 구간은 염지외에는 크게 없었다. 첫번째 기본 염지액으로 제작한 잠봉과 두번째 염지액으로 제작한 잠봉의 맛은 사실 후추의 맛 차이 외에는 크게 없었다. 페퍼론치노의 매콤한 맛이 배어들길 원했지만, 갈지 않고 통째로 넣어서인지 매콤한 맛이 부족했다.

의외로 아주 맛있었으며, 색도 예쁘게 빠졌다. 급한대로 식빵과 버터를 꺼내 잠봉블랑을 만들어보았는데 이 또한 괜찮았다.

기본 염지액 잠봉
후추/페퍼론치노 등이 더 첨가된 잠봉
급한대로 만들어본 잠봉블랑

향신료를 제외한 고기값도 얼마 들지 않았고, 전기요금이 조금 걱정되긴 하지만 이정도의 맛이라면 충분히 감수할만 했다. 아주 만족스러웠다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

안드로이드 10 업데이트가 되면서, 사용하는 갤럭시S10 에서 볼륨버튼을 길게 눌러 볼륨 조절하는 문제가 발생했다. 주로 무선 헤드폰을 사용하는지라 인지하는데 시간이 꽤 걸렸는데, 찾아보니 안드로이드10 에서의 볼륨버튼에 정책적인 변화가 있었나보다.

 

파워앰프나 유튜브 앱 같은 곳에서 정상동작하는 것을 보니 뭔가 문제가 있긴 한가보다.

 

여튼, 아래의 절차로 간단히 해결할 수 있다.

길게 눌러 볼륨버튼이 안먹히는 상황. 한 번씩 눌러줘야 볼륨조절이 가능하다.

 

 

갤럭시S10 기준, 설정 화면 -> 검색창에 "어시스턴트" 라고 검색한다. 여기에서 "어시스턴트 기기" 항목을 찾아 들어간다.

 

나의 경우에는 "유선 헤드폰" 항목을 터치하여 들어갔다. 사용자마다 다른것이 아닐까 싶지만.

 

여기에서 최상단의 "Google의 도움받기" 항목을 그림과 같이 꺼준다.

 

끄고나니 길게 눌러서 볼륨조절하는 것이 정상동작한다. 허허 이거 참 신기한 일일세.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

고객사에서 MariaDB를 설치하고 있다. 그러던 와중, 잘 구동되던 Tomcat을 재구동하게 되었는데 오류메시지 "Access denied for user '계정명'@'localhost'(using password:YES)" 라는 오류가 발생한다. 이전까지는 재구동하는데 문제가 없었고, 오류가 생길만한 작업은 약 서너가지 정도가 짚히는 상황이었다. 현재 WAS 설정으로는, server.xml 및 context.xml 내에서 JNDI를 해당 MariaDB로 설정해둔 상태였다.


먼저, MariaDB에 익숙하지 않은 나인지라 용어의 혼란이 조금 있을 것 같아 아래와 같은 내용으로 이해를 하고 있다.  MariaDB는 계정별로 두 개의 권한을 갖는 듯한 모습이었다. MariaDB의 계정 테이블을 쿼리해보면 Host라고 작성된 부분이 있는데, 여기에 localhost 및 % 정도로 권한(?)이 부여가 된다. localhost는 내부에서만 접속이 가능하고, %은 내/외부에서 접속이 모두 가능한 권한 정도로 이해하고 있다.


1. 원인파악

본론으로 돌아와서 검색해보니 뭐 당연하게도 해당 계정의 localhost 권한이 없다는 문구다. 그래서 MariaDB가 설치된 서버에 접속하여 아래의 명령어를 사용했다. 해당 명령어는 shell 에서 MariaDB에 접속하기 위한 명령어이다.


1
mysql -u 계정명 -p
cs

그런데 위의 tomcat과 마찬가지로 "Access denied for user '계정명'@'localhost'(using password:YES)" 오류가 발생한다. 그래서 MariaDB의 root계정으로 접속하려는데, root 권한 또한 마찬가지 오류가 발생한다. 


이래저래 구글링을 해보니, 다음과 같은 명령어를 찾게 되었다.

1
sudo /usr/bin/mysqladmin -u root password [비밀번호]
cs

해당 명령어는 서버의 root 권한으로 서버 내에 설치된 MariaDB의 root 비밀번호를 재설정하는 것이다. 이 이후에, mysql -u root -p 명령어로 접속하였고, localhost 계정을 다시 생성해주려 하였다.


1
MariaDB[(none)]> CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호';
cs

했더니, 아래와 같은 오류메시지가 출력된다.


1
ERROR 1396(HY000) : Operation CREATE USER failed for '계정명'@'localhost';
cs

뭔가 해서 봤더니 직접 생성이 불가능한 것 같다. 혹시나 싶어, 계정 테이블을 직접 쿼리해서 상태를 좀 보고자 했다.


1
2
MariaDB[(none)] > use sql; --Database를 변경하는 명령어
MariaDB[(mysql)] > SELECT * FROM user WHERE user='계정명';
cs

해당 명령어로 조회해보니 우리 DB에서 사용중인 계정 - Host(권한이라고 이해중)별 비밀번호가 각각 다른것이었다. A 계정의 % Host(권한)과 A 계정의 localhost Host(권한)과 비밀번호가 각기 다른 상황. 이러니 서버나 tomcat에서 접속할 때에는 Access Denied For User 에러가 발생했을 것이고, 개발자 PC의 DB툴로는 접속이 잘 되었겠지. 이제 원인이 파악된 상황이다.


1
2
3
4
5
6
7
8
9
10
+-------------------------------------------------------------------------------+
| Host      | User        | Password              | Select_priv  | Insert_priv  |
+-------------------------------------------------------------------------------+
| localhost | mariadb.sys |                       | N            | N            |
| localhost | root        | *E1C459C5 ~~~~~~~~~   | Y            | Y            |
| localhost | mysql       | invalid               | Y            | Y            |
| localhost |             |                       | N            | N            |
| %         | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
| localhost | test        | *COB5F ~~~~~~~~~~~~~~~| N            | N            | 
+-------------------------------------------------------------------------------+

cs

* test라는 계정의 % Host 비밀번호는 암호화되어 *0B26A로 시작하는데, localhost는 *COB5F로 시작한다. 이러니 외부에서 접속하는 % Host는 기존 비밀번호로 접속이 되고, 같은 서버 내에 있는 tomcat은 기존 비밀번호로 접속이 안되겠지.



2. 문제해결


일단 원인은 알았다. test 계정의 % 비밀번호와 test 계정의 localhost 비밀번호가 다르기에 생긴 문제라는 것. 일단 localhost 비밀번호가 왜 저렇게 변경되었는지는 작업자들에게 물어보면 될 것이고, 접속이 되도록 수정을 해야겠다. 이럴땐 뭐다? test 계정의 localhost Host(권한)비밀번호를 기존에 사용중인 비밀번호로 Update 쳐주면 될 것이다.


1
MariaDB[(mysql)] > UPDATE user SET password=('비밀번호') WHERE user='계정명';
cs

했더니, 다음과 같은 에러가 발생한다.


1
ERROR 1348(HY000) : Column 'Password' is not updatable.
cs

않이; 뭐냐 대체 이건. 또다시 검색해보니 MariaDB 10.4 버전 이상은 user테이블을 직접관리하지 않고, 파일이나 뭐 그런식으로 관리하기 때문에 기존의 user테이블 update 방식은 사용할 수 없다고 한다. 그래서 또다시 뒤져보니 명령어로 직접세팅하는 방법이 있었다.


1
MariaDB[(mysql)] > set password for '계정명'@'localhost=password('비밀번호');
cs

했더니, Query OK, 0 rows affected (0.014sec) 메시지가 출력되었다. 그리고 다시 user 테이블을 확인해보았고, 해당 계정의 % Host와 localhost Host의 비밀번호가 동일한 것을 확인할 수 있었다.


1
2
3
4
5
6
7
8
9
10
+-------------------------------------------------------------------------------+
| Host      | User        | Password              | Select_priv  | Insert_priv  |
+-------------------------------------------------------------------------------+
| localhost | mariadb.sys |                       | N            | N            |
| localhost | root        | *E1C459C5 ~~~~~~~~~   | Y            | Y            |
| localhost | mysql       | invalid               | Y            | Y            |
| localhost |             |                       | N            | N            |
| %         | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
| localhost | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
+-------------------------------------------------------------------------------+

cs

이후, tomcat을 재구동하였더니 정상동작 하였다.



3. 후기


MariaDB를 직접적으로 설정하고 사용할 일이 없어 여러모로 삽질을 많이하게 되었다. 문제해결하면서 알게된 점을 아래에 간략하게 작성해보았다.

계정은 Host(권한)별로 password가 지정된다는 점이다. 위에서도 보여지듯, test 계정임에도 불구하고 로컬(같은 서버내)에서 접속가능한 비밀번호와 외부에서 접속 가능한 비밀번호가 각기 설정되어있다.


또한, 명령어의 password('비밀번호')는 자동으로(?) 인코딩되어 설정된다는 점이었다. 혹시나 싶어 구글링한 결과 그대로 작성해보았는데, 알아서 인코딩되어 저장되는 것을 보니 어딘가에 설정이 박혀있는게 아닐까 싶다. 뭐 복잡시럽게 sha256으로 인코딩해서 직접 박아넣는게 아니라 다행이다 싶다.


위의 상황이 발생하게 된 계기는, 하나의 서버를 여러부서가 공동으로 개발장비로 사용하는 중이었고, MariaDB를 우리팀에서 설치, 사용을 하고 있었다. 그러다가 타 부서에서 MariaDB를 사용 할 일이 생기게 되었고, 우리가 설치한 MariaDB에 접속이 안되니 멋대로 서버의 root 권한으로 test계정의 localhost 비밀번호를 바꿔버려 생긴 문제였다. 거기에, 우리팀 막내가 당일 MariaDB 설정과 관련하여 파일 권한이라거나 기타 설정들을 바꾸면서 MariaDB Service를 재구동하는 등 여러 변경점이 생기다보니 우리팀 내에서만 원인 찾기가 힘든 상황.


나의 경우에는 계정-host별 비밀번호가 다르게 적용되는 줄 몰랐던터라, 애꿎은 DB보안프로그램과 서버접속 보안프로그램 탓을 했었다. tomcat 재구동 작업을 하기 바로 전날 야간에 설치가 되었던터라, 이 부분이 문제인줄 알았던 것. 여러 작업적인 이슈가 겹치다보니 생긴 당연한 인재였다. 개발서버였기에 망정이지, 실 운영이 진행중인 운영서버였다면 초대형사고였을지도 모른다. 이러한 이유로, 무슨 작업이든 작업이 있을 경우에는 연관부서에 모두 noti를 해줘야한다는 것이다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

프로젝트를 하다가 p12 key로 SSL 적용할 일이 생겼다. 지금까지는 pem 키라거나 뭐 그런거로 했었는데. 여튼 오랜만에 적용해보니 살짝 헤매서 정리해놓는다.


p12든 뭐든 사실 크게 다른 건 없다. 단지 $catalina_home/conf/server.xml이 조금 달라질 뿐.


1
2
3
4
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxthreads="150" SSLEnabled="true" scheme="https" secure="true"
  clientauth="false" sslProtocol="TLS" keystoreType="pkcs12" 
  keystorePass="비밀번호" keystoreFile="/home/keystore/keystore.p12"/>
cs


별다른 건 없다. 위와 같이 적용해주면 된다.

기존의 Connector는 주석으로 너굴맨이 처리했으니 걱정말라구!


주의할 점은 keystoreType이 대소문자를 구분하는건지, PKCS12로 썻다가 안먹혀서 좀 당황했다.

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (1) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

RESTful API를 개발하다가 좀 멘붕에 오는 상황을 발견했다. postman으로 아무리 날려도 파라미터는 계속 false만 찍는 것이었다. 대략적으로 다음과 같았다.


1
2
3
4
private boolean isBusiness;     // 개인용 false / 법인용 true
private String userName;        // 개인용 - 사용자명 / 법인용 - 법인명
private String userSex;         // 개인용만 사용, 성별
private String userInfo;        // 개인용 - 사용자 태그 / 법인용 - 법인 태그
cs


로그는 다음과 같다.

2020-05-13 18:30:47.801  INFO 17740 --- [nio-9988-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

[사용자정보] UserIssueVO: UserIssueVO(isBusiness=false, userName=TEST, userSex=M, userInfo=TEST_tag)


파라미터를 바꾸면 잘되고 해서 대체 뭐가 잘못인가. 대충 30분 정도 고민하다가 개발자들의 꿈과 희망, 스택오버플로우에서 검색하니 다음과 같은 링크가 뜬다.


JSON Post request for boolean field sends false by default

https://stackoverflow.com/questions/21913955/json-post-request-for-boolean-field-sends-false-by-default


그래서 찾아보니, lombok과 같은 어플리케이션으로 getter/setter를 생성할 때에는 boolean 필드이름에 'is'를 쓰지 않는 것이 맞다고 한다. jackson의 java bean 네이밍 규칙이라고.

어쩐지 이후 로직을 짤 때 세팅하는 쪽에서 isBusiness로만 찍히기에 조금 의아하긴 했다.


여튼 한가지 알아둘 점은 lombok 사용시 boolean 필드명은 is를 쓰지 않는다는 것. 이거 하나면 됐다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

alias를 설정하면 긴 명령어(수많은 디렉토리들..)를 단축하여 편하게 작업할 수 있다.

나만이 쓰는 서버라면 무엇을 정해도 상관없지만, 공용개발서버라면 개발자들간의 이해와 협의가 필요할듯.


현재 적용된 alias는 alias 라는 명령어로 확인 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


현재 적용된 alias들

수정 명령어는 vi ~/.bashrc로 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost go]# vi ~/.bashrc
 
# .bashrc
 
# User specific aliases and functions
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cdh='cd /home/host'
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
 
# Source global definitions
if [ -/etc/bashrc ]; then
        . /etc/bashrc
fi
 
cs

alias를 적용하고, 저장 후 종료한 다음에는 꼭 source ~/.bashrc를 해줘야 현재 쉘에서 바로 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost go]# source ~/.bashrc
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


굳ㅋ

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (1) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

별건 아니지만 왠지 정리해야 할 것 같은 느낌이다.

UUID는 Universally Unique IDentifier의 약자로, 범용 고유 식별자라는 뜻을 갖고 있다. 유니크한 ID를 만들거나 뭐 활용도가 무궁무진하다. 사용법은 JAVA에서 그냥 import 후 사용하면 된다.


1
2
3
4
5
6
7
8
9
10
public static String uuid() throws Exception {
    try {
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid);        
        return uuid;
    } catch (Exception e) {
        // TODO: handle exception
    }
    return null;
}
cs


대충 요런식. 그러면 뭐 유니크한 ID가 나오게 된다.

별거 없다.

블로그 이미지

김생선

세상의 모든것을 어장관리

Tag java, UUID

댓글을 달아 주세요

오랜만에 아두이노를 만지고 있다. 만들고 싶은 물건이 있어서. 그러다보니 환경설정부터 해서, 모두 다 새로 하고 있는데 오래간만에 하니 요상시런 에러가 뜬다.

참조로 지금 사용하는 환경은 아두이노 나노에, 정품이 아닌 호환보드를 쓰고 있다. 처음에 개발할 때에도 뭔가 이것저것 설정값을 만지다가 겨우 성공했는데 어떻게 했는지 까먹어서, 이번엔 제대로 적어두고자 한다.



avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00


뭐 대충 이런 에러인데, 뭐 인터넷에서 대충 검색해보면 아두이노 포트라거나 드라이버를 제대로 설치하라고 한다. 거기에 DI포트라거나 뭐 이런 말들이 많은데, 사실 가장 먼저 확인할 일은 다음과 같다.


1. 드라이버 설치

드라이버 설치와 같은 경우에는 현재 사용중인 운영체제(Windows/MacOS) 등에서 아두이노 개발을 하기 위해 필수적인 과정이며, 아두이노에서 사용하는 프로세서의 드라이버가 필요하다. 호환 아두이노 나노는 CH340 프로세서를 사용하며, 이는 정품 아두이노 나노와는 다르게 드라이버를 직접 설치해줘야 한다.


2. 아두이노 포트 확인

아두이노 포트는 Windows10 기준, 장치관리자에서 다음과 같이 확인이 가능하다.


장치관리자의 포트(COM & LPT) 항목에서 USB-SERIAL CH340 (COM3)가 바로 현재 USB로 연결중인 아두이노 나노의 모델명과 포트이다.

포트는 COM3 포트로 연결되어있는 것을 확인할 수 있다. 여기까지 되었으면 3번으로 가자.


3. 현재 아두이노 IDE 환경의 보드와 프로세서 선택



먼저 툴 - 보드 항목에서 정상적으로 아두이노 나노로 선택되어있는지 확인하자. 물론, 포트 항목에서 장치관리자에서 확인한 것과 같은 포트로 선택되어있는지도 확인해야 한다.

나의 경우에는 아두이노 우노로 선택되어있었기에 문제가 생겼던 편이었다.




아두이노 나노로 선택하고나서는 프로세서를 선택하자. 호환 아두이노 나노의 경우에는 프로세스가 ATmega328P(Old Bootloader)로 선택되어야 정상적으로 동작한다.




블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요


현재 콘솔 게임시장은 세 회사가 참여하고 있다. 소니의 PlayStation, 마이크로 소프트의 XBox, 닌텐도의 Switch가 그러하다. 그리고 PC게임 시장까지 더하면 어마어마하게 많지만 주로 밸브의 Steam 정도가 가장 파이가 크다고 볼 수 있다.

인터넷이 100mbps는 최소한, 우리나라에서는 기본으로 보급되는데다가 요사이는 1Gbps도 심심찮게 보인다. 거기에 이동통신망 5G 기술까지 더해지면서 인터넷이 안되는 곳을 찾기가 사실상 더 어려워진 형태이기도 하다. 이러한 여러 상황에 맞추어 나온 게임 기술 중 하나가 바로 클라우드 게이밍이 되겠다.


소니에서는 플레이스테이션을 활용한 PS Remote, 게임회사는 아니지만 클라우드를 활용하는 구글 스테디아, 그래픽카드 제조사로 유명한 nvidia의 지포스 나우, 그리고 이번 글에 소개할 마이크로 소프트의 xCloud가 그렇다. 운 좋게도 설 연휴 직전, xCloud 프리뷰가 확대되면서 이번에 즐기게 되었다. 주로 한 게임은 기어즈5와 헤일로5 멀티플레이. 포르자 호라이즌4도 좋아하는 게임이긴 하지만 내 취향은 FPS에 더 가까웠다. 기어즈5의 경우에는 아직 엔딩을 보지 못한터라 엔딩 보기 위해 플레이를 했고, 헤일로5의 경우에는 멀티플레이를 워낙 좋아하는 터라, 멀티플레이 위주로 즐겼다. 플레이를 한 환경은 갤럭시S10 또는 갤럭시탭S6이며, LTE 및 Wifi 5Ghz 환경에서 이용했다. 컨트롤러는 XBox One X를 사면서 기본 번들로 들어있는 3세대 블루투스 컨트롤러였으며, 이후 XBox Elite Controller Series2를 해외에서 직구하여 사용하게 되었다.



(이미지 설명 : 엑박으로 엔딩 보다가 실패한 것을 스마트폰으로 보게 될 줄이야)


일단 일반적인 상황에서의 LTE 및 Wifi 환경에서는 크게 지장이 없는 수준이었다. 오히려 신호만 정상적으로 확보된다면 굳이 콘솔 또는 PC를 구매하지 않아도 괜찮겠는데? 수준인지라 놀라웠다. 블루투스로 연결되는 스마트폰-패드간의 딜레이도 크게 느껴지지 않았으며, 게임 내의 반응속도는 빠릿빠릿했다. 손바닥만한 휴대폰 화면이라서 그런지 그래픽이 크게 나쁘다는 생각은 들지 않았고, 오히려 이정도 그래픽이 실시간 스트리밍이 된다는 것이 아주 놀라울 정도였다. 진지하게 다음세대 콘솔게임기인 Xbox Series X는 안사도 되는건 아닐까 싶을 정도로 마음에 들었다. 하지만, 장점만 이야기하자면 재미가 없겠다.


설 연휴동안에는 LTE 신호나 Wifi 신호가 크게 문제 없을 환경에서 플레이를 했었으나, 사실 내가 주로 이용하는 환경은 신호가 불안정한 출퇴근 러시아워 지하철 환경이었다. 개중에는 한강을 건너는 구간도 존재하며, 지상에서 지하로 진입(물론 역순도 존재)하는 구간도 존재하다보니 기지국이 변경되는 구간이라거나 환승하면서 인파가 몰리는 구간, 한강을 건너면서 신호가 약해지는(또는 아예 안잡히는) 구간도 존재했다. 이러한 환경에서는 스트리밍하는 화면이 모두 깍두기가 되는 건 당연하고 스트리밍에서 튕기기조차 한다. 옆사람이 하는 모바일 배틀그라운드는 아주 잘 되는데, 나만 이러니 조금 억울하기까지 한다. 물론 모바일 배틀그라운드는 클라이언트가 설치되며 좌표수신 방식이기에 이러한 신호 문제에서는 조금 더 여유가 있을 수는 있겠다. 사실 이 점이, 유저들이 불만족스럽다고 느낄만한 가장 큰 부분일 것이라고도 생각된다.



(이미지 설명 : 사실 헤일로 멀티는 사생결단 외엔 잘 하지 않는다)


그 외의 점에서는 사실상 불만족스러운 부분은 없다. 뭐, 신호가 약하면 화질이 깨지거나 플레이 불가능하다는 점이 가장 큰 문제긴 하지만 말이다. 나머지 자잘한 문제라고는 컨트롤러 없이는 게임이 불가능했었다는 점이나, 이마저도 마이크로 소프트에서 소프트웨어 가상키 기능을 업데이트 하면서 문제가 해결되었다. 물론 당연하게도, 가상키다보니 키 입력이 필수인 대부분의 게임은 플레이가 아주 어렵지만 간단한 퍼즐류나 턴제 RPG 게임류는 무리없이 즐길 수 있을 것이다. 아예 안되는 것 보다, 불편하지만 조금이라도 되는 것은 아예 다른 문제니까.


다만 아쉬운 점은 아직 요근래 최신 스마트폰 비율인 20:9 비율이라거나 하는 변태 디스플레이 해상도를 완벽지원하지 않는다는 점 정도였으나, 이 글을 수정하는 시점인 2020년 02월 13일 기준, 삼성과 마이크로소프트의 파트너쉽 체결에 다라 이러한 변태 디스플레이 해상도 지원에 한숨 놓을 수 있지 않을까 하는 희망이 생겼다.



(이미지 설명 : 물론 데이터 소모량은 어마어마한 수준이다.)


거기에 Xbox 컨트롤러 중, 3세대 컨트롤러만이 블루투스 기능을 지원하는데 이 컨트롤러 뿐만 아니라 소니 듀얼쇼크4라거나 기타 제조사에서 개발한 컨트롤러도 일부 사용이 가능하다는 점이다. 이러한 부분에서 마이크로 소프트가 클라우드 게이밍 환경에 취하는 자세가 상당히 본격적이라는 점을 알 수 있었던 부분이다. 직접 플레이 해본 것은 아니지만 지포스 나우, 구글의 스테디아, 소니의 리모트 플레이는 사실 인풋렉이 엄청나다고 듣긴 했다. 


앞으로 기대되는 부분은 요금제만 남았다. 신호만 확보되면 플레이하는 것에 문제 없음을 마이크로 소프트는 증명을 해주었고, 신호 확보는 유저나 통신사가 어느정도 해결해야 하는 부분이라 여겨진다. 마이크로 소프트가 기지국 까지 세워줄 수는 없으니까. 어느정도 합리적인 선에서 게임과 멀티플레이를 함께 즐길만한 요금제를 출시해준다면 기꺼히 지갑을 열 용의가 있다. 현재 XBox의 요금정책은 다음과 같은데, 콘솔 게임 구독형 모델인 XBox Game Pass와 콘솔 전용 멀티플레이 요금 모델인 XBox Gold Live, PC(Windows 10) 게임 구독형 모델인 Game Pass For PC와 이 모든 것을 합친 Game Pass Ultimate 가 존재한다. XBox Game Pass와 XBox Gold Live 각각 한달 기준 9.99달러, Game Pass Ultimate가 15달러 정도로 알고 있는데 어쩌면 Game Pass Ultimate를 결제하면 스트리밍이 기본이라거나 하는 식으로 운영되지 않을까. 조금 더 욕심부려 10달러 선에서 나왔으면 좋겠다 싶기도 하다.



(이미지 설명 : 진짜 틈만 나면 사생결단 한 판씩)


집에서는 10인치 타블렛은 갤럭시탭S6 에 5Ghz Wifi로 자기전에 헤일로5 멀티플레이를 서너판 정도 한다. 출근과 퇴근, 점심시간에는 갤럭시S10 LTE로 ‘끊기지만’ 헤일로5 멀티플레이를 서너판 정도 한다. 기본 번들 3세대 컨트롤러 인지라 진지하게 엘리트 패드 2를 해외직구로 살지, 아니면 그립감이 좋은 한정판 컨트롤러를 살지 고민중었다가 1월 말 즈음 바로 질러버리기도 했다. 헤일로 때문에 15년 전 엑박에 입문한 내가 지금까지도 엑박에 이렇게나 목매고 있을 줄은 몰랐다. 관심이 살짝 사그라질 무렵에 다가온 xCloud는 다시 내 관심을 사로잡기에 충분했다.



(이미지 설명 : 이로써 20만원 짜리 패드가 두개나 생겨버렸다. 이정도면 호구 아니냐)


XBox One X 하드웨어 스트리밍 세팅을 이번주 중에 끝내고, xCloud 대신 하드웨어 스트리밍도 체험해 볼 예정이다. xCloud 프리뷰 당첨이 되자마자 모든 모바일 게임을 삭제하고 심지어 집에 있는 XBox One X 게임을 스트리밍 하겠다고 SKBroadband를 해지하고 KT로 통신사를 변경하기까지 했다. 이정도면 충분한 엑박전사의 자질이 보이는 것 아닐까.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요