[RPI-PICO] 오디오 쥬크박스 만들기 2

이전글들

우선 하드웨어 구성은 아래와 같습니다.

Waveshare Pico-Audio original revision
Waveshare Pico-LCD-1.44
Raspberry Pi Pico
microSD Card Adapter
Waveshare Expander Quad

이중에서 Pico-Audio는 I2C 연결
Pico-LCD-1.44는 SPI 연결
microSD Card Adapter도 SPI 연결이구요

라즈베리파이 피코가 SPI 채널이 두개라, 잘 안겹치게 배정해서 소스코드에 기재하면 됩니다. Expander를 쓰기 때문에 하드웨어적으로는 일단 조정을 잘 안해도 되고 다만 microSD Card Adapter의 경우 핀 구조상으로 Expander에 못끼우기에 점퍼케이블을 female to female로 연결해야 하네요.

본래 Expander Dual을 썼는데 모듈을 하나 더 달아야 해서 Quad로 바꾼 것도 특기해야 합니다.

일단 기존의 샘플 코드를 분석해서 흐름을 꿰찰려고 했는데요. Pico-LCD-1.44의 네개 버튼 시연 코드를 일부 떼어내어 가져와서 메뉴를 구성하고 키값을 구해서 눌린지 확인하는 조건문 코드 안에 Pico-Audio 시연 코드에 들어있는 톤 재생 코드를 두니 버튼 누르면 재생이 되었습니다.

그러나 같은 키를 한번 더 누르면 멈추게 하는 것을 살펴봐야 했고, 이는 제작사에서 제시한 라이브러리로 가능한데요. 음질의 경우 톤으로 내는 것은 소스코드에 텍스트 정보로 톤 정보로만 저장되어 재생되는 구조라 음질이 조금 좋은 부저 정도라, MP3 정도는 되어야 하기에 그만두고 microSD Card Adapter를 구해서 연결해보았습니다. microSD 카드에 MP3를 저장해서 불러오는 용도였죠.

microSD 카드는 킹스턴 제품으로, SDHC class 10 UHS-I 지원 제품인데요. 어떤 이유로 인해 FatFS를 사용하는 모든 기존의 프로젝트에서 f_mount() 실행시 error: physical drivce does not work 같은 오류가 나면서 마운트에 실패합니다.

몇가지 이상 증상은

  • LED 점멸로 상태작동을 보여주는 기능이 작동하다가 안하다가 하는데 무조건 마운트 실패
  • BOOTSEL 연결시 PC에 30초 가량 딜레이가 발생하면서 마우스 커서 버벅임
  • 라즈베리파이 피코 내장 플래시가 2MB인데, 무려 127MB로 60배가 뻥튀기되어 보임
  • 아무런 파일도 기록이 안되던 microSD 카드에 이상한 파일과 디렉토리가 발견

인데요.

뭔가 이상해서 macOS에서도 해보니 똑같이 f_mount()에서 안돕니다.

아무래도 FatFS에서 내부적으로 쓰는 코드 중에 SPI 핀과 SD 카드 명세는 잘 해놨어도 ff.c 같은 파일에서 지정하는 매크로 상수를 튜닝해야 제가 쓰는 microSD 카드와 호환된다는 것 같았는데 위 증상을 보면 석연치 않지만, 일단은 프로젝트 저자들도 SD 카드 브랜드가 문제라고 하기도 하네요. 잘 생각해보면 브랜드마다 사양도 다르고, 특히 블락 크기 설정 같은 설정도 잘 살펴서 해야 할 것 같습니다.

그래서 우선 재껴두고 집에 있는 USB 메모리를 달아 해보려고 하는데요. 라즈베리파이 피코의 USB 단자에 USB 메모리를 장착하고, Expander Quad에 별도로 있는 USB 단자로 전원공급을 해서 해볼 생각입니다. 라즈베리파이 피코를 MSC 호스트로 두고 해보는 것이죠. TinyUSB로 비슷한 작업을 하는게 되던데 잘 살펴보고 있습니다.

일단 USB 표준부터 보고 있고 단행본 입수전에 연구논문과 학위논문을 찾아서 일반적인 해설을 한 부분을 집중해서 보려고 하네요.

FatFS가 작동하면 128kbps 44.1kHz MP3 파일을 네개 저장해서 불러와서 LCD의 키로 메뉴 선택후 I2S로 재생하는 것을 할 것입니다.

FatFS로는 일단 집에 있는 USB 메모리로 해보고, 시간이 가면 microSD 카드를 최대한 작은 용량으로 오래전 사양으로 맞추어보려고 합니다. 둘다 안되면 FatFS 소스코드를 뒤적여서 하드웨어 명세를 맞추어줘야죠.

오디오 재생은 제가 쓰는 Pico-Audio original revision이 PCM5101A를 디코더로 쓰는데요. 32비트 384kHz까지 감지한다고 되어 있고 다이나믹 레인지가 106dB입니다. 44.1kHz 128kbps MP3 재생에 지장이 없습니다. 라즈베리파이 피코 C SDK에 포함된 USB 사운드 카드 모드로 돌려보면 음질이 좋습니다.

일단 USB MSC부터 살펴보면서 공부한 것을 정리해서 올리겠습니다.

[RPI-PICO] 라즈베리파이 피코의 USB 단자를 통한 Virtual COM Port 시리얼 모니터 사용법

vscode에 Raspberry Pi Pico 확장기능이 잘 설치되어 있다는 가정 하에 진행합니다. (특히 Serial Monitor)

우선 CMakeLists.txt에 아래 코드를 추가합니다

이 코드는 USB에 stdio를 허용하고 UART에는 비허용하는 코드입니다.

그리고 C 코드의 main() 함수에 아래 코드를 추가합니다.

이렇게 해두고 컴파일해서 uf2를 라즈베리파이 피코에 심습니다.

vscode에서 시리얼 모니터를 열고 Toggle Sent Message Echoing 버튼을 누르고 Start Monitoring 버튼을 누릅니다. 그러면 라즈베리파이 피코가 USB에 연결된 상태라면 BOOTSEL이든 일반 연결 모드든 위에 printf()문으로 보낸 정보가 시리얼 모니터에 뜹니다.

처음 연결했다면 printf() 문이 이미 실행되고나서 시리얼 모니터가 켜졌을때 표시가 안될 수 있으니, Toggle Sent Message Echoing을 켜고 Start Monitoring 상태에서 USB를 뺏다 꽂으면 됩니다.

이를 잘 활용하면 함수 실행 결과를 받아와서 조건문으로 검사하고 오류가 난 것을 보여줄 수 있습니다.

macOS에서 부팅시 앱 자동 실행 방지하는 방법

macOS에서 부팅시 자동으로 실행되는 앱을 멈추고 재부팅시 다시 실행이 안되게 해야 하는 경우가 있습니다. 여러 방법으로 자동 구동 앱을 실행이 안되게 할 수가 있는데요. 이 글에서는 몇가지 방법을 해설해보겠습니다.

시스템 설정 → 일반 → 로그인 항목 및 확장 프로그램 → 로그인 시 열기 에서 항목을 토글하고 -를 누릅니다. 그러면 이 앱은 일단 부팅시 자동 실행이 안됩니다.

그래도 안되면 아래 디렉토리에서 자동 실행되는 앱에 해당되는 plist 파일을 삭제해봅니다.

그리고 시스템 종료를 실행해서 뜨는 대화상자에서 “다시 로그인하면 윈도우 다시 열기”를 언체크하고 종료하시고 확인해보시면 되는데요. 그래도 자동 실행이 되면요.

하면 com.apple.loginwindow.암호화된-문자열.plist 와 같은 파일이 표시됩니다.

이렇게 하고 시스템 종료를 하고 다시 부팅하면 자동 실행이 멈춥니다. “다시 로그인하면 윈도우 다시 열기”를 언체크하시구요.

제 경우 해결이 되었는데 안된다면 cp 명령어로 복제해둔 파일을 복구하면 일단 전의 상태로 돌아가게 됩니다. 자동 실행이 안고쳐진 상태지만 일단은 원점에서 돌아가 해결방법을 간구할 수 있습니다. 위에 소개한 벙법대로 실행하면 대부분 해결이 됩니다.

소프트웨어 설정이 저장되는 방식

윈도우를 사용하는 컴퓨터에서 작동하는 모든 프로그램은 설정 사항을 고를 수 있는 경우 이 설정 사항이 저장되는 고유의 방식이 있습니다. 크게 세가지 방식이 특정되는데요.

(1) 램에 저장됨
(2) 특정 디렉토리에 저장됨
(3) 레지스트리에 저장됨

이 세가지 방식을 잘 이해한다면 문제가 있게 될때 프로그램을 삭제하고 재설치할때 요령을 더 잘 살펴볼 수 있게 됩니다.

보통 프로그램을 삭제하면 (1), (2), (3)에 해당되는 설정 사항도 지우는게 일반적인 상식인데요. 프로그램에 따라서는 안지울 수도 있습니다. 이유는 프로그램 재설치시 전에 했던 설정을 복구하기 위함이거나 오류가 발생해서 안지워지는 것일 수 있네요.

완전하게 설정 사항까지 지우려면 (1), (2), (3)에 해당되는 작동 방식을 특정해서 조치를 해야 합니다.

(1)은 삭제후 재부팅을 해보면 좋구요.
(2)는 프로그램마다 설치되어 작동하는 디렉토리와 부수적으로 생성된 디렉토리를 지우면 좋구요.
(3)은 레지스트리에서 삭제가 안된 설정 항목을 지우는 것입니다.

(2)의 경우 윈도우에서는 Program Files 디렉토리만 주로 알려져 있지만, 유저 홈디렉토리 아래 AppData 라고 된 숨겨진 디렉토리의 특정 하위 디렉토리와, 유저 홈디렉토리에 숨겨진 디렉토리로 된 다른 디렉토리도 지워야 하는 경우가 있습니다.

(3)은 디렉토리에 비해 더 잘 안알려져 있을 가능성이 큰데요. 보안을 목적으로 암호화된 방식으로 저장되기도 하고, 잘 안알려져 있는 정보일 가능성이 커서입니다. 이 경우에도 레지스트리에 남아 있는 설정 사항을 지워야 하는 경우가 많습니다.

제어판에서 프로그램 삭제후 수동으로 이 세가지 방식에 대응되는 조치가 잘 이루어졌다면 설정이 완벽하게 지워져서 바라는 결과가 얻어집니다.

요즘은 클라우드 시대라, (4) 클라우드 서버에 저장된 설정 항목도 지우는 조치도 있을 수 있습니다.

주의할 점은 (1)부터 (4)까지 할때는 백업을 해두고 하거나 완전하게 잘 아는 경우에만 하는게 좋을 수 있을 것입니다. 잘못 지워버리면 다른 프로그램의 기능도 망가질 수 있으니까요.

프로그램이 문제가 생겨서 삭제후 재설치할때 이 글에서 언급한 지식이 있으면 더 잘 고칠 수 있을 것입니다.

[RPI-PICO] 오디오 쥬크박스 만들기 1

라즈베리파이 피코로 쥬크박스를 만들어보려고 합니다. 하드웨어 구성은 살펴볼 필요가 없이 아래처럼 조합했습니다.

라즈베리파이 피코 (RP2040)
Waveshare Pico-LCD-1.44
Waveshare Pico-Audio
Waveshare Dual GPIO Expander

이구요.

https://www.waveshare.com/wiki/Pico-LCD-1.44
https://www.waveshare.com/wiki/Pico-Audio

에서 사양과 해설이 나옵니다. 라이브러리도 제공되네요.

LCD 모듈은 SPI 연결이고 TFT-LCD라고 되어있구요. 스위치가 제공되어 메뉴에서 항목 선택시 해당 기능을 실행하게 하는게 가능합니다. 쥬크박스 메뉴 표시와 선택기로 쓸 것이구요. 라이브러리가 잘 되어 있어서 LCD 구동후 표시한 메뉴에서 스위치문으로 신호를 받아 메뉴가 구현됩니다.

오디오 모듈은 I2C 연결이구요. PCM5101A 디코더가 탑재되어 있습니다. 32비트 384kHz의 사양에 다이나믹 레인지가 106dB이네요. 오디오 모듈 상품에 스피커가 포함되어 있습니다.

둘다 전원은 따로 연결하지 않고 라즈베리파이 피코와 연결된 핀으로 받는 것 같은데 자세한 것은 생략합니다.

우선 PCM 원리를 해설하고 들어가겠습니다.

우리 주변의 소리는 아날로그입니다. 음악소리가 스피커에서 나온다든지, 천둥 소리가 들린다는 것은 아날로그 형태의 음압이 발생해서 사람의 귀로 들어가 뇌가 인식하는 것입니다.

음압을 매질이 진동한다고 보면 파형이 되어 그래프처럼 표현하는게 됩니다.

아날로그 소리는 그래프가 매끄럽게 연결된 상태로 그려지구요. 이를 디지털 기기에서 처리할때는 샘플링이라고 해서 표본값을 얻어내서 좌표에 점찍고 처리가 되는 것으로 유비가 됩니다.

우리가 수학시간에 배웠던 것처럼 그래프를 그릴때 함수값에 따라 얻어진 변화값을 구해서 그래프 용지에 찍고나서 이들을 연결하라고 하죠? 이 연결 전의 점을 얻어내는 변화값 추출이 샘플링이고, 이를 이어주는 것이 고음질로 되는 비법입니다.

진폭을 Y축으로 시간을 X축으로 두고 파형을 그렸을때 1초의 소리 신호를 Y축에 따라 높낮이가 그려지는데요. 이때의 소리 신호를 1초에 몇개의 샘플로 얻어내는지에 의해 그래프가 더 매끄럽게 되듯이 샘플링 레이트가 중요한 사양이 됩니다.

즉 1초에 44100개의 샘플이 가능하면 샘플링 레이트는 44.1kHz가 되고 48000개로 가능하면 48kHz가 되죠. 이는 디지털화되었을때 아날로그값이 손실되는 정도를 줄여주고, 음질도 향상시켜줍니다. 그래서 오디오 CD와 DVD-Audio를 구분하기도 하네요.

이와 함께 몇비트라고 할때는 양자화 단계를 의미합니다. 8비트 양자화가 되면 2의 8승인 256 단계가 가능해지구요. 16비트는 2의 16승, 32비트는 2의 32승이 됩니다. 비트는 두가지 값만 가능하니 전체 가능한 단계가 비트로 표현되면 2의 멱수가 됩니다. 이역시도 비트수가 높아지면 정밀한 파형이 되어 음질이 좋아지게 되죠.

이를 펄스로 다룬다고 해서 pulse구요.

샘플이 취해지고 양자화가 이루어지면 각 샘플에는 이진수가 주어집니다. 16비트라면 0000 0000 0000 0000에서 1111 1111 1111 1111가 가능해지는데 이게 코드(code)입니다.

즉 PCM(pulse code modulation)은 소리를 펄스화해서 코드로 바꾸는 변조라는 의미입니다.

이는 ADC(Analog to Digital Converter)로 자연상태의 소리를 디지털화하게 되구요. DAC(Digital to Analog Converter)를 쓰면 음악파일을 스피커로 출력하는 모듈에 채택이 됩니다. 둘다 가진 모듈이 있고 하나만 가진 모듈도 있는 것 같습니다.

사양적으로 32비트, 384kHz를 제공하는 경우에는 이 전체 사양을 다 만족하는 오디오 데이터라고 해도 늘 이 전체를 다 쓰는건 아니구요. 다이나믹 레인지와 필터링, 인터폴레이션, 밴드 리미트 등의 처리를 해야 되는 알고리즘의 특성상, 사양 그대로보다는 입력 데이터와 처리 알고리즘의 특성에 의해 다 쓰이는 것은 아니죠.

다이나믹 레인지는 보통 6dB 마다 1비트씩 는다고 보면 된다는데, 106dB인 경우 대충 17.6 비트네요.

필터링, 인터폴레이션, 밴드 리미트와 같은 기술은 파형으로 다루는 소리 데이터에 노이즈를 적게 하는 용도로도 쓰이고, 파형 자체를 증폭하거나 커트해야 할 필요에 의해 제정된 기술인데 이게 제작사의 기술력과 관련이 있네요.

PCM5101A 데이터시트에 나온 사양도 이로부터 이해가 됩니다.

일단 이론 공부는 대충 이렇게 해두구요. 조만간 코딩도 해서 올려보겠습니다.

제작사에 문의해보니 제가 구한 제품이 rev2.1이라던데 다시 확인해보니 오리지날 리비전으로 밝혀졌습니다.

rev2.1은 시러스로직의 CS4344를 디코더로 쓰고 오리지날 리비전은 텍사스 인스트루먼트의 PCM5101A를 쓰는데요. 이둘이 거의 같아보여도 후자가 사양이 좋습니다. CS4344는 32비트 192kHz까지 감지가 되는 기종이고 PCM5101A는 32비트 384kHz까지 감지가 되는데요. 다이나믹 레인지가 106dB이니 출력되는 음질은 비슷할 수도 있습니다. 물론 여러 변인이 존재하니까요.

리비전 문제로 인해 며칠 확인작업을 했는데, 전에 쓴 글에 문의를 다시 보낸다고 언급했으나 새로 쓴 글에서 언급을 안해두어 인상이 나빠질 듯하여 추가해둡니다.

개발적인 지식을 더 발전시키는 방법

컴퓨터는 활용적인 지식이 있고 개발적인 지식이 있습니다. 활용적인 지식도 개발적인 지식 못지 않게 응용이 필요해서 중요한데요. 웹서버 설정처럼 활용적이라고 할 지식처럼 전문성을 가지고 있어야 잘 하게 되는 경우에 해당됩니다. 설정 파일에 대한 이해와 설정하려는 사이트에 대한 이해, 자원배분을 생각해보는 이해 등등의 지식이 필요하죠.

사실 맞춤해설을 받고 연습을 하면 다들 전문성이 있어야 하는 지식도 익숙해질 수 있습니다. 제가 이 글에서 소개하려고 하는 것은 실천지침인데요. 컴퓨터 활용 능력 시험 등급 1, 2급 다 하실 수 있고 네트워크나 수리기능사 같은 다른 자격증도 보유하셨다면 여기서 그치지 않고 공부를 이어갈때 실력 향상이 되는 방법입니다. 대단한 것은 아니고 무엇을 더 배우면 좋을지에 대한 소개네요.

수리기능사 자격증 보유자시라면, ARM 관련 개발서를 읽고 취미로 하시면 실력 향상에 도움이 됩니다. 회로 구성도 해보고 납땜이나 C로 하는 하드웨어 개발 등등이 이어져서 수리할때도 마더보드 교체없이 하는 UEFI 재프로그래밍이나 시스템 예약 파티션에 대해서도 알게 되니까요.

수학전공이셨다면 수치해석과 같은 체계를 프로그램으로 구현하는 것을 보시면 좋을 것 같애요. 미적분이나 미분방정식 연산을 프로그램 언어로 구현하는 것도 배워보시면 좋을 것 같구요.

웹프로그래밍 과정을 듣고 마스터하셨다면 웹보안쪽 공부와 DBMS 심화 공부, 풀스택 공부로 이어가시면 됩니다.

개발쪽은 아니라면, 검색이 편한 인터넷 서점에서 “비전공자를 위한”이나 “모두를 위한”과 같은 수식어를 포함한 검색어로 검색해보시면 원리를 심도있게 알려주는 책이 많이 나오니 참고해보시구요.

그리고 블로그 하나 만드셔서 알고 계신 지식을 글로 작성해서 올리는 것도 하시면 공부에 도움이 되죠.

요즘처럼 대학에서 안배운 분들께도 전공에 준하는 교육을 해주는 시대에서는 누구나 전문지식을 아는데 큰 도움이 되어줍니다. 무엇보다도 중요한 것은 현재 지식 수준에서 멈추는게 아니라, 전문적인 진보된 지식을 늘 알려고 하는 것입니다. 이 경우에는 자기가 체현한 분야에서 보다 더 난이도를 높혀서 공부해보는 것이구요. 이를 위해 각 분야별 주제가 포함되는 것을 트리로 그려보면 빠르게 판단해서 영역별 공부를 뭘 해야 할지가 그려지죠.

각 분야별로 심화시킬 수 있는 주제들이 있으니 잘 살펴보시고 주제를 심화해서 배우시면 딱입니다.


그리고 정보 하나더 드리자면요. 평소에 PC운용할때 불편한 것이 있었다면 “나라면 이 기능을 이렇게 개선해서 편리하게 해보겠다”라는 판단을 하면서 개발을 어떻게 할지 생각해두는 것과 같은 기능도 중요합니다. 그러면 개발할때 편리함을 더 하는 방향으로 궁리가 진행되어 남들이 선호하는 프로그램이 될 가능성이 높죠. 기능을 활용만 하다가, 개발쪽으로 넘어오셨다면 활용시절에 하던 생각을 이어가는 것도 하나의 실력 향상의 동기 부여가 됩니다. 실재로 UX/UI 관련도 이렇게 해서 잘하게 되기도 합니다.


원리를 잘 알아둘때는 작동 흐름 파악도 중요합니다. 작동 흐름 파악을 늘 하려고 노력하면 체현이 되구요. 문제 발생시 어디에서 뒤틀렸는지도 빠르게 알게 되구요. 휴리스틱이라고 해서, 현상이나 오류에 갇히지 않고 빠르게 원인을 파악하는 것도 가능해집니다. 문제가 인위적인 문제라면, 원리상으로 있는 실행 단계를 뒤틀어서 실행되는데요. 원리적 작동 흐름을 꿰차면, 이 판단이 빨라집니다. 해결방법을 모르더라도 어떻게 알아낼지도 알게 되구요.


지식을 해설할때 중요한 정보는 고수분들이 쓰신 해설을 내용 이해만 하는데서 그치지 않고, 설명 흐름을 잘 살펴서 이 흐름대로 자신이 직접 해설해보는 것도 방법입니다. 목차를 보면서 연상해보기도 하고 본문에서 보여주는 행간의 의미나 단락별 이행 관계도 생각할줄 알면 글도 잘써집니다. 이것도 해볼만한 실천지침이죠.

Phoronix Test Suite으로 벤치마킹하기

리눅스에서 벤치마크를 할때 여러 프로그램으로 가능합니다. Phoronix Test Suite도 그중의 하나인데요. 이 프로그램을 쓰면 제공되는 여러 테스트들을 활용해서 Processor, System, Network, Disk, OS 등의 카테고리의 벤치마크를 할 수 있습니다.

의존성으로 php-cli, php-xml, php-gd 를 설치하라고 되어있네요.

대충 이명령어로 설치하시구요.

Phoronix Test Suite은 우선 https://github.com/phoronix-test-suite/phoronix-test-suite/releases 에서 릴리즈 파일을 받아서 설치하면 되구요. 리눅스 민트 계열은 deb 파일을 받아서 설치하면 됩니다. deb 파일이 지원되지 않는 리눅스 배포판은 tar.gz 파일을 받아서 압축을 풀고 install-sh 파일을 실행해서 설치하면 됩니다.

지원되는 테스트는

로 확인하면 됩니다.

상세한 정보는

으로 확인하구요.

아래 명령어로 일괄적으로 처리할때 필요한 셋업을 합니다.

아래 명령어로 실재 벤치마크를 실행합니다.

list-tests 로 확인한 테스트명을 입력하면 되구요.

처럼 하면 pts/osbench 테스트가 실행됩니다.

이 작동 방식 외에도 여러 옵션이나 변수 설정, Phoromatic server 사용도 가능합니다.

https://github.com/phoronix-test-suite/phoronix-test-suite/blob/master/documentation/phoronix-test-suite.md

에서 제공되는 PDF 문서를 참조하세요.

IT 기술을 배울때 채택하면 좋은 방법 – 연역과 귀납의 경험적 운용

IT 기술은 그 역사의 흐름과 기술 발전의 흐름에 맞추어 오래전의 기술도 배워야 하고 이후에 바뀐 기술도 배워야 합니다. 이는 기술 이해가 체계적이라 기존의 기술도 알아두면 이후의 기술에 대한 이해가 깊어지기 때문이구요. 기술을 실재 상황에 적용할때 기지를 더 발현하기가 좋게 되서네요.

흔히들 일상언어로 말할때 “다 안다고 자만하지 말고 겸손하게 임해”라는 말도 흡사한 전제인데요. 기초를 배웠을때 다 안다고 생각하는 경우도 있게 되고, 자만하지 않더라도, 기초를 기술하는 개념 몇개만 알고 멈출때보다 더 많이 알려고 하는 의지를 가지게 해주는 말일 것입니다.

물론 해킹이나 과학기술 계통에서 있는 고수가 하수를 대하는 특수한 방법들(흔히 맨스플레인이라고 하는 방법들)을 상기시키는 말이기도 한데, 원칙은 위에서 언급한 공부 태도를 길러주는 방법입니다. 위의 말이 이렇게도 쓰이는 것은 IT도 사람이 하는 분야라, 한 표현에 결부되어 부착된 문화라서이고, 이 이해도 기존의 기술과 이후의 기술을 잘 알아두는 태도에 의해 더 잘 이해가 될 수 있습니다.

이 체현을 위해 생각해볼만한 한가지 정보가 되는 IT 기술 공부법의 노하우를 어떻게 채택하면 좋을지 말해보겠습니다.

어떤 경우, IT도 과학이기에 체계적이기도 하고 논리적인 판단이 일정 부분 적용되는 분야가 IT라, 스키마를 잘 짜두면 판단의 체계에 의해 잘하는 인식으로 안착하기도 합니다. 연역이 가능한 부분이구요. 귀납적인 것을 추가한다면, 실시간으로 작동흐름을 살펴서 판단하는 방법도 있습니다. 그런데 이 경우에 연역이 가능한 부분과 귀납이 가능한 부분을 잘 구별해야 합니다. IT가 수학적이라 연역이 되더라도, 사용이나 경험에 의해 부가되는 분야라, 사용자의 동기나 맥락 등의 영향을 받아 같은 알고리즘도 다른 방식으로 인식될때가 있어서네요.

예를 들면 사이트 지표 측정 도구에서 실재로는 연결이 안느린데, 사이트 속도 지표 점수가 확 낮게 나오는 경우가 있습니다. 이 경우 여러 추측이 가능하지만, 제작 의도에 따라서는 지금 당장은 안느리더라도 사용자가 많아질 것을 예측해서 점검해보게 하려는 일괄적인 권고이기도 하구요. 지켜두면 좋아서 권고하는 경우가 많습니다. 하지만, 실재로는 안느린 조건에서 보면 SEO 적용에 부담이 가기도 해서 스트레스 유발 요인이 되기도 합니다. 다시 말해 제작 의도와 사용 경험이 서로 어긋나는 경우도 상당히 많다는 것이죠. 이는 원칙 하나만 알아서는 안되는 경우입니다. 때로는 제작 의도가 더 말이 되는 경우도 있으나, 둘다 맞는 경우도 있죠. 이는 연역과 귀납의 조화로운 운용이 필요한 경우입니다.

연역은 보통 논리라고 인식됩니다. 전제가 옳으면 결론이 틀릴 수가 없습니다. 이는 프로그래밍 방법론에서 특히 잘 통용되죠. 그런데 귀납적이어야 할때도 있습니다. 하나의 지식만 알고 여러 소프트웨어를 작동시키다보면 체계적이고 논리적이라고 생각했던 판단이 적용이 안될때가 있습니다. 이 경우는 IT 기술은 경험에도 의존하고 있는 체제이고, 고도화된 기술들이라 제작자가 만든대로 작동하기에 단일한 작동방법으로는 작동이 안될때가 상당히 많죠. 다시 말해 작동방법의 경우의 수를 다 알면 좋구요. 소프트웨어마다 다르다는 것을 전제해두어야 당황스러움을 줄일 수 있습니다. 여기서 작동방법의 경우의 수를 다 알아두는 것은 위에 말한 “다 안다고 자만하지 말고 겸손하게 임하는 것”에 의해 가능해집니다.

단순하지만 초심자 시절에는 혼동되는 것은 어떤 경우는 마우스 한번클릭으로 작동하고 다른 경우는 두번클릭으로 작동할때가 있고, 휠을 돌리면 스크롤되는 깊이를 조정한다든지, 맥에서는 휠을 올리면 스크롤이 내려가는 등등의 구별점도 관련 현상이구요. 대부분의 경우 이를 미리 안말해줘도 고려하는 능력들이 다 있는데, 특수한 경우 단일한 경우만 상정하는 경우도 있어서 당황하기도 하네요. 경험이 중요하구요. 어떤 경우 타과학하신 분들 중에서는 과학의 일양성에 대한 인식을 IT에다가도 적용하시고 어려운 것부터 보시기도 하는데, 활용법은 쉽게 알 수 있어도 기술적인 것이나 원리는 기초부터 배워야 합니다. (부끄러우시면 집에서 몰래 보면 됩니다 (?)) 고도화되어 기술들이 겹쳐지고 발전하면 이해도 꽤 어려워지구요. 논리나 체계도 중요한데, 문제 해결에 있어서는 경험이 중요하죠.

UEFI 펌웨어의 경우에도 BIOS 시절의 지식을 알면 시스템 고장의 원인을 알게 되는 진입로가 되는데요. 이 경우에도 기존의 지식과 새로운 지식을 융합해서 이해하려는게 중요합니다. 시스템 리저브드 파티션이나 NVRAM 등에 대한 인식이 가능했다면 잘하는 것입니다. 이에 대해서는 직접 살펴보세요. 이 기술들은 PC 고장과도 관련이 있어서 하나만 알아도 아주 기분이 확 살아나는 지식인데, 이 경우에도 정말 많은 것이 더 배움을 기다리고 있는 경우입니다.

그래서 초심자 시절에는 개념을 확실하게 잡기 위해 이미 정해진 표준 언어로 사태를 기술한 표현으로 배우되, 표현의 의미보다는 표현의 연관을 살피는게 요령입니다. 프로그래밍을 할때 IDE가 표시한 오류에 의미만을 생각하면 문제가 있는 라인으로 가봐도 문법적인 오류가 없는 경우가 있구요. 이 경우에는 오류 메시지의 표현의 의미보다는 표현이 지시하는 연합된 원리를 떠올려보려고 노력하면 좋습니다. 이것을 초심자 시절에는 어렵다고 하는 것은 실력이나 자격 문제라기보다 경험이 없어서인데, 요즘은 비전공자분들에게도 친절하게 원리를 알려주는 문헌과 인터넷 자료가 많으니 보시길요.

한 현상에 대해 잘 알려진 규칙만이 정답이 아님을 아는 것도 좋습니다. 보통 이상 현상은 잘 알려진 규칙을 비틀고 얽히게 해서 일어나니까요.

인터넷이 안된다고 하면 보통 네트워크 장치 리셋이나 라우터를 보라고 하는데 이 경우에도 경험이 많아지면 그이상도 보게 될 수 있습니다. 라우터 펌웨어가 변조되었다든지, 운영체제의 ARP 문제라든지, 네트워크 구동 소프트웨어에 유저권한이 바뀌었다든지, 파일이 리패키징된 등등의 가능성을 알려고 하는 진입점도 이 글에서 말하는 태도를 잘 알면 가능하구요. 전공이 아닌 분야더라도 문제 원인만큼은 잘 알게 되어 질문이나 수리 요청도 아주 잘하는 실력 향상으로 이어질 수 있습니다.

잘 해설받은 루트가 중요합니다. 요즘은 큰 업체에서는 자기들 사이트에 문서들을 공유하는데 이를 참고하시구요. IT적인 글은 개념을 떠올려야 하는 부분과, 써본 경험에 의해 사용과정을 떠올려보는 부분을 잘 구별할줄 알면 잘하시는 것입니다.

보통 신계급 또는 위자드리라는 칭찬도 받는 분들이 계시는데 그분들도 이글에서 말한 연역과 귀납을 잘 운용해서일 것입니다. 일단 이렇게 해설해둡니다.

워드프레스에서 문자열에 어귀마다 하이픈을 추가하기

위 워드프레스 API 함수를 쓰면 문자열에서 어귀마다 하이픈을 추가해서 리턴해줍니다.

처럼 실행하면

임의의-문자열을-인자로-넘겨주세요

로 변환된 문자열을 화면에 표시합니다.

위의 예제에서는 echo 함수에 sanitize_title_with_dashes() 함수의 리턴값을 넘겼는데요. echo 함수로 표시하는 기능 외에도 다른 용도로도 응용하면 다른 기능을 구현하는 용도로도 쓸 수 있습니다. 예를 들면 글 제목을 슬러그 형태로 변환하는 기능이 그 예입니다. 워드프레스 슬러그는 문자열을 어귀로 분리해서 하이픈이 사이사이에 들어가야 하므로 위의 함수로 문자열을 조정하면 슬러그 변환이 되게 됩니다.

여기에 더해서 PHP 함수로 rawurlencode() 와 rawurldecode() 를 적절히 써서 위에서 얻어진 문자열을 처리하면 URL 인코딩/디코딩 된 문자열이 얻어집니다. 플러그인 제작을 할때 필요할 수 있네요.

https://www.php.net/manual/en/function.rawurlencode.php
https://www.php.net/manual/en/function.rawurldecode

위와 같이 하면 $encoded 에는 %EC%9E%84%EC%9D%98%EC%9D%98-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EC%9D%B8%EC%9E%90%EB%A1%9C-%EB%84%98%EA%B2%A8%EC%A3%BC%EC%84%B8%EC%9A%94 가 들어가게 되구요.
$decoded에는 임의의-문자열을-인자로-넘겨주세요 와 같은 디코딩된 문자열이 들어갑니다.

결론:
https://developer.wordpress.org/reference/functions/sanitize_title_with_dashes/
https://www.php.net/manual/en/function.rawurlencode.php
https://www.php.net/manual/en/function.rawurldecode

이들 함수를 잘 활용하면 슬러그 처리시 유익하게 쓸 수 있습니다.

아스트라 프로에서 카테고리별로 다른 디자인 보여주는 방법 아이디어

요즘 만들고 있는 사이트에서 블로그 카테고리별로 글보여주는 레이아웃을 카테고리마다 각각 바꾸어봐야 하는데 보류하고 있습니다.

궁리닷컴 이전 버전 사이트처럼 하나의 인문학서 감성으로 디자인을 해서 레이아웃을 보여주고 싶은데요. 지금은 블로그 테마에 내장된 카테고리 표시 기능으로 글을 보여주느라, 카테고리마다 다른 디자인으로 보여주려면 archive.php와 같은 파일을 직접 고쳐야 합니다.

이게 코딩을 요하는 작업이라 타이핑도 그렇고 이미지 연결도 귀찮으니 다른 방법을 써야 합니다.

아스트라 프로를 스펙트라 무료 버전과 함께 쓰는데요. 다음과 같은 방법으로 카테고리마다 다른 디자인으로 보여주는 방안을 실천해봐야 합니다. 이는 archive.php를 고치는 방법과 다르게 페이지를 생성해서 각각 다른 카테고리를 연결하게 만들어 보여주는 방법입니다.

우선 아스트라 프로가 프로 라이선스로 활성화된 상태에서 스펙트라를 설치하고 페이지 메뉴에서 페이지를 생성하면 됩니다.

(1) 페이지를 각각 만들어 각각 다른 카테고리 표시하도록 설정 (위젯 이용)
(2) 네비게이션 메뉴에 페이지 URL을 링크

이렇게 해두면 카테고리마다 다른 페이지 디자인으로 보여주는게 WYSIWYG 방식으로 지정이 됩니다. (1) 페이지 제작을 할때 페이지 디자인을 달리 해서 저장하면 되죠. 각각의 페이지마다 각각 다른 카테고리를 연결하구요.

여기에

(3) 글 목록 표시시 오프셋 설정이 가능하다면 컬럼으로 나누어 글 제목표시가 가능

인데 (3) 오프셋 설정은 지원되는지 살펴봐야하네요.

이해 잘 되게 해설한지는 모르지만 핵심은 archive.php에 의존하기보다 페이지를 써서 페이지를 각각 만들고 위젯으로 개별 카테고리 글 목록을 표시되게 하면 카테고리마다 다른 디자인으로 보여주는게 된다는 것이네요.

아이디어로 올려봅니다.

(2)를 할때는

<a href=”https://examples.com/category/카테고리명”>카테고리명</a>

보다

<a href=”https://examples.com/페이지명”>페이지명</a>

으로 링크를 하드코딩하거나 디자인 메뉴의 하위 메뉴에서 메뉴 설정을 해서 링크가 걸리게 하면 됩니다.