728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형

'Build' 카테고리의 다른 글

Objective-C CMake file (Executable file)  (0) 2024.11.09
728x90
반응형
728x90
반응형
728x90
반응형

출처: https://okky.kr/article/490213

#490213  Tips & 강좌

Java 유료 논쟁, Oracle JDK와 OpenJDK의 차이 정리


안녕하세요.
최근 Oracle JDK의 유료화 논란으로 제 블로그에 정리했던 글을 가져왔습니다. 출처만 남겨주시면 자유롭게 퍼가셔도 됩니다.

http://jsonobject.tistory.com/395  (지단로보트의 블로그)


Oracle JDK와 OpenJDK

  • Java 애플리케이션을 실행하기 위해서는 JVM이 필요하고 컴파일하기 위해서는 JDK가 필요하다. 일반적으로 JDK를 설치하면 JVM(Hotspot이라고도 표현, Java 기술의 핵심)도 함께 설치된다.


  • JDK는 2개 버전으로 나뉜다. 하나는 폐쇄적인 상업 코드 기반의 Oracle JDK이고 하나는 오픈 소스 기반의 OpenJDK이다.


  • 둘 간의 큰 차이라면 Oracle JDK는 OpenJDK에는 없는 재산권이 걸린 플러그인을 제공한다. 해당 플러그인은 Oracle이 재산권을 보유하고 있다. (보다 정확히 설명하면 Oracle이 인수하여 없어진 Sun Microsystems 시절의 유산이다.) [관련 링크] 


  • Oracle JDK에 존재하고 OpenJDK에는 없는 대표적 기능으로 글꼴 라이브러리와 Java Web Start가 있다. 사용자의 웹 브라우저에서 자바 애플릿을 실행하려면 필요한 기능이다. 서버 애플리케이션 개발에는 쓰이지 않는 기능들이다.


  • 제공되는 기능적 차이 외에 Java 6 시대에는 분명히 OpenJDK가 Oracle JDK보다 성능이나 안정성이 크게 떨어졌다. 하지만 오늘날에는 Oracle JDK만이 제공하는 일부 라이브러리를 제외하고는 차이가 없다. [관련 링크] 

Oracle JDK는 무료인가?

  • Java의 무료 논쟁은 2011년 오라클이 소유권을 가지면서 시작되었다. 일단 명확히 해야할 점은 Java라는 프로그래밍 언어 자체는 GPL 라이센스로 무료이다. [관련 링크]  그렇지 않다면 오늘날 Java가 시장지배적인 언어가 되지 못했을 것이다. 중요한 부분은 Java로 작성한 프로그램을 컴파일(JDK)하고 실행(JVM)시키는 데 있다.


  • JDK와 JVM을 제공하는 OpenJDK은 GPL v2 with the Classpath Exception 라이센스로 무료이다.


  • 문제는 Oracle JDK이다. 결론부터 이야기하면 Oracle JDK는 사용 목적에 따라 무료일수도 유료일수도 있다. 먼저 Oracle JDK(Java SE)의 구성 요소를 살펴보면 아래와 같다.

1. JDK
2. JRE(JVM)
3. JavaFX SDK
4. JavaFX Runtime
5. JRockit JDK
  • Oracle JDK는 BCL(Oracle Binary Code License) 라이센스로 위 기능을 일반적인 목적의 컴퓨팅(General Purpose Computing)에만 사용시 무료라고 밝히고 있다. [관련 링크]  일반적인 목적의 컴퓨팅이란 무엇일까? 오라클은 데스크탑, 노트북, 스마트폰, 태플릿 등에서의 사용이 이에 해당한다고 설명하고 있다. 즉, 개발환경에서는 사용에 있어 아무 문제가 없다.


  • 일반적이지 않은 목적의 컴퓨팅(Non-General Purpose Computing)은 별도의 라이센스비를 지불해야 하는 유료 과금 대상이 된다. 오라클은 특정 기능 만을 위해 작동하는 시스템 및 솔루션에서의 사용이 이에 해당한다고 설명하고 있다. 이 부분의 애매한 표현 때문에 대부분의 상업 프로젝트를 진행하는 회사들은 OpenJDK를 사용한다.

Oracle JDK의 유료 구독형 라이센스 전환

  • Oracle JDK 바이너리에 적용되던 BCL 라이센스가 2018년 7월 부로 Java SE Subscription라는 이름의 년 단위 유료 구독형 라이센스로 새롭게 개편되었다.
  • 새로운 라이센스는 서버 및 클라우드 인스턴스의 경우 프로세서 당 월 25달러를, 데스크탑의 경우 사용자 당 월 2.5달러를 요구한다. 대량구매 및 2년, 3년 장기 구독에 따른 할인이 제공된다.
  • 구독한 라이센스 기간이 종료되면 사용자는 사용 권리를 잃어버린다. 라이센스를 갱신하거나 다른 무료 OpenJDK 바이너리로 전환해야 한다. (GPL 라이센스 기반의 OpenJDK 소스 코드는 LTS 지원 없이 6개월마다 새로운 버전이 공개된다.)
  • 새로운 라이센스는 2018년 9월 출시 예정인 Oracle JDK 11 바이너리부터 적용된다. 또한, 오직 라이센스 구독자 만이 LTS 업데이트 지원을 받을 수 있다. (다음 LTS 지원 버전의 출시는 3년 뒤로 Oracle JDK 17이 된다.)
  • 기존 Oracle JDK 8 바이너리의 경우 2019년 1월 이후 업데이트부터 라이센스 구독을 요구한다.
  • 새로운 라이센스에서도 비상업적인 용도에 한해서는 이전과 같은 무료 사용이 가능하다.

OpenJDK는 운영 환경에 부적합한가?

  • 결론부터 이야기하면 TCK 인증을 받은 OpenJDK 기반의 빌드 버전을 사용하면 운영 환경에 아무런 문제가 없다.

  • Java SE 7부터 모든 JDK는 OpenJDK 레퍼런스 소스 코드를 기반으로 제작된다. (Jave SE 6 버전의 OpenJDK는 백포트 방식으로 구현되어 성능 저하 이슈가 존재한다.) OpenJDK는 자바 스펙을 명시한 JSR 336, JSR 337를 빠짐없이 완전히 구현한 구현체이다.

  • OpenJDK의 운영 주체는 오라클이다. 오라클 또한 OpenJDK를 기반으로 자사의 부가적인 기능을 추가한 Oracle JDK를 제작하여 배포한다.

  • 오라클이 아닌 서드파티 업체가 OpenJDK를 기반으로 공인된 JDK를 제작하여 배포하려면 오라클의 유료 라이센스인 OCTLA에 가입해야 한다. 현재 전세계에 19개 업체가 가입되어 있다. [관련 링크] 이 업체들이 OpenJDK 기반의 자체 빌드를 배포하려면 오라클의 엄격한 TCK 인증을 통과해야 한다. 수만가지의 테스트를 단 하나라도 통과하지 못하면 인증되지 않는다.

  • OpenJDK를 멀티 플랫폼 바이너리로 빌드하여 배포하는 대표적인 업체로는 Azul Systems가 있다. 개발 환경과 운영 환경 모두 Oracle JDK의 대안으로 좋은 평가를 받고 있다. [관련 링크] 

OpenJDK 구현체

  • OpenJDK의 명세는 JCP(오라클, IBM, SAP 등으로 구성)에 의해서 결정된다. OpenJDK는 결정된 스펙(Java SE 7: JSR 336, Java SE 8: JSR 337)을 구현한 레퍼런스 소스 코드이다. 많은 상업 JVM 벤더들이 이 OpenJDK 레퍼런스 소스 코드를 기반으로 각자의 JVM을 제작한다. 엄격한 테스트의 TCK인증을 통과하면 OpenJDK를 완벽히 준수하는 구현체로 인정된다. Oracle JDK 또한 Java SE 7부터 이 OpenJDK를 기반으로 앞서 설명한 추가 요소를 담아 배포한다. [관련 링크] 


  • 트위터는 OpenJDK를 자사에 맞게 튜닝한 Twitter-JDK 위에서 자사의 서비스를 운영한다. [관련 링크] 

  • Azul Systems(미국 소재의 Java Runtime 제작 전문 회사)는 Zulu라는 OpenJDK 기반 빌드에 부가 기능을 추가한 WindowsLinuxMac OS X 바이너리를 무료로 제공한다. 이 회사는 서버 부하에 최적화된 Zing이라는 JVM을 판매한다. 엔터프라이즈 시장에서 Oracle JDK의 대안으로는 현재 독보적 위치에 있다. 테스트에서 Oracle JDK보다 성능이 좋았다는 사례도 있다. [관련 링크]  실제로 고성능을 요구하는 Cassandra 노드들은 Zing 기반으로 운영된다. [관련 링크] 

참고 글


728x90
반응형
728x90
반응형
  • 혹시 도움이 되셨다면 공감 ❤️ 한번 눌러 주세요. 감사합니다.
728x90
반응형
728x90
반응형

재미있는 프로그램 소개합니다. 이름은 lolcat. LOL(인터넷 짤) 고양이.

터미널 결과값을 무지개 색으로 보여 줍니다.


https://github.com/busyloop/lolcat




설치방법

$ gem install lolcat 


728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형

 네이버 클라우드 ssh 접속이 안되서 문의하였더니, 이전에 식별된 것과 동일한 하이퍼바이저의 커널 버전 때문 있었음.


[문의] SSH 접속이 안됩니다 #2
답변 내용

안녕하세요.

네이버 클라우드 플랫폼입니다.


문의하신 내용에 대해 답변드립니다.


해당 서버는 상위 커널 업데이트로 인한 부팅 실패 상태가 되었고, 이전 커널 (3.10.0-693.17.1.el7.x86_64) 로 선택 후 부팅에 성공하였습니다.

현재 상태에서 서버 재부팅을 하게 되면 동일한 문제가 발생할 수 있으니, /boot/grub2/grub.cfg 경로에서 커널 부팅 순서를 적절하거나 아래 내용 참고하셔서 커널을 반드시 변경 후 이용 부탁드립니다.


* 아래 가이드 참고하셔서 3.10.0-693.17.1.el7.x86_64 커널로 부팅이 되도록 설정 부탁드립니다.


* 커널 업데이트에 따른 부팅 이슈는 아래 공지 페이지를 참고 바랍니다.

   - https://www.ncloud.com/support/notice/all/355


* 아래 커널 버전은 고객님 서버의 커널 버전과 다를 수 있으니 참고 부탁드립니다.


1. 현재 기본 커널 확인

# grub2-editenv list

saved_entry=CentOS Linux (3.10.0-327.22.2.el7.x86_64) 7 (Core)


2. 부팅 가능한 커널 리스트 확인

# grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2

CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core)

CentOS Linux (3.10.0-327.22.2.el7.x86_64) 7 (Core)

CentOS Linux (0-rescue-a6ca9f0e85a84962b41c23276050e81b) 7 (Core)


3. 기본 부팅 커널 설정

# grub2-set-default "CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core)"


4. 설정된 내용 확인

# grub2-editenv list

saved_entry=CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core)


5. 재부팅

# reboot


6. 변경된 커널 확인

# uname -a

Linux micro 3.10.0-514.2.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux


안내해드린 답변이 도움이 되셨길 바라며,

더 궁금한 사항이 있으신 경우 고객지원으로 문의 부탁드립니다.


감사합니다.

네이버 클라우드 플랫폼 드림.

 


728x90
반응형
728x90
반응형
728x90
반응형
728x90
반응형

[ huo 실행 파일 (binary files) x64 ]

huo-bin-win-x64.zip


- huo가 뭐죠?

 Huo는 제(James H Edwards)가 취미 프로젝트로 시작한 인터프리터 언어입니다.

 Huo의 원래 비전은 단순하고 매트릭스 수학과 병렬 처리와 같은 멋진 기본 기능이 있어야 했습니다. 

 인터프리터는 작고 사용하기 쉽고 구문을 이해하기 쉽습니다. 

 Huo는 중국어로 "살아있는"또는 "불(火)"을 의미합니다. 발음하기가 꽤 어렵기 때문에 중국어를 모른다면 "후아"라고 말할 수 있습니다. 


- 빌드 환경

  MS Windows 10 64bit

  MSYS2 : MSYS_NT-10.0 DESKTOP-AGOCCFS 2.10.0(0.325/5/3) 2018-02-09 15:25 x86_64 Msys

  gcc (g++) 7.3.0 

  

- 구동 방법 : huo.exe를 실행하세요. 예제를 인자로 주어도 됩니다.

 usage: huo [FILE | -c cmd | -h | --help]

 Arguments:

 -c cmd     program passed in as string

 FILE       program read in as file

 -h, --help print this help message and exit 

 

- huo 홈페이지  https://github.com/HuoLanguage/huo

- MIT License

728x90
반응형
728x90
반응형


헬로우 큐트 포 파이썬 (Hello Qt for Python)


원문 http://blog.qt.io/blog/2018/05/04/hello-qt-for-python/

번역 https://j2doll.github.io/Qt-for-Python-Docs-Kor/


첫 번째 Qt for Python의 기술 프리뷰 릴리스가 여기 있습니다!

그래서 파이썬 세계에 문을 여는 방법에 대한 간단한 예제를 제공하고자 합니다.

일단 QWidgets을 사용하여 Python용 Qt의 단순성을 보여주는 간단한 애플리케이션을 작성해 보겠습니다.


모든 스크립트의 구조는 다음과 같습니다:

일단 QApplication을 생성합니다.

그리고 나서 모든 QWidgets과 사용하려는 구조체를 포함합니다. (예> QLabel 등)

어플리케이션을 보여 주면서 QApplication를 시작합니다. 이런 아이디어를 하나로 합치면 다음과 같이됩니다.

# hello_world.py
from PySide2.QtWidgets import QApplication, QLabel
 
app = QApplication([])
label = QLabel("Hello Qt for Python!")
label.show()
app.exec_()


이를 실행하기 위해 간단한 python hello_world.py가 작업을 수행합니다.

이때 진짜 질문은 다음과 같습니다: Qt 클래스(class)의 메소드(method)에 액세스하는 방법은 무엇인가?

프로세스를 단순화하기 위해 Qt API를 유지합니다. 예를 들어, QLabel의 크기(size)를 지정하려면 C++에서 다음과 같이 됩니다.

QLabel *label = new QLabel();
label->setText("Hello World!");
label->resize(800, 600);

Python에서 Qt를 사용하는 방법은 다음과 같습니다:

label = QLabel()
label.setText("Hello World!")
label.resize(800, 600)

이제 C++와 동등하게 적용하는 방법을 알게 되었으므로, 보다 정교한 응용 프로그램을 작성할 수 있습니다.

import sys
import random
from PySide2.QtCore import Qt
from PySide2.QtWidgets import (QApplication, QWidget,
    QPushButton, QLabel, QVBoxLayout)
 
 
class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
 
        self.hello = ["Hallo welt!", "Ciao mondo!",
            "Hei maailma!", "Hola mundo!", "Hei verden!"]
 
        self.button = QPushButton("Click me!")
        self.text = QLabel("Hello World")
        self.text.setAlignment(Qt.AlignCenter)
 
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
 
        self.button.clicked.connect(self.magic)
 
    def magic(self):
        self.text.setText(random.choice(self.hello))
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.resize(800, 600)
    widget.show()
    sys.exit(app.exec_())

Qt 개발에 익숙하지 않다면, 특정 클래스를 확장하여 필요에 맞게 수정하는 것이 일반적입니다.

앞의 예제에서는 QWidget을 기본 클래스(base class)로 사용하고, QLabel과 QPushButton을 포함했습니다.


예제 응용 프로그램은 정말 간단합니다:

먼저 Hello World를 포함하는 목록을 다국어로 작성합니다.

그런 다음 QPushButton과 QLabel을 특정 정렬, 글꼴 및 크기로 초기화합니다.

그 다음, 우리는 객체를 포함하기 위해 QVBoxLayout을 생성하고 그것을 우리의 클래스에 할당합니다.

마지막으로 QPushButton의 clicked() 시그널(signal)을 magic이라는 메서드(method)에 연결합니다.

결과적으로 버튼을 누를 때마다 Hello World가 임의의 언어로 표시됩니다!


이 간단한 스크립트의 구조는 Qt for Python을 사용하는 대부분의 응용 프로그램의 기본이 될 것이므로, Qt for Python이 발표되자 마자 테스트해 보시기 바랍니다!

728x90
반응형
728x90
반응형
728x90
반응형

+ Recent posts