이 블로그 검색

2024년 1월 17일 수요일

postgresql 에서 id 시작 값 재 설정

   

            SELECT setval('user_id_seq', 21, true); -- next value will be 22


2023년 10월 11일 수요일

Dbeaver Data Export, import 할때, 필드명 대문자 인식 못하는 문제

 

설정에서 바꿔줘야 한다. 
Dbeaver > Setting > 연결 > 메타데이터 ---> Use case-sensitive names in DDL statements  체크!


2020년 11월 17일 화요일

Android 프로덕션 빌드(플레이스토어 앱 출시) 는 왠만함 app bundle 로 해야됨.. 구 방식의 apk로 하게 되면 오만가지의 이유로 안되는 경우가 많음

 Android 프로덕션 release 빌드(플레이스토어 앱 출시)는 왠만함 app bundle 로 해야됨... 구 방식의 apk로 하게 되면 오만가지의 이유로 안되는 경우가 많음  

각종 경고와 오류가 뜸 

ex) 버전이 맞지 않습니다.(아무리 버젼 맞춰도 안됨) 등등 

2020년 2월 10일 월요일

매번 할때 마다 해매는 설정 (1) : VS(Visual Studio) Code Remote SSH 설정

1. VS Code 확장 플러그인은 Remote Development 이걸 그냥 받자. 생각하지 말구


2. Remote Development config 파일 구성

Host vcm
  HostName ec2-13-209-68-67.ap-northeast-2.compute.amazonaws.com
  User ubuntu
  IdentityFile C:\Users\memeo\.ssh\id_rsa

1) IdentityFile 에서 퍼블릭키(.pub)로 설정하는 실수 하지 말자.. 프라이빗 키로 당연 설정을 해야한다. 퍼블릭키는 서버에 넣지 않았는가!
2) HostName 에서 http:// 는 빼고 순수 호스트 이름만 넣자


3.  rsa 키 만들기
 -> 헛갈릴것 없다.
ssh-keygen -t rsa -b 4096
위 명렁어를 콘솔에 치면, 
id_rsa(개인키), id_rsa.pub(공개키) 두개가 홈폴더(Users/memeoo/) 의 .ssh 폴더에 자동으로 생성된다.
해당 폴더(홈폴더/.ssh)로 가서 , cat id_rsa.pub 해서 공개키를 디스플레이 함.
그걸 그대로 복사함. 
서버에 가서 역시 홈폴더(~/)의 .ssh 폴더에 가면, authorized_keys 라는 파일이 있음.
이 파일을 sudo vim authorized_keys 로 열음.
연다음, 카피한 걸 맨끝에 붙여넣음.
헛갈리는 이유가 원리를 모르고 해서 그럼 :
ssh-keygen 을 하면 로컬의 개인키와 매핑되는 서버의 공개키가 한쌍으로 생성됨.
로컬에서 접속할때는 당연히 개인키를 가지고 (IdentityFile) 서버의 authorized_keys라는 곳에 개인키에 매핑되는 공개키를 넣어 주면 짝짝궁이 맞아 들어가는 구조.  당연히 authorized_keys 에는 여러 로컬(노트북 1, PC1, 노트북2, ...)에서 설정한 공개키 들이 저장되어 있을것이다.

2019년 12월 21일 토요일

React Native의 끔찍한 버그

React Native로 개발 시, 여러 잔 버그 때문에 많이 고생해 보았는데, 이것 만큼 끔찍했던건 없었던 듯 하다.
 Render 함수 내의 에러(즉, JSX에러)는 React Native 에서 잡아 주지 않는 것이 있다.
 ==> React Native Debugger 로그에도 안뜨고, Metro Bundler 에러 메세지도 없으며, 그냥 앱이 픽 죽어 버리면서 화면이 닫힘..(심지어는 폰 자체에 뻘겋게 뜨는 에러 창에도 안나옴... ;;)

 개발을 하다가 이런 증세가 있음, Render 함수 내의 JSX에 뭔가 잘못 넣은게 있는지 확인하는게 정신 건강에 좋다. (ex, 스타일시트에서 width: 240 인데, width:'240' 으로 했는지...)
(진짜 이런거 한번 걸리면 멘탈 터짐)
하이브리드 모바일 개발에 있어 React Native 의 위상이나 인기가 개인적으로는 거품이거나 지나친 고평가 된게 아닌가 싶다. 기존에 Angular 기반의 Ionic 프레임워크로 개발시에는 프레임워크 내의 잔버그가 하나도 없었다. (정말 1도 없었다.)
 리액트 네이티브로 개발 시, 정말 수많은 짜잘한 프레임워크 내 버그와 싸웠던 기억으로 인해 스스로 내가  만든 앱의 신뢰성에 의구심이 들 정도다.. (과연 이번엔 잘 돌아가는데, 다음에 해도 잘 돌아갈까?)
 React JS의 성공으로 인해 React Native가 별 검증없이 하이브리드 모바일 개발 프레임워크로 급격한 인기를 얻은 듯 싶다.
 만약 React Native와 Ionic 에서 무엇을 메인 개발 프레임워크로 고민하는 개발자가 있다면, 두 프레임워크로 모두 개발을 해본 사람 입장에서 아이오닉을 강하게 추천한다. 리액트 네이티브는 아이오닉에 비해 너무 지저분하다.. 안정성이 많이 떨어진다.. 스트레스로 인한 생명 감소가 느껴지는 프레임워크...ㅋ 누가 이렇게 띄어 놓은거냐...대체 ㅋ




2019년 6월 28일 금요일

[react-native] 안드로이드 signed apk 만드는 방법 (안드로이드 배포 막바지 단계)
* 퍼옴: 출처 - https://iam.holy.kiwi/6


react-native 개발이 웬만큼 끝났다면!! 이제 배포를 해야한다.

안드로이드 apk 파일을 플레이스토어에 배포하기 위해서는 고유한 키스토어를 생성해서 다른 사람이 자신의 앱을 올리지 못하도록 해야한다.

안드로이드 signed apk를 만드는 방법을 알아보자!

1. 키스토어 생성


1
keytool -genkey --keystore <YOUR_KEYSTORE_NAME>.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

cs


2. 생성된 키스토어 파일을 android/app 경로 내에 넣음



3. gradles.properties에 다음 코드를 넣음


1
2
3
4
MYAPP_RELEASE_STORE_FILE=<YOUR_KEYSTORE_NAME>.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=<YOUR_PASSWORD>
MYAPP_RELEASE_KEY_PASSWORD=<YOUR_PASSWORD>
cs


4. app/build.gradle에 다음 코드를 넣음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...
cs



5. 다음 명령어를 통해 개발자 모드를 끈다. (이 작업은 프로젝트 루트 폴더에서 해야 한다. - 다른 곳에서 안됨, 그리고 이 작업을 안하면 만든 apk가 정작 실행이 안됨..;; )


1
2
3
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
cs

6. 다음 명령어를 통해 release apk를 빌드한다.


1
cd android && ./gradlew assembleRelease
cs

7. app-release.apk 파일은 android/app/build/outputs/apk/release 경로에서 찾을 수 있다.

8. 이런 Error 가 나오는 경우가 있음

Execution failed for task ':app:mergeReleaseResources'.Error: Duplicate resources

--> https://stackoverflow.com/questions/53239705/react-native-error-duplicate-resources-android

 그 중 첫 번째 이게 답임

--> After bundling delete the drawable folder from Android Studio. You could find this in android/app/src/main/res/drawable

안드로이드 스트디오까지 갈것 없고 그냥 찾아서 지워주면 됨. drawable 어쩌구 폴더를 전부 다 지워주면 됨.


2018년 10월 15일 월요일

Promise 의 이해

Promise는 JavaScript의 비동기 처리를 위해 탄생했기 때문에 Java나 C++ 등의 동기형 객체지향 프로그래머들이 이해하기 여간 까다로운 개념이 아님.

자바 스크립트는 함수를 인자로 받을 수 있다. 이 점을 잘 인식해야 한다. 여기서 모든 헛갈림이 시작된다.

아래는 인자를 함수로 받는 함수의 정의(선언)
Ex)
function getData(callbackFunc) {
  $.get('url 주소/products/1', function (response) {
if(response){
callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
}
  });
}

이렇게 인자를 함수로 받은 함수를 사용(호출) 할 때 인자로 전달된 함수를 정의(선언) 해서 쓴다.

getData(function(tableData){
console.log(tableData);
});

즉, callbackFunc = function(tableData){
console.log(tableData);
} 이 되는 셈.

프로미스를 쓰면, 이렇게 함수를 정의한다.
function getData() {
return new Promise(function(resolve, reject){
$.get('url 주소/products/1', function(response){
if(response){
resolve(response);
}
reject(new Error("Request is failed"));
});
});
}

즉 promise 라는 객체를 생성 시키는 방법은 function(resolve, reject)함수를 생성자 인자로 던져 주면 된다.
여기서 promise를 return 하는 이유는 return을 함으로써 getData() 함수 밖에 쓸 수(즉 콜백 지옥을 벗어날 수)있기 때문이다.

그리고 promise 의 생성자 인자로 던져진 함수 내부에 시간이 걸리는(즉, 비동기 처리에 원인이 되는- 볼드체 부분) 코드를 넣으면 된다.
그리고 나서 resolve() 함수에 비동기 처리된 결과 값(response)를 넘겨준다.

getData().then(function(data){
console.log(data);
})

그러면 위와 같이 then() 안에 인자로서 resolve(reponse)를 실제 어떤 동작을 하는지 정의(선언) 해주면 된다.
즉, resolve(reponse)는 맨 위의 callbackFunc(response)와 똑같은 역할을 한다.

 getData().then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
});

에러처리는 위와 같이 catch()를 이용한다.
간단히 말해, then에 들어가는 인자는 resolve()를 함수로서 구체화 하는 코드가 들어가고,
catch에 들어가는 인자는 reject()를 함수로서 구체화 하는 코드가 들어가면 된다.