https://github.com/aspnet/Home/wiki/Roadmap



Beta 6 릴리즈  2015/07/27

Beta 7 릴리즈  2015/08/24

Beta 8 릴리즈  2015/09/21

RC     릴리즈  2015/11

1.0.0   릴리즈  2016년 Q1



Beta 6에서는 현지화, 서비스화, DNX에서 .NET Framewrk 4.6대응, HTTP.SYS 사용 및 SQL Server 분산 캐시 사용에 의한 고속화가 목표.

Beta 7에서는 클래스 플랫폼, .NET Core의 Mac, Linux에 대한 출시가 목표.

Beta 8에서는 기능 완성이 목표.

RC에서는 안정성 향상이 목표.

1.0.0 이후의 목표는 VB지원, SignalR 3, Web Pages 4.

저작자 표시
신고
by 흥배 2015.07.23 08:00

주 기능: 지정된 시간에 실행해야 할 Job을 등록해 놓으면 해당 시간이 되면 Job을 실행한다.

오픈 소스: https://github.com/jgeurts/FluentScheduler

설치: Nuget으로 쉽게 설치할 수 있다.

 

예제 코드

1) 현재 등록된 job 개수

// 만약 이전에 job을 등록한적이 없다면

// TaskManager.Initialize(new Registry());

// 로 초기화 해 준후 사용해야 한다.

var count = TaskManager.AllSchedules.Count();

 

 

2) 등록된 모드 Job 정보 보기

var allJobs = TaskManager.AllSchedules;

foreach (var job in allJobs)

{

           var info = string.Format("Name:{0}, 실행예정시간:{1}", job.Name, job.NextRunTime.ToString("yyyy MM-dd HH:mm:ss"));

}

 

 

3) 모든 Job 삭제

var jobNameList = new List<string>();

 

var allJobs = TaskManager.AllSchedules;

foreach (var job in allJobs)

{

           jobNameList.Add(job.Name);

}

 

foreach (var name in jobNameList)

{

           TaskManager.RemoveTask(name);

}

 

 

4) 매번 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(3초마다) Runner1 " + DateTime.Now), x => x.WithName("Runner1").ToRunEvery(3).Seconds()

                                );

 

5) 한번만 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(3초 후에 딱 한번)OnceRunner1 " + DateTime.Now), x => x.WithName("OnceRunner1").ToRunOnceIn(3).Seconds()

                                );

 

 

6) 매일 특정 시간에만 실행되는 Job

TaskManager.AddTask(

                                () => DevLog.Write("(매일 0 0 0초 마다)1DayJob " + DateTime.Now), x => x.WithName("1DayJob").ToRunEvery(1).Days().At(0, 0)

                                );

 

7) 등록과 동시 실행 후 매번 실행

TaskManager.AddTask(

                                () => DevLog.Write("(5초 마다)Runner2 " + DateTime.Now), x => x.WithName("Runner2").ToRunNow().AndEvery(5).Seconds()

                                );

 

8) 매주 특정 요일에만 실행

// 지금으로 부터 1주일 후 목요일

TaskManager.AddTask(

            () => DevLog.Write("(매주 목요일마다)Runner3 " + DateTime.Now), x => x.WithName("Runner3").ToRunEvery(1).Weeks().On(DayOfWeek.Thursday)

            );

 

// 이번 주 목요일

TaskManager.AddTask(

                                () => DevLog.Write("(매주 목요일마다)Runner3 " + DateTime.Now), x => x.WithName("Runner3").ToRunEvery(0).Weeks().On(DayOfWeek.Thursday)

                                );

 

 

9) 한번에 아주 많은 수의 job을 등록할 때

TaskManager.AddTask를 사용하여 많은 수(1000만개 이상) job을 등록할 때 등록이 끝나기 전에 job이 실행되어 버리면 추가하는 도중 예외가 발생한다. 이유는 AddTask 함수는 새로운 job이 등록될 때마다 정렬을 하고 있어서 그렇다. 그래서 한번에 많은 job을 등록할 때는 Registry 클래스를 사용하여 job을 등록해야 한다.

 

var registry = new MyRegistry();

registry.Init(jobCount);

 

TaskManager.Initialize(registry);

 

 

public class MyRegistry : Registry

{

           public void Init(int jobCount)

           {

                     var rand = new Random();

 

                     for (int i = 0; i < jobCount; ++i)

                     {

                                int delayTimeSec = rand.Next(10, 30);

 

                                Schedule( () => newTask.Execute()).WithName("dummyTask_" + i).ToRunOnceIn(delayTimeSec).Seconds();

                     }

           }

}

 

public class MyTask : ITask

{                   

           public void Execute()

           {

           }

}

 

저작자 표시
신고
by 흥배 2015.06.11 08:00
.net, C#

Windows에는 기본으로 C#VB.NET의 컴파일러가 설치 되어 있다(Visual StudioSDK 설치를 하지 않아도).

 

위치는 C:\Windows\Microsoft.NETFramework 디렉토리에 있다(64비트 OS라면 Framework64 디렉토리도 있다).

csc.exeC# 컴파일러, vbc.exeVB.NET 컴파일러이다.

 

Windows 8.1의 컴파일러는 닷넷프레임워크 4.5 버전이다. 디렉토리는 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 되어 있지만 닷넷프레임워크 4.5 버전이다.

 

Windows에 컴파일러가 들어간 것은 Vista 부터이지만 XP도 중요 업데이트를 하면 설치된다.

 

C# 컴파일러 사용 예

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc HelloWorld.cs

저작자 표시
신고
by 흥배 2015.04.30 08:00

Jil, 

Jil+Gzip, 

Jil+LZ4, 

JSON.NET, 

Protocol Buffer, 

MsgPack-CLI







출처: https://twitter.com/neuecc/status/565501570687987713/photo/1

저작자 표시
신고
by 흥배 2015.02.16 08:00

.NET Core 5. NET Framework의 서브셋

우선 현재의 .NET 전체상. 아래는 .NET Core가 발표되었을 때 .NET Framework 블로그에 포스트 된 그림.

현재. NET ".NET 2015"이라는 브랜드에 의해 전체를 표현하고 있다. .NET 2015에는 크게 3가지 구성 요소가 있다.

 


 

첫 번째는 가장 아래의 보라 색 사각으로 .NET 2015의 가동 환경을 뒷받침하는 틀. 왼쪽부터 런타임, 컴파일러, 패키지 매니저. 런타임에는 새 저스트 인 타임 컴파일러 "RyuJIT", 컴파일러에는 "Roslyn", 그리고 패키지 매니저는 "NuGet"을 채용. 3개는 오픈 소스로 개발됐으며 Windows, Linux, MacOS X의 크로스 플랫폼 대응.

 

두 번째가 왼쪽의 녹색 사각으로 Windows 대응의 ".NET Frmawork 4.6" 이다. ASP.NET 5, ASP.NET 4.6, WPF, Windows Forms과 같은 프레임워크로 구성되어 있다. 이른바 풀 스펙의 .NET Framework가 이것이다.

 

세 번째가 오른쪽의 녹색 사각으로 오픈 소스화가 발표된 ".NET Core 5" 이다. .NET Core 5.NET Framework의 서브셋으로 설명되어 있으며 Windows 대응의 "ASP.NET Core 5" ".NET Native". Linux MacOS X 대응 "ASP.NET Core 5"로 구성되어 있다.

 

최근 자료에서는 "ASP.NET Core 5"가 단순히 "ASP.NET 5"로 적혀 있으며 미국 마이크로 소프트 Scott Hanselman씨도 블로그에서 "ASP.NET 5 will work everywhere."라고 써 있으며 ASP.NET 5 ASP.NET Core 5는 실질적으로 같은 것.

ASP.NET 5도 모두 오픈 소스로 개발되고 있다.

 

그런데 .NET Core 안에 있는 ".NET Native"? 이것은 애플리케이션을 네이티브 기계 언어 코드로 컴파일하는 기능이다. 특히 태블릿과 스마트 폰 같은 비력한 디바이스에서 관리 코드보다 더 좋은 성능 향상에 기여하는 것이 목적이다.

 

.NET 2015의 전체상에서 보면 마이크로 소프트가 오픈 소스화 ".NET Core 5"라는 것은 .NET Framework의 서브셋인 것, 그리고 ASP.NET 5 Windows에서도 Linux에서도 MacOS X에서도 공통으로 사용할 수 있다는 것이 주요 포인트이다.

 

 

C# ASP.NET Linux, MacOS X에서 동작한다

마이크로 소프트는 .NET Core의 오픈 소스화 발표와 동시에 .NET 서버 프레임워크의 Linux MacOS X용 공식 디스트리뷰션을 제공하는 것도 발표하였다.

.NET 2015를 구성하는 런타임의 RyuJIT, 컴파일러 Roslyn, 패키지 매니저 NuGet 3개가 오픈 소스로 개발됐으며 Linux MacOS X에도 대응할 예정이다.

.NET는 앞으로 Windows 뿐만 아니라 Linux, MacOS X에도 라이브러리나 프레임워크, 컴파일러, 그리고 런타임이 갖춰진 마이크로 소프트 순정 소프트웨어 스택이 제공된다.

 

여기에 MacOS X Linux의 텍스트 에디터에 Visual Studio가 가지고 있는 IntelliSense의 기능을 추가하는 오픈 소스 툴 "OmniSharp"의 가세로 마이크로 소프트는 .NET 개발 환경, 실행 환경, 디버깅 전체의 크로스 플랫폼 대응을 실현하려 한다는 방향성이 드러나고 있다.

마이크로 소프트는 이미 Linxu 상에서 실행하고 있는 ASP.NET에 대해 Visual Studio에서 원격 디버깅을 데모 하였다( http://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/012 ). 아마 Visual Studio Windows 뿐만 아니라 Linux, MacOS X의 서버 애플리케이션에도 대응한 최강의 개발 환경으로 하려고 한다.

 

미국 마이크로 소프트의 Scott Hanselman씨는 다음과 같이 말하고 있다. ".NET Linux, Mac, Windows에서 다른 언어와 같은 차원에서 경쟁하게 됐다. Ruby, PHP, Java, Pyton과 같은 화제 속에 .NET을 선택 사항으로서 넣고 싶다"

 

 

복사만으로 배포가 가능한 어플리케이션

.NET 2015에는 오픈 소스화뿐만이 아니라 또 하나의 큰 변경이 있다. 그것은 패키지를 복사하는 것만으로 배포할 수 있다는 것이다.

그 동안의 .NET Framework은 모노릭으로 기본적으로 런타임 및 라이브러리나 프레임워크를 통째로 OS 위에 설치하고 그 위에서 애플리케이션을 동작시켰다.

그러나 .NET 2015부터는 아키텍처를 고쳐서 어플리케이션마다 런타임 및 컴포넌트를 골라 패키징 할 수 있게 된다. 구체적으로는 하나의 폴더 안에 애플리케이션 실행에 필요한 파일을 모두 채워 놓고, 그것을 타겟 머신에 복사하는 것만으로 배포는 완료된다.

, MacOS X Linux에 일일이 .NET 디스트리뷰션을 설치하지 않아도 완전 새 OS 위에 애플리케이션을 폴더로 복사하면, 즉시 애플리케이션을 실행 할 수 있게 되었다. 클라우드에 있어서 어플리케이션의 대량 배포 등이 요구되는 장면에서 편리하게 될 것 같다.

 

 

출처: http://www.publickey1.jp/blog/15/macos_xlinuxnet_core.html

 

 

저작자 표시
신고
by 흥배 2015.01.26 08:00
.net, C#


 







저작자 표시
신고
by 흥배 2015.01.12 08:00

클라이언트와 Json 데이터를 주고 받는 도중 숫자가 포함된 Json 문자열을 구조체로 Deserialize 할 때 

'Expected digit' 예외가 발생.


var jsonObject = Jil.JSON.Deserialize<REQUSET_T>(decryptData);


위치: Jil.Deserialize.Methods._ReadInt64(TextReader reader) 파일 c:\Users\kevin_000\Dropbox\jil\Jil\Deserialize\Methods.ReadNumbers.cs:줄 519

   위치: _DynamicMethod0(TextReader )

   위치: Jil.JSON.Deserialize[T](TextReader reader, Options options) 파일 c:\Users\kevin_000\Dropbox\jil\Jil\JSON.cs:줄 579



테스트로 Jil로 숫자가 포함된 구조체를 Serialize한 Deserialize 하면 아무런 문제가 없음.

그러나 같은 내용을 클라이언트에서 JsonFX로 Serialize한 후 Jil로 Deserialize 하면 여전히 예외발생.


이번에는 JsonFX로 Serialize 하고, Json.NET로 Deserialize 해 보았음. 아무런 문제 없음.


그래서 JsonFx와 Jil로 Serialize 할 때의 차이를 보니 아래와 같음

JsonFX: {"LSeq":"533157870896947200","ID":"Dummy_1","AT":"63327632"}

Jil: {"LSeq":533157870896947200,"ID":"Dummy_1","AT":"63327632"}


LSeq가 정수인데 JsonFX는 값을 문자열처럼 만듬, 그에 비해 Jil은 숫자로 표시

JsonFX나 Json.NET은  "533157870896947200" 표현되더라도 Deserialize 할 때 해당 필드가 정수라면 정수로 변환해줌.

그러나 Jil은 문자열로만 인식하여 정수가 아니라고 예외를 발생 시킴.


이 문제를 해결할 방법이 없는한 Jil로 Json 포맷을 다루지 않는 경우라면 Jil은 사용하지 않아야 됨


===> 이 문제는 JsonFX의 문제가 아니고 Json 사양에 따른 문제임

Json은 정수는 int와 double만 지원한다. 만약 double 보다 큰 값을 사용하면 문자열로 치환한다.

위에서 LSeq의 값은 Int64의 값으로 double의 최대값 보다 크다. 그래서 JsonFX에서 문자열로 표현하였다.

Jil은 Json 사양과 다르게 Int64를 지원한다. 그래서 LSeq 값을 정수로 표현하였다.



저작자 표시
신고
by 흥배 2014.11.28 08:00

박주항님이 개발한 오픈소스 온라인 게임 서버 프레임워크인 CGSF는 두권의 책 출권 이후에도 꾸준히 개발중입니다.

Github

https://github.com/pdpdds/CGSF


e-book

http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486708

http://www.hanbit.co.kr/ebook/look.html?isbn=9788968486760



현재 개발 현황은 트렐로를 통해서 쉽게 알 수 있습니다.
https://trello.com/b/fQrjvbHp/cgsf



닷넷지원이 추가 되었습니다
https://github.com/pdpdds/CGSF/tree/master/NETFramework


CGSF의 모든 기능을 다 지원하지는 못하고 현재는 네트워크 기능에 중점을 두고 구현 했습니다.
C++ CGSF와 달리 SFPacket 방식만 지원하고 지금은 패킷 옵션은 지원하지 않습니다.
(앞으로 압축과 암호화를 구현할 예정입니다)
이제 막 문서화 작업을 시작해서 아직 문서는 없습니다.^^;
그렇지만 코드가 간단하고, 샘플 프로젝트가 있어서 분석하기 어렵지는 않을 것입니다.
관심 있는 분들의 피드백 부탁합니다.



CGSF와 관련된 질문이나 요청은 
https://github.com/pdpdds/CGSF/issues
를 사용해 주세요^^



ps: 실제 개발에 사용할 분들은 연락주시면 최대한 도와 드리겠습니다( CGSF 관련이 아니라도..)
다만 주항님이나 제가 본업이 있어서 시간적인 한계가 있습니다^^;

저작자 표시
신고
by 흥배 2014.10.02 08:00

기본 DLL 이외의 .NET Framework dll을 추가하는 방법

(C++/CLI에서 AesCryptoServiceProvider를 사용하기 위해서는 System.Core을 추가해야 한다)




저작자 표시
신고
by 흥배 2014.10.01 08:00

닷넷 프레임워크 4.0에 도입된 Dynamic 기능을 활용해서 가볍고 동적으로 데이터(DB)를 접근할 수 있는 컴포넌트

 

보통 데이터베이스의 데이터를 코드를 쉽게 접근하는 방법으로 ORM 모델을 사용하거나 mini-ORM을 사용하기도 하는데 Simple.Data를 사용하면 코드를 통해서 자동으로 DB 쿼리문이 만들어진다.

오픈소스로 GitHub를 통해서 얻을 수 있다.

https://github.com/markrendle/Simple.Data



public User FindUserByEmail(string email)

{

    return Database.Open().Users.FindAllByEmail(email).FirstOrDefault();

}

이 코드는 User 테이블의 Email 필드를 키로 모든 데이터를 가져오는 것이다.

Users.FindAllByEmail 동적코드로 



위의 Database.Open().Users.FindAllByEmail(email).FirstOrDefault();

ADO.NET 코드로 표현하면 아래와 같다.


public User FindUserByEmail(string email)

{

    User user = null;

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString))

    using (var command = new SqlCommand("select id, email, hashed_password,

                                                                     salt from users where email = @email", connection))

    {

        command.Parameters.Add("@email", SqlDbType.NVarChar, 50).Value = form.Email);

        connection.Open();

        using (var reader = command.ExecuteReader())

        {

            if (reader.Read())

            {

                user = new User { Id = reader.GetInt32(0), Email = reader.GetString(1),

                                          Password = reader.GetString(2), salt = reader.GetString(3)};

            }

        }

    }

    return user;

}


Simple.Data를 사용하면 위의 코드가 아래의 단 한줄로 끝난다 !!! 

Database.Open().Users.FindAllByEmail(email).FirstOrDefault();



지원하는 데이터베이스

ADO-based access to relational databases, with providers for:

  SQL Server 2005 and later (including SQL Azure)

  SQL Server Compact Edition 4.0

  Oracle

  MySQL 4.0 and later

  SQLite

  PostgreSQL

  SQLAnywhere

  Informix

MongoDB

OData



SimpleData에 대해서 더 자세히 알고 싶다면 아래의 문서를 참고한다.
http://simplefx.org/simpledata/docs/




MongoDB

MongoDBSimple.Data.MongoDB 라고 따로 분리 되어 있다. 

https://github.com/craiggwilson/Simple.Data.MongoDB


주의 사항

1. 몽고디비 컬렉션의 컬럼 이름이 ID 이면 안된다.

이유는 기본으로 몽고디비는 컬렉션에 문서를 만들 때 _id 컬럼을 만드는데 우리가 ID 컬럼을 만들면 Simple.Data.MongoDB에서 이름을 부여할 때 중복된다. -_-

2. 쿼리를 하면 모든 컬럼 값을 다 가져온다. 일부만 가져올 수 없다.

Cast도 그냥 정적 클래스(혹은 구조체)에 담아주는 것이지 일부 컬럼만 가져오는 것이 아님

저작자 표시
신고
by 흥배 2014.08.22 08:00
| 1 2 3 4 5 6 ··· 8 |