Skip to content

**** ****

for my bad memories..

Quad meshing by using gmsh

2021-07-29


Mesh.Algorithm = 9; // Packing for Parallelograms

lc = 0.1; 

// vertices.
Point(1) = {0, 0, 0, lc};
Point(2) = {0.5, 0, 0, lc};
Point(3) = {1.0, 0, 0, lc};
Point(4) = {1.0, 0.5, 0.5, lc};
Point(5) = {1.0, 1.0, 1.0, lc};
Point(6) = {1.0, 1.5, 0.5, lc};
Point(7) = {1.0, 2.0, 0.0, lc};
Point(8) = {0.5, 2.0, 0.0, lc};
Point(9) = {0.0, 2.0, 0.0, lc};
Point(10) = {0.0, 1.5, 0.5, lc};
Point(11) = {0.0, 1.0, 1.0, lc};
Point(12) = {0.0, 0.5, 0.5, lc};

// curves.
Spline(1) = {1,2,3};
Spline(2) = {3,4,5,6,7};
Spline(3) = {7,8,9};
Spline(4) = {9,10,11,12,1};
Physical Line("bottom") = {1};
Physical Line("top") = {3};
Curve Loop(1) = {2, 3, 4, 1};
Surface(1) = {1};
Recombine Surface{1};

Physical Surface("mysurface") = {1};


CAD 프로그램과 엔진에 대하여..

2021-06-24


좋은 글이 있어서 퍼옴.

------------------------------------------------------------------------
pro-E, 카티아, 솔리드웍스, 오토캐드, 유니그래픽스 등을
FreeCad, 드래프트사이트, 다른 글타래에서 추천해주신 공학용 프로그램들로
충분히 커버가 되는지도 궁금합니다.
물론 비전문가가(평범한 사용) 사용한다고 가정해 주십시오.
------------------------------------------------------------------------

CAD 업계의 역사도 나름대로 참 흥미진진한데요.
3D CAD 기술에 대해서 간단히 말씀드려 보자면, '3D 솔리드 커널'이 이 분야의 핵심기술에 해당한다고 합니다.
'3D 솔리드 커널'은 간략히 말해서,
최하위의 그래픽카드 같은 하드웨어 위에 올라타는
소프트웨어 그래픽 라이브러리인 OpenGL이 있는데
또 그 위에 올라타는 소프트웨어 라이브러리를 말합니다.
왜 OpenGL 위에 올라타는게 필요하냐면, OpenGL에서 제공하는 기능은 너무 하등하기(?).. 아니, 기본적인 것들이기 때문이죠.
때문에 공학용 솔리드모델을 다루기 위한 기능들이 구비된 '솔리드 커널' 라이브러리가 필요하다고 합니다.
간단히 말해서,
구/원뿔/육면체 등의 프리머티브 형상들을 불리언 연산해서 더하거나 빼거나 하는 기능들이나
위상기하학적인 토폴로지 이론 같은게 막 들어가서 복잡한 솔리드 데이타 구조를 형성하고 다루는데 필요한 기능들입니다.


3D CAD 업계에서 사용하는 메이저급 솔리드 커널은 몇가지가 있습니다.

대표적으로 오랜 역사를 자랑하는 Parasolid 커널이 있습니다. 이거 기반으로 UG(Unigraphics) 제품이 나와 있구요.
거의 표준 비슷한 역할을 하고 있죠.
때문에 다른 솔리드커널들도 기본적으로 이 파라솔리드 형태로 변환 가능하도록 기능이 기본적으로 들어가 있습니다.
하지만 파라솔리드 커널은, 지멘스가 소유한 상업용 독점 소프트웨어 입니다.
소스코드는 비공개입니다. 사용하려면 라이센스료를 내야 하고요.
(하지만 학교에서 연구용으로 요청하면 비영리 연구목적으로 소스코드 제공해 준다고는 합니다만)

그 다음으로 큰 것이 ACIS 커널이 있습니다.
이것은 닷쏘시스템사의 CATIA에서 기반으로 하고 있습니다. 물론 이것도 닷쏘시스템사가 소유한 상업용 독점 소프트웨어 입니다.
1997년에 솔리드웍스사를 닷쏘시스템에서 인수를 했는데,
2011년에 솔리드웍스 CAD 제품의 기반 커널을 기존의 Parasolid에서 ACIS로 바꾼다는 뉴스가 있었습니다.
즉 닷쏘시스템은 CATIA, Solidworks의 기반기술을 전부 자사기술로 통합하고 있죠.

그 다음으로는 PTC사의 CREO(구 Pro/Engineer, Wildfire) 제품에서 사용하는 커널입니다.
원래 프로/엔지니어에서는 파라솔리드 커널의 라이센스를 구매해서 구현했었는데,
최근에 와일드파이어로 업그레이드 하면서 자체적인 Granite 커널이라는 걸 개발한 모양입니다.
Grinite 커널에 대해서 잘 알지는 못하지만, 완성도에 자신이 있는지 이 커널만 따로 라이센스 판매도 하는 모양입니다.
물론 Granite 커널 역시 PTC사의 독점 소프트웨어죠.

.....

자, 그럼 오픈소스 진영에서는 위에 열거된 저런 훌륭한 솔리드 커널을 하나도 쓸 수 없습니다.
세계 최고의 기술력을 가진 커널들인데 불행한 일이죠.
대신 오픈소스 쪽에서는 그 대안으로 하는 것이 OpenCascade 커널이 있다고 합니다.
원래 프랑스의 회사에서 유클리드라는 자체 3D CAD를 개발하면서 만든 건데
워낙 이쪽 업계에 쟁쟁한 거물들이 많은지라, 도저히 경쟁이 안된다고 판단되자
자신들의 기반기술인 커널을 오픈소스화 해 버리고, 자신은 그 커널을 유지관리개선 및 엔지니어링 서비스 해 주는 사업모델로 전환해 버립니다.

오픈캐스케이드 커널도 굉장히 방대하고 기능이 짱짱하기 때문에, 오픈소스 쪽에서 이거 기반으로 대부분 다 만들더군요.
FreeCAD는 물론이고, HeeksCAD나 NaroCAD(이넘은 C#으로 개발한 거라서 윈도우 전용) 같은 오픈소스 3D CAD 소프트웨어들은
전부 오픈캐스케이드 기반인 것 같습니다.

그럼 오픈캐스케이드의 완성도가 위에 열거한 메이저 커널들과 동등한가 하는 점이 남는데...
실제 관련분야 개발자의 말씀을 들어보면
솔직히 좀 많이 딸린답니다. (-,.-);

C++코드가 엄청나게 잘게 쪼개져서 지저분하게(?) 있어서 전체 구조를 파악하기가 쉽지 않고,
제공되는 함수들의 카테고리도 이리저리 막 뒤섞여 있어서 체계성이 미흡하고,
자체 연산 정밀도 문제도 있어서 아주 얇은 솔리드를 생성하거나 할 경우(크리티컬한 경우)에는 에러가 잘 나는 등
단점이 많다고 합니다.
또 좋은 기술지원을 받기도 어렵습니다. 오픈캐스케이드 엔지니어링 서비스를 계약해서 받으려면, 어차피 상용 커널 구매하는 거랑 진배없죠.

하지만 이런 단점에도 불구하고, 오픈소스 진영에서는 현실적으로 채택가능한게 오픈캐스케이드 밖에 없기 때문에
할 수 없이(?) 이넘만 사용하는가 봅니다.

실제로 FreeCAD를 가지고 상당히 복잡하거나 민감한 형상을 불러들이면
상용 CAD보다 상당히 불안정한 모습을 보여줍니다.

또, 오픈캐스케이드 커널에는 ACIS나 파라솔리드가 계속 발전하면서 최근에 도입한 최신 개념들이 제대로 아직 도입되어 있지 못합니다.
그래서 FreeCAD의 기능도 그렇게 좋지 못한 편인 듯 합니다.

결론적으로 FreeCAD는 값비싼 전문설계용 상용 CAD를 직접 대체할 수는 없습니다.
상용 3D CAD 소프트웨어 정도의 완성도와 유용성을 가지는 소프트웨어가 오픈소스 진영에서 나오려면
리눅스 파운데이션이나 GNU 프로젝트 이상의 거대한 규모의 프로젝트가 되지 않고서는 힘들다고 생각됩니다.

대신 FreeCAD의 유용성은, 보조적인 용도로 사용하기에 정말 좋다고 생각됩니다.
또 DIY를 하는 개인들이 간단히 모델링해 보고 도면 뽑아내고 하기에는 좋다고 생각됩니다.
아니면 FreeCAD에 자신만의 커스텀화된 스크립트를 추가해서 특화된 용도 - 예를 들어 나사만 만드는 회사가 있을 경우,
나사의 수천가지의 규격을 DB데이타로 구축해 놓고, 그 데이타를 읽어서 자동으로 모델링을 주루룩 해 주는 자동화를 하는 등 -
에는 적당하지 않나 싶습니다.
(나사 제조회사에서 굳이 수천~수억원짜리 값비싼 CAD를 도입할 이유가 없으니까요)

.....

한편, 2D CAD에서 오토캐드 대체품으로 사용가능한 무료의 DraftSight의 경우에는
딱 한가지 단점이 있습니다. 즉 오토캐드에서는 오토리습 스크립트를 짜 넣을 수 있는데, 드래프트사이트에는 그 기능이 없습니다.
스크립트 기능이 없기 때문에, 이 기능을 중시하는 경우에는 좋은 선택이 아닙니다.
다만 최근에 닷쏘시스템에서 보내온 메일을 보니깐
드래프트사이트에도 자체적인 스크립트 기능을 추가하는 모양이긴 한데, 그 기능은 아마 유료화하지 않을까 싶더군요.

Lynx for Win32

2021-06-22


Lynx는 리눅스용 텍스트 기반 웹부라우저..
사실 Lynx는 html을 txt로 덤핑을 떠주는 기능이 있는데 이게 참 유용함.

ly284p5.zip

예를 들어.. 아래의 html 이 있을때..

이걸 아래와 같이 텍스트로 변경하면..

lynx.exe -dump test.html > test.txt

요렇게 나옴.


Building Tcl 8.6 single file applications - a step-by-step guide

   Published 2020-12-28

   There  is  plenty of reference material on the Internet about building
   single  file  applications  with Tcl but as is often is the case, some
   bit  rot  has  set  in that makes it confusing for new users. Taking a
   break  from our series on Tcl 8.7, this short post aims to remedy that
   by providing a step-by-step guide for the process.

   Note  however  that  there  are  a  lot of base technologies (tclkits,
   [1]freewrap  etc.), each of which additionally have multiple levels of
   functionality  with  a  variety  of  configuration  options. This post
   provides  a recipe for building a single file application for just one
   specific combination based on the tclkit core. It does not go into any
   level  of  detail;  for  that, see one of the references listed at the
   end.

   The  sample  application  we will create, demo.exe, prints all numbers
   supplied  as  arguments  on  the  command line using a package we call
   adder.

Step 1: download prerequisites

.....

CentOS 6.10 에 MySQL 5.7 설치하기

2021-06-10


5.7 버전 설치..

% rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
% yum search mysql-community
% yum install mysql-community-server mysql-community-devel

다음 데몬 시작

% service mysqld start

다음 mysql 콘솔 진입해보기

% mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

분명 패스워드 설정한 적이 없는데 에러가 발생 하면..
/var/log/mysqld.log 해당 파일에 임시 비번(ZC9*!kTPSM=i) 이 있음.
A temporary password is generated for root@localhost 문구를 찾을것.

2021-06-10T01:47:43.604015Z 0 [Warning] CA certificate ca.pem is self signed.
2021-06-10T01:47:44.473723Z 1 [Note] A temporary password is generated for root@localhost: ZC9*!kTPSM=i
2021-06-10T01:48:07.696819Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use

다음 root 패스워드 변경하기..
패스워드 정책이 높아서 변경이 잘 안됨.. (정책 변경후 패스워드 변경)

mysql> SET GLOBAL validate_password_policy=LOW;
mysql> use mysql;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '패스워드';
mysql> quit;

이제 변경된 비번으로 로그인하면됨..

그리고 mysql 이 재시작 될때도 적용해야 하므로..
my.cnf 파일에도 기록한다.

validate_password_policy=LOW

그리고 5.6 버전부터 필드 생성시 공백 허용이 기본으로 안되서.. 다음와 같은 에러가발생..

Field doesn't have a default values

하여.. 호환성을 위해서.. my.cnf 파일에 다음을 기록.

sql_mode=NO_ENGINE_SUBSTITUTION

——————————————————
아래는 참고로.. mysql 완전 삭제방법..

% yum list installed | grep mysql
% yum remove -y mysql-community-*
% rm -rf /var/lib/mysql

Vector 속도 테스트

2021-03-29


이미 요소의 갯수를 알고 있을때의 속도 테스트를 해봄..
테스트 비교는
Raw Array, C로 구현된 Vector (https://github.com/goldsborough/vector), C++ FBVctor (https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md), C++ Standard Vector

#include <iostream>
#include <chrono>

#include <folly/memory/Malloc.h>
#include <folly/FBVector.h>

#include <vector>

#include <vector/vector.h>

int main(void)
{
	{
		std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

		unsigned int *vec = (unsigned int *)malloc(1000000000 * sizeof(unsigned int));

		for(unsigned int i=0; i<1000000000; i++) {
			vec[i] = i;
		}

		std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;
		std::cout << "array: Time passed (sec) : " << sec.count() << " seconds" << std::endl;

		std::cout << "Press any key to next test." << std::endl;
		getchar();
		
		free(vec);
	}

	{
		std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

		Vector vec;
		vector_setup(&vec, 1000000000, sizeof(unsigned int));

		for(unsigned int i=0; i<1000000000; i++) {
			vector_push_back(&vec, &i);
		}

		std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;
		std::cout << "C Vector: Time passed (sec) : " << sec.count() << " seconds" << std::endl;

		std::cout << "Press any key to next test." << std::endl;
		getchar();
		
		vector_clear(&vec);
		vector_destroy(&vec);
	}

	{
		std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

		folly::fbvector<unsigned int> vec;
		vec.reserve(1000000000);
		for(int i=0; i<1000000000; i++) {
			vec.push_back(i);
		}

		std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;
		std::cout << "C++ FBVector: Time passed (sec) : " << sec.count() << " seconds" << std::endl;

		std::cout << "Press any key to next test." << std::endl;
		getchar();
		
		vec.clear();
		vec.shrink_to_fit();
	}

	{
		std::chrono::system_clock::time_point start = std::chrono::system_clock::now();

		std::vector<unsigned int> vec;
		vec.reserve(1000000000);
		for(int i=0; i<1000000000; i++) {
			vec.push_back(i);
		}

		std::chrono::duration<double> sec = std::chrono::system_clock::now() - start;
		std::cout << "C++ Vector: Time passed (sec) : " << sec.count() << " seconds" << std::endl;

		std::cout << "Press any key to exit." << std::endl;
		getchar();

		vec.clear();
		vec.shrink_to_fit();
	}

	return 0;
}
array: Time passed (sec) : 2.27096 seconds
Press any key to next test.

C Vector: Time passed (sec) : 11.588 seconds
Press any key to next test.

C++ FBVector: Time passed (sec) : 6.22477 seconds
Press any key to next test.

C++ Vector: Time passed (sec) : 14.0583 seconds
Press any key to exit.

결과는 Raw Array 가 가장 빠름.


PHP 에서 특정 국가만 허용하기

2021-03-12


tcltk.co.kr 에서 drupal 을 사용중인데..
자꾸 스팸 글과 스팸 유저 때문에 골머리를 썩어서.. 시간좀 내서 알아봤음.

IP2Location (https://github.com/chrislim2888/IP2Location-PHP-Module)이라는 php 모듈이 있는걸 찾았고..
아래와 같이 druapl index.php 에 적용.

우선 IP2Location 폴더를 적절히 만들고 파일을 업로드하고 아래와 같이 한국 국가만 접근 가능토록 코드를 작성.

include DRUPAL_ROOT . '/IP2Location/Database.php';
include DRUPAL_ROOT . '/IP2Location/IpTools.php';
include DRUPAL_ROOT . '/IP2Location/WebService.php';

$db = new \IP2Location\Database(DRUPAL_ROOT . '/IP2Location/IP2LOCATION-LITE-DB1.BIN', \IP2Location\Database::FILE_IO);
$records = $db->lookup($_SERVER['REMOTE_ADDR'], \IP2Location\Database::ALL);

$countryCode = $records['countryCode'];
//echo $records['countryName'] . "- (".$records['countryCode'].")";

if($countryCode != 'KR') {
	echo 'You are connected from ' . $records['countryName'] . '.</br>';
	echo 'Only Korea(Republic of) country is allowed.';
	exit;
}

적용후 vpn 으로 접속하면..

흐흐.. 일단 잘됨. 이제 골머리는 썩지 않겠지?..
근데 이게 좋은 선택일까..