ajax로 대용량 데이터 전송시 길이 제한으로 인하여 에러 발생시

대량의 컨텐츠 데이터를 아래와 같이 JSON형태로 하여 $.ajax를 이용하여 전송시
var arrData = {‘data’: strData};
데이터의 용량이 2기가를 넘는다면 에러를 발생하게 되는데 톰캣의 경우는 아래와
같이 Server.xml에서 maxPostSize를 5기가 정도를 늘려주면 된다.
설정이 없다면 2097152(2 megabytes)가 디폴트이다.


La Farmacia Del Gallo del Dottor Bagnoli si trova in Largo Manfredi 7 nella frazione Siano ed è una delle 2 farmacie di Venosa. Oltre 200 farmaci in sviluppo e quando il Positivo-Farmaciaonline medico prescrive il dosaggio di clorochina.

일반 jar 파일을 maven repository에 추가하기

일반 jar(ex:rfid.jar)을 메이븐 레포지토리를 하기위해서는 CMD창으로 나가서
아래와 같이 입력하면 된다. 물론 maven이 설치되어 있어야 한다. (메이븐 설치는 여기서 설명안함)

mvn install:install-file -Dfile="C:\temp\rfid.jar" -DgroupId=com.rfid -DartifactId=com-rfid -Dversion=0.0.1 -Dpackaging=jar

그리고 자신의 POM파일에 아래와 같이 입력하면 된다.

 
	com.rfid
	com-rfid
	0.0.1

log4j2 날짜별 파일로 저장하고 싶을때

log4j2에서 날짜별로 파일을 남기기 위해서는 RollingFile을 이용하면 된다.
즉 예전의 log4j의 DailyRollingFileAppender과 동일하게 동작하게 하려면 아래와 같이 xml환경설정을 하면된다.
이때 유의해야 할점은 append를 false로 지정하지 않으면 날짜별로도 로그가 남지만, test.log파일에도 모든 로그가 계속 추가되므로
사이즈가 거대하게 된다.



	
	
		
	

구글 음성인식(SpeechRecognizer) API를 이용하여 서비스 형태로 구현하기

구글의 음성인식 API를 서비스 형태로 구현하여, 항상 명령어를 내리면 실행할수 있는지 테스트하기로 하였다.

1. 서비스 구현
– 구글의 SpeechRecognizer API는 한번 음성을 인식한 후, 끝나버리기 때문에 계속
재시작을 해주는 식으로 구현해야 한다.
– 따라서 다음과 같이 onResults에서 음성인식 결과를 출력하고 난후, 핸들러 메시지를
MSG_VOICE_RECO_END 상태로 보낸다.
그렇게되면 핸들러의 handleMessage() 에서는 1초후에 다시 SpeechRecognizer를
재시작한다.


public class VoiceRecoService extends Service
{
	
	@Override
	public void onCreate()
	{
		super.onCreate();
		startListening();
               ..... (중 략).....
	}
    
        ..... (중 략).....

	private Handler mHdrVoiceRecoState = new Handler()
	{
		@Override
		public void handleMessage(Message msg)
		{
			switch (msg.what)
			{
				case MSG_VOICE_RECO_READY	: break;
				case MSG_VOICE_RECO_END		:
				{
					stopListening();
					sendEmptyMessageDelayed(MSG_VOICE_RECO_RESTART, 1000);
					break;
				}
				case MSG_VOICE_RECO_RESTART	: startListening();	break;
				default:
					super.handleMessage(msg);
			}
		}
	};	

	public void startListening()
	{
		if(mBoolVoiceRecoStarted == false)
		{
		    if(mSrRecognizer == null)
		    {
			mSrRecognizer = SpeechRecognizer.createSpeechRecognizer(mCtxContext);
			mSrRecognizer.setRecognitionListener(mClsRecoListener);
		    }
		    if(mSrRecognizer.isRecognitionAvailable(mCtxContext))
		    {
			Intent itItent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
			itItent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
			itItent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.KOREAN.toString());
			itItent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 50);
			mSrRecognizer.startListening(itItent);
		    }
		}
		mBoolVoiceRecoStarted = true;
	}

	public void stopListening()
	{
		try
		{
			if (mSrRecognizer != null && mBoolVoiceRecoStarted == true)
			{
				mSrRecognizer.stopListening();
			}
		}
		catch(Exception ex)
		{
			Logger.e("Stop 예외:"+ StrUtil.trace(ex));
		}
		mBoolVoiceRecoStarted = false;
	}	


	private RecognitionListener mClsRecoListener = new RecognitionListener()
	{
		@Override
		public void onRmsChanged(float rmsdB)
		{
		}

		
		@Override
		public void onResults(Bundle results)
		{
			mHdrVoiceRecoState.sendEmptyMessage(MSG_VOICE_RECO_END);
			
			Intent itBroadcast = new Intent();
			itBroadcast.setAction(Constants.INTENT_ACTION_VOICE_RECO);        	
			itBroadcast.putExtras(results);
			mCtxContext.sendBroadcast(itBroadcast);
		}
		
		@Override
		public void onReadyForSpeech(Bundle params)
		{
		}

		@Override
		public void onEndOfSpeech()
		{
		}

		@Override
		public void onError(int intError)
		{
			mHdrVoiceRecoState.sendEmptyMessage(MSG_VOICE_RECO_END);
		}

		@Override
		public void onBeginningOfSpeech()
		{
		}

		@Override
		public void onBufferReceived(byte[] buffer)
		{
		}

		@Override
		public void onEvent(int eventType, Bundle params)
		{
		}

		@Override
		public void onPartialResults(Bundle partialResults)
		{
		}
	};
}

2. 결론
결론적으로 서비스로 구현가능함으로 확인하였으나, 음성을 인식하게 하기 위해
항상 대기상태로 만들어 놓았더니, 배터리 소모량이 많음을 확인하였다.

SC20150110-135825

Controller 에서 뷰페이지 지정 방식 (redirect / forward)

forward redirect
주소 표기 사용자는 “a.do”를 요청했고, 컨트롤러에서는 return “forward:/b.do”라고 하여 “b.do”의 처리결과를 브라우져에 보이게 된다.하지만, 사용자의 브라우저에는 최종처리된 “b.do”가 나타나는 것이 아니라 애초 요청한 “a.do”가 나타나게 된다. 사용자는 “a.do“를 요청했고, 이를 처리한 컨트롤러가 return “redirect:/b.do”라고 하면웹서버는 redirect에 지정된 URL(b.do)을 클라이언트(브라우져)로 보낸다. URL(b.do)를 수신한 브라우져는 해당 URL(b.do)을 이용하여 별도의 서비스를 요청한다. 이때 b.do라는 서비스 요청을 브라우저 내부에서 수행하므로 사용자는 인식하지 못한다.
데이터 호환 사용자의 요청 a.do를 처리하는 과정에 가공된 request, response들을 b.do를 처리하는 컨트롤러에서 모두 사용가능하다. redirect되는 url(b.do)는 브라우져가 별도로 서비스 요청을 하게 되므로, 애초에 요청했던 url(a.do)를 처리하는 과정에서 사용하던 request, response 관련 정보는 소멸되고, 새로운 서비스요청(b.do)에 해당하는 request, response는 새롭게 만들어지게 된다.즉, a.do의 request, reponse는 b.do를 처리하는 과정에서 일체 사용할 수 없게 된다. 사용을 하려 한다면 b.do에 파라매터 전달방식(문법)을 통해 전달해야한다.
지정가능 페이지 위 데이터 호환에서 설명한 바와 같이 a.do의 처리과정에서 가공중인(또는 가공된) 메모리상의 response, request를 b.do에서도 모두 사용가능하다고 했으니 물리적/논리적으로 분리된 웹 컨테이너라면 공유가 불가능할 것이다.고로 지정가능 페이지는 a.do를 포함하는 웹 컨테이너에 속한 URL만 지정가능하다. a.do라는 url을 처리하고, 브라우져에 b.do를 보낸뒤 브라우져가 다시 b.do라는 서비스를 요청하므로 redirect되는 URL은 현재 a.do를 처리하는 웹 컨테이너와 무관하게 유효한 URL이라면 모두 사용가능하다

 

[출처] http://blog.daum.net/janustop/128

넥서스 설정

1. 개요

    Tomcat7, JDK1.6, nexus 2.2 버전을 기준으로 함

2. 넥서스 설치

  • http://www.sonatype.org/nexus/archived 에서 넥서스 2.2 다운 로드
  • 압축을 풀어 D:\Service\Nexus\nexus-2.2 폴더에 넣는다.

3. Tomcat 설정

    server.xml에 대한 설정

    
    	
    	
    
    				

    Tomcat Connectior의 uriworkermap.properties에 대한 설정

    #/=wlb
    #/*=wlb
    /*.jsp=wlb
    /*.do=wlb
    /*.json=wlb
    
    #----------------------------
    # nexus 설정
    #----------------------------
    /index.html=wlb
    /service/*=wlb
    /content/*=wlb
    /static/*=wlb
    #----------------------------
    
    # Optionally filter out all .jpeg files inside that context
    # For no mapping the url has to start with exclamation (!)
    #!/servlets-examples/*.jpeg=wlb
    #!/*.cfg=wlb
    # Mount jkstatus to /jkmanager
    # For production servers you will need to
    # secure the access to the /jkmanager url
    #
    /jkmanager=jkstatus
    
    				

4. IIS 설정

  • repo.moramcnt.com라는 사이트 생성
  • tomcat 연동을 위해 가상디렉토리 jakarta 를 만든다.
      C:\Program Files\Apache Software Foundation\tomcat-connectors-1.2.37\bin

      nexus-01

5. 톰캣 서비스 구동

    넥서스를 톰캣 서비스로 구동하면 넥서스의 환경설정 파일을 Documents and
    Settings 밑의 Default User에 sonatype-work라는 폴더를 생성하여
    기록한다.
    주의 할 점은 콘솔로 톰캣 구동시에는 로그인한 계정밑에 sonatype-work를
    만들어 실행하므로 착각하면 안된다.
    그리고 Default User는 히든 폴더이므로 탐색기 상단에 있는 주소줄에서
    입력하면 아래와 같이 나타난다.

    nexus-02

6. 로그인 및 패스워드 변경

  • 로그인
      http://repo.moramcnt.com/index.html 로 접속

      nexus-03

      기본 로그인 계정은 admin/admin123 이다.

  • Admin 패스워드 변경
      좌표 메뉴에서 Security > Users 메뉴 선택 한후 오른쪽 마우스를 누르면
      아래와 같이 컨텍스트 메뉴가 나오는데 Set password를 선택하여
      패스워드 변경

      nexus-04

7. 레포지토리 생성

  • Views/Repositories > Repositories 메뉴 선택
  • Add 버튼 > Hosted Repository 선택

    nexus-05
  • Hosted Repository 타입으로 모람프레임워크 릴리즈 레포지토리 생성

    nexus-06
  • Hosted Repository 타입으로 모람프레임워크 스냅샷 레포지토리 생성

    nexus-07
  • Repository Group타입의 외부에 공개할 Public Repositories 생성

    nexus-08

    주의: Ordered Group Repositories에 기본으로 있는 Snapshot, Releases,
    Public Repositories는 제외

8. 사용자 생성

  • Privileges 생성
      Security> Privileges 메뉴에서 Add

      nexus-09

      저장하게 되면 총 4개의 privilege가 추가된 것을 확인할 수 있다. (create, read, update, delete)

      nexus-10
  • Role 생성
      Security > Role 메뉴에서 Add

      nexus-11

      주의 : view privilege를 추가하지 않으면 나중에 로그인 했을 경우 프로젝트의 Public Repositories가 보이지 않는다.

  • 사용자 생성
      Security > Users에서 Add

      nexus-12

9. 새로운 사용자 로그인

    이전에 등록한 사용자로 로그인하여 아래와 같이 나오면 성공

    nexus-13

10. 넥서스 Deploy

  • 메이븐의 Settings.xml 파일 수정

    • 서버 등록

      	
      		moramframework-releases
      		moramcnt
      		XXXX
      	
      	
      		moramframework-snapshots
      		moramcnt
      		XXXX
      	
      							
    • 프로파일 등록

      
      
      	moramframework
      	
      		1.6
      	
      
      	
      		
      			moramframework-release
      			http://repo.moramcnt.com/content/repositories/moramframework-release
      			
      				false
      			
      		
      
      		
      			moramframework-snapshots
      			http://repo.moramcnt.com/content/repositories/moramframework-snapshots
      			
      				false
      			
      		
      	
      
      	
      		
      			moramframework-release
      			http://repo.moramcnt.com/content/repositories/moramframework-release
      			
      				false
      			
      		
      
      		
      			moramframework-snapshots
      			http://repo.moramcnt.com/content/repositories/moramframework-snapshots
      			
      				false
      			
      		
      	
      
      							
    • 프로파일 활성화

      
      	moramframework
      
      							
  • 최상위 pom 파일 수정

    • 플러그인 설정

      
      	org.apache.maven.plugins
      	maven-deploy-plugin
      	2.5
      	
      	   true
      	
      	
      							
    • distributionManagement 설정

      
      
      	
      		moramframework-releases
      		http://repo.moramcnt.com/content/repositories/moramframework-releases
      	
      	
      		moramframework-snapshots
      		http://repo.moramcnt.com/content/repositories/moramframework-snapshots
      	
      
      							
  • 이클립스 배포

      nexus-14

      컴파일시 에러가 날 경우, 보안상에 문제 가 있어서 업로드를 못한것이므로 직접 올린다.

전자정부프레임워크 3.0에서 프로젝트 생성시 예제가 생성이 안되는 경우

아래는 신규프로젝트 준비중에 전자정부 3.0기반으로 해볼려고 하는데, 이클립스에서 예제가 생성안되는 것이 의아해서 테스트한 결과이다.

1. 테스트 환경

 – Windows8.1 K 64Bit

– JDK : jdk1.6.0_45 와 jdk1.8.0_05 2개가 설치되어 있는 상태

 

2. 실행환경 다운로드 및 설치

– http://www.egovframe.go.kr/EgovRunEnvReleaseNote.jsp?menu=3&submenu=1 에서 상단 "표준프레임워크 통합 다운로드" 버튼 클릭하여 설치

3. 테스트 프로젝트 생성하고 아래와 같이 Generate Example 체크후 Finish를 눌러 프로젝트를 생성한다.

Generate Example

Empty Project

 

이때 위와 같이 프로젝트 생성후 폴더만 있고 파일이 없다면 아래와 같이 조치하면 된다.

이클립스 실행파일이 있는 폴더에서 에디터로 eclipse.ini 파일을 열고 vm을 JDK6 으로 맞추면 된다.

-vm
 C:/Program Files/Java/jdk1.6.0_45/bin/javaw.exe

확실하지는 않지만, JDK8과 전자정부프레임워크에서 이용한 이클립스(케플러)간에 문제가 있어 보이는것만은 확실한것 같다.

안드로이드 버튼의 이미지를 그레이로 만들기

	
final Drawable daWork = mBtnWork.getCompoundDrawables()[1]; // 1번째가 TOP 이미지, 이유는 위에서 android:drawableTop으로 하였기때문에..
if(daWork != null) mBtnWork.setCompoundDrawables(null, convertToGrayscale(daWork), null, null);
    protected Drawable convertToGrayscale(Drawable drawable)
    {
        ColorMatrix cmMatrix = new ColorMatrix();
        cmMatrix.setSaturation(0); //0이면 grayscale
        drawable.setColorFilter(new ColorMatrixColorFilter(cmMatrix));
        return drawable;
    }