Dialogflow 정리

0. 환경   django 서버에서 dialogflow rest api를 호출. 1. IAM permission 'XXX' on 'projects/PROJECT_ID/agent' denied. 오류   Dialogflow agent 생성 시 자동으로 서비스 계정을 생성해주는데 권한이 "Dialogflow API 클라이언트"만 들어가있다. 이 상태로 생성 API를 호출하면 위 에러가 발생한다. API를 호출할 때 사용할 서비스 계정에 "Dialogflow API 관리자" 권한을 추가해주면 된다. 2. Read-only field 'XXX' cannot be set. (INVALID_ARGUMENT) 오류   연계 인텐트를 업데이트(batchUpdate)할 때 발생했다. Intent의 읽기전용 필드인 rootFollowupIntentName, parentFollowupIntentName, followupIntentInfo를 수정하려고 하면 발생하는 것 같다. updateMask parameter를 통해 수정하려는 필드를 명시해주는 방법으로 해결했다. updateMask는 "name,displayName,..." 처럼 수정하려는 필드를 ,로 구분된 문자열로 써주면 되는 것 같다( https://developers.google.com/protocol-buffers/docs/reference/google.protobuf?_ga=2.29673912.-664540806.1558407355#fieldmask  참조).   

Nuxt "Cannot read property toLowerCase of undefined" 오류

0. 상황 - Nuxt 1.4.0 - Vue 2.5.16   window.addEventListener('message', someFunc);를 추가하니 "Cannot read property toLowerCase of undefined" 오류가 발생했다. 1) someFunc : 단순히 이벤트를 받아서 넘어온 인자를 확인하고 현재 컴포넌트의 data에 설정하는 함수. 대충 표현하자면 이런 코드이다. somFunc: function (event) {   if (event.data && event.data.type === 'TYPE') {     this.someVal = event.data.value;   } } 2) 넘어오는 값   parent window에서 오류가 발생한 페이지를 iframe으로 불러오고 onload되면 아래처럼 보낸다. (iframe).contentWindow.postMessage({type: 'TYPE', value: 'VALUE'}, '*');  1. 해결   addEventListenr함수의 3번째 인자로 false를 추가했다. window.addEventListener('message', someFunc, false ); 3번째 인자는 listener에 대한 옵션으로 boolean값으로 주면 들어온 이벤트를 전파하는 방법(이벤트 순서)을 설정할 수 있다. true면 capturing을 사용, false면 하지 않겠다는 뜻이다. (bubbling하겠다는 건지는 정확히 모르겠다) addEventListner와 이벤트 순서에 대한 상세는 아래 페이지들 참조. https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener https://www.quirksmode.org/js/events_or...

React native + firebase에서 패키지이름과 관련된 부분

1. 코드에서 1) android/app/src/main/java/[패키지 이름] : 패키지 이름 변경   ex> com/example/aaa -> com/example/bbb 2) android/app/build.gradle : defaultConfig.applicationId를 위에서 변경한 패키지 이름으로 변경   ex> applicationId "com.example.aaa" -> applicationId "com.example.bbb" 3) android/app/src/main/AndroidManifest.xml : package="패키지 이름" 부분을 변경   ex> <manifest ... package="com.example.aaa" -> <manifest ... package="com.example.bbb" 4) android/app/src/main/java/[패키지 이름]/MainActivity.java : getMainComponentName 함수에서 main component 이름을 변경   ex> return "aaa"; -> return "bbb"; 5) android/settings.gradle :  rootProject.name을 변경   ex> rootProject.name="aaa" -> rootProject.name="bbb" 6) /index.js :  등록할 컴포넌트 이름을 4)에서 설정한 이름으로 변경   ex> AppRegistry.registerComponent('aaa', () => 클래스이름); -> AppRegistry.registerComponent('bbb', () => 클래스이름); 7) android...

Django + Postgresql에서 duplicate key value violates unique constraint 오류

0. 환경 - Python 3.7 - Django 1.11 - Postgresql 9.6 Django 관리자 페이지에서 row를 추가하려니 "duplicate key value violates unique constraint"오류가 발생했다. http://searene.me/2016/01/10/django-db-utils-IntegrityError-duplicate-key-value-violates-unique-constraint/  이 페이지 참조해서 sequence를 바꿔주었다. 1. 데이터베이스 접속   \list로 데이터 베이스 이름 확인 후 \connect [데이터베이스이름] 으로 수정할 데이터베이스에 접속한다. 2. id 최댓값 확인   sequence의 마지막 값(=해당 테이블의 마지막 id)는 아래 명령어로 확인할 수 있다. SELECT last_value FROM [sequence이름]; sequence이름은 보통 [테이블이름]_id_seq이고, django에서 만들어주는 테이블 이름은 [앱이름(소문자)]_[모델이름(소문자)]이니까 보통은 [앱이름]_[모델이름]_id_seq로 찾으면 된다. 처음 테이블을 만든 후 모델이름을 수정해도 sequence이름까지 바뀌진 않으니 아래 명령어로 정확히 확인해보자. SELECT c.relname FROM pg_class c WHERE c.relkind = 'S'; sequence의 last_value가 해당 테이블의 마지막 id가 아니면 sequence를 수정해야 한다. 3. sequence 수정 ALTER SEQUENCE [sequence이름] RESTART WITH [마지막id+1];

React native 0.59 + SDK 28(+AndroidX)로 업그레이드하면서 발생한 문제

0. 환경 (개발) - react-native 0.54 -> 0.59 - react 16.3 - mobx-react 5.1 -> 5.4 - mobx 4.3 -> 5.9 - babel ? -> 7 - babel-jest 24.3 -> 24.9 - sdk 26 -> 28 - android build tool 26 -> 28 - gradle 4.4 -> 4.10 - gradle build tool 3.1 -> 3.3 - google services 4.0 -> 4.2 - 64bit architecture 추가 - firebase-core 16 -> firebase-core 17 - react-native-google-signin 1.0 -> react-native-google-signin 2.0 (테스트) - android 8 - galaxy s8 1. 상황   잘 돌아가고 있던 프로젝트를 다시 실행했더니 빌드가 안된다. 찾아보니 패키지 버전 문제인 것 같아서 버전을 전체적으로 올리기로 결정. 2. sdk 버전 업 1) "Manifest merger failed : Attribute application@appComponentFactory..." 에러 발생    https://cishome.tistory.com/108 를 참조해서 gradles.properties에 아래 코드를 추가했다. android.useAndroidX=true android.enableJetifier=true 2) "cannot find symbol ..." 에러 발생   sdk 버전을 올리면서 android.으로 시작하는 패키지가 androidx.로 바뀌어서 못찾아오는 걸로 추정된다.( https://github.com/invertase/react-native-firebase/issues/2332 참조) 이걸 자동으로 해...

Ubuntu 16.04 + Nuxt 2 + Nginx 설정

0. 환경 - ubuntu 16.04 - nuxt 2.10 - node.js 4.6 -> 8.16.2 - npm 3.5 -> 6.4 - nginx 1.10 1. fibers 패키지 설치 오류   nuxt의 dependency인 fibers가 설치가 안돼서 nuxt도 설치되지 않는 문제가 발생했다. fibers 설치 시 node 명령어를 찾아오지 못하는 문제였다. 아래 명령어로 강제로 링크시키면 된다. ln -s /usr/bin/nodejs /usr/bin/node 오류 메시지에 ubuntu 사용자면 apt-get install g++ build-essential 를 실행하라는 메시지가 나오는데 이미 설치되어 있는 것 같다. 2. nuxt를 실행시킬 수 없는 오류   오류 메시지로 node.js를 최신 버전으로 업그레이드하라는 말이 나와서 업그레이드. https://github.com/nodesource/distributions/blob/master/README.md  이 페이지를 참조해서 8.6.12 버전으로 업그레이드했다. 참고로 "curl -sL https://deb.nodesource.com/setup_버전.x | sudo -E bash -" 로 바꾸면 다른 버전도 설치할 수 있다. nvm을 사용해도 되지만 사용자가 여럿일 경우 설치를 진행한 사용자가 아닌 사용자가 nodejs를 사용할 수 없어서 nvm 삭제 후 다시 설치했다. 어떻게(?) 하면 되는 것 같지만 저 위의 방법이 더 편하다. 3. fibers 문제 다시 발생  devDependencies에 있던 fibers를 지우니까 된다... node_modules/를 지우고 전체 패키지를 재설치했다 (sudo npm install) . 4. nginx 설정   사이트 주소로 들어오면 3000포트로 연결하도록 설정하면 된다. nginx경로/sites-enabled/default(파일 이름 변경...

Vue + Nuxt + Handsontable 정리

0. 환경 - Vue 2.6 - Nuxt 2 - handsontable 7.1 - @handonsable/vue 4.1 1. 설치 1) 패키지 설치    https://handsontable.com/docs/7.1.1/frameworks-wrapper-for-vue-installation.html  일단 이 페이지 안내대로 설치한다. 2) nuxt에 적용   보통 외부 패키지를 사용하려면  https://ko.nuxtjs.org/guide/plugins/#vue-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8  이렇게 하는데 플러그인을 만드는 방법이 좀 다르다. https://github.com/handsontable/vue-handsontable-official/issues/70  이 페이지를 참조해서 아래와 같이 작성했다. import Vue from 'vue' import { HotTable } from '@handsontable/vue' export default () => {   if (process.client) {     Vue.component('hot-table', HotTable)   } } nuxt.config.js에는 아래 코드를 추가. ... css: [   'CSS파일경로/handsontable.full.css' ], plugins: [   ...   {src: '~/plugins/플러그인이름.js', ssr: false} ], 클라이언트에서만 적용되는 라이브러리라 그런 것 같다. 2. startRows/startCols와 data property   startRows/startCols보다는 data property가 우선된다. 예를 들어 startRows=10 startCols=10 data=[[null, null,...