Perforce 쓸 때 최신 버전 문제가 있을 때 svn 의 update to revision 같은 게 필요하다. P4V 하는 법은 못 찾았고 명령줄에서 p4 sync 를 이용하면 된다.
> p4 sync ...@21 # changelist 21 번 서밋 이후 버전으로 업데이트
참고 : P4 sync
Perforce 쓸 때 최신 버전 문제가 있을 때 svn 의 update to revision 같은 게 필요하다. P4V 하는 법은 못 찾았고 명령줄에서 p4 sync 를 이용하면 된다.
> p4 sync ...@21 # changelist 21 번 서밋 이후 버전으로 업데이트
참고 : P4 sync
git push 과정에서 아래와 같은 오류가 발생했다.
$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 203 bytes | 203.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote:
remote: You can set the 'receive.denyCurrentBranch' configuration variable
remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote:
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://hostAddress/volume1/git/test
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://hostAddress/volume1/git/test'
저장소를 bare 로 생성하지 않아서 발생한 문제였다.
$ git init --bare
* 참고
- what's the -practical- difference between a Bare and non-Bare repository?
git branch 명령시에 아래와 같은 오류 메시지가 뜨는 경우가 있다.
$ git branch dev
fatal : Not a valid object name: 'master'
한번도 commit 되지 않은 저장소에서 이와 같은 오류 메시지가 발생한다.
최소 1번 이상 commit 을 진행하면 이 문제가 수정된다. 나 같은 경우에는 .gitignore 나 .gitattributes 파일을 add 하고 commit 했다.
윈도우즈 콘솔 속성 중에 빠른 편집 모드라는게 있다. 활성화 하면 콘솔창에서 마우스로 드래그가 가능해지며 엔터를 누르면 클립보드로 복사가 된다. 개인적으로는 좋아하는 설정인데 드래그 상태에서는 콘솔창이 멈추고 프로그램 실행도 멈추게 되는 문제가 있다. 그래서 서버 프로그램의 경우 비활성화가 필요할 수도 있다. 강제 비활성화를 위해서는 아래와 같이 설정하면 된다.
DWORD prevMode = 0;
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(handle, &prevMode);
SetConsoleMode(handle, prevMode & ~ENABLE_QUICK_EDIT_MODE);
출처 : 윈도우 콘솔창 빠른 편집 비활성화 방법
참고 : SetConsoleMode
애플워치에서 잘못 측정된 운동 데이터를 삭제하고 싶으면 건강 앱에서 삭제할 수 있다.
건강 앱에서 운동을 선택한다. 아래쪽 옵션에서 모든 데이터 보기를 선택한다. 편집을 눌러 잘못 기록된 데이터를 왼쪽에 있는 '-' 버튼을 눌러 삭제하면 된다.
ssh-keygen 을 이용해서 key 를 생성한다. key 경로와 암호를 입력하면 id 파일과 key 파일이 생성된다. 기본 경로는 ~/.ssh/id_rsa, ~/.ssh/id_rsa.pub 다.
cf. ssh-keygen 은 git for windows 에 포함된 git-bash 에서 실행하면 된다.
cf. synology 의 SSH 는 Administrators 그룹에 속한 계정으로 로그인만 지원한다. ssh-copy-id 를 사용하려면 Administrators 권한이 필요하다.
아래 내용을 변경한다.
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ssh 서비스를 재시작하자.
$ synoservicectl --restart sshd
재시작이 안되는 것 같으면 DSM 제어판 ssh 서비스 사용을 체크해제하고 다시 체크하면 된다.
git push 과정에서 아래와 같은 오류가 발생했다.
$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 205 bytes | 205.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
error: remote unpack failed: unable to create temporary object directory
To ssh://hostaddr/volume1/git/test
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'ssh://hostaddr/volume1/git/test'
저장소 용량이나 권한 문제인 것 같다. 저장소 디렉토리 소유자가 root(root) 라서 발생한 문제였다. chown 을 사용해서 사용자 id 로 접근 권한을 변경하였다.
$ chown -R [userid]:users test
* 참고
* 패키지 센터에서 Git Server 설치
* 제어판 > 터미널 및 SNMP 에서 SSH 서비스 활성화
* git 사용자를 추가한 후 (기존 계정을 사용할 예정이면 생략) Git Server 를 선택하여 사용자에게 접근 권한을 준다.
cf. 아래와 같이 사용자 목록이 보이지 않을 수 있다. administrator 그룹이더라도 안보이는 문제가 있었다. admin 계정으로 로그인하면 위와 같이 사용자 목록이 보인다.
> sudo -i # ROOT 권한 획득
> cd /volume1 # volumeX 로 이동
> mkdir git # 저장소로 사용할 디렉토리 생성. git/pp
> cd git
> mkdir pp
> cd pp
> git init --bare # 저장소 초기화
> cd .. # 디렉토리 권한 수정
> chown -R gitUser:users pp
언제부터인가 다운로드 폴더가 알파벳 그룹으로 보여서 짜증났는데 자주 보는 것도 아니라서 무시했다.
별 필요도 없어 보여서 검색해보니 오른쪽 마우스 '메뉴 > 분류 방법 > (없음)' 을 선택하면 된다.
JSON type 중 number 형식이 있다. 스펙에는 제한이 없다고 한다.
하지만 IEEE 754-2008 binary64( double precision ) number 로 구현되는 경우가 많다. 부동 소수점 오류나 int64 정수 크기의 문제가 있을 수 있어 int64 를 같이 저장공간으로 사용하기도 한다.
Unreal 도 FJsonValueNumber 를 보면 double 만 사용하고 있다. (4.23)
/** A Json Number Value. */
class JSON_API FJsonValueNumber : public FJsonValue
{
public:
FJsonValueNumber(double InNumber) : Value(InNumber) {Type = EJson::Number;}
virtual bool TryGetNumber(double& OutNumber) const override { OutNumber = Value; return true; }
virtual bool TryGetBool(bool& OutBool) const override { OutBool = (Value != 0.0); return true; }
virtual bool TryGetString(FString& OutString) const override { OutString = FString::SanitizeFloat(Value, 0); return true; }
protected:
double Value;
virtual FString GetType() const override {return TEXT("Number");}
};
부동소수점 오류가 생기는 상황을 피하기 위해서 FJsonValueNumberStrirng 이 추가되었다. (4.25)
/** A Json Number Value, stored internally as a string so as not to lose precision */
class JSON_API FJsonValueNumberString : public FJsonValue
{
public:
FJsonValueNumberString(const FString& InString) : Value(InString) { Type = EJson::Number; }
virtual bool TryGetString(FString& OutString) const override { OutString = Value; return true; }
virtual bool TryGetNumber(double& OutDouble) const override { return LexTryParseString(OutDouble, *Value); }
virtual bool TryGetNumber(float &OutDouble) const override { return LexTryParseString(OutDouble, *Value); }
virtual bool TryGetNumber(int8& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int16& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int32& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int64& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint8& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint16& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint32& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint64& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetBool(bool& OutBool) const override { OutBool = Value.ToBool(); return true; }
protected:
FString Value;
virtual FString GetType() const override { return TEXT("NumberString"); }
};
* 참고
RFC 7159 : The JavaScript Object Notation (JSON) Data Interchange Format