Lua 테이블 내용 출력하기

Lua 테이블을 다루면서 내가 다루고 있는 Lua 테이블의 내용이 궁금해서 테이블 값 출력하는 함수를 만들었다.
별다른건 없고 그냥 테이블 순회하면서 테이블의 key와 value를 출력한다.
value를 출력할때는 boolean형과 string 연산을 할 수 없기 때문에 tostring()을 사용하여 value를 무조건 string으로 만들어서 출력하였다.
test_tbl = {
	t1 = {
		t1_a = 1,
		t1_sub = {
			t1_sub_b = 2,
		},
	},
	t2 = {
		t2_a = 3,
		t2_sub = {
			t2_sub_b = 4,
			t2_sub_sub = {
				t2_sub_sub_c = 5,
			},
		}
	},
}

function PrintTable(tbl, tbl_name, depth)
	if depth == nil then
		depth = 0
	end

	local tab
	for i=0, depth do
		if tab == nil then	tab = "" else tab = tab .. "\t" end
	end

	local sub_tbl = {}
	for k,v in pairs(tbl) do
		print(tab .. "TABLE:" .. tbl_name .. " KEY:" .. k .. "\tVALUE:" .. tostring(v))

		if type(v) == "table" then
			PrintTable(v, k, depth+1)
		else

		end
	end
end


결과를 보면 테이블의 값들이 표시되고 중첩테이블은 탭이 적용되어서 출력되고 있다.
한눈에 보일정도는 아니지만 테이블의 값 구성을 간단히 출력해서 확인하기에는 적절한듯하다.


'프로그래밍' 카테고리의 다른 글

Pointer Container, boost::ptr_vector<>  (0) 2012.02.21
Office Add-in 만들기.  (0) 2012.02.08
Lua Table 복사에 대한 처리  (0) 2012.01.16
Cafe24 가상 호스팅 - 1(선택)  (0) 2011.12.02
Lua의 주석처리  (0) 2011.11.27

Lua Table 복사에 대한 처리

Lua에서 테이블을 다른 변수에 대입(=)하게 되면 기본적으로는 참조 값 변경이 발생합니다.
즉, 참조 값이 생성되는 것이기 때문에 한 테이블에서의 변경이 다른 테이블의 값에 영향을 끼치게 됩니다.
TestTable = {
	t1 = {
		a = 10,
		b = 20,
	}
}
TestTable 을 변수에 할당하는 경우 변수의 참조값이 테이블로 지정되기 때문에 값이 변경되면
테이블 자체의 값이 변경되기 때문에 같은 참조값을 가지는 모든 객체들이 영향을 받습니다.
test1 = TestTable
test2 = TestTable

print("Source A:" .. TestTable.t1.a)

test1.t1.a = 20

print("Test1 A:" .. test1.t1.a)
print("Test2 A:" .. test2.t1.a)
Source A:10
Test1 A:20
Test2 A:20

참조 테이블의 값이 변경되었기 때문에 해당 테이블을 참조하고 있는 test2의 값도 변경되었습니다.

원하는 것은 테이블의 값복사.
Lua에서 기본적으로 제공되는 다른 방법이 있는지는 모르겠지만..
일단 쉽게 검색하고 적용시킨것은 정말로 테이블을 복사하는 방법.
직접 찾은건 아니고, stackoverflow 검색에서 나온 방법을 조금 변경한것입니다
function TableCopy(t)
  local t2 = {}
  for k,v in pairs(t) do
	if type(v) == "table" then
		t2[k] = TableCopy(v)
	else
		t2[k] = v
	end
  end
  return t2
end
함수 이름은 어찌되었든.. 내부적으로 테이블을 생성해서 값을 복사하여 새로 생성한 테이블을 반환합니다
값이 table인 경우에 대한 처리도 있으니 테이블이 깊이가 있는 경우도 처리하고 있습니다.
test1 = TableCopy(TestTable)
test2 = TableCopy(TestTable)

print("Source A:" .. TestTable.t1.a)

test1.t1.a = 20

print("Test1 A:" .. test1.t1.a)
print("Test2 A:" .. test2.t1.a)
같은 로직을 TableCopy를 이용해서 작성하면 test2에 영향없이 test1의 값에만 변경이 있음을 확인할 수 있습니다.
Source A:10
Test1 A:20
Test2 A:10

stackoverflow의 문서에는 여러가지 방법이 나와있고, 그중 하나의 방법을 적용해서
간단한게 원하는 결과가 나오는지를 테스트한 거라 의도치 않게 문제가 있는 로직일 수있습니다.
혹시 문제가 있는 부분에 대해서는 언제든 의견을 남겨주세요. 

'프로그래밍' 카테고리의 다른 글

Office Add-in 만들기.  (0) 2012.02.08
Lua 테이블 내용 출력하기  (0) 2012.01.28
Cafe24 가상 호스팅 - 1(선택)  (0) 2011.12.02
Lua의 주석처리  (0) 2011.11.27
[ERROR] Could not find Git Path  (0) 2011.04.18

Cafe24 가상 호스팅 - 1(선택)

호스팅을 이용할일이 있어서 여기저거 정보를 알아보던중,
가상서버호스팅이란 것에 대해서 알게되었고 좀더 찾아보니 나름 솔깃한 것들이 많았다.

리눅스의 root 권한을 가지고 알아서 잘 쓰라니.. 오홍.. 좋군.
이제 관심사는 가상서버호스팅으로 변경되어 여기저기 살펴보았다.

가상서버호스팅을 해주는 여러 회사들을 비교하며 좋고 나쁨을 비교해주는 사이트들도 많이 있었지만
가격대비 무난하다고 생각되는 cafe24의 가상서버 호스팅을 선택하게 되었다.

램 512, 하드 20GB, 트래픽 100G/월에 가격은 5500원/달.

어차피 간단한 홈페이지와 위키정도 그리고 약간의 웹프로그래밍 테스트 정도여서 적당하다고 생각한다.
100G정도면 뭐.. 추가 트래픽이 발생할리도 없을테고.. 5,500원이라는 가격때문에 선택한것일지도.

신청하면서 OS에 대한 선택도 해야 한다
64bit CentOS 5.x / Fedora 11/ Ubuntu 10.04' 

대학졸업한 이후로는 리눅스쪽을 다뤄보지 못해서 뭐가 괜찮은지 알지 못한 상태에서 그냥 CentOS를 선택.
CentOS는 APM을 포함해서 설치할건지, OS만 설치할건지를 구분할 수 있어서 귀찮은거 포기하고 APM 포함해서 설치.

putty를 사용해서 SSH로 root 계정으로 접속한 첫 느낌은.
도대체 뭘해야할지 모르겠다.

리눅스도 기억이 가물가물한데 계정은 root여서 잘못만지면 골치아플것 같았다. 읔..

'프로그래밍' 카테고리의 다른 글

Lua 테이블 내용 출력하기  (0) 2012.01.28
Lua Table 복사에 대한 처리  (0) 2012.01.16
Lua의 주석처리  (0) 2011.11.27
[ERROR] Could not find Git Path  (0) 2011.04.18
TortoiseGit에서 ignore 파일 설정하기  (0) 2011.04.10

Lua의 주석처리

Lua에서 주석을 처리하는 방법은 크게 3가지 방법이 존재한다

1. 한줄 주석
루아에서는 한줄 주석으로 -- 를 사용할 수 있다
-- local a = 10
local b = 10
2. 블록 주석
루아에서는 블록 주석으로 --[[ ]]를 사용할 수 있다
--[[
local a = 10
]]
--[[
local b = 10
--]]
]]와 --]]는 같은 의미로 사용할 수 있다.

3. 확장된 블록 주석
블록 주석을 확장하여 사용할 수 있는 방법이 있다.
--[=[와 같이 [[사이에 =를 넣어 사용하는 방법이다.
--[=[
local a = 10
]=]
주의할 점은 =의 개수가 동일해야지만 루아에서 주석으로 인식한다는 점.
--[==[
local a = 10
]=]
이것은 =의 개수가 서로 맞지 않기 때문에 ]=]를 주석해제로 인식하지 않는 문제가 발생한다.
SyntaxHighlighter의 문제로 페이지에서 주석처리는 안되지만, 실제 루아에서 테스트해보면
확장된 블록 주석을 쓸수있습니다~

[리뷰] 실용주의 프로그래머

우연에 맡기는 프로그래밍

우리는 우연에 맡기는 프로그래밍, 곧 행운과 어쩌다 오는 성공에 의존하는 프로그래밍을 하지 말아야한다.

대신 의도적으로 프로그래밍(Programming deliverately)해야한다.

 

코드를 조금 작성해서 테스트해보고 잘되기 때문에 다시 코드를 작성하고 테스트 하다가 에러가 발생하고 작동하지 않게되면

코드를 살펴보고 수많은 시간을 쏟아도 고칠 가능성은 희박하다.  어떤 시도를 해봐도, 코드는 제대로 돌아가지 않는다.

이유는 코드가 처음부터 왜 잘 돌아가는지도 몰랐기 때문이다. 한정된 테스트를 했을때 코드가 잘 돌아가는 것처럼 보였지만,

그것은 단지 그때 운이 좋았을 뿐이다. 근거가 없는 확신을 가지고 계속 진행했기때문에 실패를 맛본것이다.

 

  • 정말로 제대로 돌아가는 것이 아닐지도 모른다. 우리에게만 그런 것처럼 보일 수도 있다.
  • 여러분이 의존하는 조건이 단지 우연인 경우도 있다. 다른 상황에서는 이상하게 작동할지도 모른다.
  • 문서화되지 않는 동작은 라이브러리의 다음 릴리스에서 변경될 가능성이 있다.
  • 불필요한 추가 호출은 코드를 더 느리게 만든다.
  • 추가로 호출한 루틴 때문에 새로운 버그들이 코드에 들어올 가능성이 있다.


자신을 위해 만들어진 코드를 정말로 이해하지 못하는 한, 자기 자신을 속이는 것이다. 우연에 맡기는 프로그래밍을 하고 있다.

마법사는 평범한 개발자의 애플리케이션에 통합되어 뗄레야 뗄 수 없는 부분이 되는 코드를 생성한다.

마법사 코드는 깔끔한 인터페이스 뒤로 옮겨놓을 수 없다. 마법사가 생성한 코드는 평범한 개발자가

작성하는 기능과 줄 단위로 섞인다. 결과적으로 그 코드는 마법사의 코드이기를 관두고 평범한 개발자 자신의 코드가 되기 시작한다.

그리고 누구도 자신이 완전히 이해하지 못하는 코드를 내놓아서는 안 된다.

불가능한 퍼즐 풀기

  • 풀리지 않는 문제와 마주쳤다면, 생각해 볼 수 있는 모든 가능한 해결 경로를 눈앞에 나열해보라.
    아무리 쓸모없고 바보같이 보이는 경로라도 절대 버리지 말라. 이제 목록을 하나씩 점검하면서 왜 그 경로를 따라갈 수 없는지 설명해 보라.
    정말 확신하는가? 증멸할 수 있는가?
    제약들을 범주별로 나누고 우선순위를 매겨라. 목공은 어떤 일을 시작할 때 그일에서 필요한 가장 긴 조각을 먼저 자르고, 남은 나무에서
    작은 조각들을 잘라낸다. 비슷한 방식으로, 우리도 제일 구속이 심한 제약들로부터 파악해 내고 나머지 제약들을 그 안에서 맞춰보아야 한다.
  • 불가능한 문제 대문에 일정이 늦어질 수 있다.

    • 더 쉬운 방법이 존재하는가?
    • 왜 이것이 문제인가?
    • 진짜 문제를 풀려고 노력하고 있나. 그렇지 않다면 중요하지 않은 기술적 문제에 정신이 팔려 있는것인가?
    • 문제를 이렇게 풀기 어렵게 만드는 것이 무엇인가?
    • 반드시 이 방법으로 해야 하는가?
    • 반드시 해야 하는 일이긴 한가?

 

실용주의 팀

  • 팀이 하나로서 의사소통하게 도와주는 간단한 마케팅 비결이 있다.  프로젝트를 시작할 때 이름을 지어주는 것이다. 유별난 이름이라면 더 좋겠다.
    30분정도 투자해서 멍텅구리 로고를 만들어 메모나 보고서 등에 사용하라. 
    사람들과 대화를 할때에 자신의 팀 이름을 거리낌 없이 사용하라.
    바보같이 들리지만, 팀은 정체성 확립의 기반을 얻을 것이고, 세상은 여러분의 작업과 관련되어서 기억할 만한 뭔가를 얻게 될 것이다.

 

결국은 모두 글쓰기(실용주의 프로그래머,p385)

소스코드 주석에 나오지 말아야 할 것들의 목록

  • 파일 내의 코드가 익스포트(export)하는 함수들의 목록
    소스를 분석해서 함수 목록이 최신버전임을 보장받을 수 있는 프로그램이 있다.
  • 리비전 기록
    소스코드 관리 시스템이 해주는 일이다. 하지만 최종 수정 날짜와 최종 수정자에 대한 정보를 포함하는것은 유용할 수 있다.
  • 이 파일이 사용하는 파일 목록
    자동화 도구를 사용하면 훨씬 더 정확한 목록을 얻을 수 있다.
  • 파일 이름
    만약 이것이 파일 속에 드러나야 한다면 수작업으로 관리하면 안된다. RCS나 유사 시스템이 이 정보를 최신의 것으로 자동 관리한다.

 

소스파일에 나타나야만 하는 가장 중요한 정보

  • 저자의 이름, 소유자의 이름

 

서명하라.

  • 여러분의 서명이 품질의 보증 수표로 인식되게 해야한다. 사람들이 코드에 붙여진 여러분의 이름을 보고
    그것이 튼튼하고 잘 작성되고 제대로 테스트되었으며 또 훌륭히 문서화되었을 것이라고 기대하도록 만들자.
    진정한 프로페셔널한 일. 진정한 프로페셔널이 작성한.

이 글은 스프링노트에서 작성되었습니다.