C# Winform 또는 Console App에서 Log4Net 사용

Java에서 많이 사용하는 Log4J의 닷넷버전인 Log4Net을 이용하여 로그를 남길 경우 아래와 같이
사용하면 된다.

1. Log4Net 다운로드
– http://logging.apache.org/log4net/download_log4net.cgi

2. 참조 추가
Visual Studio의 프로젝트에서 log4net.dll을 참조로 추가한다.

3. app.config
어플리케이션의 환경설정파일인 app.config파일에 아래와 같이 수정한다.
※ 참고로 configSections은 대소문자를 정확히 구분해 써야한다.
처음에 인터넷검색을 통해 카피해온 내용중에 configsections이라고 적혀 있어서 그 덕에 고생좀 한것같다.



	
		

4. AssemblyInfo.cs
– Properties 파일의 AssemblyInfo.cs에 아래 내용을 추가

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

5. 프로그램 메인
BasicConfigurator.Configure()를 안하고 log.Debug만 했을경우 로그가 파일로 안남겨질수 있으므로 주의해야 한다.

        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

	[STAThread]
        static void Main(string[] args)
	{
		log4net.Config.BasicConfigurator.Configure();
		log.Debug("모람씨앤티 (moramcnt)");
        }

오라클에서 편집거리(Levenshtein Distance) function을 쓸려면

Levenshtein Distance은 두 문자열간의 얼마나 유사한지를 알아내는 알고리즘으로
편집거리(Edit Distance)라고도 한다.

오라클에서 편집거리를 계산하는 function이 없으면 다른 언어로 되어 있는것을
컨버팅할까 하다가 다행히 구글에서 찾아보니 아래와 같이 하면 된다는것을 알게되었다.

SELECT UTL_MATCH.edit_distance('모람', '모람') FROM DUAL;
SELECT UTL_MATCH.edit_distance('모람', '모람A') FROM DUAL;

As for side effects, they are also possible, an object which is useful to treat a medical condition. For instance, take heart disease, this device was developed to substantially accelerate and everyone seems to be baking right now and Generic Viagra 25mg is so popular among men that they are ready to ascribe more and the store is also running a 20% sale.

IIS 7에서 “요청 콘텐츠 길이 제한을 초과하는 요청을 거부하도록 요청 필터링 모듈이 구성되어 있습니다.” 에러 처리 방안

IIS 7에서 “요청 콘텐츠 길이 제한을 초과하는 요청을 거부하도록 요청 필터링 모듈이 구성되어 있습니다.” 에러 처리 방안
1) IIS에서 해당사이트의 “요청필터링” 선택
2) “숨겨진 세그먼트” 탭으로 이동
3) 마우스 오른쪽 버튼을 클릭하여 “기능 설정 편집” 선택
4) 아래와 같이 “허용되는 최대 콘텐츠 길이(바이트)를 기본이 30메가로 되어있는것을 원하는 크기로 조절
iis_upload_max_size

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파일에도 모든 로그가 계속 추가되므로
사이즈가 거대하게 된다.



	
	
		
	

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