웹 어플리케이션이 아닌, 1회성 심플 자바 어플리케이션이 급히 필요하여

IntelliJ 에서 jar 파일 만들기에 도전해 봤습니다.


우선 샘플로 HelloWorld 프로젝트를 하나 만들었습니다.




FIile -> Project Structure 로 들어갑니다.




Artifacts 선택 후 Add에서 JAR -> From modules with dependencies 를 추가합니다.




JAR 생성 창이 나오는데요, Main Class (JAR 실행 시 처음으로 실행될 class)를 선택해 줍니다.






JAR 만들 준비가 다 되었네요.




이제 JAR를 만들어 볼까요?

Build -> Build Artifacts... 로 들어갑니다.




화면 한 가운데에 Build 옵션이 나오네요.



Build를 선택합니다.



좌측 프로젝트 내비게이터에 out 디렉토리가 추가된 게 보입니다.




탐색기로 확인해 보겠습니다.



jar 파일이 생성되었네요.



이제 제대로 생성되었는지 실행 한번 해보겠습니다.



Hello World 가 잘 보입니다.



어쩌다 한번씩 자바 어플리케이션 필요할 때가 있는데, 참고하려고 정리했습니다.


조금이나마 도움 되시길~

Posted by hyshin
TAG intellij, JAR

개발하다 보면 SSH 접속 툴로 Putty를 많이 사용하게 되는데요,


Putty의 단점이 바로 커넥션 관리가 쉽지 않다는 거죠.


이 때문에 많은 분들이 커넥션 매니저와 같은 별도의 프로그램을 많이들 쓰시는데요,


저는 커넥션 매니저 프로그램들이 좀 불편하다고 많이 느껴서 빠른 실행 아이콘을 만들어서 많이 사용하는 편입니다.


저도 매번 새로 설치하면서 빠른 실행 아이콘 만드는데 이게 만들때보다 좀 번거로워서요,


이번 기회에 옵션들을 좀 정리해 봤습니다.


우선 Putty를 설치해 보겠습니다.


https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html



최근에는 윈도우 버전은 Installer(msi) 버전으로 올라오네요.


다운 받아서 설치해 보겠습니다.



프로그램 목록에 추가 되었습니다.




이제 단축아이콘을 하나 만들어 보지요.




새로 만들어진 단축 아이콘의 속성을 열어보겠습니다.




이제 바로 가기 대상 뒤에 옵션을 붙여 주면 됩니다.


제가 주로 사용하는 옵션들은 다음과 같습니다.


 옵션

용도 

-ssh

SSH 프로토콜 사용 

-P

접속 포트 

-l 

로그인 사용자 이름(계정) 

-pw

패스워드


"C:\Program Files\PuTTY\putty.exe" -ssh 192.168.10.1 -P 8888 -l myid -pw mypassword


위와 같은 식으로 입력한 후 실행해 보면 곧바로 접속되는 것을 확인할 수 있습니다.



더 많은 옵션들은 Putty Manual에서 확인하실 수 있습니다.


https://the.earth.li/~sgtatham/putty/0.69/htmldoc/Chapter3.html#using-cmdline


조금이나마 도움 되셨길 바랍니다 ^^

Posted by hyshin


어제(9월 8일) 안드로이드 7.0 누가의 OTA 메시지를 받았습니다.

Nexus 5x 구입해서 마시멜로 사용한지 9개월만에 새 OS를 만났네요..

누가 업데이트 알림이 왔습니다


업데이트 후 제일 먼저 눈에 들어왔던 건

상단의 퀵세팅 타일이었습니다.

퀵세팅 타일이 심플해졌어요

마시멜로에서 처음 등장했던 퀵세팅 타일의 심플 버전이 생겼네요.

여기서 바로 와이파이나 손전등을 터치 한 번으로 켜거나 끌 수 있습니다.

 

이전 마시멜로에서는 넓은 타일이 나와서 한눈에 보기에는 편했지만

화면 대부분을 덮어서 좀 불편한 느낌도 없지 않았지요.


물론 누가에서도 심플 타일에서 아래로 한번 더 swipe 하면

넓은 타일을 볼 수 있습니다.


여기서 블루투스 이어폰을 연결하려고

블루투스 버튼을 터치했는데 이렇게....

곧바로 블루투스 설정 화면으로 들어가 버리더군요.

저는 우아하게 블루투스만 살짝 켜려고 했는데 말이죠.


우아한 조작을 위해서 수정 버튼을 터치하고 순서를 변경해 봤습니다.

수정 모드에서 해당 버튼을 길게 터치하면 이동이 가능합니다


퀵메뉴 타일에서 편리해진 또 하나가

배터리 세이버 모드 선택이 용이해 졌다는 겁니다.


마시멜로에서는 배터리를 선택해서

배터리 설정 화면으로 들어간 후

다시 배터리 세이버 모드로 들어가서 활성화 해야 했습니다.



마시멜로에서는 배터리 세이버 켜기가 쉽지 않습니다


누가에서는 퀵세팅 타일에서 배터리 터치하면

곧바로 배터리 세이버 선택이 가능해집니다.

배터리 세이버도 우아하게


잠금화면 알림창도 스타일리시하게 변했습니다.

스타일리시해 보이는 듯한 느낌적인 느낌

잠금해제 화면에서의 알림도 확실히 달라진 느낌입니다.

광고 메일도 우아하게 보이는군요


설정화면에도 들어가 봤습니다.

설정 메뉴별로 대표 설정값들이 한눈에 들어옵니다.

현재 설정값들을 한눈에 볼 수 있습니다


그리고 무엇보다 만족스러웠던 점..

여유 저장 공간이 1.6GB 이상 늘었네요.

마시멜로 때에는 2.9G 이던 여유 공간이 4.5G로 늘었네요

OS 업데이트 되면서 임시 파일이 삭제된 것일 수도 있지만

 OS 파일 크기도 줄어든 게 아닐까 싶네요.


오늘은 여기까지입니다.

이제 하루 틈틈히 써 본 거라 내용이 많지는 않네요.

계속 써보면서 또 올려보도록 하겠습니다.



Posted by hyshin

UIabel 위에  UIImageView 를 올려서

이미지를 라벨 위에 노출되도록 하려고 하는데


iOS7 에서는 문제 없이 노출되는데

iOS8 에서는 UIImageView가 UILabel 밑으로 들어가 버리는 문제가 생겼습니다.


UILabel *trainLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, posY, 85, 50)];
[cellView addSubview:trainLabel];

UIImage *noImage = [UIImage imageNamed:@"test.png"];
UIImageView *noImageView = [[UIImageView alloc] initWithImage:noImage];
noImageView.frame = CGRectMake(0, 0, 18.0, 18.0);
[trainLabel addSubview:noImageView];


 iOS7

iOS8 

 



 



레이어 순서 문제로 보여

Subview들의 layer 순서를 조절할 수 있는 방법을 찾다 보니

다음의 함수를 찾을 수 있었습니다.


- insertSubview:(UIView *) aboveSubview:(UIView *)

Inserts a view above another view in the view hierarchy.

Declaration

SWIFT

func insertSubview(_ viewUIView,
      aboveSubview siblingSubviewUIView)

OBJECTIVE-C

- (void)insertSubview:(UIView *)view
         aboveSubview:(UIView *)siblingSubview

Parameters

view

The view to insert. It’s removed from its superview if it’s not a sibling ofsiblingSubview.

siblingSubview

The sibling view that will be behind the inserted view.

Discussion

This method establishes a strong reference to view and sets its next responder to the receiver, which is its new superview.

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.


참고: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/insertSubview:aboveSubview:



addSubview 대신 insertSubView: aboveSubview 를 이용하여


UIImage *noImage = [UIImage imageNamed:@"test.png"];
UIImageView *noImageView = [[UIImageView alloc] initWithImage:noImage];
noImageView.frame = CGRectMake(trainLabel.frame.origin.x, trainLabel.frame.origin.y, 18.0, 18.0);
[cellView insertSubview:noImageView aboveSubview:trainLabel];


위와 같이 수정하니

iOS8에서도 iOS7와 같이 UILabel 위에 UIImageView 를 놓을 수 있었습니다.


조금이나마 도움 되셨기를.... ^^

Posted by hyshin

아이폰 앱 다운로드 링크


NSURL *appStoreURL = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id123456789"];

[[UIApplication sharedApplication]openURL:appStoreURL];


참고

http://stackoverflow.com/questions/433907/how-to-link-to-apps-on-the-app-store

Posted by hyshin

지난 WWDC에서 iOS 9가 발표되면서 apple developer 사이트에도 iOS 9 베타 버전이 공개되었는데요,


그래서인지 벌써부터 iOS 9 베타를 설치하시는 분들이 많이 계시더군요.


그런데 iOS 9로 업데이트한 후 운영 중인 앱이 사용할 수 없다는 VOC가 들어오더군요.


마침 xcode 7 베타 버전도 같이 공개되어 부랴부랴 다운로드 받아서 설치해 봤습니다.


시뮬레이터로 확인해 보니


App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

CFNetwork SSLHandshake failed (-9824)

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."


secure connection 이 필요하다는 메시지가 나오네요.


검색을 해보니 iOS 9.0 이상에서는 ATS(App Transport Security)라는 기술이 나오네요.


결론은 app - web 간 connection 에서는 secure connection 이 기본값이라는 ....


그런데 서버가 특A급은 아니다 보니.... 아무래도 SSL 암복호화 부하를 무시할 수는 없어서....


로그인이 필요 없는 일부 기능만이라도  SSL을 좀 피해보려고....


관련 내용을 찾아 봤습니다.


찾아보니 info.plist 에서 예외 처리를 할 수 있더군요.


NSAppTransportSecurity > NSAllowsArbitraryLoads : true 로 설정하면 ATS 를 비활성화 할 수 있습니다.




또는





다시 리빌드 해보니 정상적으로 사용이 가능하네요.


조금이나마 도움 되시기를....


※ 참고


https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html


https://github.com/facebook/react-native/issues/1563

Posted by hyshin

API를 통해 JSON 데이터를 받아

version의 NEWIVERSION을 찾아 NSUserDefaults에 값을 저장하는 로직입니다.


    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];

    if (ver != nil) {
        [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

그런데 API에 문제가 생겨 NEWIVERSION을 가져오지 못하게 되자

시뮬레이터에서 App이 죽는 현상이 발생하더군요.


Attempt to set a non-property-list object null as an NSUserDefaults/CFPreferences value for key NEWIVERSION

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object null for key NEWIVERSION'


NEWIVERSION key를 갖는 값 자체가 존재하지 않다 보니

Null 객체 insert 오류가 생겼던 거 같습니다.


그래서 NSNull 객체 검사를 추가해 봤습니다. 


    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];

    if (ver != nil &&
        ![ver isEqual:[NSNull null]]) {
        [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }


이렇게 처리하고 나니 API에서 오류가 발생해도 App 중지 없이 실행할 수 있었습니다.



Posted by hyshin

AIX 7.11 서버에서 소켓통신을 통해 데이터를 수신하는데

텍스트 내용이 잘리는 현상이 발생하였습니다.


그래서 실제 서버에서 수신되는 패킷을 확인해야만 했는데,

AIX 에서는 tcpdump 를 사용해서는 원하는 내용을 확인하기 어렵더군요.


그래서 관련 내용을 검색하다 보니

AIX 에서는 iptrace 를 사용한다는 내용을 찾았습니다.


그래서 급하게 iptrace 사용법을 찾아봤습니다.



옵션 

설명 

 -a

 ARP 패킷은 표시하지 않음 

 -i <interface>

 패킷 모니터를 할 인터페이스 

 -s <source ip>

 패킷 출발지 IP 

 -b

 bidirectional 양방향 패킷을 모두 모니터 

 -d <destination ip>

 패킷 도착지 IP  

 -p <port>

 모니터할 포트 지정 


iptrace -a -i en0 -s 123.123.123.123 -b -d 234.234.234.234 -p 8888 /home/krcash/iptrace


en0 인터페이스를 통해

IP 123.123.123.123 와 IP 234.234.234.234 가

8888 포트로 주고 받는 패킷을 모니터해서

/home/krcash/iptrace 파일로 저장


이렇게 실행하면 iptrace 프로세스의 프로세스 ID를 리턴하고

패킷을 모니터해서 저장하기 시작합니다.





저장을 마치려면 kill -15 로 프로세스를 종료합니다.





Can't turn off tracing 메시지가 떨어지지만

ps 로 확인하면 프로세스가 죽은 걸 확인할 수 있습니다.



/home/krcash 에 iptrace 라는 파일명으로 생성된 것을 볼 수 있습니다.





이 파일은 바이너리 파일이기 때문에

텍스트 형태로 변환이 필요합니다.


ipreport -ns /home/krcash/iptrace > /home/krcash/iptrace.log


/home/krcash/iptrace 를 iptrace.log 라는 텍스트 파일로 변환합니다.





이제 해당 파일을 열어보면

주고 받은 패킷의 내용을 확인할 수 있습니다.






참조

IBM Using packet trace tools iptrace, snoop, tcpdump, wireshark, andnettl

http://www-01.ibm.com/support/docview.wss?uid=swg21175744




Posted by hyshin

Oracle Instant Client 이용하여 Toad 사용하기


1. Instant Client 설치

1) Instant Client 다운로드 URL: http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

 



2) 라이센스 동의 후 Instant Client 다운로드

* 토드 버전에 따라 Instant Client 버전을 선택해서 다운로드 받습니다.

Toad 10.X

 Instant Client 11.X 이하 

 Toad 9.X

 Instant Client 10.X 이하 





3) 적당한 위치에 압축 해제

* 압축 해제 후 임의 위치에 저장합니다.

  예) C:\oracle\instantclient_10_2




2. 환경설정

* 고급 시스템 설정에서 다음의 환경변수를 등록, 추가해 줍니다.

 Path 

 C:\oracle\instantclient_10_2 (추가)

 오라클 설치 디렉토리(임의 지정)

 NLS_LANG

 KOREAN_KOREA.KO16MSWIN949

 언어 설정

 TNS_ADMIN

 C:\oracle\instantclient_10_2

 tnsnames.ora 위치(임의 지정) 






3. tnsnames.ora 저장

* TNS_ADMIN 지정 위치에 tnsnames.ora 를 저장합니다.




4. Toad 확인

* 모든 설정 확인 후 Toad 실행해서 확인해 봅니다.

   Connect Using 에 검은색으로 표시되고 TNSNames Editor 에 체크 표시가 나오면 정상입니다.













Posted by hyshin

Tmax Jeus에서 Web Admin 종료하기 (Jeus6 기준)


JEUS 웹어드민 화면

JEUS 웹 어드민 화면



1. Jeus WAS 종료



2. {JEUS_HOME}/config/{APP_NAME}/JEUSMain.xml 수정


node > enable-webadmin > true → false 변경


 JEUS_HOME

Jeus 설치 디렉토리 

 APP_NAME

어플리케이션(서비스) 이름 



3. Jeus WAS 재기동



JEUS 웹 어드민 찾을 수 없음

JEUS 웹 어드민 찾을 수 없음

Posted by hyshin