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

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년 6월 17일 금요일

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

어쩌다 보니 2부작이 되어 버린 Flutter...

Flutter 에서 기본으로 제공하는 Webview를 사용해 보니

큰!!!!! 문제를 발견했다.

jquery를 사용하여 만든 사이트에서 파일 첨부하는 기능이 있는데..

input type='file' 태그가 전혀 동작하지를 않는다!!


쭈~~~욱~~~ 구글링을 해보니..

webview에 있는 버그(?) 라고..


그래서

webview_flutter_upload 란걸 써야 함!




카메라와 파일 첨부 둘 다 되는 것을 확인.

근데 왜 중국어가 나오는 것이여!!! 

이것도 뭐 하다보면 한글 나오겠지...

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 변경하라!



2021년 5월 27일 목요일

Apache Zeppellin 0.9.0 - Dynamic Form에서 Python 을 실행하면 오류가 발생한다??!

하아... 진짜.. 이거 오픈소스라고 하지만..

너무너무 귀찮은 일들이 자꾸 생긴다..

심지어 메뉴얼에 있는 걸 갖다가 붙여도 오류가 남..


이 오픈소스 관리하는 쉐리는 검증은 하고 올리는 건가...

%pyspark 인터프리터 쓰면.. 일단 안됨!

%python으로 변경해야 하며, 실행해도 type 관련 오류가 발생함..


일단.. 개발 환경은

Ubuntu 20.4 LTS + Apache Zeppelin 0.9.0 preview 1


구글링해서 본 글은 거의 다 쓰레기...

결국 찾아냄..

https://stackoverflow.com/questions/63754720/apache-zeppelin-issues-python-errors

요약하면.. 0.9.0 preview 2에서 버그가 있는데.. python 3.8에선 호환이 안된다는 거임..

Ubuntu 20.4 LTS 기본이 3.8을 사용하는 지라.. 다운드레이드를 할까 하다가..

그냥 설치하고.. interpreter 설정에 python 경로를 넣는 곳에 3.7을 지정하는 걸로 해결.


설치 할 줄 모르는 냥반들을 위한 코드 투척..

  1. sudo add-apt-repository ppa:deadsnakes/ppa
  2. sudo apt-get update
  3. sudo apt-get install python3.7


설치하고 Zeppelin의 interpreter 설정에서 zeppelin.python 항목을 python 3.7 이 깔린 경로로 넣어주자 (bin이 들어간 경로 넣으면 됨)

참고로.. 다운그레이드 후 pyspark 써 봤으나.. 동일하게 오류 발생..

(걱정말라구!! 이 글을 본 사람이 한 삽질은 내가 다 먼저 했다규!!! ㅜ_ㅜ)

그나저나.. 생각보다.. 너무 삽질을 많이해서.. 짜증이 그냥.....

끗!



2021년 5월 26일 수요일

Apache Zeppelin 에서 Helium 사용하기

Zeppelin 기본 차트로는 기능이 많이 부족하다!

왜 내가 본 너튜브에는 차트가 멋지던데 내 화면은 왜 이렇나!!


하셨던 분들...

Apache Zeppelin 설치하니까.. Helium 이라고 써있는데..

이게 뭔가 하신 분들..


이게 오픈 소스 차트 프레임 웍이다~~ 이거지요...

너튜브엔 뭐 그냥.. 이렇게~ 저렇게 하시면 Helium 플러그인 중에

이런 차트를 enable, disable 하실 수 있어요~~ 라고 하던데..


개뿔~~!

플러그인 자체가 목록에 안 나옴!

이래저래 Helium Install 관련 찾아봐도 안 나옴.

결국은 메뉴얼 안에 답이 있다~~~ 이거지!!

https://zeppelin.apache.org/docs/latest/development/helium/overview.html

근데.. 메뉴얼이 애매함..

내장되어 있다고 했는데.. 정작 interpreter 폴더에도 helium이 없고

플러그인 이라던지.. 어떤 곳에도 흔적이 없음..

현재 Zeppelin 버전은 2021년 5월 기준 0.9.0 임.

메뉴얼을 잘 보니.. zeppelin-site.xml 이 안에다가 구성할 수 있다고 써 있음..

그런데 왜 안 보이지? 한참을 또 이것저것 찾아 봄..

.

.

.

.

.

.

.

야이~~! X불넘들아~~!!! 주석으로 막아 놓으면 어쩌라고!!!

파일 안에 주석으로 막혀 있어서 안 나왔던 거임!

주석 풀고 Zeppelin 재시작 -> Helium 메뉴 들어가면...


오오~~ 이제 잘 보일 것이다~!!!


최근에 몇가지 기술들을 구글링하고 영상도 보고 하면서 느낀거...

대기업 다니고, 영어 좀 씨부린다고 해서 다를거 없다.. 그 쉐리들도 몰라.. 다 기본만 설명하지 어려운건 쏙 빼놓고 지 잘하는 거만 떠들어 대더라..


결론 : 나도 잘났다..


끗~! 뭘봐!



2021년 4월 30일 금요일

Apache Zeppelin에서 jdbc 연동시 조회할때 TLS 관련 오류 발생

0. 현재 개발환경

    - OS : Ubuntu 20.4

    - Main DB : SQL Server on Linux 2019 Express

    - 보조 DB : SQL Server 2008, SQL Server 2014

    - Java : Apache Zeppelin 권장 버전 (OPENJDK 1.8)

1. 보다시피 버전차이가 엄청 남.

2. Zeppelin에 jdbc (9.2.1) 연결을 했을때, SQL Server 2014는 아무 문제가 없음

3. SQL Server 2008에 연결시 TLS 버전을 지원 안한다는 오류 발생함.

4. 해당 서버 버전의 TLS 1.0 프로토콜이 너무 오래되서 지원을 안함.

5. 일단.. 해당 서버의 OS인 Windows 2008 R2에 TLS 1.1 / TLS 1.2 설정을 해줌.

6. 동일 에러 발생 - SQL Server 2008 자체에서 TLS 1.0 통신만 지원하는 것으로 판단.

7. jdbc 4.2를 쓰면 된다는 개소리 믿고 삽질하다가.. 다음과 같은 글 발견..

https://blog.naver.com/PostView.nhn?blogId=hgp33&logNo=221293449287&from=search&redirect=Log&widgetTypeCall=true&directAccess=false

8. 뭐 내용은 Java jdbc 보안문제로 동일함.

9. 문득 깨닮음을 얻은 나는 Ubuntu의 JRE에 있는 security 설정을 건들면 되겠다는 생각이 듬.

10. 저 링크에는 싹 지우라고 했지만... 글 자체가 3년이 넘은지라.. 

    내 목적인 TLS 관련 부분만 지움..

    jdk.tls.disabledAlgorithms 에서 TLS 1.0, TLS 1.1을 지워주자..

11. 당근 바로 안된다.. 서버 재부팅!!!

12. 해결!

13. 끗! 뭘봐!

2021년 4월 21일 수요일

Ubuntu 20.04.2 LTS에 Apache Zeppelin 설치 삽질기....

지난번에 Apache Zeppelin을 간편하게.. docker를 활용하여 설치했었음.

이젠 big data를 정식으로 개발해야 해서 실제 운영할 서버에 docker 말고..

ubuntu 20.04.2 LTS에 설치를 함...


역시나.. 언제나 그러하듯... 젠장.....

삽질 시작...

1. 처음엔... Apache Zeppelin의 메뉴얼에 있는대로 하자.. 기다렸다는 듯이.. 에러 뿜음..

2. 로그보니.. 디렉토리들.. 생성권한이 없어서 그런듯 하여.. sudo로 해결하거나 그냥 생성해주고 돌림..

3. 잘 돌아간거 같은데.. 아무리 접속해도 안뜬다 싶어서 얘는 방화벽을 어떻게 쓰나 보니 ufw 명령어를 쓰면 됨..

4. 이래저래 뒤져서 방화벽 열고, 돌렸는데... 아무리해도 연결 거부가 나옴..

5. 똑똑한 나는, 이거슨 안 올라온게 아니고, 방화벽이 하는 짓꺼리여~~ 라고 생각하며 iptables 로 어떻게든 해보려 했으나.. 달라진게 없음..

6. nc -l -p 포트번호 나 sudo netstat -tulpn | grep 포트번호 해도 포트는 이상없이 오픈 된 것으로 보임..

7. 그러다가... netstat 결과에서 127.0.0.1:포트번호 만 열려있는 것을 확인함..

8. 다시 Apache Zeppelin 메뉴얼 뒤지니... 서비스 할 IP를 지정하는 환경설정 발견..

9. conf 밑에 있는 zeppelin-site.xml.template 파일로 zeppelin-site.xml 생성한 다음 안에 있는 zeppelin.server.addr 속성값을 서버의 IP로 변경하니.. 해결..

 - 내용추가 : 그냥 모든 IP 접속 가능하게 0.0.0.0 으로 설정하면 됨!

10. 여기까지 오는데 5시간 걸림...

11. 삽질은 계속된다.. 쭈욱~~~~


2021년 2월 10일 수요일

Apache Zeppelin jdbc 구축기

회사에 빅데이터 분석 툴을 위해 이것저것 알아보고 조언도 듣다가..

일단은 Apache Zeppelin 을 구축해 보기로 결심..

1. 처음에는 내 로컬에 구축해서 돌려보려고 시도함.

2. 최신 버전이 2021-02-10 기준 0.9 버전인데.. 공식적으로 윈도우즈를 지원하지 않는 것으로 보임.. 어떻게든 돌려볼려고 했으나, 온갖 별의별 오류가 나와서 실패.

3. 오류 찾다가 시간 다 갈꺼 같아서.. 회사 NAS에 구축 시도.

4. 처음에는 시놀로지 NAS에 구축하다가, 콘솔 명령어가 너무 부족해서, CentOS 6.6 쓰는 파일서버로 계획 변경

5. 패키지 설치보다는 편안하게 docker로 설치하기로 결심

6. 환경이 mssql이라 mssql jdbc 드라이버 준비 (다운로드) : 최신버전으로 함 (9.2)

7. Apache Zeppelin docker image는 여기서 받음 (가보자)

8. docker 설치는 너무 쉬워서 패스, 기본 구동도 쉬워서 패스.

9. 참고글을 보고 진행함. 참고에서는 명령어를 치라고 되어 있는데, 그냥 sh 파일 만들어서 진행함.

10. 내용에서 좀 다르게 한거는 artifacts 이 경로가 실제 구동되었을때 위치가 좀 다르더만.. artifacts 안에다가 jdbc 드라이버를 넣으면 됨.

11. 참고글에는 jTDS 드라이버로 했으나, 내 환경에서는 되지 않기에 MS에서 제공하는 것으로 변경함.

12. 인터프리터 설정에서 jdbc 설정하듯이 하면 됨.. 쉽다..

13. 노트 생성하고 쿼리 날려보니 결과도 잘 나옴..

14. 자~~ 이제 뭘 해볼까...


끗!!


2020년 7월 7일 화요일

Synology에서 unzip 사용하기

openMAINT를 사용하려고 하는데..

Synology의 OS가 일반 linux 계열이 아니어서..

여러가지 난관이 발생함..

일단.. Java야 뭐 어찌어찌 깔았지만..

정작 다운받은 패키지에 sh 파일 안의 unzip이 먹지 않는 상황..

구글링을 통하여

다음과 같은 글을 참고하여..


ipkg를 사용하면 되는 것을 알게 됨..

1. 패키지 센터에 설정에서 다음의 패키지 소스 추가
http://www.cphub.net


2. 갱신하고 커뮤니티 탭으로 가서
iPKGuiEasy Bootstrap Installer 를 설치


3. iPKGui 를 사용하여 unzip을 깔았지만,
ssh로 들어가서 실행해도 command not found 나올 것임.
4. ssh 에서 /opt/bin/ 로 이동하면 ipkg 실행파일이 있음.


5. vi 나 nano를 사용해서 /etc/profilePATH를 추가해 줘야함..


6. nano를 쓸려면.. 다음으로 설치
sudo /opt/bin/ipkg update
sudo /opt/bin/ipkg install nano
sudo /opt/bin/nano /etc/profile


7. /etc/profile 을 열어보면..
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
가 있고..
끝에 :/opt/bin 를 추가해 줌..


8. 저장하고 닫은 다음.. 현재 세션에 바로 적용하려면..
source /etc/profile
해주면 적용 완료..


9. 확인하려면..
echo $PATH | tr ":" "\n" | nl
로 출력되는 것을 확인..

끗~!~! 뭘봐!!

2020년 5월 15일 금요일

Classic ASP로 네이버 단축주소 개발하기..

언어가 오래되서리...

갈아타지도 못하고...

편하게 Java 쓰고 싶뜨아....

기존에 bitly 쓰다가, 이 쉐리들이 API를 v3에서 v4로 업그레이드 하면서

기존 서비스를 완전히 먹통이 되게 함... (뭐 요딴놈들이 다 있나 싶다.. 무료 사용자라 무시하냐!)

v4로 업그레이드 하려는데.. 잘 안됨...(뭐든 시작이 이렇구만..)

만사가 귀찮아진 나는.. 또 머리를 굴렸다!!!

네이버 단축 주소 쓰자.... (따...딱히 자본력에 굴복한게 아니라는!!!)

어차피 xml http 통신만 구현하면 되고

기존에 xml 기반이던 것을 json 통신 기반으로 변경하면 됨.

소스 요약...

  1. Function fnNaverShorten(longURL)
  2.     Response.ContentType = "application/json"
  3.     reqAPIUrl = "https://openapi.naver.com/v1/util/shorturl?url=" & longURL
  4.     set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")  
  5.     xmlhttp.open "POST", reqAPIUrl, false
  6.     xmlhttp.setRequestHeader "content-type","application/x-www-form-urlencoded; charset=UTF-8"
  7.     xmlhttp.setRequestHeader "X-Naver-Client-Id", naverShortenClientID
  8.     xmlhttp.setRequestHeader "X-Naver-Client-Secret", naverShortenClientSecret
  9.     xmlhttp.send
  10.     if Request.QueryString("dbug") = "T" then Response.Write(reqAPIUrl)
  11.     fnNaverShorten = xmlhttp.responseText
  12.     set xmlhttp = nothing
  13. End Function

해설...
0. 일단.. 네이버개발자 센터에서 사전 준비 사항을 챙긴다!! (이것저것 생성 및 ID / 비번)
1. 난 그냥.. 컨텐츠 유형은 당연히 "application/json"
2. 뭐 너무 평범한 Classic ASP용 xml 통신 소스라.. 설명이 필요한지...
3. 발급한 ClientID와 ClientSecret를 잘 넣기만 해라..
4. 받는 Page에서 json 파싱은 알아서 해라.
5. 설명 귀찮다.. 끗...







2020년 4월 19일 일요일

org.apache.tomcat.util.bcel.classfile.ClassFormatException 문제 처리..

개발 환경

Synology NAS 에 개발중...

환경은 Tomcat 7 + Java 1.8에

gson 2.8.6 으로 데이터를 교환하게 처리 중..

편하게 설치하려면 Docker를 설치해서 가는 방법도 있지만,

난 귀찮은건 질색인지라.. 그냥.. 주어진 환경으로 진행!!

위의 환경을 내 로컬에 설정하고 서버를 돌렸더니..

org.apache.tomcat.util.bcel.classfile.ClassFormatException

문제가 지속적으로 발생.. 특별히 문제가 있는건 아닌거 같아서 그냥 넘어가려 했으나..

혹시나.. 실제 운영에 영향을 줄까봐 해결하기로 결심..

처음에는


위에 나와있는 걸 참고해서.. 개발 환경을 바꾸다가..

문득!!! gson 자체가 문제가 있는게 아닌가 싶어서 살펴보니..

낮은 java 에 대해서는 gson 2.6까지 인것으로 추정되는 문서를 봤음..

그래서.. 버전만 2.6.2로 낮추니.. 모든것이 해결...

이쯤되면.. 삽질은 컨셉인가...

2019년 11월 8일 금요일

Android WebView에서 웹페이지의 submit이 안 먹는 현상...

기존 asp로 돌아가는 모바일 사이트를 WebView로 띄워서

간단하게 갈려고 했는데..

세션처리문제는 어떻게든 통과했는데...

정작 장바구니에서 form을 javascript에서 submit을 해주는데..

전혀 동작을 안한다!!

온갖 구글링에 나온 짓은 다 해봤다...

  1. WebSettings settings = mWebView.getSettings();
  2.         settings.setJavaScriptEnabled(true);
  3.         settings.setDomStorageEnabled(true);
  4.         settings.setDatabaseEnabled(true);
  5.         //settings.setDatabasePath(dbpath);
  6.         settings.setJavaScriptCanOpenWindowsAutomatically(true);
  7.         settings.setSupportMultipleWindows(true);
  8.         settings.setSupportZoom(false);
  9.         settings.setAllowFileAccess(true);
  10.         settings.setAllowContentAccess(true);
  11.         settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

전부 안됨..

이래저래 찾아보다가..

jquery 형식으로 form에 id를 주고 submit을 날렸더니..

오히려 메모리 오류가 발생..

문득 떠오르는 것이 있어서 수정했더니.. 드디어 성공!!

기존 약식으로 form 객체를 변수로 받아처리하던..

  1. f.action = "~~~~~.asp";
  2. f.submit();


  1. document.Frm.action = "~~~~~.asp";
  2. document.Frm.submit();
로 그냥 쭈욱 써줬더니.. 어이없게도 submit이 된다..

에구.. 이걸로 2일이나 까먹음..

끗~!




2019년 10월 7일 월요일

iredmail 사용시 웹 클라이언트가 접속이 잘 안된다면...

iredmail을 기본설치 했더니

nginx를 was로 사용하는데, access로그가 한 가득인 걸 보니..

이 was에 공격이 들어오는 것으로 추정이 된다..

geoip를 사용해 볼까 했는데, 메뉴얼상에는 nginx 컴파일 단계에서

같이 넣어야 하는 것 같아서.. 이래저래 만져보다가 포기하고.

좀더 쉬운 fail2ban을 사용해서 차단하는 것으로 방향을 잡고

이래저래 찾아보다가.. 발견한 내 기준엔 완벽한 가이드!!

설명이 너무 잘되어 있음..

https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04


2019년 9월 25일 수요일

iredmail(postfix) 사용시 메일 포워딩 시 hostname not found 가 나온다면...

본문 출처

https://superuser.com/questions/975337/postfix-error-host-or-domain-name-not-found


수 도없는 구글링 끝에 찾아낸 답..

요약하면 iredmail 안의 postfix의 프로토콜 기본 설정이

ipv4와 ipv6를 같이 사용하게 되어 있음..

이걸 ipv4 전용으로 변경...

끗...

2019년 9월 6일 금요일

Youtube API 활용 팁

기획에서 Youtube 재생을 컨트롤 하는 것을 주문해서..

이것저것 해본거 정리..

요구 사항은..(나랑 의견이 안 맞긴 했지만...)

1. 동영상은 2개

2. 위에 동영상이 끝나면 자동으로 아래것이 재생

3. Youtube는 iframe 형식으로 사용

===============처리 방법=================

참조 문서 : https://developers.google.com/youtube/iframe_api_reference#Playback_controls

일단!!! 제일 중요한 부분!!! iframe에 들어있는 주소에 쿼리스트링으로 enablejsapi=1 을 붙인다!!! 이거 안 붙여서 1시간 날려먹음..

그리고.. api 호출해주고.. :

<script src="https://www.youtube.com/iframe_api">

이하 제어 스크립트.. 나머지는 주석 참고..


<
script >
    var player1, player2; //동영상 2개에 대한 객체 선언...

//onYouTubeIframeAPIReady 함수는 https://www.youtube.com/iframe_api 에서 자동으로 호출한다.. 별도의 호출 선언 없음..
function onYouTubeIframeAPIReady() {
    // iframe id 넣어줌 (player1)
    player1 = new YT.Player('player1', {
        events: {
            'onStateChange': onPlayerStateChange
        }
    });

    // iframe id 넣어줌 (player2)
    player2 = new YT.Player('player2', {
        events: {
            'onStateChange': onPlayerStateChange
        }
    });
}

function onPlayerStateChange(event) {
    //동영상 플레이어의 상태 변경시 호출됨...
    //console.log(event);
    //console.log(event.target.a.id)
    switch (event.data) {
        case 0:
            //재생 멈춤 상태값..
            //record('video ended');
            //플레이어가 1에서 이벤트가 발생했다면..
            if (event.target.a.id == 'player1') {
                //player2의 상태가 시작되지 않았다면
                if (player2.getPlayerState() != "-1") {
                    player1.stopVideo(); //멈추고
                    player2.playVideo(); //시작...
                }
            } else {
                if (player1.getPlayerState() != "-1") {
                    player2.stopVideo();
                    player1.playVideo();
                }
            }
            break;
        case 1:
            //재생 시작 상태값..
            //record('video playing from '+player.getCurrentTime());
            break;
        case 2:
            //재생 일시정지 상태값..
            //record('video paused at '+player.getCurrentTime());
            break;
    }
}

function record(str) {
    console.log(str);
} <
/script>

끗!


2019년 7월 17일 수요일

아주 가끔 필요한 MS-SQL용 달력 쿼리

회사에서

특정 기간 검색에 대한 일자별 통계를 내 주려고 하는데..

달력을 생성해야 해서리..

이래저래 찾은 거 중에 그냥 제일 간단한 거..

  1. SELECT CONVERT(CHAR(10),dateadd(d,NUMBER,'2019-07-01'),120) dt
  2. FROM master..spt_values
  3. WHERE TYPE = 'P' AND NUMBER <= datediff(d,'2019-07-01','2019-07-17')
  4. ORDER BY 1 DESC

가끔 쓰지만.. 요긴하다..

2019년 5월 10일 금요일

2019년 3월 21일 목요일

MSXML API 주소

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms764730(v=vs.85)

회사 사이트가 Classic ASP라 어쩔 수 없이 MSXML API를 사용함...

매번 찾기 힘들어서 기록상 남김.

2018년 11월 9일 금요일

읽기 전용인 input 태그의 값이 변경되었을 때, 감지 방법

진짜.. 이걸로.. 쌩쑈를 다 해서리.. 정리차 적어 놓음..

0. 쇼핑몰 리뉴얼 중 주문 화면에서 우편 번호를 받으면 이게 산간 오지 지역이면 도선료를 추가로 부여해야 하는 상황 발생.

1. 쇼핑몰 솔루션을 자체 마이그레이션 하는 것이기에 알아서 해야 함.

2. daum의 주소찾기 사용 중.

3. 솔루션에서 script로 자체 기능 구현해 놨음.. button 태그 클릭하면 class 감지해서 우편번호 검색기가 뜨게..

4. 문제는 우편 번호를 받는 input 태그가 readonly 속성이라.. 값을 전~~~혀 읽을 수 없음!!

5. 어쩔까 고민하고, 구글링 한 결과.. readonly 속성이 붙은 건 어쩔 수 없고, 키 입력이 안들어오게 막는게 더 낫겠다란 생각이 들음. (readonly 속성을 때면.. 값이라도 읽을 수 있으니..)

6. css로 readonly 속성이 된 것처럼 보이게 하고.. 자~~ 이제 onchange 이벤트로 값을 읽어보자!!!

7. 어? 이거 왜 못 읽지?

8. 이리저리 삽질 시작.. jquery로 이벤트 리스너도 추가. bind도 해보고 triger도 해보고..

9. 안된다!!! 이 쉬운게 안된다니!!! 이게 뭔 상황이지??

10. 좀 더 구글링을 해보니.. change란 이벤트는 키 입력이 이뤄져야 발생이 되고, 값을 고쳐준 경우엔 별도의 처리가 필요하다!~ 란 걸 알게됨..

11. 이하. 조치 내용...

12. 아직도 배울게 많군화~~~~

  1. var $input = $("#rcvPost")//이놈이 오늘의 주인공 우편번호 input box!!   
  2. $("#rcvPost").on('input'function() {
  3.     // Do this when value changes
  4.     console.log("Input text changed!" + $(this).val());
  5. });


이렇게 javascript에서 선언하고..

별도의 함수를 구현해야 한다.. 이하 코드..

  1. (function ($) {
  2.     var originalVal = $.fn.val;
  3.     $.fn.val = function (value) {
  4.         var res = originalVal.apply(this, arguments);
  5.  
  6.         if (this.is('input:text') && arguments.length >= 1) {
  7.             // this is input type=text setter
  8.             this.trigger("input");
  9.         }
  10.  
  11.         return res;
  12.     };
  13. })(jQuery);

이 같이 처리하면.. 값 변경이 일어나면.. 입력이 된 것처럼 동작시킨다..

진짜 끗!!





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

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