설명 : 사용할 클래스의 인스턴스가 생성자 호출시 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴.


장점 : 하나의 객체를 통해서만 관리하니, 구조적으로 단순해진다.

단점 : 여러곳에서 해당 객체에 접근할 경우, 멀티 스레드에 대한 조치가 필요하며, 

한곳에서 수정이 여러곳에 영향을 미칠 수 있다.

'IT 개발 소식 > IT 용어' 카테고리의 다른 글

모델(Model) 이란?  (0) 2016.10.06
클래스의 Is a, Has a 관계  (0) 2015.12.02
IMAP 이란?  (0) 2015.11.09
hosts 파일 위치  (0) 2015.08.04
Posted by Hoya0415
,

모델은 응용 프로그램이 작업을 수행하는 세계에 대한 정의이다.

ex) 은행 업무 프로그램

 계정, 일반 원장, 고객의 신용한도, 입금 및 계좌 인출 등과 같은 모델의 데이터를 조작하는 작업을 포함한 으용프로그램이 지원하는 은행의 모든 것을 표한한다.

추가적으로 모든거래의 원장을 추가해야 한다거나 고객이 지정한 한ㄷ나 은행이 보유하고 있는 금액보다 더 많은 금액을 인출하지 못하게 하는등 데이터의 상태와 일관성을 유지하는데 책임도 지고 있다.


모델은 반드시 지원해야만 하는 현실 세계의 특정 산업이나 업무에 필요한 엔티, 작업, 규칙들을 규정함으로써 정의하게 되는데, 이를 도메인(Domain)이라고 한다.


모델은 두 가지 종류가 존재한다.


뷰와 컨트롤러 간의 전달되는 데이터만 담고 있는 단순한 뷰 모델(View Model)


업무 도메인 데이터 뿐만 아니라 데이터에 대한 작업과 변환, 그리고 조작 규칙을 담고 있는 도메인 모델



'IT 개발 소식 > IT 용어' 카테고리의 다른 글

싱글턴 패턴 (singleton pattern) 이란?  (0) 2016.10.06
클래스의 Is a, Has a 관계  (0) 2015.12.02
IMAP 이란?  (0) 2015.11.09
hosts 파일 위치  (0) 2015.08.04
Posted by Hoya0415
,

모꼬지라는 웹 사이트를 서비스 하고 있어요~


클래스 및 모임 을 중계해 주는 사이트인데


이미지 관련된 부분이 많아서 Thumbnail을 만들어보려고 하는 도중에


비트윈이라는 프로그램에서 Skia를 쓰고 나서 속도가 빨라졌다는 얘기를 듣고 도전해보기로 했어요


제가 닷넷 유저라  닷넷으로된 소스가 없나 찾아보았더니 


GitHub에 모노(Mono) 프로젝트로 SkiaSharp 이 있더라구요 너무 다행이었어요.


C++로 된 LIB를 가져와서 DLL로 변환 후에 Dllmport 하지 않아도 되는 귀찮음이 없어져서요^^


물론 Visual Studio 켜서~ Nuget Pagkage 쪽에서 SkiaSharp으로 받아도 된답니다.~


SkiaLibrary 설명으로는 제가 본것은 Xamarin 쪽에 올라온 것과 구글쪽에 라이브러리 설명이 있어요


라이브러리 설명 :  구글 , Xamarin


모르는 라이브러리 있으면 찾아보면 됩니다.


지금 버전은 Version 1.54.0에요


GitHub으로 다운을 받았다면 아래와 같은 폴더 구성으로 되어있어요



자자 다른건 볼 필요없이 samples 폴더-> Skia.WPF.Demo 폴더로 들어가서 Solution 프로젝트(Skia.WPF.Demo.sln)를 열어봅시다.


켜보면 분명 에러 나올겁니다. 



안나오시는 분들있으면 그대로 진행해주세요^^.

오류 내용은 1.54.0.1 버전으로 받아야져있는데 Nuget에는 1.54.0 버전만 있어서 찾을 수 없다. 이런 내용입니다. Nuget 패키지 복원하셔도 1.54.0.1이 없어서 못 받으실거에요.

해결 방법은 기존의 1.54.0.1 을 지우고 1.54.0 버전을 받으면 됩니다.


먼저 packages.config 파일로 가서 version="1.54.0.1" 로 되어있는 것을 version="1.54.0" 인 현재 버전으로 바꾸어주세요. 그러면 오류가 하나 없으질 것이고,


다시 폴더로와서 Skia.WPF.Demo.csproj 이 파일을 편집으로 열어봅시다.



<Import Project="packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets'))" />


위에 두 부분을 현재 버전으로 바꿔주자


<Import Project="packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets'))" />


이렇게 하면 에러는 사라진다~


이후로는 SK...CLASS이름 들의 에러가 나오는데 Nuget Package에서 SkiaSharp을 제거 후에 다시 설치하자.



이 라이브러리가 설치가 되면  빌드(Build)를 한다. 그리고 이제는 


프로젝트에 간단한 에러사항들을 처리해준다.


나의 경우는 아래의 함수가 없는데 호출할려고해서 주석으로 처리했다.

//path.GetTightBounds (out rect);


그리고 이제 빌드를 하면 

오류 The Platform needs to be either x64 or x86 to support Skia in Windows. Skia.WPF.Demo

위의 오류 메세지가 나오는데 



Platform 을 바꿔서 실행하자!x64나 x86 둘중 하나 고르면 되요



자 실행 되었다.

간단히 콤보박스를 넘겨보면서 샘플을 보자

여기까지 오셨으면 다음 시간 2탄에는 SkiaSharp을 이용해서 이미지를 Resize하는 방법을 알려주겠어요~

수고하셨습니다. 


댓글은 작성자에 대한 고마움의 표시입니다.^^

'.NET 개발 > C#' 카테고리의 다른 글

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

Webp C#

.NET 개발/C# 2016. 9. 23. 09:33

구글 라이브러리 Webp 를 닷넷에서 쓰려면 


C++ 라이브러리를 C#으로 사용 할 수 있게 dllImport 시켜줘야 해요


아직 이 부분은 안해보았습니다.


검색을 더 해보니 webp-discuss 그룹


이 그룹 페이지에 중요한 링크를 얻었어요


하나는 WEBP-NET GitHub 페이지 입니다. 여기서 32bit , 64bit DLL을 얻을 수 있습니다.


이렇게 DLL이 나눠져있다는건 플랫폼에 따라 불러와야하는 DLL이 다르다는거 아실거라 믿습니다~


물론 샘플 파일도 있습니다.


그리고..다른 WEBP 그룹 에 보면 


테스트 샘플 자료도 있습니다.


webptest_compild.zip


WebPTest_sources_and_dll.zip


샘플 파일도 있어서 확인해보면 됩니다.!



'.NET 개발 > C#' 카테고리의 다른 글

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

RadPDFViewer에 PDF 를 Load 했을 때 아래와 같은 현상이 일어난다면, 


telerik 라이센스 버전이 2010~2011 버전일 것입니다..


나도 한 예를 주는 것 뿐이지 정확한 해결방법은 이슈가 해결된 최신버전을 받아서 


하는것이 정신건강에 이롭습니다..


하지만 가격도.. 무시하지 못하니까.. 해결 방법을 알려주겠습니당..



(1장짜리 pdf를 불러와서 넣었는데 아무것도 안나오고 있다.)



RadPDFViewer를 design 화면에 넣으면 자동으로 아래의 dll들을 불러옵니다.



RadPDFViewer를 위해 불러온 dll 인데 여기서 한가지 더 추가시켜야


위의 dll을 추가하면 PDF White 현상을 해결할 수 있습니다.


물론 나의 경우에 이것으로 해결했지만 다른 문제가 있을 수도 있습니다..



999달러 혹은 1999달러를 내고.. 맘 편할지 해결을 할지 ㅠ 결정해야합니다..

'Software' 카테고리의 다른 글

USB 초기화 Win32DiskImager  (0) 2017.07.30
Telerik WPF Control 라이센스 정책  (2) 2016.08.26
Bytescout 라이센스 정책  (0) 2016.08.26
using Telerik Controls of Silverlight or WPF  (0) 2015.11.11
Posted by Hoya0415
,

Telerik은 각종 컨트롤을 제작하는 상용 컨트롤 판매 회사입니다.


Telerik 제품을 사용하면 프로그램 개발 시 커스텀 컨트롤을 만들 필요 없이 응용 프로그램을 빠르게 만들 수 있습니다.


WPF로 만든 프로그램을 판매하던 차에 라이센스에 대해 명확히 알고 싶다는 고객사의 요청으로 라이센스를 찾아보았습니다.


라이센스는 다음과 같습니다.


http://www.telerik.com/purchase/license-agreement/wpf-dlw-s


Telerik 라이센스 정책 


라이센스 내용을 보시면 재 가공하여 만든 프로그램은 배포가 가능하다라고 나와있습니다.


커스텀 컨트롤을 만들어 파는 회사인데 재배포 없이는 안되니깐요.


이상으로 마칩니다.




'Software' 카테고리의 다른 글

USB 초기화 Win32DiskImager  (0) 2017.07.30
Telerik RadPDFViewer White PDF issue  (0) 2016.08.31
Bytescout 라이센스 정책  (0) 2016.08.26
using Telerik Controls of Silverlight or WPF  (0) 2015.11.11
Posted by Hoya0415
,

회사 프로젝트로 QR을 이용한 PDF 문서 관리를 프로그램을 개발하고 있었습니다. 


QR Reader 라이브러리를 찾아보다가 운 좋게도 퀄리티 높은 라이브러리를 발견했습니다. 


Bytescout 회사 제품인 'Barcode Reader SDK' 입니다. 


Trial로 테스트 후 구매하여, QR을 읽는 부분에 중요한 라이브러리를 얻게되었습니다.


Barcode Reader SDK (2D barode Only) 로 구매했으며, 개발자당 한 개의 라이선스가 필요하다고 


명시되어있고, 이 라이선스는 End-User에게 재 배포할 시 제한이 없다고 명시되어 있습니다.


개발자는 저 혼자뿐이였습니다.


https://s3.amazonaws.com/bytescout.com/files/help/BytescoutBarCodeReaderSDK/index.html


추가적으로 데스크탑용, 서버용으로 라이선스가 나눠져 있으니 확인해보시기 바랍니다.




'Software' 카테고리의 다른 글

USB 초기화 Win32DiskImager  (0) 2017.07.30
Telerik RadPDFViewer White PDF issue  (0) 2016.08.31
Telerik WPF Control 라이센스 정책  (2) 2016.08.26
using Telerik Controls of Silverlight or WPF  (0) 2015.11.11
Posted by Hoya0415
,


1. 내 문서 경로\IISExpress\config\applicationhost.config 을 편집으로 파일을 연다.


2. 단어 검색으로 <sites>부분을 검색하고


  <site name="프로젝트이름" id="3">

                <application path="/" applicationPool="Clr4IntegratedAppPool">

                    <virtualDirectory path="/" physicalPath="H:\프로젝트이름" />

                </application>

                <bindings>

                    <!--<binding protocol="http" bindingInformation="*:58665:localhost" />-->

                     <binding protocol="http" bindingInformation="*:58665:" /> 

                </bindings>

  </site>


Visual Studio  생성한 웹 사이트 주소를가 Site 태그에 있을 것이다.


물리적주소 physicalPath도 보인다


그리고 <binding 태그를 보면 원래는 bindingInformation 이 부분이 아래와 같은데 


 <!--<binding protocol="http" bindingInformation="*:58665:localhost" />-->


바꿔주면 된다.


<binding protocol="http" bindingInformation="*:58665:" /> 


바꾼 후 관리자 모드로 Visual Studio를 켜고 프로젝트를 불러와서 실행해보면 


외부 IP로도 접근이 가능하다.


※추가※

만약 위에 사항해도 안된다면 

방화벽은 해제와 고급 보안이 포함된 윈도우 방화벽에서 인바운드 포트를 열어주면 된다.


Posted by Hoya0415
,



C# 1.0 

VM언어이지만 Interop을 고려 

PInvoke, unsafe(pointer), delegate


c# 2.0 제네릭

c# 2.0 ?? 연산자

c# 2.0 yield return/break

c# 2.0 partial class 

- 클래스의 구현을 2개 이상으로 분리

- 자동 코드 생성의 문제점 해결!


c# 2.0 anonyumous method

- 이름 없는 메서드 정의 가능

- delegate 타입의 인자로 인라인 메서드 정의 

- 이벤트 처리기


c# 2.0  static class

- IL 코드 표현 : 상속 불가능한 추상 클래스

- C# 컴파일러 : 인스턴스 멤버 정의 불가능


1. C++의 Template과 유사

2.메서드 수준의 제네릭 지원

3. 박싱/언박싱 문제 해결

참조 형식이면 상관이 없지만, 값형식일 경우는 제너릭을 사용하는게 좋다.

4. 1) 제약1 - 상속타입 

   2) 제약2 - 값/참조 타입

   3) 제약3 - 인자 없는 생성자 필수 



c# 2.0 - Nullable 타입

.net 2.0 BCL: Nullable<T> 구조체 추가

c#의 경우 T? 형태로 단축 표기



C# 3.0 자동 구현 속성

- Field + Property 구현을 단순화

- Get/Set의 접근 제한자


C# 3.0 컬렉션 초기화

- ICollection 인터페이스를 구현한 타입

- 컬렉션의 요소를 new 구문에서 추가


C# 3.0 - LINQ

- LINQ : Language-Inegrated Query

-> 언어에 통합된 쿼리 표현식(Query Expressions)

-SQL 쿼리의 SELECT와 유사 


C# 3.0 - var 예약어

- 컴파일러가 로컬 변수의 형식을 추론

- C++ 11의 auto 예약어와 동격


C# 3.0 - 객체초기화(1)

- 공용 속성을 통해 객체 생성시에 초기화

- LINQ에 사용 anonyumous type

- 컬렉션 초기화 + 객체 초기화


C# 3.0 - 익명 타입

이름 없는 타입

- 내부적인 처리는 익명 메서드와 유사

- var 사용은 필수

- Linq Select,Join


C# 3.0 - 확장메서드

- 정적 메서드를 마치 인스턴스 메서드처럼 사용

- 결국 정적 메서드 호출

- 쿼리 구문과 메서드 기반 구문 (53분)

- WEHER

- ORDER BY


C# 3.0 람다 식

- 추론을 통해 delegate 익명 메서드 개선

- 값 반환 + 단문 메서드 -> return + 중괄호 생략

- 메서드 기반 쿼리를 단순화.

- 데이터로써의 람다 => Expression Tree

- Exptression Tree 컴파일

- SQL 쿼리를 생성

  LINQ TO SQL 실행 시 실제 쿼리로 생성이 된다.

- 사례2) 공용 속성 이름

  LINQ to...

  표준 쿼리 연산자


C# 4.0 - 선택적 매개 변수

선택적 매개변수

-C++의 디폴트 매개변수


C# 4.0 - 명명된 인자.

-인자의 이름으로 호출 측에 값 전달


C# 4.0 - dynamic 

-실행 시에 결정되는 타입

-결국엔 object 타입

-IronPython과 C#

-C#에서 IronPython 메서드 연동

'


C# 5.0 - 호출자 정보 (다시 봐야함)

C++의 3가지 메크로 상수에 대응


C# 5.0 - async-await

-마치 동기 방식처럼 비동기 호출

-사용자 정의 ...Async 메서드












'.NET 개발 > C#' 카테고리의 다른 글

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
Webp C#  (0) 2016.09.23
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

대리자는 메소드의 참조 혹은 콜백으로서 명령어들을 코드로 만든 다음 바로 호출하는 방식보다 다른 위치의 명령어의 집합을 호출할 수 있도록 전달하는 강력한 개념이다.


C# 3.0 에서는 Lambda 식을 소개하고 있고 

C# 2.0 에서는 익명 메소드 문법을 대체한다. (익명 메소드는 사라진게 아니다)


이런 닷넷의 특징들은 메소드 내에서 동적으로 명령들을 수행하는데 있어, 굉장한 유연성을 제공한다.

이것이 바로 LINQ라는 통합 언어 징의 (Language Integrated Query API를 이용해서 컬렉션에 대해 프로그래밍을 한결 쉽게 해주는 기능이다.


람다 식은 문 람다와 식 람다 두가지를 포괄한다. 

식 트리의 대한 개념과 대리자 구현 그대로가 아닌 람다 식의 의미론적인 분석을 표현하는 부분은

Linq to SQL 과 Linq to XML과 같은 컨텍스트 내에서 식트리를 해석하는 라이브러리의 핵심적인 특징이다.


example. 1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class Program
    {
        public enum SortType
        {
            Ascending,
            Desending
        }
 
        static void Main(string[] args)
        {
 
            ComparisonHandler c = (int first, int second) => { return first > second; };
            Func<int,int,bool> f = c.Invoke;
 
 
            int[] items = new int[] { 1121354};
 
            //문 람다
            //var result = BubbleSort(items, (int first, int second) => { return first > second;});
 
            //식 람다
            var result = BubbleSort(items, (int first, int second) => first > second);
 
            //익명 메소드
            //var result = BubbleSort(items, delegate(int first, int seconde){return first > seconde;});
 
            //매개변수가 없는 익명 메소드
            //var result = BubbleSort(items, delegate { return Console.ReadLine() != ""; });
            
 
            foreach (var item in result)
            {
                Console.WriteLine(item.ToString());
            }
 
            Console.ReadLine();
        }
 
        public static bool GreaterThan(int first, int second)
        {
            return first > second;
        }
 
        public static bool AlphabeticalGreaterThan(int first, int second)
        {
            int comparison;
 
            comparison = (first.ToString().CompareTo(second.ToString()));
 
            return comparison > 0;
        }
 
        public delegate bool ComparisonHandler(int first, int seconde);
 
        static int[] BubbleSort(int[] items, Func<int,int,bool> comparisonHandler)
        {
            int i;
            int j;
            int temp;
 
            if (items != null)
            {
                for (i = items.Length - 1; i >= 0; i--)
                {
                    for (j = 1; j <= i; j++)
                    {
                        if (comparisonHandler(items[j-1], items[j]))
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
 
        static int[] BubbleSort(int[] items, SortType sortOder)
        {
            int i;
            int j;
            int temp;
 
            if(items != null)
            {
                for ( i = items.Length - 1; i >= 0; i--)
                {
                    for ( j = 1; j <= i; j++)
                    {
                        bool swap = false;
 
                        switch(sortOder)
                        {
                            case SortType.Ascending:
                                swap = items[j - 1> items[j];
                                break;
                            case SortType.Desending:
                                swap = items[j - 1< items[j];
                                break;
                        }
 
                        if(swap)
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
    }
cs


example 2.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 List<string> stList = new List<string>() { "a""b""c""f""d""g" };
 
            var selection = stList.Where((st, index) =>
            {
                var item = index.ToString();
 
                if (st == "a" && index == 0)
                    return true;
                else
                    return false;
            });
 
            foreach (var item in selection)
            {
                Console.WriteLine(item);
            }
 
cs


'.NET 개발 > C#' 카테고리의 다른 글

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
Posted by Hoya0415
,