본문 바로가기

개발158

[shell script] if 파일 존재 여부 체크하기 쉘 스크립트로 파일이 존재하는지 다음과 같이 if -f 로 확인할 수 있다. #!/bin/bash FILE_PATH="test.txt" if [ -f $FILE_PATH ]; then echo "파일이 존재합니다." else echo "파일이 존재하지 않습니다." fi 2024. 3. 13.
[iOS] UIDevice identifierForVendor / 기기 식별하기 아이폰 앱 서비스 하면서 사용자가 사용하는 아이폰의 기기를 식별해야할 일이 생길 수 있다. 아이폰마다 불변하는 특정 아이디, 식별자가 있어서 이 식별자를 수집하면 되지 않을까 하는 생각을 할 수 있다. 하지만 이런 사용자의 정보를 함부로 수집할 수 있도록 해준다면 우리의 애플이 아닐 것이다. 다만 애플은 우회적으로, 제한적으로 방법을 제공하고 있다. 바로 Vendor ID를 제공하는 것이다. https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor identifierForVendor | Apple Developer Documentation An alphanumeric string that uniquely ide.. 2023. 3. 22.
iOS/macOS 번들(Bundle)에 대하여 - Part 1 iOS 개발을 하다보면 번들 ID부터 시작해서..자꾸 접하게 되는 것이 번들(Bundle)이다. 그냥 추상적으로 앱을 묶어놓은 패키지, 앱이 사용하는 공간 정도로 생각하고 있었으나 그 개념이 명확히 몰라 베일에 쌓여있었다. 도대체 번들(Bundle)이란 무엇인가? 왜 번들이 필요할까? macOS에서 응용프로그램에서 앱을 하나 선택해 패키지 보기를 선택하면 무언가 디렉터리로 들어가진다. 분명 .app 확장자를 가지는 파일인데 안에 내용은 마치 폴더와 같은 구조이다. 이 안에는 앱이 쓰는 아이콘, 이미지, 실행 바이너리 등이 들어있다. 어떤 .app확장자를 가지는 응용 프로그램을 열어봐도 동일한 구조의 디렉터리가 나온다. 분명 파일인데 왜 폴더 처럼 구성 되어 있을까? macOS에서 앱을 설치하는 방법 중 .. 2022. 10. 11.
iOS에서 카메라 필터를 만드는 법 조사 (LUT Lookup Image) 한 3년전 GPUImage 라이브러리를 활용하여 카메라 앱을 하나 개발 했었다. 그때 당시 라이트룸으로 한창 사진을 보정해보고 있을 때라 카메라로 찍어서 컴퓨터에서 작업하기 귀찮아 내가 만든 프리셋을 앱으로 만들어 버렸던 것이다.(사실 내가 필요해서 만듦.) https://apps.apple.com/kr/app/moment-july-camera-filters/id1448199130?l=en ‎Moment July - Camera Filters ‎Moment July is a photo filter application which has an atmosphere of July. Every filter in the application feels like bluish and cool and reminds o.. 2022. 10. 10.
[클린코드] 4장 - 주석 나쁜코드에 주석을 달지마라. 새로짜라 - 브라이언 W, 커니핸, P.J. 플라우거 주석은 '순수하게 선하지' 못하다. 사실상 주석은 기껏해야 필요악이다. 주석은 언제나 실패를 의미한다. 때때로 주석없이는 자신을 표현할 방법을 찾지 못해 할 수 없이 주석을 사용한다. 주석은 오래 될 수록 코드에서 멀어진다. 오래될수록 완전히 그릇될 가능성도 커진다. 불항하게도 주석이 언제나 코드를 따라가지 않는다. 부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다. 진실은 한곳에만 존재한다. 바로 코드다. 코드만 자기가 하는일을 진실되게 말한다. 주석을 가능한 줄이도록 꾸준히 노력해야 한다. 주석은 나쁜 코드를 보완하지 못한다. 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 표현력이 풍부하고 깔끔.. 2022. 9. 19.
[클린코드] 3장 - 함수 어떤 프로그램이든 가장 기본적인 단위가 함수이다. 작게 만들어라! 함수를 만드는 첫째 규칙은 '작게'다. 함수를 만드는 둘째 규칙은 '더 작게'다. 한 가지만 해라! 함수는 한 가지를 해야한다. 그 한가지를 잘해야한다. 그 한가지만 해야한다. 의미 있는 이름으로 다른 함수를 추출 할 수 있다면 그 함수는 여러 작업을 하는 셈이다. 함수 당 추상화 수준은 하나로 함수가 확실히 '한 가지'작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다 내려가기 규칙 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수에는 추상화 수준이 한단계 낮은 함수가 온다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한번에 한 단계식 낮아진다. 서술적인 이름을 사용하라! 함수가 작고 단순할수록 서술적인 .. 2022. 8. 16.
[클린코드] 2장 - 의미 있는 이름 2장 - 의미 있는 이름 의도를 분명히 밝혀라 의도가 분명하게 이름을 지으라. 변수(함수나 클래스)존재 이유는?, 수행기능은? 사용방법은? 따로 주석이 필요하다면 분명히 드러내지 못했다는 말이다. 그릇된 정보를 피하라 hp, aix, sco는 변수 이름으로 적합하지 않다. 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 때문이다. 독자에게 그릇된 정보를 제공하면 안된다. 일관성이 떨어지는 표기법은 그릇된 정보다. 의미 있게 구분하라 컴파일러나 인터프린터만 통과하려는 생각으로 코드를 구현하는 프로그래머는 스스로 문제를 이르킨다. 예를 들어 함수의 인자로 a1, a2 보다 source, destination을 사용한다면 코드가 읽기 편해진다. NameString보다는 Name으로 사용하여 불용어 중복을 피.. 2022. 8. 7.
[클린코드] 1장 - 깨끗한 코드 1장 - 깨끗한 코드 코드가 존재하리라 코드가 언젠가 사라지리라 생각하는 사람은 언젠가 비정형적인 수학이 나오리라 기대하는 수학자와 비슷하다. 궁극적으로 코드는 요구사항을 표현하는 언어라는 사실을 명심한다. 나쁜코드 우리 모두는 자신이 짠 쓰레기 코드를 처다보며 나중에 손보겠다고 생각한 경험이 있다. 나중에 다시 돌아와 정리하겠다고 다짐했었다. 나중은 결코 다시 오지 않는다. 나쁜 코드로 치르는 대가 시간을 들여 깨긋한 코드를 만드는 노력이 비용을 절감하는 방법일 뿐만 아니라 전문가로서 살아남는 길이라는 사실을 인정하라 프로젝트 실패는 우리에게도 커다란 책임이 있다. 특히 나쁜코드가 초래하는 실패에는 더더욱 책임이 크다. 좋은 코드를 사수하는 일은 바로 우리 프로그래머들의 책임이다. 환자 말을 그대로 따.. 2022. 8. 5.
[Win32] 메시지 루프는 어떻게 창에 메시지를 전달할까? 하나의 윈도우 프로그램에는 여러 개의 창이 존재한다. 그리고 그 창에는 자기한테 들어온 메시지를 처리하기 위해 각자의 프로시저(Procedure)를 갖는다(엄밀히 창 클래스마다 프로시저를 갖는다). 그렇다면 어떻게 메시지 루프는 메시지에 알맞은 창을 찾을 수 있을까? 다음은 일반적인 윈도우 프로그램의 메인 메시지 루프(싱글스레드)이다. // Main message loop: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 메시지 큐에서 GetMessage로 메시지를 가져와 Transla.. 2022. 7. 31.