https://medium.com/@ericmorgan1/upload-images-to-firebase-in-expo-c4a7d4c46d06

 

Upload Images to Firebase in Expo - EM - Medium

The ability to upload images directly to Firebase Storage has finally arrived with the release of Expo 26!!! Here’s a quick tutorial for…

medium.com

이 글을 참고했다.

 

expo imagepicker로 갤러리에 있는 uri를 받아오고 firebase에 이미지 업로드하려고 putFile을 호출했는데 자꾸 없덴다 ㅡㅡ

몇시간을 날렸는지 모르겠음; 분명 API문서에 있는 함수고, 사용법도 맞춰서 썼고, 버전도 다 최신꺼라 업데이트 할것도 없는데!! 왜이러는거야!!! 다른사람이 올린 예제 복붙했는데도 그런 함수 없다고 하고.. 하..

 

해결은 했지만 아직도 왜 안됬는지 모르겠다. putFile 안쓰고 그냥 put썼다 ㅡㅡ

 

const response = await fetch(this.state.profile_image);

const blob = await response.blob();

imagesRef.put(blob);

 

putFile쓰는 사람은 어떻게 한거야?!!!

 

npm ERR! path /home/limenju/react-native-project/dateApp/node_modules/react-native-facebook-login
npm ERR! code EISGIT
npm ERR! git /home/limenju/react-native-project/dateApp/node_modules/react-native-facebook-login: Appears to be a git repo or submodule.
npm ERR! git     /home/limenju/react-native-project/dateApp/node_modules/react-native-facebook-login
npm ERR! git Refusing to remove it. Update manually,
npm ERR! git or move it out of the way first.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/limenju/.npm/_logs/2019-07-11T07_01_31_358Z-debug.log

불러오는 중입니다...

 

npm으로 뭐 설치할때마다 .git이랑 충돌난다.

 

내경우에는,

node_modules/react-native-facebook-login/.git 파일을 삭제해주고 설치하려고 했던 모듈을 재설치해주면 잘된다.

우분투를 설치하고 한글 입력이 안되서 IBUS로 설정했다.

한글 입력은 잘됬지만 visual studio code에서는 한글 입력이 안되었고 UIM으로 변경했다.

 

UIM 으로 변경하기

http://progtrend.blogspot.com/2018/06/ubuntu-1804-uim.html

 

Ubuntu 18.04 한글 입력기 UIM 설정하기

Ubuntu 에서 한글 입력기 uim 설정하기

progtrend.blogspot.com

 

프로젝트를 하려고 visual studio code를 켰는데 이상한점이 발견됬다.

내 프로젝트 폴더는 관리자 권한이 있어야 저장 가능한데, 관리자 권한으로 visual studio code를 키면 한글 입력이 안됬다.

권한없이 visual studio code를 키면 한글이 잘 써진다.

 

왜 이런 차이가 있나.. 궁금했지만 한글로 구글링해보니 나와 유사한 사람을 찾지 못했고 영어로 한글 입력에 대한걸 검색해봤자 딱히 이유를 찾지 못할것같아서 그냥 프로젝트 폴더 권한을 내렸다.

 

$ sudo chown -R <user-name> <directory-name>

 

끝! 이제 내 프로젝트에 한글 입력이 잘된다!

요며칠 삽질만 엄청 많이하고있다.

 

1. expo 무한빌드 -> expo optimize 하라고 경고뜸

2. expo optimize 입력 -> 에러뜸 (This command requires version 1.10.0 of `sharp-cli`. 
You can install it using `npm install -g sharp-cli@1.10.0`. 

For prerequisites, see: https://sharp.dimens.io/en/stable/install/#prerequisites)

 

Installation - sharp

Installation npm install sharp yarn add sharp Prerequisites Building from source Pre-compiled binaries for sharp are provided for use with Node versions 6, 8, 10, 11 and 12 on 64-bit Windows, OS X and Linux platforms. Sharp will be built from source at ins

sharp.dimens.io

 

3. npm install -g sharp-cli@1.10.0 입력 -> ERR! sharp EACCES: permission denied, open '/usr/lib/node_modules

4. sudo npm install --unsafe-perm -g expo-cli 입력해서 해결 -> sharp설치 됨, 무한빌드 해결됨

sudo expo start --no-dev --minify

 

로 시작하면 된다. 솔직히 이건 왜뜨는건지 잘.. 모르겠다.

ubuntu 16.04 스티커 메모

$ sudo add-apt-repository ppa:umang/indicator-stickynotes

$ sudo apt-get update

$ sudo apt-get install indicator-stickynotes

 indicator-stickynotes

 

 

 

코드 복붙해서 쓸라고했는데 왜 블록이 안댐;ㅜ

며ㅇ어어어엋시간을 날린지 모르겠다. 나눈 리눅스고 firebase때매 sha1이 필요한데 허구한날 오류만 내뱉음

 

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 
keytool 오류: java.lang.Exception: 키 저장소 파일이 존재하지 않음: /home/내이름/.android/debug.keystore

 

구글문서에는 /.android에 debug.keystore이 있다는데 개뿔 없다 없어서 자꾸 메시지를 내뿜는다

윈도우에서 해결법은 있던데 리눅스에선 못찾겠음ㅇㅇ 포기하려다가 되서 넘 죠음

 

keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"

 

없으면 만들면 된다

 

을 터미널에 다시 입력해주면 SHA1값이 뜬다. 많은 사람들에게 도움이 되길 바람,,

 

https://stackoverflow.com/questions/8576732/there-is-no-debug-keystore-in-android-folder

 

There is no debug.keystore in .android folder

Someone I'm helping with an application needs to locate her debug.keystore - mine is in my .android folder, but when I navigate there on her computer it is not there. Does something need to be don...

stackoverflow.com

 


1. 작업스레드에서 메인스레드로 작업 전달하기




안드로이드에서 작업스레드는 UI작업을 할 수 없으므로 메인 스레드로 작업을 전달하여 작업스레드에서 UI를 변경하는 것처럼 만들어야 합니다.



그 방법으로는 4가지가 있습니다. 


1. Handler.post()

2. Activity.runOnUiThread()

3. view.post()

4. AsyncTask 클래스



이 4가지의 공통점은 작업스레드가 메인스레드로 메시지를 전달한다는 것 입니다.



메인스레드는 내부적으로 Looper을 가지며 그 안에는 메시지큐가 포함됩니다.



메시지큐는 다른 스레다나 혹은 자기 자신으로부터 전달받은 Message를 기본적으로 선입선출형식으로 보관하는 큐입니다.



Looper는 메시지큐에서 메시지나 Runnable객체를 차례로 꺼내 Handler가 처리하도록 전달합니다. 

Handler는 Looper로 부터 받은 메시지를 실행, 처리, 다른스레드로부터 메시지를 전달받아 메시지큐에 넣는 역할을 하는 스레드간의 통신 장치입니다.












2. 구현하기(Handler.post(),Activity.runOnUiThread())




2.1. Handler.post()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.example.user.myapplication;
 
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    Handler handler;                //메인 스레드로 작업을 전달할 핸들러
    TextView myThreadText;          //작업스레드의 이름을 출력할 텍트스뷰
    TextView mainThreadText;        //메인스레드의 이름을 출력할 텍트스뷰
 
    String myThreadStr;             //작업스레드의 이름을 출력할 문자열
    String mainThreadStr;           //메인스레드의 이름을 출력할 문자열
 
    boolean flag;                   //스레드 내부의 while문을 제어할 flag
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     //레이아웃 연결
 
        myThreadText = (TextView) findViewById(R.id.myThreadText);              //출력할 텍스트뷰 연결
        mainThreadText = (TextView) findViewById(R.id.mainThreadText);          //출력할 텍스트뷰 연결
 
        handler = new Handler();        //메인 스레드로 작업을 전달할 핸들러
 
        myThreadStr = "";
        mainThreadStr = "";
        flag = true;
 
        Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
 
                Thread.currentThread().setName("하릐's thread");      //작업스레드의 이름 변경
 
                while(flag){
                    try {
                        myThreadStr += Thread.currentThread() + "\n";
 
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                //메인스레드가 처리한 작업의 번호
                                mainThreadStr += Thread.currentThread() + "\n";
                                mainThreadText.setText(mainThreadStr);
                                myThreadText.setText(myThreadStr);
 
                            }
                        });
 
                        Thread.sleep(1000);         //스레드 대기 (메인스레드 처리)
 
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                 }
            }
        });
 
        th.start();
    }
}
 
cs


핸들러의 post()를 사용해 작업스레드에서 메인스레드로 작업을 전달하고 있습니다.


36번째 줄 Thread.currentThread().setName("하릐's thread"); 는 작업스레드의 이름을 하릐's thread로 변경합니다.


42-48번째 줄에서 작업스레드의 이름과 post내부에서 스레드의 이름을 호출하면 두개의 스레드의 이름이 출력되는 것을 확인할 수 있습니다.




<결과 화면>






2.2. Activity.runOnUiThread()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.example.user.myapplication;
 
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    Handler handler;                //메인 스레드로 작업을 전달할 핸들러
    TextView myThreadText;          //작업스레드의 이름을 출력할 텍트스뷰
    TextView mainThreadText;        //메인스레드의 이름을 출력할 텍트스뷰
 
    String myThreadStr;             //작업스레드의 이름을 출력할 문자열
    String mainThreadStr;           //메인스레드의 이름을 출력할 문자열
 
    boolean flag;                   //스레드 내부의 while문을 제어할 flag
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     //레이아웃 연결
 
        myThreadText = (TextView) findViewById(R.id.myThreadText);              //출력할 텍스트뷰 연결
        mainThreadText = (TextView) findViewById(R.id.mainThreadText);          //출력할 텍스트뷰 연결
 
        handler = new Handler();        //메인 스레드로 작업을 전달할 핸들러
 
        myThreadStr = "";
        mainThreadStr = "";
        flag = true;
 
        Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
 
                Thread.currentThread().setName("하릐's thread");      //작업스레드의 이름 변경
 
                while(flag){
                    try {
                        myThreadStr += Thread.currentThread() + "\n";
 
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //메인스레드가 처리한 작업의 번호
                                mainThreadStr += Thread.currentThread() + "\n";
                                mainThreadText.setText(mainThreadStr);
                                myThreadText.setText(myThreadStr);
 
                            }
                        });
 
                        Thread.sleep(1000);         //스레드 대기 (메인스레드 처리)
 
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                 }
            }
        });
 
        th.start();
    }
}
 
cs




runOnUiThread의 사용 방법은 handler.post와 유사합니다.




<결과 화면>






3. Handler.post 와 Activity.runOnUiThread의 차이



https://medium.com/@yossisegev/understanding-activity-runonuithread-e102d388fe93





























+ Recent posts