'분류 전체보기'에 해당되는 글 126건

  1. 2012.09.13 SSE2를 이용한 행렬 곱하기 1
  2. 2012.09.11 행렬 곱 row만으로 연산하기
  3. 2012.09.09 c++ vector 등 연속 메모리 컨테이너를 배열처럼 쓰는 방법
  4. 2012.09.01 multimap에서 equal_range()로 아무것도 못찾은 경우
  5. 2012.08.29 cocos2d-x Sprite의 이미지를 바꾸기
  6. 2012.08.29 cocos2d-x "color type 6"
  7. 2012.08.28 cocos2d-x CCTextureCache::sharedTextureCache()->textureForKey()
  8. 2012.08.27 STL iterator로 erase()사용시 주의해야할 점
  9. 2012.08.24 cocos2d-x addChild()와 onEnter()
  10. 2012.08.24 cocos2d-x HelloWorld 실행시 오류 1
  11. 2012.08.24 ISO 파일 여는 방법
  12. 2012.08.23 '닮았지만 다른 운명'… 킨과 안드로이드의 숨은 이야기
  13. 2012.08.23 C# GeneralSort, ThreadSort, ParallelSort
  14. 2012.08.23 C# Enumerator
  15. 2012.08.23 C#에서 프로세서 개수 알아내기
  16. 2012.08.22 C# 및 SQL 강좌
  17. 2012.08.22 다익스트라와 벨만 포드 알고리즘 2
  18. 2012.08.22 Negative-weight percolation
  19. 2012.08.22 SDL Security Develoment Lifecycle
  20. 2012.08.22 ADVANCED MVVM에서 소개한 WPF & MVVM 패턴 사이트
  21. 2012.08.22 Metro 스타일 UX 가이드
  22. 2012.08.22 Microsoft LightSwitch
  23. 2012.08.22 k팝과 관련하여...
  24. 2012.08.22 워드프레스(WordPress), 드루팔(Drupal), 줌라(Joomla) 비교 1
  25. 2012.08.22 e-book 전자책 및 단말기 시장의 3파전
  26. 2012.08.22 windows azure 소개
  27. 2012.08.22 Amazon 클라우드 EC2 소개
  28. 2012.08.22 Web framework에 대해..
  29. 2012.08.22 MariaDB란..
  30. 2012.08.21 cocos2d-x sharedDispatcher()대신 sharedDirector()->getTouchDispatcher()

기본적으로 Visual studio 2010을 기준으로 설명하되, 소스코드는 gcc에서도 문제없이 작동한다.


SSE2를 사용하기 위해서는 [Project properties]에서 C/C++의 Code Generation 부분에서 

Enable Enhanced Instruction Set을 /SSE2로 세팅한다. 


그리고 다음 헤더 파일을 추가한다.

#include <xmmintrin.h>



행렬의 구조체는

typedef struct _Matrix

{

int row, col;

float **matrix;

} Matrix;

와 같이 만든다. row와 col은 각각 행과 열의 크기(길이)를 뜻한다.


SSE2를 사용할 때는 기본적으로 float 4개를 한번에 연산하는 것을 목표로 한다.

(double같은경우 2개를 한번에 연산)





행렬의 실제 값이 들어갈 2차원 배열은, malloc()가 아닌 _aligned_malloc()를 이용해야 한다.

2차원 배열을 동적으로 만들때, 열 배열을 가리킬 행 배열은 malloc()로 할당해도 상관없지만,

열 배열은 반드시 _aligned_malloc()로 할당해야 하는데, 이유는 최소한 4개의 float공간이 

물리적으로 연속적으로 할당받음이 보장되어야 하기 때문이다.


malloc()로 연속적으로 할당해도, 가상메모리상에서만 연속일뿐, 실제로는 연속적이지 않다.

_aligned_malloc()에서 첫번째 인자는, malloc()에서의 첫번째 인자와 같은 의미로 사용하면 된다.

할당받을 배열의 길이를 첫번째 인자로 넣어준다.

그리고 _aligned_malloc()의 두번째 인자는, aligned되어야 할 크기를 넣어줘야 한다.

즉, 반드시 연속적으로 할당해야할 크기를 말한다.

float 4개를 연속해서 받아야 하기 때문에, sizeof(float) * 4를 두번째 인자로 넣어준다. (즉, 16)


float **make2dArray(int rows, int cols)

{

float **x = NULL;

int height = cols, width = rows;

x = (float **)malloc(height*sizeof(float*));

for(int i=0; i<height; i++){

x[i] = (float *)_aligned_malloc(((width*sizeof(float)+15)>>4)<<4, 16);

}


return x;

}



해제 역시 _aligned_free()로 해제한다.


void delete2dArray(float **arr, int rows, int cols)

{

if( arr != NULL ){

for(int i=0; i<cols; i++){

_aligned_free(arr[i]);

}

free(arr);

}

arr = NULL;

}




다음과 같은 함수가 있으면 테스트하기 편하다.


void initRandom(Matrix& m)

{

for(int i=0; i<m.col; i++){

for(int j=0; j<m.row; j++){

m.matrix[i][j] = (float)(rand()%4);

}

}

}

void initZero(Matrix& m)

{

for(int i=0; i<m.col; i++){

for(int j=0; j<m.row; j++){

m.matrix[i][j] = (float)(0.0f);

}

}

}

bool makeMatrix(Matrix& m, int col, int row)

{

m.matrix = make2dArray(row, col);

m.col = col;

m.row = row;

return true;

}

bool deleteMatrix(Matrix& m)

{

delete2dArray(m.matrix, m.row, m.col);

m.col = 0;

m.row = 0;

return true;

}



SSE2를 사용하지 않고, 두 행렬 m1, m2를 곱하려면 다음과 같이 구현하면 된다.


bool Multiply(Matrix& m1, Matrix& m2, Matrix& res)

{

bool bRet = false;

do

{

if( m1.row != m2.col ) break;

if( m1.col != res.col ) break;

if( m2.row != res.row ) break;


for(int i=0; i<m1.col; i++){

for(int j=0; j<m2.row; j++){

float e = 0.0f;

for(int k=0; k<m1.row; k++){

e += m1.matrix[i][k] * m2.matrix[k][j];

}

res.matrix[i][j] = e;

}

}


bRet = true;

} while(0);


return bRet;

}




SSE2를 이용한 행렬 곱 함수이다.


bool MultiplySSE(Matrix& m1, Matrix& m2, Matrix& res)

{

if( m1.row != m2.col ) break;

if( m1.col != res.col ) break;

if( m2.row != res.row ) break;


initZero(res);


for(int i=0; i<m1.col; i++) {

for(int j=0; j<m1.row; j++) {

int k = 0;

int n = (m2.row - (m2.row % 4))/4;

__m128 sse_m1 = _mm_set1_ps(m1.matrix[i][j]);

while( n --> 0 ){

__m128 *sse_mR = (__m128 *)(res.matrix[i]+k);

__m128 *sse_m2 = (__m128 *)(m2.matrix[j]+k);

*sse_mR = _mm_add_ps(*sse_mR, _mm_mul_ps(sse_m1, *sse_m2));

k += 4;

}

switch( m2.row - k ) {

case 3: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 2: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 1: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

}

}

}

}


4의 배수만큼은 sse로 계산하고, 나머지 부분은 그냥 평범하게 계산하였다.

여기서 순서가 중요하다.

열의 크기가 23인 행렬을 계산할 경우, 4개의 float를 한번에 5번 sse로 계산한뒤, 나머지 3개를 계산하면 문제없다. 하지만, 먼저 3개를 계산하고나서, 5번의 sse연산을 할 경우 문제가 된다.

이유는 열 벡터를 0번째부터 aligned되게 할당하였기 때문이다.

즉, _aligned_malloc( 23, 4*sizeof(float) )으로 할당한 경우, 메모리는

[3][4][4][4][4][4] 가 아니라

[4][4][4][4][4][3] 처럼 배치된다.

따라서 remain 3은 맨 마지막에 고려해야 한다.



main()에서는 다음과 같이 테스트하였다.


int main(int argc, char *argv[]){

,,, 생략 ,,,


makeMatrix(m1, i, j);

makeMatrix(m2, j, k);

makeMatrix(res1, m1.col, m2.row);

makeMatrix(res2, m1.col, m2.row);


initRandom(m1);

initRandom(m2);


Multiply(m1, m2, res1);

MultiplySSE(m1, m2, res2);


,,, 생략 ,,,

}





Posted by Нуеоп

bool Multiply2(Matrix& m1, Matrix& m2, Matrix& res)

{

bool bRet = false;

do

{

if( m1.row != m2.col ) break;

if( m1.col != res.col ) break;

if( m2.row != res.row ) break;


initZero(res);


for(int i=0; i<m1.col; i++){

for(int j=0; j<m1.row; j++){

for(int k=0; k<m2.row;){

int n = m2.row - k;

switch( n % 4 ) {

case 0: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 3: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 2: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 1: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

}

}

}

}


bRet = true;

} while(0);


return bRet;

}













#include <stdio.h>

#include <stdlib.h>


typedef struct _Matrix

{

int row, col;

float **matrix;

} Matrix;


typedef struct _Point

{

int x, y;

} Point;


typedef struct _Rect

{

Point st, ed;

} Rect;


bool mult(Matrix& m1, Rect& r1, Matrix& m2, Rect& r2, Matrix& res, Rect& r3)

{

bool bRet = false;

do

{

int col1 = r1.ed.y - r1.st.y;

int row1 = r1.ed.x - r1.st.x;

int col2 = r2.ed.y - r2.st.y;

int row2 = r2.ed.x - r2.st.x;

int col3 = r3.ed.y - r3.st.y;

int row3 = r3.ed.x - r3.st.x;

if( row1 != col2 ) break;

if( col1 != col3 ) break;

if( row2 != row3 ) break;

if( col1 < 0 || row1 < 0 || col2 < 0 || row2 < 0 ) break;

if( col1 != col3 || row2 != row3 ) break;


for(int i=0; i<col1; i++){

for(int j=0; j<row2; j++){

float e = 0.0f;

for(int k=0; k<row1; k++){

e += m1.matrix[r1.st.y+i][r1.st.x+k] * m2.matrix[r2.st.y+k][r2.st.x+j];

}

res.matrix[r3.st.y+i][r3.st.x+j];

}

}


bRet = true;

} while(0);


return bRet;

}


bool add(Matrix& m1, Rect& r1, Matrix& m2, Rect& r2, Matrix& res, Rect& r3)

{

bool bRet = false;

do

{

int col1 = r1.ed.y - r1.st.y;

int row1 = r1.ed.x - r1.st.x;

int col2 = r2.ed.y - r2.st.y;

int row2 = r2.ed.x - r2.st.x;

int col3 = r3.ed.y - r3.st.y;

int row3 = r3.ed.x - r3.st.x;

if( row1 != row2 || row1 != row3 ) break;

if( col1 != col2 || col1 != col3 ) break;

if( col1 < 0 || row1 < 0 || col2 < 0 || row2 < 0 ) break;

if( col1 != col3 || row2 != row3 ) break;


for(int i=0; i<col1; i++){

for(int j=0; j<row1; j++){

res.matrix[r3.st.y+i][r3.st.x+j] = m1.matrix[r1.st.y+i][r1.st.x+j] + m2.matrix[r2.st.y+i][r2.st.x+j];

}

}


bRet = true;

} while(0);


return bRet;

}


bool sub(Matrix& m1, Rect& r1, Matrix& m2, Rect& r2, Matrix& res, Rect& r3)

{

bool bRet = false;

do

{

int col1 = r1.ed.y - r1.st.y;

int row1 = r1.ed.x - r1.st.x;

int col2 = r2.ed.y - r2.st.y;

int row2 = r2.ed.x - r2.st.x;

int col3 = r3.ed.y - r3.st.y;

int row3 = r3.ed.x - r3.st.x;

if( row1 != row2 || row1 != row3 ) break;

if( col1 != col2 || col1 != col3 ) break;

if( col1 < 0 || row1 < 0 || col2 < 0 || row2 < 0 ) break;

if( col1 != col3 || row2 != row3 ) break;


for(int i=0; i<col1; i++){

for(int j=0; j<row1; j++){

res.matrix[r3.st.y+i][r3.st.x+j] = m1.matrix[r1.st.y+i][r1.st.x+j] - m2.matrix[r2.st.y+i][r2.st.x+j];

}

}


bRet = true;

} while(0);


return bRet;

}


float **make2dArray(int rows, int cols)

{

float **x = NULL;

int height = cols, width = rows;

x = (float **)calloc(height, sizeof(float*));

x[0] = (float *)calloc(width*height, sizeof(float));

for(int i=1; i<height; i++)

x[i] = x[i-1]+width;

return x;

}


void delete2dArray(float **arr)

{

if( arr != NULL ){

if( arr[0] != NULL )

free(arr[0]);

free(arr);

}

arr = NULL;

}


void initRandom(Matrix& m)

{

for(int i=0; i<m.col; i++){

for(int j=0; j<m.row; j++){

m.matrix[i][j] = (float)(rand()%4);

}

}

}


void initZero(Matrix& m)

{

for(int i=0; i<m.col; i++){

for(int j=0; j<m.row; j++){

m.matrix[i][j] = (float)(0.0f);

}

}

}


bool Multiply(Matrix& m1, Matrix& m2, Matrix& res)

{

bool bRet = false;

do

{

if( m1.row != m2.col ) break;

if( m1.col != res.col ) break;

if( m2.row != res.row ) break;


for(int i=0; i<m1.col; i++){

for(int j=0; j<m2.row; j++){

float e = 0.0f;

for(int k=0; k<m1.row; k++){

e += m1.matrix[i][k] * m2.matrix[k][j];

}

res.matrix[i][j] = e;

}

}


bRet = true;

} while(0);


return bRet;

}


bool Multiply2(Matrix& m1, Matrix& m2, Matrix& res)

{

bool bRet = false;

do

{

if( m1.row != m2.col ) break;

if( m1.col != res.col ) break;

if( m2.row != res.row ) break;


initZero(res);


for(int i=0; i<m1.col; i++)

{

for(int j=0; j<m1.row; j++)

{

int k = 0;

int n = (m2.row-1)/4; 

switch( m2.row % 4 ) {

case 0: do{ res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 3: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 2: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

case 1: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

}while( n-- > 0);

}

}


//for(int j=0; j<m1.row; j++)

//{

// int k = 0;

// switch( m2.row % 4 ) {

// case 0: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

// case 3: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

// case 2: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

// case 1: res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k]; k++;

// }

// int n = (m2.row - k)/4;

// while( n --> 0 )

// {

// res.matrix[i][k] += m1.matrix[i][j] * m2.matrix[j][k];

// res.matrix[i][k+1] += m1.matrix[i][j] * m2.matrix[j][k+1];

// res.matrix[i][k+2] += m1.matrix[i][j] * m2.matrix[j][k+2];

// res.matrix[i][k+3] += m1.matrix[i][j] * m2.matrix[j][k+3];

// k += 4;

// }

//}

}


bRet = true;

} while(0);


return bRet;

}


bool printMatrix(Matrix& m)

{

bool bRet = false;

do

{

for(int i=0; i<m.col; i++){

for(int j=0; j<m.row; j++){

printf("%7.1f ",m.matrix[i][j]);

}printf("\n");

}printf("\n");


bRet = true;

} while(0);


return bRet;

}


bool makeMatrix(Matrix& m, int col, int row)

{

m.matrix = make2dArray(row, col);

m.col = col;

m.row = row;

return true;

}

bool deleteMatrix(Matrix& m)

{

delete2dArray(m.matrix);

m.col = 0;

m.row = 0;

return true;

}


bool compareMatrix(Matrix& m1, Matrix& m2)

{

bool bRet = false;

do

{

if( m1.row != m2.row ) break;

if( m1.col != m2.col ) break;


for(int i=0; i<m1.col; i++){

for(int j=0; j<m1.row; j++){

if( m1.matrix[i][j] != m2.matrix[i][j] )

return false;

}

}


bRet = true;

} while(0);


return bRet;

}


int main(int argc, char *argv[])

{

Matrix m1, m2, res1, res2;




for(int x=0; x<10; x++)

for(int i=4; i<10; i++)

for(int j=3; j<10; j++)

for(int k=5; k<10; k++){

bool bRet = false;

do

{

makeMatrix(m1, i, j);

makeMatrix(m2, j, k);

makeMatrix(res1, m1.col, m2.row);

makeMatrix(res2, m1.col, m2.row);


initRandom(m1);

initRandom(m2);


Multiply(m1, m2, res1);

Multiply2(m1, m2, res2);

//printMatrix(res1);

//printMatrix(res2);

if( compareMatrix(res1, res2) ){

printf("result = true\n");

}

else{

printf("result = false\n");

break; 

}

deleteMatrix(m1);

deleteMatrix(m2);

bRet = true;

} while(0);

if( bRet == false ){ printf("assert!!\n"); system("pause"); return 0; }

}

system("pause");

return 0;

}

Posted by Нуеоп

vector<int> vec;


1.

&vec[0]


2.

&*vec.begin()



Posted by Нуеоп
Posted by Нуеоп

http://stackoverflow.com/questions/10456040/how-to-swap-the-sprite-in-the-ccsprite-object-in-cocos2d-x


if(containsTouchLocation(pTouch)){

CCSprite* pScroll2 = (CCSprite*)(this->getChildByTag(105));

if( pScroll2 ){

CCIcon* icon = ((CCIcon*)pScroll2->getChildByTag(100));

if( icon ){

icon->setTexture(this->getTexture());

}

}

}

Posted by Нуеоп
2012. 8. 29. 16:17

color type 6

color type 6

color type 6

color type 6

color type 6

...

이런식으로 뜨는 이유는, addImage()

CCImageCommon_cpp.h의 bool CCImage::_initWithPngData(void * pData, int nDatalen)에서 출력하기 때문이다.


그 밑에 CCLog("unsopprted color type %u", color_type); 여기서 unsopprted 는 unsupported 의 오타인것 같다.




Posted by Нуеоп

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("xxx.plist");

CCTexture2D * pTexture = CCTextureCache::sharedTextureCache()->textureForKey("yyy.png");


왜 pTexture는 NULL이 될까 ...ㅠㅠ



분명 xxx.plist에는 yyy.png가 key로 잘 들어 있는데...

구글링해보니 절대경로, 상대경로 문제였다는데, 1년전에 고쳐진듯 한데......ㅠㅠ







CCSpriteFrame 과 spriteFrameByName()을 이용할 것!



Posted by Нуеоп

http://kukuta.tistory.com/81




for( map<string,vector<int> >::iterator iter = MyMap.begin(); iter != MyMap.end(); ) {

if( iter->second.size() < 1 ) {

MyMap.erase(iter++);

}

else{

iter++;

}

}


위처럼 erase(iter++);하지 않으면, iter을 미리 다른곳에 보관한다음, 삭제후 복원해야 한다.




혹은

for( map<string,vector<int> >::iterator iter = MyMap.begin(); iter != MyMap.end(); ) {

if( iter->second.size() < 1 ) {

iter = MyMap.erase(iter);

}

else{

iter++;

}

}


Posted by Нуеоп

CCNode의 addChild()를 살펴보면


void CCNode::addChild(CCNode *child, int zOrder, int tag)

{    

    CCAssert( child != NULL, "Argument must be non-nil");

    CCAssert( child->m_pParent == NULL, "child already added. It can't be added again");


    if( ! m_pChildren )

    {

        this->childrenAlloc();

    }


    this->insertChild(child, zOrder);


    child->m_nTag = tag;


    child->setParent(this);

    child->setOrderOfArrival(s_globalOrderOfArrival++);


    if( m_bIsRunning )

    {

        child->onEnter();

        child->onEnterTransitionDidFinish();

    }

}


child노드의 onEnter()를 호출한다.



Posted by Нуеоп

Unhandled exception at 0x00000000 in HelloWorld.exe: 0xC0000005: Access violation reading location 0x00000000.


이런 오류가 날 경우 다음과 같이 해결


http://www.cocos2d-x.org/boards/6/topics/11806


http://www.cocos2d-x.org/boards/6/topics/12188



요약 


1.

libCocos2d의 ccConfig.h에서 CC_TEXTURE_ATLAS_USE_VAO가 0이 되도록 조정

VAO (Vertex Array Objects)는 많은 메모리를 소모한다.


2.

opengl 라이브러리 쪽 문제일 수 있다. 최신버전으로 업데이트 해라.


3.

libCocosDenshion 링크 문제일 수 있다. libCocosDenshion의 프로젝트 옵션에서 /INCREMENTAL:NO 설정해라.


진짜 원인.

그래픽카드 드라이버를 새로 설치해야함

Posted by Нуеоп

zip으로 해제하면 됩니다.

Posted by Нуеоп

'Issue' 카테고리의 다른 글

SDL Security Develoment Lifecycle  (0) 2012.08.22
ADVANCED MVVM에서 소개한 WPF & MVVM 패턴 사이트  (0) 2012.08.22
Metro 스타일 UX 가이드  (0) 2012.08.22
Microsoft LightSwitch  (0) 2012.08.22
k팝과 관련하여...  (0) 2012.08.22
Posted by Нуеоп

http://blog.powerumc.kr/


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {


            List<Person> people = new List<Person>();

            people.Add(new Person("kim sam soon", 12));

            people.Add(new Person("park chul soon", 23));

            people.Add(new Person("obama", 65));

            people.Add(new Person("lee so ryong", 11));

            people.Add(new Person("choo shin soo", 27));

            people.Add(new Person("buffet", 80));


            var enumerator = (IEnumerator<Person>)people.GetEnumerator();


            while(enumerator.MoveNext() != false){

                var e = enumerator.Current;

                Console.WriteLine(e);

            }


            Console.WriteLine("=====================");


            ParallelSort(people);

            //ThreadSort(people);

            //GeneralSort(people);

        }



        private static void GeneralSort(List<Person> people)

        {

            List<Person> resultPeople = new List<Person>();

            foreach (Person person in people)

            {

                if (person.Age >= 20)

                    resultPeople.Add(person);

            }


            resultPeople.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));


            foreach (var item in resultPeople)

            {

                Console.WriteLine(item);

            }

        }


        private static void ThreadSort(List<Person> people)

        {

            var resultPeople = new List<Person>();

            int partitionsCount = Environment.ProcessorCount;

            int remainingCount = partitionsCount;

            using (var enumerator = (IEnumerator<Person>)people.GetEnumerator())

            {

                using (var done = new System.Threading.ManualResetEvent(false))

                {

                    for (int i = 0; i < partitionsCount; i++)

                    {

                        System.Threading.ThreadPool.QueueUserWorkItem(delegate

                        {

                            var partialResults = new List<Person>();

                            while(true)

                            {

                                Person baby;

                                lock(enumerator)

                                {

                                    if( enumerator.MoveNext() == false )

                                        break;

                                    baby = enumerator.Current;

                                }

                                if (baby.Age >= 20)

                                    partialResults.Add(baby);

                            }

                            lock (resultPeople) resultPeople.AddRange(partialResults);

                            if (System.Threading.Interlocked.Decrement(ref remainingCount) == 0)

                                done.Set();

                        });

                    }

                    done.WaitOne();

                    resultPeople.Sort( (p1, p2) => p1.Age.CompareTo(p2.Age) );

                }

            }


            foreach (var item in resultPeople)

            {

                Console.WriteLine(item);

            }


        }


        private static void ParallelSort(List<Person> people)

        {

            var resultPeople = from person in people.AsParallel()

                               where person.Age >= 20

                               orderby person.Age ascending

                               select person;

            foreach (var item in resultPeople)

            {

                Console.WriteLine(item);

            }         

        }

    }

}



'C#, .NET' 카테고리의 다른 글

C# Enumerator  (0) 2012.08.23
C#에서 프로세서 개수 알아내기  (0) 2012.08.23
C# 및 SQL 강좌  (0) 2012.08.22
Posted by Нуеоп
2012. 8. 23. 10:48

            List<Person> people = new List<Person>();

            people.Add(new Person("kim sam soon", 12));

            people.Add(new Person("park chul soon", 23));

            people.Add(new Person("obama", 65));

            people.Add(new Person("lee so ryong", 11));

            people.Add(new Person("choo shin soo", 27));

            people.Add(new Person("buffet", 80));


            var enumerator = (IEnumerator<Person>)people.GetEnumerator();


            while(enumerator.MoveNext() != false){

                var e = enumerator.Current;

                Console.WriteLine("e = {0}, {1}", e.Name, e.Age);

            }

'C#, .NET' 카테고리의 다른 글

C# GeneralSort, ThreadSort, ParallelSort  (0) 2012.08.23
C#에서 프로세서 개수 알아내기  (0) 2012.08.23
C# 및 SQL 강좌  (0) 2012.08.22
Posted by Нуеоп

Console.WriteLine("ProcessorCount = {0}", Environment.ProcessorCount);

Console.WriteLine("CurrentDirectory = {0}", Environment.CurrentDirectory);


등등...

'C#, .NET' 카테고리의 다른 글

C# GeneralSort, ThreadSort, ParallelSort  (0) 2012.08.23
C# Enumerator  (0) 2012.08.23
C# 및 SQL 강좌  (0) 2012.08.22
Posted by Нуеоп
2012. 8. 22. 21:46

http://www.csharpstudy.com/


http://sqlprogramming.co.kr/



'C#, .NET' 카테고리의 다른 글

C# GeneralSort, ThreadSort, ParallelSort  (0) 2012.08.23
C# Enumerator  (0) 2012.08.23
C#에서 프로세서 개수 알아내기  (0) 2012.08.23
Posted by Нуеоп
두 알고리즘의 가장 큰 차이점은, 다익스트라 알고리즘은 가중치가 음수인 경우는 처리 못하고, 벨만 포드 알고리즘은 가중치가 음수인 경우도 처리가능하다는 점이다.

다익스트라 알고리즘은 기본적으로 Greedy 탐색이므로, 비용이 감소하는, 이득이 되는 경우를 고려하지 못한다.
당장 비용이 최소라 생각하면, 그 길을 택한다.

하지만 경우에 따라서 멀리 돌아서 가는 경우가 오히려 비용이 적게 드는 경우가 있을 수 있다. 이런 경우까지 처리 가능한 알고리즘이 바로 벨만 포드 알고리즘이다.






다음과 같은 그래프에서 A에서 D로 가는 최단 경로를 찾는다고 하자




다익스트라 알고리즘의 경우 B에서 C와 D사이에서 고민하게 된다. 당장 D로 가는 경로가 가중치가 적기 때문에 B->D를 선택할 것이다.



하지만 가중치가 음수가 있을 수 있는 경우, 끝까지 돌아봐야 결과를 알 수 있다. 


음수가 없이 모두 양수만 가능한 경우는, 총 비용이 증가하는 방향으로만 있기 때문에 Greedy하게 탐색해도 좋은 결과를 얻는 것이다. 


이와 관련하여 Maximum sum 문제의 Kadane's algorithm을 생각해 볼 수 있다.



Posted by Нуеоп
Posted by Нуеоп
Posted by Нуеоп

'Issue' 카테고리의 다른 글

'닮았지만 다른 운명'… 킨과 안드로이드의 숨은 이야기  (0) 2012.08.23
SDL Security Develoment Lifecycle  (0) 2012.08.22
Metro 스타일 UX 가이드  (0) 2012.08.22
Microsoft LightSwitch  (0) 2012.08.22
k팝과 관련하여...  (0) 2012.08.22
Posted by Нуеоп
2012. 8. 22. 14:05

http://msdn.microsoft.com/library/windows/apps/hh779072


난 Metro 스타일이 좋던데 ㅋ

Posted by Нуеоп
2012. 8. 22. 13:53

http://msdn.microsoft.com/ko-kr/library/ee256749.aspx


써보세요

Posted by Нуеоп
2012. 8. 22. 13:35

k팝과 관련하여 k팝 정보 제공을 위한 사이트가 필요하다. 보통 위키피디아에서는 하나의 주제를 다양한 시각으로 조명한다. 위키피디아에서 다루는 주제는 보통 용어나 사건, 명칭, 기술 등이다. Youtube에서 여러 노래를 듣다 보면, 이런 위키피디아처럼 다양한 정보를 다양한 언어로 접하고 싶다는 생각이 든다. 


가수가 어떤 노래를 특정 장소에서 불렀으면, 그에 대한 배경 정보가 궁금해진다. 이 가수가 어떤 가수인지, 이 노래가 어떤 노래인지, 평소와 다른 점은 무엇인지.. 불렀을 당시 반응은 어떠했는지...

언어의 차이, 문화의 차이로 사전 설명이 필요한 부분도 포함되어야 한다. 이 가사가 어떤 의미인지, 어떤 중의적인 표현을 담고있는지 ...


또 중요한 것은 이런 정보를 다양한 언어로 제공되어야 한다는 것이다. 우선 한글과 영어, 중국어 정도면 될 것 같다.


그밖에 같은 관심사를 가진 사람끼리 소통할 수 있는 장소를 제공해야 한다. Youtube의 댓글도 좋지만, 좀 더 넓은 범위였으면 좋겠다. 그렇다고 팬카페처럼 폐쇄적이고 너무 특정 가수에만 얽힌 형태는 별로일 것 같다. 사람들끼리 소통해야 그 노래가 '살아있다'는 느낌을 받을 수 있다. 어떤 사이트의 가장 최근 글이 5년전 글이라면, 아무리 좋은 글로 가득 차 있어도 여러의미로, 만족할 수 없다.


그리고 특정 노래를 듣고 다른 노래로도 자연스럽게 접근할 수 있도록 해야한다. 직접 특정 노래를 검색해서 찾아와서 듣는 것은 당연한 것이고, 거기서 다른 노래도 접근이 자연스러워야 한다. 마치 어떤 글을 읽기위해 특정 블로그에 갔다가 다른 여러 글도 함께 읽을 수 있는 것처럼...


인터넷 실시간 뉴스도 좋지만, 가끔은 한달정도 묵혀둔 정보지만, 잘 정제된 매거진이 좋을때도 있다. 신속하면 그만큼 질이 떨어질수도 있다. 음악, 노래 그리고 그에대한 정보는 신속하지 않아도 된다. 최대한 다양한 이야기, 재미있는 이야기를 담는다면, 또다른 분야가 될 것이다.



Posted by Нуеоп

http://www.blogformula.net/archives/140


당연한 소리지만, 무언가 수치로 비교할때는 수치에 비례하는 그림을 함께 넣으면 더 보기 좋다.



'Issue' 카테고리의 다른 글

Microsoft LightSwitch  (0) 2012.08.22
k팝과 관련하여...  (0) 2012.08.22
e-book 전자책 및 단말기 시장의 3파전  (0) 2012.08.22
windows azure 소개  (0) 2012.08.22
Amazon 클라우드 EC2 소개  (0) 2012.08.22
Posted by Нуеоп

아마존의 킨들파이어

애플의 아이패드

그리고 구글쪽에서 테블릿 및 e-book을 지원하는것 같다.


전자책 단말기를 구입할때 고민이 더 많아졌다.

'Issue' 카테고리의 다른 글

k팝과 관련하여...  (0) 2012.08.22
워드프레스(WordPress), 드루팔(Drupal), 줌라(Joomla) 비교  (1) 2012.08.22
windows azure 소개  (0) 2012.08.22
Amazon 클라우드 EC2 소개  (0) 2012.08.22
Web framework에 대해..  (0) 2012.08.22
Posted by Нуеоп
2012. 8. 22. 12:28

http://www.windowsazure.com/ko-kr/


꼭 가볼것..

'Issue' 카테고리의 다른 글

워드프레스(WordPress), 드루팔(Drupal), 줌라(Joomla) 비교  (1) 2012.08.22
e-book 전자책 및 단말기 시장의 3파전  (0) 2012.08.22
Amazon 클라우드 EC2 소개  (0) 2012.08.22
Web framework에 대해..  (0) 2012.08.22
MariaDB란..  (0) 2012.08.22
Posted by Нуеоп

http://bcho.tistory.com/543



'Issue' 카테고리의 다른 글

e-book 전자책 및 단말기 시장의 3파전  (0) 2012.08.22
windows azure 소개  (0) 2012.08.22
Web framework에 대해..  (0) 2012.08.22
MariaDB란..  (0) 2012.08.22
색, color  (0) 2012.08.13
Posted by Нуеоп
2012. 8. 22. 12:13

Ruby에서 Ruby on Rails


Python에서 Django


Java에서 Play framework


....



'Issue' 카테고리의 다른 글

windows azure 소개  (0) 2012.08.22
Amazon 클라우드 EC2 소개  (0) 2012.08.22
MariaDB란..  (0) 2012.08.22
색, color  (0) 2012.08.13
data visualization  (0) 2012.07.31
Posted by Нуеоп
2012. 8. 22. 12:09

http://gywn.net/2012/06/let-me-introduce-mariadb/







'Issue' 카테고리의 다른 글

Amazon 클라우드 EC2 소개  (0) 2012.08.22
Web framework에 대해..  (0) 2012.08.22
색, color  (0) 2012.08.13
data visualization  (0) 2012.07.31
IBM 시각화 manyeyes  (0) 2012.07.31
Posted by Нуеоп

2.x 부터는 


CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);


대신


CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);


사용하면 된다.

'Cocos2d' 카테고리의 다른 글

cocos2d-x addChild()와 onEnter()  (0) 2012.08.24
cocos2d-x HelloWorld 실행시 오류  (1) 2012.08.24
cocos2d-x schedule 관리  (0) 2012.08.16
cocos2d-x Schedule에 대해  (0) 2012.08.14
cocos2d-x에서 한글 출력하는 방법  (0) 2012.08.14
Posted by Нуеоп
이전버튼 1 2 3 4 5 이전버튼