Category Archives: Problem & Solving

Mac에서 어플리케이션 Screen Recording 옵션 활성화하기

Mac에서 어플리케이션 Screen Recording 옵션을 활성화하는 방법에 대해 알아보도록 하겠습니다.

간혹 미팅 앱을 사용할 때, 화면 공유 옵션을 누르면 자동으로 설정의 Security & Privacy 메뉴에서 Screen Recording을 허락할 것인지 친절하게 물어는데요,

여기서 Screen Recording을 허용하려는 어플리케이션이 아예 안 뜨는 경우가 있습니다. 그러면 옵션을 활성화해야하는데, 그 어플리케이션 자체가 안 보이다보니 허락을 못해서 화면 공유를 못하게 됩니다. 저의 경우 zoom 앱을 새로 다운로드 받았을 때 화면 공유를 하려고 하니까 시스템 설정에서 Screen Sharing을 허락하라고 하는데, 아래처럼 옵션에서 zoom 앱이 보여야하는데, 아예 없어서 허락을 못하는 상황이었습니다.

아마도 맨 처음에 설치할 때 실수로 Screen Sharing을 하겠냐는 질문창을 스킵해서 다시는 그 질문창이 안 뜨면서 허용 앱 리스트에서 안 보이는 것일 수 있습니다.

어플리케이션을 다시 지웠다가 새로 깔면 다시 물어보기 때문에 된다고 하지만 이것보다는 terminal에서 간단하게 컨트롤하는 방법을 소개해드리려고 합니다.

  1. app id 찾기

먼저 스크린 공유를 하고 싶은 앱의 id를 찾습니다. terminal을 실행한 후 아래 명령어를 타이핑하시면 app id가 출력됩니다. mdls -name kMDItemCFBundleIdentifier -r <YOUR APP NAME & EXTENSION> 이라는 명령어이고 zoom 앱의 경우 이름과 확장자명이 zoom.us.app 이었습니다. (Name & Extension 란에서 확인하실 수 있습니다.)

그래서 다음과 같이 타이핑하면,

mdls -name kMDItemCFBundleIdentifier -r zoom.us.app

터미널 결과로 us.zoom.xos% 가 출력되는데요, 이를 통해서 zoom 앱의 아이디는 us.zoom.xos 인 것을 알 수 있습니다.

2. Screen Recording 상태 리셋하기

Screen Recording 상태를 리셋하는 이유는, 리셋을 통해서 컴퓨터에서 직접 Screen Recording 하겠냐고 다시 물어보도록 하기 위해서입니다. 명령어는 tccutil reset ScreenCapture <YOUR APP ID> 입니다.

tccutil reset ScreenCapture us.zoom.xos

위와 같이 터미널에서 커맨드를 실행하면, zoom앱에서 Screen Recording 허락을 하겠냐는 질문을 맥북에서 다시 합니다. 그 때 시스템 설정에서 허용해주시면 됩니다.

Github에서 sub directory 또는 file 1개만 가져오는 방법

간혹 github을 clone 하려고 할 때, sub directory만 필요한데 생각보다 clone이 가능한 github repository 코드 전체 용량이 심하게 클 경우 clone을 하는게 망설여질 때가 있습니다.

이럴 때 적용할 수 있는 간단한 방법이 있습니다

먼저 해당 sub directory 또는 file을 저장할 local directory를 생성후 해당 directory로 이동합니다

mkdir project
cd project

그러고 나서 아래 github 관련된 명령어를 순차적으로 실행시켜 주시면 됩니다

git init

git config core.sparseCheckout true

git remote add -f origin <clone 가능한 git url>

echo "<갖고 오고 싶은 directory 주소/*>" .git/info/sparse-checkout

git pull origin master

아래 예시를 통해서 좀 더 자세히 보여드리겠습니다

git init

git config core.sparseCheckout true

git remote add -f origin https://github.com/udacity/DSND_Term2.git

echo "lessons/ObjectOrientedProgramming/*"> .git/info/sparse-checkout

git pull origin master

여기서 echo 다음에 가지고올 directory 주소/* 를 하면 sub dir 하위의 파일들을 전부 가지고 옵니다. 만약에 파일 1개만 가지고 오고 싶으시다면 그 파일의 path만 echo 다음에 적어주시면 됩니다.

Service ‘sparkDriver’ could not bind on a random free port. You may check whether configuring an appropriate binding address. 에러 해결하기

설치하고 잘 되던 apache spark가 갑자기 terminal에서 pyspark만 쳤는데도 또는 코드 상에서 spark context를 init하기만 해도, Service 'sparkDriver' could not bind on a random free port. You may check whether configuring an appropriate binding address. 와 같은 에러가 날 수가 있는데요,

해결방법은

terminal에서 hostname을 타이핑해서 나오는 이름을 /etc/hosts 파일에 아래와 같이 한 줄 추가해주면 됩니다.

127.0.0.1 <your hostname>

그러고 나서 다시 terminal에서 pyspark라고 치면 정상적으로 작동하는 것을 확인할 수 있습니다 🙂

Visual Studio Code 내 Terminal 실행 시 Anaconda virtual env가 제대로 세팅이 안 될 때

보통 Visual Studio Code내 Terminal 실행 환경 구성이 잘 안 되면, 좌측 하단 톱니바퀴 모양 아이콘을 클릭 >> command palette 에 가서 Python: Select Interpreter 에서 원하는 환경을 선택해주면 된다고 하는데요

제 경우에는 그렇게 해서 anaconda 환경에서 virtual env 로 연결은 잘 되었지만 막상, Visual Studio Code 에디터 자체에서 지원하는 Terminal에서 Python을 실행하면 brew로 설치한 라이브러리가 작동을 안 했었습니다.

즉, 설치는 되어 있기 때문에 local pc의 terminal Anaconda virtual env에서는 brew로 설치한 라이브러리가 동작하지만 Visual Studio Code 내의 Terminal 환경에서는 분명이 Anaconda virtual env이 임에도 brew로 설치한 라이브러리가 없다고만 나오는 것입니다.

그래서 다양한 시도를 해본 결과 settings.json 에서 아래 내용을 추가해야만 Visual Studio Code 에디터 내 Terminal이 실행될 때 local pc의 Anaconda virtual env 환경과 동일하게 실행이 됩니다. 즉, 맨 하단 UI 상에서만 Python 3.7.4 64-bit ('dev':conda) 환경으로 보이는 것이 아니라 정말로 뒷단에서도 그렇게 돌고 있는 것이죠.

"terminal.integrated.env.osx": {
        "PATH": ""
}

그래서 전체 세팅은 저의 경우 아래와 같았습니다. 제 python버전의 path는 "/opt/anaconda3/envs/dev/bin/python" 이기 때문에 아래와 같이 보이구요 거기서 terminal.integrated.env.osx 관련 세팅을 추가해주었습니다.

{
    "python.pythonPath": "/opt/anaconda3/envs/dev/bin/python",
    "emmet.syntaxProfiles": {
    
    },
    "terminal.integrated.env.osx": {
        "PATH": ""
  }
}

settings.json 파일의 위치는 /Users/<사용자 이름>/Application Support/Code/User/settings.json 입니다 🙂

Mac에서 글꼴 추가했는데도 MS 오피스 PPT에서 글꼴이 안 보일 때

분명히 글꼴을 서체 관리자에 추가했음에도, 전혀 전혀 PPT를 사용할 때 글꼴이 검색이 안 되어서 헤맸었는데요,

이유는!! 폰트가 .ttf (True Type Font)냐, .otf (Open Type Font)냐에 따라서 운영체재별로 적용이 될 수도 안 될 수도 있기 때문입니다.

만약 windows 라면 .ttf 형식의 폰트를 사용해야하고 mac os라면 .otf 형식으로 된 폰트를 사용해야합니다.

터미널에서 “서체 관리자” 를 검색하셔서 서체 관리자를 실행시킨 다음,

아래 스크린샷 좌측 상단에서 “+”를 클릭해줍니다.

2020-04-18 오후 7.57.27

그러고 나서 .otf로 된 폰트를 추가해주면 됩니다. ttf 폰트를 otf 폰트로 바꾸기 위해서 구글링하여 무료 변환 웹사이트를 이용했습니다.

https://convertio.co/kr/ttf-otf/ 

2020-04-18 오후 7.57.13

이때 PPT를 켜놓으신 상태에서 서체를 추가하시면 바로 반영이 안 될 수 있어서 PPT를 껐다가 다시 키시면 추가하신 서체를 사용하실 수 있습니다.

MAC에서 NTFS 파일형식 유지하고 외장하드 파일 쓰기 가능하게하는 법 Feat. 추가 소프트웨어 설치없이 하기

우선 MS-DOS(FAT) 형식으로 포맷한 이후에 그래도 USB 쓰기가 안 되시는 분들은 위에 첨부드린 지난 포스트를 읽어주시면 됩니다. 이번 포스트는 요약하자면,

  1. MS-DOS(FAT) 형식으로 포맷하지 않고 그래도 NTFS 형식을 유지하면서 USB나 외장하드 쓰기가 가능하게 하고 싶은 분
  2. 추가로 소프트웨어를 설치했으나 여전히 쓰기가 안 되시는 분

위 두 가지 상황에 계신 분들을 위한 포스트입니다. 기존에 가지고 있던 외장하드에 자료가 있는데 이것을 없애버리고 MS-DOS(FAT)으로 포맷을 할 수는 없어서 NTFS 형식은 유지하되 추가 소프트웨어 설치없이 MAC에 자체적으로 있는 Terminal 터미널을 이용해서 파일 쓰기가 가능하게 하는 방법입니다.

다만 이 방법을 썼더니 Finder 환경설정 사이드바 부문에서 외장디스크를 보게 선택해주었는데요 원래 사이드바에서 보이던 외장하드가 보이지는 않더라구요. 그래도 Terminal에서 열어서 쓰기는 가능합니다. 그러나 이런 점 때문에 안전한 방법인지에 대해서는 확신이 없는데요 그래도 다른 방법으로 다 해봤는데도 해결되지 않아 급하게 필요하신 분들은 해보시면 괜찮을 것 같습니다.

저의 경우 소프트웨어를 2개나 설치했는데도 NTFS 읽기 전용 문제가 해결이 되지 않아서 Terminal 명령어를 이용한 방법으로 해결했습니다.

우선 검색창에서 “터미널”을 치셔서 터미널을 실행시켜줍니다. 그리고 아래 적혀진 명령어를 순서대로 타이핑해서 실행하시면 됩니다.

# 1. usb 명, identifier 명 알아내기
diskutil list 
# 2. usb/외장하드 unmount 하기
sudo diskutil unmount <IDENTIFIER 명>
ex) sudo diskutil unmount /dev/disk2s1
# 3. usb/외장하드 명 export하여 매번 치지 않게 저장
export NAME="<usb/외장하드 명>"
ex) export NAME="SAMSUNG"
제 경우는 삼성 드라이버여서 디폴트 이름이 "SAMSUNG" 이었습니다.
# 4. usb에 새로운 디렉토리 생성하기
sudo mkdir /Volumes/$NAME 
# 5. usb mount 하기
sudo mount -w -t ntfs -o rw,nobrowse /dev/<IDENTIFIER 명> /Volumes/$NAME
ex) sudo mount -w -t ntfs -o rw,nobrowse /dev/disk2s1 /Volumes/$NAME
# 6. 쓰기가 되는지 검증용으로 샘플 파일(tmp.txt) 작성하기
touch /Volumes/$NAME/tmp.txt 
# 7. usb에 저장된 파일 리스트를 불러와서 방금 작성한 파일이 제대로 써졌는지 더블체크하기 
ls -al /Volumes/$NAME 
# 8. usb/외장하드 디렉토리 열어주기
open /Volumes/$NAME
# 9. 파일 옮기는 작업 종료 후 unmount하기
sudo diskutil unmount <IDENTIFIER 명>
ex) sudo diskutil unmount /dev/disk2s1

이후에 파일을 자유롭게 읽고 쓰기를 해주시면 됩니다.

참고로 MS-DOS(FAT) 포맷과 다른 점은 5번 step인데요 MS-DOS(FAT)의 경우 mount하는 명령어는 sudo mount -w -t msdos /dev/<IDENTIFIER 명> /Volumes/$NAME 였습니다. 그러나 이번에는 sudo mount -w -t ntfs -o rw,nobrowse /dev/<IDENTIFIER 명> /Volumes/$NAME 입니다.

Mac에서 USB로 쓰기가 안 될 때 – 읽기 전용 / Read Only 해결하기!! Feat. MS-DOS(FAT) 포맷팅만으로도 절대 해결 안 될 때

NTFS 형식인 USB에 파일을 쓰는게 Mac에서는… 이게 너무 힘들게 해서 라즈베리 OS를 복사하려다가 Mac에서는 도저히 쓰기가 안 되고 포맷팅을 엄청나게 했지만 읽기 전용 무한 루프를 돌다가 윈도우 PC에서 그냥..아주 쉽게 ^^ 복붙했던 기억이 있습니다.

구글링을 엄청 했었네요…그런데 MS-DOS(FAT) 포맷팅만으로도 그냥 문제가 해결되었던 사람들이 너무너무너무너무너무 많아서 제 케이스와 일치되는 걸 찾느라 산넘고 물넘었습니다. 그러다가 언제까지고 그 문제 때문에 힘들 수 없다라는 사실에 드디어!!!!! 정말 간신히 해결책을 찾았고 저같이 고생하는 사람들을 위해서 공유해봅니다.

결론만 요약하자면,

  1. Mac의 Dist Utility 디스크 유틸리티에서 MS-DOS(FAT) 포맷만으로도 쓰기가 되시는 분들은 그렇게 하시면 됩니다. 그런데 그렇게 해도 안 되셨다면, 이 글을 계속 읽어주시면 됩니다.
  2. 참고로 MS-DOS(FAT)은 맥, 윈도우 양쪽 파일 읽기/쓰기 호환이 되도록 선택하는 것인데 한 파일당 4GB를 넘는 것은 읽기/쓰기가 안 되기 때문에 4GB가 넘는 경우 양쪽 OS 호환이 되면서 쓰기가 가능해지려면 ExFAT으로 포맷팅하셔야 되지만 간혹 MS에서도 지원을 더 이상 하지 않아서 파일이 날라가는 경우도 있었다고 합니다.

Disk Utility에서 포맷팅했는데도 쓰기가 안 된다면 Third Party 소프트웨어를 이용해서 포맷팅하면 된다고 해서 했었는데도 여전히 읽기 전용이었어서 참 힘들었었는데요 이렇게 다양한 방법을 동원해 포맷팅을 했으나 (그래서 포맷은 MS-DOS FAT 이었지만) 여전히 읽기 전용이셨던 분들을 위해 정리해봅니다.

먼저 Disk Utility에서 MS-DOS(FAT)으로 포맷팅하는 방법입니다.

< MS-DOS(FAT)으로 포맷팅하는 방법 >

  1. USB를 컴퓨터에 연결시킨 상태에서
  2. 맥북 검색창에서 “디스크 유틸리티” 를 검색하여 디스크 유틸리티를 실행시킵니다
  3. 왼쪽에 활성화된 USB를 클릭한 후, “지우기”를 선택하여 MS-DOS(FAT)으로 포맷으로 지우기를 합니다.
  4. 그러고 나서 Finder를 실행시켜서 USB에 대해서 우클릭하여 “정보 가져오기”를 누릅니다. 이 때 읽기 전용이라고 안 나오신 분들은 축하드립니다. 그렇게 해서 쓰기까지 하시면 됩니다. 그런데 만약 여기서 여전히 읽기 전용이시라면 다음 스텝을 계속 진행시켜줍니다.

< 터미널에서 쓰기 가능하게 작업해주기 >

이 방법은 https://apple.stackexchange.com/questions/148875/i-cant-write-to-my-flash-drive-and-it-is-already-in-the-ms-dos-fat-format-w 에 올라온 답변들 중에 제 상황에 딱 맞게 해결방법을 적어준 것을 정리해놓은 것입니다. 답변 작성자분도 맥북에서 USB를 저같이 포맷해도 쓰기가 안 되는 상황 때문에 face palming을 하고 …. 사전적 정의는 네이버에서 다음과 같았습니다.

이처럼 애플 유저로써 한탄하셨다고 하네요… ㅎㅎ 사실 프로그래밍을 공부하다보면 하라는 대로 하였으나 원하는 대로 프로그램이 동작하지 않는 경우가 종종 있는 것 같습니다. 물론 컴퓨터를 껐다 키면 마법같이 되는 경우도 있고, 또 어떤 경우는 프로그램을 다시 재설치하니 깨끗이 해결된 경우도 있었고 (재설치가 언제나 답은 아니기에 많이 헤매다가 얻어 걸렸었습니다) 또 어떤 경우는 제 쪽에서 minor하게 무수히 많은 스텝 중에 건너뛴 경우도 있고 또는 버전차이로 인한 문제 등등 정말 여러 문제가 있는데요 이 경우 안 될 때는 계속 안 되는 같은 방법을 쓰기보다 전혀 다른 방법을 찾는 게 해결의 길인 것 같습니다.

즉, 포맷팅하라고 해서 했는데도 안 되는 경우는 차라리 다른 방법을 열심히 구글링하는 게 에러를 해결하는 방법 같습니다. 문제는..막상 이 상황에 처해지면 사람은 왜인지 계속 같은 방법을 최소한 5번 이상은 해보게 되는 것 같습니다. 그럴 때 너무 지치지 말고 다른 방법으로 얼른 가면 좋을텐데 ^^ 혹시라도 내가 그 방법을 잘못해서 놓친 게 아닐까 하는 의심 때문에 맴맴 돌면서 같은 방법을 검증하다가 결국 결국에는 다른 해결방법을 찾게 되는 것 같습니다. 그래도 다행히 공동지성이라는 것이 있어서 전세계 사람들이 문제 해결방법을 친절하게 달아주는 덕분에 깔끔하게 해결할 수 있었습니다. 서론이 좀 길었는데요 이제 본론으로 가보도록 하겠습니다~~

1. Terminal 터미널 창 띄우기 (검색창에서 “Terminal” 또는 “터미널”)

2. USB 이름과 IDENTIFIER 식별자 알아내기

diskutil list 라고 타이핑 >> 그러면 결과들이 나오는데요 그 중에 쓰기를 하려고 하는 USB 정보를 보시면 됩니다. 그 전에 포맷팅할 때 이름이 없는 경우는 눈에 잘 띄는 이름으로 포맷팅을 하면 해당 이름으로 보일 것입니다. 아래 예시에서는 “LEARN_LOVE” 입니다. 앞으로 “LEARN_LOVE” 라는 예시를 가지고 설명하도록 하겠습니다. 실제로는 여러분이 가지고 계신 USB의 이름을 사용하시면 됩니다. 포맷팅 할 때 아무것도 지정을 안하셨을 경우 “NO NAME”으로 되어 있으실 수도 있습니다.

3. USB 이름 환경변수로 지정해서 매번 중복으로 치지 않게 작업

USB에 해당하는 IDENTIFIER 이름을 환경변수로 지정하여 매번 타이핑하지 않아도 되게 해줍니다.

export NAME="LEARN_LOVE" 이렇게 하고 나서 변수 세팅이 제대로 되었는지 확인하기 위해 echo $NAME 을 해주시면 변수명이 똑같이 출력되는 것을 확인하실 수 있습니다.

4. USB unmount 해주기

sudo diskutil unmount /dev/<IDENTIFIER 입력> 타이핑

예를 들어 LEARN_LOVE 예시에서는 IDENTIFIER가 disk2s1 이기 때문에 sudo diskutil unmount /dev/disk2s1 이라고 타이핑 하시면 됩니다.

그러면 결과가

Volume LEARN_LOVE on disk2s1 unmounted 라고 나옵니다.

5. 디렉토리 생성하기

sudo mkdir /Volumes/$NAME 라고 타이핑 >> 출력 결과 없음

6. USB mount 해주기

sudo mount -w -t msdos /dev/<IDENTIFIER 입력>/Volumes/$NAME 타이핑 >> 출력 결과 없음

예를 들면, sudo mount -w -t msdos /dev/disk2s1 /Volumes/$NAME

7. 쓰기가 가능해진 것인지 확실히 체크하기 위해 tmp.txt 라는 샘플 텍스트 파일을 USB에 생성

touch /Volumes/$NAME/tmp.txt 타이핑

8. USB에 저장된 파일 리스트 불러오기

ls -al /Volumes/$NAME 타이핑 >> tmp.txt 라고 샘플로 만들어진 파일이 보이면 이제 쓰기가 가능해진 것이 확실해진 것입니다~!! 아래와 같이 tmp.txt 라는 파일이 보이면 쓰기가 가능해진 것입니다. 이제부터 자유롭게 Finder에서 파일을 복붙하여 USB로 쓰기가 가능해집니다.

작업 순서대로 적은 명령어 총정리입니다.

9. 작업 종료 후 USB unmount 해주기

sudo diskutil unmount /dev/<IDENTIFIER 입력> 타이핑

예를 들어 LEARN_LOVE 예시에서는 IDENTIFIER가 disk2s1 이기 때문에 sudo diskutil unmount /dev/disk2s1 이라고 타이핑 하시면 됩니다.

# 1. usb 명, identifier 명 알아내기
diskutil list 
# 2. usb unmount 하기
sudo diskutil unmount /dev/<IDENTIFIER 명> 
# 3. usb에 새로운 디렉토리 생성하기. 여기서 $NAME은 USB명. 
sudo mkdir /Volumes/$NAME 
# 4. usb mount 하기
sudo mount -w -t msdos /dev/<IDENTIFIER 명> /Volumes/$NAME 
# 5. 쓰기가 되는지 검증용으로 샘플 파일 작성하기
touch /Volumes/$NAME/tmp.txt 
# 6. usb에 저장된 파일 리스트를 불러와서 방금 작성한 파일이 제대로 써졌는지 더블체크하기 
ls -al /Volumes/$NAME 
# 7. 파일 옮기는 작업 종료 후 unmount하기
sudo diskutil unmount <IDENTIFIER 명>
ex) sudo diskutil unmount /dev/disk2s1

조금이나마 도움이 되셨으면 좋겠습니다 감사합니다~!! 🙂

주피터 노트북 RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

이상한 게 맨 처음에 import numpy as np하는 부분이 있는데 거기서는 에러가 안나고 tensorflow와 같이 사용되었을 때 에러가 났다.

참고한 Stack Overflow

위에는 참고한 Stack Overflow다. 공통적으로 말하는 것은 numpy 버전에 관한 것인데 numpy 버전을 업그레이드 시키는 게 가장 깔끔한 것 같다. 다만 anaconda python3 에 올라간 경우에는 conda update numpy나 conda update tensorflow 를 해도 소용이 없는 게 conda에서 관리되는 numpy 버전의 최선은 내 경우에는 1.13.1 이어서 아마도 이 호환 문제를 해결하려면 pip3으로 numpy 버전을 upgrade 시켜야 했다.

pip3 install "numpy == 1.15.0" --user 

이렇게 하니 해결되었다~~ 한참 헤맸는데 역시 집중해서 차분하게 하는 게 최고다…!

다시 힘내보자!! 화이팅~~ 🙂

특정 키워드로 시작되고 그 키워드만 포함시키고 싶을 때 Only contains certain keywords Regex

^((특정s{0,2}키워드)s*)+$

특정 키워드로 시작되고 그 키워드만 포함시키고 싶을 때 사용하는 정규표현식이다.

왜냐면 1) 특정 키워드로만 이루어진 문장 2) 특정 키워드 + 다른 키워드/표현

여기서 1)의 경우는 특정 키워드를 잡는 게 유의미할 수 있지만 2)의 경우에는 다른 키워드가 더 중요한 의미일 수 있기 때문에 특정 키워드로 시작해서 그 키워드만 있는 문장만 잡고 싶은 케이스에 사용하는 정규표현식이다.

해석)

  • ^ : 시작
  • s : 띄어쓰기
  • *, + : 무한반복
  • {0,2} : 0 ~ 2번 반복
  • $ : 문장 끝

자연어 관련해서 챗봇을 개발하다보면, 단순 키워드 매칭보다도 문장의 패턴을 인식해서 정말 그 상황에 맞는 키워드를 골라내야할 때가 있는데 이 때 정규표현식 패턴을 적용하면 좋다.

정규표현식을 테스트하는 사이트는 많은데 나는 주로 https://regex101.com/ 를 사용한다.

위에 정규표현식을 입력하고 TEST STRING에 테스트하고 싶은 문장들을 적으면 된다.

스크린샷 2019-03-14 오후 11.29.51.png

세상이 정말 좋아서 이렇게 정규표현식을 테스트해 볼 수 있고, 아래 전체 화면을 보면 우측에 EXPLANATION에서 사용된 정규표현식에 대한 해석이 자세히 나오고 MATCH 정보도 볼 수 있고 등등 유용한 정보가 한눈에 모아져있다. 심지어 UI도 예쁘다!!! 참 감사하다.

스크린샷 2019-03-14 오후 11.37.39.png

 

하나의 Object Array에서 중복값 제거하기 (Remove duplicates from one Object Array)

업무를 하다가 Object Array에서 중복값을 제거할 필요가 생겼다.

예전에는 이렇게 하나하나 찾아서 해결했던 것들을 자세히 기록하지 않았는데, 그래도 기록을 해놓는 것이 나도 기억해내기 좋고 (같은 문제를 겪을 수 있으니까) 다른 사람에게도 도움이 될 것 같아서 적어보았다.

처음에는 filter 를 적용해야했다. 그래서 쉽게 풀릴줄 알았는데 동일한 값을 중복해서 저장하고 있었다. 그냥 들어오는대로 무조건 저장하는 로직. 그래서 똑같은 값에 대한 중복도 제거해줘야했다.

이 문제 때문에 찾은게 reduce인데 음 내가 적용해봤던 방법은 Object Array 자체에 대해서 중복 제거는 안 되고 Object 말고 Value Array에 대해서 중복 제거가 가능했다. 그러려면 map을 써야겠다고 생각했다.

filter는 value만 return 하지 않고 Object 통째로 return한다.

map은 value만 리턴 가능한데 if문을 conditional하게 적용하면 그 조건에 맞지 않는 것에 대해서 undefined가 떴다. 이 undefined는 제거가 안 된다고 한다.

그래서 1차 filter 2차 map 3차 reduce를 적용해서 제거하게 되었다… 아마 더 간결한 코드가 있을 것 같은데 우선 여기까지 idea develop한 것을 정리한다.

array = [{“entity”:”color”,”value”:”red”},{“entity”:”color”,”value”:”yellow”},{“entity”:”color”,”value”:”pink”},{“entity”:”color”,”value”:”blue”},{“entity”:”color”,”value”:”red”},{“entity”:”furniture”,”value”:”chair”}]

위와 같은 array에 아래 코드를 적용하면 중복값이 제거된 value array가 남는다.

array.filter(e=> e.value != ‘yellow’ && e.entity ===’color’).map(e=> e.value).reduce(function(a,b){if (a.indexOf(b) <0) a.push(b); return a;},[])

 

스크린샷 2019-03-05 오전 8.00.22

스크린샷을 보면 처음에 array가 있었고, array.filter(e=> e.value != ‘yellow’ && e.entity ===’color’) 코드를 적용해서 entity는 color이면서 value는 yellow가 아닌 object로 구성되어있는 array가 필터화되어서 남는다.

array.filter(e=> e.value != ‘yellow’ && e.entity ===’color’).map(e=> e.value) 여기에 map을 이용해서 value array만 남기고 거기에서 중복값을 제거하는 코드를 추가하면 array.filter(e=> e.value != ‘yellow’ && e.entity ===’color’).map(e=> e.value).reduce(function(a,b){if (a.indexOf(b) <0) a.push(b); return a;},[]) 완성된다.

처음으로 코드 작성한 것을 워드프레스에 올려 보았는데 code snippet을 보기 좋게 색깔을 바꾸는 등 올릴 수 있는 방법을 찾아봐야겠다.