2018년 4월 30일 월요일

OpenCvSharp 메모

OnepCv와 달리 C#용은 별도의 OpenCvSharp 패키지를 사용하는데, 같은건줄 알고 만만하게 봤다가 큰코다쳤습니다. 대부분의 메소드, 메크로 다 바뀌거나 없습니다. 심지어 구동방식도 많이 틀린것 같습니당. 덕분에 하루종일 삽질을 했는데, 필기가 필요한 부분은 http://kimcblog.cpss.co.kr/2017/07/28/c-opencv-opencvsharp-mat-class-to-bitmap/#comment-58 Mat Class를 Bitmap이나, Stream으로 전환하는 방법. Stream을 File로 출력하는 방법 using(FileStream fs = File.Create(save_path+fileName)){ fs.Write(matBuff,0,matBuff.length); } 이제 삽질 하나 끗

2018년 4월 29일 일요일

blog porject 1.0 종료

3월부터 공식적으로 작업이 시작된 blog만들기 프로젝트는 종료되었습니다. Git : https://github.com/juicycool92/blogProjectForjellojay 알려진 버그/ 1.1 버전 계획도 함꼐 포스팅 되어있습니다. 1.1 버전은 바쁜게 끝나면 다시 진행할 예정.. 마무리 하는 동안 수시로 코드 스타일이 바뀌어서, 일관성이 떨어집니다. 계속 깔끔하고, 자원을 덜 쓰는 방식을 알아내서, 전체적으로 지저분해진 상황..! (수정 필요!)

2018년 4월 24일 화요일

javascript function에 관한 노트

서핑중
function foo(){}

const foo = ()=>{}
가 같은 의미로 쓰이지만, 특히 후자가 더 선호된다는 이야기를 들었습니다.

궁금증이 좀 생겨서 알아보는데..


1.arrow function 의 인자값이 없다면 _ 로 처리가 가능하다.

const foo = _ =>{}

2. arrow function 은 this 가 없다. 이때 this는 상위 scope를 따라게기 된다.

const foo = _ =>{console.log(this);} 를 현제 웹 페이지의 콘솔에 친다면,
현제 인터넷창 windows가 출력될 것이다!/node shell에서는 node객체가 출력되는것 같다!

다음으로 넘어가기 전에 잠깐 확실하게 해둘것이 있다.
Parameter와 Argument 의 차이를 짚고 넘어가야 할것 같다.
검색했을때 좋은 예제가 나왔는데,
void Foo(int a,int b){}
void main(){
 Foo(1,2);
}
에서 Foo함수의 int a 와 b 를 Parameter,
Foo(1,2)에서의 1과 2를 Argument라고 부른다.
Arguments는 넘겨주는 값/변수/레퍼런스 따위를 부르며,
Parameters는 fuction/block등을 통해 넘겨받은 변수값을 칭한다.


3. arrow function에서는 arguments객체가 없기 때문에, 가변 인자의 경우 spread연산자로 변수를 하나 선언하여 담아 보낼수 있다.

여기서 처음보는 spread연산자가 나타나 내 머리를 헤집기 시작하는데,
간단하게 arguments인자값을 배열 따위로 순차적으로 넣을 수 있게 만드는것 같다.
예제코드를 보면 이해가 쉽다.
function foo ( a, b, c, d, e, f){return a+b+c+d+e+f}
const a = [1,2,3];
const b = 4;
const c = [5,6];
console.log(foo(...a,b,..c));
출력은 21이 찍힌다.
foo의 인자값으로 6개의 변수를 받아야 하는데, a 와 c 배열의 모든 인자값들을 포함하여 6개의 인자를 채우려고 할때, spread연산자를 쓸 수 있다.
... 가 spread연산자 기호이다. 

정도의 좋은 정보들을 잔뜩 얻게되었습니다.

...
그래서 왜 function (){}보다 arrow function이 좋은가? 에 대해서는 아직까지 명쾌한 해답은 듣지 못했다(...)


2018년 4월 3일 화요일

[postgresql]Union을 이용하여 하나 이상의 rows의 비 중복 values를 가져오기

보드 게시판에서 카테고리가 두개로 나뉘어져 있습니다.

select Category1 as cat1, Category2 as cat2 from board;
---------------
cat11   |  cat2
---------------
Blog    |   note
Blog    |   diary
Code   |   tutorial
Code   |   tutorial
Code   |   note
---------------

목적은, 각 카테고리의 값들을 가져오는데, 중복은 재외하는것 입니다.

select district Category1 as cat1 from board;
select district Category2 as cat2 from board;
-------
cat1
-------
Blog
Code
-------


-------
cat2
-------
note
diary
tutorial
note
-------


하지만 굳이 query문을 두번이나 쓸 필요가 있을까 싶었기 때문에, 삽질과 질문을 한 끝에
UNION 을 사용하면 된다는것을 알았습니다.

UNION은 두 select문의 출력할 rows가 동일할때, 두 출력문을 하나로 합치는 기능인데요,
이때 중복 또한 예외처리가 되었습니다.

위의 코드에서 사용하기위해, 각 각의 select문을 동일한 출력으로 만들면 되는데요,
select Category1 as cat1, NULL as cat2 from board
를 치게 되면
----------
cat1  | cat2
----------
Blog   | NULL
Blog   | NULL
Code  | NULL
Code  | NULL
Code  | NULL
-----------

으로 나오게 됩니다.

동일하게 cat2 에도 같은 select문을 사용하여

select NULL as cat1, Category2 as cat2 from board
---------------
cat1   | cat2
---------------
NULL  |   note
NULL  |   diary
NULL  |   tutorial
NULL  |   tutorial
NULL  |   note
---------------

그럼 이제 두 select문을 합치게되면,

SELECT Category1 AS cat1, NULL AS cat2
FROM board
UNION
SELECT NULL AS cat1, Category2 AS cat2
FROM board;

그리고 출력물은
---------------
cat1   | cat2
---------------
NULL  |   note
NULL  |   diary
NULL  |   tutorial
Blog   |   NULL
Code  |   NULL
---------------

요로코롬 나오게 됩니다!

이게 쿼리 두번 날리는것보다 빠른건지 데이터가 많이 없어서 증명은 못하겠지만..
더 효율적이라고 판단하고 자위하는중..

제 케이스에서는
각 각 select문은 230ms 가 걸렸으나,
union을 통한 한번의 query문은 280ms가 갈렸습니다