바이오스 포스팅이 느린 경우

Windows 8.1을 쓰기 위해 256g SSD를 설치했더니 바이오스 포스팅이 몇분씩 걸리는 사태가 벌어졌다.

설치가 잘못되었거나 바이오스에 문제가 생겼거나 둘중 하나겠지 싶어 바이오스를 업데이트했는데도 문제가 사라지지 않았다.

그런데 검색결과 CD드라이브의 문제일 수 있다고 한다.

즉시 전원을 끄고 CD드라이브를 연결한 SATA 케이블을 제거했더니 정상속도로 부팅한다.

 

케이스 내부 청소 후 SATA케이블 재배치할 때 CD드라이브까지의 거리가 멀어서 좀 무리해서 끼웠더니 발생했던 문제인 듯 하다.

케이블 하나 때문에 재부팅이 안되거나 제어판이 안열리거나 프로그램 실행이 제대로 안되거나 하는 문제가 발생할 수 도 있음을 알았다.

소프트웨어를 쓰기 위한 도구이지만 본질은 하드웨어의 집합체인 것을 잊었던 듯.

C++11 thread 객체를 static 또는 전역에서 선언했을 때 발생하는 deadlock

참고 : http://stackoverflow.com/questions/10915233/stdthreadjoin-hangs-if-called-after-main-exits-when-using-vs2012-rc

std::thread 객체를 Windows에서 static으로 사용하는 경우.
join을 호출하면 내부 API가 락을 시도하는데, 프로세스 종료 시점에서 join을 시도하면,

  1. main() 이 반환된다.
  2. 메인스레드가 종료를 위해 프로세스 내부적으로 사용되는 특정한 lock을 건다.
  3. 전역 객체들에 대해 소멸자를 호출하는데 소멸자가 std::thread::join을 호출한다면,
  4. child 스레드가 자신의 종료를 위해 프로세스에 lock을 시도하는데 이미 메인스레드가 lock을 잡고있다.
  5. DEADLOCK.

스택오버플로의 게시물에 의하면 Windows에서만 발생하는 문제인 것 같다.

Google C++ 튜토리얼 연습문제


#include <cstdint>
#include <chrono>
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>

using namespace std;
using namespace std::chrono;
typedef duration<float> fsec;

auto started = steady_clock::now();
atomic<int> counter = 0;

inline int GetNumber()
{
	return ++counter;
}

inline int64_t SigmaN(int64_t n) // to avoid overflow
{
	return n * (n + 1) >> 1;
}

int SerialN(int n)
{
	for (int i = 0; i < n ; ++i)
	{
		if (SigmaN(i) == n)
			return i;
	}

	return 0;
}

int IsPerfectSquare(int n)
{
	if (n < 0)
		return 0;

	int root = (int)(sqrt(n));

	return n == root * root ?
					root : 0;
}

void Work()
{
	while (true)
	{
		int number = GetNumber();

		if (0 > number)
			break; // until overflow

		int root = IsPerfectSquare(number);

		if (0 < root)
		{
			auto last_of_serial = SerialN(number);

			if (0 < last_of_serial)
			{
				//print elapsed time
				printf("%d = %d^2 = sum(1..%d)n %0.2f secn",
					number, root, last_of_serial,
					duration_cast<fsec>(steady_clock::now() - started).count()
					);
			}
		}
	}//while
}



int main (void)
{
	const size_t sizeofThread = 9;

	vector<thread> workers;

	for (int i = 0; i < sizeofThread; ++i)
	{
		workers.push_back(thread(Work));
	}

	for (auto& t : workers)
		t.join();
}

굳이 멀티스레드로 돌려본건 cpu 100% 찍어본지가 오래됬기땜에..

Ubuntu/d key shows desktop over Xrdp

구글링으로 답을 찾으려고 해서 상당히 오래 걸렸기에 기록을 해둔다. 우분투 위키에서 답을 찾음.

System Tools/System Settings/Keyboard/Shortcuts/Navigation/Hide all normal windows 라는 항목이 있으나 이 항목의 숏컷을 제거해도 d키를 눌렀을 때 Super(윈도키)+d로 인식하는 상태는 변함이 없다.

global key binding이 따로 있어서 이쪽에서 제거를 해줘야 한다.

System Tools/dconf Editor를 실행하고 org.gnome.desktop.wm.keybindings/show-desktop 항목의 배열을 모두 제거하거나 원하는 다른 내용으로 수정하고 시스템을 재시작하면 더이상 숏컷이 동작하지 않는다.

 

대상 환경 : Ubuntu 13.04

stringstream 사용하기

stringstream을 fstream으로 내보낼 때,

fstream file;
stringstream ss;

file << ss; // 스트림 자체를 덤프할 뿐 스트림 안의 내용이 기록되지 않는다.
file << ss.rdbuf(); // 스트림 안의 버퍼를 덤프한다. 파일에 내용이 제대로 작성된다.

stringstream으로 입력받을 때도 마찬가지. 흔히 내장 타입에 받듯 >>연산자를 사용하지 않고 raw buffer를 그대로 stringstream에 “출력“한다.

fstream file;
stringstream ss;

ss << file.rdbuf(); //보기엔 별로 좋지 않아도 최선의 효율적인 방식.

SyntaxHighlighter Evolved : D Brush

I’ll share my add-on: the D language brush for SyntaxHighlighter Evolved, the WordPress plugin. Author of “Evolved” recommands that instead of adding unsupported/unofficial brushes into third-party-brushes directory of his plugin, users should write a NEW plugin that they need for themselves.

Btw, here’s the file.

shBrushD

You may download this, upload to your WordPress blog, and activate manually. Feel free to use it :)

googletest를 vs2012에서 쓰기

gtest1.6을 vs2012에서 빌드하면
error C2977: ‘std::tuple’ : too many template arguments

따위의 에러를 마구 뱉는다. 스택오버플로에서 찾아보면 MS 블로그의 링크를 주는데, C++11 core feature 중 하나인 variadic template을 VC11이 제대로 지원하지 않기 때문이라고 한다.

Faux Variadic 항목을 참고해 _VARIADIC_MAX=10 정도로 매크로를 정의하면 일단 빌드할 수 있다.

size_t의 정의

왜 size_t를 쓰는가 하는 문제에 대해.

C++11표준 문서 1에 의하면. size_t는 다음과 같이 정의된다.

The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size
in bytes of any object. 2

pros:

  • size_t를 사용하는 것은 해당 변수가 바이트 단위 크기를 표현하는 데 사용할 용도임을 직접 명시하므로 unsigned int를 사용하는 것보다 코드 가독성 향상에 도움이 된다.
  • 아직까지도 x86-32가 주류인 현재, size_t를 사용해 작성한 코드는 x64로 넘어간 후에도 컴파일하는 데 아무런 지장이 없을 것이다.

cons:

당장 생각하면 없는 듯? 취향상의 문제는 있을지도.

 

참고: 임베디드 환경에서의 호환성과 size_t의 문제.

 

 

Notes:

  1. draft. 공짜. 정식은 $30 @ansi.org
  2. 18.2.6항목

FBX SDK 2013.x 삽질

VS 2012에서 FBX SDK 2013.3을 써서 씬 읽어들이려고 별의 별 삽질을 다 해봐도 FbxMesh::mPolygons가 쓰레기값인 상태를 해결할 수가 없었다. 2013.x는 VS2010을 지원하고, 구글링해보면 VS2012갖고 FBX loader를 만들었던 사례가 보여서 계속 시도하고 있었는데,

모든것이 삽질이었다.

플랫폼 툴셋을 v100으로 맞추면 정상적으로 동작한다. 결론적으로 SDK 2013.x는 VS2012환경에서 사용할 수 없다.

현재 beta상태인 2014.x가 VS2012 지원을 포함하고 있다는 소문을 듣고 오토데스크에 메일 보내서 베타 신청까지만 해뒀다.