dev-blackcat의 등록된 링크

키자드에 등록된 총 721개의 포스트를 확인하실 수 있습니다.

Naver Blog

[React] 리엑트 css-loader, style-loader 설치하기

css-loader 설치 # "css-loader", "style-loader"는 "Webpack"에서 "css" 파일을 읽어 번들링 해주는 것이다. # 설치 npm i css-loader style-loader --save-dev # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : { path : path.resolve(__dirname, 'dist'), filename : 'code.bundle.js' }, module: { rules: [ { test: /\.js$/, use: "babel-loader" }, // 아래 코드 부분을 추가 { test: /\.css$/, use: ["style-loader",

Naver Blog

[React] 리엑트 Scss(Sass) 설치하기

Scss(Sass) 설치 # 설치 npm install --save-dev sass sass-loader mini-css-extract-plugin # 설치 후 프로젝트 최상위 디렉토리에 "webpack.config.js" 파일을 만든 후 아래 내용을 적용 ("webpack.config.js" 파일이 이미 있는 경우는 수정) const path = require('path') module.exports = { entry : './src/code.js', output : { path : path.resolve(__dirname, 'dist'), filename : 'code.bundle.js' }, module: { rules: [ { test: /\.js$/, use: "babel-loader" }, // 아래 코드 부분을 추가 { test: /\.css$/, use: ["style-loader", "css-loader", "sass-loader"], }, ], }, optimiza

Naver Blog

[React] 리엑트 PostCSS 설치하기

PostCSS 및 PostCSS Short 설치 # "postcss" 설치 npm install --save-dev postcss-loader postcss # "postcss-short" 설치 npm i postcss-short -D ※ PostCSS Short은 CSS를 작성하는 속도를 향상시켜주는 유용한 PostCSS 플러그인입니다. Webpack 적용 # 프로젝트 최상위 디렉토리에 "postcss.config.js" 파일 생성 후 아래 내용 추가 module.exports = { plugins: [ [ "postcss-preset-env", { browsers: "> 5% in KR, defaults, not IE < 11", // CSS Grid 활성화 [false, 'autoplace', 'no-autoplace'] autoprefixer: { grid: "autoplace" }, }, "postcss-short", { prefix: "x", skip: "-" }, ],

Naver Blog

[Python] Ubuntu 18.04 파이썬 관련 패키지 전체 설치하기

파이썬 관련 패키지 설치 # 간혹, 특정 패키지 설치시 오류가 날때가 있을것이다. 그것을 미리 방지하기 위해서 아래 명령어로 관련 패키지를 모두 설치해주면 된다. sudo apt -y install build-essential autoconf libtool pkg-config python-opengl python-pil python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev libssl-dev python3-dev python3-venv python3-setuptools python-setuptools libpq-dev psycopg2 error 발생시 sudo apt -y

Naver Blog

[Nginx] Ubuntu 18.04 Nginx 자동실행 설정

Nginx 자동실행 설정 # 실서버든 도커든 방법은 동일합니다. 루트(기본) 폴더에서 ".bashrc" 파일을 열어줍니다. cd sudo vi .bashrc # 맨 하단으로 이동 후 아래 명령어 입력 후 "wq"로 저장 sudo service nginx start # 이렇게 설정하면 시스템 재시작시 자동실행됩니다.

Naver Blog

[Docker] Docker-Compose nginx를 통한 내부 네트워크망(networks) 이용 방법

docker-compose.yml # 하단의 내용은 "docker-compose.yml"을 설명하기 위한 예시 입니다. 현재 아래의 도커 컴포즈 자세한 사용법은 구글링을 통해 진행하면 됩니다. 여기서 중요한 부분은 네트워크를 통해 브릿지하여 어떻게 내부망으로 통신하느냐 문제입니다. 하단에 보시면 각 "frontend", "backend" 네트워크망을 "webnet"이라고 이름을 정하였고 맨 하단에 "networks"쪽에서 driver를 "bridge"로 설정하였습니다. 이렇게 도커컴포즈를 실행시키면 "sudo docker networks ls"를 통하여 "webnet"이라는 네트워크망이 추가됩니다. ※ 만약, 네트워크를 설정하지 않았다면 현재 도커컴포즈를 실행하는 디렉토리 폴더 이름 및 사용자 이름(ubuntu)를 이용한 "ubuntu_default"으로 생성됩니다. version: "1.0" services: frontend: image: [프론트 이미지] ports: - "80:

Naver Blog

[Flutter] 플러터 GetX 파이어베이스 인증 예제

GetX Flutter Firebase Auth Example GitHub - delay/flutter_starter Contribute to delay/flutter_starter development by creating an account on GitHub. github.com # 위의 예제는 GetX를 활용한 파이어베이스 인증 예제 입니다. 메모용 게시글 입니다.

Naver Blog

[Flutter] 플러터 GetX 스트럭쳐(Structure) 구조

GetX Pattern Structure in modules 이름 설명 Model 객체에 대한 모든 모델 클래스를 그룹화한 디렉토리 Providers 데이터 Provider(API or Database)를 그룹화한 디렉토리 Repository 단일 데이터 액세스 포인트이며 엔티티를 추상화함 Data 데이터와 관련된 모든 것(Repository, Providers)를 저장하는 디렉토리 Controller 컨트롤러는 비즈니스 로직, 상태 변경에 대한 책임만 있음 이벤트를 포함하는 Observable(.obs)을 생성하는 곳 UI 유저가 보는 위젯, 애니메이션, 텍스트, 테마 등이 있는 디렉토리 Routes Routes 관리를 담당하는 파일이 있는 디렉토리 Binding Dependency Injection을 분리하는 클래스 상태 관리자 및 Dependency 관리자로 라우팅 됨 # "GetX Pattern"에서 제안하는 "GetX"를 사용하는 프로젝트(디렉토리) 구조는 "Package"

Naver Blog

[Flutter] 플러터 json.encode 와 jsonEncode 차이점

차이점 # 우선은 둘다 사용해도 무난합니다. 어떠한 기능적인 문제가 있는것이 아닌 "json"이라는 변수이름을 자주 사용하고 또한 충돌되는 경우가 있기 때문에 "json.encode" 대신 "jsonEncode"를 사용하는것이라고 합니다. 참고링크 What is the difference and preferred way between jsonEncode() and json.encode() in Dart? In Flutter doc, it uses jsonEncode(), while in Angular doc, it uses json.encode(). What is the difference and preferred way between the two? stackoverflow.com

Naver Blog

[javascript] MIME-TYPE 및 Accept 엑셀(Excel) 파일 불러오기 확장자 (정정)

폼 파일 확장자 문제 # 한컴오피스 및 마이크로소프트 엑셀의 확장자가 다릅니다. 그래서 아래와 같이 설정해주면 됩니다. accept=".xlsx, application/haansoftxlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, application/vnd.msexcel"

Naver Blog

[Flutter] 플러터 GetX 컨트롤러 메모리 지우기

컨트롤러 메모리 지우기 # "GetX"에서 바인딩을 한경우에는 원래 자동으로 메모리를 지워준다. 하지만, "StatefulWidget"에서 상단에 "final SignInController controller = Get.find();" 이런식으로 컨트롤러를 선언해주면 메모리에서 자동으로 지우지 않는다. 이런 경우 상태관리 특성상 페이지 이동 후 되돌아 왔을때 초기화면이 되어야 하는 경우가 있기에 별도로 초기화를 해줘야 한다. 아래 처럼 "dispose"에 컨트롤러를 강제로 삭제해주면 된다. @override void dispose() { Get.delete<컨트롤러이름>(); } LazyPut 사용시에는 Fenix 옵션 넣기 Differences between methods | Flutter GetX Overview chornthorn.github.io # "LazyPut" 사용시에는 옵션에 꼭 "fenix: true"를 넣어줍시다. 간단하게 화면변경시 데이터를 날린다고 보면 된다.

Naver Blog

[Flutter] 플러터 ListView와 ListView.builder 차이

차이점 # "ListView"은 기본적으로 스크롤이 가능한 배열형 위젯 입니다. "ListView" : 소수의 리스트를 보여줄때 적당하다. "ListView.Builder" : "LazyList" 방식으로 좀 더 많은 데이터를 보여줄때 사용하면 된다. 참고링크 ListView vs ListView.builder 차이점 ListView: Creates a scrollable, linear array of widgets from an explicit List. This constructor is appropriate for list views with a small number of c velog.io

Naver Blog

[Flutter] 플러터 Wrap 위젯

Wrap 이란? # 줄과 행에 공간이 부족할 때는 Wrap을 사용해 보세요! Wrap 위젯은 자식을 줄이나 행으로 배치하고 공간이 부족해지면 자동으로 줄이나 행을 바꿔줍니다. 방향, 정렬, 그리고 공간 속성기능이 여러분이 원하시는 디자인을 그대로 만드는 데 도움이 될 것입니다. 플러터에서 기본적으로 많이 사용되는 레이아웃 위젯 Container, Row, Column, Wrap 사용방법 # "Wrap"을 사용하면서 "children" 항목에 "List.generate"를 사용할 수도 있습니다. Wrap( direction: Axis.horizontal, alignment: WrapAlignment.center, runAlignment: WrapAlignment.center, spacing: 5, runSpacing: 0, children: List.generate( controller.certifyList.length, (_) => Row( children: [ Icon( contr

Naver Blog

[Flutter] 플러터 SingleChildScrollView와 ListView 차이점(수정)

차이점 # "ListView"의 특징 - 표시되지 않는 경우에도 목록의 모든 항목을 렌더링합니다. "ListView.Builder"의 특징 - 화면에 보이는 항목만 렌더링합니다. - 즉, "Lazy" 형태라고 보면 됩니다. "SingleChildScrollView"의 특징 - "ListView" 와 동일하게 모든 항목을 렌더링합니다. - "ListView" 보다 유연합니다. - 다소 적은 컨텐츠의 경우에는 "ListView"와의 성능적인 차이가 없습니다. # 제가 내린 결론 "ListView"는 "SingleChildScrollView"과 동일하게 사용되며, "SingleChildScrollView"가 유연성이 더 높다고는 하나, 단일화된 페이지에서도 "ListView"를 사용해도 무방할것 같다. "ListView.Builder"는 데이터를 받고 출력할때 사용한다. 100개의 데이터를 받아서 보여줄때 한번에 렌더링 되기 보단 스크롤하면서 현재 보고 있는 화면이 나타날때 렌더링 되는것

Naver Blog

라이징스타 기준 공부 메모

https://risingstars.js.org/2021/ko JavaScript 라이징 스타 2021 2021년 JavaScript 백서. 프론트엔드, Node.js 프레임워크, React/Vue 에코시스템, 빌드 도구, 상태관리 등의 경향 risingstars.js.org https://github.com/google/zx GitHub - google/zx: A tool for writing better scripts A tool for writing better scripts. Contribute to google/zx development by creating an account on GitHub. github.com https://vitejs.dev/ Vite Vite Next Generation Frontend Tooling Get Started Learn More Instant Server Start On demand file serving over native ESM

Naver Blog

[목표] 2022 개발 UP 올해의 목표 (수정)

백엔드 2022년도에서는 백엔드는 현상 유지 및 써보면서 딥하게 조금씩 진행할 계획이다. Python PHP Node 기본기 다지기 목표 Rust - 나의 진영쪽에서 Rust를 다루지는 않을것 같으나, 워낙 명성이 자자하다보니 공부해보고 싶다. => 러스트는 올해 하지 않기로 했다. Dart - 플러터를 하면서 이미 기본적인것은 확인하였으나, 별도로 시간을 내서 다시 정독해볼 생각이다. Golang - 개인적으로 파이썬 대체제로 생각하는 부분이다. 크롤링 퍼포먼스만 봐도 고랭이 앞도적이다. 차후에 분명히 성능 이슈로 인하여 Golang이 필요할 것 같아서 기본기를 다질 예정이다. => Golang은 올해 하지 않기로 했다. Node.js NestJS - 올해 추가된 목표로 NestJS를 해볼 생각이다. - 기존에 Node로 프로덕트 까지 가본적이 없기 때문이다. 프레임워크 Laravel - 요즘 프로젝트에는 라라벨을 따로 쓰지는 않았다. - 가능하면, 개별 공부를 해야될것 같다. d

Naver Blog

[Flutter] 플러터 GetX Controller not close (컨트롤러가 자동으로 삭제 및 종료 되지 않을때) 해결 방법

원인 # 초기에 이 문제 때문에 정말 많이 헷갈렸습니다. 컨트롤러가 자동으로 닫히지 않으니 계속 이전 데이터를 불러왔기 때문입니다. "smartManagement: SmartManagement.onlyBuilder" 옵션에서 기본 옵션이 아닌 "SmartManagement.onlyBuilder"을 사용했기 때문 입니다. 해결방법 # "GetMaterialApp"에서 "smartManagement" 옵션이 "SmartManagement.onlyBuilder" 으로 되어 있다면, 기본 "SmartManagement.full" 으로 변경하거나, 삭제해야 컨트롤러가 사용되지 않을때 알아서 삭제해줍니다. 참고링크 getx/dependency_management.md at master · jonataslaw/getx Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies e

Naver Blog

[Flutter] 플러터 GetX route == ModalRoute.of(context)': is not true 오류 해결하기

원인 및 방법 # "Form" 위젯을 사용중이고 "FormKey"를 지정하였다면, 해당 컨트롤러가 닫히지 않은 상태 혹은 중첩된 상태에서 다른 라우터(Get.to 등등) 으로 이동하려고 하면 오류가 발생됩니다. 따라서, 특정 액션전에 "Form" 페이지외 다른 페이지 혹은 필요가 없어진 경우 컨트롤러가 해제되었는지 확인하여 강제로 해제하거나 플로우 순서를 바꾸어 해결하시면 됩니다. 결론은 "Form"에 "FormKey"가 해제되지 않은 경우에 발생한다.

Naver Blog

[S3] 버킷 정책 및 CORS 설정 (수정)

퍼블릭 버킷 설정 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::버킷이름/*" }, { "Effect": "Allow", "Principal": "*", "Action": [ "s3:ListBucketMultipartUploads", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::버킷이름", "arn:aws:s3:::버킷이름/*" ] }, { "Effect": "Allow", "Principal": "*", "Action": "s3:ListBucket

Naver Blog

[Flutter] java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available

해결방법 # JDK 버젼 문제로 인한 발생 설치된 JDK 경로를 직접 입력하여 키파일을 만들면 된다. "C:\Program Files\Android\Android Studio\jre\bin\keytool" -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 참고링크 [Flutter] java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available 계속 java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available라며 apk build가 되지 않는 상황이 발생. (debug는 문제없음) 확인해보니, JDK 버전과 관련이 있는 문제인 것 같다. flutte.. temphi20.tistory.com

Naver Blog

[Flutter] 플러터 안드로이드 배포 정리 (수정)

패키지명 체크 프로젝트에서 패키지명 "com.example.myapp" 형태를 찾아 모두 변경 "android\app\build.gradle"에서 확인 할 수 있다. 서명키(jks) 생성 Window keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key Mac / Linux keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 그외 오류는 아래 링크 참고 [Flutter] 플러터 Failed to read key key from store "android/app/key.jks" : Integrity check failed: Java 버전에 따른 옵션 추가 Java9 버전 부터는 "default storetype"이 "pcks12" 라... blog.naver.com

Naver Blog

[Flutter] 플러터 GetX Controller 체크박스 구현하기

Controller 외부데이터에서 받아온다면 "[].obs"만 해주면되고, "assignAll"을 이용하면 데이터 변경값을 감지합니다. RxMap<String, dynamic> isAllCheckBox = {"title": "전체 약관에 동의합니다.", "isChecked": false}.obs; RxList<dynamic> isCheckbox = [ { "title": "[필수] 이용약관".obs, "isChecked": false.obs }, { "title": "[필수] 개인정보 수집 및 이용 동의".obs, "isChecked": false.obs, }, ].obs; Ui # 전체 체크박스 CheckboxListTile( focusNode: controller.allCheckBoxFocusNode, controlAffinity: ListTileControlAffinity.leading, contentPadding: EdgeInsets.zero, title: Text( cont

Naver Blog

[Flutter] 플러터 이미지 캐시 사용하기

pubspec.yaml cached_network_image | Flutter Package Flutter library to load and cache network images. Can also be used with placeholder and error widgets. pub.dev 사용방법 # 매번 이미지를 다운로드 하지 않고 캐시하는 방법이 좋습니다. 성능이 낮은 기기 일수록 메모리 초과로 팅기는 현상도 없앨 수 있습니다. placeholder, progress indicator, imageBuilder 방식으로 사용 할 수 있으며, 위 링크를 참조하시면 됩니다. Container( width: 115, height: 115, child: CachedNetworkImage( imageUrl: "이미지링크", memCacheWidth: 500, memCacheHeight: 500, progressIndicatorBuilder: (context, url, downloadPro

Naver Blog

[Flutter] 플러터 GetX param Null check operator used on a null value (파람 데이터에 한글이 있을때)

해결방법 # 아래 처럼 한글은 인코딩을 별도로 해줘야 한다. 라우터 보낼때만 인코딩 하고 이후 컨트롤러에서 가져올때는 인코딩 안해도 된다. Get.toNamed("/search/house/${Uri.encodeComponent(데이터)}");

Naver Blog

[Flutter] 모바일에서 셰이더 컴파일 버벅거림 줄이기(수정)

SkSL로 실행 Example 모바일 앱의 애니메이션이 버벅거리는 것처럼 보이지만 처음 실행했을 때만 나타나는 경우 상당한 개선을 위해 Skia Shader Language(SkSL)로 캡처한 셰이더를 워밍업할 수 있습니다. 먼저, 아래 명령어를 통하여 앱을 실행시킵니다. # 실행시 flutter run --profile --cache-sksl # SKSL을 처음 실행하는 경우 flutter run --profile --cache-sksl --purge-persistent-cache 실행시킨 앱에서 데이터가 쌓일 수 있게 기능들을 모두 탭하여 확인합니다. 같은 터미널에서 "shift" + "m"을 눌러 대문자 "M"을 누르게 되면 해당 프로젝트 폴더에 "flutter_01.sksl" 이름 순으로 파일이 만들어 집니다. 빌드 위에서 "profile" 모드로 데이터를 쌓은 파일을 가지고 빌드하시면 됩니다. # AOS 빌드 flutter build appbundle --bundle-sks

Naver Blog

[Flutter] 플러터 앱 크기 측정하기

앱 크기 분석하기 analyze-size # 크기 분석 도구는 빌드할 때 --analyze-size 플래그를 전달하여 호출합니다. flutter build apk --analyze-size flutter build appbundle --analyze-size flutter build ios --analyze-size flutter build linux --analyze-size flutter build macos --analyze-size flutter build windows --analyze-size # 아래와 같은 오류 발생시 "--target-platform"을 지정해주면 됩니다. Cannot perform code size analysis when building for multiple ABIs. Specify one of android-arm, android-arm64, or android-x64 in the --target-platform flag. flutter bui

Naver Blog

[Flutter] 플러터 난독화를 통한 앱 크기 줄이기

난독화 # 기본적인 최적화 방법 1. 사용하지 않는 리소스 제거 2. 라이브러리에서 가져온 리소스 최소화 3. PNG 및 JPEG 파일 압축 4. 캐시 저장을 통한 메모리 최소화 # 코드 난독화는 사람이 이해하기 어렵게 앱의 바이너리를 수정하는 프로세스입니다. 난독화는 컴파일된 Dart 코드에서 함수 및 클래스 이름을 숨기므로 공격자가 독점 앱을 리버스 엔지니어링하기 어렵게 만듭니다. 현재의 난독화는 "Android/iOS/macOS"만 지원합니다. 난독화 하기 난독화 전 난독화 후 # 위에 난독화 전후를 비교하면 약 2MB 차이가 납니다. 앱 크기가 더 클 수록 차이는 더 분명하게 날것 같습니다. 하단, "/<directory>" 부분은 해당 프로젝트 경로를 입력해주거나 터미널로 해당 프로젝트로 이동하여 "./"으로 처리하면 됩니다. # APK 빌드 flutter build apk --obfuscate --split-debug-info=/<directory> # Appbundle

Naver Blog

[Flutter] 플러터 효과 사용시 SaveLayer() 호출되는 사례

필요할 때만 효과 적용 # SaveLayer()를 호출하면 오프스크린 버퍼가 할당됩니다. 콘텐츠를 오프스크린 버퍼에 그리면 이전 GPU에서 특히 느린 렌더 대상 전환이 트리거될 수 있습니다. 아래에 사항을 참고하여 부득이하게 필요한 경우에만 사용합니다. ShaderMask ColorFilter Chip - DisabledColorAlpha != 0xff인 경우 saveLayer()를 호출할 수 있습니다. Text - OverflowShader가 있는 경우 saveLayer()를 호출할 수 있습니다. 이미지에서 페이드인 효과 - "FadeInImage"를 활용하기 모서리가 둥근 사각형 - 클리핑 사각형을 적용하는 대신 여러 위젯 클래스에서 제공하는 borderRadius 속성을 사용

Naver Blog

[Flutter] 플러터 배터리 사용량 줄이기

16ms 만에 프레임을 만들고 표시 # 빌드 및 렌더링을 위한 두 개의 개별 스레드가 있기 때문에 빌드에 16ms가 있고 60Hz 디스플레이에서 렌더링에 16ms가 있습니다. 대기 시간이 문제인 경우 16ms 이하로 프레임을 빌드하고 표시합니다. 8ms 이하로 빌드되고 8ms 이하로 렌더링되어 총 16ms 이하임을 의미합니다. 프레임 누락(잔키 현상)이 우려되는 경우 각 빌드 및 렌더링 단계에 대해 16ms가 좋습니다. # 프로필 모드에서 프레임이 총 16ms 미만으로 렌더링되는 경우 몇 가지 성능 문제가 적용되더라도 성능에 대해 걱정할 필요가 없지만 가능한 한 빨리 프레임을 만들고 렌더링하는 것을 목표로 해야 합니다. 1. 프레임 렌더링 시간을 16ms 미만으로 낮추면 시각적으로 차이가 없을 수 있지만 배터리 수명과 열 문제가 개선됩니다. 2. 장치에서 제대로 실행될 수 있지만 목표로 하는 가장 낮은 장치의 성능을 고려하십시오. 3. 120fps 장치를 널리 사용할 수 있게 되면

Naver Blog

[Flutter] 플러터 최적화시 고려 사항

고려사항 1. 불투명도 - 애니메이션에서 사용하지 말것 - 대신, AnimatedOpacity 또는 FadeInImage를 사용 2. AnimatedBuilder - 애니메이션에 의존하지 않는 위젯을 빌드하는 빌더 함수에 하위 트리를 넣지 않기 - 이 하위 트리는 애니메이션의 모든 틱에 대해 다시 렌더링 됩니다. - 대신, 하위 트리의 해당 부분을 한 번 빌드하고 AnimatedBuilder에 자식으로 전달합니다. 3. 클리핑 및 모서리가 둥근 사각형 - 애니메이션에서 클리핑을 하지 말것 - 기존 위젯에서도 최대한 borderRadius를 사용할 것 - 가능하면 애니메이션을 적용하기 전에 이미지를 미리 잘라냅니다. 4. 화면에 표시되지 않는 경우 Column, ListView 피하기 - 빌드 비용을 피하기 위해 대부분의 자식이 화면에 표시되지 않는 경우 구체적인 자식 목록(예: Column() 또는 ListView())이 있는 생성자를 사용하지 않기 5. ShaderMask, Col

Naver Blog

[Flutter] 플러터 키보드 높이 실시간으로 가져오기

키보드 높이 구하기 # 키보드 높이 구하기 MediaQuery.of(context).viewInsets.bottom 참고영상

Naver Blog

[Flutter] 플러터 특정 함수 걸린시간 측정하기

Timeline # "startSync"와 "finishSync" 사이에 처리될 로직을 넣고 측정 할 수 있습니다. void test() { Timeline.startSync("test function start"); for(int index = 0; index < 10000; index++) { print(index); } Timeline.finishSync(); } ※ "profile" 모드에서 실행해야 성능지표 타임라인에 표시됩니다.

Naver Blog

[Flutter] 플러터 compute 쓰레드로 별도로 처리하기

쓰레드 사용 # 많은 데이터를 한번에 가져올때 UI가 버벅거리거나 움직이지 않는 현상이 발생될 수 있습니다. 이런 경우 "compute"를 이용하여 별도의 쓰레드를 만들어 처리하면 됩니다. # Bad Case // 응답 결과를 List<Photo>로 변환하는 함수. List<Photo> parsePhotos(String responseBody) { final parsed = json.decode(responseBody).cast<Map<String, dynamic>>(); return parsed.map<Photo>((json) => Photo.fromJson(json)).toList(); } Future<List<Photo>> fetchPhotos(http.Client client) async { final response = await client.get('https://jsonplaceholder.typicode.com/photos'); return parsePhotos(res

Naver Blog

[Flutter] 플러터 Shimmer 쉬머 사용에 대한 의견

다른 앱 비교 # 쉬머를 사용했을때 데이터를 불러올때 좋은 효과를 줄 수 있는것은 분명한것 같다. 하지만, 다른 여러 앱(안드로이드 등)들을 확인해봤을때 초기에 로딩 인디케이터를 보여주고 바로 데이터를 보여준다. 그래서 핸드폰에 설치되있는 많은 앱들을 켜서 확인해보았다. 쉬머가 없는 앱 - 카카오톡 - 카카오네비 - 케이뱅크 - 스마일페이 - 쿠팡 - 당근마켓 - 번개장터 - 헬로마켓 - 크몽 - 핀터레스트 - 핀다 - 뱅크샐러드 - 배달의민족 - 야놀자 - 점핏 - 네모 - 넷플릭스 - 쿠팡플레이 - 왓챠 - 웨이브 - 쿠팡이츠 쉬머가 있는 앱 - 토스 : 주식 탭에만 쉬머가 들어가 있다. - PASS : 금융, 이벤트 탭에만 쉬머가 들어가 있다. - 롯데카드 - 로켓펀치 - 숨고 - 스푼 생각보다 많은 앱에서 쉬머를 사용하지 않거나 일부분만 사용한다. 대체적으로 사용하지 않고 로딩 인디케이터만 보여주는 경우가 대부분이다. 쉬머를 사용해본 사람으로써 개인적인 의견으로 분석해보자면,

Naver Blog

[Flutter] 플러터 Gradle 버젼 변경하기 (Warning: Mapping new ns)

경고 문구 Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01 Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01 Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01 Warning: Mapping new ns http://schemas.android.com/sdk/and

Naver Blog

[Python] 파이썬 3.10 변경 및 추가된 사항

구조적 패턴 매칭 "switch"랑 동일하다 match "변수값": case ["quit"]: quit() case ["load", filename]: load_from(filename) case ["save", filename]: save_to(filename) case _: print (f"Command '{command}' not understood") 더 정확해진 오류 보고 # 기존 print ("Hello" print ("What's going on?") File ".\test.py", line 2 print ("What's going on?") ^ SyntaxError: invalid syntax # 새로운 File ".\test.py", line 1 print ("Hello" ^ SyntaxError: '(' was never closed 매개변수 사양 변수 입력에 새로 추가된 2가지, "typing.ParamSpec" 과 "typing.Concatenate"를 사용하면

Naver Blog

[Python] 3.9 변경 및 추가된 사항

딕셔너리 병합(merge), 갱신(update) 연산자 병합 연산자 : | 갱신 연산자 : |= ※ "Python3.7" 버전부터는 딕셔너리 순서가 보존된다. # 병합 연산자 google = {'android': 11} apple = {'ios': 14} google | apple >>> {'android': 11, 'ios': 14} apple | google >>> {'ios': 14, 'android': 11} 갱신 연산자 리스트를 딕셔너리로 바꿀 때, 리스트 내에 중복 데이터가 존재하는 경우에도 갱신 연산자로 손쉽게 처리할 수 있습니다. data = [('stock', 1), ('stock', 2)] aligned = {} for k, v in data: aligned |= {k: v} >>> aligned {'stock': 2} 문자열의 접두사, 접미사를 삭제하는 removeprefix(), removesuffix() 메서드 추가 다른 문자열 조작 메서드와 마찬가지로, 문자

Naver Blog

[Python] Ubuntu 18.04 파이썬 3.10 버젼 설치 및 기본 설정하기

Python3.10 설치 아래에서 다른 버전(python3.9 등)으로 설치해줘도 된다. sudo apt install software-properties-common -y sudo add-apt-repository ppa:deadsnakes/ppa Python3.10에 지원하는 "dev", "venv" 패키지만 설치 sudo apt install -y python3.10 python3.10-dev python3.10-venv Python3.10에 지원하는 다른 패키지까지 설치 sudo apt install -y python3.10 python3-dev python3-venv python3-distutils python3-lib2to3 python3-gdbm python3-tk libpq-dev python3-pip sudo apt -y install libpq-dev python3-dev sudo apt -y install build-essential sudo apt -y inst

Naver Blog

[FastAPI] 파이썬 3.10 TypeError: Fields of type &quot;<class 'types.UnionType'>&quot; are not supported.

문제 원인 "FastAPI"를 사용 중이며, "pydantic"에서 "Python3.10"에서 지원하는 "|" 유니온 타입이 지원이 되고 있지 않다고 합니다. 차후 "pydantic"에서 버그 및 문제를 해 결해야 사용해 볼 수 있을 것 같습니다. 당분간 이전 방식으로 "Optional[]" 방식으로 사용해야 될 것 같습니다. class UserBase(BaseModel): id: Optional[str] = None 참고 링크 python 3.10 TypeError: Fields of type "<class 'types.UnionType'>" are not supported. - Google Search All Videos News Images Maps Shopping Books Search tools Pydantic fails with Python 3.10 new UnionType · Issue #3300 - GitHub github.com › samuelcolvin › pyda

Naver Blog

[FastAPI] SQLAlchemy 람다형식으로 고유한 ID 만들기

고유한 ID 만들기 id = Column(String(120), primary_key=True, default=lambda: str(uuid.uuid4()))

Naver Blog

[PostgreSQL] Ubuntu 18.04 postgreSQL 14 설치하기

설치하기 레포지토리 업데이트 sudo apt -y install gnupg2 wget vim sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt -y update "postgreSQL 14" 설치 sudo apt -y install postgresql-14 버전 확인 psql --version PostgreSQL 접속 sudo -i -u postgres 위 명령어 입력하면 유저가 변경되고, 아래 명령어를 통하여 접속 가능 psql 아래 명령어는 바로 접속이 가능하다. sudo -u postgres psql 비밀번호 변경 ALTER U

Naver Blog

[FastAPI] pydantic orm_mode

orm_mode "pydantic"에서 제공하는 "orm_mode"를 이용하여 반환 모델을 만들 경우, ORM JSONEncoder에 의해 자동으로 "json"으로 변환해주기 때문에 별도로 "JSONResponse" 등의 객체를 이용할 필요가 없습니다. # Response class ResponseMemo(BaseModel): id: str title: str content: Optional[str] = None is_favorite: bool class Config: orm_mode = True

Naver Blog

[RDS] AWS character set 및 한글 입력(깨짐) 변경하기

파라미터 옵션 변경 RDS로 이동하여 "파라미터 그룹"에서 아래에 해당하는 파라미터를 검색하여 수정 아래 항목을 "utf8"으로 변경 character_set_client character_set_connection character_set_database character_set_filesystem character_set_results character_set_server 아래 항목을 "utf8_general_ci"으로 변경 collation_connection collation_server 아래 항목 타임존 "Asia/Seoul" 변경 time_zone ※ 수정사항이 반영되었다면 재부팅을 꼭 해줍니다. 이모지 사용의 경우 아래 항목을 "utf8mb4"으로 변경 character_set_client character_set_connection character_set_database character_set_results character_set_server 아래 항목을 "utf

Naver Blog

[S3] 멀티파트 업로드 (MultiPart Upload)

AWS CLI 설치 "Windows PC" 버전 https://awscli.amazonaws.com/AWSCLIV2.msi "Mac OS" 버전 https://awscli.amazonaws.com/AWSCLIV2.pkg 설정 버전 확인 aws --version 계정 설정 aws configure "configure" 예제 AWS Access Key ID [None]: QWHEHVKLBBLEKWC;D AWS Secret Access Key [None]: 79461qwpiz/ewoerpd85eqwWRB Default region name [None]: ap-northeast-2 Default output format [None]: json 명령어 단일 파일 업로드 (버킷내 특정 폴더로 넣을 경우 "s3://버킷이름/폴더/" 이렇게 지정해주면 된다.) aws s3 cp C:\Users\test\Desktop\test\테스트파일1.txt s3://버킷이름/music/ 폴더 내 파일 다중 업

Naver Blog

[FastAPI] Sqlalche models Column 타입

Generic Types 오브젝트 설명 BigInteger Bigger Integers SmallInteger Small Integers Integer Integers Boolean Bool Date Date DateTime DateTime Float Float (소수점) String String(255) Text Text Interval datetime.timedelta() Time datetime.time() LargeBinary 바이너리 데이터 MatchType https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.MatchType Numeric DECIMAL PickleType https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.PickleType SchemaType 스키마 DDL Unicode 가변 길이 유니코드 문자열

Naver Blog

[FastAPI] 307 Temporary Redirect

해결방법 보통 엔드 포인트를 포함한 경로가 확실하지 않을때 발생됩니다. "main" 앱에 "redirect_slashes" 옵션을 추가하여 해결합니다. app = FastAPI() app.router.redirect_slashes = False 또 다른 문제로 특정 라우터의 기본 경로가 아래인 경우에는 위에서 설정한 리다이렉트가 되지 않아 경로를 찾을 수 없다고 나옵니다. @router.get('/', response_model=SomePydanticModel) 아래 처럼 경로를 추가해주고, API 문서에는 중복으로 보이기 때문에 "include_in_schema" 옵션을 추가합니다. @router.get("/", response_model=SomePydanticModel) @router.get("", response_model=SomePydanticModel, include_in_schema=False)

Naver Blog

[Python] Ubuntu 18.04 module 'collections' has no attribute 'MutableMapping'

gunicorn "gunicorn"을 실행하려고 하니 "module 'collections' has no attribute 'MutableMapping'" 같은 오류 발생했다. 앞에 명시적으로 "python3 -m"을 붙여주고 실행하면 된다. 관련 오류로 이슈가 있는것 같긴하나 아래 명령어로 진행하면 우선은 된다. python3 -m gunicorn -k uvicorn.workers.UvicornWorker --access-logfile ./gunicorn-access.log --error-logfile ./gunicorn-error.log src.main:app --bind 0.0.0.0:8001 --workers 4 --daemon --timeout 3600

Naver Blog

[Gatsby] 리엑트 개츠비 프레임워크 알아보기

소개 리엑트(React) 개츠비(Gatsby)는 정적 웹 페이지를 만들기 적합한 CMS입니다. 특징 Gatsby는 빌드 시 "HTML" 확장자를 가진 파일로 별도의 "JS"를 불러오는 렌더링이 아닌 빌드 할 때에 모두 작성됩니다. 따라서, "정적 웹 페이지"를 만들기에 적합합니다. 여러 강력한 플러그인을 별도로 제공하고 있으며, Gatsby 공식 홈페이지에서 "클라우드 서비스"를 제공합니다. 또한, GraphQL을 이용하여 JS 객체로 저장하고 데이터를 가져올 때에 사용되는데 특정 JSON 파일을 읽어 데이터 풀에 저장한 후 사용된다. 의견 레거시 방법(HTML5, CSS3, JS)으로 정적 사이트를 충분히 만들 수 있지만 요즘은 프론트 기술들이 너무 좋기 때문에 여러 가지를 감안하면 레거시 방법을 절대 추천하지 않습니다. 필자는 간단한 브랜딩 사이트를 만들기 위해서 프론트(리엑트, 뷰, 스벨트 등)를 쓰지 않고 바닐라 HTML5, CSS3, JS를 이용하여 만들었지만, "프론트(리

Naver Blog

[Remix] 리엑트 리믹스 프레임워크 알아보기

소개 리엑트(React) 리믹스(Remix)는 리엑트 라우터(React-Router)를 만든 개발자가 만들었습니다. Remix는 원래 라이선스 비용을 지불하는 유료 프레임워크였는데, 최근에 무료로 변경되었습니다. 특징 Remix는 프로젝트를 시작할 때 어떤 종류의 서버에서 배포할 건지 선택하게 됩니다. 그 이유는 서버 측에서 렌더링(HTML) 하여 페이지를 보여주기 때문입니다. 즉, 프론트 서버에서 "JS" 코드를 읽고 "HTML"으로 렌더링해서 보여줍니다. 이 결과로 유저는 하얀화면(인터넷 속도가 느린 경우 포함), 로딩중 화면을 볼일이 없습니다. (서버사이드 렌더링) 다만, 데이터를 불러오고 보여주는 과정이 조금 다릅니다. "loader"라는 함수를 통하여 "API"를 요청하고 UI 단에서는 "useLoaderData"를 통해서 데이터를 보여주게 됩니다. 이렇게 통해 불러오게 되는 데이터는 프론트 서버 내부에서 호출해서 가져오고 실제로 유저는 이미 HTML로 변환된 화면을 보게

Naver Blog

[Flutter] 플러터 SocketException: OS Error: Connection refused 해결하기

호출주소 변경 권한 문제로 플러터에서 백엔드 호출시 주소를 "localhost", "127.0.0.1"로 하면 안됩니다. 현재 나의 IP를 확인하시고, 백엔드 HOST 부분을 "0.0.0.0" 형식으로 모두 허용되게끔 되어있는지 체크해주시고 플러터에서 백엔드 호출 주소를 나의 아이피로 변경해주시면 됩니다. http://192.168.42.12:8001

Naver Blog

[FastAPI] db.rollback() 구조 만들기

rotuer @router.post("/user", tags=["user"], response_model=schemas.User) @router.post("user", tags=["user"], include_in_schema=False) def create_users(schemas: schemas.UserCreate, db: Session = Depends(get_db)): try: # 유저 생성 user = crud.UserCreate(schemas=schemas, db=db) # 유저 추가 확인 if user is False: raise Exception("유저 생성에 문제가 발생했습니다.") # 문제가 없을 경우 "200" 리턴 return JSONResponse(status_code=200, content={ "status": "success", }) except Exception as e: return JSONResponse(status_code=400, content={

Naver Blog

[FastAPI] postgreSQL 연결하기

데이터베이스 연결 "postgreSQL" 연결시 비밀번호 마지막에 특수문자 포함되어 있으면, 그 다음에 오는 "@{host}" 이 부분과 오류가 발생한다. 아직 명확한 해결방법은 찾지 못하여, 비밀번호를 간단하게 변경했다. engine = create_engine("postgresql://{username}:{password}@{host}:{port}/{db_name}".format( username='postgres', password='postgres', host='127.0.0.1', port='5432', db_name='테이블이름' )) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base()

Naver Blog

[FastAPI] 데이터베이스 연결시 서버 포트가 다른 경우

서버 포트가 다른 경우 서버 접근 포트(80, 443)가 다른 경우 별도의 "SSHTunnelForwarder"을 사용하여 접근 합니다. server = SSHTunnelForwarder( ("아이피", 포트), ssh_username="아이디", ssh_password="비밀번호", remote_bind_address=("127.0.0.1", 3306) ) server.start() local_port = str(server.local_bind_port) engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format("root", "비밀번호", "127.0.0.1", local_port, "데이터베이스"), pool_recycle=500, pool_size=20, max_overflow=20, echo=False, echo_pool=True) SessionLocal = sessionmaker(autocommit=False, auto

Naver Blog

[Flutter] 플러터 몇 분전 몇 시간전 등 표시하기

플러그인 설치 timeago | Dart Package A library useful for creating fuzzy timestamps. (e.g. "15 minutes ago") pub.dev 초기화 "main.dart"에서 실행시 "timeago"를 한국어로 초기화 시켜줍니다. import 'package:timeago/timeago.dart' as timeago; void main() async { timeago.setLocaleMessages('ko', timeago.KoMessages()); runApp(const MyApp()); } 사용방법 아래 처럼 데이터를 받아서 넣어주거나 timeago.format(DateTime.parse(data['created_at']), locale: "ko") 공식 예제처럼 처리해주면 된다. final fifteenAgo = DateTime.now().subtract(Duration(minutes: 15)); print(timeago.

Naver Blog

[Flutter] 플러터 pub 캐시 초기화

초기화 flutter clean flutter pub cache repair

Naver Blog

[Flutter] 플러터 You can fix that by adding that directory to your system's &quot;Path&quot; environment variable

시스템 환경 변수 추가 시스템 환경 변수에 아래 경로를 추가해주면 된다. C:\Users\유저이름\Documents\flutter\.pub-cache\bin

Naver Blog

[Flutter] 플러터 2.10.2 ~ 3 버전 업그레이드 및 gradle 기준 맞추기

플러터 버전 업그레이드 플러터 업그레이드 flutter upgrade 플러터 채널 확인 및 채널 "stable"으로 변경 flutter channel flutter channel stable 간혹, 플러터 업그레이드 이후 "warning" 오류들이 발생될 수 있는데 이런 경우에는 캐시 리페어를 해준다. flutter pub cache repair 기존 프로젝트도 펍 초기화 이후 재설치 한다. flutter clean flutter pub get flutter pub upgrade 버전 맞추기 "android\build.gradle" 파일 수정 "ext.kotlin_version = '1.6.10'" 으로 변경 classpath에 "com.android.tools.build:gradle:7.0.2"으로 변경 buildscript { ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() } dependencies {

Naver Blog

[Flutter] 플러터 폰트 적용

폰트 다운로드 Google Fonts Making the web more beautiful, fast, and open through great typography fonts.google.com 위의 구글 폰트를 이용 하여 사용하고자 하는 폰트를 다운로드 합니다. 폰트 적용 파일을 다운 받았다면 ".otf" 확장자를 가지고 있습니다. 프로젝트 내부에 "assets/fonts/" 폴더를 만들어 옮겨줍니다. "pubspec.yaml" 파일을 열어서 아래와 같이 추가해줍니다. flutter: uses-material-design: true # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg fonts: - family: NotoSansCJKkr fonts: - asset: assets/fonts/NotoSansKR-Thin.otf weight: 100 - asset: assets/fonts/NotoSansKR-Light.otf

Naver Blog

[Flutter] 플러터 Runtime JAR files in the classpath should have the same version

캐시 초기화 "Runtime JAR files in the classpath should have the same version" 해당 오류는 kotlin 버전을 업그레이드한 후 문제가 발생할 수 있습니다. 이전 버전의 캐시가 남아 있을 수 있어 캐시를 초기화 해줍니다. 안드로이드 스튜디오에서 "file -> Invalidate Caches"를 통해서 재시작 해주시면 되고, 불가피 할 경우 "C:\Users\유저이름\.gradle\caches" 해당 경로로 이동하여 "caches" 폴더를 삭제해주시면 됩니다. 두번째로 "\android\app\build.gradle"에서 JDK 버젼을 8로 변경합니다. dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" }

Naver Blog

[Flutter] 플러터 VSCODE 디버그 옵션(args) 넣기

launch.json 실행 및 디버그를 통해서 ".vscode" 폴더안에 "launch.json" 파일에 "args" 내용을 넣어주면 됩니다. { // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요. // 기존 특성에 대한 설명을 보려면 가리킵니다. // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요. "version": "0.2.0", "configurations": [ { "name": "probation", "cwd": "probation", "request": "launch", "type": "dart", "flutterMode": "debug", "args": [ "--no-sound-null-safety", "--cache-sksl", "--purge-persistent-cache", ] }, { "name": "probation (profile mode)", "cwd": "pr

Naver Blog

[Flutter] 플러터 chip(select, radio, check) 위젯 모음

Chip Widget Chip Widget 정보만 표시하고 삭제할 수 있는 간단한 표현을 할때 사용합니다. Chip( labelPadding: EdgeInsets.all(2.0), avatar: CircleAvatar( backgroundColor: Colors.white70, child: Text(label[0].toUpperCase()), ), label: Text( label, style: TextStyle( color: Colors.white, ), ), backgroundColor: color, elevation: 6.0, shadowColor: Colors.grey[60], padding: EdgeInsets.all(8.0), ); Action Chip Action Chip 비활성화할 수 없다는 점을 제외하고는 다른 칩과 속성이 동일하여 비활성화할 수 없습니다. ActionChip( elevation: 8.0, padding: EdgeInsets.all(2.0), avat

Naver Blog

[Flutter] 플러터 정규식(RegExp) 모음

정규식(RegExp) "TextFormField"에서 사용하려면 아래와 같이 해주면 된다. inputFormatters: [ FilteringTextInputFormatter.allow(RegExp("[ㄱ-ㅎ가-힣]")), ], 별도로 컨트롤러 및 벨리데이션 형식으로 체크할때에는 아래 처럼 해주면 된다. RegExp _regExp = RegExp(r'[\uac00-\ud7af]', unicode: true); 한글만 RegExp("[ㄱ-ㅎ가-힣]"); 이메일 형식 (r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); 소문자 + 숫자 + 특수문자 + 최소 6자리 이상 RegExp(r"^(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]

Naver Blog

[Flutter] 플러터 ListWheelScrollView

ListWheelScrollView ListWheelScrollView "ListView"와 다르게 조금 더 입체적으로 스크롤 형식을 만들 수 있습니다. 어떻게 보면 쿠퍼티노피커와 비슷하기도 합니다. 카드 및 인스타그램의 피드 형식으로 표현하면 더욱 좋아보입니다. ListWheelScrollView( itemExtent: 75, children: items, ) 참고 링크 Flutter - Using ListWheelScrollView Widget Examples How to use ListWheelScrollView in Flutter, including how to set magnifier, changing diamter radius, setting selectedd item changed listner, and so on. www.woolha.com

Naver Blog

[Flutter] 플러터 TextInputAction 종류 및 done, go 차이점

TextInputAction https://api.flutter.dev/flutter/services/TextInputAction.html 상수 (검은색 자주 사용) 설명 continueAction iOS 앱에서는 화면 상단에 '뒤로' 버튼과 '계속' 버튼이 나타나는 것이 일반적입니다. 그러나 키보드가 열려 있으면 이러한 버튼이 화면 밖에 숨겨지는 경우가 많습니다. 따라서 iOS에서 '계속' 리턴 키의 목적은 사용자가 텍스트를 입력할 때 '계속' 버튼을 사용할 수 있도록 하는 것입니다. done 사용자는 입력 그룹(예: 양식)에 입력을 제공했습니다. 이제 일종의 마무리 동작이 발생해야 합니다. emergencyCall 응급 서비스에 전화를 걸기 시작합니다. (안드로이드는 지원되지 않습니다.) go 사용자가 목적지를 나타내는 텍스트(예: 레스토랑 이름)를 입력했습니다. '이동' 버튼은 사용자를 이 대상에 해당하는 앱의 일부로 안내하기 위한 것입니다. join 사용자는 예를 들어 무선

Naver Blog

[Flutter] 플러터 뒤로가기 두번 앱 종료

WillPopScope UI 단 WillPopScope( onWillPop: () async => controller.handleWillPopScopeAction(), child: const Text("메인"), ) 컨트롤러 // 현재 시간 DateTime currentDateTime = DateTime.now(); // 뒤로가기 종료 Future<bool> handleWillPopScopeAction() async { DateTime now = DateTime.now(); if (now.difference(currentDateTime) > const Duration(milliseconds: 1000)) { currentDateTime = now; Fluttertoast.showToast( msg: "한번 더 누르면 앱이 종료됩니다", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, ), } else { exit(0);

Naver Blog

[Flutter] 플러터 InkWell vs GestureDetector 차이점

차이점 "Inkwell"과 "GestureDetector" 둘다 모두 많은 제스쳐를 포함합니다. "GestureDetector"가 더 많은 제스쳐가 있습니다. Inkwell 단, "GestureDetector"은 "Inkwell"에서 제공되는 리플(잔물결) 효과는 없습니다. 드래그와 같은 여러 제스쳐가 필요하다면 "GestureDetector"을 사용하면 되며, 간단한 제스쳐의 경우에는 "Inkwell"을 사용하시면 됩니다. 추가로 리플 효과가 없어야 되는 경우에도 "GestureDetector"을 사용하면 됩니다. 참고 링크 Flutter: InkWell vs GestureDetector: what is the difference? I'm completely new to Flutter and found out about InkWell and GestureDetector. It seemed to me that they are almost the same. The official do

Naver Blog

[PostgreSQL] Ubuntu 18.04 kthreaddk 바이러스(CPU 사용율 100%)

임시 조치 크론탭을 이용하여 1초마다 프로세스 강제 종료 sudo vi /etc/crontab 아래 내용을 입력 후 저장 * * * * * sudo pkill -9 -f kthreaddk * * * * * sleep 01; sudo pkill -9 -f kthreaddk * * * * * sleep 02; sudo pkill -9 -f kthreaddk * * * * * sleep 03; sudo pkill -9 -f kthreaddk * * * * * sleep 04; sudo pkill -9 -f kthreaddk * * * * * sleep 05; sudo pkill -9 -f kthreaddk * * * * * sleep 06; sudo pkill -9 -f kthreaddk * * * * * sleep 07; sudo pkill -9 -f kthreaddk * * * * * sleep 08; sudo pkill -9 -f kthreaddk * * * * * sleep 09;

Naver Blog

[Flutter] 플러터 GetX 포그라운드, 백그라운드 체크

라이프사이클 포그라운드 -> 백그라운드 - inactive -> pause 백그라운드 -> 포그라운드 - resumed Back 키를 통한 앱 종료 - inactive -> pause -> detached 플러터 수정 controller.dart GetX에서는 "controller"에서 "WidgetsBindingObserver" 상속시켜준다. GetX가 아닌 경우에는 "UI"단에서 "Statefulwidget" 상태에서 진행해주면 된다. class TestController extends GetxController with WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { switch (state) { case AppLifecycleState.resumed: Logger().d("app in resumed"); break; case AppLifecycleState.

Naver Blog

[Flutter] 플러터 쉬머 shimmer

shimmer shimmer | Flutter Package A package provides an easy way to add shimmer effect in Flutter project pub.dev Shimmer.fromColors( baseColor: Colors.grey.shade300, highlightColor: Colors.grey.shade100, child: Container( width: 100, height: 100, decoration: const BoxDecoration( shape: BoxShape.circle, color: Colors.white, ), ), ),

Naver Blog

[Flutter] 플러터 FCM 설정하기

pubspec.ymal 라이브러리 추가 firebase_messaging: ^11.2.8 flutter_local_notifications: ^9.3.3 google-services.json google-services.json 파이어베이스에서 앱등록시 "google-services.json" 파일을 받을 수 있습니다. 해당 파일을 "android/app/src/" 위치에 넣어주면 됩니다. mainfest.xml AndroidManifest.xml "android\app\src\main\AndroidManifest.xml" 위 파일을 열어 아래 권한을 추가합니다. <manifest .... <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:nam

Naver Blog

[FastAPI] Schema Pydantic 스키마 타입

Schema - pydantic Schema Pydantic allows auto creation of JSON Schemas from models: from enum import Enum from pydantic import BaseModel , Field class FooBar ( BaseModel ): count : int size : float = None class Gender ( str , Enum ): male = 'male' female = 'female' other = 'other' not_given = 'not_given' class MainMo... pydantic-docs.helpmanual.io

Naver Blog

[Flutter] 플러터 GetX Service

Service 이 클래스는 GetxController와 같으며 동일한 수명 주기onInit(), onReady(), onClose()를 공유합니다. 그러나 그 안에는 '논리'가 없습니다. GetX Dependency Injection 시스템에 이 하위 클래스를 메모리에서 제거할 수 없음을 알립니다. main.dart void main() { initServices(); runApp(const MyApp()); } void initServices() async { // FCM Service 초기화 // permanent는 메모리에서 삭제되지 않고 고정되게 합니다. Get.put(FCMService(), permanent: true); } fcm_service.dart class FCMService extends GetxService { @override // ignore: unnecessary_overrides void onInit() async { .... } }

Naver Blog

[Flutter] 플러터 퍼미션(Permission) 권한 얻기 및 표시 (수정)

permission permission_handler | Flutter Package Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. pub.dev "permission_handler" 라이브러리를 설치해줍니다. 권한 목록 Android IOS 권한 목록 (블루투스)Bluetooth Sharing – NSBluetoothPeripheralUsageDescription (달력)Calendar – NSCalendarsUsageDescription(전화 관련)CallKit – NSVoIPUsageDescription(카메라) velog.io AndroidManifest.xml flutter-permission-handler/AndroidManifest.xml at master · Baseflow/flutter-permis

Naver Blog

[Flutter] 플러터 CI/CD Jenkis fastlane (정리예정)

CI 이전 방법 Jeknis (Pull Request Builder) Gihub WebHook PR(Pull Request) Trigger 현재 방법 Gihub Actions CD 플러터 Jenkis fastlane

Naver Blog

[FastAPI] PyFCM FCM(Firebase Cloud Messaging) 구현하기

PyFCM 설치 pip3 install pyfcm FCM 전송 대상 1. FCM 특정 대상 알림 전송 (1명, 회원 대상) 2. FCM 다중 알림 전송 (다중, 회원 대상) 3. FCM 비회원 유저 알림 전송 (공지 및 이벤트 등) ※ 이외 기능에 따른 FCM 알림 해당 기능에 매칭된 CRUD에서 개별 처리 ※ 알림 허용에 따른 전송 단일 대상 전송 토큰값을 이용해 1명에게 푸시알림을 전송함 "data_message"를 통하여 원하는 데이터를 전송한다. 예로들면, 푸시 알람 클릭시 이동될 특정 이벤트 화면이나 이후 로직을 처리해주면 된다. PUSH_SERVICE = FCMNotification("FCM 콘솔에 있는 API Key") result = PUSH_SERVICE.notify_single_device( registration_id="전송 대상 FCM Token", message_title="제목", message_body="내용", data_message={ "url": "/

Naver Blog

[Flutter] 플러터 인앱메세지(In-App Messageing)

FCM과 IAM 차이점 "FCM(FireBase Cloude Messageing)"은 백그라운드 상태에서도 푸시알림을 보낼 수 있습니다. 다만, 과도한 알림은 사용자 경험을 낮추게 됩니다. "IAM(In-App Messageing)"은 앱 내부에서만 보여주게 됩니다. 따라서, FCM과 IAM 혼용하여 적절하게 사용하는것이 좋습니다. pubspec.ymal 라이브러리 추가 firebase_in_app_messaging: ^0.6.0+9 firebase_app_installations: ^0.1.0+8 google-services.json google-services.json 파이어베이스 콘솔에서 "In-App Messageing" 항목을 선택하여 구글애널리틱스를 추가하고 "google-services.json" 파일을 다운로드 받을 수 있습니다. 만약, 기존에 FCM(FireBase Cloude Messageing)으로 "google-services.json"을 이미 설정하였다면 넘어

Naver Blog

[Flutter] 플러터 애널리틱스 GA(Analytics)

GA 애널리틱스(Analytics) "GA (Google Analytics)"은 앱의 통계 및 유저 참여에 대한 측정을 할 수 있습니다. 즉, 사용자가 어떠한 행동을 하는지 파악 할 수 있습니다. pubspec.ymal 라이브러리 추가 firebase_core: ^1.13.1 firebase_analytics: ^9.1.2 android/build.gradle android/build.gradle "android/build.gradle" classpath 'com.google.gms:google-services:4.3.10' android/app/build.gradle android/app/build.gradle "android/app/build.gradle" implementation 'com.google.firebase:firebase-analytics' 플러터 수정 "ga_service.dart" 파일을 만들어서 상시 컨트롤러가 고정될 수 있도록 메인에 불러오겠습니다. main

Naver Blog

[Flutter] 플러터 인앱결제(In-App Purchase) (정리예정)

IAP 인앱결제(In-App Purchase) 인앱결제는 구글에서 지원하는 내부 결제로 수수료는 외부 결제사 보다 높지만 구현하기가 다소 편합니다. 외부 결제의 경우 특정 상황에 따라서 리젝 사유에 해당되기 때문에 특별한 경우가 아니라면 인앱결제로 진행하는게 여러가지로 좋습니다. pubspec.ymal 라이브러리 추가 in_app_purchase: ^3.0.1 android/app/src/main/AndroidManifest.xml "android\app\src\main\AndroidManifest.xml" <uses-permission android:name="com.android.vending.BILLING" /> Google Play Console 구글 플레이스토어 콘솔로 이동하여 "앱 만들기"를 통해서 앱을 만든 후 출시에 필요한 모든 조건들을 충족한 뒤 인앱 결제를 테스트 하기 위해서는 빌드된것을 업로드 하여야 테스트를 해볼 수 있습니다. 여기서 디버그키가 아닌 실제 릴리즈

Naver Blog

[Flutter] 플러터 부트페이(bootpay) 연동 (작성예정)

부트페이(bootpay) 부트페이 개발문서 기타문서 Flutter 결제구현 방식 Flutter는 구글에서 개발한 모바일 앱 개발 프레임워크로, Dart를 언어로 하며, 안드로이드, iOS로 빌드됩니다. Flutter는 skia 기반으로 렌더링하는데, 이는 웹 개발의 HTML과는 다른 방식이며, 네이티브급 성능과 UI를 제공하는 크로스 플랫폼 프레임워크입니다. Flutter에서는 MethodChannel을 통해 Native Library와 통신할 수 있습니다. 따라서 쉽게 Bootpay를 이용할 수 있으며, 샘플 코드를 제공합니다. main.dart import 'dart:a... docs.bootpay.co.kr 부트페이 개발문서 PG 결제 - Flutter/토스/휴대폰소액결제 매뉴얼 PG 선택 결제수단 선택 휴대폰소액결제 신용카드 계좌이체 가상계좌 언어별 보기 선택 웹 Android Android 웹앱 iOS Swift iOS ObjC iOS 웹앱 Flutter React Nati

Naver Blog

[Flutter] 플러터 페이플(payple) 연동 (정리예정)

페이플(payple) 페이플(Payple)은 부트페이(BootPay)와 동일한 결제 시스템 입니다 개인적으로 페이플을 다른 프로젝트(웹 등)에 써본 결과 굉장히 만족스러웠던점을 감안하여, 페이플에서도 플러터 공식 지원을 계기로 정리를 해볼 예정입니다. iamport_flutter 0.9.12 | Flutter Package Plugin that allows Flutter to use Iamport payment and certification functions. pub.dev 정리예정...

Naver Blog

[Flutter] 플러터 FractionallySizedBox 퍼센트 범위 지정 위젯

FractionallySizedBox FractionallySizedBox 넓이, 높이를 퍼센트로 범위를 지정 할 수 있습니다. FractionallySizedBox( widthFactor: 0.7, child: Text("TEST"), ), 참고 링크

Naver Blog

[Flutter] 플러터 플로팅 액션버튼(FloatingActionButton) 가운데 만들기

예제코드 FloatingActionButton class TestUi extends GetView<TestController> { const TestUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( // "extendBody"를 해야 홈이 파인 틈 사이가 투명된다. extendBody: true, appBar: AppbarWidget(appBar: AppBar()), body: SafeArea( child: Container( padding: const EdgeInsets.fromLTRB(40, 40, 40, 0), child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), child: Column( children: const [ Text("테스트 페이지"), ], ), ), ), ), /

Naver Blog

[Flutter] 플러터 GroupedListView

pubspec.yaml grouped_list | Flutter Package A Flutter ListView where the list items can be grouped into sections. pub.dev grouped_list: ^4.2.0 example example "GroupedListView"은 그룹을 분리하기 쉽고 채팅을 구현할때 편리한 라이브러리 입니다.

Naver Blog

[Flutter] 플러터 flutter_screenutil 반응형 디바이스 크기 비율에 맞게 설정

pubspac.yaml flutter_screenutil | Flutter Package A flutter plugin for adapting screen and font size.Guaranteed to look good on different models pub.dev flutter_screenutil: ^5.3.1 designSize 초기 "MaterialApp"에 사이즈를 초기화 시킬때 특정 디바이스 기준 사이즈로 초기화 시켜주면 해당 사이즈에 맞춰 넓이, 높이, 폰트사이즈를 비율에 맞게 설정해줍니다. 디자인 작업시 픽스된 모바일 디바이스 크기와 최대한 비슷하게 UI를 만들 수 있습니다. property 설명 width = 180.w 디자인 사이즈 기준 넓이 height = 180.h 디자인 사이즈 기준 높이 fontSize = 16.sp 디자인 사이즈 기준 폰트크기 위에 나와있는 표대로 사이즈 뒤에 "w", "h", "sp"를 설정해주면 "main.dart"에서 초기화한 디

Naver Blog

[Flutter] 플러터 env(dotenv) 사용하기

pubspac.yaml flutter_dotenv | Flutter Package Easily configure any flutter application with global variables using a `.env` file. pub.dev 라이브러리 추가 flutter_dotenv: ^5.0.2 ".env" 파일 생성 후 추가 flutter: uses-material-design: true assets: - .env Initialize .env TEST="TEST123" main.dart void main() async { await initServices(); runApp(const MyApp()); } Future<void> initServices() async { // env 초기화 await dotenv.load(fileName: ".env"); } 값 불러오기 dotenv.env['TEST'] => TEST123 참고 링크 Flutter 환경설정 파일 적용 (기본)

Naver Blog

[Flutter] 플러터 hive 로컬에 데이터 저장하기

pubspac.yaml hive | Dart Package Lightweight and blazing fast key-value database written in pure Dart. Strongly encrypted using AES-256. pub.dev hive_flutter | Flutter Package Extension for Hive. Makes it easier to use Hive in Flutter apps. pub.dev hive_generator | Dart Package Extension for Hive. Automatically generates TypeAdapters to store any class. pub.dev 라이브러리 추가 dependencies: hive: ^2.0.6 hive_flutter: ^1.1.0 dev_dependencies: hive_generator: ^1.1.2 Hive Hive Docs GitHub Samples Pub.dev

Naver Blog

[Kafka] Ubuntu 18.04 카프카(Apache Kafka) 설치하기

요약 설명 kafka broker - "kafka"라는 스트리밍 분산 처리 플랫폼에서 유연한 큐(Queue) 역할을 하는 서버(Server)이다. kafka Consumer - 클라이언트(Client)로 데이터를 조회한다. kafka Producer - 클라이언트(Client)로 데이터를 넣어준다. 위에 3가지를 모두 관리해주는것이 주키퍼(Zookeeper)이다. JDK 설치 sudo apt update sudo apt -y install default-jdk Kafka 설치 Apache Kafka Apache Kafka: A Distributed Streaming Platform. kafka.apache.org 아파치 카프카(Apache Kafka) 설치 Previous image Next image kafka 위에 사진처럼 "Binary downloads"에서 받아야 합니다. 현재 날짜 기준 "Scala 2.13 - kafka_2.13-3.1.0-tgz"를 받았습니다. wget

Naver Blog

[Redis] 레디스 Window 설치하기

설치 Releases · tporadowski/redis Native port of Redis for Windows. Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Se... github.com 위 링크를 통하여 최시버젼의 레디스(Redis) 설치 CLI 실행 설치파일로 설치했을때 경로 "CMD"을 열어 경로 이동 후 "redis-cli.exe" 실행 cd C:\Program Files\Redis redis-cli.exe 압축파일의 경우 파일 내부에 "redis-cli.exe" 파일 실행 이후에는 "127.0.0.1" 로컬로 레디스를 연결해주면 사용이 가능합니다. 명령어 명령어 설명 info 레디스 설정 정보 monitor 모니터링 keys *

Naver Blog

[Redis] Ubuntu 18.04 레디스 최신버전 설치하기

최신버전 설치 Redis Download Stable releases liberally follow the usual major.minor.patch semantic versioning schema. Unstable This is where all the development happens. Only for hard-core hackers. Use only if you need to test the latest features or performance improvements. This is going to be the next Redis release i... redis.io 레디스(Redis) 스테이블 버전으로 다운로드 wget https://download.redis.io/releases/redis-6.2.6.tar.gz 압축풀기 tar xzf redis-6.2.6.tar.gz sudo rm -rf ./redis-6.2.6.tar.gz 설치하기 cd redis-6.2.6 mak

Naver Blog

[Flutter] 플러터 Liquid Swipe(slide)

pubspac.yaml liquid_swipe | Flutter Package A Flutter plugin to implement liquid Swipe effect to provided widgets. pub.dev smooth_page_indicator | Flutter Package Customizable animated page indicator with a set of built-in effects. pub.dev liquid_swipe: ^2.1.1 smooth_page_indicator: ^1.0.0+2 적용하기 Liquid Swipe ui.dart class LiquidSwipeUi extends GetView<LiquidSwipeController> { const LiquidSwipeUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Obx( () => Scaffold(

Naver Blog

[Flutter] 플러터 ClipPath

Tools Flutter Shape Maker | Auto-Generate Custom Paint Code for your Flutter Apps Flutter Shape Maker auto-generates Responsive code for Flutter Custom Paint Widget based on the shape you draw on the Canvas shapemaker.web.app 위에 쉐이프 메이커는 도형을 쉽게 그리고 코드를 얻을 수 있는 툴입니다. 적용하기 ClipPath ui.dart class ClipPathUi extends StatelessWidget { const ClipPathUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( appBar: AppbarWidget(appBar: AppBar()), body: SafeArea( child:

Naver Blog

[Flutter] 플러터 에러(오류) 핸들링 하기

Dart Exceptions 예외타입 설명 DefferedLoadException 지연된 라이브러리 로드에 실패하면 throw됩니다. FromatException 문자열 또는 기타 데이터에 예상 형식이 없고 구문 분석 또는 처리할 수 없는 경우 throw되는 예외입니다. IntegerDivisionByZeroException 숫자를 0으로 나눌 때 발생합니다. IOEException 모든 IO(입출력) 관련 예외에 대한 기본 클래스입니다. IsolateSpawnException 격리된 파일을 만들 수 없을 때 발생합니다. TimeoutException 비동기 결과를 기다리는 동안 예약된 시간 초과가 발생하면 throw됩니다. NullRejectionException null 또는 정의되지 않은 값으로 약속이 거부된 경우의 예외입니다. 이것은 다른 값에 비해 null 또는 undefined로 약속이 거부될 때 사용자가 잡을 수 있도록 공개합니다. OSError 운영 체제의 오류에 대한

Naver Blog

[FastAPI] 샐러리(Celery) + Redis 비동기 태스크(분산 큐) 처리

Celery란? Celery는 비동기 작업 큐(Queue)라고 생각하면 된다. 즉, 요청 처리가 오면 Celery에서는 태스크 큐(Task Queue)로 메세지(Message)를 통신하고 생성된 워커로 비동기적으로 작업을 진행한다. 메세지와 워커 사이에는 브로커(Broker)를 통하여 연결되어 있다. 메세지를 전송하기 위해서는 큐를 쌓을곳이 필요한데 처리속도가 빠른 레디스(Redis)를 활용하여 메세지 큐를 쌓고 워커로 비동기적으로 쌓인 일을 처리한다. 카프카(Kafka)와 차이점 샐러리와 카프카의 기술 스택은 "Message Queue" 범주에 속한것은 맞습니다. 샐러리는 분산 메세지 전달을 기반으로 하는 비동기 태스크 대기열(작업 대기열) 입니다. 실시간 작업에 중점을 두고 있고 예약도 지원합니다. 조금 더 확장된 형태로 높은 처리량이 필요한 경우에는 카프카를 이용하는게 좋습니다. 레디스(Redis) 설치하기 [Redis] 레디스 Window 설치하기 설치 위 링크를 통하여 최시

Naver Blog

[FastAPI] Faust + Kafka (작성예정)

Overview: Faust vs. Celery — Faust 1.9.0 documentation from celery import Celery app = Celery ( broker = 'amqp://' ) @app . task () def add ( x , y ): return x + y if __name__ == '__main__' : add . delay ( 2 , 2 ) Faust uses Kafka as a broker, not RabbitMQ, and Kafka behaves differently from the queues you may know from brokers using AMQP/Redis/Amazon S... faust.readthedocs.io 작성예정...

Naver Blog

[Flutter] 플러터 블러컨테이너(Blur Container) 만들기

Flutter blur_ui.dart class TestUi extends StatelessWidget { const TestUi({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Scaffold( backgroundColor: Colors.black, body: SafeArea( child: Stack( children: <Widget>[ Positioned( top: 0, left: 0, child: Image.network( "https://cdn.dribbble.com/users/2657768/screenshots/15118489/media/9ca2af6ee34f7734a9c3e5d2e39dad4c.png?compress=1&resize=400x300"), ), Positioned( top: 230, left: 10, child: SizedBox( width: 150, height: 5

Naver Blog

[Next.js] 초기 설정 및 셋팅 하기

프로젝트 생성 npx create-next-app 프로젝트명 타입스크립트 사용시 npx create-next-app 프로젝트명 --typescript Eslint, Prettier 설정하기 yarn add -D eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks yarn add -D prettier eslint-config-prettier eslint-plugin-prettier yarn add -D babel-eslint eslint-plugin-babel yarn add -D @next/eslint-plugin-next 최상위 디렉토리에 ".eslintrc.json" 파일 생성 후 아래 내용 저장 { "env": { "browser": true, "es6": true, "node": true }, "parser": "bab

Naver Blog

[Next.js] 절대경로 설정하기

tsconfig.json 아래 내용 추가 "baseUrl": ".", "paths": { "components/*": [ "components/*" ], "config/*": [ "config/*" ], "pages/*": [ "pages/*" ], "styles/*": [ "styles/*" ] },

1 2 3 4 5 6 7 8