moebuntu : 우분투 모에 테마 배포판

우분투 기반에 모에 테마를 사용하는 배포판인 모에분투[1]라는 걸 봤다. 예상대로 역시나 일본인이 제작한 듯. ㅎㅎㅎ

대충보니, 아무래도 우분투와 기능적 차이가 있지는 않은 듯 하다.

나는 설치를 안 해봤지만, 유튜브에 구동영상이 몇 개 올라와 있어 참고할 수 있다.[2] 기회가 되면 깔아서 써 봐야지. 현재까지도 유지관리 되고 있는 듯 하다.

일전에 우분츄라는 우분투 만화[3]를 본 기억이 나는데, 다국어로 제작 가능하도록 만화를 오픈소스로 만든, 재미있는 시도를 하는 만화다. 근데 이건 더 이상 제작되지 않아 아쉽구만.

.


[1] moebuntu (moebuntu.web.fc2.com)
[2] “moebuntu” search result (youtube.com)
[3] AERIAL LINE (seotch.wordpress.com)

Seam Carving : 콘텐츠 기반 자동 이미지 크기 조정

해커뉴스에서 Seam carving이라는 알고리즘[1]이 화제[2]가 되고 있길래, 이게 뭔가 싶어서 검색을 좀 해 봤다. 헐 신박하구만. ㅋㅋㅋㅋ

이것을 잘 설명하는 블로그[3]나 영상[4,5]이 많다. 재생시간 4분 27초, 9분 9초

원래 신박한 아이디어는 콜롬버스 달걀 같은 거라서 처음 생각해 내기가 어렵지, 알고보면 쉬워 보인다-_-

알고리즘 구조상, 비슷한 픽셀이 이어지는 풍경화에는 잘 통하겠지만, 사진 전체에 걸쳐 변화무쌍한 구성인 상황에는 잘 안 통할 듯 하다. 그 경우는 영상[4]에서 사람을 지우는 예시 처럼 특정부위의 에너지 함수값을 수작업 세팅하는 과정이 필요한 것 같다.

이 기법을 데이터를 솎아내야 하는 다른 분야에 적용하면 안되나 싶은 생각이 좀 든다 ㅎㅎ

근데 논문[1] 중간에 커플을 솔로 사진으로 바꾸는 예시는 왠지 저자의 숨은 악의(?)가 있는 게 아닐까 하는 망상-_-이 든다 ㅋㅋㅋ

.


[1] “Seam Carving for Content-Aware Image Resizing”, Shai Avidan, Ariel Shamir, ACM Transactions on Graphics, Volume 26, Number 3, July 2007, Article No. 10 doi:10.1145/1276377.1276390
[2] Seam Carving (hacker news)
[3] Seam Carving – 내용을 인식하는 이미지 크기변환 방법 (infovis.tistory.com)
[4] Image Resizing by Seam Carving (youtube 4분 27초)
[5] 최소 손실 사진 크기 리사이즈 – Python (youtube 9분 9초)

이미지로 된 수식을 아래 한/글에 입력하는 스크립트

수학문제를 이미지 파일로 가지고 있을 때, 일전에 이야기한 mathpix[1]으로 수식을 LaTeX으로 변환할 수 있다. 이 변환결과를 입력하여 아래 한/글에서 수식으로 변환하여 입력하는 스크립트다.

동일한 스크립트를 여러 다른상황에서 쓸 수 있도록 만들었음. 본인은 한/글 2010을 쓰고 있어서, 다른 버전에서 작동을 보증하지 않음.

function OnScriptMacro_mathpix_ocr()
{
	var text = determine_eq_ob_nothing();

	if ( text == 'nothing')		//커서가 텍스트 입력상태일 때
	{
		text = GetTextFile("UNICODE","saveblock");

		if( text )		//텍스트가 블럭선택되어 있는 상태일 때
		{

			//이 부분에 넣고 싶은 기능을 넣으면 됨. ㅋㅋㅋㅋ

		}
		else		//텍스트 블럭이 아닌 상태 mathpix
		{
			var script = new ActiveXObject('MSScriptControl.ScriptControl');
			script.language = 'vbscript';
			var text = script.eval('inputbox("mathpix","입력")');

			//frac 처리
			var frac1 = text.search(/\\frac/), frac2, stop_inf=0;

			while( frac1> -1 && stop_inf < 40)
			{
				frac2 = braces_match(text, frac1);

				if(frac2 > -1)
				{
					text = text.substring(0,frac1) + text.substring(frac1,frac2).replace(/^\\frac/,'') + 'over' + text.substring(frac2);
					frac1 = text.search(/\\frac/)
				}
				stop_inf++;
			}

			//case 처리
			if ( text.search(/\\left\\\{\\begin\{array\}/) > -1)
			{
				text=text.replace(/\\left\\\{\\begin\{array\}\{[^\}]*\}/,'cases{');
				text=text.replace(/\\end\{array\}\\right\./,'}');
				text=text.replace(/\\\\/g,'#');
			}
			if( /\\left\\\{\\begin\{aligned\}/.test(text) )
			{
				text=text.replace(/\\left\\\{\\begin\{aligned\}/,'cases{');
				text=text.replace(/\\end\{aligned\}\\right\./,'}');
				text=text.replace(/\\\\/g,'#');
			}


			//align처리
			if( /^\\begin\{aligned\}/.test(text) )
			{
				text=text.replace(/^\\begin\{aligned\}/,'');
				text=text.replace(/\\end\{aligned\}$/,'');
				text=text.replace(/\\\\\s*([^&=\+\-\s])/g,', $1');		//식이 이어지고 있다고 추정되는 문자에는 콤마 뺌
				text=text.replace(/(\\\\)?\s*\&/g,'');
			}
			if ( text.search(/^\s*\\begin\{array\}/) > -1)		//식들의 병렬 배치
			{
				text=text.replace(/\\begin\{array\}\{[^\}]*\}\{/,'');
				text=text.replace(/\}\\end\{array\}/,'');

					//뒤에 quad를 기준으로 끊는 부분 있음		식이 끊어지는지 이어지는지 판정
				text=text.replace(/\}\s*\\\\\s*\{\s*\\quad\s*([\+=<>])/g,' $1');
				text=text.replace(/\}\s*\\\\\s*\{\s*\\quad\s*([^\+=<>\s])/g,' quad $1');		//마이너스는 식이 끊어지는 경우 있으므로 불포함

				text=text.replace(/\}\s*\\\\\s*\{\s*([\+=<>])/g,' $1');
				text=text.replace(/\}\s*\\\\\s*\{\s*([^\+=<>\s])/g,' quad $1');		//마이너스는 식이 끊어지는 경우 있으므로 불포함

			}

			//tex 기호를 한글 기호로 
			text=text.replace(/_\{([^\{\}]+)\}\s*\\mathbf\{C\}_\{([^\{\}]+)\}/g,'_{$1}{rm C}_{$2}');			//콤비네이션 처리
			text=text.replace(/\\boldsymbol\{([^\}]+)\}/g,'$1');		//볼드체 제거
			text=text.replace(/\\mathbf\{([^\}]+)\}/g,'$1');		//볼드체 제거
			text=text.replace(/\\geqq?/g,' ge ');
			text=text.replace(/\\leqq?/g,' le ');
			text=text.replace(/\\rightarrow/g,'->');
			text=text.replace(/\\pm/g,'+-');
			text=text.replace(/\\mp/g,'-+');
			text=text.replace(/\^\{((\\prime\s*)+)\}/g,'$1');
			text=text.replace(/\\overline/g,' bar');
			text=text.replace(/(left)?\\\{/g,' left{');
			text=text.replace(/(right)?\\\}/g,' right}');
			text=text.replace(/\^\{\s*\\circ\}/g,' DEG ');
			text=text.replace(/\\equiv/g,' == ');
			text=text.replace(/(^|\{)_/g,'$1`_');		//콤비네이션
			text=text.replace(/\\operatorname\{([^\}]+)\}/g,'$1');			//operatorname 제거
			text=text.replace(/<\-/g,'< -');							//좌측 화살표<-는 없다고 가정
			text=text.replace(/lim\s*_\s*\{([^\-]+)\->\s*([\+\-])([^\}]+)\}/g,'lim_{$1->$3$2}');		//lim_{x->+0}을 lim_{x->0+}로 변경
			text=text.replace(/\\,/g,'`');

			if( /\\overrightarrow/.test(text) )
			{
				text=text.replace(/\\overrightarrow/g,' vec');
				text=text.replace(/\\cdot/g,' bullet ');
			}


			//\Leftrightarrow 처리는 eqprint 함수 안에서


			//rm 처리
			text=text.replace(/\\mathrm\{/g,'{rm ');
			text=text.replace(/(vec|bar)\s*\{\s*([A-Z])\s*(_\{[0-9]\})?\s*([A-Z])\s*(_\{[0-9]\})?/g,'$1{rm $2$3$4$5');

			text=text.replace(/\{\{([^\{\}]*)\}\}/g,'{$1}');		//괄호 중복 제거
			text=text.replace('','');			//전각 공백 제거
			text=text.replace(/\\/g,' ');


			var seperated_equation = text.split('quad'), i, pos, stop_inf = 0;

			for(i = 0; i< seperated_equation.length-1 && stop_inf < 20; i++)		//만약 quad로 나누어 진다고 하더라도 중괄호가 안 맞으면 결합함
			{
				pos = braces_match(seperated_equation[i]);
				if ( /[\}\{]/.test(seperated_equation[i]) && pos == -1)
				{
					seperated_equation[i] = seperated_equation[i] + seperated_equation[i+1];
					seperated_equation.splice(i+1, 1);
				}

				stop_inf++;
			}

			for(i = 0; i< seperated_equation.length; i++)
			{
				if( /\s*,\s*`\s*$/.test(seperated_equation[i]) )
				{
					eqprint( seperated_equation[i].replace(/\s*,\s*`\s*$/, '') );
					print(', ');
				}
				else if( /^\s*\(.*\)\s{0,}$/.test(seperated_equation[i]) )
				{
					print(' (');
					eqprint( seperated_equation[i].replace(/^\s*\((.*)\)\s{0,}$/, '$1') );
					print(')');
				}
				else
				{
					eqprint( seperated_equation[i] );
				}
			}
		}
	}
	else if ( text )		//수식 개체가 선택된 경우
	{

			//이 부분에 넣고 싶은 기능을 넣으면 됨. 수식 내용을 변경한다든지 등등등.

	}
	else		//그리기 개체가 선택된 경우
	{

			//이 부분에 넣고 싶은 기능을 넣으면 됨. 그리기 개체 사이즈를 통일한다든지 등등등.
/*
		HAction.GetDefault("ShapeObjDialog", HParameterSet.HShapeObject.HSet)
		with (HParameterSet.HShapeObject)
		{


		}
		HAction.Execute("ShapeObjDialog", HParameterSet.HShapeObject.HSet);
*/
	}

}

/////////////
////서브루틴
//현재 커서에 수식이 선택되면 수식 텍스트 반환, 그리기 개체가 선택되면 ''반환, 아무것도 아니면 'nothing'반환
function determine_eq_ob_nothing()
{
	if (HAction.GetDefault("EquationPropertyDialog", HParameterSet.HShapeObject.HSet) )	//수식, 개체는 true
	{
		with (HParameterSet.HShapeObject)
		{
			text = String;
		}
		HAction.Execute("EquationPropertyDialog", HParameterSet.HShapeObject.HSet);

		//그리기 개체일 때, 이 부분에 print 함수 쓰면 한/글 비정상 종료됨

		return text;
	}
	return 'nothing';		//현재 커서에 오브젝트가 선택되지 않은 경우
}


//출력 함수
function print(text)
{
	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
	HParameterSet.HInsertText.Text = text;
	HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);
}


//수식 출력함수
function eqprint(text)
{
	var arr = text.split(/Leftrightarrow/), i;

	for(i=0; i<arr.length; i++)
	{
		if( i !=0 )
		{
			print( ' ⇔ ');
		}

		HAction.GetDefault("EquationCreate", HParameterSet.HEqEdit.HSet);
		with (HParameterSet.HEqEdit)
		{
			BaseUnit = PointToHwpUnit(10.0);
			String = arr[i];
		}
		HAction.Execute("EquationCreate", HParameterSet.HEqEdit.HSet);
	}
}


//문자열(text)과 시작위치(frac1)을 입력하면 이후 중괄호 짝이 맞는 최대 문자열 위치를 반환한다.	괄호가 없거나 안 맞으면 -1 반환
function braces_match(text, frac1)
{
	var counter = 1;

	var frac2 = text.indexOf('{', frac1);		//최초 스타트 상태에서 괄호의 개수가 영개이므로 처음 괄호가 시작되는 위치를 찾는다.
	if (frac2 == -1)		//에러 처리
	{
		return -1;
	}

	for(i=frac2+1; i<text.length && counter > 0; i++)
	{
		if( text.charAt(i) == '{' )
		{
			counter++;
		}
		if( text.charAt(i) == '}' )
		{
			counter--;
		}
	}

	if ( counter<0 || (i == text.length && counter != 0) )			//에러 처리
	{
		return -1;
	}
	return i;
}

inputbox 불러내서 입력하는 부분에서, 입력 글자제한이 있어서, 너무 긴 수식은 입력 안 되는 수가 있음.

.


[1] 내 백과사전 Mathpix : 수식 이미지를 LaTeX으로 자동변환하는 프로그램 2019년 4월 11일

라즈베리 파이를 어떻게 활용하십니까?

얼마전에 라즈베리 파이4가 판매시작 된 모양이다.[1] 스펙이 꽤 올라간 듯 한데, 하나 사고 싶지만 본인은 라즈베리 파이를 너무 많이 사 놔서 ㅋㅋㅋ 안 쓰는 게 몇 개 남아도는 마당에 또 사기는 좀 그렇구만. ㅎㅎㅎ

해커뉴스[2]에서 라즈베리 파이를 어떻게 활용하는가에 대한 이야기가 꽤 화제던데, 세상에 똑똑한 사람들이 많다. 재밌는 사례 중에, 몬트리올에 사는 어떤 사람이 버스 gps를 받아서, 창밖쪽으로 27인치 모니터를 달아서 버스 도착 예정시간을 보여주는 공공 서비스를 제공하는 사례가 있었다. 이건 뭐 한국에서는 이미 대도시 버스 정류장마다 버스 도착 패널이 달려있으니, 그리 적용할만데가 많지 않을 듯 하다.

식물에 자동으로 물을 주고, 식물 영상을 유튜브에 자동 업로드를 해서 식물관찰을 원격으로 하는 사람도 있던데, 이거 원거리에서 소규모 농장 하는 사람들은 나름 유용할 듯. ㅎㅎ

홈 오토메이션으로 쓰는 사람도 있고, VPN이나 옛날 머신의 와이파이 수신기로 쓰는 사람도 있는 듯. 세상에 똑똑한 사람 많다. ㅎㅎ 뭐 이걸로 NASA 해킹하는 사람[3]도 있더만. ㅋ

많은 사람들이 여러 개를 사서 각기 여러 용도로 쓰고 있던데, 본인도 몇 개를 돌리고 있다. 한 개는 스마트 거울[4]인데, 음성인식은 이제 안 되지만, 장중에는 코스피와 내가 홀딩하고 있는 회사의 주요뉴스들 타이틀이 거울에 디스플레이 되고, 장 마감 이후에는 일기예보가 디스플레이 되도록 만들었다. 여태까지 만든 것들 중에 이게 제일 유용하다. ㅎㅎㅎ

다른 하나는 오렌지 파이 제로[5]인데, ftp 및 웹서버로 쓰고 있어서 원격으로 간단한 기록이나 북마크 및 파일 전송/저장에 쓰고 있다. 사무실에 설치해 놨는데-_- 크기가 원체 작으니 아무도 존재를 눈치채지 못하고 있다. ㅋㅋㅋㅋ 이것도 상당히 유용함.

또 다른 하나는 집에 samba 및 토렌트 서버[6]를 설치한 것데, 망가져도 상관없는 계륵같은 저장장치들을 몽땅 합쳐서 대용량 디스크로 쓰고 있다.

라즈베리 파이 제로에 prota pi를 깔아서 마이크로봇 제어[7]에 쓰고 있다. 사정상 WOL을 쓰지 못하는 컴퓨터를 원격부팅할 때 쓰고 있음. 근데 prota pi는 서버가 죽을 때가 너무 많아서 불편하다.

일전에 구입한 메이커스의 스마트 스피커[8]는 node js 코딩 연습으로 쓰고 있었는데, 요새는 귀찮아서 걍 꺼 놓고 있다-_-

.


[1] Raspberry Pi 4 on sale now from $35 (raspberrypi.org)
[2] Ask HN: What do you do with your Raspberry Pi? (hacker news)
[3] cnet Raspberry Pi hack puts NASA in security jam June 24, 2019 9:49 AM PDT
[4] 내 백과사전 스마트 거울 만들기 2016년 1월 30일
[5] 내 백과사전 오렌지 파이 제로 wifi 연결하기 2017년 3월 16일
[6] 내 백과사전 라즈베리 파이로 RAID 0 만들어서 토렌트 머신 만들기 2017년 10월 15일
[7] 내 백과사전 마이크로봇 푸시 사용 소감 2018년 4월 4일
[8] 내 백과사전 node.js로 자작 스마트 스피커 만들기 2019년 6월 12일

node.js로 자작 스마트 스피커 만들기

스마트 스피커로 음악을 좀 듣고 싶은데, 본인이 듣는 음악의 절대다수는 국내에서 발매되지 않는다. 시판되는 상용 스마트 스피커들은 스트리밍 판매수익 때문에, 애석하게도 개인이 가지고 있는 mp3파일을 재생하는 기능이 없다. (물론 블루투스 스피커로 쓰면 되긴 된다.) 내가 말하는 음악을 재생해주는 스피커를 만들 수 없을까 궁리를 좀 해봤다.

일전에 만든 스마트 거울[1]은 크롬에서 https 사이트가 아니면 마이크 인식이 안 되도록 보안 업데이트를 하는 바람에 annyang이 더 이상 작동하지 않아 음성인식이 되지 않았다.

일전에 메이커스 매거진 부록으로 라즈베리 파이로 만든 스마트 스피커[2]를 어떻게 써먹어 볼 수 없을까 싶었는데, 본인이 node.js를 전혀 할 줄 모르기 때문에 어떻게 손을 댈 수가 없었다. ㅋㅋ 그래도 산 게 왠지 아깝구만 젠장.

뭐 여하간 어찌 되겠지 싶어서, node.js에 대해 검색을 열라게 해 봤다. 진짜 구글링을 일억 번은 한 듯-_-

그래서 어째저째 작동하는 물건을 만들었다. stt와 tts 부분은 일단 KT 서버를 활용한다. 일단 음성을 텍스트화한 후에는 특정 키워드가 들어있으면 그에 해당하는 정보를 쏴 주고, 없으면 KT의 대화서버로 보내서 나온 결과를 쏴 주도록 코드를 작성했다. 근데 node.js에 대해 아는 게 없으니 너무 멘땅에 헤딩 식으로 코딩했다. 이것 때문에 3일이 그냥 날라갔구만-_-

재생시간 1분 21초.

와 요거 만드는데 그 수많은 고생을 하다니-_- 아직 음악 재생 부분은 구현도 못했고, 코드는 100줄 남짓인데 하도 코드 수정을 많이해서 들여쓰기도 엉망이고 주석도 거의 없다-_- 어쨌든 음성인식 결과를 웹브라우저에 쏴 줄 수도 있으니 이런저런 이미지나 다양한 효과는 가능할 듯 하다. 참고로 서버의 데이터를 클라이언트의 웹브라우저에 출력하는 방법은 SSE라는 걸 사용했는데, 이런 게 있는 줄 처음 알았네. ㅎㅎ 어느 친절한 분이 설명[3]을 잘 해 두었으니 참고 바람.

참고로 hotword인 ‘기가지니’는 네 글자인데, 너무 길어서 ‘지니야’로 하니까 자꾸 아이패드의 시리가 반응한다-_- 본인은 아이패드의 siri와 네이버 wave[4]로 mBox[5]를 음성제어하고 있기 때문에 ‘기가지니’를 선택할 수 밖에 없었다.

근데 하드웨어가 안 좋은건지 몰라도, 음성인식률이 너무 떨어져서 실사용은 어려울 것 같다. 아 이걸로 음악 좀 듣고 싶은데, 아무래도 어려울 듯.

.


[1] 내 백과사전 음성인식 스마트 거울 만들기 2016년 11월 2일
[2] 내 백과사전 메이커스 매거진 부록 AI Maker Kit​ 2018년 8월 12일
[3] [웹개발] SSE ( Server-Sent Events) 란 무엇인가 (hamait.tistory.com)
[4] 내 백과사전 네이버 wave 사용 소감 2018년 9월 8일
[5] 내 백과사전 mBox : 음성으로 적외선 리모컨 신호 제어 2018년 12월 8일

계산 삼위일체론 computational trinitarianism

웹서핑을 하다가 흥미로운 개념을 알게 되었는데, 제대로 이해한 건 아니지만 일단 개소리를 써 본다. 사실 이 블로그의 대부분의 내용이 다 헛소리다. ㅋ

삼위일체론은 나도 잘 모르지만-_- 이렇게 이해했다: 신이라고 추정되는 어떤 가상적 존재성과, 인간의 형태로 등장한 예수라는 인물과, 신성한 영혼이라는 개념은 형태가 모두 다르지만 본질이 동일하다는 주장이다.

무신론자인 본인도 과거 피치못할 사정으로 교회에 간 경험이 있는데, (물론 군대-_-) 아마 거기서는 내가 설교를 제일 열심히 들었을 것이다-_- 목사님이 나름 은근히 동방정교회를 디스하는 듯한 발언을 하시던데-_- 나는 여태까지 동방정교회가 삼위일체를 부정하는 줄 알았더니만, 지금 위키피디아를 보니 동방정교회도 삼위일체를 인정하고 있었네??? 아, 설교를 들은지 너무 오래돼서 여호와의 증인이랑 헷갈렸던 것 같다-_- 지금 찾아보니 여호와의 증인은 삼위일체를 부정하는 듯[1]. 개인적으로 중앙아시아사에 관심이 좀 있는데, 네스토리우스파도 삼위일체를 부정한다고 들었다. 중앙아시아사에 대한 저작물을 몇 개[2,3]보면 은근 네스토리우스파 이야기가 꽤 등장한다. 몽케 칸이 각종 종교지도자들을 불러 모아 놓고, 종교 토론 배틀-_-을 시켰다는 이야기[2]를 들은 적이 있는데, 거기서도 네스토리우스파도 당당한 일원으로 등장한다.

뭐 여하간 카네기 멜론 대학의 Robert Harper 선생의 블로그에 computational trinitarianism에 대한 설명[4]이 잘 돼 있다. nLab의 설명[5]도 참고하시기 바란다. 대충 검색해보니 ‘computational trinitarianism’을 번역한 사이트가 없길래 내 맘대로 ‘계산 삼위일체론’이라 번역했다-_- 이거 뭘로 번역해야 되지-_-

여하간 명제의 증명(proofs of propositions), 자료형의 프로그램(programs of a type), 구조의 사상(mappings between structure)이 모두 동일한 개념의 다른 표현이라는 이야기라고 한다. 세 가지는 각각 논리학, (프로그래밍) 언어론, 범주론에서 중요하게 다루는 부분이다. 논리학에서 어떤 명제가 존재하고 무엇이 증명을 이루는가를 다루고, 언어론에서 어떤 자료 유형(type)이 존재하고 어떻게 프로그램을 구성하는가를 다루며, 범주론에서 어떤 수학적 구조가 존재하고 무엇이 그들 사이의 map을 이루는가를 다룬다.

이후로 Harper 선생이 axiom으로부터 명제의 증명, 프로그램에서 변수로부터의 유형판단, 범주론에서 mapping의 유사성에 대한 설명을 하는데, 뭐 본인은 잘 모르지만 뭔가 좀 신박하다. 논리학, 프로그래밍, 수학이 모두 대통일 된다는 이야기 아닌가. 모든 증명은 프로그램이고, 모든 프로그램은 mapping이고 모든 mapping은 증명이 된다. 궁극적으로 수학적 추론과 프로그램의 실행이 합치하게 된다!!! 일전에 본 DeepHOL[6]은 아무것도 아니구만-_-

경제학에서는 고정환율제도, 자본 이동의 자유화, 통화정책의 독립성이 동시에 달성될 수 없다는 Unholy Trinity가 있는데, 수학/컴퓨터공학에서는 holy trinity가 될 듯하다. 증명, 실행, 사상(mapping)이 한 몸임을 믿습니까?? ㅋㅋㅋㅋㅋ

.


2019.10.7
Curry–Howard correspondence라는 게 이미 있었구만. 젠장 오늘 알았네-_- 근데 왜 Robert Harper 선생은 이 용어의 언급을 안 한 건지는 의문이다.

.


[1] NEWSM 궁금한데 물어볼 수 없었던 ‘삼위일체 교리’ 2010.07.23 14:16
[2] 내 백과사전 [서평] 몽골 제국 기행 – 마르코 폴로의 선구자들 2018년 3월 1일
[3] 내 백과사전 [서평] 신장의 역사 : 유라시아의 교차로 2013년 5월 30일
[4] The Holy Trinity (existentialtype.wordpress.com)
[5] computational trinitarianism (nLab)
[6] 내 백과사전 DeepHOL : 딥러닝을 이용한 수학 명제 자동증명 시스템 2019년 4월 29일

Mathcha : 브라우저 기반 수학문서 편집툴

일전에 이야기[1]한 LaTeX으로 수학 노트필기를 한다는 사람이 쓴 두 번째 글[2]을 쓴 것을 해커뉴스[3]에서 봤는데, 그림을 그릴 때 Inkscape[4]를 쓴다고 한다. 나는 쓸 줄 몰라서 답답하던데-_- 이걸 어떻게 그렇게 자유자재로 쓰는 건지 신박하네. ㅋㅋ

여하간 해커뉴스의 댓글[3] 중에서, Mathcha라는 브라우저 기반의 수학문서 편집툴 개발자가 댓글을 달았던데, LaTeX을 몰라도 자유자재로 수학문서를 작성할 수 있는 사이트인 모양이다. 홈페이지[5]에 있는 소개 영상[6]을 봤는데, 보니까 엄청 잘 만든 것 같다. 재생시간 3분 7초

오오 필기 입력으로 deTeXify도 지원하는구만. 대단하구만.

브라우저 기반이니까 파일을 들고 다니거나, OS에 의존적일 일은 없을 것 같다. 물론 LaTeX 소스를 직접 편집할 수도 있다.

브라우저 기반 문서편집이라 하니 일전에 본 CoCalc[7]가 생각나는데, 이쪽은 문서작업뿐만아니라 협력작업을 더 강조하는 툴 같다.

근데 내가 쓸 일이 있으려나-_- 나는 한/글 종속적이라서-_- ㅋㅋㅋ

.


[1] 내 백과사전 수학 수업시간 중에 노트필기를 LaTeX으로 하는 것이 가능한가? 2019년 3월 22일
[2] How I draw figures for my mathematical lecture notes using Inkscape (castel.dev)
[3] I draw figures for my mathematical lecture notes using Inkscape (hacker news)
[4] 내 백과사전 Inkscape – 벡터그래픽 툴 2011년 10월 6일
[5] https://www.mathcha.io
[6] Mathcha.io – Math Editor – Overview (youtube 3분 7초)
[7] 내 백과사전 CoCalc : 웹기반 토탈 수학 관리 플랫폼? 2018년 4월 18일

이코노미스트지의 합성생물학 특집기사

1년에 4회 나오는 이코노미스트지의 Technology Quarterly가 이번 주에 나왔는데, 합성생물학 특집기사[1,2]가 실려있다. 기사가 초 길어서 좀 어지러운데-_- 상당히 흥미진진한 내용이 많으니 일독을 권함. 내가 잘 모르는 분야다 보니까 몰랐던 내용들이 엄청 많이 나온다. 과거와 현재의 연구 흐름과 관련 산업동향까지 포괄적으로 소개하고 있어 흥미롭다.

iGEM이라든지 Hachimoji DNA 같은 건 다 처음 듣는 이야기다. 특히 탄소 대신 실리콘(!)으로 된 enzyme을 directed evolution 시키는 이야기는 초 놀랍네. 신박하구만.

합성생물학 하니 예전에 봤던 DNA 컴퓨터[3] 이야기가 생각나는데, Travelling salesman problem을 DNA로 해결하는 건 초 신박하다. 얼마전에 ieee spectrum에서 nature논문[4]을 소개하는 기사[5]를 봤는데, 이쪽분야도 나름 발전하고 있는 모양.

여하간 일독을 권함. 초 신기하네. ㅋㅋㅋㅋ 일전에 Big economic ideas 특집 기사[6,7]처럼 한 번씩 재밌는 기사를 때려주니까 이코노미스트지를 끊을 수가 없네. ㅎㅎㅎ

.


[1] 이코노미스트 The promise and perils of synthetic biology Apr 4th 2019
[2] 이코노미스트 The engineering of living organisms could soon start changing everything Apr 4th 2019
[3] 내 백과사전 DNA 컴퓨터 2012년 3월 21일
[4] Damien Woods, et al. “Diverse and robust molecular algorithms using reprogrammable DNA self-assembly” Nature volume 567, pages 366–372 (2019) https://doi.org/10.1038/s41586-019-1014-9
[5] ieee spectrum DNA Computer Shows Programmable Chemical Machines Are Possible 22 Mar 2019 | 13:43 GMT
[6] 내 백과사전 이코노미스트지의 Big economic ideas 시리즈 2016년 8월 1일
[7] 내 백과사전 이코노미스트지의 Big economic ideas 시리즈 두 번째 2017년 8월 7일

비둘기 인터넷 프로토콜 : 대량 데이터 전송에서 RFC 1149의 유효성

컴퓨터 공학자들이 인터넷에 적용할 새로운 아이디어를 제안하는 목록인 RFC에서는, 해마다 만우절에 개그성 제안을 제시한다. 위키피디아의 April Fools’ Day Request for Comments 항목에 전체 목록이 있으니 참고 바란다.

개중에 1990년 만우절에 제시된 RFC 1149[1]가 유명한데, 새를 활용하여 데이터를 전송하는 인터넷 프로토콜의 방법을 제시한 아이디어다. 이걸 보고 2001년에 Bergen시의 리눅스 사용자 그룹에서 실제 실험을 시행했다고 한다. 위키피디아의 IP over Avian Carriers 항목에 따르면 당시 9개 패킷 중 5개가 손실되었고 평균 핑값은 5222806.6ms 였다고 한다. ㅎㅎㅎ

ieee spectrum의 만우절 기사[2]를 보니, sd카드의 집적도가 올라갔기 때문에, 대용량 전송이 필요할 시에는 여전히 전서구 인터넷 프로토콜이 통상적인 인터넷보다 속도가 빠르다고 한다. 올해 초에 샌디스크에서 테라바이트 sd카드가 출시된 모양[3]인데, sd 카드의 무게라면 비둘기가 서너개 정도는 무리없이 전송가능하지 않을까. 아마 몇 테라바이트급 이상의 대용량 데이터를 근거리에 전송할 경우, 비둘기가 월등히 빠르지 않을까 싶다. ㅎㅎㅎ

얼마전에 중국에서 비둘기 매니아들의 속도 경쟁 격화로 인해, 최고 가격의 비둘기가 125만 유로(!)에 달한다는 기사[4]를 봤는데, 속도 빠른 전서구는 엄청나게 비싸구만. 어느 분야든 매니아의 세계는 오묘하다. ㅎㅎㅎ 여하간 추가비용을 고려하지 않는다면-_- 근거리 대용량 데이터 전송으로 비둘기를 사용하는 것도 가능한 한 가지 옵션이 아닐까 싶다. ㅋㅋ

.


2019.4.2
ieee spectrum Consider the Pigeon, a Surprisingly Capable Technology 29 Mar 2019 | 19:00 GMT

.


[1] David Waitzman (1 April 1990). Standard for the transmission of IP datagrams on Avian Carriers. IETF. doi:10.17487/RFC1149
[2] ieee spectrum Pigeon-Based ‘Feathernet’ Still Wings-Down Fastest Way to Transfer Massive Amounts of Data 1 Apr 2019 | 13:30 GMT
[3] 테크크런치 The world’s first 1-terabyte SDXC card is here 3 months ago
[4] 가디언 ‘Lewis Hamilton of pigeons’ sold for world record €1.25m Mon 18 Mar 2019 12.24 GMT