비공개로 작업하던 레포 공개로 전환하기 위해 스크릿 파일 삭제하기

상황

  • 리액트 스터디가 끝났다..!
  • 스터디하면서 github에 비공개 레포로 진행했었는데
  • 스터디를 끝내면서 공개로 전환하기로 했다
  • 하지만 공개로 전환하기 전에 aws를 사용하면서 저장해둔 rds 접속 정보 등 시크릿 파일을 제거해야 한다
  • 히스토리에서도 완전히 삭제하는 것을 목표로 한다

시도1 ; git filter-branch

1
git filter-branch --index-filter 'git rm --cached --ignore-unmatch utils\rdsSecret.ts' HEAD
  • 명령을 실행하니까 filter-repo를 사용하라고 했다

시도2 ; git filter-repo

  • 나는 윈도우를 쓰고 있는데, 윈도우에서 인스톨할 때 주의사항이 있었다
  • scoop을 통해 설치하면 문제없다 하여 scoop을 설치한다

scoop 설치 및 filter-repo 설치

  • https://scoop.sh/
  • scoop은 윈도우용 커맨드 라인 인스톨러라고 한다
  • 설치를 위해 파워쉘을 관리자 권한으로 실행하고 다음을 실행한다
1
2
3
4
5
6
# scoop 설치
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

# filter-repo 설치
scoop install git-filter-repo

filter-repo로 git history 속 민감한 정보 삭제하기

1
2
3
4
5
git filter-repo --invert-paths --path utils/rdsSecret.ts
//...
git filter-repo --invert-paths --path secret1
git filter-repo --invert-paths --path secret2
git filter-repo --invert-paths --path secret3
  • README.md에 민감한 정보가 있는 경우, 기존 내용을 복사했다가
  • 명령어로 히스토리에서 제거하고,
  • 다시 파일을 생성하고 민감한 정보를 없애고 새로 커밋을 해주었다
  • 이 작업을 진행하면 리모트 주소가 삭제되는데,
  • git remote add {레포 주소} 한다

주의사항

  • 작업을 진행하기 전에 백업 레포를 하나 생성하자
  • --path 경로 작성할 때, \로 작성하면 안 되고 /로 작성해야 한다
  • 제거하고자 하는 파일을 이름을 변경한 적이 있던가,
  • 폴더를 이동했었으면 이전의 내역까지 완전히 사라지지 않는다
  • 그래서 수동으로 하나씩 찾아서 해줘야 한다
  • sourcetree에서 히스토리 검색을 통해서 꼼꼼히 체크하여 삭제를 진행한다

참고

리액트할 때 사용하는 스니펫

  • ES7 React/Redux/GraphQL/React-Native snippets 확장도구에서 제공하는 스니펫을 사용한다

리액트

1
2
3
4
5
6
7
8
// rfce 또는 rfc
import React from 'react';

function App() {
return <div></div>;
}

export default App;

리액트 네이티브

1
2
3
4
5
6
7
8
9
10
11
// rnf
import React from 'react';
import { View, Text } from 'react-native';

export default function App() {
return (
<View>
<Text></Text>
</View>
);
}

참고

반응속도 테스트 클론코딩

기능

  • 반응속도 기록
  • 랜덤 간격
  • 눈 덜 아프게
  • 결과에 따라 다른 메시지
  • 예측 클릭하면 횟수 -1

느낀점

  • 기존 테스트가 색이 확 반전돼서
  • 집중은 해야 하는데 눈이 너무 아팠다
  • 그래서 배경색은 그대로에 초록점이 생기도록 했다
  • 컨텍스트 쓸까 고민하다가 어차피 깊이도 안 깊어서 그냥 prop으로 넘겨줬다

개선방향

공유 버튼 만들기

  • 결과 이미지 생성해서 클립보드 복사해주기 또는 이미지 파일로 저장

구린 css 바꾸기

  • 색을 좀 이쁘게 써보자

레포

emojipedia 이모지 검색해서 찾기

  • Win + ., Win + ; 단축키로 이모지를 쓸 수 있는 건 좋은데 찾는 게 어렵다
  • 키워드로 원하는 이모지를 검색해보자
  • 사용 예시까지 알려준다 ㅋㅋ

참고

Map을 포함한 Object JSON stringify

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
interface MyType {
id: number;
cover: string;
outComes: Map<number, string>;
questions: Map<number, Map<number, string>>;
}

const stringify = (object: any) => {
for (const eachIdx in object) {
if (object[eachIdx] instanceof Map) {
object[eachIdx] = Array.from(object[eachIdx]);
stringify(object);
} else if (typeof object[eachIdx] == 'object') stringify(object[eachIdx]);
}
return JSON.stringify(object, null, 2);
};

const jsonString2ObjectWithMap = <ReturnType>(
jsonString: string
): ReturnType => {
const object = JSON.parse(jsonString);
console.log(`-------------변환전`);
console.log(object);

const jsonstringToObject = (object) => {
for (const eachIdx in object) {
if (
object[eachIdx] instanceof Array &&
object[eachIdx].length > 0 &&
object[eachIdx][0].constructor === Array
) {
object[eachIdx] = new Map(object[eachIdx]);
jsonstringToObject(object);
} else if (typeof object[eachIdx] == 'object')
jsonstringToObject(object[eachIdx]);
}

return object;
};

console.log(`-------------변환후`);
const result = jsonstringToObject(object);

console.log(result);

return result;
};
실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const myObject: MyType = {
id: 30,
cover: 'cover',
outComes: new Map([
[0, 'o1'],
[1, 'o2'],
]),
questions: new Map([
[
0,
new Map([
[1, 'answer1'],
[2, 'ansewr2'],
]),
],
[
1,
new Map([
[1, 'ansewr1'],
[2, 'ansewr2'],
]),
],
[2, new Map([])],
]),
};

console.log(`-----------------map을 포함한 오브젝트 json stringify`);
const rst = stringify(myObject);
console.log(rst);
console.log(typeof rst);

console.log(`-----------------다시 오브젝트화`);
const result = jsonString2ObjectWithMap<MyType>(rst);
output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
-----------------map을 포함한 오브젝트 json stringify
{
"id": 30,
"cover": "cover",
"outComes": [
[
0,
"o1"
],
[
1,
"o2"
]
],
"questions": [
[
0,
[
[
1,
"answer1"
],
[
2,
"ansewr2"
]
]
],
[
1,
[
[
1,
"ansewr1"
],
[
2,
"ansewr2"
]
]
],
[
2,
[]
]
]
}
string
-----------------다시 오브젝트화
-------------변환전
{
id: 30,
cover: 'cover',
outComes: [ [ 0, 'o1' ], [ 1, 'o2' ] ],
questions: [ [ 0, [Array] ], [ 1, [Array] ], [ 2, [] ] ]
}
-------------변환후
{
id: 30,
cover: 'cover',
outComes: Map { 0 => 'o1', 1 => 'o2' },
questions: Map { 0 => [ [Array], [Array] ], 1 => [ [Array], [Array] ], 2 => [] }
}

상황

  • 서버로 json 형태로 값을 전달하고 싶은데…
  • Map은 json stringify로 변환되지 않는다
  • 변환하기 위해서는 한번 Array로 변환한 다음에야 가능했다
  • 어떤 객체에 맵이 중첩으로 사용된 경우 수동으로 바꿔주는 게 귀찮다

해결

stringify.ts
1
2
3
4
5
6
7
8
9
const stringify = (object: any) => {
for (const eachIdx in object) {
if (object[eachIdx] instanceof Map) {
object[eachIdx] = Array.from(object[eachIdx]);
stringify(object);
} else if (typeof object[eachIdx] == 'object') stringify(object[eachIdx]);
}
return JSON.stringify(object, null, 2);
};
  • 객체 안 멤버들을 하나씩 돌아가면서 Map이거나 오브젝트인지 확인한다
  • Map이면은 JSON stringify 할 수 있는 Array로 변환한다
  • 오브젝트이면 중첩되어있는 Map을 찾기 위해 재귀적으로 반복한다

사용법

  • myObject와 같은 중첩 map을 포함하고 있고,
  • 포함되어있는 Map이 Map<number,string> 일 경우에만 때만 테스트해보아서, 더 다양한 경우에도 동작할지는 모르겠다
  • input : { a:… } 처럼 오브젝트를 넣어야 한다
  • console.log 찍어봤을 때 { }로 묶여있는…
  • 만약에 그냥 Map인 경우에는 이런 식으로 { a: new Map() } 한번 감싸주면 된다

repo

특정 자바 버전으로 jar 실행

상황

  • 기존에 사용하던 A.jar 실행파일이 있다
  • 자바 버전을 바꿨다
  • 환경변수 변화로 인해 A.jar이 더 이상 동작하지 않는다
  • 이 실행파일만 기존 자바 버전으로 실행할 수 없을까?
  • 또는
  • A.jar은 jdk9에서 실행 가능하고
  • B.jar은 jdk13에서 실행 가능한데, 둘 다 각자의 자바 버전으로 실행하려면 어떻게 해야 할까?

실행파일 만들기

ex.bat
1
2
3
4
5
6
7
pushd "%~dp0"

"C:\Program Files\Java\jdk-9.0.4\bin\java.exe" -version
pause

"C:\Program Files\Java\jdk-13.0.2\bin\java.exe" -version
pause
  • 각 버전의 자바 파일 경로를 앞에 써준다
  • -version 옵션을 주어서 원하는 버전의 자바가 실행되는지 확인한다
runA.bat
1
2
3
pushd "%~dp0"

"C:\Program Files\Java\jdk-9.0.4\bin\java.exe" -jar A.jar
  • 이런 식으로 특정 자바 버전으로 jar을 실행할 수 있겠다

참고