본문 바로가기

전체 글

[mono] Mono 웹 서버와 OWIN 웹 서버의 크래시 이슈 패치 Mono 웹 서버와 OWIN 웹 서버의 크래시 이슈 패치 OWIN 웹 서버 크래시 OWIN(Open Web Interface for .NET) 를 이용하여 mono 환경에서 웹 서버를 띄후 특정 명령으로 웹 서버 프로세스가 크래시가 발생한다. 간단한 아래의 OWIN 호스트를 mono 런타임으로 실행한 후 서버 크래시를 발생해 보자. mono ./OwinConsoleApp1.exe 그리고 터미널을 열어 아래의 명령을 실행해보자. curl -X POST http://localhost:8080 그러면 아래와 같이 서버 프로세스가 비정상 종료되고 아래와 같은 오류 메시지를 보여준다. Unhandled Exception: System.ObjectDisposedException: Cannot access a dis.. 더보기
[svn] Mac Catalina 업그레이드 후 SVN 경로 문제 Mac Catalina 업그레이드 후 루트 디렉토리를 사용할 수 없다. Read-Only 상태의 파티션으로 나누어져 있어 기존 루트 디렉토리의 사용자 디렉토리는 "/Users/Shared/Relocated Items/" 디렉토리로 모두 옮겨진다. 이는 디스크의 논리 파티션이 운영체제를 위한 ReadOnly 전용 공간과 사용자 데이터의 파티션으로 나뉘어지기 때문이다. 만약 SVN 을 루트 디렉토리로 사용한 경우 문제가 발생하는데, 적당한 디렉토리로 옮긴 후에 다음의 SVN 명령을 통해 URL 주소를 수정해 주어야 한다. 아래와 같이 현재 SVN 저장소의 정보를 보자 cd svn info 그렇다면 아래와 유사한 결과가 출력된다. Path: . Working Copy Root Path: /Users/power.. 더보기
크로스 플랫폼에서 데이터 무결성 데이터 무결성이란 일반적으로 '데이터 무결성'이라고 함은 큰 범주에서 데이터베이스에서 데이터의 정확성과 일관성을 보증하는 것을 의미한다. 이런 데이터의 무결성을 보증할 수 없는 경우 우리는 '데이터가 변질되었다' 라고 할 수 있다. 이는 데이터가 우리가 기대하던 원본과 달라졌음을 의미한다. 일반적으로 파일이나 네트워크에서 무결성을 검증하기 위해 체크섬(checksum) 을 이용하고, 프로그래밍 언어에서는 해시값(hashvalue) 를 이용한다. 이 둘은 데이터의 무결성을 보장하기 위해 단 하나의 비트(bit) 의 데이터라도 수정이 되면 전체 해시값에 영향을 주어 원본과 일치하지 않는 해시값이 된다. 이 원본 해시값을 사본 해시값과 비교하면 데이터의 무결성이 보장되는지 쉽게 알.. 더보기
[mono] mono-service 버그 패치 개요 mono-service 는 .NET Framework 로 작성된 윈도우 서비스(Windows Services) 를 mono 환경에서 구동할 수 있는 도구이다. 윈도우 서비스는 일반적으로 GUI 가 없는 백그라운드로 동작하는 실행 바이너리로 윈도우 운영체제가 서비스를 안정적으로 동작하도록 지원해 준다. mono-service 는 .NET Framework 로 컴파일된 바이너리 및 실행 파일을 AppDomain 을 생성한 후 로드한다. mono-service 가 하는 역할은 일반적으로 POSIX 가 정의하는 유닉스 시그널(Unix Signals) 를 받아 처리하기 위한 용도이다. 맥 또는 리눅스 운영체제는 윈도우 운영체제가 제공하는 서비스의 시작/중지 명령을 이해할 수 없기 때문에 SIGINT, SIG.. 더보기
[ASP.NET Core] 최신 버전에서 React+Redux+Javascript+TypeScript 를 사용하는 방법 ASP.NET Core 2.1 또는 그 이상의 버전에서 dotnet new reactredux 템플릿에서 TypeScript 를 지원하지 않는다. 오직 Javascript 템플릿만 지원한다. 본 내용에서는 React+Javascript 를 React+TypeScript+Javascript 를 지원하는 환경으로 구성하는 방법을 알아본다.1. 프로젝트 생성하기다음의 명령을 입력하여 ASP.NET Core 의 React+Redux 프로젝트를 생성한다.dotnet new reactredux -o aspnetcore-react-redux프로젝트 생성이 성공하였다면 cd aspnetcore-react-redux 디렉토리로 이동한다.2. package.json 파일 업데이트ClientApp 디렉토리는 React+Re.. 더보기
AOP 프레임워크 이해와 개발 AOP 프레임워크 이해와 개발 AOP(Aspect Oriented Programming), 관점지향 프로그래밍은 OOP(Object Oriented Programming) 에게 ‘관심사’라는 관점을 더해 객체 지향 프로그래밍의 변경 없이 다른 관점의 구현을 추가할 수 있다. 더 쉽게 말하면 클래스나 메서드가 동작할 때 코드의 변경 없이 원하는 동작을 추가하는 기법이다.흔히 AOP 의 예를 들때 ‘로깅(Logging)’ 을 든다. 기존 코드의 변경 없이 코드 본문이 실행 되기전 매개변수 값 등을 로깅하도록 하는 것이다. 물론 로깅 이외에 다양한 용도로 사용되는데, 비즈니스 로직의 검증이나 응용 프로그램 전역적으로 공통적인 관심사 분리에 사용된다.AOP 프로그래밍의 활용 예 로깅 유효성 검사 트랜잭션 처리 .. 더보기
[마이크로서비스] 아키텍처 구축하기 [마이크로서비스] 아키텍처 구축하기 마이크로서비스는 서비스를 작게 나누는 것부터 시작한다. 이렇게 서비스를 작게 나누게 되면 여러가지 장점이 있는데 [이 글]에서 마이크로서비스 아키텍처를 이해할 수 있다. 가볍고 탄력적인 서비스를 구축이 필요한 곳에서 이 아키텍처를 도입하고 있다.물론 장점만 있는 것은 아니다. 그 중에서 단연 러닝커브가 높은 기술적 구현 측면과 요구사항이 바로 그것이다. 아시다시피 서비스가 작게 나눠지면서 개발/네트워킹/보안/배포/모니터링에 이르기까지 해결해야 할 과제가 생긴다.이 아티클은 개발 영역에 초점을 맞추어 예제 코드가 작성 되었다. 개발 영역을 마이크로서비스화 할 때 적지 않은 부분의 변화가 필요한데, 그 기법과 라이브러리 등도 함께 살펴보면 도움이 될 것 같다.[https:.. 더보기
[VSGesture] VSGesture for Visual Studio 2017 배포 완료 VSGesture for Visual Studio 2017 배포 완료Visual Studio 2017 버전 배포 완료Visual Studio 2017의 Tools -> Extension Manager 에서 다운로드 받으실 수 있습니다. (검색: vsgesture) Visual Studio 2017 버전 https://marketplace.visualstudio.com/items?itemName=vs-publisher-2521.VSGestureforVisualStudio2017Visual Studio 2010~2015 버전https://marketplace.visualstudio.com/items?itemName=vs-publisher-2521.VSGestureforVisualStudioVisual Stu.. 더보기
Language Server Protocol, OmniSharp-Roslyn 빌드 오류 해결 마이크로소프트(Microsoft)는 VSCode 에서 다양한 개발 편의 기능을 제공하기 위한 Language Server Protocol 을 공개했다. 이 프로토콜의 C# 버전이 바로 OmniSharp-Roslyn이 되겠다.그 외에 다양한 언어의 구현체가 등장했는데, 어떤 개발 언어가 구현 되었는지 아래의 링크에서 확인하기 바란다. https://github.com/Microsoft/language-server-protocol/wiki/Protocol-Implementations 필자는 OmniSharp-Roslyn 을 git clone 하고 빌드하게 되면 다음과 같은 오류를 만났다.개발환경 OS: MacOS Sierra Version: 10.12.2 The type initializer for 'Sys.. 더보기
TypeScript 언어 핵심 요약 사항 TypeScript 언어 핵심 요약 사항 TypeScript 핵심 요약은 ES6 에 추가된 기능과 중복된 항목이 있다. TypeScript 는 Javascript 의 슈퍼셋(Superset)이라고 하지만, 아직 ES6 를 완벽하게 지원하지 않는다. 그래서 본 글의 핵심 요약은 TypeScript 에서 추가된 기능이자 ES6 와 중복된 내용이 있다.ES6 의 새로운 기능은 다음의 링크에서 참고하기 바란다. http://es6-features.org/ TypeScript 2.1 최신이고 아직 꾸준히 업데이트 중이며, 1.8 버전을 기준으로 비교된 ES6 와 호환 테이블이다. http://kangax.github.io/compat-table/es6/ TypeScript 의 모든 언어 사양은 아래의 링크를 참고.. 더보기
[ASP.NET Core] Middleware, IHttpModule과 IHttpHandler 마이그레이션 ASP.NET Core Middleware ASP.NET Core Middleware 는 모든 요청과 응답을 처리하는 파이프라인이다. 레거시 ASP.NET 과 ASP.NET MVC 에서는 이를 IHttpModule과 IHttpHandler를 통해 구현하여 처리하거나, Global.asax.cs 에서 처리 가능하다.IHttpModule 이 주로 사용되는 경우는 권한 처리 등과 같이 다양하게 사용된다. 모든 요청은 이 IHttpModule을 파이프라인을 통과하게 되고, 응답을 제어할 수 있기 때문이다.이 파이프라인이 오늘에 와서 ASP.NET Core Middleware 에서 그 역할을 대신하게 된다. - 레거시에서 파이프라인 최초 레거시 ASP.NET 은 ‘ASP.NET 파이프라인’은 최초 요청부터 마지막.. 더보기
[ASP.NET Core] IControllerFactory 설정 및 마이그레이션 IControllerFactory IControllerFactory 는 컨트롤러 객체를 반환하거나 객체 릴리즈 시키는 팩토리 인터페이스이다. ASP.NET MVC 4 까지 지원하지 않았던 DI(Dependency Injection) 기능을 사용하기 위해 이 인터페이스를 구현하여 사용하였다. ASP.NET Core 에서는 객체 주입(Injection) 할 때 한 가지 큰 단점이 있다. 생성자 주입(Constructor Injection) 으로만 DI(Dependency Injection) 기능을 사용할 수 있다. 이 아티클에서는 프로퍼티 인젝션(Property Injection) 이 가능한 Unity Application Block 을 사용하기 위해 IControllerFactory 를 마이그레이션 하는 .. 더보기
[ASP.NET] Session state has created a session id, but cannot save it because the response was already flushed 오류 유형은 아래의 웹서버 로그와 같이 “세션ID 가 생성 되었지만, Response 가 Flushed 되어 저장할 수 없다”.Session state has created a session id, but cannot save it because the response was already flushed이 현상은 다음의 경우의 수를 모두 만족할 경우 발생하게 된다.웹서버(IIS) 가 리사이클링 되고,웹서버에게 첫 요청이 가고,코드에서 Session 속성을 사용하기 전이고,서버 코드에서 Response 를 Flush 하고,웹브라우저가 아닌, 네트워크 라이브러리를 통해 호출을 하고,Global.asax.cs 의 Session_Start 이벤트가 발생할 때 분석을 해보면 (MSDN 에서 ASP.NET Appl.. 더보기
[onhashchange] hash 를 감지하는 onhashchange.js Polyfill 라이브러리 onhashchangeonhashchange.js 를 방금 릴리즈 했습니다. https://github.com/powerumc/onhashchangeonhashchange 기능이 제공되는지 여부를 감지하고, 이를 지원하지 않는 오래된 브라우저인 경우 Polyfill 을 지원합니다.아래의 호환 브라우저 미만인 경우 onhashchange Polyfill 이 동작하게 됩니다.Implemented event fields.The dispatched hashchange event has the following fields:FieldTypeDescriptionnewURLDOMStringThe new URL to which the window is navigating.oldURLDOMStringThe previou.. 더보기
[MyRedis] Redis 에서 데이터베이스 연결 지원 [GitHub] https://github.com/powerumc/MyRedisMyRedis 는 MySQL 연결을 지원하도록 2014년도에 개선 된 프로젝트이다.RedisPlus 와 함께 곁들어 Redis와 DB 간에 동기화 할 때 사용할 때, 웹서버에서 처리해야 할 것들을 Redis 안에서 모두 해결하기 위함이다. 따라서 필요 이상의 라운드 트립 발생을 줄일 수 있다. 1. Setup Database Setup Database > SET db.host "localhost" > SET db.user "root" > SET db.passwd "!@#$%" > SET db.db "powerumc" 2. Execute Query Setup Query > SET q1 "SELECT * FROM temp_tabl.. 더보기
[RedisPlus] Redis 에서 키 만료 이벤트 개선 작업 2014년 TFT 프로젝트에서 Redis 이벤트와 관련하여 기능이 필요하여 개발된 프로젝트이다. [Github] https://github.com/powerumc/RedisPlus RedisPlus 를 개발하게 된 계기는 Redis 이벤트의 Key Expired 이벤트 외에 Key Expiring 이벤트가 필요했는데, **Key Expiring **이벤트는 Redis Key 가 만료가 되었을 때, 만료전에 발생하는 이벤트이고, Key Expired 는 키를 만료시킨 후에 발생하는 이벤트이다. Redis 이벤트 만료 시 만료되는 키만을 반환하기 때문에 키의 값이 무엇인지만 알 수 없다는 문제가 있다. Expiring Key Event Expiring 키 이벤트는 키와 값을 반환한다. 따라서 Redis's .. 더보기
ASP.NET WebForm 에서 Dependency Injection 사용하는 방법 개요 ASP.NET WebForm 에서 Dependency Injection 을 사용하는 방법을 소개한다. IoC Container 를 이용하여 System.Web.UI.Page 를 상속하는 페이지에서 Injection 을 해야 하는데, 이를 위해 IHttpHandlerFactory 를 사용하는 방법을 소개한다.여기에서는 필자가 꾸준히 만들어 온 Unity Container와 Windsor Castle 을 기반으로 하는 Umc.Core 프레임워크를 사용한다.Umc.Core 프레임워크에는 Unity Auto Registration 기능등이 모두 포함하기 때문에 프로젝트 셋업에 편리하다는 장점도 있다.샘플 프로젝트는 필자의 github 에서 다운로드 받을 수 있다. https://github.com/powe.. 더보기
데이터를 표로 표현해주는 Flip-Tables-Net Flip-Table-Net 은 자바 코드로 작성된 flip-table 을.NET 코드로 포팅한 프로젝트로, 콘솔에 데이터를 표로 표현해 줍니다.설치Command Line 에서 다음처럼 입력하거나,nuget install flip-tables-netVisual Studio Package Manager Console 에서 다음처럼 입력합니다..Install-Package Flip-Tables-Net또는 Nuget 패키지 관리자에서 flip-table-net 으로 검색합니다.기존 자바에서 지원하던 기능FlipTable은 헤더 정보와 데이터 정보가 필요합니다.string[] headers = { "Test", "Header" }; string[][] data = { new[] {"Foo", "Bar"}, new.. 더보기
[MonoDevelop] 두 번째 한글화 버전 승인완료 최근 MonoDevelop 개발툴의 한글화를 좀 더 고도화(?)하여 Pull Request 를 보냈다. 하루가 지나고 바로 approve 되어 차기 릴리즈 버전에 바로 적용이 가능하리라 생각한다. 또한, Xamarin Studio 에도 더 부드러운 한글화를 만나볼 수 있게 되었다.필자가 개별적으로 배포하는 곳은 monodevelop.co.kr 에서 받아볼 수 있다.1차 번역은 오로지 한글화에 목표를 두었다면, 2차 번역은 잘못된 번역과 좀 더 부드러운 번역에 중점을 두었다. 그리고 버전업이 되면서 기존 영문 메시지가 많이 변경이 되었는데, 이 또한 적절하게 수정되었다.번역 품질에도 조그마한 변화를 느낄 수 있길 바라는데, 가령 "View" 를 번역한다면, 뭐라고 번역해야 할까? "뷰", "보기" 등으로 .. 더보기
[MIPS] beq 를 안쓰고 bne 를 쓰는 이유는 무엇인가요? 얼마 전에 페이스북에 올라온 질문인데, “MIPS 어셈블리 코드 중 beq 를 안쓰고 bne 를 쓰는 이유는 무엇인가요?” 라는 질문이다. 아래와 같은 C 언어 코드가 있고, if (i == j) f = g + h; else f = g - h; 이를 순서도로 나타내면 다음과 같다. 컴파일러와 최적화 옵션에 따라 생성되는 어셈블리 인스트럭션이 아래와 똑같다고 말할 수 없다. 일반적으로 컴파일러는 인스트럭션을 생성할 때 조건문의 경우 반대 조건으로 해석해서 인스트럭션을 작성한다. 이런 경우 대부분 인스트럭션의 크기가 짧아지기 때문에 더 적은 클럭에서 명령을 수행할 수 있기 때문이다. 따라서 아래와 같은 어셈블리 코드가 생성된다. # bne 를 사용하는 코드 bne $s3, $s4, Else add $s0, .. 더보기