최초 컴포저를 설치하고 나서


The zip extension and unzip command are both missing, skipping.


이런 에러가 나온다면


데비안계열의 경우

apt-get install unzip


레드헷계열의 경우

yum install unzip    (아마도?)



해결될것이다.



출처

https://github.com/composer/composer/issues/4943


WRITTEN BY
rabbbit
필기

,

sass와 scss차이점

기타 2016. 5. 12. 14:57

1. sass의 장점

#1 문법이 간결하다.

세미콜론과 중괄호가 없다.

믹스인할때 @indclude대신 +를 사용한다.

#2 읽기쉽다.

인덴테이션 룰이 스트릭트해서 작성하기는 어려우나 읽기는 쉽다.

#3 세미콜론이 없는것에 대해서 에러를내지 않는다.

세미콜론이 없어도 자동으로 인식함



2. scss의 장점

#1 더 표현적이다.

attribute/value의 쌍들을 한줄에 쓸수 있다.

#2 고유한 nesting룰을 장려한다.

selector에 이름을 만들어 element명을 변경할때 관리가 쉽다.(한번에 여러군대 변경가능)

#3 더 모듈화된 코드 장려 @extend사용


#4 더 나은 인라인 문서를 작성하게 한다.

괄호가 코드와 코멘트를 그룹해준다.

#5 css 툴이 scss에서도 사용가능하다.

css 툴들은 scss에서도 종종 사용이 가능하다.

#6 css와 통합하기가 훨씬 쉽다.


#7 진입장벽이 낮다.


#8 css의 다름 버전이 될수도있다.




원문

http://thesassway.com/editorial/sass-vs-scss-which-syntax-is-better


WRITTEN BY
rabbbit
필기

,

요즘 들어서 쓰기시작한 git을 조금씩 사용량을 늘려가고 있다. 요즘에 진행하는 프로젝트들은 모두 git을 사용 하는데 그렇다 보니 문제가 생겼다. 계정은 하나인데 프로젝트가 여러개라 레파지토리를 만들때마다 ssh키를 등록을 해야 한다는 것이다. 그래서 해결책을 찾았다.


 먼저 .ssh에가서 config  ㅍㅏ일을 수정해야 한다.


아래의 명령어로 config파일을 연다.


vim ~/.ssh/config


만약 .ssh안에 config가 없다면 생성하면 된다.


그리고 나서


Host a.github.com       <-- 1

HostName github.com

User git

IdentityFIle ~/.ssh/id_key.pub <-- 2


 이런게 네개의 명령어를 입력하는데 화살표로 표시한 1은 임의로 변경하고 2는 자신이 가지고 있는 퍼블릭 키를 등록하면된다.


이렇게 해서 사용할때 마다


ssh a.github.com 이런식으로 명령어를 쓰면 하나의 키로 여러개의 프로젝트를 공유가 가능하다. 



ps) 

혹시라도 위 처럼 따라하고 ssh a.github.com 을 입력했는데 

'bad owner or permissions on .ssh/config' 이러한 에러가 뜬다면 이건 config 파일의 퍼미션 에러이다

권한을 600으로 바꿔주면 된다.

chmod 600 ~/.ssh/config


그런데 또 이렇게 했는데 


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


ㅇㅣ런 오류가 뜬다면


pub확장자를 가진 본인의 키의 권한도 600으로 변경해주면 된다.

chmod 600 ~/.ssh/id_key.pub




참고

https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=linuxserver&wr_id=36955

http://www.howtogeek.com/168119/fixing-warning-unprotected-private-key-file-on-linux/

http://serverfault.com/questions/253313/ssh-hostname-returns-bad-owner-or-permissions-on-ssh-config

http://stackoverflow.com/questions/22768517/how-to-manage-one-only-key-per-each-git-repository


WRITTEN BY
rabbbit
필기

,

처음 리눅스를 설치했을 경우

mysql의 default charater set 이 latin~~일 수 있다.

이때 charater set이 latin~~라고해서 아직 까진 사용하는 도중에 문제가 생기진 않았지만

혹시 모를 문제에 대비해서 utf-8로 변경했다.


show  variables like 'c%' 

character set 확인


1. db charset 변경

alter database dbname character set utf8

alter database dbname collate 'utf8_general_ci';


2. service mysqld restart




참고 

http://kwonnam.pe.kr/wiki/database/mysql/charset



WRITTEN BY
rabbbit
필기

,

service mysql start 를 했을때 

start : job failed to start 

라는 에러가 날때가 있다.. 난 제대로 설치했는데 왜이러지 싶은데

이게 사실은 설치를 할때 제대로 설치를 안했을때 생기며, 리눅스에 처음 설치할때는 발생하지 않는다는데

나는 처음에 설치했는데도 생긴에러이다..

처음이라고 꼭 발생하지는 않은건가 싶은데 사실 이유는 잘모르겠다..

그냥 이런 에러가 나면 해결법을 확실히 알고 있는게 어떤 이유에서 생겨나든 속이 편하지 않을까??


먼저


현재 설치한 /var/lib/mysql 디렉토리를 복사를 해놓는다


sudo mkdir /home/<your username>/mysql/

sudo cd /var/lib/mysql/

sudo cp * /home/<your username>/mysql/ -R


그다음 현재 설치된 mysql을 제거 한다

sudo apt-get purge mysql-server-5.1(본인이 설치한 버전) mysql-common


 그리고 나서 /etc/mysql 을 지운다

sudo rm /etc/mysql/ -R


다음으로 예전 디비 파일이 /var/lib/mysql 에 여전히 남아있는지 확인후 없으면 복사를 한다 이때 소유자를 root:root로 한다.


sudo mkdir /var/lib/mysql/  //여기서 이미 있다고 하면 무시하고 다음 줄을 실행시키면 된다.

sudo chown root:root /var/lib/mysql/ -R

cd ~/mysql/

sudo cp * /var/lib/mysql/ -R


그리고 다시 mysql 을 설치한다


sudo apt-get install mysql-server


그런데 이걸 하다보니 생각이 드는게 첫 설치 이후에 job falied to start 에러가 난다면 귀찮게 mysql 을 백업하지 않고


다 지우고 새로 깔면 될것 같다..


WRITTEN BY
rabbbit
필기

,

class A 가 a.h에 있고

class B 가 b.h 에 있는데

B가 A를 사용하고 A가 B를 사용할 경우 :

거의 설계가 잘 못되었다고 볼 수 있다.

이렇게 프로그램을 짜면 이해하기가 힘들고 추적이 힘들기 때문에 경험많은

프로그래머들은 이렇게 짜지를 않는다.

 

흔히 전방선언이라고 하는 것은

 

class A;

class B

{

...

    A *pA;

};

 

와 같이 포인터만 이용할 때 가능합니다. class A의 포인터라면 그냥 4바이트(32bit OS)만

할당해 놓을 수 있지만 이것을

 

class A;

class B

{

...

   A a;

};

 

와 같이 하면 몇 byte를 할당해야 할지 알 수가 없으므로 에러를 냅니다.

이럴 경우에는 할 수 없이

 

#include "a.h"

class B

{

...

    A a;

};

 

이렇게 해야하는데

A a;

를 확인하려고 a.h 를 살펴보니

 

#include "b.h"

class A

{

...

   B b;

};

 

이렇게 (헤더 꼬임 현상)이 발생해서 무한 루프에 빠지게 됩니다.

(당연히 최상단에 올린 해더는 아래 해더를 모르므로 컴파일러는 알아서 에러를 내줍니다.)

이를 해결 하는 방법은 포함순서를 잘 맞추든지 아니면...

설계를 약간 바꾸는 것(전방 선언후 객체의 포인터 사용)이 좋지 않을까 합니다.

 

//////////////

 

class A / class B 가 있다. 그리고 A 는  B 를 사용할 것이다.

그럼 우리는 무엇을 해주어야 하는가?

 물론 A 쪽에 #include "B.h" 를 해주어야 할 것이다. 그래야 A 에서 B를 사용할 수 있으니까....

 

그런데.......

#include 의 수가 많아질수록 컴파일 속도가 저하된다는 것도 아시는지.....

이유는 생각해보면 알수 있다. 위에서 처럼 A 에 B 를 include 한다고 할때 만약 B.h 가 수정되면 include 부분도 이 영향을 받게 되며 수정이 많아질수록 컴파일 속도도 느려지게 된다.

 

이것을 해결하는 방법은? 전방선언을 사용하는 것이다.

(전방선언의 좋은점은 참조하려는 해더파일에 변경이 생겨도 참조 하는 해더파일에서는

재컴파일이 이루어 지지 않는다는 점이다.)

 

전방선언이란 가령 Player 라는 클래스가 선언된 헤더파일이 있을 경우

#include "Player.h" 대신

class Player;

이렇게 선언하는 것이다.

 

단, 주의해야 할 점이 있다. 전방선언자를 사용할 경우에는 그 클래스 관련 객체는 포인터형으로 선언해야 한다는 것이다. 만약 포인터형이 아닌 객체를 생성할 경우 전방선언자의 특징상 그 객체의 크기를 정확히 파악하여 할당을 못해주기 때문이다. (해당 클래스가 있다는 정보만 알고 사이즈를 모른다)

 

컴파일 적인 면에서 우리는 전방선언이 인클루드보다 속도, 의존관계 면에서 더 좋다고 하였다.

여기에 하나 더 추가하자면 다음과 같은 경우 우리는 전방선언을 유용하게 써먹을 수 있다.

 

class A, B 가 있다.

B는 A를 사용하고 있다 ( A 헤더를 인클루드하여 사용.... 상속은 아니다 )

그런데 우리는 부득이하게 A에서 B의 정보를 알아야 하는 상황에 놓이게 된다면....?

 

A는 B의 데이터를 알기위해선 B 의 구조를 알아야 하고 즉 B 헤더를 인클루드 해야 된다.

하지만 B에서 이미 A 헤더를 인클루드 하고 있기에 A 에서 B 헤더를 인클루드하면 상호 참조 에러가 되어버리고 만다. 즉 구조를 바꾸지 않는한 A 는 B 헤더를 인클루드 할수 없다는 것이다.

 

만약에 인클루드 대신에 앞에글에서 처럼 전방선언자를 사용한다면...?

 

#include "A.h"                                class B;

 

class B                                         class A

{                                                  {

   ///....                                           ///....

}                                                   }

 

이렇게 하면 우선 에러는 나지 않는다. ( 상호참조의 초석을 놓았다 )

다만 전방선언자를 사용하는 class A 에서는 B 를 포인터형으로 선언 또는 받는 처리만 가능할뿐

이를 동적 생성하거나 함수를 호출하면 에러가 나게 된다. 왜냐하면 전방선언자는 단순히 선언이기 때문에 생성, 호출은 실제 데이터 구조를 모르는 상태이므로 에러가 나게 되는 것이다.

그럼 동적 생성이나 호출을 하고 싶으면 어떻게 해야 하는가?

A.cpp 에서 구현을 하면 된다. 그리고 cpp 에 B.h 를 인클루드 하면 비로소 상호 참조가 가능하게 된다.



WRITTEN BY
rabbbit
필기

,

메모리풀(memory pool)

기타 2014. 9. 12. 11:22

메모리 풀(memory pool)은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하게 해준다. malloc이나 new 연산자 같은 기능들은 다양한 블록사이즈 때문에 단편화를 유발시키고, 파편화된 메모리들은 퍼포먼스 때문에 실시간 시스템에서 사용할 수 없게 된다. 좀더 효율적인 방법은 memory pool이라고 불리는 동일한 사이즈의 메모리 블록들을 미리 할당해 놓는 것이다. 그러면 응용 프로그램들은 실행 시간에 핸들에 의해서 표현되는 블록들을 할당하고, 접근하고, 해제할 수 있다.

많은 실시간 운영 체제들은 Transaction Processing Facility와 같은 메모리 풀을 사용하고 있다.

아파치 웹 서버와 같은 몇몇 시스템들은 나중에 한번에 해제되는 다양한 사이즈의 할당자들을 관리하는 것을 메모리 풀이라고 한다. 이를 region이라고도 한다.


WRITTEN BY
rabbbit
필기

,
ssh id@주소 


ssh 접속가능id@접속주소




WRITTEN BY
rabbbit
필기

,