Skip to content

**** ****

for my bad memories..

날씨 정보 rss

2022-05-17


아래에서 시/도 코드를 얻고…
http://www.kma.go.kr/DFSROOT/POINT/DATA/top.json.txt

[{"code":"11","value":"서울특별시"},{"code":"26","value":"부산광역시"},{"code":"27","value":"대구광역시"},{"code":"28","value":"인천광역시"},{"code":"29","value":"광주광역시"},{"code":"30","value":"대전광역시"},{"code":"31","value":"울산광역시"},{"code":"41","value":"경기도"},{"code":"42","value":"강원도"},{"code":"43","value":"충청북도"},{"code":"44","value":"충청남도"},{"code":"45","value":"전라북도"},{"code":"46","value":"전라남도"},{"code":"47","value":"경상북도"},{"code":"48","value":"경상남도"},{"code":"50","value":"제주특별자치도"}]

아래에서 군/구 코드를 얻고.. (30은 대전)
http://www.kma.go.kr/DFSROOT/POINT/DATA/mdl.30.json.txt

[{"code":"30110","value":"동구"},{"code":"30140","value":"중구"},{"code":"30170","value":"서구"},{"code":"30200","value":"유성구"},{"code":"30230","value":"대덕구"}]

아래에서 읍/면/동 코드를 얻는다.. (30170는 서구)
http://www.kma.go.kr/DFSROOT/POINT/DATA/leaf.30170.json.txt

[{"code":"3017051000","value":"복수동","x":"67","y":"99"},{"code":"3017052000","value":"도마1동","x":"67","y":"100"},{"code":"3017053000","value":"도마2동","x":"67","y":"100"},{"code":"3017053500","value":"정림동","x":"67","y":"99"},{"code":"3017054000","value":"변동","x":"67","y":"100"},{"code":"3017055000","value":"용문동","x":"67","y":"100"},{"code":"3017055500","value":"탄방동","x":"67","y":"100"},{"code":"3017056000","value":"괴정동","x":"67","y":"100"},{"code":"3017057000","value":"가장동","x":"67","y":"100"},{"code":"3017057500","value":"내동","x":"67","y":"100"},{"code":"3017058100","value":"갈마1동","x":"67","y":"100"},{"code":"3017058200","value":"갈마2동","x":"67","y":"100"},{"code":"3017058600","value":"월평1동","x":"67","y":"100"},{"code":"3017058700","value":"월평2동","x":"67","y":"101"},{"code":"3017058800","value":"월평3동","x":"67","y":"101"},{"code":"3017059000","value":"가수원동","x":"67","y":"99"},{"code":"3017059600","value":"관저1동","x":"66","y":"99"},{"code":"3017059700","value":"관저2동","x":"66","y":"99"},{"code":"3017060000","value":"기성동","x":"67","y":"98"},{"code":"3017061000","value":"삼천동","x":"68","y":"100"},{"code":"3017063000","value":"둔산1동","x":"67","y":"100"},{"code":"3017064000","value":"둔산2동","x":"67","y":"100"},{"code":"3017065000","value":"만년동","x":"67","y":"101"}]

아래에서 최종 날씨 정보를 얻는다. (둔산2동)
http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=3017064000

각 노드 정보는 여기서 볼것..
https://www.weather.go.kr/w/resources/pdf/dongnaeforecast_rss.pdf


gcc 병렬 컴파일

2022-05-17


make가 병렬 컴파일이 지원되는 줄 오늘에야 알았다..
흑.. 내 시간…

-j 옵션없이 컴파일..

$ make
....
real    3m5.355s
user    0m0.980s
sys     0m1.836s

프로세스 4개 부여하여 컴파일..

$ make -j4
....
real    1m0.297s
user    0m0.979s
sys     0m2.233s

프로세스 8개 부여하여 컴파일..

$ make -j8
....
real    0m41.000s
user    0m1.010s
sys     0m2.417s

프로세스 16개 부여하여 컴파일..

$ make -j16
....
real    0m36.750s
user    0m1.131s
sys     0m3.057s

기본 환경변수로 등록도 가능.

$ export MAKEFLAGS=-j16
$ make

아래 참고..
출처: http://www.digipine.com/index.php?mid=clan&document_srl=598
make의 -j 옵션은 한번에 수행할 수 있는 명령(Job)을 지정하는 병렬 실행(Parallel Execution) 옵션입니다.
예를 들어 CPU코어가 4개라면 한번에 수행할 수 있는 명령을 -j4로 지정하여 프로세스가 4개 생성되어 병렬로 컴파일합니다.
명령수는 프레스의 수로 정의됩니다.
이렇게하여 소스를 컴파일시 4개 CPU의 자원을 최대한 활용하게 되는 것입니다. top 명령으로 확인하면 바로 알수있습니다.
make의 개발자에 의하면 CPU 총 코어 갯수에서 20%의 코어 갯수를 추가하는 것이 속도가 가장 좋게 작업되었다고 합니다.
코어가 8개이면 8 + 1.6 (8 의 20%) 이므로 -j 10 정도가 적당할 것 같습니다.
일반적으로 커널 소스 빌드시에는
간단히 > make -j`cat /proc/cpuinfo | grep cores | wc -l` kernel.img 하는 것이 좋습니다.
아래는 최상의 속도를 내는 스크립트 예제 입니다.

#!/bin/bash
cpunum='cat /proc/cpuinfo | grep cores | wc -l`
let bestnum=$cpunum+$(printf %.0f`echo "$cpunum*0.2"|bc`)
make -j`echo $bestnum` kernel.img

h5pp

2022-05-09


hdf5 포맷 r/w 용으로 나온 표준 libhdf5 를 사용하면 코딩량이 많을수밖에 없다..
찾아보니 h5pp 라는 라이브러리가 있길래 테스트해봄.

https://github.com/DavidAce/h5pp

짧은 코드로 되고.. 백터도 지원하고 좋은것 같음.

#include <h5pp/h5pp.h>

typedef struct {
	unsigned int id;
	float x, y, z;
} T_NODE;

int main(int argc, char *argv[]) 
{
	//h5pp::File file("test.h5", h5pp::FileAccess::REPLACE, 0);
	h5pp::File file("test.h5", h5pp::FileAccess::REPLACE);

	h5pp::hid::h5t T = H5Tcreate(H5T_COMPOUND, sizeof(T_NODE));
	H5Tinsert(T, "id", HOFFSET(T_NODE, id), H5T_NATIVE_INT);
	H5Tinsert(T, "x", HOFFSET(T_NODE, x), H5T_NATIVE_FLOAT);
	H5Tinsert(T, "y", HOFFSET(T_NODE, y), H5T_NATIVE_FLOAT);
	H5Tinsert(T, "z", HOFFSET(T_NODE, z), H5T_NATIVE_FLOAT);

	std::vector<T_NODE> nodes;
	T_NODE node;
   	node.id = 1;
	node.x = 1.0;
	node.y = 1.0;
	node.z = 1.0;
	nodes.push_back(node);
	nodes.push_back(node);
	nodes.push_back(node);
	nodes.push_back(node);
	nodes.push_back(node);
	file.writeDataset(nodes, "/nodes", T);

	std::vector<std::string> lines;
	lines.push_back("this is a vector");
	lines.push_back("of strings");
	lines.push_back("of varying lengths");
	file.writeDataset(lines, "/lines");

	return 0;
}

Triangle Remeshing

2022-04-23


출처: https://doc.cgal.org/latest/Mesh_3/index.html#Chapter_3D_Mesh_Generation

triangle 로 이루어진 파트가 있을때.. 아래와 같이 CGAL을 이용하여 remshing 가능..

컴파일…

% g++ -Wa,-mbig-obj -O2 ./remesh.cpp -lgmp -lmpfr -lgmp

코드…

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>
#include <CGAL/Polyhedral_mesh_domain_with_features_3.h>
#include <CGAL/make_mesh_3.h>
#include <CGAL/IO/output_to_vtu.h>
// Domain
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Mesh_polyhedron_3<K>::type Polyhedron;
typedef CGAL::Polyhedral_mesh_domain_with_features_3<K> Mesh_domain;
#ifdef CGAL_CONCURRENT_MESH_3
typedef CGAL::Parallel_tag Concurrency_tag;
#else
typedef CGAL::Sequential_tag Concurrency_tag;
#endif
// Triangulation
typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr;
typedef CGAL::Mesh_complex_3_in_triangulation_3<
  Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_index> C3t3;
// Criteria
typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria;
// To avoid verbose function and named parameters call
using namespace CGAL::parameters;
int main(int argc, char*argv[])
{
  const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("a.off");
  std::ifstream input(fname);
  Polyhedron polyhedron;
  input >> polyhedron;
  if(input.fail()){
    std::cerr << "Error: Cannot read file " <<  fname << std::endl;
    return EXIT_FAILURE;
  }
  if (!CGAL::is_triangle_mesh(polyhedron)){
    std::cerr << "Input geometry is not triangulated." << std::endl;
    return EXIT_FAILURE;
  }
  // Create domain
  Mesh_domain domain(polyhedron);
  // Get sharp features
  domain.detect_features();
  // Mesh criteria
  Mesh_criteria criteria(edge_size = 1,
                         facet_angle = 25, facet_size = 1, facet_distance = 1);
  // Mesh generation
  C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);
  // Output the facets of the c3t3 to an OFF file. The facets will not be
  // oriented.
  std::ofstream off_file("out.off");
  c3t3.output_boundary_to_off(off_file);
  return off_file.fail() ? EXIT_FAILURE : EXIT_SUCCESS;
}

Solid 섹션 컷 구현

2022-04-20


OpenGL로 우리가 표현하는 솔리드 (tetra, hexa…) 들은 triangle의 조합으로 이루어져있음.
실제는 내부가 차있는 형상은 아니란 말임.
어쨌건 보통 랜더링 할때는 내부를 볼일이 없어 문제가 없지만 섹션컷을 수행하면..
안이 비어 보이게 되어 흉함..
보통은 그래서 섹션컷 수행후에 특별한 방법으로 해당 면을 덮어씌워줌.

플레인 앞쪽은 짤린 부분으로 오른쪽에 짤린 부분을 채워주는 효과를 묘사해주고 있음.

출처: https://gist.github.com/jtsiomb/43b5da0515d4786a80a861369d35097c

컴파일

gcc xsection.c -lopengl32 -lfreeglut -lglu32

코드

/* Example of rendering cross-sections of closed non-self-intersecting geometry
 * with the stencil buffer. See draw_cross_section for details.
 *
 * Controls:
 *  - rotate object by dragging with the left mouse button
 *  - move cross-section plane back and forth by dragging up/down with the right
 *    mouse button
 *
 * Compile with: cc -o xsection xsection.c -lGL -lGLU -lglut
 *
 *                              - Nuclear / Mindlapse <nuclear@member.fsf.org>
 */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <GL/glut.h>

void disp(void);
void draw_regular(void);
void draw_cross_section(void);
void draw_object(void);
void reshape(int x, int y);
void keyb(unsigned char key, int x, int y);
void mouse(int bn, int st, int x, int y);
void motion(int x, int y);

int win_width, win_height;
float theta, phi, clipz;

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(1024, 600);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE);
    glutCreateWindow("GL cross-section hack");

    glutDisplayFunc(disp);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyb);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    /* we're going to need backface culling for this */
    glEnable(GL_CULL_FACE);

    glutMainLoop();
    return 0;
}

void disp(void)
{
    glViewport(0, 0, win_width, win_height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    /* ----- render the regular view on the left ----- */
    glViewport(0, 0, win_width / 2, win_height);
    /* set up perspective projection matrix */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, win_width * 0.5 / win_height, 0.5, 50.0);

    draw_regular();

    /* ----- render the cross-section on the right ----- */
    glViewport(win_width / 2, 0, win_width / 2, win_height);
    /* set up an orthographic projection matrix */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2, 2, -2, 2, -10, 10);

    draw_cross_section();

    /* draw a separator, just to make it clear that we have two viewports */
    glViewport(0, 0, win_width, win_height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, win_width, 0, win_height, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(0.7, 0.7, 0.7);
    glRectf(win_width / 2 - 2, 0, win_width / 2 + 2, win_height);

    glutSwapBuffers();
    assert(glGetError() == GL_NO_ERROR);
}

void draw_regular(void)
{
    int i;

    /* set up a view matrix */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0, 0, -6);
    glRotatef(20, 1, 0, 0);

    glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_LINE_BIT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    draw_object();

    /* also draw a quad to visualize the cross-section plane */
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_LIGHTING);
    glDepthMask(0);
    glLineWidth(2.0);

    for(i=0; i<2; i++) {
        glBegin(i ? GL_QUADS : GL_LINE_LOOP);
        glColor4f(1, 0, 0, i ? 0.25 : 0.5);
        glVertex3f(-1.8, -1.8, clipz);
        glVertex3f(1.8, -1.8, clipz);
        glVertex3f(1.8, 1.8, clipz);
        glVertex3f(-1.8, 1.8, clipz);
        glEnd();
    }

    glPopAttrib();
}

void draw_cross_section(void)
{
    double plane[] = {0, 0, -1, 0};

    /* just identity for the view matrix */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushAttrib(GL_ENABLE_BIT);
    glEnable(GL_STENCIL_TEST);    /* enable stencil testing */

    /* initially we don't care about the stencil buffer, we always want to draw */
    glStencilFunc(GL_ALWAYS, 0, 0);

    /* set up a clip plane to cut everything from the plane Z to the user */
    plane[3] = clipz;
    glClipPlane(GL_CLIP_PLANE0, plane);
    glEnable(GL_CLIP_PLANE0);

    glColorMask(0, 0, 0, 1); /* disable color writing, we only want to affect the stencil buffer */

    /* render back faces and increment stencil where we draw */
    glStencilOp(GL_INCR, GL_INCR, GL_INCR);
    glCullFace(GL_FRONT);
    draw_object();

    /* render front faces and decrement stencil where we draw */
    glStencilOp(GL_DECR, GL_DECR, GL_DECR);
    glCullFace(GL_BACK);
    draw_object();

    /* now everywhere outside the cross-section the stencil is 0, and inside the
     * cross-section the stencil is 1
     */

    glColorMask(1, 1, 1, 1);    /* re-enable color writing */
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);    /* don't modify the stencil buffer further */
    glStencilFunc(GL_LEQUAL, 1, 0xffffffff); /* test passes only where stencil >= 1 */

    /* just draw a fullscreen quad, will be drawn only inside the cross-section
     * (stencil == 1) area
     */
    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glDisable(GL_CLIP_PLANE0);    /* disable the clip plane, we don't want the quad to be clipped */

    glBegin(GL_QUADS);
    glColor3f(1, 0.3, 0.2);    /* color of the cross-section */
    glVertex2f(-1, -1);
    glVertex2f(1, -1);
    glVertex2f(1, 1);
    glVertex2f(-1, 1);
    glEnd();

    glPopAttrib();
}

void draw_object(void)
{
    glPushMatrix();
    glRotatef(phi, 1, 0, 0);
    glRotatef(theta, 0, 1, 0);

    glutSolidTorus(0.25, 1.0, 8, 28);
    glutSolidSphere(0.5, 16, 8);

    glPopMatrix();
}

void reshape(int x, int y)
{
    win_width = x;
    win_height = y;
}

void keyb(unsigned char key, int x, int y)
{
    switch(key) {
    case 27:
        exit(0);
    }
}

int bnstate[16];
int prev_x, prev_y;

void mouse(int bn, int st, int x, int y)
{
    int bidx = bn - GLUT_LEFT_BUTTON;
    bnstate[bidx] = st == GLUT_DOWN ? 1 : 0;
    prev_x = x;
    prev_y = y;
}

void motion(int x, int y)
{
    int dx = x - prev_x;
    int dy = y - prev_y;
    prev_x = x;
    prev_y = y;

    if(!dx && !dy) return;

    if(bnstate[0]) {
        theta += dx * 0.5;
        phi += dy * 0.5;

        if(phi < -90) phi = -90;
        if(phi > 90) phi = 90;
        glutPostRedisplay();
    }

    if(bnstate[2]) {
        clipz += dy * 0.01;

        if(clipz < -2) clipz = -2;
        if(clipz > 2) clipz = 2;
        glutPostRedisplay();
    }
}

signature from … is unknown trust

2022-04-19


msys2 에서 패키지 설치중 아래와 같은 에러가 나면..

$ pacman -S mingw-w64-x86_64-muparser
resolving dependencies...
looking for conflicting packages...

Packages (1) mingw-w64-x86_64-muparser-2.3.2-2

Total Download Size:   0.16 MiB
Total Installed Size:  0.65 MiB

:: Proceed with installation? [Y/n]
:: Retrieving packages...
 mingw-w64-x86_64...   162.6 KiB  61.3 KiB/s 00:03 [#####################] 100%
(1/1) checking keys in keyring                     [#####################] 100%
(1/1) checking package integrity                   [#####################] 100%
error: mingw-w64-x86_64-muparser: signature from "David Macek <david.macek.0@gmail.com>" is unknown trust
:: File /var/cache/pacman/pkg/mingw-w64-x86_64-muparser-2.3.2-2-any.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).
Do you want to delete it? [Y/n]
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occurred, no packages were upgraded.

요렇게.. 해결..

$ rm -rf /etc/packman.d/gnupg
$ pacman-key --init
$ pacman -S msys2-keyring
$ pacman-key --populate msys2
$ pacman -Syu

gcc 다운그레이드

2022-03-03


현재 msys2의 pacman 으로 업데이트 된 gcc 버전이 문제가 많다.. (mingw-w64-x86_64-gcc-11.2.0-10)
그래서 잘 사용하던 바로 전 버전으로 다운그레이드 하고자 한다.

먼저 gcc 관련 패키지들을 전부 삭제한다..

$ pacman -Rcn mingw-w64-x86_64-gcc
checking dependencies...

Packages (6) mingw-w64-x86_64-gcc-ada-11.2.0-10  mingw-w64-x86_64-gcc-fortran-11.2.0-10  mingw-w64-x86_64-gcc-objc-11.2.0-10
             mingw-w64-x86_64-msmpi-10.1.1-7  mingw-w64-x86_64-uasm-2.53.r668.8f8feb7-2  mingw-w64-x86_64-gcc-11.2.0-10

Total Removed Size:  362.27 MiB

:: Do you want to remove these packages? [Y/n]
:: Processing package changes...
(1/6) removing mingw-w64-x86_64-uasm                                            [############################################] 100%
(2/6) removing mingw-w64-x86_64-msmpi                                           [############################################] 100%
(3/6) removing mingw-w64-x86_64-gcc-objc                                        [############################################] 100%
(4/6) removing mingw-w64-x86_64-gcc-fortran                                     [############################################] 100%
(5/6) removing mingw-w64-x86_64-gcc-ada                                         [############################################] 100%
(6/6) removing mingw-w64-x86_64-gcc                                             [############################################] 100%

다음 아래와 같이 캐시 폴더에 이전 버전의 패키지가 있는지 본다.

$ ls /var/cache/pacman/pkg/*gcc* | grep 11.2.0.9 | grep zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-i686-gcc-ada-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-ada-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-i686-gcc-fortran-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-fortran-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-i686-gcc-libgfortran-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-libgfortran-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-i686-gcc-libs-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-libs-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-i686-gcc-objc-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-i686-gcc-objc-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-ada-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-ada-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-fortran-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-fortran-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libgfortran-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libgfortran-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libs-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libs-11.2.0-9-any.pkg.tar.zst.sig
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-objc-11.2.0-9-any.pkg.tar.zst
/var/cache/pacman/pkg/mingw-w64-x86_64-gcc-objc-11.2.0-9-any.pkg.tar.zst.sig

이제 sig 파일은 빼고 전부 설치한다.

$ pacman -U /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-11.2.0-9-any.pkg.tar.zst /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-ada-11.2.0-9-any.pkg.tar.zst /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-fortran-11.2.0-9-any.pkg.tar.zst /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libgfortran-11.2.0-9-any.pkg.tar.zst /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-libs-11.2.0-9-any.pkg.tar.zst /var/cache/pacman/pkg/mingw-w64-x86_64-gcc-objc-11.2.0-9-any.pkg.tar.zst
loading packages...
warning: mingw-w64-x86_64-gcc-libgfortran-11.2.0-9 is up to date -- reinstalling
warning: mingw-w64-x86_64-gcc-libs-11.2.0-9 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Packages (6) mingw-w64-x86_64-gcc-11.2.0-9  mingw-w64-x86_64-gcc-ada-11.2.0-9  mingw-w64-x86_64-gcc-fortran-11.2.0-9
             mingw-w64-x86_64-gcc-libgfortran-11.2.0-9  mingw-w64-x86_64-gcc-libs-11.2.0-9  mingw-w64-x86_64-gcc-objc-11.2.0-9

Total Installed Size:  382.68 MiB
Net Upgrade Size:      377.13 MiB

:: Proceed with installation? [Y/n]
(6/6) checking keys in keyring                                                  [############################################] 100%
(6/6) checking package integrity                                                [############################################] 100%
(6/6) loading package files                                                     [############################################] 100%
(6/6) checking for file conflicts                                               [############################################] 100%
(6/6) checking available disk space                                             [############################################] 100%
:: Processing package changes...
(1/6) reinstalling mingw-w64-x86_64-gcc-libs                                    [############################################] 100%
(2/6) installing mingw-w64-x86_64-gcc                                           [############################################] 100%
(3/6) installing mingw-w64-x86_64-gcc-ada                                       [############################################] 100%
(4/6) reinstalling mingw-w64-x86_64-gcc-libgfortran                             [############################################] 100%
(5/6) installing mingw-w64-x86_64-gcc-fortran                                   [############################################] 100%
(6/6) installing mingw-w64-x86_64-gcc-objc                                      [############################################] 100%

Manjaro 리눅스 on VMware

2022-02-25


개인적으로 archlinux 기반의 배포반을 상당히 좋아함.
Manjaro 리눅스가 arch 기반의 리눅스임.
아래는 VMware에 Manjaro 리눅스를 설치했을때 vmware tools 설치법.

비디오 설정

$ systemctl status vmtoolsd.service
$ sudo pacman -Qs vmware
$ sudo pacman -S xf86-video-vmware
$ reboot

공유폴더 설정

$ sudo systemctl start vmtoolsd.service
$ sudo systemctl start vmware-vmblock-fuse.service
$ sudo systemctl enable vmtoolsd.service
$ sudo systemctl enable vmware-vmblock-fuse.service

다음 vmware에서 공유 폴더 설정함.
다음 아래와 같이 입력하여 마운트 해봄.

$ sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other

/mnt/hgfs 에 공유 폴더가 마운팅 되어 있는지 확인해봄.

제대로 확인되어 있으면..
/etc/fstab 파일에 아래를 등록하여 매 부팅시마다 자동으로 마운팅되게 함.

vmhgfs-fuse    /mnt/hgfs    fuse    defaults,allow_other    0    0

OpenGL로 CAE-Pre 프로그램을 만든지 언 2년째..

2022-01-13


처음 2년전에 OpenGL을 시작했을때가 생각난다.

OpenGL은 배우기 어렵고 너무 많은 시간을 소비해야 한다는 글들을 보고 이게 과연 옳은 방향일까 고민을 했었다.
막상 긴 시간동안 오픈소스 엔진을 찾아보니 CAE 프로그램을 만드는데 전혀 적합하지 않다는 것을 알았다.
맞다. 저런 엔진은 게임을 만들려는 사람들에 국한된 얘기구나.. 하는 결론을 내렸다.

전혀 무지한 상태에서 그래도 자신있다는 Tcl/Tk로 GUI를 만들고
Tk 프레임에 glfw를 이용해서 OpenGL 프레임을 붙여서 개발을 먼저 시작했는데,
아무래도 UI가 느리다 보니 제약이 많아졌다.

그래서 또 자신있는 Qt를 메인 GUI로 하고 Qt내부에 패널을 두어서 Tk 프로그램을 유저가 추가할 수 있도록 했다.
추가된 Tk 패널에는 Tk로 GUI를 짜고 Tcl로 스크립팅도 가능하게하여 자동화도 염두해 두었다.

정말 난관은 요소 주변에 edge를 그리는거였다.
단순히 라인으로 그리는건 정말 안이쁘고 여러 가지 문제가 많았다.
그래서 One Pass 와이어프레임 랜더링 기법의 논문을 찾아서 구현을 했다.
이걸 구현했을때는 참으로 기뻤다.

투명 기법도 꽤 긴 시간 적절한 방법을 찾아서 적용도 했다.
이것 역시 만들고 나니 뿌뜻했다.

정말 엔진 없이 생 OpenGL로 개발 하려니 처음부터 모든걸 작성해줘야 한다는걸 지금도 실감하고 있다..

당연한 얘기지만 Pre의 기본 기능인
요소의 피킹에 있어서 다양한 방법으로 선택할 수 있는 기능이 있어야 했다.
역시 다양한 문제야 봉착했고 이런 문제를 해결하기 위한 알고리즘들을 찾아보고
적절한 방법을 테스트후 마우스로의 픽킹 부터 영역 선택등 다양한 방법을 구현했다.
또 선택된 요소에 적절한 색을 지정하는 방법도 필요하기에 구현했다.

제일 문제는 메시 구조체 였다.
메시 구초체는 이웃 요소를 빠르게 쉽게 찾을 수 있어야 했고,
요소 삭제시 연결 무결성이 유지가 되어야했다. 또 적절한 메모리를 소요해야한다.
아직까진 상용 Pre 프로그램과 비슷한 정도의 메모리를 차지한다. (앞으로는 더 늘수도 있겠지..)

요소 마스킹 기능도 구현했다. (아직까진 속도면에서 못마땅한데 좀더 다른 방법을 고안해냐야겠다)

캐드 기능은 아직도 엄두가 안나는데 아직까진 OCC 를 이용해서 iges나 step 정도를 뷰잉 해주는 수준이다.

LS-Dyna의 인풋덱, 또 결과 파일인 d3plot, binout 을 보는 기능도 구현했다.
역시 에니메이션도 된다. 이 부분은 아직 추가할 기능이 산적히 싸여있다.

OpenGL 멀티 윈도우는 Qt로 작업했더니 아주 쉽게 지원이 되었다.

쓸말은 많지만.. 여기까지.. 이제 자야겠다.