📜 시나리오

  1. 사용자가 "지갑 연결" 버튼 클릭 시, MetaMask와 연결 시도
  2. 연결에 성공하면 지갑 주소를 화면에 표시
  3. 해당 주소의 ETH 잔액을 불러와 화면에 표시
  4. 단위는 ETH (소수점 4자리까지)
import { useEffect, useRef, useState } from "react";
import { ethers } from "ethers";

export default function WalletInfo() {
  const [address, setAddress] = useState("");
  const [balance, setBalance] = useState("");
  //useRef를 사용해 provider을 저장해서 재사용 
  const providerRef = useRef<ethers.BrowserProvider | null>(null);

  const connectWallet = async () => {
    if (!window.ethereum) {
      alert("MetaMask가 필요합니다.");
      return;
    }

    const provider = new ethers.BrowserProvider(window.ethereum);
    providerRef.current = provider;

    const accounts = await provider.send("eth_requestAccounts", []);
    const account = accounts[0];
    setAddress(account);
  };

  useEffect(() => {
    if (!address || !providerRef.current) return;

    const updateBalance = async () => {
      const balanceBigInt = await providerRef.current!.getBalance(address);
      //wei를 ETH로 바꿔주세요 
      const ethBalance = ethers.formatEther(balanceBigInt);
      setBalance(parseFloat(ethBalance).toFixed(4));
    };

    // 최초 조회
    updateBalance();

    // 5초마다 잔액 갱신
    const interval = setInterval(updateBalance, 5000);

    return () => clearInterval(interval); // cleanup
  }, [address]);

  return (
    <div>
      <button onClick={connectWallet}>지갑 연결</button>
      {address && (
        <div>
          <p>주소: {address}</p>
          <p>잔액: {balance} ETH</p>
        </div>
      )}
    </div>
  );
}

 

 

  • provider.send와 provider.getSigner()의 차이는?
    • provider.send("eth_requestAccounts"):메타마스크로부터 read-only 계정 목록을 요청합니다.
    • provider.getSigner(): 서명이나 트랜잭션을 보낼 수 있는 서명자 객체를 반환합니다.
  • formatEther, parseEther 사용 이유?
    • 👉 이더리움의 단위는 Wei(10^18) 기준이기 때문에,
      실제로 표시하거나 보낼 때는 사람이 읽을 수 있는 ETH 단위로 변환해야 해요.
    • formatEther: wei -> ETH
    • parseEther: ETH -> wei
  • 잔액이 실시간으로 변동될 경우 어떻게 반영할 수 있을까?
    • **setInterval**로 주기적으로 잔액 갱신
    • **provider.on("block", callback)**을 사용해서 블록마다 잔액 확인
    • provider.on("pending") 이벤트 활용해서 감지 (희귀하지만 가능)

 

 

fcm 수신 오류 해결을 위한 테스트_ react-native에서 직접 api호출해보기

시나리오 

  1. React Native 앱에서 Spring API를 호출하여 푸시 알림을 요청합니다.
  2. Spring에서 해당 요청을 받아서 FCM 서버에 푸시 알림을 전송합니다.
  3. React Native 앱FCM 서버로부터 푸시 알림을 수신하고, 이를 처리하여 화면에 표시합니다.
import axios from 'axios';

const sendNotificationToSpring = async () => {
  try {
    const response = await axios.post('http://localhost:8080/sendNotification', {
      token: 'FCM_DEVICE_TOKEN',  // 푸시 알림을 받을 디바이스의 FCM 토큰
      title: '테스트 푸시 알림',
      body: '이것은 테스트 알림입니다.',
    });
    console.log('푸시 알림 요청 성공:', response.data);
  } catch (error) {
    console.error('푸시 알림 요청 실패:', error);
  }
};

 

React Native 앱에서 푸시 알림 수신 하기

import messaging from '@react-native-firebase/messaging';

useEffect(() => {
  // 푸시 알림 수신을 위한 설정
  const unsubscribe = messaging().onMessage(async remoteMessage => {
    console.log('푸시 알림 수신:', remoteMessage);
    // 알림을 화면에 표시하거나 다른 동작을 처리할 수 있습니다.
  });

  // 백그라운드/종료 상태에서 푸시 알림 수신 설정
  messaging().onNotificationOpenedApp(remoteMessage => {
    console.log('앱을 열었을 때 받은 푸시 알림:', remoteMessage);
  });

  messaging().getInitialNotification().then(remoteMessage => {
    if (remoteMessage) {
      console.log('앱 종료 상태에서 푸시 알림 수신:', remoteMessage);
    }
  });

  return unsubscribe;
}, []);

 

결과: 

  독립변수
질적변수 양적변수
종속변수 양적변수 T-검정 단순선형회귀분석 
ANOVA 다중선형회귀분석
질적변수 카이제곱검정 로지스틱회귀분석

카이제곱검정:  

동질성검정 (Homogenuity): "둘은 같다고 볼 수 있는가?" 

두 개 이상의 모집단에서 표본추출하여 집단의 범주 비율을 비교하는 방법이다.

귀무가설: 기본적으로 각 모집단에 대해서 모든 범주의 확률이 동일하다.

 

독립성검정(Independency): "관련이 있는가??"

하나의 모집단에서 표본추출하여 두 가지 특성간 관련성을 비교하는 방법이다.

귀무가설: 두 특성은 관련성이 없다(독립이다)

 

일표본 T-Test

단일 변수의 평균과 지정한 상수와의 차이를 검정하는 방법이다.

-공장에서 생산하는 과자 무게가 100g이 맞는가?

 

이표본

대응표본 T-Test(Paired T-Test) 

두 그룹의 평균의 차이를 검정하는 방법이다.

-당뇨병 환자를 대상으로 A약을 투약했을 때 혈당 수치의 전후 차이가 존재하는가? 

(차이존재: 양측검정

하나가 다른하나보다 큰가?: 단측검정)

-식이요법 전후의 몸무게 변화가 있었는가?

 

 

독립표본 T-Test(Independent T-Test)

  1. 등분산검정 (F-Test, 검정통계량으로 F를 사용한다)
  2. F-Test의 결과를 가지고 (t값) 유의확률을 계산한다.

Byte Pair Encoding: BPE란 데이터에서 가장 많이 등장한 문자열을 병합해서 데이터를 압축하는 기법이다. 

토큰화절차:

  • Pretokenize: 말뭉치의 모든 문장을 공백으로 나눠준다. 
  • 어휘집합구축: 자주 등장하는 문자열을 병합하고 이를 어휘 집합에 구축한다.   
(어휘집합 ==> vocab.json 파일로 저장된다, 
바이그램쌍 병합이력 ==> merge.txt로 만들어준다.)
  • 토큰화: 어휘집합 (vocab.json)과 병합 우선순위(merge.txt)가 있으면 토큰화 수행가능, 어휘집합에 있는 서브워드가 포함되었을 때, 해당 서브워드를 어절에서 분리한다.  
  • GPT 토크나이저 구축(BPE tokenizer) 
  • BERT 토크나이저 구축(work piece tokenizer) likelihood 기반 
말뭉치에서 자주 등장한 문자열을 토큰으로 인식, BPE처럼 빈도 기준 병합이 아니라, 병합했을 때 우도를 높이는 글자쌍을 병합한다. 

 

 

'Pytorch Study > NLP' 카테고리의 다른 글

정리  (0) 2023.05.26

seq_to_seq:

transformer은 seq-to-seq과제를 수행하는 모델.(핵심 구성 요소는 셀프 어텐션)

seq-to-seq는 특정 속성을 지닌 시퀀스를 다른 속성의 시퀀스로 변환하는 작업을 말한다. 

인코더: 소스 시퀀스 정보를 압축하는 과정( multi-head attention, fead forward neural network, residual connection, layer normalization의 요소로 구성되어 있다. )

*self attention: 입력 시퀀스 가운데 태스크 수행에 의미있는 요소들 위주로 정보를 추출한다. 

query, key, value가 서로 영향을 주고받으면서 문장의 의미를 계산한다. 

 

디코더: 인코더가 보내준 소스 시퀀스 정보를 받아서 타깃 시퀀스 생성 

 

word2vec: 

gensim library에서 similarity 계산가능 

단어상의 관계를 파악할 수 있다

Cbow/ Skip-gram

CC

SGD: 한 걸음은 너무 오래 걸리니까 조금만 보고 빨리 판단한다. 

Momentum: 스텝 계산해서 움직인 후, 관성 방향대로 가자 

RMSprop: 맥락, 상황 봐가면서하자

Adam: Momentum + RMSprop

 

NER: 문장을 토큰화한뒤, 토큰 각각에 인명, 지명, 기관명 등 개체명 태그를 붙여주는 ㅗ가제

 

BPE 어휘집합은 고빈도 바이그램 쌍을 병합하는 방식으로 구축된다. 

 

 

'Pytorch Study > NLP' 카테고리의 다른 글

Byte Pair Encoding  (0) 2023.05.28

+ Recent posts