lifeyun24의 등록된 링크

 lifeyun24로 등록된 네이버 블로그 포스트 수는 232건입니다.

[RN] Firebase realtime database 권한 설정 관련 [내부링크]

기본 사용법: https://rnfirebase.io/database/usage#reading-data Realtime Database | React Native Firebase Installation and getting started with Realtime Database. rnfirebase.io 파베를 사용하여 database 접근 시도 시 에러 메시지 [database/permission-denied] Client doesn't have permission to access the desired data는 클라이언트가 Firebase Realtime Database에 접근할 수 있는 권한이 없음을 의미합니다. 따라서 해결 방법 두가지가 있는데, Firebase Console 사용 Firebase 콘솔로 이동하여 프로젝트를 선택합니다. 왼쪽 메뉴에서 'Realtime Database'를 선택합니다. 'Rules' 탭을 클릭하여 현재의 보안 규칙을 볼 수 있습니다. 보안 규칙

[개발 지식] 서버/클라이언트 사이드 렌더링 및 ReactNative의 렌더링 방식 [내부링크]

그동안 RN으로 앱 개발을 하면서 한 번도 이런 문제를 만나본 적이 없다. RN은 서버사이드 렌더링일까, 클라이언트 사이드 렌더링일까? 서버 사이드 렌더링 (SSR) 이 방법에서는 모든 페이지의 렌더링이 서버에서 이루어집니다. 사용자가 웹 페이지에 접근할 때, 서버는 완전히 렌더링 된 페이지를 사용자의 브라우저로 전송합니다. 이 방식의 장점은 초기 로딩 시간이 빠르고 검색 엔진 최적화(SEO)에 유리하다는 것입니다. 하지만, 사용자의 요청마다 서버에서 페이지를 새로 렌더링 해야 하기 때문에 서버 부하가 늘어날 수 있습니다. 클라이언트 사이드 렌더링 (CSR) 이 방식에서는 초기 로딩 시 서버에서 HTML, CSS, JavaScript 등의 자원을 로드한 후, 이후의 모든 렌더링은 클라이언트 측(브라우저)에서 이루어집니다. 사용자의 상호작용에 따라 필요한 데이터만 서버로부터 받아와 동적으로 페이지를 갱신합니다. 이 방식의 장점은 서버 부하 감소와 사용자 경험이 부드럽다는 것입니다. 하

[개발 지식] ReactNative의 디자인 패턴 [내부링크]

React Native는 iOS의 MVVM(Model-View-ViewModel)과 같은 특정 코드 디자인 패턴을 강제하거나 기본으로 제공하지 않습니다. 대신, React Native는 React의 디자인 패턴과 철학을 기반으로 합니다. React의 주요 개념은 다음과 같습니다: 컴포넌트 기반 아키텍처: React Native는 UI를 독립적이고 재사용 가능한 컴포넌트로 나눕니다. 각 컴포넌트는 자체적인 상태와 생명주기를 가지며, 복잡한 UI를 구성하는 데 사용됩니다. (재사용 가능한 컴포넌트 분리) 단방향 데이터 흐름 (Props and State): React Native에서는 데이터가 주로 상위 컴포넌트에서 하위 컴포넌트로 전달되는 'props'와 내부 상태를 관리하는 'state'를 사용하여 단방향 데이터 흐름을 유지합니다. (prop으로 데이터 전달) 함수형 프로그래밍과 선언적 UI: React Native는 함수형 프로그래밍 패러다임을 채택하고 있으며, UI를 선언적으로

[개발 지식] ReactNative 로그인 방식 및 JWT (JSON Web Tokens)의 데이터 플로우 [내부링크]

JWT (JSON Web Tokens) 기반 인증: 사용자가 로그인할 때 서버는 JWT를 생성하여 클라이언트에 전달합니다. 클라이언트는 이 토큰을 저장하고 이후의 요청에 토큰을 첨부하여 인증을 수행합니다. OAuth 및 소셜 로그인: Google, Facebook, Twitter 등과 같은 소셜 미디어 계정을 사용하여 로그인합니다. 이 방식은 OAuth 프로토콜을 사용하며, 사용자는 별도의 계정 생성 없이 소셜 미디어 계정을 통해 앱에 액세스할 수 있습니다. 전통적인 사용자 이름/비밀번호 기반 인증: 가장 기본적인 형태의 인증 방법으로, 사용자는 사용자 이름과 비밀번호를 입력하여 로그인합니다. (혹은 이메일/비번) 생체 인증 (Biometric Authentication): 지문, 안면 인식 등의 생체 인증 방식을 사용합니다. React Native에서는 이를 위한 라이브러리(예: React Native Fingerprint Scanner)를 통해 구현할 수 있습니다. SMS 또는

[RN] CodePush Setting 2023 (iOS/Android) [내부링크]

yarn global add appcenter-cli 프로젝트에서 appcenter login 하면 로그인 웹 화면이 브라우저에서 열립니다. 로그인 / signUp 하면 받은 Authentication 코드-> 프로젝트의 Access code에 넣습니다. https://github.com/microsoft/react-native-code-push GitHub - microsoft/react-native-code-push: React Native module for CodePush React Native module for CodePush. Contribute to microsoft/react-native-code-push development by creating an account on GitHub. github.com yarn add react-native-code-push 라이브러리 설치 Android Add new app 해서 android 전용 프로젝트를 appcenter에

[RN] Fastlane Setting 2023 [내부링크]

iOS / Andriod 개발자를 위해 스크린샷을 생성하거나, 인증서를 관리, 앱 배포 등을 자동화 해주는 툴입니다. 먼저 bundler 설치를 해줍니다. Bundler는 Ruby 언어를 위한 의존성 관리 도구로, 주로 Ruby 프로젝트에서 사용됩니다. https://docs.fastlane.tools/ fastlane docs lane :beta do increment_build_number build_app upload_to_testflight end lane :release do capture_screenshots build_app upload_to_app_store # Upload the screenshots and the binary to iTunes slack # Let your team-mates know the new version is live end You just defined 2 different lanes, one fo... docs.fastlane.tools

[RN] CI / CD Setting 2023 (Github Actions) [내부링크]

우선 기본적인 개념부터 보겠습니다. 지속적 통합 (Continuous Integration, CI): 이 개념은 개발자들이 코드 변경사항을 주기적으로 중앙 레포지토리에 병합(merge)하는 것을 의미합니다. 주요 목표는 버그를 빠르게 발견하고 해결하며, 소프트웨어 품질을 유지하는 것입니다. 자동화된 테스트를 통해 새로운 코드 변경사항이 기존 코드와 잘 통합되는지 확인합니다. 지속적 배포 (Continuous Deployment): 모든 코드 변경사항이 테스트를 거쳐 자동으로 프로덕션 환경에 배포되는 과정입니다. 이는 개발자가 코드를 변경할 때마다, 이 변경사항이 자동으로 사용자에게 도달한다는 것을 의미합니다. 특정 컴포넌트를 테스트 하기 위에 VideoModal.test.tsx 이란 파일을 아래에 만들어줍니다. yarn add jest yarn add @types/jest 없을 시 설치. VideoModal 을 테스트 하기 위해 VideoModal 에서 넘겨 받는 prop 들을 te

[iTerms2] 맥에서 순정 터미널 대신 iTerms를 사용하는 이유 [내부링크]

회사에서 상사분에게 강력 추천 받은 iTerms2, 너무나도 강추하길래 설치해서 사용해보니 그 원인을 알았다. 1.분할 창/탭 및 창 관리: iTerm2는 여러 터미널 세션을 한 화면에 동시에 보여주는 분할 창 기능을 제공합니다. 또한 여러 탭과 창을 쉽게 관리할 수 있어, 작업 영역을 깔끔하게 유지할 수 있습니다. 2. 사용자 정의 가능한 단축키: 사용자가 자주 사용하는 명령어나 기능에 대해 단축키를 설정할 수 있어, 작업 효율성을 높일 수 있습니다. 3 .테마 및 사용자 인터페이스 맞춤 설정: 다양한 테마와 색상, 폰트 설정을 통해 사용자의 취향에 맞게 터미널의 외관을 맞춤 설정할 수 있습니다. 4. 통합된 마우스 지원: iTerm2는 마우스를 사용하여 텍스트를 선택하거나 창을 조작하는 것을 지원합니다. 5. ****자동 완성****: 자주 사용하는 명령어나 파일 이름 등을 자동으로 완성해주는 기능을 제공합니다. 6. 세션 복구: iTerm2는 시스템 재시작 후에도 이전의 세션을

[nvm] nvm으로 맥북에서 node 버전 변경하기 [내부링크]

일단 기본적으로 homebrew가 설치되어 있어야 합니다. nvm 설치 nvm은 node version manager로, 다양한 버전의 노드를 사용할 수 있게 해준다. brew가 설치되었다면, nvm을 설치할 수 있다. brew install nvm 터미널에 위와같은 명령어로 nvm을 설치할 수 있다. nvm -v 또한, 위와 같은 명령어로 nvm이 설치되었는지 확인한다. 설치가 되었다면, nvm의 버전이 출력된다. (버전이 보통 출력되지 않는다) 버전이 출력되지 않는다면, nvm 환경변수 설정이 필요하다. * 폴더 생성 mkdir ~/.nvm * 환경변수 설정 vi ~/.zshrc * 다음의 텍스트를 붙여넣는다. export PATH="$PATH:$HOME/.rvm/bin" export PATH="$PATH:/opt/homebrew/bin" # NVM export NVM_DIR="$HOME/.nvm" [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/

[RN] TS 4.0 기준으로 에러 처리 방법 변경 [내부링크]

TypeScript에서 `catch (error)` 구문을 사용하는 경우, TypeScript 4.0 이전 버전에서는 `error` 객체가 자동으로 `any` 타입으로 간주됩니다. 이는 타입 검사를 회피하는 것이기 때문에, 코드 내에서 `error` 객체의 속성에 접근할 때 타입 안전성이 보장되지 않습니다. TypeScript 4.0 이상에서는 `error` 객체를 `unknown` 타입으로 처리하는 것이 권장됩니다. 이는 코드의 타입 안전성을 높이는 방법입니다. `unknown` 타입을 사용하면, 개발자가 `error` 객체를 사용하기 전에 해당 객체의 타입을 명시적으로 검사하도록 강제합니다. 이를 통해 런타임 에러의 위험을 줄이고, 코드의 타입 안전성을 높일 수 있습니다. 그러나, 직접적으로 `error` 객체의 타입을 `unknown`으로 지정하지 않고, 단순히 `catch (error)`를 사용하는 것도 가능합니다. 이 경우, TypeScript 설정에 따라 `error` 객

[RN] 웹뷰 디버깅하는법 [내부링크]

<Webview ... webviewProps={{ webviewDebuggingEnabled: true }} /> webviewDebuggingEnabled 가 필요하다.

[RN] 디버깅 툴 최신버전 [내부링크]

https://reactnative.dev/docs/next/debugging?js-debugger=new-debugger Debugging Basics · React Native Accessing the Dev Menu reactnative.dev The React Native team is working on a new JavaScript debugger experience, intended to replace Flipper, with a preview available as of React Native 0.73. The new debugger can be enabled via React Native CLI. This will also enable j to debug. npx react-native start --experimental-debugger **** 사용 결과 console.log 에서 문자열 사이의 \n 을 인식 못한체로 뒷부분 문자가 없이 출력되는 현상이 발견됐다.

[SwiftUI] LaunchScreen 추가 방법 2종 소개 [내부링크]

방법1. LaunchScreen 파일 추가 1.Remove Launch Screen (UILaunchScreen) key from project Info.plist. This will opt out from configuring a launch screen using Info.plist. 2.Create a new Launch screen file. Choose File > New > File. Under User Interface, select Launch Screen, and click Next. Give the launch screen file a name. I named it "LaunchScreen" in this case. 3. 혹은 info.plist에서 추가 방법2. SwiftUI에서 제공하는 방법 info.plist 주의: Background color가 타 블로그에서 white으로 되어있기에, string으로 white하면 흰색이 적용되는줄 알았다. 다만 다크모드에

[iOS] 앱스토어 앱 배포 방법 [내부링크]

https://hsdev.tistory.com/entry/iOS-%EC%95%B1-%EB%B0%B0%ED%8F%AC-1-1-CSR-Certificate-Signing-Request-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%84%9C%EB%AA%85-%EC%9A%94%EC%B2%AD-%EB%B0%9C%EA%B8%89%EB%B0%9B%EA%B8%B0 [iOS 앱 배포] 1-1. CSR (Certificate Signing Request : 인증서 서명 요청) 발급받기 애플 개발자 멤버십을 구매한 후 앱을 배포하기 위해 필요한 첫번째 단계입니다. CSR (Certificate Signing Request : 인증서 서명 요청) 발급받기 1. LaunchPad 에서 '키체인 접근' 을 찾아 들어간다. 2. 바탕화면에서 키체인 화면을 띄우고 상단에 있는 메뉴를 통해 '키체인 접근>인증서 지원>인증 기관에서 인증서 요청...' 으로 들어간다. [다음 단계 바로가기] [iOS 앱

[Swift] func solution(_ arr:[Int]) 중 _ (언더스코어)는 뭔가요? [내부링크]

Swift에서 함수 정의 시 `_` (언더스코어)를 매개변수 이름 앞에 사용하는 것은 해당 매개변수의 외부 이름을 생략하겠다는 의미입니다. Swift는 기본적으로 함수를 호출할 때 각 매개변수의 외부 이름을 명시해야 합니다. 그러나 때때로 이를 생략하고 싶을 수 있으며, 이 때 `_`를 사용합니다. 예를 들어, `func solution(_ arr: [Int])`에서 `_`는 함수를 호출할 때 `arr`라는 매개변수 이름을 생략할 수 있게 해줍니다. 즉, 함수를 호출할 때 `solution(arr)` 대신 `solution([1, 2, 3])`와 같이 매개변수 이름 없이 직접 배열을 전달할 수 있습니다. 이것은 코드를 더 간결하고 읽기 쉽게 만들 수 있는 Swift의 특징 중 하나입니다. 함수에 외부 이름을 사용하는 경우와 비교하여 보겠습니다: - 외부 이름을 사용하는 경우: `func solution(arr: [Int])` - 호출: `solution(arr: [1, 2, 3])`

[Swift코테] 배열 평균 구하기, array.reduce() 사용법 [내부링크]

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. func solution(_ arr:[Int]) -> Double { let total = arr.reduce(0, { $0 + $1 }) return Double(total) / Double(arr.count) } https://blog.naver.com/lifeyun24/223265939319 [Swift] func solution(_ arr:[Int]) 중 _ (언더스코어)는 뭔가요? Swift에서 함수 정의 시 `_` (언더스코어)를 매개변수 이름 앞에 사용하는 것은 해당 매개변수... blog.naver.com Swift의 `reduce` 메서드는 배열의 모든 요소를 결합하여 단일 값으로 축약하는 데 사용됩니다. 이 메서드는 매우 강력하며, 다양한 방식으로 활용될 수 있습니다. 아래는 `reduce`의 일반적인 사용 예시들입니다: 1. **합계 계산**: 배열의 모든 요소의 합을

[SwiftUI] 위젯 기능 설정 관련 [내부링크]

오늘은 필자의 SwiftUI 앱에서 위젯 기능을 추가해봤습니다. 참고 블로그는 https://matdongsane.tistory.com/149?category=1040154 SwiftUI) WidgetKit을 사용해서 Widget을 만들기(4) - 앱에서 위젯으로 데이터 보내기 app Group 앱에서 위젯으로 데이터를 보내줘야할 경우가 당연하게 생긴다. (그냥 하드코딩 하고싶지는 않자나?) 다음과 같은 방법을 통해서 데이터를 보내줄수 있다. 1. App Group 추가해주기 우리의 메인 앱의 Target으로 가게 되면 거기에서 Signing & Capabilityies에서 all 왼쪽에 있는 + Capability를 누르면 appGroups를 추가할수 있다. 해당 방법을 통해서 위젯과 앱 둘다 appgroups를 추가 하고 동일한 groupId로 설정해준다. app Groups란? 동일한 팀이 개발한 앱 사이의 공유 컨테... matdongsane.tistory.com 이며, 주의

[SwiftUI] Extension Version 이 부모앱과 다르다는 경고(ITMS-90473). [내부링크]

https://mrgamza.tistory.com/627 iOS. xcode로 빌드할때 ITMS-90473 해결. Extension Version 자동 맞추기 앱스토어에 익스텐션을 포함하여서 개발을 할 경우에 버전을 Main Project와 동일하게 맞추어야 합니다. 물론 버전이 다르게 올라가도 큰 문제는 없습니다. 단지 올라간 앱의 버전과 지금의 버전이 달라서 약간의 경고성 메일이 옵니다. ITMS-90473: CFBundleVersion Mismatch - The CFBundleVersion value '1' of extension 'TestApp.app/PlugIns/NotificationServiceExtension.appex' does not match the CFBundleVe... mrgamza.tistory.com 경고의 내용은 부모앱 버전 (예1.1) 과 extension의 버전 (예1.0) 과 다르다고 빌드 시 경고를 주는 것이다. 다만 눈을 씻고 찾아봐도 exte

[iOS] AppStore 개인 앱 출시 (최애의 아이돌) [내부링크]

오늘은 필자가 출시한 iOS 개인 앱에 대하여 설명해 드리겠습니다. (구글 스토어에는 없습니다) Previous image Next image 콘서트에서 본인의 메시지를 전달하고 싶을 때 필요한 LED 전광판 앱, 다른 앱들의 광고, 복잡한 사용법, 에러 등이 있어 본인만의 앱을 만들어보기로 했습니다. 앱에 대한 간단한 설명(사용자 편): 좌상단의 i 버튼으로 각 필드의 사용법을 볼 수 있습니다. 우상단의 토글 버튼으로 다크/ 라이트 모드 전환 가능합니다. 이모지를 누르면 텍스트 필드에 빠르게 추가할 수 있습니다. 색상 버튼을 하나 선택하면 단색, 두 개 선택하면 색상이 교차되어 표시됩니다. 배민 폰트를 사용할 수 있습니다.(미선택 시 아이폰 기본 폰트 적용) 폰트 크기, 스크롤 스피드를 설정할 수 있습니다. 스크롤 중 멈춤 버튼을 눌러 스크롤링을 일시 정지할 수 있습니다. 앱에 대한 간단한 설명(개발자 편): Swift, UIKit 을 사용하여 개발. instructions 라이브

[iOS] AppStore 개인 앱 출시 (오늘의 장보기) [내부링크]

오늘은 필자가 출시한 iOS 개인 앱에 대하여 설명해 드리겠습니다. (구글 스토어에는 없습니다) Previous image Next image 장보기 리스트를 기록하고 싶은데 메모장에 한 줄로 적기에는 체크하기 불편하고, 또 일반 To Do list에 적으면 직관성이 떨어져서 오직 장 보기만을 위한 앱을 개발했습니다. 앱에 대한 간단한 설명(사용자 편): 메인 화면 하단 + 버튼을 눌러서 카테고리 선택 화면으로 이동합니다. 카테고리를 선택하여 원하는 품목을 추가합니다. 메인 화면에서 추가된 리스트를 체크, 삭제, 정렬을 할 수 있습니다. 위젯을 추가하여 더 직관적으로 리스트를 볼 수 있습니다. 앱에 대한 간단한 설명(개발자 편): Swift, SwiftUI 을 사용하여 개발. Onboarding 화면 개발 유저가 카테고리에서 리스트를 생성, 각 리스트는 메인 리스트로 통합되며, 정렬, 삭제 및 완료 체크 기능 구현. UserDefaults를 사용한 데이터 로컬 저장 기능 구현, 앱

[Swift코테] 자주 사용하는 기술들 [내부링크]

정수의 자릿수 합 import Foundation func solution(_ x:Int) -> Int { let a = String(x) let addNum = a.reduce(0) { $0 + Int(String($1))! } print(type(of: addNum)) // Int return addNum } solution(10) 범위 내의 모든 수를 순회하며 더하기 / 배열내의 모든 수 더하기 func solution(_ a:Int, _ b:Int) -> Int64 { let start = min(a, b) let end = max(a, b) return Int64((start...end).reduce(0, +)) } // 예시 사용 print(solution(3, 5)) // 출력: 12 print(solution(3, 3)) // 출력: 3 // 배열 func solution(_ numbers: [Int]) -> Int { let totalNumbers = Set(0...

[RN] 협업 시 자주 발생하는 파일 대소문자 git에 반영 안되는 문제 해결 [내부링크]

만약 팀원A가 파일 대소문자를 color.ts -> Color.ts 로 변경했다고 가정한다. 그러면 git이 인식을 못한다. (mac 환경 기준) 상당히 골때리는 일이다. 왜냐하면 import 하는 부분에서는 Color.ts로 import하는 것으로 변경&반영 되어서, 팀원B가 프로젝트를 run 하려고 하면, Import 는 Color고 파일은 color.ts여서 에러가 터진다. 만약 이런 부분이 많고 작업 환경이 많으면 상당히 복잡한 과정이다. 여기서 해결법은 git config core.ignorecase false 반드시 해당 프로젝트에서 이 커멘드를 실행해야 한다. 그러면 프로젝트의 .git / config 파일이 ignorecase가 true에서 => ignorecase = false 로 바뀐다. 이때부터 git이 파일대소문자 변경을 인식하기 시작한다. Color과 똑같은 color.ts라는 파일을 만들어 push하는 구조였다. 따라서 협업 시 처음부터 파일명, 함수명 대소

[RN] iOS/ AOS 패키지명 변경 [내부링크]

iOS signing -> bundle identifier 변경 AOS android / app / src / main / java / .../MainActivity.java 파일의 최상단 검색창에서 전체 변경 * firebase와의 연동을 생각해서 tony-yun 같이 중간에 - 은 안된다.

[RN] Firebase 등록되지 않은 이메일 에러 코드를 반환하지 않는 이유 [내부링크]

사용자가 비밀번호를 잊었을 때 Firebase에서는 비밀번호 재설정 이메일을 보내는 로직을 제공한다. AuthContext에 구현된 함수는 다음과 같다. const sendPasswordResetEmail = (email, onSuccess, onError) => { auth() .sendPasswordResetEmail(email) .then(response => { console.log('비밀번호 재설정 이메일 전송 완료.', response); if (onSuccess) { onSuccess(response); } }) .catch(error => { console.log('비밀번호 재설정 이메일 전송 오류:', error); if (onError) { onError(error); } }); }; 시험 삼아 [email protected]이라는 email 값으로 요청을 보냈다. (무작위) 어째서 인지. then에서 성공 확인이 떴다. 로직대로라면 등록되지 않은 이메일

[RN] Firebase 유저 정보 refresh 관련 함수 비교 [내부링크]

export const AuthContext = createContext(); const AuthProvider = ({children}) => { const [currentUser, setCurrentUser] = useState(null); useEffect(() => { const subscriber = auth().onAuthStateChanged(setCurrentUser); return subscriber; // unsubscribe on unmount }, []); //... const refreshUser1 = () => { if (currentUser) { currentUser.reload(); } }; const refreshUser2 = () => { const user = auth().currentUser; if (user) { user.reload().then(() => { setCurrentUser(auth().currentUser); }); } }; 유저가

[SwiftUI] 왜 $를 붙인 Binding 값을 사용하나요? [내부링크]

// // FrameworkDetailView.swift // AppleFramework-SwiftUI // // Created by tonyyun on 10/27/23. // import SwiftUI struct FrameworkDetailView: View { @StateObject var viewModel: FrameworkDetailViewModel var body: some View { VStack(spacing: 20) { Spacer() Image(viewModel.framework.imageName) .resizable() .frame(width: 80, height: 80) Text(viewModel.framework.name) .font(.system(size: 24, weight: .bold)) Text(viewModel.framework.description) Spacer() Button(action: { viewModel.isSafariPresented =

[SwiftUI] @ Property Wrappers 정리 [내부링크]

@State SwiftUI에서 상태를 처리하는 방법 뷰의 상태를 저장하는 프로퍼티로 상태 관리 주체는 해당 뷰 기본적으로 Private 선언이기에 다른 뷰와 값을 소통하려면 Binding을 이용 값이 변경될 때마다 UI 업데이트 @Binding 뷰와 상태를 바인딩 하는 방법 상위 @State 변수를 전달 받아 하위 뷰에서 캐치해 변화 감지 및 연결 Binding은 다른 뷰가 소유한 속성을 연결하기에 소유권 및 저장 공간이 없음 ObservableObject 클래스 프로토콜로 관찰하는 어떠한 값이 변경되면 변경사항을 알려줌 뷰에서 인스턴스 변화를 감시하기 위해 뷰모델 객체로 생성할 때 사용할 수 있음 @Published ObservableObject를 구현한 클래스 내에서 프로퍼티 선언 시 사용 @Published로 선언된 프로퍼티를 뷰에서 관찰할 수 있음 ObservableObject의 objectWillChange.send() 기능을 @Published 프로퍼티가 변경되면 자동으로

[SwiftUI] 하위 View 를 선언하는 3가지 방법 [내부링크]

import SwiftUI struct TodoListView: View { @EnvironmentObject private var pathModel: PathModel @EnvironmentObject private var todoListViewModel : TodoListViewModel var body: some View { ZStack { VStack { if !todoListViewModel.todos.isEmpty { CustomNavigationBar( isDisplayLeftBtn: false, rightBtnAction: { todoListViewModel.navigationRightBtnTapped() }, rightBtnType: todoListViewModel.navigationBarRightBtnMode) } else { Spacer() .frame(height: 30) } titleView // 여기에 넣기 위한 방법 } } } // 방법 1 var titl

[Swift] 문자열에 따옴표 나오게 하기 [내부링크]

Text("\"매일 아침 5시 운동하자!\"") 앞뒤로 \" \"를 넣으면 된다. 그러면 앱에서는 "매일 아침 5시 운동하자!"로 표시된다. 따옴표 쌍따옴표 다 가능하다.

[Swift] (배열) .firstIndex(of: ) 와 .firstIndex(where: )의 차이에 관한 깊은 분석 [내부링크]

.firstIndex(of: ) var students = ["Ben", "Ivy", "Jordell", "Maxime"] if let i = students.firstIndex(of: "Maxime") { students[i] = "Max" } print(students) // Prints "["Ben", "Ivy", "Jordell", "Max"]" 이 코드는 Swift 프로그래밍 언어로 작성되었습니다. 각 줄을 차례로 살펴보겠습니다: 1. `var students = ["Ben", "Ivy", "Jordell", "Maxime"]` 이 줄은 `students`라는 이름의 변수를 선언하고, 그것을 문자열의 배열로 초기화합니다. 배열에는 네 명의 학생 이름이 문자열 형태로 들어 있습니다. 2. `if let i = students.firstIndex(of: "Maxime") {` 이 줄은 `if let` 구문을 사용하여 옵셔널 바인딩을 수행합니다. `students.firstInd

[Swift] (배열) todos.removeAll { todo in removeTodos.contains(todo) } 에서 todo(임시 이름) 은 무엇인가 [내부링크]

Swift에서 클로저는 종종 익명 함수의 역할을 합니다. 즉, 함수의 본문만 있고 이름이 없는 함수입니다. 클로저 내부에서 사용하는 매개변수는 클로저를 정의할 때 바로 선언할 수 있습니다. 이 때, 매개변수 이름은 개발자가 임의로 지정할 수 있으며, 특정 형식의 데이터를 반복적으로 처리할 때 사용됩니다. todos: Todo 타입의 인스턴스들을 담고 있는 배열입니다. removeTodos: 역시 Todo 타입의 인스턴스들을 담고 있는 또 다른 배열이며, 여기에 포함된 todo들을 todos 배열에서 제거하려고 합니다. func removeBtnTapped() { todos.removeAll { todo in removeTodos.contains(todo) } removeTodos.removeAll() isEditTodoMode = false } `todos.removeAll { todo in ... }`에서 `todo`는 배열 `todos`의 각 요소를 나타내는 임시 이름입니다. 클

[SwiftUI] private struct 는? [내부링크]

SwiftUI에서 `private` 키워드는 접근 제어자(access modifier) 중 하나로 사용되며, 이를 통해 해당 구조체, 클래스, 함수, 변수 등의 범위를 제한합니다. `private`로 선언된 항목은 오직 그것이 정의된 소스 파일 내에서만 접근 가능하고, 해당 파일 바깥에서는 접근할 수 없습니다. 예를 들어, `MemoListView` 파일 안에 정의된 `TitleView` 구조체 앞에 `private`가 붙어 있는 것은 이 `TitleView`가 `MemoListView` 소스 파일 내부에서만 사용되기 위해 설계되었음을 의미합니다. 다른 파일에서는 이 `TitleView`에 접근할 수 없습니다. private struct TitleView: View { @EnvironmentObject private var memoListViewModel: MemoListViewModel var body: some View { ... } } SwiftUI 뷰를 `private`으로

[SwiftUI] @State 의 사용 경우와 property wrapper를 사용하지 않는 경우 분석 [내부링크]

@State `@State`는 SwiftUI에서 뷰가 변경 가능한 데이터를 관리하기 위해 사용하는 프로퍼티 래퍼입니다. SwiftUI에서 뷰의 로컬 상태를 관리하기 위한 기본적인 도구 중 하나로, `@State`로 선언된 상태가 변경될 때, 해당 뷰는 자동으로 업데이트되어 변경된 정보를 반영하게 됩니다. 제공된 `TodoCellView` 예제에서 `@State` 사용 이유를 살펴보겠습니다: @State private var isRemoveSelected: Bool 여기서 `isRemoveSelected`는 `TodoCellView` 내의 "삭제" 버튼이 선택되었는지 여부를 추적하는 불리언 값입니다. 이 상태는 `TodoCellView` 인스턴스 각각에 로컬로 존재합니다. 사용자가 편집 모드에서 할 일 항목을 삭제용으로 표시하고자 할 때, 버튼의 액션 클로저에서 이 상태를 토글할 수 있습니다: Button(action: { isRemoveSelected.toggle() todoList

[SwiftUI] @State 를 init 하는 방법 [내부링크]

Swift에서 @State 프로퍼티 래퍼를 사용할 때는 일반적인 프로퍼티처럼 초기화를 직접 수행할 수 없습니다. 대신, @State 프로퍼티에 초기값을 할당하기 위해서는 SwiftUI에서 제공하는 특별한 초기화 구문을 사용해야 합니다. 이를 위해 State 구조체의 initialValue 인자를 받는 생성자를 사용해야 합니다. private struct MemoCellView: View { @EnvironmentObject private var pathModel: PathModel @EnvironmentObject private var memoListViewModel: MemoListViewModel @State private var isRemoveSelected: Bool private var memo: Memo fileprivate init( isRemoveSelected: Bool = false, memo: Memo) { self.isRemoveSelected = isRemov

[SwiftUI] ZStack에 .alert를 사용하는 이유 및 isPresented에 $바인딩 값을 사용하는 이유 [내부링크]

struct TodoListView: View { @EnvironmentObject private var pathModel: PathModel @EnvironmentObject private var todoListViewModel : TodoListViewModel var body: some View { ZStack { VStack { ... } } .alert("To do list \(todoListViewModel.removeTodosCount)를 삭제하시겠습니까?", isPresented: $todoListViewModel.isDisplayRemoveTodoAlert ){ Button("삭제", role: .destructive){ todoListViewModel.removeBtnTapped() } Button("취소", role: .cancel) {} } } } viewModel.swift func navigationRightBtnTapped() { if isEditTodoM

[SwiftUI] CustomNavigation에서 .append() 및 removeLast()로 이동하기 [내부링크]

`removeLast()` 함수는 Swift의 배열(Array) 타입에서 사용되며, 배열의 마지막 요소를 제거합니다. 배열이 비어있지 않다면, 가장 마지막에 있는 요소를 배열에서 제거하고 그 값을 반환합니다. 만약 배열이 비어 있을 때 이 함수를 호출하면 런타임 에러가 발생합니다. // PathType.swift import Foundation enum PathType: Hashable { case homeView case todoView case memoView(isCreateMode: Bool, memo: Memo?) } ///////// // Path.swift import Foundation class PathModel: ObservableObject { @Published var paths: [PathType] init(paths: [PathType] = []) { self.paths = paths } } var body: some View { ZStack { VStack

[SwiftUI] @Binding 값 init 하는 방법 [내부링크]

부모뷰: struct MemoView: View { @EnvironmentObject private var pathModel: PathModel @EnvironmentObject private var memoListViewModel: MemoListViewModel @StateObject var memoViewModel: MemoViewModel @State var isCreateMode: Bool = true var body: some View { ZStack { VStack { CustomNavigationBar( leftBtnAction: { pathModel.paths.removeLast() }, rightBtnAction: { if isCreateMode { memoListViewModel.addMemo(memoViewModel.memo) } else { memoListViewModel.updateMemo(memoViewModel.memo) } pathModel.paths.

[SwiftUI] View 확장하는 방법 3가지 (예시 코드) [내부링크]

View 확장 1: View 확장 2: import SwiftUI // MARK: - 1️ public struct WriteBtnViewModifier: ViewModifier { let action: () -> Void public init(action: @escaping () -> Void) { self.action = action } public func body(content: Content) -> some View { ZStack { content VStack { Spacer() HStack { Spacer() Button( action: action, label: { Image("writeBtn") } ) } } .padding(.trailing, 20) .padding(.bottom, 50) } } } // 사용법: // 원하는 View에 ZStack을 지우고 버튼을 지운다. // 남은 VStack에 .modifier(WriteBtnViewModifier(action:

[UIKit] Collection View 스크롤 방향 바꾸기, page control 연결하기 [내부링크]

기본적으로는 vertical 방향으로 스크롤이 진행된다. Horizontal로 변경. Page Control이랑 연동하기 Paging Enabled 체크, (스르륵 넘어가던 화면이 촥촥 타이밍에 맞게 끊기면서 멈춘다.) 움직일 때 표시되는 선(indicator)을 끄는 것은 선택 사항. 다만 page control이 있기에 indicator은 필요없을 것이다. page control 연결 코드 설정 @IBOutlet weak var pageControl: UIPageControl! // page control의 점을 총 몇개 보여줄 것인지 override func viewDidLoad(){ pageControl.numberOfPages = messages.count // page control의 어떤 점이 밝게 빛날지 0,1,2... 아래에서 사용. // pageControl.currentPage } ... extension OnboardingViewController: UIScro

[iOS] Compositional Layout 알아보기 [내부링크]

기존의 single layout은 복잡한 layout을 구현하기에 힘들다. 따라서, UICollectionViewDataSource --> UICollectionViewDiffableDataSource UICollectionViewFlowLayout --> UICollectionViewCompositionalLayout 로 변경 사용해야 하며, // Data, Presentation, Layout 새로운 방법 사용 wwdc // snapshot: data // diffable datasource: presentation // compositional layout: layout 이렇게 한다고 볼 수 있다.

[UIKit] error: Failed to instantiate the default view controller for UIMainStoryboardFile'Main' [내부링크]

에러 본문: Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set? 확인 해야할 부분은 두가지다. 1. storyboard에 view controller제대로 연결했는지 확인하기 2. Is initial view controller 체크 entry point is not set? 라고 여쭤보는 것이기에 이 부분을 체크하면 해결 가능하다. 다 했으면 clean build folder한 번 하고 돌리는 것도 추천.

[Mac] 기본 터미널의 호스트 네임 변경하기 [내부링크]

맥북 기본 터미널을 열면 시스템에서 디폴트 값으로 이름@이름-기기이름 이런 형식으로 만들어놨다. 한국어로 설정했을 경우 영문 이름이 틀릴 수도 있기에 수정이 필요하다. scutil --set HostName [원하는HostName] 실행 후 터미널을 재시동하면 적용이 된다.

[iOS] Cocoapods 설치 및 외부 라이브러리 사용하기 [내부링크]

CocoaPods은 Objective-C 또는 Swift에서 라이브러리를 사용할 수 있게 도와주는 모듈이다. sudo gem install cocoapods m1/m2 설치 후에 버전 관련 에러가 날 수도 있는데, 경험상 기본적으로 맥에 설치되어 있는 ruby 버전은 쉽게 업데이트하지 않는 것이 좋다. 따라서 에러 메시지에 나오는 내용대로 수정하면 된다. 어렵지 않다. 터미널 창을 열어, 생성한 프로젝트 폴더로 이동한다. pod init 그러면 "Podfile"이 생성된다. # <- 주석 처리되어 있는 부분인 platform은 자신의 프로젝트 최저 버전으로 설정하고 주석을 지운다. 그리고 라이브러리에 명시되어 있는 내용에 따라 해당 위치에 추가할 내용을 추가한다. Podfile에도 문법이 존재하기에 정확안 위치에 커맨드를 넣어야 한다. pod install 로 라이브러리 설치. 라이브러리 설치 이후에는 프로젝트 폴더의 .xcodeproj 파일이 아닌, .xcworkspace 파일을

[iOS] 오픈소스 라이브러리 PR 승인 (instructions) [내부링크]

남는 시간을 활용하여 storyboard로 필자만의 iOS 앱을 개발 중이었다. 사용자가 앱 진입 시 UI 사용 안내를 받게 하기 위하여 cocoapods에서 instructions라는 라이브러리를 찾았다. 규모도 꽤 크고 사용자도 많아 한 번 필자의 앱에 적용하여 시도해 보기로 했다. 사용법에 따라 적절한 부분에 코드를 집어넣으면서 사용하였는데 라이브러리의 오리지널 파일에서 warning이 발생하였다. Swift도 다른 언어와 별반 차이 없이 Apple에서 계속 업데이트하기에 iOS의 버전이 업데이트됨에 따라 사용하지 못하는 문법이 발생할 수 있다. 해당 warning은 Apple이 iOS15.0 이상부터 사용하지 말라고 권고하는 문법이다. 그냥 필자의 local 파일에서 수정하고 잊어버릴 수도 있었지만, 개발자로서의 이타심이 이 부분을 못 지나치게 하였다. 필자는 iOS15.0 이전과 이후 두 파트로 나눠서 코드를 수정하여 pull request 요청을 보냈다. 주말이 지나서 라

[SwiftUI] List(list, id: \.self)에서 "id:"를 생략하고 싶을 때 [내부링크]

// 기존 형태 List(list, id: \.self) { item in StockRankRow(stock: item) .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) .listRowSeparator(.hidden) .frame(height: 80) } .listStyle(.plain) .background(.black) // 가져오는 데이터 struct StockModel: Hashable { let rank: Int let imageName: String let name: String let price: Int let diff: Double } 대충 이런 형식이다. List(list, id: \.self) 에서 id:는 구분자를 설정하기 위해서인데 그것을 데이터 쪽에서 설정할 수 있다. struct StockModel: Hashable, Identifiable { var id: UUID = UUID(

[SwiftUI] @StateObject, @ObservedObject 이해하기 [내부링크]

`@StateObject`와 `@ObservedObject`는 SwiftUI에서 사용되는 두 가지 프로퍼티 래퍼입니다. 둘 다 ObservableObject 프로토콜을 준수하는 객체의 변화를 감지하여 뷰를 업데이트하는 데 사용되지만, 주요한 사용 케이스와 라이프 사이클 관리 측면에서 차이가 있습니다. 1. **@StateObject**: - `@StateObject`는 **소유자**입니다. 즉, SwiftUI가 이 객체의 라이프 사이클을 관리하게 됩니다. - `@StateObject`는 주로 뷰 내에서 처음 생성되는 객체에 사용됩니다. - 뷰가 다시 생성되어도, `@StateObject`로 마킹된 객체는 파괴되지 않고 존속합니다. - 이러한 특징 덕분에 뷰의 라이프 사이클 동안 한 번만 초기화하고 유지하려는 객체 (예: 뷰 모델)에 적합합니다. 2. **@ObservedObject**: - `@ObservedObject`는 **참조**입니다. 객체의 라이프 사이클은 SwiftUI가

[개발 지식] "Single Source of Truth" (SSoT)는 무엇인가? [내부링크]

"Single Source of Truth" (SSoT)는 데이터 설계와 아키텍처에서 중요한 원칙 중 하나로, 어떤 특정 데이터나 정보에 대해 그 데이터의 정확하고 신뢰할 수 있는 하나의 출처나 저장 위치가 있어야 한다는 의미입니다. 이 원칙은 중복, 모순 및 데이터 불일치 문제를 방지하는 데 도움을 줍니다. SSoT의 핵심 아이디어는 다음과 같습니다: 1. **데이터 중복 최소화**: 데이터가 여러 위치에 중복 저장되지 않도록 합니다. 중복 저장은 데이터 불일치의 위험을 높이므로, 가능한 한 중복을 피하려고 노력합니다. 2. **데이터 무결성 유지**: 데이터가 변경될 때, 해당 변경이 SSoT에서만 수행되어야 합니다. 그 결과, 다른 시스템이나 구성 요소에서는 이 SSoT를 참조하여 항상 최신의 정보를 얻을 수 있습니다. 3. **일관성**: SSoT는 데이터의 일관성을 보장합니다. 모든 시스템이 동일한 데이터 소스를 참조하므로 데이터의 일관성이 유지됩니다. 실제 애플리케이션 개

[SwiftUI] error: EnvironmentObject 응용 프로그램이 예기치 않게 종료되었습니다. [내부링크]

@EnvironmentObject 를 사용하면 preview가 crash 난다. struct ContentView_Previews: PreviewProvider { static var previews: some View { FirstView().environmentObject(UserProfileSettings()) } } PreviewProvider에 .environmentObject(.environmentObject로 설정한 class) 추가로 해결

[SwiftUI] error: Cannot convert value of type '.Type' to expected argument type 'Binding&lt;&gt;' [내부링크]

@Binding var framework: AppleFramework ... #Preview { FrameworkDetailView(framework: AppleFramework) } --> #Preview { FrameworkDetailView(framework: .constant(AppleFramework.list[0])) } .constant 에 .list[0] 추가하면 된다.

[SwiftUI] Button의 Tappable 영역 정하기 [내부링크]

https://alejandromp.com/blog/playing-with-swiftui-buttons/ Playing with SwiftUI Buttons | Alexito's World The abstractions on SwiftUI are so composable that customising the UI it's basically an intrinsic property of the framework. Let's take a quick look at some things you can do... alejandromp.com 자세한 내용은 위 사이트를 참고하면 좋다. 필자는 유용한 내용만 추출해서 정리해보겠습니다. Button(action: { // presentationMode.wrappedValue.dismiss() // 창닫기 }, label: { Text("Learn More") .font(.system(size: 20, weight: .bold)) .foreground

[UIKit] UISearchController 만들어 보기 [내부링크]

class SearchViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self if let flowlayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout{ flowlayout.estimatedItemSize = .zero } // 여기 self.navigationItem.title = "Search" let searchController = UISearchController(searchResultsController: nil) searchController.hidesNavigationBarDuringPre

[Xcode] 개발 중 사용하는 유용한 단축키 모음 [내부링크]

(CMD) + c(Click) : 정의로 이동 / fold로 현재 커서가 위치한 블록 접기/펼치기 기능 (Option) +c(Click) : Declaration을 보여줌 (CMD) + (SHIFT) + F : 전체 파일 스트링 검색 (CTRL) + i : 코드 정렬 (CMD) + [ 또는 ] : 코드 들여 쓰기 (Option) + (CMD) + [ : 해당 줄의 코드를 위로 올림 (Option) + (CMD) + ] : 해당 줄의 코드를 위로 내림 (SHIFT) + (CTRL) + c(Click) : 여러 줄을 클릭해 한번에 수정/추가 가능 Command + Control + e : 같은 단어 한번에 선택 (CMD) + D : 선택한 줄 아래로 복사 + + ← : 코드 블록 접고 열기

[Xcode] Github에 Xcode 프로젝트 올리기 (push 하기) [내부링크]

Xcode -> Settings -> Accounts +로 Github 계정 추가. Token 생성은 하단의 Create a Token on Github로 진행하면 된다. 계정 추가 완료 후 Integrate -> New Git Repository... 만약에 프로젝트 처음 생성 시 git repository도 같이 생성으로 진행했으면 아래와 같이 이미 source control이 됐다고 뜬다. 좌측 Source Control Navigator 클릭 Repositories -> 앱 이름 우클릭 -> Remote 항상 깃허브에서 설정하던 대로 진행해 준다. 여기까지 진행하면 깃허브에서 repository 생성이 완료됐을 것이다. 하지만 위 사진과 같이 init 당시의 repo만 올라갔지 그동안 변경했던 부분은 아직 push를 해줘야 한다. commit & push 작업 진행. Integrate에 필요한 명령들이 다 있으니 이대로 진행하면 된다. repo에도 commit & push 된

[UIKit] Autolayout 이해하기 (in storyboard) [내부링크]

기존 프레임 기반 레이아웃의 문제가 있다. 아이폰 8~15까지 다 스크린 사이즈 및 해상도가 조금씩 다르며 동적으로 뷰를 위치 시킬 수 없고, 또 스크린별로 일일이 계산해 주는 것은 방대한 작업량을 요구한다. 따라서 autolayout = 자동으로 의도를 정해주면 알아서 위치하게 해준다. 제약사항(Constraint)를 통해서 autolayout을 적용 적용 시, 뷰는 위치를 알 수 있어야 하고 크기를 알 수 있어야 한다. 아이폰의 좌상점이 (0,0)이다. x, y 축 존재. 버튼이 수직 기준으로 이 전체 뷰에서 중앙에 위치하고 싶다. 그러면 버튼에서 ctrl+클릭으로 끌어서 원하는 뷰로 끌어온다. 그러면 위와 같이 메뉴가 나온다. size inspector에서 확인 가능. 이렇듯이 설정 중에 빨간색이 나타난 이유는 사이즈라든지, 수평 수직 위치 등 아직 정하기 않은 부분이 있다~라는 것을 알려줍니다. 여기서는 수직 위치를 안 정해서 그렇다, 설정을 완료하면 빨간 테두리도 사라지며

[iOS] 앱 lifecycle 생명주기 간단 정리 [내부링크]

import UIKit class SymbolRollerViewController: UIViewController { let symbols: [String] = ["sun.min","moon","cloud","wind","snowflake"] @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var label: UILabel! @IBOutlet weak var button: UIButton! // 메모리 올라가고, 화면 준비하고. override func viewDidLoad() { super.viewDidLoad() reload() } // 화면이 곧 보여진다. override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } // 화면이 보여진 이후. override func viewDidAppear(_ animated: Bool) { super.

[UIKit] 주황색 표시인 constraints 업데이트가 안될 때 [내부링크]

사진과 같이 버튼을 view 중앙에 위치 시키고 싶은데 바로바로 업데이트가 안될 때가 있다. option+command+플러스키 constraints가 업데이트된다.

[UIKit] 실행되고 있는 앱의 hierarchy(계층) 보는 법 [내부링크]

먼저 앱을 실행하고 있는 상태에서 그럼 이렇게 UIcollectionView에서 셀 크기 및 각종 레이아웃 정보를 볼 수 있다.

[UIKit] 자동완성, 셀 사이즈, 내용 압축 저항 우선순위 변경법 [내부링크]

자동 완성 목록 보여주기 ESC, Tab ESC를 누르면 나오며 여기서 Tab으로 한 단어씩 완성해 나가거나 원하는 것을 선택 후 Enter을 눌러 선택. collectionViewCell 사이즈 Estimate Size 코드에서 셀 사이즈를 safe area width 사이즈로 한정해 줬음에도 불구하고 화면 밖으로 나갈 때가 있다. 그럴 때는 Estimate(추정) Size: None으로 설정하면 코드대로 작동한다. 내용 압축 저항 우선순위 Content Compression Resistance Priority 대화 내용 이랑 날짜는 같은 horizontal 선상에 위치하며 서로가 서로를 밀고 있는 상황이다. 여기서 긴 대화 내용 때문에 기기에서 날짜가 보이지 않는 현상이 발생하는데, 힘의 균형 싸움에서 대화 내용이 지고 날짜가 이겨서 날짜가 보였으면 한다. 따라서 대화 내용 label의 size inspector에 들어가, 이 Content Compression Resistanc

[UIKit] label lines 변경, UIImageView round corner radius 설정하기 in storyboard [내부링크]

label 라인 변경 여기서 lines에 따라 변경이 된다. label 양이 lines보다 많으면 많이 나온 부분은 자동으로 ...으로 변경된다. UIImageView round corner User Defined Runtime Attributes 변경. layer.masksToBounds layer.cornerRadius 현재 사용하는 이미지가 80 X 80로 설정했기에, 이미지를 동그랗게 하려면 40으로 하면 된다. ** 코드로 변경하는법 import UIKit class ChatListCollectionViewCell: UICollectionViewCell { @IBOutlet weak var thumbnail: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var chatLabel: UILabel! @IBOutlet weak var dateLabel: UILabel! // imageView corner

[Swift] 날짜 타입 "yyyy-MM-dd"에서 "M/d"으로 변경하는 법 [내부링크]

func formattedDateString(dateString: String) -> String { // String -> Date -> String // 2022-04-01 -> 1/4 let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" if let date = formatter.date(from: dateString){ formatter.dateFormat = "M/d" return formatter.string(from: date) } else { return "" } } 넘어오는 데이터에서 날짜(dateString)는 "yyyy-MM-dd" 형식의 string이다. let formatter = DateFormatter()를 사용하여, string -> date-> date format -> string으로 변환하여 return 시킨다.

[Swift] 가격을 천 단위로 콤마 들어가게 변경하기 [내부링크]

func convertToCurrencyFormat(price:Int)->String{ let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.maximumFractionDigits = 0 return numberFormatter.string(from: NSNumber(value: price)) ?? "" } [코드] 이렇게 return 시키면 된다. 5123450원 -> 5,123,450원

[UIKit] collectionViewCell 여백 설정, Navigation controller 추가, Superview 설정하기 [내부링크]

collectionViewCell 여백 설정 class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list:[AppleFramework] = AppleFramework.list // data, presentation, layout override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self // 컨텐츠 상하좌우 여백주기 collectionView.contentInset = UIEdgeInsets(top: 20, left: 16, bottom: 0, right: 16) } } Navigation controller 추가 storyboard를 선택한 상태에서 Editor-> Embed in-> Navig

[UIKit] CollectionViewCell 의도한 대로 셀 사이즈가 안 나올 때 [내부링크]

extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let paddingSpacing: CGFloat = 16 let width = (collectionView.bounds.width - interItemSpacing * 2 - paddingSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } 이렇 듯이 셀 사이즈를 코드로 정해놨는데 의도대로 작동이 안 될 때가

[Swift] 함수의 정의 및 필요성 [내부링크]

함수의 필요성 및 기본 형태 // 함수 기본 형태 func hello(name:String) -> String { return "Hello " + name } print(hello(name:"Tony")) 함수의 다양한 형태 // 파라미터 기본값 설정 func addTwoNumbers(num1:Int, num2:Int = 100)->Int{ let sum = num1 + num2 return sum } addTwoNumbers(num1: 5) //num2 생략 // 파라미터 많이 받기 func addNumbers(numbers:Int...)->Int { var sum = 0 for num in numbers{ sum += num } return sum } addNumbers(numbers: 1,2,3,4,5)

[Swift] class 개념, 상속, subclass, override 등 [내부링크]

class 개념 let circle = Circle() 이 부분이 핵심인데, 이 클래스의 instance를 만든다고 한다. 따라서 circle는 여기서 instance 하고 불린다.(또한 객체 object, 하지만 애플은 instance라고 명명하는 듯.) 또한 클래스 이름은 대문자이며, 변수 상수 함수는 소문자 이름이다. 변수, 상수가 클래스의 안에 있으면, 클래스의 속성 property라고 하며, 클래스 안에 있는 함수는 클래스의 메소드method라고 한다. 클래스 안의 속성은 초깃값이 없으면 에러가 난다. class 생성자 또한 생성자 지정 init() 도 가능하다. self는 속성과 구분하기 위해. class 변수, 상수 만드는법 65, "Hello" 등 값을 리터럴이라고 한다. 컴퓨터 과학 분야에서 리터럴 이란 소스 코드의 고정된 값을 나타내는 표기법이다. 거의 모든 프로그래밍 언어는 정수, 부동소수점 숫자, 문자열, 불린 자료형과 같은 기본적인 값에 대한 표기법이 있다.

[Swift] 열거형(Enumeration) [내부링크]

.iOS는 AppleOS.iOS를 생략한 것으로 보는 바와 같이 생략할 수 있다. 위에서부터 아래로 0,1,2,3 부여된다. rawValue를 사용해서 출력하면 0이 출력된다. (.iOS이기 때문.) 문자열 타입도 가능한데, 이 경우는 iPad가 출력된다.

[Swift] open, public, internal 등 접근제어(access control) [내부링크]

모듈은 하나의 코드 배포 단위. framework과 같이 import 키워드를 써서, 또 다른 모듈에서 로드할 수 있는 코드 단위를 모듈이라고 함. 최종 합본

[iOS] 앱 기획 시 iOS 최저 버전을 정하는 기준 [내부링크]

https://developer.apple.com/support/app-store/ App Store - Support - Apple Developer About the App Store Find out how the App Store empowers you to distribute apps in the thriving app economy and successfully run and grow a global business. Get an overview of the extensive app management tools and marketing resources you can access, and the capabilities you can integrate into your a... developer.apple.com 애플이 주기적으로 발표하는 기기 종류 별 OS 점유율을 보면 된다. 아이폰의 경우 최대한 많은 사용자를 얻기 위해서 iOS15를 최저로 잡고 개발할 수도 있지만 개

[Git/Github] (오픈소스 기여 과정) 원격 저장소 fork 및 PR(pull request)까지 [내부링크]

먼저 원하는 원격 저장소를 fork 한다. * 필요시 Copy the main branch only 체크 해제. 2. repository 클론 하기 https 주소를 클론 원하는 경로에 git clone https://github.com/username/projectName cd projectName 3. 브랜치 추적하기 clone 해온 폴더로 이동하여 원격 저장소에 이미 만들어진 자신의 브랜치에서 작업합니다. 하지만 원격 저장소에서 clone 해온 직후 branch를 검색해 보면 main 밖에 보이질 않습니다. git clone을 해줄 경우 main 브랜치만 로컬로 가져오는 것이기 때문에 원격 저장소의 다른 브랜치를 가져오는 별도의 작업을 해주어야 합니다. 아래 사진에서는 안 보이지만 자신의 이름과 일치하는 branch를 가져오면 됩니다. * 이 작업을 하려면 1번에서의 체크를 해제해야 함. 1. 어떤 branch가 존재하는지 확인합니다. (clone해온 직후에는 main 브랜치만

[UIKit] 앱 개발 중 메모(사이징, 앱 아이콘, 코드 정렬 등) [내부링크]

모든 기종에 사진이 잘리지 않게 autoresizing size inspector -> autoresizing에서 모든 방향 활성화 그래도 어떤 기종에서는 사진이 찌뿌둥돼서 나온다. 그러면 attributes inspector -> view/Content Mode -> Aspect Fill 2. autoresizing보다는 autolayout을 사용 원하는 버튼이 중앙 정렬 필요시, 버튼 선택 및 이 두 항목을 추가 후, add constraints 하면 중앙 정렬 가능하다. // 만약 중앙에서 아래로 50만큼 내려간 것으로 바꾸고 싶다, 그러면 size inspector -> constraints -> 3. app icon generator 이제 더 이상 예전처럼 귀찮게 다른 사이트가서 생성하여 xcode로 옮길 필요가 없다. 1024 1024 single icon 하나면 xcode가 알아서 generate 해준다. -- WWDC 2022 업데이트 내용 4. UI와 연동된 코드 보

[UIKit] error: this class is not key value coding-compliant for the key. [내부링크]

에러는 appdelegate.swift에서 발생하지만 여기 코드는 건든 적이 없다. 그러면 ViewController.swift에서 영향을 준 건데 다른 곳(RN 등)과 달리 여기는 항상 스토리보드를 확인해 줘야 한다. UIButton으로 IBOutlet을 연동했고 buttonTest라는 함수를 만들었다. 그리고 어떤 이유든지 이 코드를 지웠다. 직후 위 에러가 발생한다. Referencing Outlets에 'buttonTest'가 남아있으므로 지워줘야 한다. 문제 해결. 에러 위치 찾기 본인이 어떤 작업을 한 직후 에러가 발생했는지 명확하면 문제가 해결되지만, 그렇지 않으면 에러 발생한 위치를 찾아야 한다. Main.storyboard 우클릭 -> Open As -> Source Code xml 파일이 열린다. 단어 찾기로 에러를 일으킨 단어를 찾으면 위치가 나온다. 해당 부분을 찾아가서 스토리보드를 지운다.

[Dart] 함수 functions 관련 basic 내용 정리 [내부링크]

함수 정의 Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 타입이 Function입니다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미합니다. void 는 아무것도 return 하지 않습니다. 따라서 리턴 값이 있으면 void를 string,num등 특정타입으로 명시해줘야 합니다. String sayHello(String name) { return "Hello ${name} nice to meet you."}; // 하나의 표현식만 포함하는 함수의 경우 아래와 같이 단축 구문을 사용할 수 있습니다. String sayHello(String name) => "Hello ${name} nice to meet you."; num plus(num a, num b) => a + b; void main() { print(sayHello("sugar")); } 2. Named parameters Named parameters는 명시적으로 required로 표시되

[React] styled-components의 props전달법 및 extending [내부링크]

styled-components를 굳이 사용해야 한다면 지켜야 할 룰에 대해서 정리해본다. props 전달 방법 const Box = styled.div` background-color: ${props=>props.bgColor}; `; function App(){ return( <Box bgColor='red'/> <Box bgColor='yellow'/> ) }; 2. 확장 방법 const Box = styled.div` background-color: ${props=>props.bgColor}; `; const Circle = styled(Box)` ...(추가 css) `; function App(){ return( <Box bgColor='red'/> <Circle bgColor='yellow'/> ) };

[UIKit] storyboard로 앱 개발 프로젝트 생성 및 Xcode 구성 [내부링크]

Xcode의 iOS 앱 개발로 진행. product name: 앱 설치 시 나타날 이름 organization identifier: 팀의 도메인을 거꾸로 해서 쓴다. 예) 원래 tonyyun.com -> com.tonyyun 소속되어 있는 팀(조직) 이 없으면 임의로 작성해도 상관없다. bundle identifier: organization identifier+product name 고유여야함, 즉 앱스토어에 같은 번들 아이디가 있으면 그 앱은 앱스토어에 올릴 수가 없음. 일단 인터페이스는 Storyboard로 진행. (SwiftUI / Storyboard 두 가지) 애플에서는 SwiftUI를 권장하지만 기존 오래된 앱들이 storyboard로 작성되었기에 유지 보수를 위해서라도 알아둬야 한다고 생각합니다. Storyboard vs SwiftUI ?? https://gobans.tistory.com/15 iOS - SwiftUI와 Storyboard 애플에서 주관하는 Apple D

[Swift] 앱 개발을 위한 Swift 기본 문법 [내부링크]

https://developer.apple.com/swift/ Swift - Apple Developer Swift is a powerful and intuitive programming language for iOS, iPadOS, macOS, tvOS, and watchOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. developer.apple.com 연산자 // 산술 연산자 var weight = 65 weight += 10 weight -= 10 weight *= 10 weight /= 10 weight %= 10 // 비교 연산자 // < , > , == , != // 논리 연산자 // && : 조건이 둘 다 true 시 true // || : 둘 중 하나 이상 true 시 tru

[Dart] Dart 언어의 data types [내부링크]

1. 기본 데이터 타입 아래 타입을 포함한 거의 대부분의 타입들이 객체로 이루어져 있다. (함수도 객체) 이것이 Dart가 진정한 객체 지향 언어로 불리는 이유이다. void main() { String name = "tom"; bool isPlay = true; int age = 10; double money = 52.55; num x = 12; num y = 1.2; } 2. dart에서 lists를 선언하는 것은 두 가지 방법이 있다. void main(){ int case1 = [1,2,3,4,5]; List case2 = [1,2,3,4,5]; } 만약 vscode나 dartPad를 사용한다면 맨 끝을 쉼표로 마무리하면 유용하다. void main(){ int case1 = [ 1, 2, 3, 4, 5, ]; } dart의 유용한 점은 `collection if`와 `collection for`을 지원하는 것이다. collection if를 사용하면 `존재할 수도 안 할 수

[Dart] Error: Could not find a Dart SDK.에러 해결 [내부링크]

VSCode 에서 .dart 파일에서 코드 작성 시, 필요로 인하여 확장에서 dart관련 확장을 설치했다. 다만 위와 같은 에러가 뜨면서 진행이 되지 않고 있다. Download SDK로 들어가서 무슨 문제인지 들여다 보자. https://dart.dev/get-dart Get the Dart SDK Get the libraries and command-line tools that you need to develop Dart web, command-line, and server apps. dart.dev 홈페이지에 이렇게 macOS 대응 터미널 명령어를 제시해 줬다. 이대로 진행해보자. #mac homebrew 설치 관련 오류는 여기에: https://blog.naver.com/lifeyun24/223138284136 [Mac] Mac 에 homebrew 설치하기 및 warning: /opt/homebrew/bin is not in your path. 에러 해결 homebrew 관련

[Dart] Dart 입문 및 변수(Variables) 선언 [내부링크]

Dart를 배우기 앞서 dart의 class에 관하여 많은 내용을 다룰 예정이다. 왜냐면 Dart는 진정한 객체지향 언어이고 flutter도 객체지향 프레임워크이기 때문이다. 항상 class를 사용한다. 이제 시작. 1. 'main' funtion main 함수는 모든 dart 프로그램의 entry point이기 때문에 중요하다. 반드시 main 함수를 작성해야 한다. void main() { print('hello world'); } 2. 변수 선언 방법 1.var void main() { var name = 'tony'; name = 'yun'; print(name); //yun } js와 마찬가지로 var로 선언한 변수는 그 값을 변경할 수 있다. 다만, 같은 타입이어야 한다. dart는 변수의 타입을 자동으로 인식한다. (본 예제는 string이다) 2. 명시적으로 변수의 타입을 지정 이런 경우도 위와 똑같이 변수 업데이트 가능하다. 관습적으로 함수나 메서드 내부에 지역 변수

[Git] Git branch 생성, 조회, 삭제 및 에러 해결 [내부링크]

오늘은 현업에서 필자가 branch 관련하여 얻은 지식 중 중요한 내용들을 적어보겠습니다. 우선 cli로 중요한 커맨드 먼저 적어본 다음, 특정 상황에서의 문제 발생 원인 및 대처법을 적어보겠습니다. command 조회 git branch (로컬 브랜치 목록 조회) git branch -r (원격 브랜치 목록 조회) git branch -a (모든 브랜치 목록 조회) (master)$ git branch (로컬) * master newbranch newbranch2 (master)$ git branch -r (원격) origin/master origin/newbranch (master)$ git branch -a (모든) * master newbranch newbranch2 origin/master origin/newbranch 2. 로컬 branch 생성 및 변경 방법1 (master)$ git branch newbranch //생성 (master)$ git chechout new

[Mac] 자동 brew update 방지하는 법 [내부링크]

homebrew는 모든 brew install 전에 자동으로 brew update를 실행하기 시작했다. 즉, 패키지를 설치할 때마다 네트워크 속도에 따라 10-20초를 기다려야 합니다. 이것은 전혀 불필요한 과정이다. (혹은 회사에서 각자 컴퓨터의 환경을 맞춰놨는데, 혼자 업데이트하면 불상사가 생길 수도 있다.) 어떻게 하면 이런 행동에서 벗어날 수 있을까, 이에 대한 해답을 가져와본다. 다음과 같이 설치 명령 앞에 HOMEBREW_NO_AUTO_UPDATE=1을 붙이기만 하면 됩니다: HOMEBREW_NO_AUTO_UPDATE=1 brew install somepackage

[TypeScript] 리터럴 타입, 유니언 타입, 교차 타입 설명 [내부링크]

TypeScript는 프로그래밍 언어, 작성한 코드가 자바스크립트로 변환 개발자가 실수하지 않도록 보호. 어떻게? 타입스크립트 작성 → 통과 → 컴파일 → 자바스크립트 (즉, 타입스크립트에서 에러가 있으면 JS로 컴파일이 안됨.) 리터럴 타입(Literal Type): 정확한 타입 - TypeScript의 리터럴 타입은 string, number 두 가지가 있으며, 문자열이나 숫자에 정확한 값을 지정할 수 있습니다. https://www.typescriptlang.org/play?#code/Q 문자열 리터럴 타입 (String Literal Types) 아래 코드에서 Food 에서 허용한 3개의 문자열 외에 다른 문자열을 사용하게 되면 에러가 발생한다. type Food = "rice" // 리터럴 타입 type Food = "rice" | "noodle" | "meat"; //유니언 타입 const myFood1: Food = "rice"; const myFood2: Food =

[Mac] Mac 에 homebrew 설치하기 및 warning: /opt/homebrew/bin is not in your path. 에러 해결 [내부링크]

homebrew 관련 내용은 이미 예전 같은 카테고리의 포스터에서 다룬 적이 있기 때문에 여기서는 생략하겠습니다. 간단하게 말하면 Ruby와 Git 으로 개발된 MacOS 용 패키지 매니저입니다. https://brew.sh/index_ko Homebrew The Missing Package Manager for macOS (or Linux). brew.sh 홈페이지의 명령어를 터미널에 복붙해도 zsh: command not found: brew 가 나오며, 설치 시 떴던 경고 메시지 Warning: /opt/homebrew/bin is not in your PATH에 나와 있듯이, 아직 PATH 에 등록이 되지 않아서 그렇습니다. 해결: /Users/username 경로 아래에 vi ~/.zshrc 로 에디터 진입 export PATH="/opt/homebrew/bin:$PATH" 를 작성해주고, ESC와 :wq를 누르고 엔터를 치면된다. # :wq는 저장 및 나오기 2. 그래도

[iOS] AppStore 심사 통과를 위한 스크린샷 조정 사이트 [내부링크]

먼저 우리가 앱 스토어에 앱을 검색하면 앱 아이콘 하단에 개발자가 캡처 해놓은 앱 내부의 사진들이 보입니다.(혹은 동영상). screenshot 이것 screenshot까지 철저히 자기 입맛대로 통제하고 맘에 안 들면 리젝 시켜버리니... 하긴 그동안 앱 스토어의 앱들이 한결같이 깔끔해 보이고 좋아 보이던 게 다 이유가 있었습니다. 개발자 or 디자이너 분들 다 수고 많습니다.. ㅠ screenshot은 아래 사이트를 추천합니다. https://previewed.app/app-store-screenshot-generator/ App Store Screenshot Generator | Panoramic Mockup Sets Create eye-catching mockups for your app, in 3D. previewed.app 스크린샷을 아이폰 틀 모양에 넣어서 보이게 할 수도 있습니다. 고품질 사진은 비용을 지불해야 하지만 일반 사진으로도 문제없이 진행 가능합니다. (이왕이면

[iOS] iOS 앱스토어 심사를 드디어 통과하면서... (회고록) [내부링크]

드디어 필자의 회사 프로젝트 React Native 앱이 iOS 스토어까지 심사를 통과했습니다. 얼마나 감격스러웠는지... 안드로이드는 일주일 전에 출시를 마쳤으며, iOS는 10회에 가까운 reject 덕에 일주일 정도 출시가 늦어졌습니다. 덕분에 앱이 좀 더 앱 다워졌달까. 오히려 코칭을 해주는 느낌이어서 좋았습니다. 앱을 만들면서 회사에서는 "~이런 기능의 앱을 만들어라" 밖에 없었기 때문에 처음에는 꽤 막막했습니다. 왜냐하면 앱 디자인부터 시작해서 앱 구조, 로직, 심지어 백엔드(Nodejs)에서 api 만들기까지 혼자 진행해야 했기 때문입니다. 그래도 앱 개발을 좋아하는지라 밤낮없이 생각하고 구상하며, 심지어 주말에도 악상이 떠올라 회사에 나가서 진도를 나아갔습니다. 기본적인 회원가입, 로그인, 회원 탈퇴, 콘텐츠 보여주기 등 기능은 갖춰서 구글 심사는 문제없이 통과됐었습니다. iOS 리젝을 당하면서 앱스토어 심사원이 꽤나 세세하게 검토와 지적을 해준 덕분에 많은 깨달음을

[RN] 앱 출시 후 유지 보수 회고록(iOS, Android) [내부링크]

React Native의 장점은 명확합니다. iOS 및 Android 환경에서 동시 개발을 진행할 수 있으며, 또한 CodePush를 통한 배포가 유용하기 때문입니다. 이에 따른 디버깅과 오류는 훨씬 많겠지만, 개발자로서 감수해야 하는 부분입니다. 필자의 회사 프로젝트 앱이 iOS, Google 두 마켓에 출시한지 어느덧 2주라는 시간이 흘렀습니다. 그동안 어떤 일이 있었고, 어떻게 해결했는지 끄적여 보겠습니다. iOS (Apple) -확실히 심사 시간이 오래 걸립니다. 앱 제출의 기본 흐름은: 심사 대기 중-> 심사 중-> 심사 결과. 이렇게 크게 3단계입니다. 심사 대기 중-> 심사 중 이 구간의 대기 시간이 엄청 깁니다. 짧게는 하루, 길게는 미국 쪽 블랙프라이데이 등 연휴가 걸치면 이틀 정도 걸렸습니다. 심사에 들어가면 (심사 중-> 심사 결과) 결과 나오기까지 30분~1시간 정도 걸립니다. 보통 심사는 한국 시간 기준 새벽에 진행했었습니다. -구글보다 심사를 모든 방면에서

[iOS] UI 디자인 기본 원칙 [내부링크]

오늘은 필자가 1년 동안 4개의 앱을 개발해오면서 그동안 보고 깨달았던 프론트엔드 개발자의 기본 소양 중 하나인 "UI" 디자인에 대하여 정리해 보겠습니다. 서론에 앞서 "UI"와 "UX"는 차이점이 존재합니다. (UX가 전체 경험을 구성하는 것이라면 UI는 사용자가 상호 작용할 시각적이면서 유형적 요소를 만들어 나가는 데 중점을 둡니다, 이는 나중에 따로 정리를 하겠습니다.) 우선 개발자의 입장에서는 해당 레이아웃이 현재 "기술적으로 가능"한지에 대해서 본인이 스스로 잘 알아야 합니다. 더 나아가 앱의 레이아웃 구성 시 디자이너와의 적절한 소통을 통해 타협점을 만들고 해결 방안을 찾아갈 수 있습니다. 그와 동시에 (병렬적) 고려해야 할 것은 유저에게 보이는 화면입니다. 매력적인 사용자 경험은 견고한 인터페이스 디자인을 기반으로 합니다. 코딩을 시작하기 전 다음과 같은 기본 디자인 개념을 고려하여 다양한 사용자를 위한 깔끔하고 효율적인 인터페이스를 디자인하십시오. -Apple UI

[Android][Error] ReactNative Release Build 시 http 통신이 안되는 문제 해결 [내부링크]

오늘 앱의 디버깅을 끝내고 드디어 출시 전 마지막 Release Build로 테스트를 잠깐 진행했었습니다. 근데 이게 웬일, 로그인 및 회원가입 등 http 통신을 요청할 시 앱이 죽어버렸습니다ㅠ Build 때도 문제없었고, Release 때 어떻게 이런 일이 발생하는지... 심지어 iOS release build는 문제없었습니다. 참고로 react native init 0.69 이상입니다. AndroidManifest.xml 해당 원인으로 찾아보니 Android 쪽은 코드 한 줄을 추가해 주어야 했습니다. 경로는 /android/app/src/main/AndroidManifest.xml <application>태그 안에 android:usesCleartextTraffic="true" 추가해 주고 다시 release build 하니 잘 작동했습니다!

[Android] ReactNative 서명된 aab 파일 생성 법(+구글 플레이 스토어 출시를 위한) [내부링크]

오늘 필자가 회사에서 만든 앱이 드디어 구글 플레이 스토어에 등록이 되었습니다! 필자도 한두 번쯤은 reject 당하겠지...라는 각오가 있었는데 이렇게 한 번에 되어버리니 처음에는 어안이 벙벙했습니다, 원래 이렇게 되는 건지 아니면 운이 좋았던 건지... 그래도 출시를 위해 많은 정보를 찾아보고 헤맸던 보람이 있었던 것 같습니다. 그럼 출시에 성공했던 경험을 토대로, ReactNative에서 진행했던 aab 파일 생성 법을 정리해 보겠습니다. 요즘 구글은 apk보다는 aab 파일 형식을 권장하고 있습니다. 순조롭게 출시하려면 시대의 흐름을 따라야겠죠? https://developer.android.com/guide/app-bundle Android App Bundle 정보 | Android 개발자 | Android Developers Android 개발자 문서 가이드 Android App Bundle 정보 이 페이지의 내용 압축 다운로드 크기 제한 기타 고려사항 추가 리소스 블로그

[Android] 구글 플레이 스토어 앱 출시 회고록(+출시 과정) [내부링크]

오늘은 필자가 회사 프로젝트인 React Native로 앱을 개발하고, 마지막 Google Play Store까지 심사 통과됐던 회고록을 끄적여보겠습니다. 내부 테스트 먼저 본인 혹은 회사의 구글 계정이 개발자 계정에 가입되어 있어야 합니다. (비용 지불 필요) 우선 완성한 앱을 구글 스토어의 내부 테스트에 올려 테스터들에게 배포를 했습니다. 왜냐하면 React Native 특성상 ios, android 양쪽 모두 대응을 하기 때문에, 어떤 디바이스에서 레이아웃이 잘릴지, 혹은 문제가 생길지... 이 모든 문제를 출시 후에 겪으면 안 되니 내부 테스트는 필수라고 생각합니다. 내부 테스트는 별도의 앱 심사가 필요하지 않았으며(서명은 필요), 올린 aab 파일을 테스터들의 이메일로 발송하면, 테스터들이 해당 링크로 앱을 다운로드할 수 있었습니다. 충분한 테스트를 거친 후 이제 출시해도 괜찮다는 결정이 내려졌습니다. 구글 플레이 스토어 출시 대시보드 우선 google play consol

[iOS] AppStore 앱 심사 reject 회고록 [내부링크]

오늘은 이번 주 iOS 앱 출시를 준비하면서 겪었던 과정을 끄적여보겠습니다. 결론부터 말하면 AppStore 심사는 Google Play Store보다 훨씬 까다로웠습니다. 앞서 TestFlight 등 진행 과정은 필자의 아래 링크를 보면 됩니다. https://blog.naver.com/lifeyun24/222922524686 [iOS] 앱 출시 전 TestFlight에 배포하기 React Native로 개발을 진행했어도 iOS는 특별한 조치 없이 Xcode에서 진행하면 됩니다. TestFlight... blog.naver.com 1회 reject 로그인 기능이 있는 앱이면 로그인 정보를 제공해야 한다.(구글 플레이 스토어도 마찬가지) Sign-in required box를 체크하고 미리 가입해둔 id, 비번 정보를 제공해 주면 됩니다. 앱 기본 정보 작성은 각 앱마다 상황이 다르니 각자 알맞게 진행하면 되겠습니다. +핸드폰 번호 이슈(ios, android는 모두 앱 '수출'에

[RN] component의 StyleSheet까지 props 전달하는 방법 [내부링크]

예를 들어 여러 화면에서 같은 component를 많이 재사용하고 있다고 가정한다. 그러면 어떤 화면에서는 boolean 값을 넘겨주는 것으로 component의 스타일을 각자 다르게 보이고 하고 싶다. 어떻게 해야 할까. //MainScreen.js ... <Copyright text="이용약관, 개인정보 수집 및 이용 동의(필수)" isUnderLine={true} /> ... //Copyright.js 라는 component import React from 'react'; import {StyleSheet, Text} from 'react-native'; import PropTypes from 'prop-types'; import {COPYRIGHT} from 'assets/color/Palette'; const Copyright = ({text, isUnderLine}) => { return <Text style={styles(isUnderLine).text}>{text}</

[RN] text 내부에서 함수 혹은 줄바꿈 사용법 [내부링크]

함수 사용 text={`이용약관, 개인정보 수집${checkboxState} 및 \n이용 동의(필수)`} backtick을 사용하고 ${ } 안에 함수명을 넣으면 된다. 줄바꿈만 사용 text={'이용약관, 개인정보 수집 및 \n이용 동의(필수)'} ={""}형태면 된다. \n은 줄 바꿈이다.

[iOS] 앱 출시 전 TestFlight에 배포하기 [내부링크]

React Native로 개발을 진행했어도 iOS는 특별한 조치 없이 Xcode에서 진행하면 됩니다. TestFlight란? TestFlight는 현재 Apple Inc가 소유하고 있으며 iOS 개발자 프로그램 내에서 개발자에게만 제공되는 모바일 애플리케이션의 무선 설치 및 테스트를 위한 온라인 서비스입니다. Xcode에서는 Version, Build를 정해주고, Xcode 창 상단 Build:Any iOS Device, 그 후 메뉴바에서 Product/ Archive를 누르면 아카이브가 진행됩니다. 완료 후 대부분 선택 사항을 default로 진행하고 Testflight/Appstore 항목에서 올리면 됩니다. https://appstoreconnect.apple.com/ App Store Connect appstoreconnect.apple.com 그다음 위 사이트인 app store connect로 이동합니다. 앱 -> 본인이 방금 올린 앱 -> TestFlight에서 내부 테

[RN] React Query에 대한 이해 [내부링크]

import React, { useState } from "react"; import { FlatList, StatusBar, StyleSheet, Text, TouchableOpacity, } from "react-native"; const DATA = [ { id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba", title: "First Item", }, { id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63", title: "Second Item", }, { id: "58694a0f-3da1-471f-bd96-145571e29d72", title: "Third Item", }, ]; const Item = ({ item, onPress, backgroundColor, textColor }) => ( <TouchableOpacity onPress={onPress} style={[styles.item, backgroundColor]}>

[React] Props를 활용해 버튼 재사용, function 사용 및 types 지정하기 [내부링크]

같은 버튼을 사용 시, 스타일은 같고 버튼 텍스트만 다르게 하고 싶으면 이때 props의 개념을 사용하면 된다. Boolean 형식도 넘겨진다. function Btn({ text, big }) { /*원래 props에서 하나의 인자만 받는다. Btn(props) 이렇게. 다만 Object형식으로 받기에 {text}형식으로 꺼내준다. 그러면 {text, big} 등 여러 인자를 받을 수 있다. */ return ( <button style={{ backgroundColor: "tomato", color: "white", padding: "10px 20px", //style안에서 다중값을 사용하려면 이렇게 border: 0, borderRadius: 10, fontSize: big ? 20 : 16, }} > {text} </button> ); } function App() { return ( <div> <Btn text="Save Changes" big={true} /> <Btn t

[React] React.Memo를 사용해서 어플 최적화하는 방법 [내부링크]

import React from "react"; function Btn({ text, IfYouPressBtn }) { return ( <button style={{ backgroundColor: "tomato", color: "white", padding: "10px 20px", border: 0, borderRadius: 10, }} onClick={IfYouPressBtn} > {text} </button> ); } const MemorizedBtn = React.memo(Btn); //여기 function App() { const [value, setValue] = React.useState("Save Changes"); const changeValue = () => setValue("Revert Changes"); return ( <div> <MemorizedBtn text={value} IfYouPressBtn={changeValue} /> {/* usestate에서 st

[RN] react-native-vector-icons 세팅하기 [내부링크]

https://github.com/oblador/react-native-vector-icons#iconbutton-component GitHub - oblador/react-native-vector-icons: Customizable Icons for React Native with support for image source and full styling. Customizable Icons for React Native with support for image source and full styling. - GitHub - oblador/react-native-vector-icons: Customizable Icons for React Native with support for image source a... github.com icon을 사용하기 위해서 이 라이브러리를 사용한다. yarn add react-native-vector-icons @types/react-native-v

[RN][Warning] RCTBridge required dispatch_sync to load REAModule. This may lead to deadlocks [내부링크]

원래 문제없던 iOS 앱 빌드가 MacOS를 Ventura13.0 업그레이드 -> Xcode 업그레이드 이후 첫 앱 빌드 시 에러가 났다: RCTBridge required dispatch_sync to load REAModule. This may lead to deadlocks. 많은 해결안에서 AppDelegate.m을 수정하라고 하는데... 알다시피 RN 0.69.x 버전 이후로 AppDelegate.m이 아닌 AppDelegate.mm이 생성된다. 따라서 기존 해결안 적용 불가능. 여기서는 4가지 해결 방법이 있다. Simply ignore the warning It only appears in debug mode, so you won't see this in production build of your app Add the following code In index.js of your app: (필자는 이 방법으로 해결.) import { LogBox } from 'reac

[Xcode][Error] Failed to register bundle identifier 해결 [내부링크]

xcode error 이 에러는 react native 프로젝트를 처음 생성하고 xcode로 빌드 할 때 발생한다. 내용은 Failed to register bundle identifier, No profiles for 'org.reactjs.native.example.AppName' were found. 원인은 설정한 이름이 이미 존재해서 에러가 난 것이다. 아래 사진처럼 다른 이름으로 설정하면 된다.

[Android] Galaxy S10 시리즈 루팅 [내부링크]

오늘은 간단하게 폰의 최상위 권한을 얻을 수 있는 -- 루팅을 진행해 보겠다. 메모를 영어로 적어놨기에 그대로 가져온다. 기본 매뉴얼은 아래 영상을 참고하면 잘 진행된다. https://www.youtube.com/watch?v=TSfQmC4OTZo&ab_channel=ExplainingAndroid 1. developer menu->OEM unlocking 2. download mode: (volumn down+bixby) press , and usb connect 3. long press volumn up button, to insert unlock bootloader mode, press volumn to make sure unlock the bootloader(this will delete all personal data from your phone) 3.5 after that I did not touch anything on phone. 4. ‘OEM unlocking’ b

[RN] debugging tool 소개 (react-native-debugger 소개 업데이트) [내부링크]

오늘은 react-devtools, react-native-debugger 및 react-native-debugger-open까지 다뤄볼 예정이다. react-devtools https://reactnative.dev/docs/debugging#accessing-the-in-app-developer-menu Debugging · React Native Accessing the In-App Developer Menu reactnative.dev yarn global add react-devtools scripts에 추가해 주면 편리하다. 화면 아이폰을 흔들어서 개발자 메뉴 호출 시 연결된다. react-native-debugger (react devtools+console+redux devtools) https://github.com/jhen0409/react-native-debugger#installation GitHub - jhen0409/react-native-debugger:

[RN] react-native-launch-screen 세팅 (iOS) [내부링크]

스플래시 스크린은 각 마켓마다 정의하는 이름이 다르다: Android: SplashScreen iOS: LaunchScreen 본 과정도 android 편과 마찬가지로 필자가 수많은 착오를 겪은 뒤에 작성한 것이니, 부족한 부분 발견 시 댓글에 남겨주시면 감사하겠습니다. android의 splash screen은 다른 포스트에서 진행을 했으니 여기서는 진행하지 않겠다. 앱은 처음에 안드로이드와 마찬가지로 npx create-react-native-app SplashApp 으로 빌드 했다. (이하 crna 빌드) 라이브러리는 마찬가지로 react-native-splash-screen 으로 했다. https://www.npmjs.com/package/react-native-splash-screen react-native-splash-screen A splash screen for react-native, hide when application loaded ,it works on iOS

[RN][Error] cli.init is not a function (해결 업데이트) [내부링크]

npx react-native init myApp - -version 0.69.4 진행 시 발생한 문제지만 버전 지정하지 않고 최신으로 진행해도 문제가 발생한다.(최신 0.70.1) 그것은 예전에도 다뤘던 init 시 TypeError: cli.init is not a function 에러. 전에는 0.69 버전이 문제였다고 생각했는데 아니었다. 진심으로 해결하고자 찾다 보니 다른 문제점을 발견했다. 에러 내용 먼저 공식 문서에선 react-native-cli @react-native-community/cli를 전역 설치하는 것을 권장하지 않는다. 공식 문서 내용 필자는 본인이 안 했으리라 생각했지만 초반 RN 배울 때 멋모르고 따라 하다가 -g 옵션으로 설치했을 가능성이 있다고 생각했다. 전역 설치 확인 yarn global list 로 yarn 패키지 매니저로 무엇을 전역적 설치했는지 검색. 하나밖에 없었다. 그럼 초반에는 패키지 매니저를 npm으로 진행했었으니, npm으로 찾기

[서평] 희망의 끈 -히가시노 게이고 [내부링크]

가족의 조건에 꼭 아이가 있어야만 하는 것일까? 새 생명이 찾아온다는 것은 참으로 귀하고 기쁜 일이다. 원하는 이에게, 원하는 때에 찾아온다면 그것만큼 큰 복은 없겠지만 뜻대로 되지 않는 것이 사람 사는 세상이다. 원치 않는 시기에 원치 않는 임신. 피치 못할 사정이 겹쳐서 떠난 아이들과 태어난 아이들의 얄궂은 운명의 톱니바퀴. 본 소설 '희망의 끈'이다. 만날 수는 없다 해도, 자신에게 소중한 사람과 보이지 않는 끈으로 이어져 있다고 생각하면 그것만으로도 충분히 행복하다고 했어. 그리고 그 끈이 아무리 길어도 희망을 품을 수 있으니 죽을 때까지 그 끈을 놓지 않겠다고 하더구나. 진정한 가족의 의미를 다시 한번 돌이켜볼 수 있는 좋은 책이다. 누구에게나 '희망의 끈'은 존재한다. 삶이 원만하게 흘러가지 않는다고 해서 좌절하기 전에 우리는 다시 한번 생각해 볼 필요가 있다. 그저 알지 못하는 곳에서 자신을 지켜보고 기도를 해주는 존재가 있을 수도 있다는 것을. 희망의 끈 저자 히가시노

[서평] 악의 -히가시노 게이고 [내부링크]

이 소설 '악의'는, 노노구치의 수기와 가가 형사의 기록을 번갈아 보여주는 형식으로 전개된다. 작가 히가시노 게이고는 전혀 다른 개성을 가진 두 종류의 글을 만들어낸 셈이다. 글에는 그 글을 쓴 이의 성품이 담기게 된다. 일부러 감추려 해도 우리가 써내는 글에 결국 드러나고 마는 인간적 품성이나 모종의 편견... 글을 쓴다는 것이 새삼 두려워지는 대목이다. 한편으로 우리가 일상적으로 접하는 수많은 글들, 그 속에 담긴 자잘한 오류나 편견이 우리의 의식에 아주 깊숙이 뿌리를 내린다는 것 또한 등이 오싹해지는 깨달음이었다. 글 쓰는 일을 업으로 하는 작가들의 세계에 대한 언급도 흥미 깊은 부분이다. 작가로서 등단하기까지의 어려움, 더 많은 사람들에게 알려지고 싶다는 직업적인 욕구, 어렵게 써낸 소설이 독자에게 외면받고 그대로 묻혀버리는 데 대한 비해도 이 소설 곳곳에서 베어난다. 더구나 노력이 아니라 '운'에 의해 좌지우지되는 것이 아닌가 하는 의심, 성공을 거둔 유명 작가에 대한 질투

[서평] 스물아홉 생일, 1년 후 죽기로 결심했다. -하야마 아마리 [내부링크]

제1회 일본감동대상 대상 수상작, '스물아홉 생일, 1년 후 죽기로 결심했다.'. 정말 오랜만에 좋은 책을 읽은 것 같다. 본 책은 작가의 인생 실화를 바탕으로 작성되었다. 파견사원으로 일하던 아마리는 혼자만의 우울한 스물아홉 생일을 맞는다. 변변한 직장도 없고, 애인에게는 버림받았으며, 못생긴 데다 73킬로그램이 넘는 외톨이... 깜깜한 터널과도 같은 인생에 절망하던 그녀는 자살을 결심하던 순간, 텔레비전 화면에 펼쳐진 '너무도 아름다운 세계'에 전율을 느낀다 -그곳은 라스베이거스. 작가 아마리가 실제로 묵었던 베네시안 호텔 난생처음 '뭔가를 해보고 싶다'라는 간절함과, 가슴 떨리는 설렘을 느낀 그녀는 스스로 1년의 시한부 인생을 선고한다. '스물아홉의 마지막 날, 라스베이거스에서 최고로 멋진 순간을 맛본 뒤에 죽는 거야. 내게 주어진 날들은 앞으로 1년이야.' 그날부터 인생의 카운트다운이 시작된다. 카지노에서 목숨을 건 도박을 해보고 싶었던 그녀는 수중에 큰돈이 필요했다. 당시

[서평] 인간실격 -다자이 오사무 [내부링크]

사람들은 대부분 일상에서 가면 놀이를 하고 있다. 놀이라면 즐거워야 하는데 가면 놀이는 마냥 즐거운 놀이는 아니다. 일상생활을 하다 보면 다양한 사람과 만나고 다양한 상황을 겪게 된다. 그때마다 사람들은 자신이 언제나 오롯이 본모습만을 보인다고 하지만 사실 자신의 다양한 가면의 모습을 보인다. 가면을 쓰는 이유는 보통 사람처럼 보이기 위해서, 좋은 사람인 것처럼 보이고 싶어서 등등 때문이다. 사람들은 본인도 가면 놀이를 하면서 다른 상대의 가면이 조금이라도 벗겨진다면 바로 손가락질을 하며 욕한다. 그래서 대개 사람들은 가면을 들키지 않기 위해 노력하기도 하고 가면의 모습을 자신의 모습이라고 굳게 믿고 착각한다. 인간실격의 요조는 가면 생활을 잘하면서도 부끄러움을 느끼는 인간이다. 잘하면서 부끄러워한다는 것이 참 아이러니하지만 요조는 몇 번이고 가면을 집어던지고 싶어 하지만 던지지 못한다. 요조도 우리와 마찬가지로 사회를 살아가는 구성원이고 가면을 집어던지기에는 사람을 너무 사랑하기

[서평] 용의자 X의 헌신 -히가시노 게이고 [내부링크]

히가시노 게이고라는 작가를 처음 접했을 때는 아마 '나미야 잡화점의 기적'을 읽었을 때였다. 책 내용에 너무 감동받은 나머지 국내에서 상영한 영화도 보러 갔었는데... 세월이 흘러 비록 내용은 잘 기억나지 않지만, 히가시노 작가에 대한 좋은 인상만은 어렴풋이 가지고 있었다. 이 독서평을 적는 시점에선 필자는 이미 히가시노의 소설을 7권 읽었다. 만약 누군가가 '그래서 히가시노 작가의 소설 중에 제일 추천하는 책은?'라고 묻는다면, 한치의 고민도 없이 '용의자 X의 헌신'을 추천할 것이다. 세상에 아름다운 사랑은 있어도 아름다운 살인은 없다. 어떤 이유를 들어도 살인은 정당화 될 수 없다. 세상에 수 많은 범죄가 있고 그 이유는 참으로 다양하지만 특별한 경우를 제외하고 대부분 무언가를 잃지 않기 위해서이다. 물론 100%는 아니다. 그렇지만 대부분 무언가를 얻기 위해서 보단 잃지 않기 위해서 또는 들켜서는 안되기 위해 사람들은 거짓말을 하고 범죄를 저지른다. 이 책을 이해하기 위해서는

[일본 여행] 구마모토 여행, 구마몬과 함께! [내부링크]

오래간만에 예전 여행을 꺼내어 정리해 보려고 합니다. 목적지는 바로 일본 규슈에 있는 구마모토입니다! 후쿠오카가 인기 여행지인 만큼, '난 일본에서만큼은 한국인 안 보고 싶다!', '일본다운 일본을 느끼고 싶다!' 하시는 분들은 구마모토를 추천드립니다. 후쿠오카에서 신칸센으로 눈 깜짝할 사이면 구마모토에 갈 수 있으며, 'JR 북 규슈 패스'로 알차게 당일치기도 다녀올 수 있습니다. 구마모토역 구마모토역에 도착하자마자 눈앞에 보이는 마스코트 '구마몬'! 여기는 뭐니 뭐니 해도 구마모토 성이 제일 유명하죠. 구마모토 성 바로 앞에 인기 관광지 '조사이엔'이 있습니다. 다양한 먹을거리, 디저트, 공연과 함께 약 1시간 정도 가게와 즐길 거리 등이 준비되어 있습니다. 필자는 오래 머물지 않고 바로 목적지로 출발! 그 이후 도보로 10분이면 성에 도착합니다. 성의 외부 사진. 날씨가 좋기에 기분도 덩달아 좋아집니다. 여기서 일본성에 관한 재밌는 상식을 말하자면, 성 지붕 위나 성 주변에 사

[일본 여행] 힐링 되는 공간, 교토 아라시야마. [내부링크]

오늘은 교토의 아라시야마라는 명소로 포스팅을 해보겠습니다. 교토의 서북쪽에 위치한 아라시야마 아라시야마(岚山)의 뜻은 폭풍+산이며, 기세 차고 웅장하며 장엄한 산악미를 자랑합니다. 산 좋고 물 맑고 경치가 아름다운, 교토에서 손꼽히는 명승지 중 하나입니다. 옛 교토가 일본의 수도였을 적에 천황이 이곳에 나들이를 종종 왔다고 합니다. 도게츠교 도게츠교(渡月桥). 한밤중 강물에 반사된 달빛이 마치 다리를 건너는 것처럼 아름답다 하며 붙여진 이름입니다. 대나무숲. 샐 수 없이 많은 대나무가 양옆으로 하늘을 찌르듯이 솟아있으며, 바람이 지나갈 때 들리는 샤샤샥하는 소리는 마치 천년 전의 일본으로 돌아간 듯한 느낌이 들게 합니다. 또한 일본 명승지에는 인력거가 빠질 수 없죠. 비용이 좀 비싸긴 하다만 한 번쯤은 옛 일본 귀족 느낌을 내보는 것도 잊지 못할 추억이 될 것입니다. 도게츠교 아래로 흐르는 카츠라강에서 작은 배도 탈 수 있으며, 주위에 기념품샵 및 카페도 많이 있어서 관광으로 최적화

[일본 여행] 교토 후시미이나리 신사 & 오사카 우메다 공중정원 투어! [내부링크]

후시미이나리 신사는 교토 명소 중 하나로 천 개가 넘는 '토리이' 가 있다고 하여 '천본 토리이'로 유명한 장소입니다. JR 교토역과 가까운 후시미이나리 신사 신사 입구 이른 아침이었는데도 불구하고 신사는 외국인 관광객들로 붐볐습니다. (지하철 내릴 때부터 줄 서서 나갔던 기억이) 신사 안내도 참고로 '후시미'는 교토의 지역 이름이고, '이나리 신사'는 자연과 농업 풍요의 신이 모셔진 곳입니다. 센본(千本)토리이 '토리이'는 한자로 鸟居이며, 새가 앉아서 쉬는 곳이라는 의미입니다. 또한 토리이의 円 모양의 문은 현세와 신의 구역을 나누는 결계라고 옛사람들은 믿었으며, 일본인들은 이 토리이를 통과하기 전에 고개를 숙여 인사하는 것으로 신에 대한 경의를 표합니다. (그렇다고 센본토리이에서 계속 인사하며 나아가지는 않습니다,,) 일본 문화를 사랑하는 많은 서양 여행객들과 동양인들이 여기서 사진을 찍고 있었습니다. 사진기와 얼굴만 준비되어 있으면 인생 샷은 쉽게 건질 수 있겠네요.ㅎㅎ 여기

[서평] 가면 산장 살인사건 -히가시노 게이고 [내부링크]

책을 구매하기 전에 항상 타인의 리뷰는 보는 습관이 있다. 필자보다 먼저 이 작품을 읽은 사람들은 모두 입을 모아 결말이 정말 대단하다고 하여 홀린 듯이 구매했었던 기억이 난다. 그리고 그 기대는 정확하게 맞아떨어졌다. 이 작품은 결말에 '대반전'이 마련되어 있다. 대담한 단발의 트릭이 실로 멋지게 꼴을 갖추고 있다는 의미에서 대중들의 평가 문구에 거짓은 없었다. 그 책을 끝까지 읽기까지 트릭을 간파할 수 없었다. 이 사람인가? 아니 이 사람인가? 마지막에 가서 생각지도 못한 작가의 덫에 걸려들었다는 나 자신을 발견하고 발을 동동 구르며 분해했다. 작 중 등장인물이 꽤 많았다. 따라서 메모를 하기 않고서는 누가 어떤 말을 했는지 정리가 안되기에 종이와 팬을 따로 준비했다. 약혼자의 죽음에 의문점을 발견하고, 별장에서 다 같이 토론하는 도중 들이닥친 두 강도. 모두 인질로 잡힌 와중, 끝내 별장 안에서는 수수께끼의 살인 사건이 발생하는데... 스토리를 과하게 소개하는 것은 추리 소설에

[서평] 녹나무의 파수꾼 -히가시노 게이고 [내부링크]

제목에서도 알 수 있듯이 이 이야기의 주요 소재로 등장하는 것은 '녹나무'다. 교토 대학의 녹나무 녹나무(樟木)는 따뜻하고 습기 많은 토양에서 자라는 상록활엽수로, 일본에서 가장 큰 나무로 알려져 있다. 실제로 가고시마의 가모신사 녹나무는 수령 1천5백 년으로 추정되고 나무 기둥 안에 넓이 약 13제곱미터의 빈 공간이 있다고 한다. 가고시마 가모신사 녹나무 독특한 향의 정유 성분이 있어서 방충제, 심장 약, 향료 등의 원료로 쓰인다. 또한 목질도 치밀해서 목조 불상, 악기, 고급 가구의 재료가 되기도 한다. 인간의 유한한 삶을 훌쩍 뛰어넘는 자연물에는 신이 깃든다고 일본 사람들은 옛날부터 믿어왔다. '녹나무의 파수꾼' 은 수령을 짐작하기 어려운 녹나무를 중심으로 이야기가 펼쳐진다. 인간의 깊은 염원이 그곳에 신을 불러들인 것일까. 한 세대가 그다음 세대에게 간절히 전해주고 싶은 것, 영구히 끊이지 않고 이어가는 것이 발하는 힘이 이야기 전체에 흐르고 있다. 히가시노 작가는 인간의 본

[독후감] 최소한의 IT 언어 [내부링크]

앞으로의 10년은 지난 10년과 다른 지식이 요구될 것이므로 우리는 항상 공부를 해야 합니다. 특히 IT 분야는 새로운 프로그래밍 언어, 프레임워크 혹은 툴 등이 매년 새로운 기술 스택으로 등장하고 있습니다. 오늘은 윌북 출판사로부터 협찬받은 도서 - '최소한의 IT 언어'의 독후감을 작성해 보겠습니다. 2020부터 지금까지 우리는 힘든 시기를 겪었습니다. 많은 회사가 업무 방식을 재택근무로 전환했으며, 학생들은 비대면 수업, 심지어 헬스장, 노래방 등 시설 이용에 많은 제약이 있었습니다. 이때 우리는 IT의 중요성을 다시 한번 깨달았습니다. 이제 IT는 우리가 꼭 누군가를 만나지 않고도 사업을 운영 가능하게 하고, 서로 소통하고, 하루를 계획하고, 인터넷 수업을 듣고, 음식을 주문하고, 결혼식을 준비하고, 세금을 신고하고, 옷을 구입하는 등 삶의 모든 영역에서 혁명적인 변화를 일으키고 있습니다. 이 책은 애플리케이션을 개발하는 방법(코딩)을 알려주는 것이 아닌 애플리케이션의 기본적

[일본 여행] 간사이 공항부터 교토까지, 그리고 기요미즈데라 [내부링크]

드디어 본격적으로 하늘길이 열리면서 들뜬 마음으로 일본으로 출발했습니다. 출발 전 많은 블로그를 보면서 예습을 했지만… 현실과는 다른 부분이 많아서 오늘은 필자가 직접 겪으면서 있었던 해프닝, 아울러 꿀팁까지 정리해 보겠습니다. 간사이 공항 도착 사전에 mySOS 등록은 필수라고 봅니다. 출국 전에 공항에서 확인도 하며, 간사이에 도착해서도 안내하는 직원분이 mysos를 제시하라고 안내합니다. 날씨도 참 좋았고… 오사카 도착할 때 체감 온도는 딱 3주 전의 서울이었습니다. 즉 서울보다는 조금 더워서, 이때는 어쩌면 반팔도 가능하겠다는 생각도 들더라고요. 티켓 예약을 안 했으면 입국하고 2층에 있는 티켓 구매처로 와야 합니다. 교토까지 가려면 하루카 열차 티켓을 사야 합니다. 그리고 간사이에서 사용하는 교통카드인 ICOCA도 같이 사면 좋겠죠. 고민하지 마시고 딱 바로 앞에 보이는 JR Ticket Office에서 세트로 구매하시면 됩니다. 하루카 티켓+ ICOCA 세트로 간편하게 구

[Node] 서버에서 정규 표현식, 터미널 커맨드 사용하는 법 [내부링크]

오늘은 nodejs 서버에서 데이터 처리 시 용이한 정규 표현식, 터미널 커맨드 사용하는 법을 알아보겠다. 정규 표현식 사용 new RegExp( ) const FileList = (props) => { const data = SeeFiles(props?.id)?.data?.seeFiles; console.log("data : ", data); let zipRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA-Z0-9가-힣/\s_()-.]+\.zip`, "g" ); //pdf file detect let pdfRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA-Z0-9가-힣/\s_()-.]+\.pdf`, "g" ); //apk file detect let apkRegex = new RegExp( `${process.env.REACT_APP_SERVER_URL}[a-zA

[RN] react-native-splash-screen 세팅 (android) [내부링크]

본 포스트는 필자가 직접 시도하고 작성한 내용이니 아직 부족한 점이 있을 수 있다. 향후에 보완점을 발견하면 업데이트하는 방식으로 진행하겠다. https://www.npmjs.com/package/react-native-splash-screen react-native-splash-screen A splash screen for react-native, hide when application loaded ,it works on iOS and Android.. Latest version: 3.3.0, last published: 10 months ago. Start using react-native-splash-screen in your project by running `npm i react-native-splash-screen`. There are 62 other projects in the npm registry us... www.npmjs.com 필자는 프로젝트 빌드를 creat

[JS] ES6 문법 & 지식 포인트 메모 [내부링크]

ES6에서는 대격변이 있었다. 7,8,9는 단순 기능 추가. 1. let, const used "var" before, var (variable) 변하기 쉬운 문제점 var name = 'Tony' name = 'Smith', 앱이 커질 때 변수 재할당을 해서 실수하기가 쉽다. const (constant) 상수, 불변의, 고정의 const person = { name: "Tony" } person.name="Pedro" //const는 이런 경우에만 변경. let 은 var과 비슷. //평소에는 const 사용 권장, let은 variable 값을 overwrite 해야 하는 상황이 일어나면 사용. var은 사용 권장 안 함. 2. arrow functions 기존: function nameOf(arg){ } nameOf: function 이름 arg: argument, 독립 변수, 함수 혹은 메서드를 호출할 때, 전달 혹은 입력되는 실제 값, parameter과 많이 혼용됨. {

[Android] 안드로이드 기기 deviceUniqueId와 공장초기화의 관계(react-native-device-info) [내부링크]

회사 프로젝트 중 안드로이드 기기 -> 회사 서버로 촬영한 영상 전송을 진행하던 중. 어느 디바이스에서 들어오는지를 확인하기 위해 deviceUniqueId를 따로 추출해서 formData에 넣어서 보내고 있었다. 하지만 deviceUniqueId는 기기마다 고유 불변의 값이라 생각했는데 아니었다. 모두가 간과한 사실이 있었다. 먼저 react-native-device-info 라이브러리를 사용한다. import DeviceInfo from "react-native-device-info"; const deviceUniqueId = DeviceInfo.getUniqueIdSync(); 일단 이렇게 간단하게 가져올 수 있다. 이외에도 react-native-device-info 라이브러리에 대해 추가 설명을 하자면 -getUniqueId(): 기기별로 고유한 ID 값을 리턴한다. (필자가 사용 시에는 getUniqueIdSync( ) ) -getBatteryLevel(): 배터리가 얼마

[개발 지식] Redux의 필요성은? (상태 관리 도구의 필요성) [내부링크]

redux Redux(리덕스)란 JavaScript(자바스크립트) 상태 관리 라이브러리이다. Redux(리덕스)의 본질은 Node.js 모듈이다. 상태 관리 도구가 왜 필요할까, 상태란? React에서 State는 component 안에서 관리되는 것이다. 자식 컴포넌트들 간의 direct 데이터 전달은 불가능 하다. 자식 컴포넌트들 간의 데이터를 주고 받을 때는 상태를 관리하는 부모 컴포넌트를 통해서 주고 받는다. 그런데 자식이 많아진다면 상태 관리가 매우 복잡해진다. 상태를 관리하는 상위 컴포넌트에서 계속 내려 받아야한다. => Props drilling 이슈 상태 관리 툴은 어떤 문제를 해결해 주나? 1. 전역 상태 저장소 제공 2. Props drilling 이슈 해결 예를 들어, <A>라는 컴포넌트에 상태가 있고, <I>라는 컴포넌트가 해당 상태를 사용한다고 하면, 그 중간에 존재하는 <C>, <G> 등은 굳이 name이라는 상태가 필요하지 않음에도, 컴포넌트에 props를

[Redux] Redux(리덕스)란? (상태 관리 라이브러리) [내부링크]

Redux의 기본 개념 : 세 가지 원칙 1. Single source of truth 동일한 데이터는 항상 같은 곳에서 가지고 온다. 즉, 스토어라는 하나뿐인 데이터 공간이 있다는 의미이다. 2. State is read-only 리액트에서는 setState 메서드를 활용해야만 상태 변경이 가능하다. 리덕스에서도 액션이라는 객체를 통해서만 상태를 변경할 수 있다. 3. Changes are made with pure functions 변경은 순수함수로만 가능하다. 리듀서와 연관되는 개념이다. Store(스토어) – Action(액션) – Reducer(리듀서) Store, Action, Reducer의 의미와 특징 1. Store (스토어) Store(스토어)는 상태가 관리되는 오직 하나의 공간이다. 컴포넌트와는 별개로 스토어라는 공간이 있어서 그 스토어 안에 앱에서 필요한 상태를 담는다. 컴포넌트에서 상태 정보가 필요할 때 스토어에 접근한다. 2. Action (액션) Actio

[Redux] Vanilla JavaScript에 Redux 적용하기(store, reducer) #0 [내부링크]

npx create-react-app , 먼저 순수 자바스크립트로 숫자 카운터 기능을 구현해 본다. //index.html <!DOCTYPE html> <html lang="en"> <head> ... </head> <body> <button id="add">Add</button> <span>0</span> <button id="minus">Minus</button> </body> </html> //index.js const add = document.getElementById("add"); const minus = document.getElementById("minus"); const number = document.querySelector("span"); let count = 0; number.innerText = count; const updateText = () => { number.innerText = count; }; const handleAdd = () => { coun

[Redux] Vanilla JavaScript에 Redux 적용하기(action) #1 [내부링크]

const reducer = (state = 0, action) => { //state = 0은 default값 console.log(state, action); return state; }; const store = createStore(reducer); action은 reducer의 두번째 인자로 받아지며 state를 modify할 수 있다. action is a way that communicate with reducer. 그럼 어떻게 action을 사용할 수 있나. const reducer = (state = 0, action) => { console.log(state, action); return state; }; const store = createStore(reducer); store.dispatch("HELLO"); //dispatch()를 사용. Actions must be plain objects 라고 한다. const reducer = (state = 0, act

[Redux] Vanilla JavaScript에 Redux 적용하기(subscribe) #2 [내부링크]

import { legacy_createStore as createStore } from "redux"; //state가 없으면 default로 0으로 호출한다. const reducer = (state = 0, action) => { console.log(state, action); if (action.type === "ADD") { return state + 1; } else if (action.type === "MINUS") { return state - 1; } else { return state; } }; const store = createStore(reducer); add.addEventListener("click", () => { store.dispatch({ type: "ADD" }); }); minus.addEventListener("click", () => { store.dispatch({ type: "MINUS" }); }); 여기까지 진도를 나왔었고, 아랫부분

[Redux] Vanilla JavaScript에 Redux 적용하기 (Recap)#3 [내부링크]

앞서 #2에서 작성한 기존 코드를 improve 해보겠다. switch, case, default const reducer = (state = 0, action) => { if (action.type === "ADD") { return state + 1; } else if (action.type === "MINUS") { return state - 1; } else { return state; } }; if, else if, else ====> switch, case, default const reducer = (state = 0, action) => { switch (action.type) { case "ADD": return state + 1; case "MINUS": return state - 1; default: return state; } }; redux 공식 문서에서도 switch, case, default 문법 사용을 권장하고 있다. 두 번째, 기존에서는 dispatc

[Redux] Vanilla JS Todolist에 Redux 적용하기 #0 [내부링크]

//index.html ... <body> <h1>To Dos</h1> <form> <input type="text" placeholder="Write to do" /> <button>Add</button> </form> <ul></ul> </body> //index.js const form = document.querySelector("form"); const input = document.querySelector("input"); const ul = document.querySelector("ul"); const createToDo = (toDo) => { const li = document.createElement("li"); li.innerText = toDo; ul.appendChild(li); }; const onSubmit = (e) => { e.preventDefault(); const toDo = input.value; input.value = ""; createTo

[RN] React Native 앱 버전 관리하기 (iOS & Android)(업데이트) [내부링크]

우선 앱의 버전은 회사마다 조금씩 다르겠지만 "a.b.c"로 구분한다. a: 큰 버전업 배포 시 (앱의 navigation 구조를 갈아엎는 등) b: 새로운 기능 배포 시 (component 추가 등) c: QA 등 자잘한 테스트 버전 업 배포 시 (하드 코딩 내용 수정 등) 위 기준은 회사마다 차이가 조금씩 존재한다. 처음에는 react-native-version이라는 npm 라이브러리를 사용했는데 잘 적용되지 않았다. 따라서 오늘은 수동으로 버전 수정하는 방법을 정리해 본다. android , ios 따로 진행해야 한다. Android 안드로이드 document에서 찾은 내용입니다. 우선 android/app/build.gradle 파일을 수정해야 합니다. android { defaultConfig { versionCode 2 versionName "1.0.1" } } 위의 코드는 버전을 1.0.1로 올리는 코드입니다. 여기서 주목해야 할 점은 versionCode, versio

[중국 시사] 사회적 매장된 유명 배우 3인 (EXO-M 멤버 크리스 등) [내부링크]

안녕하세요. 토니입니다. 최근 들어 이슈가 되는 중국인 배우 3인 및 그들의 매장 사유를 알아보도록 하겠습니다. 1. 우이판 ( 吴亦凡 Kris) 중국판 '네이버'인 바이두에선 이름 우측에 "캐나다 국적 연예인, 강간 혐의"라고 박제를 해놓았습니다. 중국 포털사이트 바이두(baidu)에서의 검색 화면 크리스(이하 Kris)는 2012년 2월 16일 그룹 'EXO'로 정식 데뷔하였고, 이후 'EXO-M'의 멤버로서 활동했습니다. 인지도를 쌓은 후 그는 중국 본토에서 활발하게 활동했으며, '실력은 없더라도 재치 있고 멋있는' 아티스트로 많은 중국 청년들에게 호평을 받았는데요, 유행어 'skr, skr'의 탄생 또한 '랩 오브 차이나'에서 의미를 알 수 없는 'skr, skr'를 유행어로 밀면서 수억 명 중국 청년들의 '힙합 리더, 패션 리더'로 자리 잡았고, 실시간 검색어 1위에 몇 번이나 등극했습니다. 사건의 발단 2021년 7월 17~18일, Du Meizhu라는 한 여성이 웨이보(

[중국 시사] 중국에서 역대급 반전을 이뤄낸 일본 게임 [내부링크]

안녕하세요. 토니입니다. 한국인 못지않게 반일 감정이 심한 중국인들은 일본 문화, 특히 일본 게임을 어떻게 받아들이고 있는지 궁금하실 텐데요, 그럼 과거의 중국으로 가보겠습니다. 2000년대 초반, 한국과 비슷한 상황으로 그 당시 청소년들에게 유일한 매체는 'TV'였습니다. 중국 시트콤<Home With Kids>등 작품이 대박 인기를 끌었지만, 반면 애니메이션은 비교적 낮은 퀄리티를 보여줬습니다. <Home With Kids>, 중국식 유머와 출중한 연기력으로 시트콤 장르가 유행을 시작함 중국 애니메이션 <Pleasant Goat and Big Big Wolf>, 스토리는 출중했지만 작중 캐릭터들의 부자연스러운 움직임 등 평가가 아쉬움 이런 와중에 혜성 같은 작품이 홍콩을 통해 중국 대륙으로 유통됩니다. 그것은 바로 <나루토>. <호카게 닌자>라는 번역명으로 중국 시장에 진입 자국 애니메이션 퀄리티에 아쉬워하던 중국인들은 <나루토>를 처음 접하고 충격을 받았으며, 순식간에 대중적인

[일본 가수] 요네즈 켄시- 세계를 포옹한 자폐증 소년의 이야기 [내부링크]

안녕하세요. 토니입니다. 코로나가 심해진 요즘 집에 있는 시간이 길어지니 문득 '자폐'란 단어가 떠오르는데요, 그래서 이번엔 일본 유명 가수- 요네즈 켄시에 대하여 소개해 드리겠습니다. 요네즈 켄시 (米津 玄師/よねづ けんし) '외로움'이라는 단어로 요네즈 켄시의 어린 시절을 요약할 수 있습니다. 1991년 3월 10일 일본 도쿠시마 시의 한 가난한 가정에서 태어난 그는 어릴 적부터 타인과 의사소통하는 데 어려움을 겪었고 종종 학교에서 지적받았습니다. 이름 때문에 놀림을 당했다고도 하네요. 가족과의 관계도 좋지 않았습니다. 아버지와 한 번 소통하는데 약 1시간이 필요했고, 어머니와 여동생과의 사이도 좋지 않았습니다. 켄시는 어렸을 때부터 자신이 보통 사람이 아니라고 생각했습니다. 나이가 들수록 점점 외로워지고, 공부에 흥미도 잃으며, 친구도 없는 그는 학교에 가기 싫다는 생각까지 들게 됩니다. 그는 열두 살 때 '고기능 자폐 장애'를 진단받았습니다. 고기능 자폐 장애 (高機能自閉症,

[세계 시사] 21세기 마리오네트 WHO [내부링크]

아프리카에서 발견된 코로나19 새 변이 바이러스 '오미크론'이 우려 변이로 분류됐습니다. 오미크론 변이는 지난달 남아프리카 보츠와나에서 처음 발견된 뒤 남아프리카 공화국에서 빠르게 확산됐는데요, 유럽 각국은 발원지로 지목된 남아프리카로 통하는 문을 걸어 잠그고 있습니다. 남아프리카 보츠나와 위치 과학자들은 '오미크론'이 우리가 가장 우려하고 있는 높은 전염성과 백신 면역반응 회피, 이 두 가지를 모두 갖고 있는 것으로 분석했습니다. WHO는 최근 몇 주간 이 변이의 감염자 수가 급격히 늘고 있다며, 오미크론 변이가 재감염의 위험이 크다고 지적했습니다. 자 그럼 도대체 왜 이번 변이 바이러스 이름을 '오미크론'으로 지정했을까요. Ο, ο(그리스어: 오미크론)은 15번째 그리스 문자이다. 그리스 숫자로는 70을 뜻한다. -위키백과 그리스 문자 이번 변이 바이러스는 13번째 바이러스입니다. 즉, 이름이 위 그리스 문자 순서 상 'Nu(뉴)'로 와야 맞는데요, WHO는 '뉴'라는 발음이 '

[세계 시사] 블랙 프라이데이는 상술이다 [내부링크]

블랙 프라이데이(이하 블프)는 11월의 넷째 주 목요일인 추수감사절 다음날로, 미국에서 연중 가장 큰 규모의 쇼핑이 행해지는 날입니다. 올해 블프는 2021년 11월 26일 금요일 (Black Friday, 검은 금요일) 안 좋은 역사가 있을 듯한 어감과는 다르게 'black'이라는 표현은 이날이 연중 처음으로 회계 장부에 흑자(black ink)를 기록하는 날이라는 데에서 유래됐는데요, 소매업체의 경우, 1년 매출의 70%가 이날 이루어진다고 합니다. 넷상에서 유명한 블프 짤 국내 11번가, 지마켓, 옥션 빅 스마일 데이나 일부 대기업 공식 계정이 아니면 이미 가격 다 올려놓고 파는 거라 의미가 없다는 얘기가 있는데요, 쿠폰 적용하면 할인가가 아닌 정가가 나와서 소비자들에 대한 눈속임을 했다는 말이 있습니다. 큰 할인에 훅해서 판단력을 잃지 마시고, 꼭 과거 정가를 확인하고 구매가 필요할 것 같습니다.

[세계 시사] 알파고의 모국어 [내부링크]

'한국인으로 태어나 모국어는 물론, 영어는 필수에 중국어/일본어 등 제2외국어까지 배워야 경쟁력이 갖춰지는 2021년. 거기에 프로그래밍 언어까지 배우라고?' -라고 생각하시면 큰 오산입니다. 오늘은 4차 산업 혁명의 키워드'코딩'에 대해 알아보겠습니다. 사진만 봐도 머리가 아픈 '코딩'. 코딩이란 프로그래밍 코드를 어딘가에 적는 것을 말합니다. 즉, 알고리즘을 특정한 프로그래밍 언어를 이용해 컴퓨터 프로그램으로 구현하는 기술을 말하는데요, 프로그래밍 언어 인기 순서 (2018년 10월 기준 Python 1위, Java 2위, JavaScript 3위) 중 1위인 파이썬을 알아보겠습니다. 파이썬 Python Life is short, You need Python. 문법이 매우 쉬워서 작성하기에 간단하기 때문에 초보자들이 처음 프로그래밍을 배울 때 추천되는 언어입니다. 인스타그램, 유튜브, reddit 등이 파이썬을 주로 쓰고 있다고 알려져 있으며, 외국의 구인 사이트에도 파이썬을 할

[중국 시사] 사람이 죽었다고요 내 말 안 들려? [내부링크]

'오징어 게임' 중 명대사 중국인들만 알고 있는 먹방 사건의 진실, 단순 3연임 체제 강화 목적이 아닌 그 합리적 이유. 오늘은 중국 정부가 어떤 이유로 먹방을 규제했는지 알아보겠습니다. 2021년 3월 초, 약 1300만 구독자를 보유한 중국 먹방 전문 인터넷 방송인(이하 먹방bj) '파오파오롱'의 사망 소식이 뉴스에 보도됩니다. 스튜디오 멤버와 먹방 촬영 중인 '파오파오롱'(좌측) 인터넷 커뮤니티에선 엄청난 화제를 불러 모았고 많은 팬들이 그의 사망 소식을 안타까워했습니다. 2019년, 음식점 배달원으로 일했던 '파오파오롱'의 월수입은 고작 2000위안(한화 약 36만 원)이었습니다. 본인의 인생에 회의감을 느끼던 그는 어느 날, 친구 두 명과 만두 무한리필 집에서 약 20분 만에 식당 하루 판매량 절반 이상의 만두를 먹어치우며, 참다못한 식당 사장이 나서서 그를 내쫓으려 합니다. 이때 '파오파오롱'은 정당한 권리로 먹고 있다며 사장과 말다툼을 하게 되었고, 이 장면을 친구가 고

[일본 시사] 이 악물고 불편하게 생활하는 그들 [내부링크]

'일본의 금고는 세상에서 제일 견고하다.'라는 말이 있죠. 그만큼 일본 사람들의 현금 집착은 짱구가 와도 못 말리는데요, 오늘날까지 현찰을 고집하는 일본 사회, 그 똥고집을 알아보겠습니다. 시즌 1부터 9까지 내내 현금으로 식사를 결제한 '고로 상'. (일본 인기 드라마 '고독한 미식가') 인류는 생활 속 불편함을 인지하고 개선하면서 문명의 발전을 이뤄나갔는데요, 특히 현찰은 거스름돈을 동전으로 받은 경우 지갑이 무거워지고 빵빵해지며 일상생활 중 많은 불편함을 야기합니다. 동전의 불편함은 '캐시리스'의 원인 중 하나다 일본의 치안과 은행 인프라는 잘 구축되어 있음에도 불구하고, 2018년 조사 결과 일본 국민 중 61%는 "현금결제는 불편하지 않다"라는 의견을 보입니다. 이유는 단 하나, 현금 거래만을 고집하는 가게와 국민이 너무 많기 때문인데요, 수도 도쿄에서조차 '**페이' 같은 전자화폐는 물론 신용카드조차 받지 않는 '캐시 온리(only)' 매장이 너무 많습니다. 이쯤에서 의문

[세계 시사] 21세기 폭탄 돌리기 게임 [내부링크]

'일론 머스크의 부인 그라임스가 NFT로 된 디지털 작품으로 600만 달러를 벌었다.' 이 기사를 처음 접한 당신은 '그럴 수 있지~'라며 다음 기사로 넘어갑니다. 잠깐, 이것만 보고 가세요. 심지어 인스타그램에서 'Ctrl+Command+5'로 캡처할 수 있다. 살면서 이런 종류의 그림을 어디선가 많이 봐왔을 겁니다. 마치 흔하디흔한 3D 그래픽들을 복붙해서 만든 것처럼 보이는 이 '디지털 작품'을 누가 돈 주고 산다고? 저~멀리서 봉이 김선달이 강물 파는 소리가 들립니다. 작품 명이 뭔지, 저 아기 천사의 사명이 뭔지... 전부 알 필요 없습니다. 이것들은 단지 '설정'에 불과하죠. 우리들의 초점은 오로지'NFT 작품'에 있습니다. 앞서 NFT의 정의부터 다시 짚고 갑니다. 대체 불가능한 토큰(NFT, Non-Fungible Token)은 가상화폐의 기술인 블록체인에 저장된 데이터 단위로, 고유하면서 상호 교환할 수 없는 토큰을 뜻한다... 사본은 인정되지 않는다. 이러한 디지털

[영화] Spider-Man이 왜 3명이나 있어? [내부링크]

기다리고 기다리던 <Spider-Man: No Way Home>의 상영일이 오늘 12월 1일부로 2주 카운터 다운에 들어갔습니다. 심지어 본토 미국보다 이틀 앞서서 개봉하니 마블이 한국 시장을 얼마나 중요시하는지 알 수 있습니다. 상영일: 2021년 12월 15일 (대한민국) 2021년 12월 17일 (미국) 유출본으로 추정되는 '노 웨이 홈'중 한 컷. 사람들이 '노 웨이 홈'에 기대가 큰 이유는 무려 '3파이더맨'이 한자리에 모이기 때문입니다! 필자는 스파이더맨의 광팬으로서 소식을 접하고 흥분을 감출 수 없었는데요, 그럼 오늘은 스파이더맨이 3명인 이유와 그 배경에 대해서 알아보겠습니다. 마블의 캐릭터인 줄만 알았던 오리지널 스파이더맨 1. 영화의 도입부에는 너무나도 익숙한 이 제작사가 뜨는데요, 소니 픽처스의 자회사 '컬럼비아 픽처스'. 마블 영웅이 아니고 소니 영웅이었다? 스파이더맨의 여정은 험난하고 고달팠습니다. 만화 제작사였던 마블은 2009년 월트디즈니에 인수되기 전 심

[도서 후기] 아프리카, 미필적 고의에 의한 가난. [내부링크]

아프리카는 왜 아직도 가난한가? 이제는 너무나도 당연하게 여겨지는 그들의 가난. 그렇다. 그저 가난하니까 도와주고 배려해야 한다고만 생각한다. 돕겠다고 손 내미는 국가, 단체, 개인은 넘쳐 나는데, 이 대륙이 왜 아직까지 가난한지에 대해서는 궁금해하지 않는다. 공교롭게도 이 책을 통해 그 이유를 알 수 있었다. 전 세계 빈곤 지도. 출처 세계은행 1. Made in Africa는 어디에? 아프리카에는 세상의 모든 쓰다 버린 물건들이 수입된다. 그래서 아프리카에는 없는 물건이 없다고 한다. 그러니 굳이 만들어 쓸 이유가 없다. 시장엔 온통 수입품이고, 눈에 띄는 기업들은 대부분 외국인 소유다. 제조업 뿐만 아니라 서비스, 에너지, 금융 등 모든 분야에서 그렇다. 아프리카는 자국 기업 육성이 지속 가능한 성장에 얼마나 중요한 정책 과제인지 깨닫지 못하고 있다. 오히려 자본과 기술력을 갖춘 외국기업이 들어와 정부의 개입 없이도 국민들이 원하는 재화와 서비스를 알아서 척척 생산해 주는 걸

[중국 시사] 충격. 이제 바이러스 걸리면 돈 받는다? [내부링크]

12월 2일, 중국 하얼빈 시 질병관리본부는 시내 그 바이러스 확진자 1명, 초기 양성 2명을 발표했는데요, 이제부터 바이러스 걸리면 1만 위안(원화 180만 원)을 장려금으로 받는다고 합니다. 함께 알아보시죠. 하얼빈 도시 위치 (지도에서 지리적 위치를 파악하는 것은 이해에 큰 도움이 됩니다.) 중국 동북 도시 하얼빈은 인구 수 1000만 명의 대도시입니다. 지난 일주일 동안 중국 내몽골 확진자가 갑자기 많아지면서 내륙 인원과의 접촉을 통해 현재 하얼빈까지 감염이 됐는데요, 중국 당국은 다시 한번 비상사태에 진입하며 방역을 강화했습니다. 아파트 단지 출입 시 QR코드를 스캔해야 한다. 당국은 바이러스 의심 증상(발열, 복통, 기침 등)이 나타나면 감기약을 먹지 말고 꼭 병원에 와서 검사를 받으라고 권유를 하며 검사 후 양성 판정이 나올 시 원화 180만 원 상당의 장려금을 지급하기로 약속합니다. 해당 금액은 대다수의 중국 서민들에게는 약 3개월 치 월급이며, 결코 작은 돈은 아닙니

[세계 시사] 익명의 '전사'들과 '콜로세움' [내부링크]

최근 유튜브에서 영상 '싫어요' 수가 블라인드 처리됐습니다. 사실 올해 3월에도 유튜브가 '싫어요'를 숨기는 테스트를 한 적이 있는데요, 이번 업데이트는 실험 결과에 따라 정식으로 실행 한 것입니다. 유튜브는 그간 사용자의 혐오감을 숨겨달라는 영상 크리에이터들의 피드백이 많았습니다. '싫어요' 수가 크리에이터의 정신 건강을 해치고, '싫어요' 수를 의도적으로 늘리는 혐오 캠페인, 좌표 찍기 등 부작용이 나타나고 있다는 지적이 나왔다며 실험 이유에 대해 설명했고, 실험 결과, '싫어요' 수를 보여주지 않았을 때, '싫어요' 수를 늘리기 위한 공격 행위가 줄었다고 합니다. 이어 "이번 업데이트는 크리에이터를 괴롭힘으로부터 보호하기 위한 여러 조치 중 하나에 불과하다"라며 크리에이터를 보호하기 위한 투자를 아끼지 않겠다고 밝혔습니다. 필자는 유튜브 시청자로서 이번 결정에 큰 아쉬움을 느낍니다. 영상 하단의 '좋아요'수 와 '싫어요'수는 대다수 사람들이 영상을 어떻게 생각하는지 한 번에 알

[일본 시사] '와'의 사상과 정치를 등한시한 일본 국민들 [내부링크]

안녕하세요. 이번 포스터는 일본의 정치 현황에 대해서 다뤄보겠습니다. 최대한 객관적으로 서술하기 위해 많은 영상, 기사 내용 및 관련 도서를 참고하였습니다. 앞서 일본의 '와'의 사상을 꼭 이해하고 넘어가시길 바랍니다. https://blog.naver.com/lifeyun24/222582344176 [일본 시사] 이 악물고 불편하게 생활하는 그들 '일본의 금고는 세상에서 제일 견고하다.'라는 말이 있죠. 그만큼 일본 사람들의 현금 집착은 짱... blog.naver.com 이제부터 본론으로 들어가 보겠습니다. 상식을 초월한 발언, 혹은 기자회견에서 말장난? 전 세계 커뮤니티를 뜨겁게 달궜던 일본 환경상 '고이즈미 신지로'의 발언. 기후 변화 해결법을 묻는 기자의 질문에 'It should be fun, cool and sexy.'라고 대답한 그는 일명 '펀-쿨-섹'좌로 유명세를 떨칩니다. 필자는 이때부터 일본 정계의 수상함을 느꼈는데요, 알고 보니 그는 일본 전 총리 '고이즈미 준

[문서 후기] 39만 명 '대한민국 부자'들의 이야기 [내부링크]

학창 시절 필자의 꿈은 소확행이었다. 그저 남들이 가는 직장에 들어가서 월세 내고 생계를 유지하며, 그저 평범하게, 화려한 옷도, 비싼 차도 필요 없이, 때로는 게임으로 외로움을 달래며 살아갈 수 있을 것 같았다. 하지만 그것은 어리석었다는 생각이 어느 날 문득 다가온다. 게임을 하면 머리가 아프기 시작하고, 나이가 들수록 취미 활동에 돈이 많이 들기 시작한다. 골프, 낚시, 캠핑. 그렇다. 돈이 필요하다. 그것도 아주 많이. 길 가다 마주치는 고급 외제차를 보면 나도 언젠간 몰아보고 싶다는 생각이 들고, 한강 뷰가 훤히 보이는 집도 갖고 싶다. 사람은 왜 일찍 깨닫지 못하고 나이가 들어서 후회할까. 더 늦기 전에 오늘의 문서를 리뷰해 본다. 멀다면 멀고 가깝다면 가까운 대한민국 부자들의 이야기를 들어보자. 문서 출처 - kb금융그룹 '2021 한국 부자 보고서' 부자(富者)의 사전적 정의는 ‘재물이 많아 살림이 넉넉한 사람’을 의미한다. 이제는 로또에 당첨되어도 부자가 아니다. 연

[도서 후기] '기업'과 '고객'. 그 사이의 연결고리. [내부링크]

글로벌 기업부터 스타트업까지 사업 규모의 크고 작음을 떠나 고객을 상대로 사업을 하고 있다면 고객 가치가 그 기업과 고객을 연결하는 유일한 연결고리이며 생존을 위한 생명줄이라는 것을 부인하는 사람은 없다. 그런데도 매년 수많은 기업이 이 생명줄을 놓치고 시장에서 사라져간다. 기업이 추구해야 할 고객 가치는 무엇이며 그 해답을 찾고자 이 책을 읽어본다. 이제는 생소한 이름이 되어버린 노키아. 그 당시 노키아는 40%에 가까운 시장 점유율을 기반으로 통화 품질 또한 업계 최고 수준을 자랑하고 있었다. 노키아 슬로건 노키아는 원래 상당히 고객 지향적인 기업이었다. 공모전을 통해 그 결과를 신제품 개발에 적극 반응했고, 압도적인 점유율을 가지고 있음에도 고객들의 의견수렴을 개을리하지 않았다. 하지만 그런 노키아도 안드로이드가 아닌 자체 개발 '심비안' 운영체제만을 고집했으며, 결국 역사의 흐름 속으로 사라졌다. 이렇듯 빠르게 변화하는 시장 속에서 고객들이 원하는 상품과 서비스를 제때 만들어

[일본 시사] 일본 부자가 돈을 뿌리고 있다. 받아보자. [내부링크]

일본은 정말 알면 알수록 신비한 나라입니다. 몇 천년 동안 전통문화를 지키는 보수적인 측면이 있나 싶으면 사회에는 반대로 다양한 괴짜와 기발한 제품들이 즐비하니 정말 말 그대로 매력적으로 다가오는 존재입니다. 최근 우주여행에서 지구로 귀환한 '마에자와 유사쿠'(前澤友作)라는 억만장자가 있습니다. 2004년 온라인 패션 소매 웹사이트 Zozotown(현재 일본 최대 온라인 쇼핑몰)을 시작한 그는 2019년 소프트뱅크(회장 손정의)에 약 4조 4000억 원으로 쇼핑몰을 매각했습니다. 마흔넷의 나이에 그는 그야말로 '인생 은퇴'를 하게 됩니다. 12일간 '1000억 우주여행' 마치고 귀환한 마에자와 유사쿠 또한 자신의 유튜브 영상을 통해 1조 원이 든 통장을 인증하고 본인의 고향에서 1000억 원을 들여 개인 주택을 짓고 있다고 합니다. 이에 그치지 않고 그는 사람들에게 자신의 돈을 나눠주겠다고 발표합니다. 심지어 기부업체를 통하지 않고 자신이 직접 전달하는 방식으로 지금까지 약 300억

[중국 식문화] 기름 위에 올려진 삼시 세끼 [내부링크]

동아시아 3개 주요 국가: 한국, 중국, 일본. 우리는 인터넷 기술의 발전으로 해외여행 가지 않아도 유튜브나 네이버로 타국 뉴스를 접할 수 있게 되었고, 심지어 각 나라 사람들의 생김새 특징까지 파악할 수 있게 되었습니다. 같은 아시아권인대도 불구하고 왜 다를까. 필자는 그 수많은 분석과 원인 중 단연코 '식(食) 문화'를 절대적인 원인으로 꼽고 있습니다. 또한, 섭취하는 음식에 따라 인간의 체격, 골격, 외형 등이 크게 변화할 수 있으며, 이는 유전적 요소를 뛰어넘는 인류 성장의 핵심이라고 생각합니다. 한 식문화는 식재료 종류, 조리법, 식사법, 종교 등 수많은 복합 요소들이 문화적 산물로서 통일되어 있어 타 문화권과 구별 짓는 척도가 되며, 여러 사회경제적 요인들과 상호 영향을 주고받으며 오랜 세월 계승 및 발전되어 왔습니다. 이번 포스트는 중국의 식문화를 샅샅이 파헤쳐 보겠습니다. 중국 식문화의 '3대 큰 틀' 중국은 수천 년 동안 정말 다양한 요리로 식문화를 발전시켜 왔습니다

[일본 식문화] 체구가 작은 것은 적게 먹어서가 아니다. [내부링크]

필자는 과거 일본 도쿄에서 1달 동안 머무른 적이 있었습니다. 좋아하는 일본 문화를 맘껏 체험해 볼 수 있었으며, 일본 장인들의 음식점, 잡화점을 찾아다니는 즐거움도 엄청났습니다. 하지만 몇 년이 지난 지금도 이해가 안 됐던 의문점은 바로 기억 속 일본인들은 대부분 키가 안 크고, 체형이 말랐었습니다. 아마 일본의 소식(적게 먹는) 문화 때문에 적게 먹어서 그런 걸까~ 줄곧 생각해 왔는데 오늘날에야 이 또한 일본의 '와(和)' 문화와 관련이 있다는 사실을 깨달았습니다. 과거 70년간, 전쟁이 멈춘 이후 동아시아 각 나라들은 평화로운 발전에 접어들면서 경제 발전에 따라 국민들의 식탁은 점차 풍요로워졌습니다. 좋은 음식을 먹는다는 것은 많은 영양소를 섭취한다는 것이고 시간이 지날수록 국민들의 평균 신장은 점점 커져만 갔습니다. 하지만 일본의 성장률은 그다지 높지 못했습니다. 인종적 요소 추운 지방일수록 사람도 크고 동물도 큽니다. 1847년에 만들어진 '베르그만의 법칙'에 따르면 추운

[시사] 메이드 인 차이나? 전기차 배터리는 다르다. (LG엔솔 vs CATL) [내부링크]

최근 대한민국을 아주 뜨겁게 달군 시사가 있습니다. 바로 LG에너지솔루션(이하 LG엔솔)의 일반 공모주 청약인데요, 이틀 만에 공모 청약 증거금이 114조 모이며 청약 증거금, 청약 계좌 수, 경쟁률 등 전부 역대 최대라는 기록을 새웠습니다. LG엔솔은 원래 LG화학의 100% 자회사였으며, 전기차 배터리 (자동차 전지)를 생산하는 업체입니다(축전지 제조업). 전기차에 대한 중요성은 굳이 말을 안 해도 다 아실 겁니다. 인구수 증가와 환경파괴로 인하여 인류는 미래 발전의 지속성에 심각함을 느꼈고, 각 나라들은 2015년 '파리 기후 협약'을 통해 지구온난화 방지를 위해 온실가스를 줄이는 전 지구적 합의안에 참여했습니다. 그중 핵심은 인류의 핵심 이동 수단인 '내연기관차'를 '전기자동차'로 탈바꿈하는 것입니다. 그래서 그 전기차의 제조 원가 30%가량을 차지하는 핵심 부품인 '전기차 배터리'가 그렇게 주목받고 있는 겁니다. 자동차 전지, 그 크기는 상상을 초월한다. 그럼 이쯤에서 의문

2022년 중소기업 재직자 혜택 [내부링크]

2022년도 경제성장률이 3%를 넘지 않고, 우리나라 경제가 당분간 회복되지 않을 것이라는 분석 결과가 나왔습니다. 취업난은 당연하며, 대기업은 대부분 수시채용으로 전환한 상태입니다. 따라서 중소기업 재직자 수는 소폭 증가할 전망이며, 중소 벤처기업 연구원에서는 2022년 기준 전체 취업자 수 중 중소기업이 차지하는 비중은 89.4%로 예상했습니다. 유튜브- 이 과장의 좋좋소 따라서 중소기업에 취직한 청년이 챙겨야 할 혜택, 지원 등을 빠르게 알아보겠습니다. 1. 청년내일채움 공제 본 제도는 청년이 중소기업에서 장기근속할 수 있도록 청년(가입 본인)+기업+정부가 삼위일체로 2년간 공동으로 적립하여 자산 형성을 지원하는 제도입니다. 청년 월 12.5만 원 24개월 납입(300만 원) + 회사 지원 적립급 (300만 원) + 정부 지원금 (600만 원) =합계 1200만 원 + 이자 지원 대상: 1. 만 15세 이상 34세 이하 (군필자 최고 만 39세까지 인정) 2. 정규직 취업일 현

러시아-우크라이나 전쟁이 우리에게 미치는 영향 [내부링크]

'국제 관계에서 협정은 그저 종이 한 장에 불과하다.' 라고 말하고 싶을 정도로 21세기는 여전히 평화롭게 흘러가지 않습니다. 또한 이번 사태를 통하여 핵 보유 여부가 국가의 안보에 얼마나 중요한 역할을 하고 있는지 엿볼 수 있습니다. 간략한 전쟁 이유 설명 러시아 - 우크라이나 지도 러시아 푸틴 대통령이 했던 연설을 보면 이런 내용이 있습니다. 러시아와 우크라이나는 한 뿌리다. 그리고 우크라이나는 진짜 독립국가였던 적이 없다, 이렇게 주장을 하고 있습니다. 러시아, 우크라이나는 역사적으로 보면 형제국가입니다. 러시아의 고대국가가 우크라이나 수도인 키예프루스에서 시작했기 때문에 사실 우크라이나는 러시아에게 어머니와 같은 국가인데 이 국가가 서방으로(나토 협정) 가게 되면 러시아는 사실 어머니를 잃은 것 같은 느낌을 받을 수 있기 때문에... 하나의 민족으로 역사와 전통을 같이했다는 주장을 펼치면서 이번 우크라이나 침공을 정당화시키는 하나의 구실로 삼고 있다고 볼 수 있겠습니다. -영

[Linux] Torch 설치 및 Pytorch 버전 확인 [내부링크]

CUDA와 pytorch 버전을 맞추기 위해 pytorch 버전을 확인해 보았다. python -c "import torch; print(torch.__version__)" torch 모델이 없다고 나온다. pip3 install torch 당황하지 않고 바로 설치해 줌. 설치 완료. 이제 리눅스 터미널에서 pytorch 버전을 확인할 차례. 방법 1. python anaconda 아래에 설치되어 있는 Python 실행됨. python 코드 모드로 진입함. import torch print(torch.__version__) 버전 확인 후 아래 코드로 탈출. exit() #혹은 quit() 방법 2. python -c "import torch; print(torch.__version__)" 리눅스 터미널에서 직접 실행. 이렇게 파이 토치 버전(좌측), 대응하는 CUDA 버전(우측)이 바로 출력.

[Linux] NVIDIA GPU, CUDA 버전 확인 [내부링크]

NVIDIA GPU CUDA: ("Compute Unified Device Architecture", 쿠다)는 그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다. CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. GPGPU: 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치를, 전통적으로 중앙 처리 장치가 맡았던 응용 프로그램들의 계산에 사용하는 기술이다. nvidia-smi NVIDIA GPU 버전 확인 용어 설명 Driver Version GPU의 버전 CUDA Version 10.1이 설치되어 있는 것이 아닌 10.1을 설치해야 한다는 뜻 GPU / Fan GPU Number와 Fan의 사용 %를 나타냄 Name GPU MODEL Temp GPU가 일정 온도가 지나면 성능이 저하

[Linux] 쉘(bash) 파일 생성하기 [내부링크]

사전 지식: 리눅스 명령어는 쉘(shell)이 제공하는 명령어. #shell 정의: 운영체제 커널과 사용자 사이를 이어주는 역할, 사용자의 명령을 해석하고 커널에 명령을 요청함. #shell 종류: 1) Bourne-Again Shell (bash) : GNU project의 일환으로 개발됨, 리눅스 디폴트. 2) Bourne Shell (sh) 3) C Shell (csh) 4) Korn Shell (ksh) : Unix에서 가장 많이 사용됨. 리눅스 기본 쉘(shell)은 bash, bash에서 제공하는 기본 명령어는 pwd, cd, ls, cat, head/tail, rm 등 자주 쓰는 것들. 리눅스 bash 파일 생성하기 대표적인 4가지 파일 생성 법 1) touch 기본적으로 많이 사용하는 파일 생성 명령어. touch [filename].txt 주의) 초보자는 위 [] 안에 파일명을 넣어서 [file1]로 대입하는 실수를 자주 범함. 그렇게 되면 생성되는 파일명은 [fil

[Linux] Shell script 실행 파일 만들기 [내부링크]

touch test.sh shell 파일 생성 vi test.sh 편집모드로 들어가서 #!/bin/bash ls 위 실행 명령어 입력 후 esc :wq 1. 상단에 #!/bin/bash 라인을 추가합니다. 2. 원하는 명령어 추가. 실행 권한 부여하기. chmod +x test.sh bash test.sh 실행.

살면서 도움 되는 사이트 모음 [내부링크]

1. Send Anywhere (파일 전송) 업무 중 누군가는 윈도우를 사용하고 누군가는 MacOS를 사용합니다. 이렇게 다른 운영 체제 간 파일을 전송하고 싶을 때는 sendanywhere을 사용하면 해결됩니다. (비로그인 가능) 1. 전송하고 싶은 파일을 보내기에 올린다. 2. 링크 혹은 6자리 숫자 코드가 생성된다. 3. 받고 싶은 컴퓨터에서 링크(혹은 숫자 코드)를 입력하면 다운로드 시작. 파일의 종류, 개수, 용량 제한 없이 사용할 수 있습니다. https://send-anywhere.com/ko/#transfer Send Anywhere 쉽고 빠른 무제한 파일 전송 서비스 send-anywhere.com 2. 2 Color Combinations (디자인 색상 조합) 요즘 앱이나 사이트, 혹은 홍보물 디자인의 핵심은 '심플'입니다. 보통 인간은 한 화면에서 4종 이상의 메인 색상을 동시에 접하면 피로감을 느끼는데요, 그 색상 결정 장애를 해결해 주는 사이트입니다. 1. 마

코미디언부터 대통령까지- 우크라이나 대통령 젤렌스키 [내부링크]

전직 우크라이나의 인기 코미디언이자 정치 경험이 없는 상태로 2019년 대통령의 자리에 올라 '왕관을 쓴 광대'라고 불렸던 볼로디미르 젤렌스키. 지난 2월 25일, 미국이 러시아군에 체포당하거나 살해될 위협에 처한 볼로디미르 젤렌스키 우크라이나 대통령에게 피신을 제안했지만, 젤렌스키 대통령이 이를 거절한 것으로 나타났습니다. 현재 러시아의 침공에 맞서 국가를 위해 헌신하는 모습을 보여주며 우크라이나 국민들에게 정신적 지주가 되어주고 있는 '캡틴 우크라이나 - 젤렌스키'. 오늘은 그가 대통령으로 당선되기 전, 살아온 궤적을 함께 살펴봅니다. 1. 출생 1978년, 소련 시절의 우크라이나에서 태어났던 그는 꽤나 부유한 집안에서 유년기를 보냈습니다. 아버지의 일 때문에 몽골에서 4년간 생활하다 어머니의 건강이 악화되어 돌아오게 됩니다. 2. 학창 시절 어릴 적부터 사교성이 좋았던 그는 교내 활동에 적극적으로 참여하였고 많은 친구들을 사귀었다고 합니다. 1997년, 고등학생인 그는 러시아의

[Python] 개발 환경 구축 [내부링크]

프로그래밍 언어는 각 언어마다 다른 문법과 특화된 부분이 있다. 데이터 분석 분야에서는 주로 Python, R 언어가 많이 사용되는 것으로 알려져 있으며, 이에 대한 Python 개발 환경을 구축하기 위한 설치를 지금 시작한다. 본문에 들어가기 앞서 필자는 이미 윈도우로 한 번 진행을 해본 상태이며, 이제부터 사용할 Mac 버전과 다른 점이 있으면 바로 표기하도록 하겠다. 어쨌든 운영체제 간 큰 차이는 없을 것으로 보인다. 구글에 anaconda를 검색하고 사이트에 들어가서 다운로드 및 설치. 아나콘다는 패키지 관리와 디플로이를 단순케 할 목적으로 과학 계산을 위한 파이썬과 R 프로그래밍 언어의 자유-오픈 소스 배포판이다. -위키백과 설치가 완료되면 응용 프로그램에서 'Anaconda-Navigator'파일을 열어준다. 다소 렉이 걸리거나 시간이 1분가량 걸린다. 이 2020 맥북 프로에서도 그렇다. 인내심을 갖고 기다리길 바란다. 이렇게나 많은 통합 개발 환경이 있다. 우리는 이제

[Python] 정수형, 실수형, 문자열 [내부링크]

# <-- 기호는 '주석'. 즉 뒤에 어떻게 써도 프로그램에서 읽지 않음. 추가 설명 등 메모하기 좋음. print <-- 말 그대로 출력. >>> <-- 코드 입력. #정수 (소수점 없음) >>>print(500) 500 #실수 (소수점 있음) >>>print(9.99) 9.99 #문자 (따옴표로 가두는 형식) >>>print('Hello, world!') Hello, world! 아래부터 진또배기 내용이다. ========================== #정수: decimal >>>print('%d' %88) 88 즉 이런 고정된 형식으로 두번째 %의 뒷부분 숫자가 출력이된다. 만약에 두번째 %뒤에 정수를 안 넣고 실수를 넣었다? >>>print('%d' %88.88) 88 정수 부분만 출력. ------------------------- #실수: float >>>print('%.2f' %12.3456) 12.34 소수점 뒤 2자리 까지만 출력. 만약에 출력값에 단위가 붙고 싶

[Python] 산술 연산자 [내부링크]

>>>print(12+3) 15 >>>print(12-3) 9 >>>print(12*3) 36 >>>print(12/3) 4 아래 내용은 조금 생소하니 암기가 필요하다. 또한 향후에 많이 사용된다. ======================= >>>print(10 // 3) 3 나눠서 몫을 가져온다. 즉 10나누기3은 3에 1이 남지만 몫만 가져와서 출력 값은 3이다. >>>print(10 % 3) 1 나눠서 나머지를 가져온다. 10나누기3해서 3에 1이 남는데 그 나머지 값 1만 가져온다. ======================== 예제1) 200초를 /분/초 단위로 출력. >>>print(200 // 60 , '분', 200 % 60, '초') 3 분 20 초 예제2) 1300원에서 500원을 제외한 100원의 개수 출력. >>>print(1300 % 500 // 100, '개') 3 개

[Python] 변수 (Variable) [내부링크]

#변수는 하나의 유일한 값을 저장할 수 있다. #변수 네이밍은 숫자로 시작할 수 없으며 알파벳의 대소문자를 구분한다. #파이썬 예약어(문법)은 변수명으로 사용 불가하다. (ex. import, class, int ...) >>>num = 10 >>>print(num) 10 >>>a=1 >>>A=3 >>>print(a) 1 >>>print(A) 3 ========================= #1300원에서 500원을 제외한 100원의 개수 출력. money=1300 fivehundred=1300//500 onehundred=1300%500//100 print('오백원은 %d개, 백원은 %d개.'%(fivehundred,onehundred)) 예제를 실행하면 spyder 우측 상단에 설정한 변수와 변숫값이 표시된다. #2개의 변수 값을 교체 하려면 새로운 변수를 도입해야한다. x=1 y=2 x와y의 값을 바꾸고 싶으면 새로운 변수 z를 도입한다. (x=y 이렇게 하면 y을 값을 x에

[Python] 대입, 비교, 논리 연산자 [내부링크]

#대입연산자 >>>num=10 >>>num=num+1 #num+1을 새로운 num(좌측)으로 대입했으니 아래 print값은 11이다. >>>print(num) 11 =================== #비교연산자 >>>print(10>5) >>>print(5<10) >>>print(10==10) #파이썬에서 값이 같다~는 '=='를, 우측을 좌측 변수에 대입은 '='를 사용한다. >>>print(10>=5) #10이 5보다 크거나 같다. True다. >>>print(5<=10) >>>print(10!=5) #!=는 다르다는 뜻이다. True #비교연산자는 비교 정확 여부에 따라 출력을 True / False로 출력한다. =================== #논리연산자 1. and (양쪽 모두 참 일시 True) 2. or (양쪽 중 어느 한쪽이라도 True) >>>print(10>= 5 and 10==10) True >>>print(10!=5 or 5 >10) True

[Python] 홀짝 정하기 [내부링크]

# 홀짝정하기 정수= int() 정수 % 2 == 0 (짝수) 정수 % 2 == 1 (홀수) # 짝수이면서 3의 배수이면, True를 출력. >>>num = 12 >>>print(num % 2 == 0 and num % 3 == 0) True

[Python] input/ output [내부링크]

>>>age = int(input("나이 입력 : ")) >>>print(age) 우측 하단에 입력창이 나온다. int로 설정했으니 정수를 입력. (실수float를 입력하면 오류난다.) 문제: inch와 cm를 자유 형식에 맞게 출력하세요. >>>inch=float(input('인치를 입력하세요: ')) >>>cm=inch*2.54 >>>print("="*30) >>>print("%s\t\t%s"%("inch","cm")) >>>print("-"*30) >>>print("%.2f\t%.2f"%(inch,cm)) #위에서 설정한 변수inch,변수cm. >>>print("="*30) #\t 는 역슬레쉬t. 출력 값에서 Tab키 한 번의 효과가 있음. 출력값

[Python] if문 [내부링크]

# 제어문(control statement) # 1.조건문 : if # 2.반복문 : while, for # 3.보조 제어문 : break, continue # 문제) 과락 >>>kor = int(input("국어 성적 입력 : ")) >>>eng = int(input("영어 성적 입력 : ")) >>>math = int(input("수학 성적 입력 : ")) >>>tot = kor + eng + math >>>avg = tot / 3 >>>if avg >= 60: >>> if kor >= 50 and eng >= 50 and math >= 50: >>> print("합격") >>> if kor < 50 or eng < 50 or math < 50: >>> print("불합격") >>>if avg < 60: >>> print("불합격")

[Python] random [내부링크]

임의의 수를 출력하는 모듈 random, 아래 처럼 사용. >>>import random >>>x = random.randint(2, 9) #2~9사이에서 랜덤 숫자 생성. >>>y = random.randint(1, 9) ====================== >>>print(random.randint(2,5)) #randint는 뒤에 범위를 입력해야함. 아니면 오류. #[2,3,4,5] >>>print(random.randrange(2,5)) #randrange, 주의할 것. #[2,3,4] ================================== # 연산자 기호 맞추기 게임 # 1. 1~50 사이의 랜덤 숫자 2개를 저장한다. # 2. 1~4 사이의 랜덤 숫자 1개를 저장한다. # 이는 연산자 기호로 활용된다. # 1) 더하기(+) 2)빼기(-) 3)곱하기(*) 4)나머지(%) # 예) 랜덤 숫자 2개 : 8, 3 # 랜덤 숫자 1개 : 1 # 문제 => 8 3 = 11

[Python] '369'게임 만들기 [내부링크]

#369게임 #1. 1-50 사이 랜덤 숫자 하나를 저장. #2. 위 숫자 안에 #3. 369중 2개 있으면 짝짝, # 369중 1개면 짝, 없으면 해당 숫자 출력. >>>import random >>>num = random.randint(1, 50) >>>print(num) >>>x = num //10 #십의 자리 >>>y = num %10 #일의 자리 >>>count=0 #3,6,9가 몇개 있는지 새로운 변수 선언 >>>if x %3 ==0 and x !=0: >>> count += 1 #count = count + 1 >>>if y %3 ==0 and y !=0: >>> count += 1 >>>if count == 2: >>> print("짝짝") >>>elif count ==1 : >>> print("짝") >>>else: >>> print(num) #나중에 반복문을 배우면 더 개선할 수 있다.

[영화] '이상한 나라의 수학자' 감상평 [내부링크]

시험의 속박에서 풀려난지 꽤 오랜 시간이 지난 것 같다. 해 뜨기 전부터 영단어 암기했던 날들, 오전 오후는 진도 빠른 수업에다가 저녁 자습시간에는 하염없이 수학 문제 풀기. 그리고 단어장을 손에 꽉 쥔 채로 침대에서 기절한다. 물론 필자뿐만이 아닌 대부분 아시아권 학생들은 이런 나날을 보냈을 것이다. 다시는 돌아가고 싶지 않은 학창 시절이지만 때로는 그 순수하게 공부만 했던 시절이 문뜩 그리워서 - 무엇인가에 홀린 듯 영화 '이상한 나라의 수학자'를 보고 왔다. 이하의 내용은 영화의 줄거리를 약간 포함하고 있습니다. '이상한 나라'의 수학자 - 이학성 (이하 최민식)은 탈북자다. 원래는 북한에서 수학으로 무기를 개발하는 일을 하였으나 수학을 너무나 좋아했던 그는 수학이 '그런 용도'로만 쓰이는 게 너무 싫었고 학문의 자유를 꿈꾸며 38선을 넘어 내려왔다. 하지만 한국의 상황도 별반 차이 없었다. 이곳의 수학은 오로지 입시를 위해 사용되고 있었으며 결국은 좋은 대학, 나아가 좋은 직

[중국 시사] 중국인들의 '애국심'은 무엇인가. [내부링크]

'애국심'이란 단어는 참 표현하기 어려운 것 같다. 365일 내 집 베란다에 국기를 걸어놓는 것이 애국일까, 아니면 SNS 게시물마다 '#코리아 파이팅' 이 애국일까. 그 누구도 행동을 정확히 정의하지 못하는 단어 - '애국' 오늘은 중국인들의 '애국심'을 샅샅이 파헤쳐 본다. 중국인들에게 있어 '애국심'은 대중적인 형태로 표현되어 왔다. 'NO JAPAN' 2000년대 초반. 약 2006~2009년쯤이었다. 중국은 일본과 우오쓰리섬을 두고 엄청난 소유권 분쟁이 있었다. 우오쓰리섬 위치 양측은 다 저 섬이 자기의 고유 영토라고 주장하며 한치의 양보도 없이 피 터지는 설전을 벌였다. 결국 시간이 길어지자 국가 간의 문제가 단순 외교를 넘어 사회의 전반적인 문제로 번졌다. 당시 중국의 모든 커뮤니티는 일본을 '소(小) 일본'이라고 비꼬며 그 '시위'의 허가가 나기 힘들다는 나라에서 'NO JAPAN'시위를 암묵적으로 허용했다. (시위 자체는 승인이 안 나지만 시위를 해도 경찰이 재제를

[IT 도서] 비전공자를 위한 이해할 수 있는 IT 지식 [내부링크]

요즘 뉴스를 보면 온갖 IT 용어가 난무한다. 웹 3.0, 블록체인, 통신 프로토콜... 이미 우리는 4차 산업 혁명의 시대를 살고 있고 매일 스마트폰으로 메시지를 보내며, 컴퓨터로 일을 한다. 또한 비대면 주문의 수요 증가로 인하여 음식점은 키오스크(터치 주문판)로 오더를 받으며 유튜브 등 플랫폼에서 게임 스트리머들은 VR 기기로 가상현실 게임을 즐긴다. 이제 IT를 모르고선 세상을 이해하기 어려운 시대가 되었다. 오늘 소개할 이 책은 입문자가 봐도 전혀 무방할 정도로 내용이 가볍고 읽기 편하게 되어있으며 각 챕터별로 네트워크, API, 프레임워크 등 정말로 실무에서 사용하는 단어들로 구성되어 있다. 개발자로 일하고 있는 필자가 한눈에 딱 봐도 책 저자의 진심이 담겨있는 책이었으며 비전공자에 대한 배려가 충분히 느껴지는 내용들로 구성되어 있다. 우리가 생각하는 개발자는 책상에 앉아서 뭐 하는 거지? 컴퓨터의 구성요소는? 개인 서버를 운영하고 싶지만 힘든 것은? 회사에서 디자이너와

[Python] for 문 (for i in list/tuple/string) [내부링크]

for 변수 in 리스트(또는 튜플, 문자열): 수행할 문장1 수행할 문장2 ... ================= >>> test_list = ['one', 'two', 'three'] >>> for i in test_list: ... print(i) ... one two three ================= while문에서 살펴본 continue문을 for문에서도 사용할 수 있다. 즉 for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다. 문제: 1부터10까지 더하기. >>> add = 0 >>> for i in range(1, 11): ... add = add + i ... >>> print(add) 55 변형 출제. >>> a = [1,2,3,4] >>> result = [] >>> for num in a: ... result.append(num*3) #append(x)는 리스트의 맨 마지막에 x를 추가하는 함수이다 ... >

[Mac] 맥에서 PuTTy 설치하는 법 [내부링크]

오늘은 맥에서 PuTTy를 설치하는 법을 알아보겠다. 1. 먼저 앱스토어에 들어가서 Xcode를 다운로드한다. 2. 애플 개발자 계정으로 로그인한다. 두 번째 보이는 Command Line Tools for Xcode 13.3을 다운로드해 준다. (Xcode 버전과 같은 버전으로 다운로드하면 된다. 꼭 최신 버전으로 받자.) 3. Command Line Tools for Xcode 13.3 다운로드 버튼을 눌러준다. 더블 클릭하여 설치. 4. 맥에서 터미널을 열고 (하단 Launchpad -> 기타 -> 터미널) 아래 코드를 실행해 준다. 마지막에 동의 여부 입력창이 나오면 agree를 입력해 준다. 5. MacPorts 설치 차례이다. 본인 macOS 버전과 알맞은 버전으로 골라서 다운로드. 설치. 6. MacPorts 설치 완료 후 아래 코드를 터미널에서 실행해 준다. 7. 마지막으로 XQuartz를 다운로드한다. 맥 전용 프로그램은 항상. dmg 파일이다. 8. XQuartz

[Mac] 맥 전용 scp/sftp/ssh 설치하기 [내부링크]

맥도 윈도우의 WinSCP처럼 훌륭한 GUI 프로그램이 있었으면 좋겠다. 1. Cyberduck 사이트에 들어가서 다운로드 후 바로 사용. 기본 무료지만 추가 기능 사용 시 유료로 전환해야 한다. 하지만 무료기능만으로 일반 유저는 충분히 사용 가능하다. 맥에서 설치 성공. 어렵지 않다. 2. FileZilla 위에서 소개한 사이버덕 보다 훨씬 좋다. 강력 추천. 사이트에 들어가서 서버가 아닌 좌측 클라이언트를 다운로드해 준다. macOS 클라이언트 다운로드. 전체 인터페이스는 물론 맥에서 WinSCP 버금가는 프로그램이다.

[일본 사회] 탈영한 해병대 병사로부터 바라보는 '이지메' [내부링크]

최근 탈영하여 러-우 전쟁에 의용군 신분으로 참전한 한 해병대 병사가 있다. 정의감, 용기, 영웅 의식... 그 무엇도 아니었다. 원인은 군부대 내의 '기수열외'. '기수열외'는 '군대 왕따'이며, 부대 안에서 투명인간 취급당할뿐더러 하급자도 열외 된 기수를 무시한다. 요즘은 아무리 핸드폰을 사용한다지만, 기수열외 취급을 받으면 그곳은 '살아있는 지옥'과 다름없다. 오늘은 저 '왕따'문화에 중점을 두며 그 '기원'인 옆 나라 일본의 '이지메'문화를 파헤쳐 본다. 우선 일본의 '이지메' 정의부터 짚고 들어간다. 동일 집단 내의 상호작용 과정에 있어서 우위에 선 자가 의식적 또는 집합적인 타인에게 정신적, 신체적으로 고통을 주는 행위. -'이지메' '폭력행위', '공갈 행위'등도 포함되며 괴롭히는 데는 뚜렷한 이유가 없으며, 그 대상은 대개 '약하고 힘없는 존재'이다. 그저 자신들과는 뭔가 다른 구석이 있다는 이유만으로 한 사람을 두고 집단으로 괴롭히는 것이다. '이지메'는 일본만의 이

[AI] 인공지능 관련 대화를 위한 필수 지식 [내부링크]

많은 사람들은 흔히 인공지능을 경외(敬畏) 한다. 기계 주제에 인간의 말을 알아듣고 대답하며, 한 발 더 나아가 우리의 패턴을 기억해 유튜브 메인 화면에 내가 궁금했던 영상을 보여준다. 이렇게 우리 생활을 편리하게 해주는 인공지능이지만 한 편으로 많은 사람들은 우려를 표한다. "인공지능이 혹시 '터미네이터'처럼 스스로 새로운 것을 학습하고 스스로 진화할까?" "또는 우리 인류의 문명을 파괴하는 '인류 최강의 적'이 될 수도 있지 않을까?" SF 영화의 광팬인 당신에게 이에 대한 대답은 '아니요'다. 이제부터 인공지능에 대하여 알아보자. AI와 대화를 안 해본 사람을 없을 것이다. 인공지능의 정의 '지능'은 새로운 대상이나 상황에 부딪혀 그 의미를 이해하고 적응 방법을 알아내는 지적 활동의 능력이다. https://www.youtube.com/shorts/PWhZc2KTesY 위 영상처럼 '지능'이 있는 생물은 새로운 상황(물에만 있던 장난감이 육지에 있다)에 부딪혔을 때 해결 방안을

[Git] React Native 작업 후 Git으로 ios/android 코드 별개 저장하기 [내부링크]

Git은 개발자의 필수 소양이다. 하지만 내가 겪은 문제를 구글에서 아무리 찾아봐도 없었고, 우여곡절 끝에 해결 방안을 찾아냈다. react native로 앱 개발 중 git으로 ios/ android 운영체제 별로 따로 저장하고 싶을 때. (애초에 따로 나눠서 개발할거면 react native를 할 이유가 1도 없다. 여기서는 예시일뿐) 본인이 작성한 코드를 github 또는 회사 서버에 올리고 싶을 때. 많은 곳을 찾아보면 'git push origin master' 한 줄로 설명해 버리지만, IT 세계에서는 항상 케바케가 적용된다. 위 형식은 (git push [저장소명] [브랜치명])이다. 이 [저장소명] [브랜치명]이라는 의미를 아는 것이 정말 중요하다. 작업할 때 '저장소'는 보통 origin으로 하고, 핵심은 '브랜치'가 중요. 많은 사람이 동시에 같은 프로젝트에서 작업할 때 모두 master에서 작업하면 서로 충돌이 일어나기 마련. 따라서 작업 내용에 따라 각자 브랜치

[Mac] '스티커'기능 제대로 알고 사용하자 [내부링크]

맥북 유저라면 너무나도 편리한 스티커 기능. 마치 사무실 벽에 포스트잇을 붙여놓은 것 마냥 보기에 편한데요. 하지만 처음 사용할 때는 얘가 '오지랖(?)'을 부리면서 알아서 첫 문자를 대문자로 바꿔준다든지 알아서 단어를 자기가 판단한 대로 바꾸지를 않나... 이대로는 안되겠다 싶어 문제를 해결해 봅니다. 우선 스티커 위치는 Launchpad를 열면 '기타' 폴더에 있습니다. 그럼 이제 시작. 시스템 환경 설정을 열어줍니다. 키보드로 들어갑니다. 키보드-텍스트로 들어와줍니다. 우측 상단에 "맞춤법 자동 수정" "자동으로 문장을 대문자로 시작" "스페이스를 두 번 눌러 마침표 추가" 이놈들이 원흉이었네요. 전부 클릭해서 체크 없애줍니다. 맥북은 설정 변경이 자물쇠가 없는 이상 자동 저장됩니다. 이제 돌아와서 확인하니 드디어 '오지랖(?)'을 하지 않는 맥북. 하지만 아직 복병이 남아 있었습니다. 'ori'까지 작성했지만 또 참지 못하고 훈수를 두는 MacOS. 해결하러 출발. 아까 그

[IT 지식] 프로그래머 vs 개발자 vs 엔지니어 [내부링크]

우리가 흔히 말하는 코딩 관련 직군. 도대체 저 사람은 프로그래머인지 개발자인지 엔지니어인지... 다 비슷비슷하고 그냥 셋 중에 아무거나 부르면 될 것 같으며 심지어 현업에서조차 헷갈리는 분들이 많다. 따라서 오늘은 정확한 정의를 한 번 짚고 넘어간다. 팀 쿡이 국내 ‘스위프트 학생 공모전’ 최연소 수상자(개발자,13세)의 화상 발표를 듣고 있다. 1. 프로그래머 코드 작성, 테스트, 개발 지원. 코딩을 하면서 프로그램을 만드는 사람. 컴퓨터 프로그램의 논리나 알고리즘을 설계하고 프로그램을 작성하고 테스트한다. 프로그래머는 소프트웨어 엔지니어, 컴퓨터과학자, 해커로 간주할 수 있다. 2. 소프트웨어 엔지니어 시스템에 가깝게 소프트웨어를 구축하고, 서버에 구동 시키고, 서버 구동이 정상적인지 자원 관리라든가 대규모 시스템 내 소프트웨어 연동 등을 처리 운영하는 역할. 관련 업무의 기술 참조, 기술 연구, 기술 구현, 기술 활용 등을 총합적으로 통계하고 서술하며 실무 참여 전문가. 3.

[영화] THE BATMAN [내부링크]

필자는 원래 마블 히어로의 광팬이다. 화려한 외모에 강력한 능력을 가진 영웅들. 그리고 빼놓을 수 없는 마블 스튜디오의 생생한 CG 효과까지. 반면 DC 히어로들은 항상 음침한 분위기를 내뿜고 다가가기 쉽지 않았다. 하지만 이번 배트맨이 새로운 배우(로버트 패틴슨)로 새 출발을 한다는 소식을 듣고 들뜬 마음에 DC 입문작으로 도전해 봤다. 결론부터 말하자면 왜 이런 명작을 개봉 첫날에 안 봤나 싶었다. 3시간이라는 러닝타임 동안 지루한 틈이 한순간도 없었고 10점 만점에 11점을 주고 싶을 정도로 올해 최고의 명작이 되지 않을까 조심스럽게 예측해 본다. '더 배트맨' 맷 리브스 감독의 뛰어난 연출과 로버트 패틴슨의 빼어난 연기로 완성된 <더 배트맨>. 경찰도 아니고 영웅도 아닌 별 볼일 없는 취급을 받던 배트맨. 그러나 자신의 신념을 흔드는 거센 역풍에도 무너지지 않고 점차 내면과 외면의 성장을 동시에 이뤄낸다. 리들러 빌런'리들러'는 '조커'와는 또 다른 매력이 있었다. 배트맨의

[영화] 예술가의 정신세계 - 루이스 웨인 [내부링크]

루이스 웨인은 20살 때 아버지가 사망하면서 그는 어린 나이에 일가족의 가장이 되었다. 활동 초창기에는 주로 잡지의 삽화로 동물이나 전원 풍경을 그렸으며, 뛰어난 그림 솜씨로 빠르게 명성을 얻었다. 23살에 10살 연상의 에밀리 리처드슨과 결혼하였으나, 그녀는 유방암에 걸리게 되어 결혼 생활 3년 후 자식도 없이 사망하고 만다. 그의 아내는 옛날 길에서 구조해 기르던 고양이 '피터'로부터 안정감을 얻었는데, 루이스는 그런 아내를 위해 피터를 자주 그려주었고 이 뒤부터 그는 주로 고양이 그림을 그리기 시작했다. 1886년, 처음으로 의인화된 고양이를 발표하였고, 아기자기하고 풍자적인 그림들을 많이 그렸다. 1907년에는 뉴욕으로 이동하여 만화를 그리기도 했다. 웨인의 그림은 선풍적인 인기를 끌었으며, 곧 당대 미술계의 유명 인사가 되었다. 웨인의 고양이 사랑은 단순히 그림에만 그치지 않았고 고양이 애호가 클럽의 회장직을 맡거나 동물 보호 운동에 적극적으로 참여하기도 했다. 하지만 유명

[Github] 로컬에서 정상적으로 push 안될 때 [내부링크]

오늘은 싱글벙글 새로운 환경에서 github 소스코드를 내려받고 작업할 때 만났던 문제들을 해결 해본다. 먼저 당연하게도 github에서 저장소를 생성한다. 저장소 이름을 입력하고 추가 설명을 넣은 다음 공개 또는 비공개 설정을 하고 아래 3개는 github에서 체크를 권장한다. 생성한다. 여기까지 왔으면 일단 github에서의 작업은 멈춘다. 로컬(데스크톱)으로 돌아와서 코드 포함한 파일 생성. 그리고 해당 폴더의 위에서 우 클릭하고 '폴더에서 새로운 터미널 생성하기'를 클릭한다. git init #저장소 초기화. 이 파일을 사용하겠다고 선언 git remote add origin https:// 방금 github에서의 주소 복붙. git remote -v #주소와 잘 연결되었는지 확인. git branch #현재 로컬 브랜치 확인. git branch -M main #로컬 브랜치명을 main으로 변경 (github의 default branch도 main이기 때문에.) git ad

[Mac] jupyter notebook 설치 및 실행 [내부링크]

Jupyter notebook은 대화형 파이썬 인터프리터(Interpreter)로서 웹 브라우저 환경에서 파이썬 코드를 작성 및 실행할 수 있는 툴이다. 우선 컴퓨터에 python 언어가 있어야겠죠? 사이트가서 다운로드해줍니다. 다음에 터미널에서 python -V 실행하여 버전 확인. 안 뜬다면 python3 -V pip3 install --upgrade pip 여기서 pip 이란? python 관련 패키지와 모듈들을 설치하기 관리하는 패키지 매니저 ( Package Management)다. node의 npm, yarn. 리눅스의 apt 같은 패키지 매니저다. 그럼 pip은 뭐고 pip3는 뭔가요? pip은 python2 버전의 패키지 매니저고 pip3는 python3 버전의 패키지 매니저다. 현재 우리가 설치한 파이썬 버전은 3.9 이상이니 pip3를 사용해 준다. 위 명령어를 통해 pip3를 설치하고 업데이트했다. pip3 install jupyter 패키지 매니저를 통해 jup

[Github] 실수로 삭제한 저장소 복원하기 [내부링크]

오랜만에 저장소를 정리하고자 약간 메모+낙서장 식으로 사용했던 repository들을 지웠다. 그런데 이게 웬걸 내 소중한 contribution들이 다 사라졌다. 삭제 전에 나름 서명(?)까지 했기에 급한 마음에 복원이 가능한지 찾아보았다. settings- repositories- repositories 여기 deleted repositories에서 찾을 수 있다. 최대 1시간을 기다려야 한다. restore로 복구해 주면 된다.

[Pandas] (2022) python 라이브러리 'pandas' 사용하기 기초 편 [내부링크]

pandas는 python의 데이터 분석 라이브러리이며, 데이터 분석 시 제일 많이 사용된다. 항상 업데이트가 빈번한 IT업계에서 본 한글 문서 번역이 보이지 않아 필자도 겸사겸사 공부할 겸 Kaggle의 2022년 버전 pandas 라이브러리 문서를 번역해서 올린다. pandas란 이름은 한 개인에 대해 여러 기간 동안 관찰을 한다는 데이터 세트에 대한 계량 경제학 용어인 "패널 데이터"라는 용어에서 파생되었다, 동물 판다와 관련 없다. 기계 번역이 아닌 필자의 개인 풀이와 견해도 있으나 큰 틀은 벗어나지 않는다. 코드 테스트 환경은 Kaggle과 동일한 jupyter notebook 혹은 jupyter-lab을 추천한다. jupyter 설치법은 필자의 IT /Mac 카테고리에 서술되어 있다. import pandas as pd 라이브러리 사용 시작. 데이터 만들기 pandas에는 DataFrame, Series 두 개의 핵심 오브젝트가 있다. 1. DataFrame pd.Data

[RN] React Navigation 자주 사용하는 functions [내부링크]

https://reactnavigation.org/docs/navigation-prop/ Navigation prop reference | React Navigation Each screen component in your app is provided with the navigation prop automatically. The prop contains various convenience functions that dispatch navigation actions. It looks like this: reactnavigation.org ReactNative의 기본 뼈대를 갖추는 navigation, nativeStack, bottomTabs 등 많은 매력적인 navigation을 제공하고 그 핵심인 화면 이동 간의 navigation 은 필수 of 필수다. 사용법은 문서 페이지 하단. 그중에서 자주 사용하는 3가지만 소개해 본다. navigation: { navigate } cons

[RN] Flatlist에서 불러오는 데이터 역순 정렬법 [내부링크]

flatlist에서 핸드폰 mediaLibrary에 접근해 저장된 동영상을 불러오는 기능을 구현 중인데 예전 동영상이 항상 최상단에 있는게 문제였다. 이 해결의 관건은 data={{ }}뒤에서 sort를 사용해줘야 한다. 위처럼 sort를 사용해야 최신 데이터가 flatlist 상단에 위치한다.

[IT 시사] 인터넷 익스플로러 지원 중단! 브라우저 몰락의 이유는? [내부링크]

2022년 현재는 수많은 브라우저가 '시장 점유율'을 목표로 피 터지는 경쟁을 펼치고 있습니다. geralt, 출처 Pixabay 하지만 과거엔 브라우저 '일인자'가 있었죠. 모르는 사람이 없을 정도로 유명한 '인터넷 익스플로러'. IE 1995~2022 IE의 과거를 알면 2022년 6월 15일이 왜 역사적 순간이었는지 알 수 있습니다. 인터넷 익스플로러의 과거 영광 1. IE 3.0 (1996) 최초로 css를 지원하는 브라우저. 2. IE 5.0 (1999) 최초로 ajax를 지원하는 브라우저. AJAX란 비동기 자바스크립트와 XML (Asynchronous JavaScript And XML)을 말합니다. 간단히 말하면, 서버와 통신하기 위해 XMLHttpRequest 객체를 사용하는 것을 말합니다. JSON, XML, HTML 그리고 일반 텍스트 형식 등을 포함한 다양한 포맷을 주고받을 수 있습니다. -ajax 쉽게 말하면 ajax 덕분에 우리가 유튜브에서 영상을 클릭하면

[Xcode] Command PhaseScriptExecution failed with a nonzero exit code Error 해결법 [내부링크]

배경: 보통 m1맥북 사용자한테서 일어나는 에러. React Native 프로젝트 빌드 할 시 갑자기 Xcode에서 에러 발생. 원인: node를 homebrew로 설치해서 Xcode가 경로를 못 찾음. 해결법: which node 해당 명령어를 입력하여 본인이 저장한 node 경로를 확인. /opt/homebrew/bin/node 보통 homwbrew로 node를 설치했으면 이 경로가 나온다. (달라도 상관없음.) /usr/local/bin/node 해당 경로가 Xcode가 빌드 시 참조하는 node 위치. 따라서: ln -s $(which node) /usr/local/bin/node 해당 명령어 한 줄로 노드 위치를 심볼릭 링크로 만든다. 자 다시 핵심인 에러 내용을 본다. Error: Cannot find the node binary. Try setting the NODE_BINARY variable in the "Bundle React Native code and image

[RN] camera, audio 등 디바이스 기능에 접근 시 권한 추가 [내부링크]

이건 아주 초창기 때 겪었던 문제인데 생각나서 한번 끄적여 본다. react native에서 라이브러리를 설치할 때는 아주 당연하게도 따로 권한 설정을 해줘야 한다. 안드로이드 위치: (대부분) android/app/src/main/AndroidManifest.xml 혹은 android/app/build.gradle 대부분 이 두 파일에서 코드를 추가해 권한을 부여한다. ios 위치: (대부분) ios/(project name)/Info.plist 어떤 코드를 추가할지는 각 라이브러리에서 상세히 명시하니 따라 하면 된다.

[RN] 'Build input files cannot be found error', ipa/apk 빌드 시 에러 [내부링크]

완전 deprecated된 library를 사용하니 app이 apk빌드가 안되는 현상 발생. 원인은 react-native-camera. 사용하지 않음에도 불구하고 프로젝트 자체가 deprecated되어서 문제였다. npm uninstall react-native-camera 로 정상 빌드함.(안드로이드는) ios쪽은 문제가 많아 보였다. 이런 상황에서 찾아본면 흔하게들 ios폴더 안에 있는 Podfile.lock을 들어내고(지우고) 다시 pod install을 하라고 한다. 하지만 다른 에러가 찾아온다. 에러 내용: cycle in dependencies between targets... Expo... 아마도 내가 사용한 Expo sdk랑 충돌이 일어난게 맞다. 이럴때는 시원하게 Pods 파일을 들어내고 재설치하면 대부분 해결된다. cd ios && rm -rf Pods && pod install && cd .. 프로젝트 폴더에서 실행하면 ios폴더에 들어가서 Pods를 들어내고

console log시 Promise return값 이상 [내부링크]

Promise 를 return한다 => 코드에서 즉시 이뤄지지 않는다는 뜻. db에 가서 실패한다면 실패했다는 정보를 가지고 돌아와야하기 때문에. 또한 보장되지 않는다는 뜻. 보통 console.log를 찍을 때 이런 오브젝트 형식을 return받을 때가 많다. promise: { "_u": 0, "_v": 0, "_w": null, "_x": null} 이런 형식은 기존 코드에서 async await을 사용해 비동기 처리를 해결하면 된다. 최근 자바스크립트 기준으로는 async없이 await만 사용해도 된다고 한다.

[RN] react-native-debugger소개 [내부링크]

github 링크: https://github.com/jhen0409/react-native-debugger GitHub - jhen0409/react-native-debugger: The standalone app based on official debugger of React Native, and includes React Inspector / Redux DevTools The standalone app based on official debugger of React Native, and includes React Inspector / Redux DevTools - GitHub - jhen0409/react-native-debugger: The standalone app based on official debugger... github.com >= Homebrew 2.6.0 brew install --cask react-native-debugger 터미널에서 입력하면 applic

[Android] android adb를 통해 기본 카메라 무음 처리법 [내부링크]

카메라 기능 개발 중 카메라 촬영음이 무음이어야 되어서 이것 저것 찾아보다 배우게된 기술이다. 1. adb 다운로드(SDK Platform-Tools 다운로드) https://developer.android.com/studio/releases/platform-tools SDK 플랫폼 도구 출시 노트 | Android 개발자 | Android Developers Android SDK 플랫폼 도구는 Android SDK의 구성요소입니다. developer.android.com 언어 설정을 영어로 바꾸어야 제대로 다운이 된다고 합니다. sdk zip 파일을 다운 받고 압축을 푼 후 폴더명을 adb로 바꿔서 c드라이브 밑에 옮겨둡니다. 2. 휴대폰 개발자 옵션 활성화 개발자 옵션을 켜고 USB 디버깅을 허용하여 위에서 받은 sdk platform tool을 휴대폰에 연결할 수 있도록 설정하는 방법입니다. 설정 - 휴대전화 정보 - 소프트웨어 정보 - 빌드번호 7번 누르기 설정 - 개발자 모

[RN] 'styled 가 선언은 되었지만 해당 값이 읽히지는 않았습니다' ts(6133) 에러 해결 [내부링크]

React Native + styled component 조합을 사용하는 분이라면 이 문제는 무조건 만나봤을 것이다. 사용하는데 기능상 문제는 없지만 extension을 설치해도 command+I 시 components 선택 창이 안 뜨고, 이리저리 찾아봐도 본인에 맞는 해결책은 없다. 필자도 갖은 테스트 끝에 문제를 해결했다. 이 두 개를 npm install 해주길 바란다. npm i @types/styled-components npm i @types/styled-components-react-native 그리고 빠지면 안 되는 확장 설치. 삼총사 설치가 끝나면 위 오류는 사라질 것이다.

[Android Studio] 웹앱 "handshake failed" 에러 해결 [내부링크]

사이트는 잘 실행이 되는데 웹앱 빌드 시 아래와 같은 에러가 뜬 적이 있다. [ERROR:ssl_client_socket_impl.cc(946)] handshake failed; returned -1, SSL error code 1, net_error -202 이것은 http 에러이기 때문에 manifests 파일 아래에 있는 AndroidManifest.xml 파일의 <application>태그 안에 android:usesCleartextTraffic="true" 코드를 추가해 줘야 한다. 에러 해결. 이하는 android.developer 공식 문서에서 퍼 온 추가 설명이다. https://developer.android.com/guide/topics/manifest/application-element Android 개발자 | Android Developers 애플리케이션의 선언입니다. 이 요소는 애플리케이션의 각 구성요소를 선언하는 하위 요소를 포함하며 모든 구성요소에 영향을

[Android Studio] 웹앱 localStorage 관련 에러 해결 [내부링크]

기존 웹 사이트에서 localStorage를 사용하고 있는 경우 앱 빌드 시 관련 에러가 뜹니다. 일단 MainActivity.java 파일로 가줍니다. webSettings 관련해서 자바스크립트 설정 및 로컬 스토리지 설정을 해야 합니다. //자바스크립트 설정 webSettings.setJavaScriptEnabled(true); //webview 로컬 스토리지 설정 webSettings.setDomStorageEnabled(true); 추가 설명: Web storage, sometimes known as DOM storage (Document Object Model storage), provides web apps with methods and protocols for storing client-side data. -위키백과 웹 스토리지에는 두 가지 종류의 스토리지가 있다. 로컬 스토리지와 세션 스토리지이다. 로컬 스토리지 (Local Storage) 로컬 스토리지는 브라우저에

[Xcode] 웹앱 만들기 (Webview App) -WKWebView [내부링크]

'웹앱' 형식은 애플에서 공식적으로 지원하는 기능이다. 따라서 Xcode에서 빌드가 가능하고 먼저 관련 개발자 공식 문서 및 UIKit를 알아본다. 애플이 제공하는 WebKit Framework를 사용해야 하며, 알아둬야 할 것은 기존 몇 년 전에 사용하던 'UIWebView'라는 기능은 더 이상 지원되지 않는다. UIWebView (deprecated) 우리가 사용해야 할 것은 WKWebView다. WKWebView Xcode 이제 Xcode를 열어준다. Create a new Xcode project를 선택해 준다. Single View App을 선택하고 Next로 넘어간다. 다음 화면에서 본인이 원하는 Product Name을 입력한다. 그리고 선택지 하단에서 User Interface의 기본값인 SwiftUI를 Storyboard로 변경해 준다. 필자의 캡처 화면은 이미 웹뷰앱 설정이 끝난 상태여서 뭔가 파일이 많다. 하지만 중점은 ViewController 파일. ViewC

[Xcode] 웹앱 빌드 시 Unable to log in with account '[email protected]'에러 해결 [내부링크]

앞서 Xcode에서 웹앱 빌드 방법을 다뤘고 마지막 단계 빌드 시 자주 발생하는 문제가 있다. The operation couldn’t be completed. Unable to log in with account '[email protected]'. The login details for account '[email protected]' were rejected. 하여튼 reject 됐다는 얘기다. 분명 작업하고 있는 맥북에서 Xcode는 개발자 계정으로 로그인했고, 계정도 Apple Developer 관련 정책에 의거해서 비용을 지불하는 개발자 팀에 속해있는데... 여기서 다시 한번 사용하는 계정이 진짜 로그인되어 있는지 체크가 필요하다. Xcode 상단 메뉴바에서 Preferences에 들어가준다. 위 사진에는 해결되어 있지만 처음에는 로그인이 쥐도 새도 모르게 풀려있었다. 다시 로그인해 주고 빌드 시 또 안되면 Manage Certificates에 들어가서 확인까지 해주고 Download Manu

[Xcode] 웹앱 디바이스에서 빌드 시 '신뢰하지 않는 개발자 앱' 설치 에러 해결 [내부링크]

필자는 웹앱 설정을 끝내고 맥이랑 연결된 디바이스에서 빌드를 실행했다. 아이폰 화면에 에러 메시지가 떴다. 어렵지 않다. 아이폰 설정 -> 일반 -> VPN 및 기기 관리 여기에 들어가면 이미 대기 중인 내 개발자 아이디가 보일 것이다. 아마 아이폰 설정의 로그인 계정이랑 Xcode 계정이랑 달라서 위와 같은 에러가 발생한 것 같다. 역시 애플은 보안에 상당히 철저하다. 하여튼 개발자 아이디를 클릭해 주고 설치 앱 '신뢰 설정'을 마치면 정상적으로 디바이스에서 빌드가 된다. +설치한 앱을 삭제하고 다시 빌드 하면 신뢰하지 않는 관련 에러가 다시 뜨니 주의하자.

[React] 웹 페이지 전환 시 자동으로 최상단 스크롤링 하기 [내부링크]

웹을 개발하는 도중 한 페이지에서 아래로 스크롤 하고 한 버튼을 클릭해 다른 페이지로 전환했다. 만약에 자동으로 상단으로 (혹은 원하는 위치로) 스크롤이 안되면 이는 유저에게 엄청 큰 불편함을 야기한다. 따라서 오늘은 이 문제를 해결한다. React로 하면 간단히 해결할 수 있다. import { useEffect } from "react"; const MainPurchase = () => { useEffect(() => { window.scrollTo(0, 0); }, []); useEffect 훅을 사용하여 MainPurchase.js에 진입했을 때 자동으로 위치 (0,0)으로 스크롤링 시킨다. 핵심은 window.scrollTo(xpos, ypos); 파라미터로 주어진 xpos는 x좌표, 즉 가로 위치를 말하는 것이고, ypos는 y좌표, 즉 세로 위치를 말하는 것이다. edhoradic, 출처 Unsplash

[IT 시사] 웹 3.0이 도대체 뭐길래? [내부링크]

작년 연말에 이런 이슈가 있었죠. 트위터 창업자 잭 도시, 테슬라 CEO 일론 머스크 등이 웹 3.0에 대한 비판적 의견을 트위터에 쏟아놓으면서 웹 3.0의 실체와 가능성에 대한 논쟁이 일었었습니다. 그럼 도대체 웹 3.0이 뭐길래 그렇게 떠들썩했고 심지어 유명 인사들까지 나와서 토론할 그 가치가 있었는지... 오늘 한 번 제대로 알아보도록 하겠습니다. 작년 트윗 내용 웹 3.0이 있다는 말은 즉 웹 1.0, 웹 2.0도 존재한다는 말입니다. (world wide web) 웹이 이렇게 앱 마냥 버전이 있는데 왜 하필 2.5도 아니고 3.0인지? 답은 '3.0' 이런 건 누가 정해놓은 것도 아니고 특별히 딱 경계가 있는 건 아닙니다. 어떤 흐름을 보면서 이 정도에서 새로운 변화가 시작됐으니 여기까지 1.0이라고 하자, 또 다음 변화는 한 2.0이라고 하자, 그리고 새로운 변화가 또 있으니 이걸 3.0이라고 하자~라고 사람들이 만든 분기점입니다. 웹 1.0 (1990~2004) 1990

[JS] 스크롤 할 때마다 쌓이는 log 해결하기 (setTimeout) [내부링크]

스크롤 할 때마다 쌓이는 로그를 해결 안 하면 이용자 체험을 저하시킬 수 있다. 사이트 사용 시 스크롤 때 버벅거리며 사이트가 이상한 건지 내 컴퓨터가 이상한 건지... 짜증을 유발하는 현상. 사실은 개발자 잘못이다. 오늘은 이 문제를 해결해 본다. 따라서 js throttle, npm react-fullpage 등을 참고했지만 결국 해답을 찾지 못했고 setTimeout을 통해 문제를 해결했다. const About = () => { let scrollable = true; }; useEffect(() => { scrollable = false; setTimeout(() => { scrollable = true; }, 500); e.preventDefault(); }; 전체 코드를 개제할 수 없지만 필요한 곳에 이렇게 넣으면 작동은 문제없다. 이제 사이트에 적용해서 결과를 보자. 사이트 일부와 콘솔 로그 이제 스크롤을 아무리 과하게 해도 setTimeout 덕분에 로그가 과하게 쌓

[JS] Container가 화면 양옆으로 안 채워지는 문제 해결 [내부링크]

반응형 웹페이지 설정 중 width를 줄이는데 좌측으로만 붙고 우측에서는 보이지 않는 흰색(벽)에 밀릴 때가 있다. 이러면 핸드폰 화면에서 웹 사이트를 켰을 때 아주 이상하게 나온다. 고치지 않으면 사이트 망하는 지름길. 오늘 야근으로 해결했다. 원인: 기존 Container 오로지 하나만으로 설정해서 그랬다. 해결: Container밖에 Container 하나를 더 씌워서(부모 컨테이너를 새로 만들어서) 부모 컨테이너에 width, height 설정,(100% 혹은 특정 px) position:relative 필수. (요소 자기 자신을 기준으로 배치) 반응형으로 @media (max-width: px){ height: ;}도 설정해 준다. 자식 컨테이너(기존 컨테이너)에서는 position:absolute 필수. (부모 요소를 기준으로 배치) width, height, top, left, transfrom: translate(-50%, -50%) 등등은 유연하게 설정하면 된다. 결

[Github] 깃허브의 기본 브랜치는 왜 main이며 또 어떻게 변경할까? [내부링크]

/*문장 끝에 2022.06.28 기준 내용 업데이트함*/ git과 github는 다르다. 전선과 창고 마냥 서로 다른 물건이다. github에서 저장소를 만들어본 사람은 알겠지만 기본 브랜치는 'main'이다. 왜 git의 기본 브랜치는 master이고 github은 main 인가. 이걸 모르고 git push origin master를 했다간 github 저장소에 master 브랜치가 뿅 하고 생긴 것을 볼 수 있다. (readme 파일은 main에 있고.) 원래 기본으로 main이 설정된다. 위 사진은 필자가 master로 변경한 후 사진. 다른 이유는 github이 2020년 10월 기본 브랜치를 main으로 변경했기 때문이다. main이 든 master든 이하 두 종의 방법을 제시한다. 1. main 브랜치 그대로 사용하기 git branch -M main master->main 브랜치 변경 (로컬) 그다음 commit -m "" git push -u origin main

[HTML] css, html 코드 작성 시 웹 브라우저에서 바로 확인하는 법(+시행착오) [내부링크]

vscode에서 html, css 코드를 작성하고 웹 브라우저에서 바로바로 확인하고 싶을 때가 있다. 그래서 html 브라우저에서 보기 찾아보면 대부분 이하와 같은 해결안이 나온다: **주의** 따라 하지 말 것, 끝나고 더 좋은 방법 소개** vscode 확장에서 open in browser를 설치하라고 하며, 기본 브라우저를 설정에서 크롬으로 바꾸고 윈도우 alt+b 맥 option +b를 html 파일에서 누르면 열린다. 혹은 우 클릭해서 선택하면 웹 브라우저에서 열린다. 그러면 나오긴 나온다. 하지만 여기에는 크나큰 패착이 있다. vscode에서 코드를 수정한 직후 웹 브라우저는 미동이 없다. 즉 우리가 코드 수정 -> 웹 브라우저 새로 고침 -> 코드 창 복귀 이런 생산성 떨어지는 짓을 해야 한다. 정말 말도 안 되는 일이다. **이하 해결법 제시.** Live server 설치 이제부터 따라 하면 된다. live server를 확장에서 설치. 그러면 html 파일에서 우

[CSS] flexbox (justify-content / align-items) [내부링크]

1. flexbox에서 box의 위치를 바꾸고 싶으면 부모 container가 display:flex를 달고 있어야 함. 2. flexbox css는 두 가지가 있음. 1) row (행) [horizontal] 2) column (열) [vertical] flex-direction: row가 기본값. 3. justify-content / align-items (position 속성) justify-content는 수평축에 있는 flex children의 위치를 변경. center/ space-between/ space-around 수평축 (main axis)에서 위치를 변경. main axis, cross axis를 항상 생각해야 한다. 위에서 말했듯이 지금 main axis 가 row인 상태에서, horizontal에서 바꾸려면 justify-content 사용. vertical에서 바꾸려면 align-items를 사용하면 된다. twitter @Pratham 앞서 말했던 flex

[CSS] :nth-child, align-self, order [내부링크]

1. :nth-child :nth-child() 의사 클래스는 형제 사이에서의 순서에 따라 요소를 선택합니다. 첫 시작은 0부터 시작하는 게 아닌 1, 즉 :nth-child(1)이면 첫 번째. //사용법 .child{ } .child:nth-child(1){ } //html에서 할당한 child 박스가 여러 있으면 그중에서 첫 번째 박스에 내용 부여. 2. align-self 앞서 언급한 :nth-child 안에 들어간다. 또한, align-self는 align-items (cross axis)처럼 동작. 3. order html을 수정할 필요 없이 order로 css에서 순서 부여.

[CSS] flex-wrap, align-content, flex-grow, flex-shrink, flex-basis [내부링크]

1. flex-wrap 먼저 flexbox를 다시 짚어본다. flexbox는 행과 열 형태로 항목 무리를 배치하는 일차원 레이아웃 메서드입니다. 항목은 부족한 공간에 맞추기 위해 축소되거나 여분의 공간을 채우기 위해 변형된다. section { display: flex; } 따라서 flexbox는 안에 요소의 크기가 얼마나 크든 모든 요소를 한 줄에 정렬하는 것을 목표로 한다. flexbox 만약 각각의 child container들이 기존의 크기를 유지하고 싶으면, 이를 해결하는 방법은 flex-wrap:wrap다. 우선 flex-wrap의 디폴트 값은 nowrap이다. wrap 하는 순간 child container들은 자신들의 원래 width를 유지할 수 있다. flex-wrap 2. align-content justify-content, align-items는 있지만 align-content는 무엇인가. 부모 컨테이너에 들어갔을 시 아래 사진과 같은 효과를 본다. align-

[Android Studio] 웹앱 만들기(Webview App) [내부링크]

먼저 웹앱이란, 웹페이지 즉 홈페이지와 같은 Web을 스마트폰 화면 크기로 줄인 것입니다. 따라서 본질은 웹 사이트지만, 결국은 '앱'인 셈입니다. 웹 사이트에서 수정한 내용은 그대로 웹앱에 반응이 되겠죠. 웹에 껍데기만 씌워서 만드는 앱이라고 생각하면 됩니다. 진행하는 중에 여러 예상치 못한 에러를 만났지만... 결국 마지막에 해결하고 잘 작동하는 것을 확인했습니다. 아래는 필자의 전체 작동 가능한 코드입니다. 버그 및 수정 내용은 다른 포스트에서 따로 다루고 이번에는 과정만 적겠습니다. 프로젝트 생성 file -> new -> new project -> empty activity -> Next 클릭 그러면 create new project 화면이 나옵니다. Name에 프로젝트명을 작성. 앱 이름은 나중에 작성하게 됩니다. Java 언어를 선택하고 Finish를 누릅니다. (아래부터 마지막까지 모자이크 된 부분은 필자의 프로젝트명입니다.) 위 두 파일은 이미 생성되어 있을 겁니다.

[Xcode] React Native 프로젝트명 변경 시 Xcode 빌드가 안되는 오류 해결 [내부링크]

프로그래밍 세계에선 다들 '작명'이 엄청 중요하다고 한다. 이 '작명'은 프로젝트명, 파일명 혹은 변수명을 뜻한다.(흔히 일반인이 윈도우 파일명 만들듯이) 어디서는 대문자, 어디서는 소문자를 사용할지 매뉴얼로 정하고, 참여하는 모든 개발자는 이를 준수해야 한다. 한 명이라도 실수하면 프로그램이 꼬이기 시작하고 이는 타인에게 엄청난 피해를 주는 행위다. 특히 앱 개발 쪽에는 프로젝트명을 처음부터 제대로 정하고 안 바꿨으면 한다. 흔히 파일명 바꾸듯이 쉽게 바꾼다고들 오해하는데 절대 아니다. 한 번 작명하면 이름이 바이러스 마냥 온갖 설정 코드, 프로젝트 파일, 인증서 등 장소에 박히며 처음 해보는 사람은 이를 어떻게 바꾸나... 한숨만 나온다. 특히 iOS가 보안에 민감해서 더 힘들다. 항상 처음 겪는 실수에 당황하지만 해결하는 자신을 보면 신기하다. 오늘은 필자를 이틀 동안 시험에 빠뜨렸던 오류를 소개한다. 사건의 발단 React Native로 앱 개발 중이었으며, 이미 원래 'be

[Xcode] .ipa 파일 생성 및 설치 한방에 해결 [내부링크]

.ipa 파일 확장자를 가진 파일은 iOS 앱 파일입니다. iPhone, iPad 또는 iPod touch 응용 프로그램을 구성하는 다양한 데이터 조각을 보관하기 위한 컨테이너 (예 : ZIP)로 작동합니다. 안드로이드는. apk, iOS는. ipa입니다. Archive 및 ipa 생성 먼저 프로젝트를 아카이브 해줍니다. Xcode-Product-Archive Xcode-Window-Organizer Distribute App 선택. 본인 상황에 맞는 배포 방식 선택. 필자는 이대로 default로 진행. Export. 이름과 저장 위치 설정. 파일 안에 들어가니. ipa 파일 생성. ipa 파일 iphone에 설치 Xcode > Window > Devices and Simulators를 선택합니다. ipa를 설치할 디바이스를 선택하고 INSTALLED APPS 하단 + 버튼을 선택합니다. 그러면 하단의 창이 나옴. 설치할 ipa 파일을 선택 후 Open을 선택합니다. 디바이스에 설

[Android] device (삼성폰)에서 log 확인하는 법 [내부링크]

삼성 휴대폰에서 특정 앱을 실행했을 때, 혹은 본인이 만든 앱을 테스트할 때, 종료되거나 예상과 다른 결과가 나올 때가 있습니다. 그러면 어떤 원인인지 파악해야 하기에 log를 확인해야 합니다. 안드로이드 휴대폰 log 추출 방법은 삼성) 통화 버튼 화면 -> *#9900# LG) 통화 버튼 화면 -> 3845#*모델명 숫자# 마지막 # 누르면 화면이 자동 전환된다. 진입. Run Dumpstate/logcat 을 눌러서 log 추출. 꽤 긴 시간이 걸린다. 성공. 이후에 Copy to sdcard를 눌러서 sdcard로 복사. log 폴더도 같이 생성. log 폴더 안으로 들어가준다. 방금 생성된 dumpState log 파일을 열어준다. 안에 시간대 별로 어떤 log가 있는지 나와있음. 이에 따라서 오류 분석 및 해결을 하면된다.

[IT 지식] 인터넷의 작동 원리? 어디서 출발하고 어디에 도착하는가. [내부링크]

눈에 보이지 않는 인터넷, 도대체 어디에서 시작되며 어떻게 작동되는 것일까요? 우리가 흔히 아는 검색 포털인 구글, 구글을 사용하려면 데이터 센터에서 데이터를 전송받아야 합니다. 구글 네트워크 한눈에 보기 데이터 센터 그러면 이 데이터가 어떻게 수십 킬로 떨어져 있는 핸드폰이나 노트북에 전송될까요? 위성? 데이터 센터에서 안테나를 통해 위성으로 신호를 전송한 다음, 위성에서 우리에게 가까운 안테나를 통해 신호를 전송하는 방식입니다. 하지만 딱 봐도 이런 어마어마한 거리를 움직이려면 우리가 한 사이트를 키는데 10초 이상은 걸리겠죠. 아니, 5초 안에 사이트가 안 켜지면 한국인은 못 참고 끌 것입니다. 사이트뿐만이 아닌 다운로드, 앱 구동, 키오스크 작동, 온라인 결제, 모든 방면에서 불편을 야기할 겁니다. 따라서 이 방법은 머스크 형님의 기술력을 기다려야 합니다. 광섬유 네트워크 데이터 센터와 장치 사이에 연결되는 광섬유 케이블의 복잡한 네트워크를 통해 이행됩니다. 광케이블 셀룰러

[IT 지식] 소프트웨어 라이선스 및 EULA는 무엇인가 [내부링크]

오늘은 소프트웨어 라이선스에 대하여 알아보겠습니다. 소프트웨어는 저작권에 의해 자신이 만든 소프트웨어를 다른 사람이 사용하지 못하게 하고 자신만이 사용할 수 있는 권리를 가지게 되며, 원칙적으로 이러한 권리자만이 소프트웨어를 사용, 복제, 배포, 수정할 수 있습니다. 소프트웨어 라이선스는 소프트웨어 자체에 대한 소유권과는 별개의 개념으로 소프트웨어를 '사용할 수 있는 권리'를 말하며 저작권자로부터 일정한 범위와 조건 안에서 소프트웨어를 사용할 수 있도록 허락받는 것을 말합니다. 우선 소프트웨어는 저작권에 따른 분류로 아래와 같이 나눠볼 수 있습니다. 상용소프트웨어: 금액을 지불하고 사용권을 구매 프리웨어: 프리하게 자율적으로 사용 가능한 소프트웨어 (상업용 목적은 경우에 따라 다름) 쉐어웨어: 사용기간/기능 등에 제한을 두는 소프트웨어 (ms office 30일 사용 버전) 공용 소프트웨어: 법적으로 제약을 받지 않는 소프트웨어, 소스코드 포함 배포 번들소프트웨어: PC 구매 시 O

[HSK] 2022 HSK7-9급 시험 따끈따근한 후기! [내부링크]

안녕하세요. 오늘은 HSK7-9급 모의테스트 시험 후기를 적어보겠습니다. 먼저 필자에 대해 간단 소개를 하자면 hsk6급 280, tsc8급 정도입니다. 본인의 중국어 실력에 자신 있었고 딱히 시험 대비용으로 준비할 필요성도 못 느꼈으며 어디 가서 중국어로 말하면 외국인 티는 안 나는 수준입니다. 이하 내용은 그냥 '이런 수준의 사람이 이렇게 느꼈구나~'로 봐주시면 됩니다. 시험은 오전(듣기, 독해, 작문)/ 오후(말하기)로 나눠졌으며 시험 구성 및 내용은 정말 좋았습니다. 첫인상은 이번이 7-9급 통합 시험이어서 그런지 문제 난이도가 뒤죽박죽이었습니다. 어떤 문제는 '기존 6급이 조금 노력하면 되겠는데'싶은가 하면 어떤 문제는 정말 정말 어려웠습니다. 기존 hsk6급의 문제점은 '객관식 위주'였으며 항상 주어진 정답만을 찾는 게 핵심이었습니다. 그리고 '개인 실력 차는 나지만 점수 차는 나지 않는다'였습니다. 자기 생각을 중국어로 논리 있게 표현하지 못하는 사람도 240~280점

[Python] 1분씩 증가하는 datetime 만들기 [string to datetime(strptime), datetime to string(strftime)] [내부링크]

csv 파일로 시계열 데이터 관련 작업을 하다 보면 날짜가 문자열 형식인 것을 발견할 수 있다. 만약에 1분 단위, 1시간 단위 ... 이렇게 점진적 증가하는 데이터를 for 혹은 while 문으로 반복 요청해서 가져오고 싶으면 이런 문자열을 datetime 형식으로 변환해야 한다. string -> datetime from datetime import datetime from datetime import timedelta import time #사용할 것 같은 라이브러리는 장고하지 말고 싹 다 import해줍니다. datetime_string="2021-05-18 11:30:00.000" #문자열 형식 날짜 datetime_format="%Y-%m-%d %H:%M:%S.%f" #변환할 format을 설정해준다. #참고로 format형식에 "%Y년-..."으로 하면 "2021년-..."이 된다. datetime_result=datetime.strptime(datetime_string

[중국 시사] '게으른 소비자' 덕분에 일어난 경제 발전 [내부링크]

역사적으로 인류는 ‘게으름’으로부터 새로운 아이디어가 나왔고 ‘게으름’을 해결하기 위해 새로운 시장을 개척했습니다. 게으름은 인류 문명 발전의 원동력 저는 산술이 너무 귀찮고 사람도 게을러서 '컴퓨터'라는 것을 발명했습니다. -세계 최초의 컴퓨터를 발명한 존 빈센트 아타나소프. 그리고 현대 사회에 들어서면서 걷기가 너무 귀찮아 '자동차'를 발명했고, 계단 타기가 귀찮아 '엘리베이터'가 만들어졌으며, 오프라인 매장까지 가기 귀찮아 '온라인 쇼핑'이 생겼습니다. 또한 우리는 게으름을 효율적으로 관리하기 위해 스마트폰 앱을 다운로드하고 개발자가 만들어준 알고리즘을 통해 단순 몇 번 클릭이면 자신이 하고 싶은 일을 할 수 있습니다. 중국의 '게으름 경제' 대한민국은 값비싼 인건비 때문에 배달업이 작년, 재작년에 비해 올해는 순식간에 죽은 감이 있습니다. 1회 소비자 부담 배달료가 기본 3000원, 심지어 피크타임은 5000까지도 올라가죠. 국민 음식인 치킨은 2만 원 돈 없으면 배달 주문은

[Python] 문자열 formatting 방법 3종 한 방에 정리 [내부링크]

오늘은 파이썬 문자열 포매팅 방법에 대하여 알아보겠습니다. 이는 문자열 중간중간에 특정 변수의 값을 넣어주기 위해서 사용하는 것입니다. 예를 들어 우리가 구구단 프로그램을 만들다 보면 print('2 x 3 = 6') 이런 식으로 하드 코딩으로 문자열을 만들지 않습니다. 2도 변수, 1도 변수, 걸과 값인 6도 변수로 사용되고 있을 텐데, 이런 형태의 문자열을 포매팅 해서 문자열을 이쁘게 재사용하도록 하는 것입니다. 방법은 총 3종이며 이 포스팅을 끝까지 보시면 어떤 방법을 사용해야 하는지 딱 감이 오실 겁니다. % 서식 문자 % 서식 문자의 모양은 % 기호 뒤에 자료형을 가리키는 문자가 옵니다. 1. 문자열, 정수, 실수를 %로 포매팅 해보기 %s -> 문자열 %d -> 정수 %f -> 실수 # % 기호 문자 출력 names = ['Tony', 'to', 'do'] for name in names: print('my name is %s' % name) my name is Tony

[Python] 문자열 좌, 우, 가운데 정렬하기 [내부링크]

가끔 print된 문자열을 보면 딱 좌, 우 혹은 가운데로 정렬이 되고 나머지 빈칸은 공백으로 처리되는 것을 볼 수 있습니다. 왼쪽 정렬에는 기호 <를 사용하고, 오른쪽 정렬에는 >, 가운데 정렬에는 ^를 사용합니다. 기호 뒤에 나오는 숫자는 자릿수를 말합니다. 즉 아래와 같습니다. {0:<10} 이 뜻하는 것은 {0} 값을 ":<10" 10자리로 표현할 건데 왼쪽 정렬을 할 것이다~라는 뜻이고 {1:>5} 가 뜻하는 것은 {1} 값을 ":>5" 5자리로 표현할 건데 오른쪽 정렬을 할 것이다~입니다. # 왼쪽 정렬 s9 = 'this is {0:<10} | done {1:<5} |'.format('left', 'a') >>>print(s9) this is left | done a | # 오른쪽 정렬 s10 = 'this is {0:>10} | done {1:>5} |'.format('right', 'b') >>>print(s10) this is right | done b | # 가운

[Python] Faker 라이브러리로 가짜 데이터 생성하기 [내부링크]

pandas에서 배웠던 것처럼 dataframe을 만드는 걸 배웠지만 급하게 특정 column으로 테스트 데이터가 필요할 때가 있다. faker는 가짜 데이터를 생성할 때 사용하는 라이브러리이다. !pip3 install Faker 설치한다. from faker import Faker fake = Faker() >>>fake.name() 'David Walker' fake = Faker('ko-KR') >>>fake.name() '최민수' >>>fake.address() '강원도 화성시 가락5로 (영자김마을)' test_data = [(fake.name(), fake.address()) for i in range(30)] >>>test_data [('김도현', '전라남도 진천군 언주6가'), ('고정희', '울산광역시 중랑구 반포대0로 (영희최면)'), ('이종수', '경기도 서산시 역삼길'), ('황지후', '제주특별자치도 충주시 압구정거리'), ('오건우', '인천광역시 영등포구

[Python] 로또 번호 생성 프로그램 구현 [내부링크]

이제 Python에 어느 정도 익숙해졌으니 일상생활에서 보이는 전산 시스템, 사회 기능들을 차근차근 구현해 보려고 한다. 로또 번호 생성은 python의 random 모듈만 사용할 것이다. 아직은 단순 돈 입력 -> 1000원당 1줄 -> 로또 번호 랜덤(자동) 생성 -> 출력이며 나중에 더 복잡한 로직으로 구현 가능하면 돌아와서 업데이트하겠다. 우선 결과물: 5000원을 입력하면 5줄이 나온다. 한 줄 숫자 6개는 서로 중복이 안되며, 오름차순으로 정렬해서 나온다. 여기서 사용된 기법을 하나씩 알아본다. 1. python def 함수명 def 함수명(매개변수): <수행할 문장1> <수행할 문장2> ... def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있다. 함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다. 이렇게 함수를 정의한 다음 if, while, for 문 등과 마찬가지로 함수에서 수행할 문

[IT 지식] 왜 내가 받은 파일의 글자가 깨져있을까? (인코딩 정리) [내부링크]

인코딩이란 우리가 다운로드한 파일의 문자가 깨졌을 때, 음악파일이나 동영상 파일을 재생할 수 없을 때 비로소 접하게 되는듯하다. 컴퓨터에서 인코딩은 동영상이나 문자 인코딩뿐 아니라 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정을 통틀어 일컫는다. 과거에는 한숨 쉬고 그냥 넘어갔던 현상. 이제 해결한다. 문자 인코딩 그중 문자 인코딩은 글자를 어떤 코드표로 매핑 시켜놓은 것을 말한다. 어떤 데이터를 받고 내 컴퓨터에서 열어봤는데 위 사진처럼 문자가 깨져서 온 적이 있을 것이다. 이는 상대방이 보낸 데이터의 인코딩 방식과 내 컴퓨터에서 설정된 인코딩 방식이 다르기 때문이다. 인코딩이 다르다는 것은 표현하려는 동일한 문자에 대해 매핑된 코드표의 값(ID)이 다르다는 것을 의미한다. utf-16be vs utf-8 그렇다면, 왜 하나로 통일하지 않고 여러 인코딩을 두는 것일까? 이유는 데이터를 전송할 때 데이터의 크기를 줄여 최대한 빠

[Jupyter] Jupyter notebook에서 변수 확인 창 띄우는 법 [내부링크]

변수를 지정하고 작업을 하다 보면 나중에 가서 변수에 어떤 데이터가 들어가 있는지 확인하고 싶다. jupyter notebook은 spyder와 다르게 변수 창이 없으니 알아서 설정해야 한다. 방법 1. 변수 설정 후 whos 명령어로 확인할 수 있다. 하지만 변수 변경 후 변경한 내용이 실시간으로 반영 안되고 꼭 해당 셀을 다시 실행해야 한다. pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user jupyter nbextension enable varInspector/main 해당 3줄을 실행. 위 사진에서 오른쪽에서 두 번째 키보드 버튼을 누른다. 그럼 아래 사진처럼 변수 창이 jupyter notebook에 뜬다. 변수 변경이 실시간으로 해당 창에 반영된다.

[Jupyter] notebook/ lab 테마 변경 [내부링크]

먼저 jupyter notebook 변경. pip install jupyterthemes jt -l 설치된 테마 확인. jt -t onedork 'onedork'라는 테마로 변경. 확인 완료. jupyter lab은 자체 테마 메뉴가 달려있다.

[jupyter] Anaconda에서 jupyter notebook 브라우저로 안 열리는 현상 문제 해결 [내부링크]

위 사진에서 보이는 것처럼 Launch 실행 시 워드패드가 열린다. 비록 안에 url을 복사해서 브라우저에 붙여넣기 하면 열리지만 필자가 원하는 것은 Launch 한 방에 브라우저에서 열리는 거다. 아무리 찾아봐도 인터넷에 해당 문제를 겪은 사람이 없었기에 해결 해본다. notepad .jupyter/jupyter_notebook_config.py c.NotebookApp.browser을 찾는다. 본인의 chrome.exe 경로를 붙여 넣는다. 혹시 경로를 모르겠으면 chrome 우 클릭 -> 설치 경로 확인하면 된다. c.NotebookApp.use_redirect_file = True 중 True를 False로 바꿔준다. 이제 설정 -> 앱 -> 기본 앱 -> 웹 브라우저를 Chrome으로 바꿔준다. jupyter notebook을 지원하는 브라우저다. 그리고 이미 Chrome으로 되어있어도 다시 한번 눌러서 적용시켜 보길 권장한다.

[IT 정보] 2022 프로그래밍 연습 사이트(코딩 테스트) [내부링크]

1. 프로그래머스 https://programmers.co.kr/skill_checks 스킬 체크 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 코딩 테스트 연습, 개발자 채용, SQL 고득점 Kit, 프로그래밍 강의 제공. 2. 정올 (정보 올림피아드) JUNGOL http://www.jungol.co.kr/ JUNGOL www.jungol.co.kr JUNGOL(정올)은 (주) 한컴 에듀케이션이 운영하는 컴퓨터 프로그래밍 알고리즘 문제 풀이 서비스를 제공해 주는 웹사이트이다. 가장 큰 특징은 한국 정보 올림피아드(KOI)의 역대 기출문제를 모두 게시하고 있어 기출문제를 풀어보는 데 도움이 된다는 것과, 사이트 전용 교재인 자기 주도 C언어 프로그래밍을 통하여 기초를 다지기 쉽다는 것이다. 또한 컴스쿨을 통해 다양한 문제의 풀이를 인강으로 들을

[Python] argparse를 사용하여 인자 값 추가하기 [내부링크]

이번에는 Python 실무적인 내용을 다뤄보겠다. 시계열 데이터를 예측할 때 호출 당시 인자 값을 줘서 동작을 다르게 하고 싶은 경우가 있다. 이때 Python 내장 함수인 argparse 모듈을 사용하면 커맨드 라인 인터페이스(Command-line Interface, CLI)에서 인자 값만 변경하여 test 할 수 있기 때문에 업무 효율을 대폭 상승시켜 Python에 있어서는 필수 of 필수적인 역량이다. import argparse #instance 생성 parser = argparse.ArgumentParser(description = "data prediction") #입력 받을 인자 값 등록 parser.add_argument("-cp", "--cpath", default = "csvfile 경로/csv_file.csv", help = "csv data path") parser.add_argument("-d", "--predictdate", default = "2022-0

[Python] requests 라이브러리로 서버에 요청 및 응답하기 [내부링크]

Requests 라이브러리는 해당 주소로 요청을 보내면 응답을 받도록 해주는 HTTP 클라이언트입니다. 일반적으로 Python으로 로직을 작성해놓고, DB를 관리하는 서버에게 요청을 할 때 사용됩니다. pip3 install requests 패키지 설치가 잘 됐는지 확인하기 $ python >>> import requests >>> requests.get("https://www.naver.com") <Response [200]> # 응답코드200, 정상적으로 응답 중. import requests #사용 시작 HTTP method GET, POST, PUT, DELETE, OPTION을 요청할 수 있습니다. >>> r = requests.get('https://blog.naver.com/lifeyun24', param = {'key':'value'}) >>> r = requests.post('https://blog.naver.com/lifeyun24', data = {'key':'v

[Pandas] (2022) 데이터 인덱싱, 선택 및 할당하기 [내부링크]

pandas 기초 편에 이어서 오늘은 DataFrame에서 데이터 인덱싱, 선택 및 할당을 알아보겠습니다. import pandas as pd train=pd.read_csv('train.csv') train 사용할 데이터는 Kaggle의 타이타닉 생존자 파일 중 'train.csv'. train.Name 이렇게 하면 해당 column을 전체 가져오기. train['Name'] 둘 다 똑같지만 다른 방법으로 'Name' column을 가져왔다. 문서에서는 두 번째 [ ] 방법을 추천하며 그 이유는 바로 : #1 train['Name'][0] #'Braund, Mr. Owen Harris' #2 #만약 두개 이상의 단어로 조합된 column명이 있을 시 train.ticket price #error train['ticket price'] #pass index 기반의 select 주로 loc와 iloc를 사용한다. loc: location iloc: index location 이제부터

[Pandas] (2022) 데이터 인덱싱, 선택 및 할당하기 exercise 오답노트 [내부링크]

이런 데이터를 사용한다. 문제: df = reviews.iloc[[0,1,10,100],["country","province","region_1","region_2"]] .iloc를 사용하면 column으로 문자열을 불러올 수 없다. 그래서. loc를 사용. 만약에 나는 어떻게든 iloc를 사용해야겠다. 그러면 column도 몇 번째 column~ 형식의 숫자 index로 불러와야 한다. # 다섯 번째 불러오기 df=reviews.iloc[[0,1,10,100],[4]] iloc , loc #iloc는 python의 slice적용. df.iloc[0:1000] #will return 1000 entries df.loc[0:1000] #will return 1001 of them Conditional selection 파트는 문법 주의가 필요하다. reviews.loc [ (reviews.column=='string' or int64 ) & or | (reviews.column.isi

[Mac] 맥북과 아이패드를 오가는 마우스?! 유니버설 컨트롤 설정! [내부링크]

오늘은 사과 농장을 보유하고 있는 분들을 위한 혹은 향후 사과 농장을 꾸려갈 분들을 위해 apple의 혁신적인 기능을 소개해 드리겠습니다. 그것은 바로 유니버설 컨트롤(Universal Control)입니다. 그 핵심 기능은 "단 하나의 트랙패드/마우스/키보드로 여러 Mac과 Pad를 동시에 제어할 수 있다." 마치 듀얼 모니터처럼 마우스가 화면 끝까지 이동하면 Mac -> iPad로 마우스가 넘어가는 경험을 하실 수 있습니다. 맞습니다. iPad에서 마우스를 사용합니다. 이제부터 요구 사항과 설정을 진행해 보겠습니다. 하드웨어 / 소프트웨어 하드웨어: -Macbook& Macbook Pro(2016 이상) -Macbook Air(2018 이상) -iMac(2017 이상, 5K 27inch 2015말) -iMac Pro& Mac mini (2018 이상) -Mac Pro(2019) -Mac Studio -iPad Pro( 모든 모델) -iPad Air(3세대 이상) -iPad(6세대

[빅데이터] 공공 데이터 사이트 모음 [내부링크]

KOSIS 국가 통계 포털 https://kosis.kr/index/index.do KOSIS 국가통계포털 검색어삭제 자동완성 열기 # 인구 # 1인가구 # 국내총생산 # 코로나 # 사망원인 추계인구와 주민등록인구의 차이는 무엇입니까? 오른쪽으로 스크롤하면 표 내용을 확인할수있습니다. 추계인구 (´ 22) 292 만명 출생아수 (´ 21) 14,758 명 합계출산율 (´ 21) 0.810 명 사망자수 (´ 21) 18,005 명 기대수명 (´ 20) 4.5 세 관심지표설정 고용 2022년 03월 기준 물가 2022년 03월 기준 산업 2022년 02월 기준 1 2 3 이전 다음 취업자수 27,754 천명 고용률 61.4 % 실업률 3.0... kosis.kr 국가통계포털(KOSIS, Korean Statistical Information Service)은 국내·국제·북한의 주요 통계를 한곳에 모아 이용자가 원하는 통계를 한 번에 찾을 수 있도록 통계청이 제공하는 One-Stop 통계

[중국 시사] 중국 청년은 정말 공산당을 좋아할까? [내부링크]

2022년의 지구는 2개의 세력이 대립하고 있습니다. 미국과 중국. 미국의 세력이 닿는 곳은 중국에 대한 온갖 비방과 부정적인 뉴스만 내보내고 중국 및 중국의 '일대일로' 세력은 미국의 만행, 미국 사회 불안정 등을 뉴스거리로 삼고 있습니다. 당연한 이야기입니다. 그래서 우리는 중국이 '메이드 인 차이나 2025'선언 이후 급속도로 가속화된 IT 기술의 발전, 개혁개방 이후의 경제 발전을 보지 못하고 맨날 뉴스에서 부정적인 소식만 접하게 됩니다. 즉, 우리가 배우고 싶으면 알아서 찾아봐야 합니다. 현재 우리 한국 사회는 '반중' 분위기를 주로 이루고 있습니다. 주위 친구, 직장 동료, 뉴스 댓글 등만 봐도 파악할 수 있죠. 대부분 동북공정, 한한령 등을 주도한 중국'공산당'에 대한 불만입니다. 그럼 인터넷 사용에 익숙하고, VPN(선로 우회)을 사용해 해외 소식을 접할 수 있는 중국 청년들은 자기 정권을 어떻게 생각할까요? 먼저 중국 공산당이 중국 청년들 (1990~ )에게 어떤 이

[Pandas] (2022) 기본 기능 정리 (Object creation, Viewing data, Selection) [내부링크]

Object creation, Viewing data, Selection. import numpy as np import pandas as pd 객체 생성 Series 생성: s = pd.Series([1, 3, 5, np.nan, 6, 8]) s Out[4]: 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64 날짜/시간 인덱스와 레이블이 지정된 열이 있는 NumPy 배열을 전달하여 DataFrame 만들기: dates = pd.date_range("20130101", periods=6) dates Out[6]: DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D') df = pd.DataFrame(np.random.randn(6, 4), index=dates,