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

2022년 11월 29일 화요일

문득 시스템이 시작할때마다 윈도우즈 캐시 파일과 임시 파일들을 삭제해 주면 어떨까? 라고 생각해 보았다.

회사 컴이

C 드라이브의 용량이 SSD 128GB로

좀만 쓰다보면 2GB 미만으로 떨어지곤 해서리..

그때마다 임시 파일들을 날렸는데..


오늘 문득..

이걸 배치파일로 만들어서 컴 킬때마다 날려주면 어떨까?

란 생각이 들어서 해 보았다.


일단 자료는

https://www.hexnode.com/mobile-device-management/help/script-to-clear-cache-and-temporary-files-on-windows-devices/


위의 것 참고해서

파일로 만듬.

파일다운로드


설명하자면..

파워쉘 스크립트로 윈도우즈 캐시 파일을 바이든하고

DOS 커맨드라인에서는 윈도우즈 임시 파일을 날린다(바이든한다).

(위의 문장이 뭔가 이상하다면 그것은 귓구멍이 정상입니다.)


파워쉘을 배치로 구동시키기 위해서 bat로 RunSytemCacheRemove.bat를 만듬.

윈도우즈 시작프로그램에

RunSytemCacheRemove.bat 과

WindowsTempRemove.bat 두개를 넣어주면 윈도우즈 시작때마다 알아서 지워 줄 꺼임.


끗!!!


------------------------------------------------------------------------------

2022-11-29 추가 : 구글에서 첨부파일을 악성 코드 취급해서리.. 아얘 소스 적기로..

---------------------------------------------------------------------------------

RunSytemCacheRemove.bat 파일 내용

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './SystemCacheRemove.ps1'"


SystemCacheRemove.ps1 파일 내용

$objShell = New-Object -ComObject Shell.Application 

$objFolder = $objShell.Namespace(0xA) 

$WinTemp = "c:\Windows\Temp\*" 

#1# Remove Temp Files  

write-Host "Removing Temp" -ForegroundColor Green  

Set-Location “C:\Windows\Temp”  

Remove-Item * -Recurse -Force -ErrorAction SilentlyContinue  

Set-Location “C:\Windows\Prefetch”  

Remove-Item * -Recurse -Force -ErrorAction SilentlyContinue  

Set-Location “C:\Documents and Settings”  

Remove-Item “.\*\Local Settings\temp\*” -Recurse -Force -ErrorAction SilentlyContinue  

Set-Location “C:\Users”  

Remove-Item “.\*\Appdata\Local\Temp\*” -Recurse -Force -ErrorAction SilentlyContinue  

#2# Empty Recycle Bin  

write-Host "Emptying Recycle Bin." -ForegroundColor Blue  

$objFolder.items() | %{ remove-item $_.path -Recurse -Confirm:$false}  

#3# Running Disk Clean up Tool  

write-Host "Running the Windows Disk Clean up Tool" -ForegroundColor White  

cleanmgr /sagerun:1 | out-Null  

$([char]7)  

Sleep 3  

write-Host "Cleanup task complete!" -ForegroundColor Yellow  

Sleep 3  

##### End of the Script ##### 


WindowsTempRemove.bat 파일 내용

@echo off 

echo is clearing system junk files, please wait... 
 
del /f /s /q %systemdrive%\*.tmp 

del /f /s /q %systemdrive%\*._mp 

del /f /s /q %systemdrive%\*.log 

del /f /s /q %systemdrive%\*.gid 

del /f /s /q %systemdrive%\*.chk  

del /f /s /q %systemdrive%\*.old 

del /f /s /q %systemdrive%\recycled\*.* 

del /f /s /q %windir%\*.bak 

del /f /s /q %windir%\prefetch\*.* rd /s /q %windir%\temp & md %windir%\temp 

echo clear system garbage is complete!

exit


각자 긁어서 파일명으로 저장한 뒤

필요할 때마다 실행 OR 시작프로그램에 등록해서 실행

(ps1 파일은 Power Shell Script 파일로 시작프로그램에 등록 시 RunSytemCacheRemove.bat 을 통해 실행하는 것임. 3개 다 같은 디렉토리에 넣고 실행할 것!)

2022년 11월 16일 수요일

네이버 ncloud SENS (Simple & Easy Notification Service) jsp로 SMS 전송 개발

어쩌다 보니 2부가 된

네이버 ncloud SENS (Simple & Easy Notification Service) 로 문자 전송

대망의 JSP 편!!

할말이 없으니 바로 소스

네이버 ncloud SENS (Simple & Easy Notification Service) java로 SMS 전송 개발

알바로 이것저것 하는 중에

네이버 ncloud SENS (Simple & Easy Notification Service) 로 

문자 전송 (추후엔 카톡까지 연동) 을 개발하게 됨.


구글링 하다보니.. spring에서 돌리는 소스를 발견


내가 개발 중인 환경은 jsp 이기에 이 소스를 컨버젼해서 쓰면 되겠군.. (아싸 득템)

이란 마음으로 시작...


아오 썩을..

계속 401 오류가 나온다.. (Authentication Failed)

네이버 쉑끼들한데 문의를 해보니 원론적인 답변만...

API 문서 : https://api.ncloud-docs.com/docs/ai-application-service-sens

네이버 쉑끼들한데 일단 한마디..


니들이 뭐가 그리 잘나서 우리는 고객의 코드를 리뷰 안해줌~~ 이딴 소릴 지껄이냐.. 

내가 니들 서비스 공짜로 쓰냐! 다 돈내고 쓰는거고.. 내가 몇백줄을 보낸 것도 아니고..

거기다가.. 니들이 만든 문서하고는.. 온갖 개폼은 다 잡아놓은 문서임.. 

알아먹을려면 알아먹어봐라 라는 중2병스러운 쓰레기를 만들어 놓고는 꼴깝 좀 떨지마라..


그리고.. 잘못된 소스를 올려놓은 어떤 블로그에게 한마디..

님의 소스에 수많은 개발자들이 오늘도 삽질을 합니다.

좀 잘 좀 확인하고 올립시다. 

내 뒤에 오는 사람들은 우리같은 고생은 안하는게 좋지 않겠습니까?


자 이제 진정하고.. 이제 소스 리뷰... 

JAVA 버전부터..

2022년 6월 16일 목요일

구글 Flutter 로 하이브리드 웹 앱 띄우기 1

이래저래 사정이 있어서

구글 Flutter 로 하이브리드 웹앱을 만드는 중..

시간 관계 상 자세히 파고드는 건 다음에 하고..

일단 만드는 것 우선으로 해서 이래저래 찾아보면서 소스 줒어서 조립 중..

다음이 그 소스..

시간 될 때 Flutter 는 함 배워볼 만 할 듯..

0. 세팅은 알아서.. 유튜브나 구글링 해보면 강좌들이 많다. 사용한 Flutter 버전은 3.0.1

1. 소스는 간단하나 실제로 Webview 를 띄워보니 javascript가 전혀 동작하지 않아서 먹통이 되어 황당했음.

2. 별도의 javascript 처리기를 구현해야 함을 구글링을 통해 알고, 처리 후 정상작동 확인.

3. javascript 처리기 원 소스는 다음 링크 : https://cording-cossk3.tistory.com/103

4. 그리고 앱 빌드하고 구동시에 사이트 로딩시 'net::ERR_CLEARTEXT_NOT_PERMITTED' 같은 오류가 발생한다면 다음 링크 확인 : https://stackoverflow.com/questions/55592392/how-to-fix-neterr-cleartext-not-permitted-in-flutter

이하 소스!

끗~~! 뭘봐!



import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        //appBar: AppBar(),
        appBar: AppBar(
          title: const Text('제목자리'),
        ),
        body: WebView(
          initialUrl: '호출할URL',
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            //_controller.complete(webViewController);
          },
          onProgress: (int progress) {
            print("WebView is loading (progress : $progress%)");
          },
          javascriptChannels: <JavascriptChannel>{
            _webToAppChange(context),
          },
        ),
      ),
    );
  }
}

JavascriptChannel _webToAppChange(BuildContext context) {
  return JavascriptChannel(
      name: 'webToAppChange',
      onMessageReceived: (JavascriptMessage message) {
        // ignore: deprecated_member_use
        print("webToAppChange 메시지 : ${message.message}");
      });
}

2021년 7월 15일 목요일

APACHE ZEPPELIN DYNAMIC FORM 고급 응용


APACHE ZEPPELIN DYNAMIC FORM 고급 응용

제목은 거창하지만, 실제론 dynamic form 메뉴얼의 부실함을 보강하고자 포스팅 함.

jdbc 는 지난번 글을 잘 따라 했으면 별 이상이 없을 것이다.

그리고 zeppelin의 dynamic form이란걸 써보면.. (아래 링크 가서 좀 보고 오자!)

https://zeppelin.apache.org/docs/0.9.0/usage/dynamic_form/intro.html

오~~! 귀찮은 검색 항목 만드는 거 안해도 되네?

텍스트 입력에, 셀렉트, 비번, 거기다가 체크박스 까지!!!


오늘도 삽질의 대가는 열심히 삽질을 합니다..

사실.. 오늘이 아니라.. 1달 넘었습니다.


진짜.. 메뉴얼이 너무 부실해서.. 환장하겠음..

그리고 기본 설명이 $를 사용하는 거만 나와서리..

응용을 어떻게 해야하는 막연함이 느껴진다.

기본 응용 (해당 내용들도 여기저기 흩어져 있어서 찾기도 힘들다..)

https://zeppelin.apache.org/docs/0.9.0/interpreter/python.html



1. noteTextbox 에 placeholder 처럼 기본 값을 표시하고 싶다.

z.noteTextbox("최초입고시작일", "YYYYMMDD");
(입력 폼 이름, 기본값) 의 형태로 작성

2. noteSelect 사용 방법
기본은 z.noteSelect("f2",[("o1","1"),("o2","2")],"o1") 형식으로
(입력 폼 이름, 옵션항목, 기본값) 의 형태로 작성
좀 더 응용을 하면.

arrRetYear = [("2021","2021"),("2020","2020"),("2019","2019"),("2018","2018"),("2017","2017"),("2016","2016")]; 
selRetYear = z.noteSelect("조회년도", arrRetYear, "2021"); 
arrChkOpt2 = [("N","미출력"), ("Y","출력"), ] 
selChkOpt2 = z.noteSelect("합계출력", arrChkOpt2);
이런 식으로 옵션의 항목을 따로 코드로 작성하고 할당하는 식으로 코드를 작성했다.


3. noteCheckbox 사용 방법이 항목이 제일 난관이었음.
메뉴얼에는 $를 사용하는 것만 있음.
내가 하고 싶었던건 공통으로 체크 입력 항목을 놓고
선택된 것들에 대한 집계를 내려고 했으나,
이상하게 Class Cast 오류만 신나게 뿜어 댐.
물론 쿼리 안에다가 $를 사용하는 것은 잘 됐음.
엄청 삽질하다가 결국 알아낸 것.


가. 일단 공통으로 쓸 체크박스 폼을 python 에서 작성한다. (매우 중요!)

arrRetYear = [("2021","2021"),("2020","2020"),("2019","2019"),("2018","2018"),("2017","2017"),("2016","2016")]; 
selRetYear = z.noteCheckbox("조회년도", arrRetYear, "2021");

위의 예를 보면.. 셀렉트와 완전 같다. 기본값 지정하는 것도.

나. python으로 작성된 paragraph를 미리 한번 실행해서 공통 입력을 받을 체크박스 폼을 생성한다.

다. jdbc를 연동한 paragraph 에 체크박스 폼의 값을 사용하는 곳에 입력을 한다.

$${checkbox(:):조회년도=,2021|2020|2019|2018|2017|2016}'


위의 예제설명:

{checkbox(구분자):폼양식명(python에서 사용한것과 일치!)=기본값(여기선 선택안함),체크박스 배열의 key 또는 이름}

여기서 제일 마지막 항목의 체크박스 배열의 key 또는 이름은 두개다 사용해 봤는데,
키 값을 넣던, 이름을 넣던 상관없이 python에서 준 코드 값으로 넘어갔다.

4. paragraph를 연속적으로 실행
지난번에 z.run(paragraphId) 로 해당 paragraph를 실행하라고 했는데, 3가지 선택사항이 있다.

가. z.run(paragraphId) : 해당 paragraph 1개 실행
나. z.run(noteId, paragraphId) : 해당 note의 해당 paragraph 1개 실행
다. z.runNote(noteId) : 해당 note의 모든 paragraph 실행

디버깅 할 때는 z.run이 편하고, 완성하고 runNote로 교체하니 코드가 깔끔하게 정리가 됐다.
참고로, 메뉴얼에 z.run 이라고 써 있다고 그대로 하면 안된다.. z.z.run 이라고 해야 함. 
(; ̄Д ̄)
z.runNote 는 z.z 라고 안해도 됨.. (이게 뭐냐...)

후기.
메뉴얼이 너무 부실해서 저 체크박스 알아내는데, 정말 오래 걸렸다.
나온지 꽤 된 걸로 알고 있는데도 아직도 메뉴얼이 엉망진창이다.
이후에 개발하시는 분들은 이걸 보고 그나마 조금이라도 고생을 덜 하시길...
〜( ̄▽ ̄〜)

2021년 6월 3일 목요일

Apache Zeppelin Dynamic Form + JDBC 연동

Apache Zeppelin 에는 Dynamic Form 이란 것이 있다..

paragraph에 사용자가 원하는 매개변수를 입력받을 수 있게 하는 양식을 제공하는 기능이다.

일단 메뉴얼 투척~~!

https://zeppelin.apache.org/docs/0.9.0/usage/dynamic_form/intro.html


메뉴얼 보면.. 매개 변수로 쓸 것을 ${변수명} 으로 사용하면 된다....

라고.. 아주~~~ 간단히 나와있다..


물론.. 이렇게 쓰면 되긴 된다..

그런데 말이지... 이렇게 쓰면.. 큰 문제가 생긴다..(나만 그런걸지도..)


일단 내가 하고 싶은거

공통 입력으로 시작일, 종료일, 매장 선택하여.. 매장별 매출등을 조회하고 싶음


1. 삽질 시작 

아~~ 매뉴얼 대로 쿼리 안에다가 넣으니까 폼이 생기고... 오오~~ 신기하네~~ 잘된다..

흠.. 그럼.. 한 Note에 paragraph 3개 생성해서.. jdbc로 연동한 걸

하나는 표, 차트 두개로 해 볼까?

2. 당혹

흠... 되긴 되는데.. 이렇게 되면.. 각 paragraph 마다 입력 폼이 생기잖여.. 입력은 한번만 해서 돌려써야 욕을 안 먹는데..

흠?? 메뉴얼 아래쪽에 Using form Templates (scope: note) 란거 보니.. 전역 변수로 쓸 수 있는 것 같다..

첫번째 paragraph에다가 jdbc interpreter로 쿼리를 날릴때 ${변수명} 을 사용하면 값 입력 폼이 생기고, 이걸 두번째 paragraph에다가 사용하면 되겠지?

해서 jdbc interpreter에다가 $${변수명을} 쓰고 조회!

--> null point exception이 아마 발생할 것이다...

3. 고민

완전 당황함.. sql 프로파일러로 들여다 보니.. 쿼리가 오지도 않음..

왜 이럴까.. 정말 몇일을 고민함..

stacksoverflow에 질문해도 답하는 놈이 없음.

https://stackoverflow.com/questions/67767714/exchanging-variables-between-different-paragraphs

youtube 동영상을 보니.. 다들 기초 예제만 하지..

이렇게 결합해서 하는 경우가 없음.

하여.. 계속 몇일을 삽질을 하다가..

겨우 알아냄..

4. 해결

가) 일단 메뉴얼이 좀 부실하다.. 내용도 좀 잘못된 것이 많음

나) 다른 interpreter는 모르겠으나, 나처럼 jdbc 사용하는 경우에 대해선 메뉴얼이 너무 허접함

다) 하여간 정답 공개

    a) 일단 공통으로 입력을 받을 폼은 첫번째 paragraph에 python으로 작성함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%python
 
dtst = z.noteTextbox("시작일", "20200101")
dted = z.noteTextbox("종료일", "20201231")
 
print("Textbox note " + dtst)
print("Textbox note " + dted)
 
arrStore = [("001", "PubDept"), ("002", "Store1"), ("003", "Store2")]
 
selStore = z.noteSelect("매장선택", arrStore )
 
print( "Select note " +  selStore )
 
 
z.z.run("paragraph_1622092568030_1007352330")
 
cs

코드 설명 : 
1. Textbox 생성시 noteTextbox를 써야 전체 입력 form으로 생성됨
2. Select도 noteSelect로 생성. 값은 편하게 알아보기 위해서 객체로 한번 선언해주고 사용했음.
3. 하단의 z.z.run 부분은 다른 paragraph를 연속해서 실행시키라는 명령임. (paragraph ID는 각자 사용하는 것을 쓰자!)

   b) 그 다음 paragraph에서 jdbc interpreter를 사용하자

1
2
3
%jdbc
EXEC USP_BIGDATA_003 '$${시작일}', '$${종료일}', '$${매장선택}';
 
cs

 코드 설명 :
1. jdbc interpreter는 이 글을 볼 정도면 알아서 잘했을 것이다. 그래도 모르겠다... 하시는 분들은.. 실력 좀 올려서 오자!! (기본적인 연동은 구글링하면 나온다... jdbc 연동 글 보기 : https://jaymz96.blogspot.com/2021/02/apache-zeppelin.html)
2. 내 경우엔 query 말고 procedure를 날려서 실행하게 했음.
3. python interpreter에서 선언한 이름을 $$개 붙여서 가져와 쓸 수 있다!!
4. 이제 전체 실행, 또는 공통 form에서 값을 입력하고 실행하면. z.z.run으로 연결된 paragraph들이 함께 실행됨을 볼 수 있다.
5. 이후는 입맛대로 진행


5. 교훈
가) 외국꺼라고 다 제대로 됐다고 생각하면 오산이다.
나) 양키 놈들도 아는척~~만 하는거지 제대로 아는 넘들은 없다
다) 네이년 다니는 쉑들도 다 사기꾼들임. 내가 더 잘났다. (옛날에 면접보고 떨어져서 이러는 거 아님.........)
라) 빅데이터는 사기이자 쑈다. 윗 선에 딱 흑세무민 하기 좋은 툴이다.

6. 끗~
이제 나도 윗선에 구라쳐서 이쁨 좀 받아보자!
진짜 끗~!



2021-07-14 내용 추가
jdbc 연동이 잘 안된다면.. 
jdbc 설정시에 zeppelin.jdbc.interpolation 이 항목이 false 라면 true 변경하라!



2020년 7월 8일 수요일

OpenMAINT 설치하면서 필요한 것들 정리중...


postgresql 설치 참고



centos 6 버전에서 tomcat 9 설치


계속 추가중...

OpenJdk 설치, 삭제, 업데이트

원문 : OpenJdk 설치, 삭제, 업데이트



CentOS 6에서 OpenJDK 11 이상을 쓸려고 해서 찾은 것 중에..



정말 잘 정리되어 있는 포스트...



Oracle에서 Java를 유료화 하면서 상업적인 목적의 서버에 Java를 설치하고 사용할 경우 주의해야 합니다. 로컬 PC에서의 개발은 oracle, openjdk 상관없이 사용해도 문제가 없지만, 서버 환경에서의 사용은 저작권이 침해될 수 있으므로 openjdk를 설치해서 java 어플리케이션을 구동하는 것을 추천합니다.

JDK8 및 이전 버전 설치

ubuntu, debian 계열 리눅스 설치

$ sudo apt-get install openjdk-8-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libvpx3
......... 생략
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for ca-certificates (20170717~16.04.2) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
done.
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

JDK 삭제

$ sudo apt-get remove openjdk*
$ sudo apt-get autoremove --purge
$ sudo apt-get autoclean

Fedora, Centos, Redhat 계열 리눅스 설치

$ sudo yum -y install java-1.8.0-openjdk-devel
Dependencies Resolved
=======================================================================================================================
Package Arch Version Repository Size
=======================================================================================================================
Installing:
java-1.8.0-openjdk x86_64 1:1.8.0.201.b09-0.amzn2 amzn2-core 259 k
Installing for dependencies:
alsa-lib x86_64 1.1.4.1-2.amzn2 amzn2-core 425 k
atk x86_64 2.22.0-3.amzn2.0.2 amzn2-core 258 k
avahi-libs x86_64 0.6.31-
Transaction Summary
....... 생략
=======================================================================================================================
Install 1 Package (+63 Dependent packages)
Total download size: 46 M
Installed size: 145 M
Is this ok [y/d/N]: y
libpng.x86_64 2:1.5.13-7.amzn2.0.2 libthai.x86_64 0:0.1.14-9.amzn2.0.2
libwayland-client.x86_64 0:1.14.0-2.amzn2.0.1 libwayland-server.x86_64 0:1.14.0-2.amzn2.0.1
libxcb.x86_64 0:1.12-1.amzn2.0.2 libxshmfence.x86_64 0:1.2-1.amzn2.0.2
libxslt.x86_64 0:1.1.28-5.amzn2.0.2 lksctp-tools.x86_64 0:1.0.17-2.amzn2.0.2
mesa-libEGL.x86_64 0:17.2.3-8.20171019.amzn2.0.4
Complete!
$ java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

JDK 삭제

$ rpm -qa | grep jdk
copy-jdk-configs-3.3-10.amzn2.noarch
java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64
java-1.8.0-openjdk-headless-1.8.0.201.b09-0.amzn2.x86_64
$ sudo yum -y remove copy-jdk-configs-3.3-10.amzn2.noarch
$ sudo yum -y remove java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64
$ sudo yum -y remove java-1.8.0-openjdk-headless-1.8.0.201.b09-0.amzn2.x86_64

JDK9 & later

최신버전의 jdk의 경우 apt-get이나 yum을 통해 업데이트가 늦기 때문에 다음 링크중 하나에서 openjdk 최신버전을 다운로드 받아 설치합니다.

다운로드

$ wget https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.3%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.3_7.tar.gz

압축해제

$ tar -xvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.3_7.tar.gz

JAVA 설치 디렉토리로 이동

리눅스에서 Java는 /usr/lib/jvm 밑에 설치됩니다. 기존에 설치한 Java가 있다면 해당 경로에 이미 다른 Java가 존재할 것입니다. 디렉토리가 없는경우 생성하고 위에서 압축해제한 jdk11을 해당 디렉토리로 이동 시킵니다.
$ sudo mkdir /usr/lib/jvm
$ sudo mv jdk-11.0.3+7/ /usr/lib/jvm/openjdk-11.0.3+7

사용중인 jdk 링크 변경

update-alternative –install 명령을 통하여 아래와 같이 수동으로 설치한 jdk11을 시스템에 업데이트합니다.
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/openjdk-11.0.3+7/bin/java 1
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/openjdk-11.0.3+7/bin/javac 1

java 버전 변경

update-alternatives –install 실행후에 java 버전이 이전 버전으로 나온다면 update-alternatives –config 명령으로 java 버전을 선택해 줍니다.
$ java -version
penjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.16.04.1-b12)
$ sudo update-alternatives --config java
There are 2 programs which provide 'java'.
Selection Command
-----------------------------------------------
*+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64/jre/bin/java)
2 /usr/lib/jvm/openjdk-11.0.3+7/bin/java
Enter to keep the current selection[+], or type selection number: 2
$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
$ sudo update-alternatives --config javac
There are 2 programs which provide 'javac'.
Selection Command
-----------------------------------------------
*+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64/bin/javac)
2 /usr/lib/jvm/openjdk-11.0.3+7/bin/javac
Enter to keep the current selection[+], or type selection number: 2
$ javac -version
javac 11.0.3
이후의 최신 버전은 위의 방법을 반복하여 버전업하면 됩니다. 이전 버전인 jdk8로 돌아가야 하면 update-alternatives –config를 다시 실행하여 jdk8을 선택하면 됩니다.

[낯선] 2026.06.20 이태원 MZK MuzikBar 공연

간만의 공연 이태원 비틀즈가 이전하여 MZK MuzikBar 로 새 단장 오픈을 한 뒤로 2번째 공연 새 베이시스트가 합류한 뒤로 첫 공연이기도 함.. 이래저래 틀린 부분도 많지만.. 그래도 간만에 그럭저럭 잘했다.. https://www.youtub...