CSS3 @media Query IE9이하 적용방법

미디어 쿼리를 사용할때 

<link rel=“stylesheet” href=../css/sampleFile.css” />

위와같은 css만 적용하면 된다.(미디어쿼리 템플릿은 알고 있다고 가정하에)

    

그러나 IE9이하의 버전에서는 CSS3의 미디어쿼리 문법을 지원하지 않아 사용할 수 없다.

IE9이하버전에서도 미디어쿼리를 사용하기 위해서는

       <!–[if lt IE 9]>      

<script type=”text/javascript” src=”https://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js“></script>

    <![endif]–>    

      위의 문장을

<link rel=“stylesheet” href=../css/sampleFile.css” />

스크립트 다음에 입력하면 9이하 버전에서도 사용할 수 있다.

(소스코드가 상단부터 처리가 되어 css파일 먼저 선언되고, 그 후 IE9이하 지원 스크립트를 적용해야 정상적으로 동작한다.

그 반대로 하면 정상적으로 실행되지 않음.)

 

구글 음성인식(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