안녕하세요 최섭선생님 저는 인프런에서 선생님의 id software 3D 아티스트 에게 배우는 "Maya 3D 모델링 입문" 강좌를 수강하고 있는 학생입니다 현재 올가닉 모델링예제 파트의 강아지 모델링을 완성하고 얼굴예제의 진도를 나가려 합니다. 강아지의 모델링을 비교적 쉬워 선생님이 윤곽을 잡으실때 사용하신 이미지 불러오기 파일이 없어도 문제없이 완성했습니다만 얼굴예제 파트에 진입하니 선생님이 강좌때 이미지 불러오기 파일에서 쓰신 자료가 있다면 더욱 수월하게 따라 할 수 있을 것 같습니다. 괜찮으시다면 선생님께서 이미지 파일로 불러오신 얼굴예제와 몸 예제 파일을 업로드 부탁드려도 될까요 ?
MQTT 사물인터넷 통신 프로젝트 (Arduino, MQTT, Node.js, mongoDB, Android)
안녕하세요 강의를 듣는 중에 궁금한 사항이 있어서 글을 남깁니다. 저는 시골에 귀농을해서 한우사육을 하고 있는데, 암소 발정 탐지기를 만들기위해서 이래저래 강의를 찾다가 이 강의를 듣게 되었습니다. 소 개체마다 가속도 센서 및 체온센서를 달아서 발정이 오면 활동량이 늘어나고 체온이 올라가는 것을보고 발정이 왔다는 것을 알수 있는 방식입니다. 일단 가속도센서를 이용해서 만보계를 만드는 것 까지는 구현했습니다. 모스키토를 통해서 만보계값을 받아들이면 몽고DB까지 저장하는 것은 조금만 응용하면 만들 수 있을 것 같은데요. 문제는 매일 걸음 수를 체크해야한다는 것입니다. 12시가 되면 초기화해서 다시 0부터 만보계가 돌아가야하는데 아두이노에서는 초기화가 되지않고 계속 카운트가 된다는 것입니다. 이 문제를 어떤식으로 처리하면 좋을까요? 간단히 해결할 수 있을 것 같은데 제가 아직 초보자라 어떻게 하는 게 좋을 지 잘 모르겠네요. 아두이노에서 12시가되면 초기화를 해야하는 것인지 아님 계속 카운드 되는 값을 node. js에서 12시가되면 자동으로 0부터 숫자를 받아 들이게 할 수 있는지 그리고 가능하다면 아두이노가 계속해서 정수값을 카운트하다보면 데이터 한계치에 도달하지는 않는지 궁금합니다. 제가 초보자라 자세한 설명 부탁드립니다. ^^
// ESLint "eslint.validate": [ "javascript", "javascriptreact", "html", "typescriptreact" ], 이렇게만 설정해도 autoFix 가 default 설정이 true 라서 가능합니다. 지글지글 거리는 밑줄이 눈에 거슬리시는 분들은 이렇게 하세요^^ 캡틴 장샘, 진정한 경험과 지식을 나누어 주셔서 항상 감사 드립니다. 강의 아주 유익하게 보고 있습니다.
1. 터미널로 mysql에 로그인 후, table 값 확인하면 정상적으로 동작됨을 확인했습니다. 2. workbench로 보고자 해서, 연결을 시도했는데, 아래와 같은 에러가 나옵니다. 3. 구글 검색을 해도 해결 방법을 잘 모르겠어서, 답답한 마음에 제로초님께 여쭤봅니다.
질문입니다. 결론부터 말씀드리면 로그인 한 후에 network 텝에서 보면 request header의 authorization에 토큰 값이 안들어오고 빈 값으로 "" 확인이 됩니다. 콘솔로 찍어 봤을 때도 마찬가지로 interceptors.js 파일 안에 config가 먼저 출력이 되고 export function setInterceptors ( instance ) { // Add a request interceptor instance . interceptors . request . use ( function ( config ) { // Do something before request is sent console . log ( config ); config . headers . Authorization = store . state . token ; return config ; } , function ( error ) { // Do something with request error return Promise . reject ( error ); } , ); 그 다음 LoginForm.vue에서 console.log(data.token)이 출력이 됩니다. 이를 통해 예상 되는 것은 request.headers의 authorization 안에 토큰 값이 담기기 전에 출력이 되는 것으로 보입니다. 코드의 문제점이 어디에서 잘못된 걸 까요??? store의 store.state.token은 원래 빈 값인데 setToken 함수를 LoginForm.vue에서 submitForm 버튼을 눌러서 setToken을 commit으로 호출해서 store.state.token에 토큰 값이 담겨져 있어서 이거를 interceptors에서 import로 부른 다음 store.state.token을 가져올 꺼라고 생각했는데 토큰 값이 state에 실리기 전에 interceptor가 실행된 것 같습니다... 맞을까요?? }, methods: { async submitForm () { try { // 비즈니스 로직 const userData = { username : this . username , password : this . password , } ; const { data } = await loginUser ( userData ); console . log ( data . token ); this . $store . commit ( ' setToken ' , data . token ); this . $store . commit ( ' setUsername ' , data . user . username ); this . $router . push ( ' /main ' ); } catch ( error ) { // 에러 핸들링할 코드 console . log ( error . response . data ); this . logMessage = error . response . data ; } finally { this . initForm (); } }, console . log ( data . token );
파이어베이스 스토리지에 업로드가 안되는걸로 봐선 사진 업로드 버튼을 눌러도 작동하지 않는것 같습니다. 혹시 사진이 업로드 되는데 시간이 오래 걸리는지요. 작성한 코드는 맞는 것 같은데 반응이 없네요. class AddPhotoActivity : AppCompatActivity() { var PICK_IMAGE_FROM_ALBUM = 0 var storage : FirebaseStorage? = null var photoUri : Uri? = null override fun onCreate (savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout. activity_add_photo ) storage = FirebaseStorage.getInstance() var photoPickerIntent = Intent(Intent. ACTION_PICK ) photoPickerIntent. type = "image/*" startActivityForResult(photoPickerIntent , PICK_IMAGE_FROM_ALBUM ) addphoto_btn_upload.setOnClickListener { contentUpload() } } override fun onActivityResult (requestCode: Int , resultCode: Int , data: Intent?) { super .onActivityResult(requestCode , resultCode , data) if (requestCode == PICK_IMAGE_FROM_ALBUM ){ if (resultCode == Activity. RESULT_OK ){ //This is path to the selected image photoUri = data?. data addphoto_image.setImageURI( photoUri ) } else { //Exit the addPhotoActivity if you leave the album without selecting it finish() } } } fun contentUpload (){ var timestamp = SimpleDateFormat( "yyyyMMdd_HHmmss" ).format(Date()) var imageFileName = "IMAGE_" + timestamp + "_.png" var storageRef = storage ?. reference ?.child( "images" )?.child(imageFileName) //FileUpload storageRef?.putFile( photoUri !!)?.addOnSuccessListener { Toast.makeText( this, getString(R.string. upload_success ) , Toast. LENGTH_LONG ).show() } } }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super .onActivityResult(requestCode, resultCode, data) if (requestCode == GOOGLE_LOGIN_CODE ) { //구글에서 넘겨주는 로그인 결과값 받아오기 var result = Auth. GoogleSignInApi .getSignInResultFromIntent(data) if (result. isSuccess ) { //로그인 성공 시 //이 값을 파이어베이스에 넘길수 있도록 만들어 주기 var account = result. signInAccount //second step firebaseAuthWithGoogle(account) } else { Toast.makeText( this , "로그인 실패" , Toast. LENGTH_LONG ).show() } } } 위의 함수에서 토스트메시지로 로그인 결과값을 받아오는 것이 정상 작동 하는 것까지는 확인하였으나 계속하여 로그인 실패가 발생합니다. logcat 확인 결과는 다음과 같습니다. E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1 W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@8378379 혹시 몰라 전체 코드 첨부합니다. package com.example.instagram import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.auth.api.Auth import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.auth.api.signin.GoogleSignInClient import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.FirebaseUser import com.google.firebase.auth.GoogleAuthProvider import kotlinx.android.synthetic.main.activity_login.* class LoginActivity : AppCompatActivity() { var auth : FirebaseAuth? = null var googleSignInClient : GoogleSignInClient? = null var GOOGLE_LOGIN_CODE = 9001 //구글 로그인 시 사용할 리퀘스트 값 override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout. activity_login ) email_login_button.setOnClickListener { signinAndSignup() } google_sign_in_button.setOnClickListener { //google login first step googleLogin() } //구글 로그인 옵션 만들기 var gso = GoogleSignInOptions.Builder(GoogleSignInOptions. DEFAULT_SIGN_IN ) .requestIdToken(getString(R.string. default_web_client_id )) // 구글 API 키 .requestEmail() // email id 받아오기 .build() // build로 닫아줍니다 googleSignInClient = GoogleSignIn.getClient( this , gso) //firebase 로그인 통합 관리하는 객체 만들기 auth = FirebaseAuth.getInstance() } fun googleLogin() { var signInIntent = googleSignInClient ?. signInIntent startActivityForResult(signInIntent, GOOGLE_LOGIN_CODE ) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super .onActivityResult(requestCode, resultCode, data) if (requestCode == GOOGLE_LOGIN_CODE ) { //구글에서 넘겨주는 로그인 결과값 받아오기 var result = Auth. GoogleSignInApi .getSignInResultFromIntent(data) if (result. isSuccess ) { //로그인 성공 시 //이 값을 파이어베이스에 넘길수 있도록 만들어 주기 var account = result. signInAccount //second step firebaseAuthWithGoogle(account) } else { Toast.makeText( this , "로그인 실패" , Toast. LENGTH_LONG ).show() } } } //구글 로그인 성공시 토큰값을 파이어베이스로 넘겨주어서 계정을 생성하는 코드 fun firebaseAuthWithGoogle(account : GoogleSignInAccount?) { //account 안에 있는 token id를 넘겨주기 var credential = GoogleAuthProvider.getCredential(account?. idToken , null ) auth ?.signInWithCredential(credential) ?.addOnCompleteListener { task -> if (task. isSuccessful ) { //로그인 성공(id, pw 일치) moveMainPage(task. result ?. user ) } else { //로그인 실패 Toast.makeText( this , task. exception ?. message , Toast. LENGTH_LONG ).show() } } } fun signinAndSignup() { auth ?.createUserWithEmailAndPassword(email_edittext. text .toString(), password_edittext. text .toString()) ?.addOnCompleteListener { task -> if (task. isSuccessful ) { //아이디 생성 성공 시 moveMainPage(task. result ?. user ) } else { //이미 계정이 있는 경우 signinEmail() } } } //로그인 함수 fun signinEmail() { auth ?.signInWithEmailAndPassword(email_edittext. text .toString(), password_edittext. text .toString()) ?.addOnCompleteListener { task -> if (task. isSuccessful ) { //로그인 성공(id, pw 일치) moveMainPage(task. result ?. user ) } else { //로그인 실패 Toast.makeText( this , task. exception ?. message , Toast. LENGTH_LONG ).show() } } } //로그인 성공 시 다음 페이지로 넘어가는 함수 fun moveMainPage(user: FirebaseUser?) { //firebaseUser상태를 넘겨줌 if (user != null ) { //user가 있을 경우 startActivity(Intent( this ,MainActivity:: class . java )) } } }
영상의 07:00 부분정도 부터 컬럼 과 매핑을 설명해주시면서 DDL을 말씀해주셨는데, 제가 이해하고 있는 DDL이란 데이터베이스 스키마의 변경,생성을 자동으로 해준다. 라고 이해하고 있습니다. 08:00분 쯤에 하이버네이트에서 `@Column(nullable=false)` 이면 DDL도 해준다 라는 말씀이 어떤 의미인지 잘 이해가안되는데요 제가 이해하고 있는 DDL의 뜻이 JPA에서 자동으로 DB 스키마를 생성, 변경 적용을 해주는 기능이다. 라고 이해하고 있는것이 맞는지 궁금합니다! 그리고 영상의 17:00 부분에 보면 프로젝트의 자바버전이 8버전이 아닌상태에서 단축키를 통해 버전을 변경하시는 듯한 모습으로 추정되는데 어떤 단축키를 통해 설정을 변경하셨는지 궁금합니다...!
강의 내에는 없어서 질문드립니다. 일단 제가 해온 순서대로 적어보겠습니다. 1. 처음에 그냥 mongod 를 했는데 에러가 나서 보니 C:data\db 가 없다고 나오길래 요걸 만들고 나서 다시 실행했습니다. 2. 잘 되길래 이번에는 mongod --auth를 한뒤 Compass에 로그인을 하려니까 비밀번호 없이 했을 땐 로그인이 되고 비밀번호 넣고 했을 땐 시간초과되면서 로그인에 실패했습니다. 3. 보니까 아이디, 비밀번호를 만들어야되는거 같아서 https://planbs.tistory.com/entry/MongoDB-%EC%9D%B8%EC%A6%9Dauthorization-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0 여기 나와있는대로 관리자 계정까지만 생성하고 로그인 시도했습니다. (사용자계정은 admin이 아니길래 안만들었습니다.) 이번에는 비밀번호 넣고 했을 때 로그인이 잘 됐는데 비밀번호 없이 로그인 했을때도 잘 돼는게 이상했습니다. (mongod --auth 상태) 4. 일단 해결방법을 몰라서 강의 계속 들으면서 하다가 서버를 실행시키니까 Authentication 에러로 몽고디비 연결이 계속 끊깁니다.. 아래 코드에서 제로초님이 하신대로 비밀번호를 넣게되면 아래와같은 에러가 발생합니다. mongoose . connect ( 'mongodb://root@localhost:27017/admin' , { dbName : 'nodejs' , MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoError: Authentication failed. 일단 인증없이 진행하긴 했는데 사용자 계정을 만들어야되는지, 아니면 도중에 뭘 빠뜨렸는지... 안되는 이유를 모르겠습니다. 정리해드리면 mongod --auth 상태에서 Compass에 로그인 할 때 비밀번호 없이 로그인해도 정보가 보입니다. 그리고 인증이 필요한 상태에서 서버를 실행하면 위 에러가 발생하면서 몽고디비 연결이 끊깁니다. 인증없이 서버를 실행하면 정상 작동합니다.
로그인전까지 잘 따라 왔는데 login_page.dart 에서 다음과 같은 에러가 납니다. Compiler message: lib/login_page.dart:13:9: Error: 'GoogleSignIn' isn't a type. final GoogleSignIn _googleSignIn = GoogleSignIn(); ^^^^^^^^^^^^ lib/login_page.dart:13:38: Error: Method not found: 'GoogleSignIn'. final GoogleSignIn _googleSignIn = GoogleSignIn(); ^^^^^^^^^^^^ Performing hot reload... Try again after fixing the above error(s).