반응형

OS: Windows 10 (64bit)

App: Git Bash


크롬 브라우저를 통해 git 원격 저장소(repository)의 주소를 복사하고, 이것을 윈도우에 설치한 Git Bash 쉘에 붙여넣기를 했다. (마우스 오른쪽 단추를 눌러서 Paste 선택) 이렇게 해서 기존의 git 저장소에 원격 저장소를 연결하고 푸쉬를 했더니, 황당한 에러 메세지가 나왔다.

fatal: protocol 'https' is not supported



아니 이게 뭔... 깃허브와 빗버킷 모두 잘 쓰고 있는 https가 안되는 건 도대체 무슨 소리인가 어이가 없어서 찾아 보니, 스택오버플로우에서 같은 문제를 호소하는 질문을 찾을 수 있었다. 

결론부터 얘기하면, 인터넷에서 복사한 텍스트를 콘솔에 바로 붙여넣기 하지 말라는 것...


우선 직접 git remote -v 명령으로 Git Bash 창에서 확인을 해봐도 잘못 입력된 문자 같은 건 보이지 않는다. 그러나, 해당 에러 메세지를 긁어서 복사하고, 여기 티스토리 에디터에 붙여넣어 보니...

USER@bhshin-desktop MINGW64 ~/source/repos/SWTest190720 (master)

$ git pull

fatal: protocol '–https' is not supported


https 글자 앞에 원래 보이지 않던 저 네모칸이 나타났다. 무슨 글자였는지 모르지만, 저것 때문에 알 수 없는 프로토콜이라는 에러가 난 것이었다.

그래서 git remove remove origin으로 삭제하고, 직접 키보드로 주소 전체를 처음부터 끝까지 타이핑을 해서 git remote add를 새로 했다. 그 뒤에는 git pull이나 git push 명령이 모두 정상적으로 작동하였다.


역시 기본적인 것에서 황당한 에러가 난다면 (마치 코딩을 100줄도 안 했는데 컴파일 에러가 100개 가까이 되는 경우), 당연하다고 생각하던 기본적인 부분에서 혹시 오류나 실수가 없었는지 봐야 한다.



반응형
블로그 이미지

Bryan_

,
반응형

Tested: Windows 10 (Git Bash), Ubuntu 16.04 (git)


현재 컴퓨터의 로컬 폴더에 있는 git 저장소가 가리키고 있는 (등록되어 있는) 리모트 저장소(remote repository) 이름과 URL을 확인한다:

$ git remote -v


$ git remote -v

origin  https://aaa.bb/ccc.git (fetch)

origin  https://aaa.bb/ccc.git (push)



특정한 별칭에 대하여 등록된 리모트 저장소의 주소를 변경하는 방법은 두 가지가 있다.

(1) 기존의 별칭으로 등록된 리모트 저장소의 주소를 변경하기 (set-url)

$ git remote set-url [별칭] [URL]

예: 

$ git remote set-url origin https://eee.ff/ccc.git



(2) 기존의 별칭으로 등록된 리모트 저장소를 삭제하고 새로 추가하기

$ git remote remove [별칭]

$ git remote add [별칭] [URL]

예: 

$ git remote remove origin

$ git remote add origin https://eee.ff/ccc.git






반응형
블로그 이미지

Bryan_

,
반응형

Server OS: Ubuntu 16.04

Flask, Python 3.5.2

Browser: Mozilla Firefox


Flask를 써서 웹페이지로부터 GET, POST 등의 요청(request) 처리하는 코드를 만들었는데, 이상하게 웹페이지에서 form을 이용해서 POST 요청을 보낼 때마다 화면에 400 에러만 나오고 실행이 되지 않았다. 브라우저 화면에 출력되는 자세한 메세지는 다음과 같다:


400 Bad request. The browser (or proxy) sent a request that this server could not understand.


이 경우는 서버의 flask에서 받아들여야 하는 POST parameter가 없을 때 발생한다. 웹페이지의 form에서 실제로 만들어서 submit하는 name과 value의 조합 중에서, 정작 flask에서 실제로 파싱해야 하는 파라미터의 값이 없는 경우이다.


따라서 웹페이지에서 사용자 입력을 통해서 만들어 보내는 form에서 전송하는 파라미터 이름의 목록과 flask에서 request.form['파라미터_이름']으로 받아들이는 목록이 일치하는지 확인하자.



반응형
블로그 이미지

Bryan_

,
반응형

Tools: flask, Jinja2, python 3.5.2


플라스크(flask)에서 웹페이지 템플릿 엔진으로 Jinja2를 쓰는데, flask에서 넘겨 주는 데이터의 값은 분명히 숫자인데 다른 숫자 변수와 단순 비교(==)로 안되는 것이었다. 아마 스트링으로 바뀐 것 같은데, int(변수명)이 Jinja2에서는 안 된다.


Jinja2 에서 변수의 데이터 타입 캐스팅을 하려면 변수명 뒤에 vertical bar(수직선) 문자( | )를 쓰고 데이터 타입을 명시하면 된다.


만약 flask에서 넘겨 주는 변수가 아래와 같다면,

my_var = '1234'


html 파일에서는 아래와 같이 정수로 바꿀 수 있다.

{{ my_var|int }}


이제 숫자로 비교할 수 있다.

{% if my_var|int == 1234 %}

    <div> my_var 의 값은 1234입니다. </div>

{% endif %}




반응형
블로그 이미지

Bryan_

,
반응형

C++에서 map<key, value>를 쓰다 보면, value를 포인터로 관리해야 하는 경우가 있다. 예를 들어, 아래와 같은 형태의 코드이다.


#define <map>

using namespace std;


class Foo {

public:

    int a;

    double b;

    Foo(int a, double b){

        this->a = a;

        this->b = b;

    }

}


int main() {

    std::map<int, Foo*> fooMap;

    fooMap[101] = new Foo(10, 505.26);

    fooMap[104] = new Foo(8, 1233.61);

    // ...



    fooMap.erase(101);

    fooMap[105] = new Foo(17, 564.98);

    // ...


    fooMap.clear();

    return 0;

}


위와 같이 실행하면 메모리 누수가 발생한다. map.erase(key)를 이용해서 특정한 pair를 삭제하더라도 포인터를 통해 할당되어 있는 메모리 영역은 자동으로 해제(delete)되지 않는다. 즉, 명시적으로 코드 어디선가 new를 통해 오브젝트를 할당했으면, map의 value로 쓰이는지 여부에 관계 없이 명시적으로 delete를 해 주어야 한다.


실제로 C++의 erase와 clear 함수의 소스코드 위에 달려 있는 주석에도 같은 내용이 명시적으로 쓰여져 있다.


map erase 함수 주석:

  /**
   *  @brief Erases elements according to the provided key.
   *  @param  __x  Key of element to be erased.
   *  @return  The number of elements erased.
   *
   *  This function erases all the elements located by the given key from
   *  a %map.
   *  Note that this function only erases the element, and that if
   *  the element is itself a pointer, the pointed-to memory is not touched
   *  in any way.  Managing the pointer is the user's responsibility.
   */

...


map clear 함수 주석:

  /**
   *  Erases all elements in a %map.  Note that this function only
   *  erases the elements, and that if the elements themselves are
   *  pointers, the pointed-to memory is not touched in any way.
   *  Managing the pointer is the user's responsibility.
   */

...



포인터를 명시적으로 delete하는 것이 번거롭다면 C++11 이후의 버전들이 smart pointer를 제공하는데, (또는 이전 버전의 경우 boost::shared_ptr) 이것을 사용하면 자동으로 메모리 할당을 해제해 주므로 명시적인 delete를 할 필요가 없다.


포인터에 대해서 더이상 참조당하고 있지 않을 경우에 자동으로 메모리를 해제하는 작업은 ns-3에도 Ptr<T>로 구현되어 있는데, std::shared_ptr, boost::shared_ptr은 아직 써본 적이 없어서 자세히 모르겠지만 아마 개념과 목적은 유사할 것으로 예상된다.

(나중에 사용한 뒤에 포스트를 수정할 예정)




반응형
블로그 이미지

Bryan_

,