Mac에서 어플리케이션 Screen Recording 옵션을 활성화하는 방법에 대해 알아보도록 하겠습니다.
간혹 미팅 앱을 사용할 때, 화면 공유 옵션을 누르면 자동으로 설정의 Security & Privacy 메뉴에서 Screen Recording을 허락할 것인지 친절하게 물어는데요,
여기서 Screen Recording을 허용하려는 어플리케이션이 아예 안 뜨는 경우가 있습니다. 그러면 옵션을 활성화해야하는데, 그 어플리케이션 자체가 안 보이다보니 허락을 못해서 화면 공유를 못하게 됩니다. 저의 경우 zoom 앱을 새로 다운로드 받았을 때 화면 공유를 하려고 하니까 시스템 설정에서 Screen Sharing을 허락하라고 하는데, 아래처럼 옵션에서 zoom 앱이 보여야하는데, 아예 없어서 허락을 못하는 상황이었습니다.
아마도 맨 처음에 설치할 때 실수로 Screen Sharing을 하겠냐는 질문창을 스킵해서 다시는 그 질문창이 안 뜨면서 허용 앱 리스트에서 안 보이는 것일 수 있습니다.
어플리케이션을 다시 지웠다가 새로 깔면 다시 물어보기 때문에 된다고 하지만 이것보다는 terminal에서 간단하게 컨트롤하는 방법을 소개해드리려고 합니다.
app id 찾기
먼저 스크린 공유를 하고 싶은 앱의 id를 찾습니다. terminal을 실행한 후 아래 명령어를 타이핑하시면 app id가 출력됩니다. mdls -name kMDItemCFBundleIdentifier -r <YOUR APP NAME & EXTENSION> 이라는 명령어이고 zoom 앱의 경우 이름과 확장자명이 zoom.us.app 이었습니다. (Name & Extension 란에서 확인하실 수 있습니다.)
설치하고 잘 되던 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 실행 환경 구성이 잘 안 되면, 좌측 하단 톱니바퀴 모양 아이콘을 클릭 >> 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 관련 세팅을 추가해주었습니다.
우선 MS-DOS(FAT) 형식으로 포맷한 이후에 그래도 USB 쓰기가 안 되시는 분들은 위에 첨부드린 지난 포스트를 읽어주시면 됩니다. 이번 포스트는 요약하자면,
MS-DOS(FAT) 형식으로 포맷하지 않고 그래도 NTFS 형식을 유지하면서 USB나 외장하드 쓰기가 가능하게 하고 싶은 분
추가로 소프트웨어를 설치했으나 여전히 쓰기가 안 되시는 분
위 두 가지 상황에 계신 분들을 위한 포스트입니다. 기존에 가지고 있던 외장하드에 자료가 있는데 이것을 없애버리고 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 입니다.
NTFS 형식인 USB에 파일을 쓰는게 Mac에서는… 이게 너무 힘들게 해서 라즈베리 OS를 복사하려다가 Mac에서는 도저히 쓰기가 안 되고 포맷팅을 엄청나게 했지만 읽기 전용 무한 루프를 돌다가 윈도우 PC에서 그냥..아주 쉽게 ^^ 복붙했던 기억이 있습니다.
구글링을 엄청 했었네요…그런데 MS-DOS(FAT) 포맷팅만으로도 그냥 문제가 해결되었던 사람들이 너무너무너무너무너무 많아서 제 케이스와 일치되는 걸 찾느라 산넘고 물넘었습니다. 그러다가 언제까지고 그 문제 때문에 힘들 수 없다라는 사실에 드디어!!!!! 정말 간신히 해결책을 찾았고 저같이 고생하는 사람들을 위해서 공유해봅니다.
결론만 요약하자면,
Mac의 Dist Utility 디스크 유틸리티에서 MS-DOS(FAT) 포맷만으로도 쓰기가 되시는 분들은 그렇게 하시면 됩니다. 그런데 그렇게 해도 안 되셨다면, 이 글을 계속 읽어주시면 됩니다.
참고로 MS-DOS(FAT)은 맥, 윈도우 양쪽 파일 읽기/쓰기 호환이 되도록 선택하는 것인데 한 파일당 4GB를 넘는 것은 읽기/쓰기가 안 되기 때문에 4GB가 넘는 경우 양쪽 OS 호환이 되면서 쓰기가 가능해지려면 ExFAT으로 포맷팅하셔야 되지만 간혹 MS에서도 지원을 더 이상 하지 않아서 파일이 날라가는 경우도 있었다고 합니다.
Disk Utility에서 포맷팅했는데도 쓰기가 안 된다면 Third Party 소프트웨어를 이용해서 포맷팅하면 된다고 해서 했었는데도 여전히 읽기 전용이었어서 참 힘들었었는데요 이렇게 다양한 방법을 동원해 포맷팅을 했으나 (그래서 포맷은 MS-DOS FAT 이었지만) 여전히 읽기 전용이셨던 분들을 위해 정리해봅니다.
먼저 Disk Utility에서 MS-DOS(FAT)으로 포맷팅하는 방법입니다.
< MS-DOS(FAT)으로 포맷팅하는 방법 >
USB를 컴퓨터에 연결시킨 상태에서
맥북 검색창에서 “디스크 유틸리티” 를 검색하여 디스크 유틸리티를 실행시킵니다
왼쪽에 활성화된 USB를 클릭한 후, “지우기”를 선택하여 MS-DOS(FAT)으로 포맷으로 지우기를 합니다.
그러고 나서 Finder를 실행시켜서 USB에 대해서 우클릭하여 “정보 가져오기”를 누릅니다. 이 때 읽기 전용이라고 안 나오신 분들은 축하드립니다. 그렇게 해서 쓰기까지 하시면 됩니다. 그런데 만약 여기서 여전히 읽기 전용이시라면 다음 스텝을 계속 진행시켜줍니다.
이처럼 애플 유저로써 한탄하셨다고 하네요… ㅎㅎ 사실 프로그래밍을 공부하다보면 하라는 대로 하였으나 원하는 대로 프로그램이 동작하지 않는 경우가 종종 있는 것 같습니다. 물론 컴퓨터를 껐다 키면 마법같이 되는 경우도 있고, 또 어떤 경우는 프로그램을 다시 재설치하니 깨끗이 해결된 경우도 있었고 (재설치가 언제나 답은 아니기에 많이 헤매다가 얻어 걸렸었습니다) 또 어떤 경우는 제 쪽에서 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
위에는 참고한 Stack Overflow다. 공통적으로 말하는 것은 numpy 버전에 관한 것인데 numpy 버전을 업그레이드 시키는 게 가장 깔끔한 것 같다. 다만 anaconda python3 에 올라간 경우에는 conda update numpy나 conda update tensorflow 를 해도 소용이 없는 게 conda에서 관리되는 numpy 버전의 최선은 내 경우에는 1.13.1 이어서 아마도 이 호환 문제를 해결하려면 pip3으로 numpy 버전을 upgrade 시켜야 했다.
세상이 정말 좋아서 이렇게 정규표현식을 테스트해 볼 수 있고, 아래 전체 화면을 보면 우측에 EXPLANATION에서 사용된 정규표현식에 대한 해석이 자세히 나오고 MATCH 정보도 볼 수 있고 등등 유용한 정보가 한눈에 모아져있다. 심지어 UI도 예쁘다!!! 참 감사하다.
스크린샷을 보면 처음에 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을 보기 좋게 색깔을 바꾸는 등 올릴 수 있는 방법을 찾아봐야겠다.