728x90
300x250

[GNU - C, C++] 리눅스(Linux) - 사진 압축 자동화 도구(g++, 쉘(Shell)) (2/2)

 

1부에 이어서 소개하고자 한다.

[GNU - C, C++] 리눅스(Linux) - 사진 압축 자동화 도구(g++, 쉘(Shell)) (1/2), 2021-04-11 21:23
https://yyman.tistory.com/1536

 

4. 소개

아래처럼 작성을 하였다.

 


5. 첨부(Attachment)

 

210411_linux_compress_image_tools.z01
10.00MB
210411_linux_compress_image_tools.z02
10.00MB
210411_linux_compress_image_tools.z03
10.00MB
210411_linux_compress_image_tools.zip
5.55MB

 

[GNU/GPL v3 License를 적용받는다.]

 


6. 맺음글(Conclusion)

Linux(우분투 데스크톱 20.04, 센토스(CentOS))에서 사진 압축을 자동화 도구 프로그램 작성에 대해서 g++ 프로그래밍(C++ Std)으로 소개하였다.

ImageMagicK 라이브러리를 활용하여 자동화 도구를 개발하였다.

 


* 참고자료(Reference)

1. 우분투(Ubuntu / Canonical Ltd), https://ubuntu.com, Accessed by 2021-04-11, Last Modified 2021-04-11.

-> GNU 라이센스를 적용받는다.

2. CentOS(CentOS), https://www.centos.org, Accessed by 2021-04-11, Last Modified 2021-04-11.

-> GNU 라이센스를 적용받는다.

3. ImageMagicK, https://imagemagick.org, Accessed by 2021-04-11, Last Modified 2021-04-11.

-> GNU/GPL v3 License 라이센스를 적용받는다.

4. LaunchPad, https://launchpad.net, Accessed by 2021-04-11, Last Modified 2021-04-11.

반응형
728x90
300x250

[GNU - C, C++] 리눅스(Linux) - 사진 압축 자동화 도구(g++, 쉘(Shell)) (1/2)

 

이번에 소개할 내용은 리눅스에서 g++ 프로그래밍으로 ImageMagicK을 활용하여 사진 압축 자동화 도구에 대해서 소개하고자 한다.

오전에 잠깐 오픈소스 번역 프로젝트(LxQt -> FeatherNotes)에 잠시 참여하였다.

관심을 가져도 될만하다.

This time, I will introduce a photo compression automation tool using ImageMagicK with g++ programming on Linux.

In the morning, I briefly participated in the open source translation project. 
It deserves attention.In the morning, 
I briefly participated in the open source translation project (LxQt -> FeatherNotes).

It deserves attention.

ibeon-e sogaehal naeyong-eun linugseueseo g++ peulogeulaeming-eulo ImageMagicKeul hwal-yonghayeo sajin abchug jadonghwa dogue daehaeseo sogaehagoja handa.

ojeon-e jamkkan opeunsoseu beon-yeog peulojegteu(LxQt -> FeatherNotes)e jamsi cham-yeohayeossda. gwansim-eul gajyeodo doelmanhada.

 

 


1. 안내사항

지구가 현재 많이 아프다고 한다. 꼭 읽어봤으면 한다.
It is said that the earth is very sick now. I hope you read it.

 


2. 소개

아래처럼 작업하였다.

 

 


3. 2부에서 만나요.

[GNU - C, C++] 리눅스(Linux) - 사진 압축 자동화 도구(g++, 쉘(Shell)) (2/2), 2021-04-11 21:43
https://yyman.tistory.com/1537
반응형
728x90
300x250

[C++(GTKmm)] Anjuta에서 GTKmm 시작하기

안주타에서 GTKmm을 사용하는 방법에 대해서 소개합니다.

 

Operation System(운영체제) Debian 9.9
개발 언어 gtkmm-3.0

 


1. 안주타로 GTKmm 헬로우 월드 실행하기

1-1. 안주타 실행하기

시작 메뉴에서 "개발"-> "안주타(Anjuta)"를 클릭하면 실행할 수 있습니다.

"Create a new Project"를 클릭합니다.

C++탭을 클릭하고 "GTKmm (단순)"을 클릭하고 "다음(N)"을 누릅니다.

Warning이라고 해서 mMissing packages: gtkmm-3.0.이 나옵니다.

시작 메뉴에서 "시스템 도구"->"터미널"을 클릭합니다.

터미널에 아래의 명령어를 입력해주도록 합니다.

# apt-get install gtkmm-3.0

 

 


1-2. 프로젝트 생성하기

터미널에서 설치를 완료 후 "Install Missing packages"를 클릭하면 아래의 창이 뜹니다. 기본 정보를 입력 후 "다음(N)"을 클릭해줍니다.

다음은 프로젝트 옵션입니다.

옵션을 설정 후 "다음(N)"을 클릭합니다.

"적용"을 클릭합니다.


1-3. 안주타에 내장되어 있는 디자이너

글래이드를 설치하면, 전문적인 사용자 인터페이스 디자이너를 사용할 수 있습니다.

 


1-4. 빌드하기 및 libtool-bin설치하기
빌드(B)에서 프로젝트 빌드(B)를 클릭합니다.

아래의 창이 뜨면, 실행(E)를 클릭합니다.

libtool이 설치되지 않았다고 오류메시지가 출력되는 것을 확인할 수 있습니다.

터미널 창에 아래의 명령어를 입력합니다.

# apt-get install libtool-bin


1-5. 빌드하고 실행하기

빌드(B)를 클릭하고, Compile (main.cc)을 클릭합니다.

Configure Project 창이 뜹니다.
환경 설정 등을 확인 후 "실행(E)"를 클릭합니다.

실행(R) 메뉴에서 실행을 클릭합니다.

 


2. GTKmm에 대해서 관심있는 분들을 위한 팁&Tip


아래의 사이트에 접속하면 더 많은 정보를 얻을 수 있습니다.
 * https://developer.gnome.org/gtk3/stable/GtkEntry.html
 * https://developer.gnome.org/gnome-devel-demos/3.32/guitar-tuner.cpp.html.ko

 * https://developer.gnome.org/gnome-devel-demos/3.32/index.html.ko

 

기타 조율기

지스트리머는 그놈 멀티미디어 프레임워크입니다. 동영상 오디오 웹캠 스트림 같은걸 재생, 녹음/녹화, 처리할 때 지스트리머를 사용할 수 있습니다. 여기서는 단일 주파수 음색을 만들 때 사용하겠습니다. GStreamermm은 여기서 우리가 사용할 지스트리머 C++ 바인딩입니다. 개념적으로 지스트리머 동작은 다음과 같습니다. (우선) source에서 sink(출력)으로 내보낼 수많은 처리 요소가 들어간 파이프라인을 만듭니다. source는 그림 파일, 동영상,

developer.gnome.org

 

GtkEntry: GTK+ 3 Reference Manual

GtkEntry GtkEntry — A single line text entry field Object Hierarchy GObject ╰── GInitiallyUnowned ╰── GtkWidget ╰── GtkEntry ├── GtkSearchEntry ╰── GtkSpinButton Includes #include Description The GtkEntry widget is a single line text entry widget. A fairly

developer.gnome.org

 

그놈 개발자 플랫폼 데모

이 안내서는 그림 보기, 날씨 프로그램 과 같은 다양한 코드 예제를 담고 있습니다. 다양한 맛보기 프로그램에 여러분이 따라해볼 수 있는 코드, 예제 동작 설명을 함께 넣었습니다. 그놈 개발자 플랫폼을 시작해볼 수 있는 멋진 수단입니다.

developer.gnome.org

 

반응형
728x90
300x250

[C, C++] double의 비교

 

float, double의 경우, 비교 자체가 소수 점이라는 것이 있어서 어렵습니다.

단순 비교를 해버리면 안되는 게 1.xxxxxxxx 의 경우, 1로 절삭 처리됩니다.

컴파일러가 멍청해서 그런 것도 있지만, 소수 점은 Science에선 중요한 거지만, 단순한 명령을 처리하는 컴퓨터 입장에선 엄밀한 것과 정확성을 보장해주는 자료형이 더 좋은 것입니다.

 

예를 들면, 스위치 On, Off와 같이 1, 0이 컴퓨터 입장에선 더 직관적이고 엄밀한 자료가 될 수 있습니다.

 

float, double형의 경우, IEEE 754 규약에 의해 부동소수점의 원칙을 기반으로 한 별도의 코딩을 통해 비교를 처리해야 합니다.

 


아래의 코드는 구글에 근무하는 brucedawson씨가 소개한 개념을 바탕으로 Ulps기반의 Double형 비교를 위한 코드를 DevMachine님이 개발한 코드입니다.

 

int CompareDoubleAbsoulteAndUlps(double x,
                                 double y,
                                 double absTolerance = (1.0e-8),
                                 int ulpsTolerance = 4)
{
    double diff = x - y;
    if (fabs(diff) <= absTolerance)
        return 0;

    __int64 nx = *((__int64*)&x);
    __int64 ny = *((__int64*)&y);

    if ((nx & 0x8000000000000000) != (ny & 0x8000000000000000))
        return (diff > 0) ? 1 : -1;

    __int64 ulpsDiff = nx - ny;
    if ((ulpsDiff >= 0 ? ulpsDiff : -ulpsDiff) <= ulpsTolerance)
        return 0;

    return (diff > 0) ? 1 : -1;
}

 


1. 참고자료(Reference)

  

1. Comparing floating point numbers - Bruce Dawson

2. Comparing Floating Point Numbers, 2012 Edition 

3. http://devmachine.blog.me/220119534107

 

정확히 이해하려면, 여기에 설명하는 것보단 IEEE 754의 부동소수점에 대해 공부해보시는 게 훨씬 빠를 거 같다는 생각을 해봅니다.

저는 참고 인용 문구를 통해 코드 배포 목적으로 이 글을 정리하고자 합니다.

 

반응형
728x90
300x250

[C, C++] Header와 템플릿의 명시적 특수화

 

C, C++에서 Template라는 개념은 <int>, <string>, <char> 등의 다양한 자료형의 함수를 두 번 생산하지 않고, 재사용을 한다는 장점을 통해, 개발 인력의 최소화로 긍정적인 부분을 보여준다고 할 수 있습니다.

이러한 Template는

 

#include < iostream >

 

using namespace std;

 

template <typename T>

class dd{


}

 

int main(){

 

 

이같은 꼴로 사용할 수 있습니다.

 

이러한 템플릿에서 명시적 특수화에 대해 잠시 소개하려고 합니다.

Explicit Specialization은 전체 특수화를 기본 특징으로 갖는 언어를 말합니다.

 

어려운 개념은 아닌데, 잘못 사용하면, 어려워지는 개념이 이 부분이 아닐까 싶습니다.

 

 template <typename T> class Invalid { 
 }; 

InVaild<double> x1;    // Invalid<double> 인스턴스화 시킴

template<> 
class Invalid<double>; // 에러: Invalid<double> 이미 인스턴스화 됨

 

위험하게 구성된 코드입니다. 흔히들 작업하다보면, 이와 같은 쓰레기 코드를 만들 수 있는데, 참조수준의 문제로 시스템에 중대한 오류를 발생시킬 수 있습니다.

 

기본적인 원칙을 구하고 사용하자.

 

template <typename T>

 class Invalid { 

       void aa(); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa()
{

}

(선언)

 

 

이의 경우, void 형의 aa() 함수를 선언하고 정의한 예시입니다.

기본적인 이의 구조는 당연한 Template를 생성하는 기본 원칙입니다.

 

template <typename T>

 class Invalid { 

       void aa(T data); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa(T data)
{

}

(선언)

 

template <>

void Invalid<char>::aa(char data)
{

}

(명시적 특수화)

 

 

T보다 특수화가 앞서 선언될 수 없다는 점을 명확히 할 필요가 있습니다.

아래는 가능한 사례를 몇 개 소개해드리고자 합니다.

 

template <typename T, typename D>

 class Invalid { 

       void aa(T data1, D data2); 
 }; 

(정의)

 

template <typename T, typename D>

void Invalid<T>::aa(T data1, D data2)
{

}

(선언)

 

template <char, int>

void Invalid<char, int>::aa(char data1, int data2)
{

}

(명시적 특수화)

 

 

이의 경우에는 명시적 특수화에서 오류가 날 수밖에 없습니다.

template <char, int>라고 쓴 부분은 template 함수를 생성하는 자료형이 와야 맞는데 General Data Type이 오기 때문에 오류가 날 수밖에 없습니다.

 

#include <iostream>
template <typename T, typename D>
class test{
public:
 void aa(T data1, D data2);
};
template <typename T, typename D>
void test<T, D>::aa(T data1, D data2){
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
template <>
void test<char, int>::aa(char data1, int data2)
{
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
int main(){
 test<double, int> aaaa;
 aaaa.aa(1.22, 1);
 test<char, int> bbbb;
 bbbb.aa('a', 1);
}

 

출력

T, D
1.22,1
T, D
a,1

 

 


1. 추천 사이트


1. https://wikidocs.net/488

 

반응형
728x90
300x250

[G++/C++]: std::to_string -> compiler error "not a member of std" - 오류

 

외국 자료를 찾아보니, 아마 컴파일러의 표준 버전이 안맞아서 생기는 문제로 볼 수 있습니다.

아래처럼 해결하면 됩니다.

 

방법1)

you may want to specify the C++ version with

g++ -std=c++11 tmp.cpp -o tmp

 

I don't have gcc 4.8.1 at hand , but in older versions of GCC, you can use

g++ -std=c++0x tmp.cpp -o tmp

 

방법2)

#include <string>
#include <sstream>

namespace patch
{

   
template < typename T > std::string to_string( const T& n )
   
{
        std
::ostringstream stm ;
        stm
<< n ;
       
return stm.str() ;
   
}
}

#include <iostream>

int main()
{
    std
::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ;
}

반응형
728x90
300x250

[C++] String 함수 - 문자열 비교 방법

 

std::string의 문자열 비교 방법입니다.

 

string a = "abb";

string b = "bbb";

 

if( aaa < bbb ) 

 

이렇게 처리하지 못하는 이유는 string이라는 class 덩어리로 만든 char* 의 집합이기 때문입니다. string은 std::string의 Element로서 Vector의 기능을 동일하게 수행합니다.

 

비교의 경우는 3가지로 정의할 수 있습니다.

 

1. a < b

2. a == 0

3. a > 0

 

앞서 선언한 string a의 string Vector의 Method에서 compare라는 기능을 이용하여 비교를 수행할 수 있습니다.

 

string a = "aaa";

string b = "bbb";

 

if ( a.compare(b) < 0 )         1) aaa < bbb를 의미

 

if ( a.compare(b) == 0 )        2) aaa == bbb를 의미

 

if ( a.compare(b) > 0 )         3) aaa > bbb를 의미

 

 


1. 참고자료(Reference)


1. http://devmae.tistory.com/317, Accessed by 2014-10-01

2. http://soen.kr/lecture/ccpp/cpp3/31-1-5.htm, Accessed by 2014-10-01

 

반응형
728x90
300x250

[C, C++] 멀티플렛폼 구현 - 원리

 

윈도우에서도 동작가능하고 리눅스에도 동작가능한 멀티플렛폼 코드를 작성해야할 일이 생깁니다.
이럴 땐 아래의 내용을 참고하시면 됩니다.

 

#ifdef WIN32 // Windows Platform

 

#else          // Linux (Unix) Platform

 

#endif

 

위의 형태로서 선언하면 Multi Platform을 제어할 수 있습니다.

 

예를 들어 Delay(int)의 경우, Linux에서 지원하고, Windows에서는 Sleep을 지원합니다.

(단, Windows.h에서 지원)

 

이의 경우를 예를 들어서

#ifdef WIN32

#include <windows.h>

#else

#include <unistd.h>

#endif

 

이처럼 구현할 수 있습니다.

 

int System(const string)의 경우,

반환 자체를 System()함수가 하기 때문에 TRUE, FALSE로서 해당 운영체제가 지원하는 명령어가 올바른지 확인할 수 있습니다.

 

이를 응용해서

윈도우 환경에서 지원하는 CLS를 리눅스에서도 가능한지 판별할 수 있습니다.

 

if(System("cls"))

// 참

else

// 거짓

 


1. 맺는말

 

실제 멀티플랫폼을 수작업으로 구현하기 위해서는 무척 많은 태스팅을 수행해야 합니다.

 

반응형

+ Recent posts