Import Error: No module named _sqlite3

가 나오는 경우. config.log를 뒤져보면

checking for –enable-loadable-sqlite-extensions
result: no

와 같은 내용이 보인다. 빌드 과정에서 빠져버리므로 당연히 나중에 로딩할 수가 없다.

다음 옵션으로 configure후 다시 make한다.

./configure –enable-dynamic-extensions –enable-loadable-sqlite-extensions



#include <type_traits>

using namespace std;

struct A
{
public:

	A(){}

    static A& singleton() 
	{
		static A obj;

		return obj;
	}


private:
	A(const A&);
	A& operator=(A const&);
};

struct A_1
{
    static A& singleton() 
	{
		static A obj;

		return obj;
	}
};

struct B
{
	B& singleton()
	{
		return *this;
	}
};

struct C
{
	int singleton;
};

void global_func(){}



template<class T>
struct is_function_pointer 
{
private:
	template<class T> 
	struct is_function_pointer_impl
	{
		typedef typename std::remove_pointer<T>::type pointee;
		typedef typename std::is_function<pointee>::type type;
	};

	typedef typename std::conditional
		<std::is_pointer<T>::value, is_function_pointer_impl<T>, std::false_type>
		::type cond_result_t;

public:
	static const bool value = cond_result_t::type::value;
};

template<typename T>
struct has_singleton_accessor
{
private:
	typedef decltype(&T::singleton) func_t;

public:
	static const bool value = is_function_pointer<func_t>::value
						&& !std::is_member_function_pointer<func_t>::value;
};

template<typename T>
struct satisfy_singleton_requirement
{
	enum {
		value = !std::is_trivially_copy_constructible<T>::value
			&&  !std::is_trivially_copy_assignable<T>::value
	};
};


template<typename T>
struct is_singleton
{
	static const bool value = has_singleton_accessor<T>::value
						&&  satisfy_singleton_requirement<T>::value;
};

int main()
{
	static_assert(is_function_pointer<decltype(&A::singleton)>::value, "true.");
	static_assert(is_function_pointer<decltype(&global_func)>::value, "also true.");

	static_assert(is_member_function_pointer<decltype(&B::singleton)>::value
		, "true.");

	static_assert(is_member_function_pointer<decltype(&A::singleton)>::value
		, "but it's false because A::singleton is the static member");

	//therefore:
	static_assert(is_function_pointer<decltype(&A::singleton)>::value
				&& !std::is_member_function_pointer<decltype(&A::singleton)>::value
		, "this is how to check whether A::singleton is static member function.");


	static_assert(is_singleton<A_1>::value, "this type isn't singleton.");	//Err
	static_assert(is_singleton<B>::value, "this type isn't singleton.");	//Err
	static_assert(is_singleton<C>::value, "this type isn't singleton.");	//Err

	static_assert(is_singleton<A>::value, "that's it!");
}

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

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

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

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

 

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

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

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

참고 : 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에서만 발생하는 문제인 것 같다.


#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% 찍어본지가 오래됬기땜에..

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

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을 fstream으로 내보낼 때,

fstream file;
stringstream ss;

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

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

fstream file;
stringstream ss;

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

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 :)

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

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

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