.NET Standard 2.0 관전 포인트

올 가을 .NET Standard 2.0이 출시된다.
이번 업데이트에서는 .NET Framework에서 꿀빨던 많은 API들을 최대한 수용하여 .NET Core로 이식 가능성을 중점으로 삼았다.
또한, Mono와 Unity 접근성을 최대한 확보하여 Mono에서 .NET Core 로 이동하여 통합 개발이 가능하도록 유도하였다.
그렇다면 대체 .NET Standard 2.0 에서 주의깊게 봐야 할 요소는 무엇이 있을 지, 알아보도록 하겠다.

1. .NET Framework와 .NET Core 간 상호작용

NETStandard20Libraries.png
출처: .NET Standard 2.0 – Making Sense of .NET Again

닷넷코어는 최신 표준인 1.6조차 .NET Framework 에서 .NET Core로 옮기는 데 부족한 API로 많은 어려움이 있었고,
게다가 Reflection API의 상당한 변경, AppDomain API 부재로 이를 사용한 라이브러리 이식에 많은 어려움이 있었다.
이번에 2.0의 메인 변경점이 바로 .NET Framework와 호환 가능한 API가 대거 추가된다는 점이다.
하지만 AppDomain 은 잘 쓰지 않는다. 이 글을 보고 있는 당신도 왜 AppDomain을 쓰는지 잘 모를 수 있을 것이다.
주로 플러그인 동적 로드 용도(라이브러리 동적 로드)로 쓰는데, .NET Core에서는 굳이 없어도 동적 라이브러리 로드 및 관리에 지장이 없다.
물론 .NET Core 에 API는 있지만 뭔 짓을 해도 PlatformNotSupportedException 예외가 나올 것이다.
어찌저찌 얘기해도 결론적으론 필요성이 전무하다는 거다. 이는 공식 FAQ에 나와 있다.
뱀발로, 기본적으로 닷넷 앱을 실행하면 자동적으로 1개의 AppDoamin 안에서 실행된다. 그리고 닷넷코어는 1개만 쓰도록 강제한다고 생각하면 된다.
어쨌든, 이런 아주 특이한 케이스를 제외하고는 최대한의 호환성 확보로 .NET Framework 와 .NET Core 간 호환에 지장이 없도록 했다는 것이 포인트.
그럼 이식 가능한 라이브러리(Portable Class Library)는 어떻게 되냐고? 일단은 살아있다. 일종의 플랫폼 간 다리로. 아직 이렇다 할 사안은 공식적으로 없다. 쓰고 싶은 사람은 쓰도록.
아무래도 한국 닷넷 개발자가 .NET Core로 이식한다면, 가장 맨붕 올 주는 부분이 바로 System.Data의 부족함일 것이다.
일단 추상 클래스는 원래대로 제공하되, ODBC 같은 특정 플랫폼용 API는 제공할 계획이 없다고 하니 이 점을 유의하면 되고,
특히 MSSQL 연동 시 .NET Framework에서는 아예 기본 제공이었던 점과는 달리 따로 분리되어 따로 불러와야 한다는 점만 주의하면 되겠다.
WCF나 WPF같은 경우 애초부터 윈도우 종속이기 때문에 절대 기대는 하지 말자. 다시말해, 닷넷 자체 플랫폼 종속 기능과, Remoting 기능을 기대하지 말라는 거다.
(단, XAML 자체는 독립 플랫폼 표준이 생겼기 때문에 플랫폼별로 Xamarin 등으로 새로 만들어야 하는 거 빼면 스펙 문제는 없다.)
이런 몇가지 예외 사항을 제외하면 대부분이 이식 가능하도록 배려했다고 한다.

2. .csproj 부활

앞서 닷넷코어 팀이 1.0 Preview에 예고한 것처럼, project.json 방식에서 다시 .csproj 방식으로 돌아온다.
.csproj 방식은 XML 으로 관리하는 방식인데, 닷넷 팀도 기존에 강력한 프로젝트 관리 형식을 버린다는 건 낭비라고 판단한 듯 하다.
분명 JSON 방식은 사람이 읽기가 쉽고 간결하며, 프로젝트 관리에 지장은 크게 없었지만, 닷넷의 모든 것을 수용하기엔 해결해야 할 과제가 많았기에 돌아온 것으로 보면 된다.
그래서 .NET Framework 에서 .NET Core로 이식하거나 그 반대로 마이그레이션 하는 접근성을 한층 더 높여줬다고 보면 된다.

3. 뭐야? 이게 다야?

그렇다. 이게 다다. 공식적으로 닷넷 2.0 최종 버전의 소개는 이게 다다.
뭘 더 바랬는지 모르겠지만, .NET Standard 는 스펙이다. 구현체는 .NET Framework 와 .NET Core다.
스펙에서는 플랫폼 간 이식에 중점삼아 스펙을 구성하여 이걸 .NET Framework 와 .NET Core 으로 구현한 것이다. 이게 다다.
C# 표준도 향상된다. 하지만 이는 .NET Standard와는 상관이 없다. C#은 언어 스펙이기 때문이다. 당연히 최신 언어 스펙을 .NET Standard 1.x 사용하는데 크게 지장이 없다.
.NET Framework 4.5 부터는 언어 스펙이 올라가도 사용하는 데 지장이 없다는 걸 C# 6.0에서 보여주었다. 그렇기에 따로 봐야 할 문제다.
물론 가능하면 새로운 앱을 만들거나 마이그레이션을 해야할 경우가 생기면 .NET Standard 최신 버전을 따르는 게 유리할 수밖에 없다. 1.x 는 API 텀이 너무 많기 때문이다.

글 쓴 나도 허무하다. 하지만 이번 업데이트 만큼은 기대해도 좋다. 왜냐면 닷넷 그대로 덜 만져서 탈윈도우 플랫폼을 꾀할 수 있는 기회가 되기 때문이다.
지금 당장 테스트하고 싶으면 .NET Core 2.0 Preview를 설치하면 된다. 거기서 크게 달라질 거 없다고 한다.

여담으로, Standalone 프로젝트(사내용 앱 등)은 특정 플랫폼, 특정 API를 쓰는 경우가 많기 때문에 그 프로젝트 자체를 마이그레이션하려는 멍청한 짓은 하지 말자. 어자피 갈아 엎어야 한다.

composite / 2017년 8월 11일 / Piss Development / 2 Comments

nw.js 한국어 활동을 중단하다.

다들 Electron 쓰는 거 안다. 그래서 단도직입적으로 말하겠다. nw.js 활동 관뒀다.
시간에 쫓기고 관련 프로젝트도, 수요도 없으며, nw.js 쓰던 개발자들도 모두 Electron으로 옮긴 데는 이유가 있다.
뭐, 어찌보면 나의 변명을 싸지르는 글이기도 하다. 일단 나열하겠다.

미미한 수요

현재 많은 개발자들은 데스크탑 앱을 간편하게 제작하는 데 Electron 으로 개발하고 있을 것이고, nw.js 라는 놈이 있었나 하는 사람들은 깊게 파기 시작하다보면 아하 할 것이다.
당연하겠지만, Electron은 개발자 친화적인 프레임워크를 구축하였기에 더 많이 채택된 것이다. 즉, 이런 이유로 Electron을 선택한 것이다.

  • node.js 에 익숙한 개발자들의 익숙한 개발환경 구축 용이
  • ASAR 패키징을 통한 기본적으로 손쉬운 패키징
  • 많은 사용자 커뮤니티 층과 Issues
  • 성능과 기술 수용속도가 유리
  • 견고하고 안정적인 업데이트 주기

당연하겠지만 첫번째 이유가 가장 큰 이유 되시겠다.
물론 nw.js도 나름대로 장점이 있다.

  • node.js 에 익숙하지 않아도 구축 가능한 개발 환경
  • 자바스크립트 소스코드 보호를 위한 nwjc 제공

둘 다 오픈소스다. 그리고 하나는 Github, 하나는 Intel 이 주도한다.
결국 nw.js 의 업데이트 속도와 Issue는 느려졌고, Intel의 보수적 개발 덕분에
수요자들을 충족시키지 못했다. 자연스레 Electron의 압승으로 현재 진행중이다.

여기서 Electron을 선택할 수밖에 없는 수요층이 있는데, 바로 실시간 처리를 하는 업자들이다.
대표적인 예로 메신저, 화상 회의나 채팅 등이 있다. 그리고 여러분이 많이 쓰는 Slack이 대표적 업체다.
개발하던 패턴대로 개발하면 되기 때문이다. node.js 관련된 여러 기술들을 그대로 가져다 쓸 수 있다.
물론 네이티브로 갈 땐 얘기가 달라지지만.

기술적으로 Electron은 nw.js에 비해 프론트엔드와 백엔드 컨텍스트가 완전히 분리되어 있다.
이 때문에 명확한 컨텍스트 관리라는 평가를 받고 있기도 하다.

랜섬웨어 프레임워크???

파일을 무작정 암호화 하고 파일을 인질삼아 금품을 요구하는 랜섬웨어.
이 프로그램을 만드는 데스크탑 프레임워크의 쌍벽이 있는데,
하나는 .NET WinForm이고, 또 하나는 nw.js 다.
그래서 보안개발자들 입장에서는 nw.js 는 비트코인처럼 혐오하는 프레임워크일 지도 모른다.
당연하겠지만 node.js 에 익숙하지 않은 개발자들에게 nw.js는 접근성이 용이하다.
왜냐면 그냥 웹 페이지만 띄우고 package.json 쓰고 실행만 하면 땡이기에.
그래서 어느 백신은 nw.js 들어가기만 해도 걸러내는 오진을 선보이기도 했다.
결국 nw.js 는 Electron 개발자 중 아는 개발자들에게 웃음거리가 됐고 불명예스러운 프레임워크가 됐다.

Github의 윈윈전략

Electron은 Github의 주요 기술이다. Atom Editor는 그 기술을 통해 제공하는 컨텐츠일 뿐이다.
거리낌없이 Electron을 오픈했고, 기업들은 이를 선택했다. MS도 거리낌없이 선택했다.
이리하여 Github은 거대한 플랫폼 시장을 형성하는 데 성공했고, 이제 Github 종속된 대기업이 많아졌으며,
세계적 브랜드 네이밍을 어마어마하게 키운 업체가 되었다. 한국 직원이 아직도 없다는 건 무시하자.
(참고로 중국과 일본은 있는데 한국은 없다는 점에 카타르시스를 느끼는 병신이 본인이다. Github Enterprise는 중국과 일본에 현지 서비스가 가능하지만 한국은 없다고 한다. 지금도.)

그에 반해 nw.js 도 많은 노력을 기울였고 Electron을 탄생시킨 프로젝트였지만,
이제 말하는데 nw.js 프로젝트를 인텔이 이끄는 걸 아는 사람도 별로 없더라. 허..

브랜드 파워는 이런 단순한 곳에서 출발하여 거대한 시장을 이끌어내고 있다.

나 이제 뭐하냐…

일단 Electron 에반젤리스트들은 한국에도 꽤 많아졌다. 물 들어올 때 노 저어 이름 석자 알린 사람도 꽤 있다.
그런 면에서 나는 비주류에 노를 젓다 썰물 다 가 고립된 상태인 것이다.
지금 내 꼬라지를 짤방으로 마무리하며 시간상 여기까지 싸지르도록 하겠다.

둠가이

composite / 2017년 7월 11일 / Dog's bullshit, Piss Development / 0 Comments

자, 자바커들아, 게이물 시작하지. Porject Jigsaw 통과.

지난 6월 27일, 내 예상과는 달리 직쏘가 통과되어, JDK 9에 당당히 포함할 수 있게 되었다.
직쏘 반대하느라 A4용지 30여페이지를 날린 레드헷만 끝가지 반대 입장을 고수했고, 나머지는 오라클 영업력에 뻑이 갔는지 모두 찬성했다고 한다.

자바 개발자들에게 여태까지 버텨왔던 하위 호환성. 이제 개나 주게 생겼다.
하지만 그건 문제가 아니다. 왠만한 언어 스펙도 이런 고통을 안고 업그레이드 했다.
가장 대표적인 게 Python인데, 유니코드 지원이 강화한 대신 유용(?)한 API를 삭제했다고 원성을 높여
아직도 2.7을 쓰는 프로젝트와 제품이 즐비한 상황이다.
자바도 뭐 이미 그꼴 날 건 뻔할 뻔자지만, 당분간 자바개발자들은 임베디드나 모바일 계통이 아닌 이상은
계속 Java 8을 보고 있을 것으로 보인다.

직쏘를.araboja

정식 명칭으로 “자바 플랫폼 모듈 제계(Java Platform Modulule System)”라는 이름을 가지게 되었으며, JSR-277 번호를 가지고
2011년 프로젝트를 시작하여 원래 자바 7에 추가할 예정이었다. 하지만 구조적 문제가 해결되지 않아 자바 8에서도 보류하는 아픔을 겪었다.
직쏘에 기대를 거는 이유는 하나다. 여태까지 고질적인 자바의 문제를 해결할 핵심 기능을 가지고 있었기 때문이었다.
자바의 고질적인 원흉인 캡슐화 문제는 뭐 이미 옛날부터 제기해왔지만, 당시 닫혀 있었던 구조상 해결할 수 없어 그저 수용만 했던 개발자들이 대부분이었다.
하지만 자바의 오픈 이후 이를 개선할 수 있는 움직임이 생겼으며, 이 중 하나가 바로 직쏘다.

대부분의 자바 개발자는 이런 반응을 보일 것이다.

  • 크로스 플랫폼으로 잘만 돌아가고 있는데 왜?
  • 메모리 문제? 그저 사양만 늘려주면 빠르고 깔끔하잖아?
  • 경량화? 경량화 할 디바이스가 어딨다고…

근데, 리조트 프로젝트 했었는데, POS를 자바로 개발하려는 시도가 있었다. 하지만 낮은 사양에 높은 처리능력을 요구하기에 자바는 맞지 않았고 닷넷으로 갔다.
관련 프로젝트를 해본 사람이라면 안다. 왜 자바를 POS에 접목시키는 게 쉽지 않았는지. 웹 말고.
하지만 모듈 시스템을 탑재하면 더 가벼워진 이미지로 적은 메모리로도 POS 시스템을 돌릴 수 있다고 생각해보자.
속 시원하지 않겠는가?

이 중 큰 원인이 바로 자바의 상속 시스템인데. rt.jar 파일 아는가? 자바에 모든 API가 있는 라이브러리다.
그만큼 무겁다. 더럽게 무겁다. 모든 자바 프로그램은 절대 이 라이브러리를 거역할 수가 없다.
닷넷의 경우 얘기가 틀린데, 닷넷은 GAC이라는 레지스트리급 쓰레기가 있지만, 대신 모듈이 분리되어 필요한 것만 갖다가 쓸 수 있다.
그래서 시작 속도 뿐 만 아니라 성능 면에서도 유리하다. 예를 들어,
자바는 웹을 아예 안 써도 웹 API를 가지고 가야 한다. 하지만 닷넷은 안쓰면 안가져가도 된다. 이 차이인 것이다.
그러나 직쏘와 함께하면 자바도 웹 안쓰면 웹 안들고 가도 동작하도록 할 수 있다. 말 다했다.

한마디로 자바의 입지를 한 층을 넘어 더 다양한 분야에 뛰어들게 해주는 샘물같은 존재다. 그걸 모르는 자바 개발자들은 지금에도 만족하며 잘 개발하고 있겠지만.
게다가 이런 현상을 유지하는 데 한몫한 업체가 바로 의외에 있었는데, 구글이다. 그렇다. 안드로이드다.
하지만 안드로이드는 개발 시 자바를 언어로 쓸 뿐, 오라클의 JVM을 쓰지 않고 아예 독립적으로 개발한 JVM으로 돌리고 있다.
게다가 딸려나오는 라이브러리도 많다. 그리고 이들 모두를 상속받아야 안드앱 개발이 가능하다.
따라서 모듈 시스템에 수혜를 받기엔 가상머신부터 틀려서 일단 패스하고.

이클립스 실행하는 데 느리다고 생각하는 사람 많을 거다. 더럽게 무겁기도 유명한 비주얼 스튜디오보다도 느리다. 인텔리제이도 시작 속도 예외는 없다.
그걸 빠르게 해 주겠다는데. 왜?

직쏘가 어떻게 구현되고 돌아가는지는 얘기가 너무 길어지니 직접 검색해서 보도록 하자. 한글 블로그에도 많이 소개되어 있다.

직쏘의.problem

이렇게 자바에게 날개를 달아주는 녀석이지만, 많은 자바 개발자들이 우려하고 있는 점이 있다면 바로 하위 호환성을 꼭 빼놓을 수 없다.
자바 1.5부터 추가된 제네릭의 경우는 객체 소멸(Type Erasure)을 통해 컴파일 때에만 제네릭을 검사하고 런타임 상는 제네릭 없이 돌아가도록 구현하였다.
그래서 닷넷과는 달리 Map 클래스와 Map<Key, Value> 클래스. 제네릭이 있던 없던 같은 클래스로 취급하는 것이다. 닷넷은 다른 클래스로 취급한다.
결국 1.4 때 제네릭 없었던 클래스처럼 써도 무방할 정도인 것이고, 성능상 이점이 없으며, 그저 자바의 방향인 Strong Typed에 부합될 뿐이었다.
그리고 자바 1.8부터 도입된 람다식의 경우 이미 익명 클래스로 충분히 소화해낼 수 있기 때문에 간소화된 것만 빼면 하위 호환성에 큰 지장은 없다는 것이다.
하지만 직쏘는 그 이전 버전에 대체할 수 있는 환경이 아예 없다. 하위 호환성을 유지하려면 직쏘를 아예 쓰지 말아야 할 정도이다.
여태까지 하위 호환성을 최대한 생각했기에 개발자 입장에서는 큰 난관이 아닐 수 없다.
만약 버전을 올리고 개발했을 때, 문제가 생기면 해당 버전에 맞게 개발하고 컴파일 하면 됐다. 하지만 직쏘는 그게 안된다. 다 버려야 한다는 것이다.
그래서 자바 API를 닷넷에 쓰게 해주는 IKVM.NET 개발자는 모듈 시스템의 복잡도 때문에 더 이상 새 자바에 대응하지 않겠다는 공식 입장을 피력할 정도.
그리고 이 불안은 현재진행형이며, 정식 버전이 나오면 1.9를 바라볼 사람이 얼마나 될 지 의문이다.

자, 자바 개발자들이여, 이제 게임을 시작하지. 직쏘.

composite / 2017년 7월 5일 / Piss Development / 0 Comments

프로젝트 직쏘는 희망이 없다?

자바 9가 올해 7월 말 즈음 출시될 가운데 안타까운 소식이 들어왔다.

바로 JCP(Java Commnity Program) 총괄 리뷰에서 프로젝트 직쏘가 많은 반대에 부딪혀 빛을 못볼 위기에 처해 있다는 것이다.
DZone – Java Zone – EC Rejects Jigsaw

직쏘 프로젝트 참여자들은 30일 내에 보완 후 다시 리뷰를 진행해야 하는데,
다음 리뷰에서 실패하면 직쏘는 자바 9에서도 볼 수 없는 시스템이 될 것이다.

프로젝트 직쏘는 익히 알다시피 하여 짤막하게 소개한다. SI/SM 개발자들은 관심없이 1.6 이하 버전이나 쳐 만지겠지만.
현재 자바는 JVM 내에 돌아가는데, JVM이 자바에 있는 핵심 라이브러리 외에도 사용자가 추가한 라이브러리 모두 안고 가기 때문에
성능 문제는 여러 방면에서 제기된 문제가 있었으며, 이로 인해 특히 임베디드 장비에서 자바를 꺼려하는 이유이기도 하다.
그래서 안드로이드 자바는 아예 달빅 등으로 자바를 재구성 해서 안드로이드 전용 자바 환경을 만들었던 이유이기도 하다.
물론 안드도 성능 이슈는 피할 수 없긴 매한가지지만.

어쨌든, 이걸 해결하고자 모듈 시스템으로 필요한 라이브러만 쓰고, 쓰는 곳으로만 최적화하고, 이식 가능(Portable)한 프로그램을 만들기 위해
꾸려진 프로젝트가 JSR 376q번 프로젝트 직쏘다.

하지만 프로젝트 직쏘는 당연하겠지만 많은 반대에 부딪혔다. 특히 이번 반대의 가장 주역이 바로 상업용 리눅스로 유명한 대기업 “레드햇”인데,
프로젝트 직쏘에 대한 문제점을 34페이지를 썼다.

DZone에서 언급한 주요 내용은 아래와 같다.

The patterns introduced within Jigsaw are (in some cases) going to be extremely difficult to fix even in a later release, and will create backwards- and forwards-compatibility problems that will be very difficult to unwind

직쏘에서 제시한 패턴은 이후 자바 출시를 할 때 여러 면에서 거대한 장벽을 유발한다. 그리고 상위, 하위 호환성 측면에서도 난관이 많을 것으로 보인다.

Due to lack of one to one mapping of use cases (or sufficient interoperability capabilities) and other restrictions, we are concerned that there will likely be two worlds of Java software development: the Jigsaw world, and the “everything else” world (Java SE Classloaders, OSGi, JBoss Modules, Java EE, etc)

일대일 연계에 대한 문제와 여러 제한 사항으로 인해 우린 자바 개발자들이 직쏘 세계와 현재 자바 세계(Java SE Classloaders, OSGi, JBoss Modules, Java EE, etc)를 두가지로 나눠 개발하는 광경을 볼 지도 모른다.

그렇다. 레드햇은 자바의 기본적인 목표인 “하나의 코드를 여러 플랫폼으로”에서 거리가 먼 직쏘에 거리를 둔 것이다.
이외 IBM, SAP 등 여러 거대 개발기업도 반대 의사를 표시했으며, 세계에서 가장 큰 자바 커뮤니티인 런던 자바 커뮤니티는 강한 반대 의사를 표시했다고 한다.
우리가 많이 쓰는 개발 툴 제작사 이클립스 재단도 반대 의사를 표시했다.

물론 찬성도 있다. 자바를 주도하는 오라클, V2COM, 후지쯔 등인데,
후찌즈는 “EC 회원들이 직쏘에 많은 집중을 하는 만큼 다음 투표에서 해결되길 바란다.” 라며 찬성 의사를 표시했다. 그렇다. 실질적인 반대 의사인 것인데 찬성한 것이다.
SouJava 라는 업체는 처음에 찬성을 하다 반대 의사를 표시했는데. 역시 사용자 접근성 결여를 이유로 반대 표시를 한 것이다.

결국 접근성 문제와 여러 제한 사항, 호환성 문제를 이유로 많은 커뮤니티와 업체에서 반발한 것이다.
우려한 대로 말이다.

닷넷 진영에서는 프로젝트 직쏘 때문에 다 갈아엎어야 하는 iKVM.NET 개발을 포기하기로 했고, 자바를 기반으로 한 스칼라나 코틀린에서는 대응이 안되어 있는 상황.
이렇게 준비가 되어 있지 않은데 우린 대체 무슨 희망으로 직쏘를 지지했던 것인가를 다시한 번 생각하게 한다.

내가 보건데 자바 9에서도 직쏘는 보기 힘들 것으로 보인다.
별 거 아닌 것처럼 보여도. 자바 2.0이면 모를까 자바 1.x 에 직쏘를 넣는다는 건 엄청난 변화이고, 기존 자바 개발자들이 한국 SI/SM 개발자처럼 정체된 자바 환경을 접해야 할 지도 모르기 때문이다.
직쏘를 적용하는 순간부터 하위 호환성을 포기해야 하고, 상위 호환성을 걱정해야 하며, 그리고 자바 직쏘에 대한 또다른 지식과 구조를 개발자들이 알아야 하니, 기존 개발자들에게는 큰 난관이 아니 예상할 수 있겠는가.

composite / 2017년 5월 18일 / Piss Development, Waldo Translation / 0 Comments

윈도우 10 ISO 다운받기 (물론 합법)

최근들어 윈도우 10 ISO가 필요하게 되어 링크를 들러봤더니…

ISO 다운로드 선택 박스는 안뜨고 그저 도구 다운로드만 뜰 것이다.
그렇다. 윈도우 운영체제는 막힌 거다.

하지만 불가능하지는 않다. OS를 속이고 들어가면 되는데,
그냥 user agent 를 바꿔주는 확장을 깔면 해결된다.
크롬이나 불여우는 암거나 확장 깔고 OS 바꿔치기 하고 접속하면 되며, (맥~)
IE나 Edge는 확장은 없고 대신 F12 개발자 도구를 통해 바꿀 수 있다.

내가 쓰는 속이는 user agent 문자열 예제는 아래와 같다.
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

그러하다. 그리고 접속하면 ISO 다운받을 운영체제 선택박스 화면이 뜰 것이다.
그 뭐냐… 누군가가 선택박스 핵 걸어서 하위 버전 다운받는 것도 통하는 지는 안해봤다. 난 그저 윈도 10만 있으면 되니까.

불법은 아니고 합법이다. 어자피 제품 키는 없다. 정당한 제품 키 없이 쓰면 불법이고, 쓰면 합법인 거다.

composite / 2017년 3월 16일 / Piss Development / 0 Comments

프론트엔드에게 setTimeout 함수는 단순한 함수가 아니다!!!

일단, 지금 내가 좆같이 외부망 막힌 프론트엔드 개발짓거리 하고 있는 관계로 블로그질을 잘 못하겠지만,
이런 일을 자주 겪어 존나 머리가 쌓이기만 하기에 내 메모리 릴리즈 하는 개념으로 글 씨지르겠다.

프론트엔드 개발하다 보면 이런 경우를 겪는다. 특히 화면 변경할때 말이지.
화면을 변경하다 보면 갑자기 스크립트 오류가 나거나, 원하는 화면이 안나올 때가 있다.
이것으로 머리 싸매다가, 안되겠다. 지연시켜서 뿌려야겠다는 생각으로 setTimeout 함수를 쓰면
원하는 화면변경이 이루어진다. 이상할 정도로.
더 웃긴 현싱은, 타임아웃 주기를 0으로 해도 잘된다는 것이다. 이게 대체 어떻게 된 거지?

먼저, 자바스크립트는 싱글 쓰레드라는 것. 아주 질리도록 들었을 것이다. 비동기도.

하지만 잊지 말아야 할 점은 이 싱글 쓰레드가 하필 화면을 표현하는 렌더링 시점에도 블로킹 현상이 일어나는 점을 간과해서는 안된다.
즉, 스크립트 실행중인 시점에 DOM에 어떤 변화가 찾아올 지 우린 예상할 수 없다는 것이다. 왜냐? 싱글 쓰레드로 하나씩만 진행하기 때문에.
그럼 왜 setTimeout 함수는 회피할 수 있을까? 간단하다.
위 그림을 보면 setTimeout 블록으로 등록된 timer 스레드는 그저 다음 실행 시점으로 예약만 하고 이 스레드에 도달해야 실행되기 때문이다.
그렇다면 왜 setTimeout은 분명 1초인데 1초 빨리 실행하거나 1초보다 늦게 실행하기도 하는가?
먼저, node.js 개발해본 시람은 알겠지만 거기는 setTimeout 함수는 없고 process.nextTick 함수를 사용한다. 그렇다.
원리는 비슷하다. 빠르게 tick 하면서 스크립트가 실행된다. 게임이나 영상으로 치자면 프레임 단위에 무슨 이벤트가 일어난다는 것이다.
보통 1 tick 하면 1/1백만 초다. 백만분의 1초. 하지만 setTimeout은 아무리 최소값이라도 4/1000초.
클라이언트 스크립트에서 tick 단위를 허용기엔 가뜩이나 렌더링이 스레드 예약하고 블록거는데 무슨 일이 일어날 지 검증이 안 된 상황.
자, 일단 여김가지 갔으면 이제 setTimeout 함수로 예약한 함수 루틴은 나머지 구문을 실행한 후 실행하는 것을 알 수 있다.
즉, 렌더링에 시간을 벌어주어 렌더링 후 화면 변경에 대한 정보를 불러오고 쓰는 데 정확도를 높일 수 있는 그런 트릭인 것이다.
그런 고로 화면을 변경할 때, 특히 DOM 데이터를 주고받거나 다룰 때 setTimeout 함수는 DOM 렌더링 시간을 벌어주어 원하는 사용자 처리를 도와주는 프론트엔드에게 고마운 함수인 것이다. 감사하며 쓰도록 하자.

참고: Why is setTimeout(fn, 0) sometimes useful?

composite / 2017년 1월 9일 / Piss Development / 1 Comment

C# 7.0의 새로운 기능

이번 .NET Core 출시 이례로 C# ~6.0 기반의 모든 것들을 이제 .NET Core에 집중할 예정이라고 한다.
그리고, Roslyn 컴파일러 덕분에 C# 6.0 문법이 C# 5.0 인 닷넷 환경에서도 지원할 수 있도록 어셈블리를 제공하고 있으니,
아마 구버전 문법 환경에서도 사용할 수 있도록 지원되지 않을까 예측을 할려다 말았다. 굳이…

자, 본문으로 들어가서, 차기 닷넷코어에 탑재될 C# 7.0 언어의 새로운 기능을 Araboza.

Tuple

자바에서 걍 값만 쳐넣는 클래스를 POJO라고 한다. 그리고 닷넷에서는 POCO라고 한다.
대충 이런 식이다.

class PropertyBag
{
    public int Id {get; set;}
    public string Name {get; set;}
}
var myObj = new PropertyBag { Id = 1, Name = "test};

C# 3.0부터 지원해서 여러분들도 자주 써왔을 것이다.
닷넷에서는 이런 놈들을 지칭하는 용어가 튜플이다.

out 인자

잘 쓰지는 않지만 out 인자를 통해 메소드에서 여러 인자를 받아낼 수 있다.

public void GetLatLng(string address, out double lat, out double lng) { ... }

double lat, lng;
GetLatLng(myValues, out lat, out lng);
Console.WriteLine($"Lat: {lat}, Long: {lng}"); 

하지만 가장 큰 문제점이 있다면 바로 async 메소드에 쓸 수가 없다는 것.
그리고 코딩하기 참 불편하다. 패턴 참 개같아 보인다.

Tuple<> 클래스

C# 3.0부터 Tuple 이라는 클래스가 생겼는데, POCO 만들기 귀찮을 때 유용하기도 하다.

public Tuple<int, int> GetLatLng(string address) { ... }

var latLng = GetLatLng("some address");
Console.WriteLine($"Lat: {latLng.Item1}, Long: {latLng.Item2}");

근데… 알다시피 프로퍼티 이름 참… 맘대로 못짓는다. 어쩔 수 없다. 제공 클래스의 한계니까.

POCO

가장 많이 쓰는 패턴이다. Value Object 답게 읽거나 쓸 수 있다.

struct LatLng{ public double Lat; public double Lng;}
public LatLng GetLatLng(string address) { ... }

var ll= GetLatLng("some address");
Console.WriteLine($"Lat: {ll.Lat}, Long: {ll.Lng}"); 

근데 코딩 길이 참 길다. 원래 그렇지 뭐.

Tuple 반환 타입

자, 이제 C# 7.0의 튜플 형식에 주목해보자.
먼저, 2개 이상의 원하는 이름으로 반환 타입을 만들 수 있다.

public (string FirstName, string LastName) GetNames(string! fullName) //형식 뒤에 느낌표가 뭔지는 다음에 설명.
{
  string[] names = fullName.Split(" ", 2);
  return (names[0], names[1]);
}

var name = GetNames("john doe"); 
Console.WriteLine($"Name: {name.FirstName} {name.LastName}");

자, 이렇게 하면 out 변수와 같은 효과를 내면서, 심지어 async 메소드에 대응이 가능하다고 한다. 오예.
원리야 Tuple에 네 변수를 대입하는 방식이니 편하게 써주자.

당연히 인라인도 가능하다.

var ll = new (double lat, double lng) { lat = 0, lng = 0 };

이렇게 하면 li 변수에 당신이 정한 tuple 멤버를 속성으로 사용하여 다룰 수 있다.

레코드 형식

별 거 없다. POCO 클래스 작성하기 간결해지는 효과가 있다. 예를 들면,

class MyPoint
{
    int _x;
    int _y;
    int _z;
    MyPoint(int x, int y, int z){
        this._x = x;
        this._y = y;
        this._z = z;
    }
    public int X {get{ return this._x;}}
    public int Y {get{ return this._y;}}
    public int Z {get{ return this._z;}}
}

C# 7.0부터 아래처럼 짜면 위와 비슷한 클래스가 만들어진다.

class Point(int X, int Y, int Z);

이 때, 알아야 할 점이 있다.

  • 레코드 형식도 상속 “된다”.
  • 레코드 형식은 IEquatable<> 인터페이스에 상속된다. 이 덕분에 같거나 틀린 연산자로 비교 시 레퍼런스 비교가 아닌 멤버 값 비교를 통해 비교가 가능하다.
  • ToString() 메소드는 자동으로 오버라이드 되어 레코드 각 멤버와 값을 나열하게 된다.

패턴 매칭

C# 7.0부터 나온 재밌는 기능이다. 이 기능 때문에 switch 문이 재밌어질 것이다.
먼저 예제를 보자.

class Geometry();
class Triangle(int Width, int Height, int Base) : Geometry;
class Rectangle(int Width, int Height) : Geometry;
class Square(int width) : Geometry;

Geometry g = new Square(5);
switch (g)
{
    case Triangle(int Width, int Height, int Base):
        WriteLine($"{Width} {Height} {Base}");
        break;
    case Rectangle(int Width, int Height):
        WriteLine($"{Width} {Height}");
        break;
    case Square(int Width):
        WriteLine($"{Width}");
        break;
    default:
        WriteLine("<other>");
        break;
}

간단히 얘기하자면, 첫번째로 얘기한 튜플 형식의 산출물인 셈인데,
switch 문을 통해 각 상속 된 클래스와 멤버가 맞는지 비교하여 해당될 때 문을 실행할 수 있다.
예를 들면, 사용자가 있고, 사용자가 개인 사용자, 단체 사용자가 있다고 할 때,
switch 문으로 개인 사용자와 단체 사용자에 따라 다른 형식으로 문을 작성한다고 보면 될 것이다.

Non-nullable 참조 형식

참조 형식은 class로 시작하는 것들이다. 자바야 내장 값 형식 말고 죄다 참조이니 뭐.
어쨌든, 참조 형식은 기본적으로 null 이 가능하다. 이제 불가능하도록 설정할 수 있다.
이런 형식을 제안한 사람이 있는데 이 링크로 들어가면 성지순례할 수 있다.무려 5년 전에 제안한 기능이다.

값(struct) 형식은 기본적으로 null 을 가질 수 없다. 반드시 기본값을 가지게 되어 있다.
하지만 Nullable<> 형식이 생겨 값 형식 뒤에 ? 만 붙이면 null을 가질 수 있다.

int a = 1; // 일반 값 형식
int? b = null; //null을 가질 수 잇는 값 형식

이 문법 덕에 DB나 타언어 연동 시 유연하게 대응이 가능할 것이다.
여기서 주의할 점은 null을 가질 수 있을 뿐 절대 참조 형식이 아니라는 점.

자, 이번엔 참조 형식이다. 참조 형식 중 대표적인 string 형식이 있는데,
non-null 처리 하려면 별도의 처리를 해야 한다. 하지만 이제 아래처럼 하면 된다.

string a = null;
string! b = null;

형식 뒤에 느낌표(!)를 붙이면 null이 불가능한 참조 변수를 만들 수 있다.
목적은 컴파일 타임에서 null이 불가능한 참조 변수를 만드는 데 목적이 있기 때문에
위처럼 코딩하면 컴파일 오류가 난다. 당연히 null 이 아닌 값이나 초기화를 해 줘야 한다.
string 뿐만 아니라 당신이 사용하는 클래스에도 당연히 적용 가능하다.

제네릭도 적용 가능하다.

//이렇게 하면 Dictionary 형식만 non-nullable.
Dictionary<string, List<MyClass>>! myDict;

//이런 식으로 원하는 형식 뒤에 non-nullable 참조를 정의할 수 있다.
Dictionary<string!, List<MyClass!>!>! myDict;

//제네릭과 제네렉 하위 모든 형식에 non-nullable 참조를 원할 경우 형식과 제네릭 사이에 ! 붙이면 된다.
Dictionary!<string, List<MyClass>> myDict;

지역 함수

클래스 멤버인 메소드와는 달리 블록 내에 잠깐 처리하고자 할 경우 사용하는 방법이 나같은 경우 람다식이다. 그렇게 가능하다.
하지만 이런 형식도 한계가 있는데,

  • 제네릭 사용 불가
  • refout 사용 불가능
  • 가변 인자 사용 불가

이를 간결하게 대비할 수 있는 지역 함수 기능을 제공한다.
람다식에서 못한 한계를 여기서 해결할 수 있다.

public int Calculate(int someInput)
{
    int Factorial(int i)
    {
        if (i <= 1)
            return 1;
        return i * Factorial(i - 1);
    }
    var input = someInput + ... // Other calcs

    return Factorial(input);
}

Factorial 이란 함수는 Calculate 메소드 문 내에서만 사용할 수 있다는 특징이 있다.
그 외에는 메소드처럼 정의하고 사용하면 된다.

불멸 형식(Immutable Types)

C#이나 자바나 대표적인 불멸 형식은 string 이다.
불멸 형식은 아래와 같은 장점이 있다.

  • 스레드로부터 안전하다.
  • 코드의 목적이 명확하다.
  • 병렬 처리가 쉽다.
  • 참조가 캐쉬되지 않으며 바뀌지도 않는다.

자, 사용법을 알아보자.
일반적인 POCO 클래스이다.

public class Point
{
    public Point(int x, int y)
    {
        x = x;
        Y = y;
    }

    public int X { get; }
    public int Y { get; }
}

초기화 시 좌표값을 받고 써먹는 클래스이다.
하지만 누군가 setter 넣고 중간에 값을 바꿔치기 하면 원치 않는 결과가 나올 텐데,
class 앞에 immutable 키워드만 넣으면 만사 OK.

public immutable class Point
{
    public Point(int x, int y)
    {
        x = x;
        Y = y;
    }

    public int X { get; }
    public int Y { get; }
}

이렇게 하면, string 처럼 중간에 값이 변조될 가능성이 없어지기 때문에, 인스턴스를 사용하는 동안 참조를 보장받을 수 있다.
즉, 메소드가 중간에 변조할 수 없다는 뜻이다. 처음부터 끝까지 초기화한 형식 그대로 갖다 쓸 수 있다는 것.
게다가 이런 형식에 대비해 유용한 문법이 생겼는데, 기존 인스턴스로부터 값을 바꿔 새 인스턴스로 만들 수 있는 문법이 생겼다.

var a = new Point(2, 5);
var b = a with {X = 1}; // {X = 1, Y = 5}

존나좋군.

언제 이런 문법으로 코딩 가능?

.NET 로드맵에 의하면, 올해 가을에 1.1이 나오는데, 안타깝게도 아직은 이 스펙을 못쓴다. 하지만 아직 이게 다가 아니라고 한다.
이 스펙을 사용할 수 있는 시기가 MSDN에 의하면, 차기 비주얼 스튜디오부터 이 스펙을 사용 가능하다고 알려져 있다. 문제는 비주얼 스튜디오가 언제 나올 지 모른다. 내년에 나오겠지 뭐.
Github Roslyn work list of features 에 소개된 기능 외에 고려하고 있는 기능을 볼 수 있으며, 심지어 참여도 가능하니,
관심이 있으면 주저 말고 영어로 의견을 내놓으면 된다.

근데… 자바는 아직도 1.x인데 2.x 버전이 지구 멸망하기 전까지 나올런지 모르겠다.
여담으로, WCF는 닷넷 코어에 채용이 됐지만, WPF는 계획이 없다고 한다. 그걸 기다리느니 차라리 Electron에 닷넷 붙이는 게 크로스 플랫폼에 효율적일 듯 하다. 아님 자마린으로 모바일 개발 하던가.

참고자료

미안. 죄다 영어다. 한글 자료는 아무리 찾아봐도 없더라. 이 글을 쓴 이유이기도 하다.

C# 7: New Features
New features in C# 7, part 2
Essential .NET – Designing C# 7

composite / 2016년 7월 19일 / Piss Development / 1 Comment

골때리는 자바스크립트는 쓰레기 강좌다.

… 라는 소리를 텀블러에서 들었다. 오예. 꽤 오래전 글이다.
뭐 인정한다. 골때리는 자바스크립트 연재 이유는 내가 잘나서도 아니고
내가 자스 고수라서 나의 수준높은 강좌 맛좀 봐라 이 미개한 코더들이 이런 느낌으로 작성하지도 않았다.

순전히 내가 자스를 배우면서 “아, 이건 정말 흥미롭다. 이런 건 공유해야지” 하면서 정리한 게 골때리는 자바스크립트다.
이 강좌를 먼저 PHPSCHOOL 에서 연재를 했는데,
그때는 내가 자바를 했는대도 불구하고 거기서 꽤 많은 커뮤니티 활동을 해서 거기다 올렸을 뿐이다.
그러니까, 편해서 올린 거라고. 물론 그 글 그대로 여기 블로그로 옮기긴 했지만.

좋다. 왜 오류투성이 강좌인지 따져보자고 하는 이들에게 해명의 시간을 가질 기회를 주기 바란다.

1. 전문용어의 부재

나는 작성 당시 스코프와 클로저, 호이스팅이라는 용어도 모른 채, “아 이러면 이렇게 되는구나” 하면서 하나의 이미지로 패턴을 배워가며 익혔다.
물론 지금은 이들의 용어와 목적, 용도를 알고는 있지만, 보면 아직도 모자른 게 많구나 싶기도 하다.
어쨌든, 감수 없이 팁을 연재했기 때문에 초보자들에게 전달이 잘 되는것으로 목표로 하였으나, 전문가들에게는 아무래도 전문용어 부재는
초보자들에게 오히려 혼란만 가중시킬 것으로 보일 것이다.

2. 고증 오류

그렇다. 내 강좌가 가장 많이 욕먹는 이유가 바로 이 고증 오류이다. “이렇게 돌려봤지만, 정작 이렇게 나오더라” 에서 출발해서 그런가,
아니면 테스트 케이스가 부족했는가, 여러 생각이 필요하지만, 팁에서 상당한 오류가 발견되고, 이를 수정하지 않았다.
물론 다른 팁을 통해 수정을 했지만, 역시 이미 엎질러진 물을 보고 손가락질 하는 건 어쩔 수 없나보다.
물론 수정하지 않은 오류가 있을 것이다. 근데 이미 다들 교정해 줬으니… 내가 낄 틈이 없다.

3. 선동

또한가지 재밌는 의견도 나왔는데, 바로 하나의 패턴만을 추구하도록 선동한다는 의견이었다. 여기서부터 난해해지기 시작한다.
사실 이건 “문과”적으로 따지면 한도끝도 없는 해명이 될 것이다. 왜냐면 기본적으로 내가 하는 패턴을 강요하지 않았기 때문에.
물론 몇몇 팁 중에 “그냥 따라해” 라던가 “걍 내가 하는 대로 해” 라는 문구가 들어간 강좌도 있지만,
그건 “웹 표준”에 근거하기 때문인데 그 강좌는 골때리는 자바스크립트 강좌와 무관한 강좌다.
어쨌든, 선동이라면… 이건 분명 오해다. 2메가 오해처럼 들릴 지 모르겠지만 나에게 이건 상당히 엉뚱하게 받아들일 수밖에 없다.
내 패턴에 예제를 들었을 뿐이지, 내가 뭘 알고 내 패턴을 요구하는지, 게다가 그런 문구를 적은 적도 없고, 의도하지도 않았다.

마치며

골때리는 자바스크립트는 오래된 강좌다. 그리고 초보자를 위한 강좌다. 자바스크립트 겪으면서 이건 왜이러지 하는 부분을 긁어주려 만든 강좌였다.
지금 보면 ECMA 2016도 나오는 판에 이제 점점 무쓸모 강좌가 됐는데, 제작년에 오류 투성이라는 의견에 대해 2년만에 이를 해명하다니…
나란 놈 참 한심한 놈이다. ㅋㅋ…

composite / 2016년 7월 13일 / Dog's bullshit, Piss Development / 2 Comments

뛰어난 개발자를 찾는가? 오픈소스 개발자가 있다.

비개발자나 개발 경험이 있는 인사들이 착각하는 게 있다.
내가 여러 클라 만나 개발하면서 제일 답답하고 일하기 싫은 유형 중 하나인데,
바로 오픈소스 개발자를 보안에 안좋은 개발자로 본다는 것이다.
그들이 주장하는 이유는 이러하다.

오픈소스 개발자는 뭐든 오픈하기 때문에 우리 회사의 민감한 산출물도 공개할 것이다.

하지만 증거도, 물증도 없는 추측성 개소리에 불과하다.
특히 그렇다가 아니고 그럴 것이다그렇다더라 로 끝나는 게 그들이 주장하는 이유의 특징이다.

좋아. 그럼 오픈소스를 많이 공개하는 다음카카오나 쿠팡, 네이버 등에게 한번 먼저 물어보고 와라.
만약 저 이유가 사실이라면, 나는 이미 개발 일 못했을 테니까. 집에서 밤이나 까고 앉아있겠지.

자, 이제 주목.
소프트웨어는 자산인가? 그렇다. 그렇다면 소스코드도 자산인가? 당연하다.
그렇다면 이런 자산을 보호할 줄 아는 개발자를 찾는가? 그렇다면 오픈소스 경험이 있는 개발자를 추천한다.
추천하는 이유는 이렇다.

개발에 있어서 공과 사를 구분하는 능력이 뛰어나다.

그들은 아무리 자기가 만든 산출물이라도, 그 내용이 회사에 중요한 정보가 있는지, 없는지 파악할 수 있다.
물론 처음에는 이를 구분할 수 있도록 선배나 상사가 도와주지만, 자신의 능력을 뽐내려면, 보안 문제도 피할 수 없다.
하나의 사례로, 개발자라면 천국으로 유명한 회사, 제니퍼가 있다.
제니퍼는 로깅분석 솔루션을 정부에 납품하고 세계를 넘나들 정도로 기술경쟁력이 뛰어난 회사로 알려져 있다.
그들은 자체 솔루션인 제니퍼의 파기 버전을 만들면서, 그들이 만든 UI 컴포넌트를 아예 무료로 공개했다.
아니, 대체 그들은 아무리 UI 컴포넌트라도 그들의 자산일텐데 개발자가 미친거 아니냐고 생각할 텐데, 만약 그랬으면 위에서 짤랐지.
제니퍼의 핵심 기술은 따로 있다. 당연히 미치지 않고서야 공개하지 않는 건 당연한 이치.
또한, UI 컴포넌트 자체에는 회사의 보안 내용이 없는 것으로 판단했을 것이다. 그리고 이들의 소스를 공개해 버렸다.
그리고 공개하면서 사용자들의 참여를 기다린다, 개선의 여지를 회사 뿐 만 아니라 사용자에게도 기회를 부여하려 회사의 솔루션을 강화하는 취지이기도 하다.
이처럼 비즈니스적 이득이 있는 전략인 것이다. 누가 주체가 되어 오픈했는지는 내가 저기 근무 안해봐서 모르겠지만,
개발자가 개발하고 임직원들 간의 의견 수렴을 통해 충분히 공개해도 무방하기에 오픈한 것이다.
이게 주장하는 바와 다르다고 생각한다면, 당신은 여태까지 오픈소스 개발자를 보안에 안좋은 개발자로 착각해서 그렇다.
이를 경험한 개발자는, 회사에서 자신의 능력을 보여줄 때 필요한 것과 해선 안되는 것의 차이를 잘 안다.
오픈소스는 그저 개발자들의 취미생활이 아니라는 것이다. 그렇기에, 이를 경험한 개발자는 공과 사가를 구분하는 능력이 있다.
굳이 제니퍼 사례에서 제니퍼가 공개하지 말아야 할 것이 있다면, 바로 UI 컴포넌트를 어떻게 제니퍼 솔루션에 활용했냐일 것이다.

오픈소스와 상용 솔루션 사이의 좋은 조언자이다.

만약 회사 솔루션이나 제품을 만들 때, 무엇을 활용하여 생산성을 극대화 하느냐에 가장 고민이 많이 쏠려 있을 것이다.
오픈소스와 상용 솔루션, 이 둘을 잘 알고 활용한다면, 개발 생산성에 날개를 달아줄 것이다.

  • 오픈소스
    • 장점: 일부 AGPL 및 GPL 소스를 제외하면 무료로 자유롭게 사용 가능하고, 확장이 필요할 경우 수정하여 해결 가능하다.
    • 단점: 일부 소스는 사후관리를 지원하지 않으며, 일부 검증된 소스나 업체 외에는 안정성을 보장받기 힘들고, 문제 발생 시 알아서 소스를 뜯어 문제를 해결해야 할 수 있다.
  • 상용
    • 장점: 해당 개발 업체를 통해 안정성을 보장받을 수 있고, 검증되어 안정된 제품이나 솔루션 개발이 가능하다.
    • 단점: 비용이 발생하며, 해당 솔루션에 한계 발생 시 대응할 방법이 없다. (필요한 기능이 지원이 안 될 수 있다.)

오픈소스 개발자가 이를 잘 구분하는 이유는 간단하다. 자신이 다른 오픈소스를 경험하면서 사용 가능한지 미리 알고 있거나, 아니면 알 수 있도록 도와주기 때문이다.
예를 들면, UI 컴포넌트가 필요할 때, 오픈소스도 있고 상용도 있다. 만약 해당 소스가 특정 검증 기업의 지원을 받거나, 많은 커뮤니티가 활성화되어 빠른 검증이 가능하다면 주저없이 오픈소스를 선택하여 비용 절약에 도움을 줄 수 있고, 아니면 미션 크리티컬에 대응 가능성이 불투명한 경우 가능한 비용을 들여서라도 안정된 상용 솔루션을 제안할 수 있다.
만약 비용 한계가 발생하여 오픈소스를 사용해야 하는 상황이 발생 시, 적절한 용도의 오픈소스를 찾도록 도와줄 것이고,
비용이 넉넉하여 상용 써도 가능한 상황이라면, 무작정 한계 가능성이 있는 상용을 사용하는 것보다 더 나은 오픈소스를 찾아 비용 조절을 할 수 있도록 제안할 수 있다.
명심하라. 정답은 없다. 최종 결정은 결정권자가 내려야 한다. 그리고 오픈소스 개발자라고 모든 오픈소스를 섭렵할 수 있는 건 아니다.
오픈소스 양은 너무나 방대하고, 같은 기능의 오픈소스가 수십 수백 많으면 수천개가 있으며, 이 중에 적당한 솔루션을 찾는 일은 엄청 버거운 일이다.
오픈소스 개발자는 이런 상황에 숙련된 인물이지 만능은 아니기 때문에 당신도 잘 고려해야 한다는 점 잊지 말길 바란다.

자, 이 외에도 나열하고자 하는 이유는 많지만, 시간 관계상 여기까지 적겠다.
인터넷 전문기업은 오픈소스 경험자를 선호한다. 내가 말하지 않는 잠재능력과 상황판단 능력은 오픈소스에 참여한 적 없는 개발자보다는 월등히 뛰어남을 알고 있기 때문이다.
물론 실수로 개발자가 보안에 민감한 자료까지 오픈하는 경우는 있을 수 있다. 드물지만. 그 개발자를 문책하기 전에 먼저 조치를 하면 된다. 최대한 빨리.
만약 그런 개발자가 있다면, 상황에 따라 알아서 회사 방침이나 사칙에 따라 판단해라. 거기까진 내가 뭐라 할 수 없다.

개발자 여러분들도 오픈소스를 많이 경험해야 한다. 오픈소스는 그저 무료로 활용하는 도구에 불과하지 않는다. 오픈소스 개발자는 그걸 안다.
그런 상황을 인지하고 숙달하며, 회사에 필요한 기술과 솔루션을 제안받을 때, 이 능력이 빛을 발하기 때문이다.

결정적으로, 길안내를 하는 표지판을 만든다고 할 때, 오픈소스는 표지판을 만드는 방법을 공개할 뿐, 표지판 자체가 아니라는 점 명심하라.

composite / 2016년 7월 7일 / Dog's bullshit, Piss Development / 0 Comments

.NET Core RC2 to RTM 마이그레이션

존나 쉽다. 걍 날 따라해라. 공통사항이다.

project.json 파일 아래 부분 수정

{ //...
    "Microsoft.NETCore.App": "1.0.0"
}

위 부분을 아래처럼 수정.

{ //...
    "Microsoft.NETCore.App": {
        "version": "1.0.0",
        "type": "platform"
    },
}

(만약 위처럼 안써있는 사용자 한정.)

그리고 다시 project.json 에서 모든 패키지 버전을 1.0.0-rc2-final 에서 1.0.0 로 수정.
대상: Microsoft.AspNetCore.*Microsoft.Extensions.* 여튼 저런 식으로 써있는 패키지 다.

비주얼 스튜디오 2015 사용자라면 닥치고 아래 절차에 따르면 된다.

  • Update 3 로 업데이트.
  • Tools Preview 2 설치. (뻘짓만 안하면 이전버전 언인스톨 안해도 됨)
  • .NET Core RC2 프로젝트 연다.
  • 프로젝트 컨텍스트 메뉴에서 Nuget 패키지 관리… 클릭.
  • 업데이트 탭 클릭.
  • 닥치고 모두 체크하고 업데이트 버튼 클릭.
  • 안심하고 화장실 갔다와.

끗. 이제 dotnet run 치고 ENTER 치면 언제 한듯 안한듯 깔끔하게 앱이 실행될 것이다.

composite / 2016년 6월 28일 / Piss Development / 0 Comments

1 2 3 6