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일

검색엔진의 새로운 시대적 전환 : 제로 클릭 검색

해커 뉴스[1]를 보니 구글 검색에서 제로 클릭 검색이 전체 검색 트래픽의 절반을 초과했다는 소식이 있었다.

나는 ‘Zero Click Searches’라는 용어를 처음 들었는데, 이게 뭔 뜻인가 싶어 검색해보니, 용어만 몰랐지 사실 나도 예전부터 엄청 쓰고 있었던 기능이었다. 검색엔진에 검색한 이후에 원하는 정보를 얻었기 때문에, 굳이 검색 결과를 클릭하지 않고 넘어가는 상황을 의미한다고 한다. 예를 들어, 개인적으로 엑셀을 사용해야 하는 상황이 종종 생기는데, 귀차니즘 때문에-_- 무조건 함수와 스크립트로 자동화를 하는 경향이 있다. 근데 엑셀의 모든 스크립트와 함수를 알지 못하므로 검색에 의존하는데, 이 경우 예를 들어, ‘how to sum excel’ 따위를 구글링하면, 굳이 웹페이지를 클릭하여 보지 않고도 구글이 알아서 방법을 설명해 주기 때문에 검색 결과를 클릭할 필요가 없다.

이 제로 클릭 검색이 전체 검색의 절반을 돌파했다는 소식을 봤는데, 이제 슬슬 검색 엔진의 큰 패러다임이 바뀌는 게 아닌가 싶은 생각이 든다. 과거 page rank 알고리즘이라는 혁신적인 방법을 통하여 구글이 검색엔진의 성배를 석권한 이래로 검색엔진계를 재패해 왔는데, 이제 그런 시대는 가고 구글도 검색엔진으로서 정체성을 새롭게 확립해야 하는 게 아닌가 싶기도 하다.

생각해보면 그런 의미에서 이러한 스니펫을 일찌감치 도입한 네이버나 다음이 실질적으로는 시대를 앞서간(?) 검색엔진이 아니었나 싶은 생각도 들기는 한다. ㅎㅎㅎ 물론 인력에 의한 스니펫이 아니라 인공지능에 의한 스니펫이 앞으로는 검색엔진의 대세가 될 듯 하다. 우리 후대에서는 좀 더 자연어로서의 질문에 반응하고, 더 자연스러운 대답을 추구하는 검색엔진이 될 것이라는 점에서 구글신[2]에 더 근접하지 않을까 하는 망상이 든다. ㅋㅋㅋ 뭐, 술먹고 쓰는 글이라 개소리라 생각해주시길 바란다. ㅎ 여하간 내가 노인이 되었을 때의 검색엔진의 모습은 지금과는 또 사뭇 다를 듯 하다.

.


[1] Fewer Than Half of Google Searches Now Result in a Click (hacker news)
[2] 내 백과사전 구글교 Church of Google 2010년 11월 19일

음악 추천 알고리즘 : Hierarchical Poincaré Embeddings

해커 뉴스[1]에서 Hierarchical Poincaré Embeddings를 이용하여 음악 추천을 하는 이야기를 봤는데, 뭔 소리인지는 잘 모르겠지만-_- 기록차 남겨둠. 나는 이렇게 이해했는데, 아무래도 이 포스트는 오류를 포함하고 있을 가능성이 매우 높다. ㅋㅋ

일전에 Matrix factorization 이야기[2]를 했는데, 뭐 잘 모르지만 꽤나 광범위하게 쓰이는 추천 알고리즘 같다.

기계 학습을 시킬 때 학습대상의 특징을 뽑아내서 분류하고 학습하는 방식을 많이 쓰는 모양인데, 이 때 neighbor를 판정하는 방법으로 그냥 Euclidean space를 많이 쓰는 듯 하다. Matrix factorization도 오류 판정을 root mean squared를 일반적으로 쓰는 듯 한데, 이것도 일종의 Euclidean이라 봐야 할 듯 하다.

그런데 페이스북 소속 연구원 2명이 계층적 구조를 가진 데이터를 학습할 때 Euclidean 대신 Poincaré ball을 쓰면 더 나은 결과가 될 듯 하다는 주장을 하는 듯한-_- 글[3]을 대충 봤다. 아무래도 실제 회사들의 데이터들에서는 Zipf’s law처럼 값들이 한쪽에 쏠려있는 경우도 많으니까 그런 듯?

iHeartRadio라는 인터넷 라디오 방송 플랫폼이 있다고 한다. 나는 처음 들었는데 나름 꽤 큰 회사인 듯? 이 iHeartRadio 소속 4명의 연구원들이 Poincaré ball이 낫다는 주장[3]을 보고, 음악 추천에 시험해 본 듯 하다.[4] 음악의 메타데이터가 ‘장르-아티스트-곡명’ 과 같은 계층적 데이터라서 적용가능한 듯?

예를 들어 Matrix factorization으로 추천 목록을 만들면

The Shins – September
Lilly Hiatt – Jesus Would’ve Let Me Pick
METRIK – We Got It
Matrix & Futurebound – Magnetic Eyes
Dads – Dads (feat. Berried Alive & Lucas Mann)
Ugly Casanova – Spilled Milk Factory
Cursive – Ouroboros
Reggie and the Full Effect – Your Girlfriends
Hey Mercedes – What You’re Up Against
The Blood Brothers – Laser Life

와 같은 곡들이 추천되고, Poincaré 모델로 추천하면

The Strokes – Taken for a Fool
Arctic Monkeys – Brianstorm
The Strokes – 12:51
The Fratellis – Tell Me A Lie
Kings of Leon – Crawl
The Strokes – Is This It
Franz Ferdinand – Ulysses
Cage the Elephant – Shake Me Down (Unpeeled)
Death Cab for Cutie – Stay Young, Go Dancing
Kings of Leon – Notion

와 같은 곡들이 추천된다고 한다. 딱 봐도 완전 판이한 결과가 나온다. 근데 아는 아티스트가 하나도 없네-_- 요새는 맨날 아이돌 마스터 음악만 들어서…-_-

여하간 iHeartRadio에서는 사용자를 두 그룹으로 나누어 한 쪽은 푸앵카레 모델에 기반한 음악을 추천하고(treatment 그룹), 다른 한 쪽은 기존의 행렬 인수분해 기법에 기반한 음악을 추천하였더니(control 그룹), 평균 음악을 듣는 시간이 다음과 같게 나왔다고 한다.[4;p5]

헐.. 여러모로 월등히 우월하네. 현재 iHeartRadio에서는 푸앵카레 모델에 기반하여 디폴트 플레이리스트 생성기가 작동된다고 한다.

Matrix factorization을 이용한 학습 추천 시스템이 나름 꽤 널리 쓰인다고 들었는데, 산업의 종류에 따라서는 Poincaré model로 학습해서 추천하는 걸로 빠르게 바뀌지 않을까 싶은 생각도 든다. ㅎㅎ

.


[1] Music Recommendations in Hyperbolic Space (hacker news)
[2] 내 백과사전 영화 추천 알고리즘 : Matrix factorization 2019년 8월 4일
[3] “Poincaré Embeddings for Learning Hierarchical Representations”, Maximilian Nickel, Douwe Kiela arXiv:1705.08039 [cs.AI]
[4] “Music Recommendations in Hyperbolic Space: An Application of Empirical Bayes and Hierarchical Poincaré Embeddings”, Tim Schmeier, Sam Garrett, Joseph Chisari, Brett Vintch arXiv:1907.12378 [cs.IR]

영화 추천 알고리즘 : Matrix factorization

어쩌다보니 쓸데없이 Matrix factorization이라는 추천 알고리즘을 알게 됐는데, 내용이 조금 재미있어서 대충 글 써봄. 아마 넷플릭스가 이에 기반한 추천 시스템을 사용하는 듯 하다.

이를 상당히 잘 설명하는 어느 친절한 분들의 글들[1~6]이 있으니, 이를 보는 것을 권함.

타인이 좋아할만한 컨텐츠를 예측하는 것은 광고 효율성이나 매출 증진에 영향을 주므로 중요하다. 모르긴해도 Matrix factorization이 Netflix Prize에서 3위에 랭크된 이래로 대단히 널리 퍼져서 쓰이는 모양이다.

기본 아이디어는, 가로 행이 개별 유저가 영화에 준 평점이고, 세로 열이 영화별로 사람들에게 받은 평점인 거대한 matrix가 있다고 한다면, 이 matrix의 rank가 낮다고 가정하는 것이다. 음… 아무래도 비슷한 장르를 좋아하는 집단의 소속 멤버 끼리는 그 그룹에서 높게 평가한 다른 작품도 좋아할 듯 하니, 합리적으로 보인다. 여기서 matrix에서 비어있는 항목(즉, 아직 보지 않은 영화의 평점)을 예측하기 위해, matrix가 여러가지 방법(주로 singular value decomposition이 쓰이는 듯?)으로 분해된다면, 그 곱한 결과를 원래 matrix랑 에러(mean square가 주로 쓰이는 듯?)가 가장 적은 방향으로 때려 맞춰서, 원래 matrix의 비어있는 항목을 추정하는 방식 같다. 일전에 이야기한 Eigenface[7]와 뭔가 유사해 보인다.

비교적 단순해 보이는 방법인데, 의외로 성능이 무척 좋다고 한다.[3] 신박하구만. 사람의 선호가 꽤 다양해보여도 실제로는 그다지 그렇지도 않은 듯. ㅎㅎ

.


[1] 인터넷 속의 수학 – How Does Netflix Recommend Movies? (1/2) (sanghyukchun.github.io)
[2] 인터넷 속의 수학 – How Does Netflix Recommend Movies? (2/2) (sanghyukchun.github.io)
[3] Machine Learning 스터디 (17) Recommendation System (Matrix Completion) (sanghyukchun.github.io)
[4] Matrix Factorization _ Part 1 (worthpreading.tistory.com)
[5] Matrix Factorization _ Part 2 (worthpreading.tistory.com)
[6] Matrix Factorization _ Part3 (worthpreading.tistory.com)
[7] 내 백과사전 얼굴을 벡터로 만들다 : Eigenface 2013년 9월 30일

파이낸셜 타임즈의 404 not found 디자인

HTTP 표준 응답코드 중에서, 클라이언트의 브라우저 요청에 해당하는 파일을 찾을 수 없을 때, 서버에서 나오는 404 에러코드 메세지는 웹서핑하다보면 흔하게 볼 수 있다. 404 에러페이지는 서버 관리자의 센스에 따라서 다양한 디자인들이 있는데, 예전에 블룸버그의 404 에러페이지[1]가 열라게 웃겨서 해커 뉴스[2]에서 화제가 됐던 기억이 나는 구만. 지금 확인해보니 매우 평범한 디자인으로 변경되었다.

해커 뉴스[3]에 파이낸셜 타임즈 홈페이지의 404 not found 페이지[4]가 링크되어 있던데, 걸작이다. ㅎㅎㅎㅎ 대충 본인이 발번역해 봤다. ㅋ

.


왜 이 페이지를 찾을 수 없는가?

우리는 저명한 경제학자들에게 질문해 봤다.

//스태그플레이션
페이지 생산성이 감소하는 동안, 웹페이지 비용이 극적으로 증가하였다.

//일반 경제학
이를 위한 시장이 없다.

//유동성 함정
우리는 기술지원 팀에 추가 예산을 투입하였지만, 거의 interest(이자 or 흥미)가 없었고 그래서 그들은 그냥 내버려 뒀다. 따라서 이 페이지의 경제를 활성화하는데 실패했다.

//고전경제학
그런 페이지는 없다. 우리는 간섭하지 않을 것이다.

//케인지안 경제학
이 페이지의 총수요가 반드시 웹사이트의 생산력과 같아야 할 필요는 없다.

//신멜서스주의(Neo-Malthusianism)
제공하는 픽셀 대비 지수적으로 증가하는 페이지 수의 통제불능으로 인한 피할 수 없는 파국을 막기 위해, 우리는 이 페이지가 인식되는 것을 제한하였다.

//마르크스주의
이 페이지 로딩이 실패한 것은 생산의 자본주의에 대한 내재적 모순의 결과다.(아마 자본론의 어느 구절을 패러디 한 것으로 짐작되는데, 자본론을 읽어본 적이 없어서 대충번역함 ㅋㅋ)

//자유방임 자본주의
우리는 이 페이지가 필요함을 안다. 그러나 우리는 만들도록 강제할 수는 없다.

//통화주의
정부는 유통되는 페이지 총 수를 제한하였다.

//효율적 시장가설
당신이 이 페이지를 위한 충분한 돈을 지불한다면, 나타날 것이다.

//도덕적 해이
당신에게 이 페이지를 보여주는 것은, 단지 당신이 더 많은 페이지를 원하도록 자극하는 것일 뿐이다.

//공유지의 비극
모든 사람이 이 페이지를 보기를 원하지만, 아무도 유지보수하기를 원하지 않는다.

//게임 이론
이 페이지를 당신에게 안 보여줌으로써 다른 사람들이 더 나은 페이지를 보는데 도움이 된다.

//중상주의
이 페이지는 외국 웹서버로 호스팅되고 있고, 따라서 우리 자신의 소프트웨어 우월성을 보장하기 위해 배제되었다.

//낙수효과
기사 발행자의 높은 세금 때문에 이 페이지를 만드는 사람을 고용하지 못하고 있다.

//투기적 거품
이 페이지는 실제로 절대 존재한 적이 없고 근본적으로 불가능하다. 그러나 모든 사람이 광적으로 들어오려고 하고 있고, 이제 눈물로 끝이 났다.

//행동경제학
심리적 요인의 영향으로 당신은 순수하게 이성적 행동자이길 기대하지 않는 방향으로 행동하게 되었다.

//차선 이론(Theory of the second best) (이 용어는 처음 들어봤음-_-)
최선의 결과는 달성불가능하므로, 당신은 차선책에 도달하였다.

.


영국 자유민주당 홈페이지의 404 페이지[5]가 열라게 웃긴다 ㅋㅋㅋㅋㅋ 404 페이지에서도 상대당을 까는 센스-_-와 짤방-_-

.


2019.7.22
분명히 아까는 없었는데, 다시 확인해보니 새로운 항목이 생겼다. 아무래도 파이낸셜 타임즈 서버 관리자가 해커 뉴스를 보는 듯… 아닌가 내가 그냥 빠트린 건가-_-

//파레토 비효율
어느 누구든 더 나빠지지 않고 모든 사람이 더 나아지는 다른 페이지가 존재한다.

//맬서스주의
통제 되지 않은 지수적 페이지 증가는 픽셀 제공을 능가하였다. 파국은 존재하고, 지금 인구는 더 낮고 더 유지 가능한 수준이다.

.


2019.9.27

-_-

.


[1] This is on Bloomberg’s 404 page (imgur.com)
[2] 404. PAGE Not FOUND (hacker news)
[3] Why wasn’t this page found? (hacker news)
[4] 404 not found page (ft.com)
[5] Just like the Labour party’s plan to stop Brexit, this page cannot be found. (libdems.org.uk)

페이스북의 이미지 메타데이터 추적

페이스북의 사용자 추적은 악명이 높은데, 심지어 어카운트가 없는 사람들까지도 추적하고 있다고 해서 화제가 된 적[1]이 있었다. 이건 아마 쿠키를 추적한 듯 하다.

다른 사례로 언제부터인지 페북에 url을 링크하면 그 url 뒷부분에 fbclid 값을 자동으로 추가하던데, 이를 통해 링크가 어떻게 퍼지고 사람들이 링크를 어떻게 소비하는지 과정을 쉽게 추적할 수 있게 된 것 같다. 물론 본 블로그에서 제공하는 모든 링크들에는 fbclid가 제거되어 있다. ㅎㅎㅎ

오늘 해커 뉴스[2]를 보니 페이스북에 업로드한 이미지에는 페이스북에서 특별히 추적할 수 있는 메타데이터를 자동으로 삽입한다고 하는 트윗[3]이 언급된 것을 봤다. 와 페이스북 이 쉐이들 쫌 똑똑한 것 같다. ㅎㅎㅎ 이미지의 메타데이터 부분에 FBMD로 시작하는 문자 데이터열이 삽입되는 듯 하다.

4년전의 stack overflow 글[4]이 있는 걸 보면 이걸 시작한지는 상당히 오래된 듯. 이 글[4]에서 이미지 메타데이터를 볼 수 있는 Jeffrey’s Image Metadata Viewer라는 사이트[5]를 소개해 놓았던데, 본인도 예전에 받은 페북 이미지를 업로드해서 확인해보니, 역시나 FBMD로 시작하는 메타데이터 문자열이 들어있었다.

일전에 중국의 빅브라더 이야기[6]도 했지만, 원래 기술 대기업들은 사용자의 모든 데이터를 원한다. 요새 뜨는 기술들 중에 안구 추적을 연구하는 종류가 있다고 하던데, 아마 페북 등의 대기업들은 웹서핑 도중에 눈동자가 어디로 돌아가는지 실시간 추적하는데도 관심이 있을 듯. 이를 통해 사람들의 행동양식과 생활패턴을 추적하고, 어느 상황에서 지름신을 영접하고-_- 어느 상황에서 지불에 대한 저항을 갖는지에 대한 추적이 가능할 것 같다.

뭐 어디까지나 내 상상이지만, 각 개인별로 무슨 상황에서 뭘 보면 지갑을 여는지에 대한 궁극의 맞춤 설정 같은게 실현되면, 저축같은 건 아마 점점 더 하기 힘들 듯. ㅎㅎㅎㅎ

여하간 나날이 발전하는 페북의 잔머리에는 언제나 혀를 내두른다. 얼마전에는 Libra라는 걸 만들어서 세계 은행시스템을 통째로 몽땅 건너뛰고 개인-개인 간의 금융거래가 가능한 범세계적 플랫폼을 구축하려는 야심도 선보이던데, 이것 때문에 파월 의장님께서 좀 불편하신듯-_-[7] 앞으로 페북이 세계를 어떻게 바꿀지 흥미진진하다. ㅎㅎㅎ

.


2019.8.2
코인데스크 페이스북 “리브라 출시 포기할 수도 있다” 2019년 7월 31일 11:00

.


2019.9.4
이코노미 인사이트 ‘한 달 천하’ 페이스북 암호화폐 발행 2019년 08월 01일 (목)

.


[1] 로이터 Facebook fuels broad privacy debate by tracking non-users APRIL 15, 2018 / 8:04 PM
[2] Facebook is embedding tracking data inside the photos you download (hacker news)
[3] https://twitter.com/oasace/status/1149181539000864769
[4] IPTC metadata automatically added to uploaded images on Facebook (stackoverflow.com)
[5] Jeffrey’s Image Metadata Viewer (exif.regex.info)
[6] 내 백과사전 중국의 신용등급 문화와 빅브라더 2016년 12월 3일
[7] 로이터 Fed chief calls for Facebook to halt Libra project until concerns addressed JULY 10, 2019 / 11:58 PM

[서평] 실리콘밸리의 잘나가는 변호사 레비 씨, 스티브 잡스의 골칫덩이 픽사에 뛰어들다!

실리콘밸리의 잘나가는 변호사 레비 씨, 스티브 잡스의 골칫덩이 픽사에 뛰어들다!
로렌스 레비 (지은이),강유리 (옮긴이) 클레마지크 2017-06-14 원제 : To Pixar and Beyond (2016년)

.


이 책은 저자인 Lawrence Levy씨가 픽사가 무명이던 시절에 CFO로 영입되면서, 픽사가 성공하는 과정을 지켜본 자신의 경험담을 개략적으로 서술한 책이다. 과거 David A. Price의 ‘픽사 이야기'[1]를 읽은 적이 있는데, 그 책은 픽사의 탄생부터 전반적인 3D 애니메이션 기술사를 훑는 책이라면, 이 책은 재무와 경영적 관점에서 저자가 자신의 경험을 서술한 책이라 좀 다른 관점에서 흥미롭게 볼 수 있다.

저자는 처음 픽사를 보았을 때의 인상과 초창기 픽사가 처한 다양한 어려움에 대해 서술하면서 시작하는데, 객관적으로 봤을 때 당시에는 아무리 봐도 절망적인 상태였는 듯 하다. 지나고 봐서야 히트작이 연이어 나왔으니 그의 선택이 좋게 끝났지만, 나 같으면 도저히 픽사에 합류할 결정을 하지 못했을 듯 하다. ㅎㅎ

책 전반적으로 저자가 애니메이션 산업의 특성을 이해하려고 노력하고, 여러모로 계약을 진행하거나, 사람들 사이를 중재하거나, 사업 방향에 대해 모색하는 등 자신이 겪은 난항들에 대해 회고하는 내용으로 되어 있다.

책 제목에 잡스 이름이 있긴 하지만, 사실 잡스는 픽사가 어려울 때 꾸준하게 (투덜대면서-_-) 투자해 준 공로뿐이라 할 수 있을지도 모른다. 다만 일전에 월터 아이작슨잡스 전기[2]에서도 봤듯이 잡스의 면면을 볼 수 있는 일화도 약간 있다. 예를 들어 잡스는 자신의 견해를 고집할 때도 많지만 상대가 프로라고 인정되면 믿고 맡기는 이야기가 전기[2]에 나오는데, 투자자의 스토리에 대한 간섭이 일반화된 산업에서, 픽사 내부의 창작적 결정에 대해 독립성을 유지하게 해 준다.(p256) 이런 것들도 다 지나고나면 쉬워 보여도 당대에는 절대 쉽지 않은 결정이었을 것이라 본다. 어쨌건 잡스는 기술 산업과 엔터테인먼트 산업에 모두 걸친 사람으로서, 훗날 애플이 음악 등의 컨텐츠 사업으로 진출하는데 나름 장점이 되었을 것이다.

p279에 디즈니가 픽사를 인수하는 것이 RJR 내비스코 인수 이래로 두 번째로 큰 인수합병이라는 언급이 있는데, 이에 관해서 유명한 [3]이 있다. 이 책[3]이 엄청 재밌으니 일독을 권한다. ㅎㅎㅎ

저자는 픽사에서 10년 이상 일을 했다고 하는데, 책의 2/3 정도 분량은 픽사에 합류한 후 2년 정도의 기간에 할당하고 있다. 아무래도 픽사 초창기에 가장 위험했고 다이내믹한 기간이라 그런 듯 하다.

원제가 ‘To Pixar and Beyond: My Unlikely Journey with Steve Jobs to Make Entertainment History’라고 하는데, 원제보다는 역서 제목이 조금 더 적절한 듯 하여 마음에 든다. ㅎㅎ

텍스트의 분량이 약간 있긴 하지만, 전반적으로 평이한 내용이라 술술 읽힌다. 집중하면 한 나절에 완독할 수 있을 듯 하다.

.


[1] 내 백과사전 [서평] 픽사 이야기 PIXAR TOUCH : 시대를 뒤흔든 창조산업의 산실, 픽사의 끝없는 도전과 성공 2011년 5월 26일
[2] 내 백과사전 [서평] 스티브 잡스 2011년 11월 21일
[3] 내 백과사전 [서평] 문앞의 야만인들 : RJR내비스코의 몰락 2011년 5월 3일