728x90

 


잡설....

선언형 UI 인 제트팩 컴포즈

 

팀에서 프로젝트를 부분부분 컴포즈로 옮겨가고 있었는데, 이번에 새 프로젝트를 시작하게 되면서 가능하면 100% 컴포즈를 이용해보기로했다 (아직은 뷰바인딩이 더 유려한 컴포넌트도 있긴 있응게..)

 

암튼 그래서 새로운 기술스택들이 좀 추가되기도 하고, 이전에 알던걸 좀 더 잘 알아야할 필요가 느껴져서 이전에 공부하던 내용 업로드도 하고 내용 추가도 하면서 나도 공부를 좀 더 해보려함


 

오늘 내용인 컴포즈의 이해는 

 

https://developer.android.com/jetpack/compose/mental-model?hl=ko

 

Compose 이해  |  Jetpack Compose  |  Android Developers

Compose 이해 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Jetpack Compose는 Android를 위한 현대적인 선언형 UI 도구 키트입니다. Compose는 프런트엔드 뷰를 명령

developer.android.com

해당 링크 내용을 내가 다시 보고 이해하기쉽게 나름대로 정리해본것이다.

 

선언형 API 

기존의 UI : UI 위젯트리를 findViewById() 등으로 탐색하고 메서드를 호출, 위젯의 내부 상태를 수정 

선언형 API : 위젯 트리를 인스턴스화하여 UI를 초기화, 비교적 stateless 하고 getter, setter 를 노출하지 않음 (객체로 노출되지 않음), 데이터가 변하면 동일 컴포저블을 다른 param 으로 호출하여(새로운 인스턴스) 업데이트

 

@Composable : 이 함수는 데이터 -> UI 변환을 위한 함수임을 컴파일러에 알림

컴포저블은 다른 컴포저블을 호출하여 UI 계층 구조를 내보낸다.

 

뭐랄까.. 트리구조라고하니까 사과나무를 생각해보면

13번 사과를 익힌다 라고했을 때 기존 방식은 나무검색>13번사과찾아>그사과의 컬러를 레드로 set해라 

라는 느낌이라면 

컴포즈는 13번사과(익음) 을 호출하면 그냥 익은사과가 만들어지고 초록사과 자리에 들어가는 느낌

트리는 13번 사과를 다시 찾을 필요가 없으며 사과는 스스로가 무슨색인지 기억할 필요가 없다(stateless)

 

사용자와의 상호작용 

재구성(recomposition) : onClick 같은 이벤트가 발생하면 앱 상태를 변경 > 그러면 데이터가 변하고 변화 된 새 데이터가 컴포저블을 다시 호출 (위젯을 직접 찾고 수정할 필요 없음)



또한 나무는 사과들을 알아서 관리중이기에 사과를 구성한 데이터가 바뀌면 알아서 

해당 가지와 사과만 업데이트해준다.

 

재구성

 

재구성을 이해하기 전에 부작용이란?

부작용(부수효과)

부작용 : 컴포저블 함수의 범위 밖에서 발생하는 앱 상태에 관한 변경사항 

컴포저블이 아닌 앱의 나머지 부분에 표시되는 변경사항 

ex: 공유객체 속성 쓰기, 뷰모델에 업데이트, 공유 환경설정 업데이트..

 

컴포저블이 실행되면서 컴포저블 밖의 데이터를 건드는 것을 부작용이라 한다. 뭔가 부정적인 네이밍이 개념을 헷갈리게 한다 갠적으로는…. 부작용의 ‘부' 는 부정적인 의미가 아니다. 부작용의 단어정의도 혹시 도움이될까하여 첨부 

: 본래의 치료 효과 이외의 부수적인 효과가 나타나는 것이다. 부수적 효과가 도움이 된다면, 부작용은 치료 목적으로도 물론 이용할 수 있다. (출처 : 위키백과-부작용)

 

새 데이터 인풋으로인해 리컴포지션이 일어날 때, 영향을 받는 있는 함수/람다만 호출되고 나머지는 최대한 건너뛴다.

따라서 리컴포지션 시 부작용을 이용하려 하면 안된다. 



또한 코드가 반드시 표시 된 순서대로 실행되지는 않으므로 순서상 위쪽 코드의 부작용(전역변수 설정 등)을 이용해 아래쪽 코드가 활용하는 구현 또한 불가하다.

 

부작용은 onClick 등의 콜백을 이용해 트리거 되어야 한다.

 

컴포저블의 재구성 특징을 이해하고 있으면 부작용의 오남용을 막을 수 있고, 의도대로 동작하는 코드를 짜는데 도움이 된다.

 

1. 구성 가능한 함수(Composable)는 동시에 실행할 수 있음

컴포저블은 최적화를 위해 여러 다른 스레드에서 동시에 호출될 수 있음

따라서 컴포저블 람다의 변수를 수정하는 코드는 피해야함

여기저기 불려가서 엉망진창의 값이 될 수 있으니까….

 

2. 재구성은 가능한 한 많이 건너뜀

재구성 시에 최대한 많은 요소를 건너뛰므로 다시한번, 부작용이 없어야한다.

 

3. 재구성은 낙관적임

매개변수가 변경되었을 ‘수’ 있을 때마다 재구성이 시작되고, 중간에 매개변수가 또 변하면 취소>재구성이 될 수 있으므로 표시되는 UI에 종속되는 부작용이 있으면 앱 상태가 일관적이지 않을 수 있음

 

4. 구성 가능한 함수(Composable)는 매우 자주 실행될 수 있음

‘공유환경설정에서 읽기’ 등 비용이 많이 드는 작업은 백그라운드 코루틴에서 실행하고 그 결과를 매개변수로 컴포저블에 전달하여야 함.

비용이 많이 드는 작업이 컴포저블 내에 있으면 이것이 불필요하게 반복실행되면서 UI버벅임이 생길 수 있다.

따라서 비용이 많이 드는 작업은 외부 스레드로 이동시키고 mutableStateOf / LiveData 등으로 그 결과를 컴포저블에 전달해야한다.






쉽게 요약하면 내가 컴포저블을 선언은했지만, 실행,재구성하는 시점이나 횟수는 내가 통제하는 것이 아니므로 

컴포저블에 다른거 시키는건(부작용) 지양하자..  

마치 마계생물을 함부로 소환하면 안된다거나 시간축을 건드려서는 안된다는 금기같은것이지 하하

 

 

 

 

 

 

틀린내용 댓글로 달아주시면 감사합니다

 

728x90
728x90

과제를 위해 Django 공부중인데... 한글도 포함 가능하게 slug 를 만들고 그걸로 url 을 지정하려니까 헷갈리는 부분이있어서 검색해봄

 

path() , re_path() 역할 

urlpatterns 에 들어갈 요소를 리턴

 

arguments for path()

path(route, view, kwargs=None, name=None)

 

1) route

자료형 :string 또는 gettext_lazy()

내용 : URL pattern

<> : URL 일부를 캡쳐해서 keyword argument로 view 에 전달

 

ex)

path('bio/<username>/', views.bio, name='bio'),

converter specification 을 포함할 수 있다. 이를테면 <int:section> 요렇게..

 

2) view

자료형: view function 또는 as_view() 의 리턴(class-based view 의 경우) 또는 django.urls.include()

 

 

3) kwargs

view function 이나 method 에 추가적인 argument 를 넘길 수 있게 해준다.

 

 

arguments for re_path()

re_path(route, view, kwargs=None, name=None)

1) route

자료형 : Python 의 re 모듈 정규식을 포함하는 string / gettext_lay()

string 은 raw string syntax (r'') 을 사용하며 이때는 \문자의 escape 를 위한 \ 가 추가로 필요하지 않음

route 가 $로 끝나는 경우, 전체 요청 URL은 regular expression pattern 과 일치해야한다.

>> 사실 이 말이 이해가 잘 안됐는데 아래는 이해하도록 도와준 링크...

 

2), 3) 은 path()의 설명과 동일함..

 

 

출처 :https://docs.djangoproject.com/en/4.0/ref/urls/#module-django.urls.conf

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

728x90
728x90

 

공홈에서 보고 build.gradle Module , Project 에 넣어줬는데 빌드 시 위와같은 에러가 난다.

 

이전에도 났던게 어렴풋이 기억남...

 

해결은 settings.gradle 의 dependencyResolutionManagement  내부에

maven { url 'https://jitpack.io' }

이 줄을 추가해주면 된다.

 

 

나도 또 찾아보기 귀찮아서 포스팅해두기...

사실 가끔 포스팅해놓고 잊어먹고 구글링 또하는데 저번에 그러다가 내 블로그 글이 떠서 실소함...ㅋㅋㅋㅋㅋㅋ

 

출처 :https://github.com/PhilJay/MPAndroidChart/issues/5181#issuecomment-909865975

728x90
728x90

프로젝트를 위해 로드셀 센서를 샀는데 

또 하나의 과정이남았다...  캘리브레이션... 영점잡기..? 

 

Example code 에 있는 HX711_full_example 을 돌려보니 뭔 값만 나오고 어쩌란건가 싶었다

코드를 보니 깃허브 링크가 있다 

 

과정은 다음과 같다.

 

1. set_scale()을 parameter 없이 호출한다. 

    쓰여있는 코드에서 set_scale을 찾아 내용을 비워준다.....

2. tare() 을 호출한다.

3. 무게를 알고있는 물체를 올리고 get_units(10) 호출

4. (내가 올린 무게) / 3번의 결과값  을 해준다. 

이 결과를 set_scale() 인수로 넘긴다.

5. 알맞은 값이 나올 때까지 4번의 결과를 계속조정한다. 

 

예제코드에 set_scale 도 get_unit() 호출도 다 되어있으니 그냥 파라미터 값을 수정하면서 계속 컴파일하고 실행시키면 된다. 

 

아래는 샘플코드

 

/**
 *
 * HX711 library for Arduino - example file
 * https://github.com/bogde/HX711
 *
 * MIT License
 * (c) 2018 Bogdan Necula
 *
**/
#include "HX711.h"


// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 4;
const int LOADCELL_SCK_PIN = 0;


HX711 scale;

void setup() {
  Serial.begin(38400);
  Serial.println("HX711 Demo");

  Serial.println("Initializing the scale");

  // Initialize library with data output pin, clock input pin and gain factor.
  // Channel selection is made by passing the appropriate gain:
  // - With a gain factor of 64 or 128, channel A is selected
  // - With a gain factor of 32, channel B is selected
  // By omitting the gain factor parameter, the library
  // default "128" (Channel A) is used here.
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());			// print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  	// print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);	// print the average of 5 readings from the ADC minus tare weight (not set) divided
						// by the SCALE parameter (not set yet)

  scale.set_scale(2280.f);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();				        // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
						// by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}

void loop() {
  Serial.print("one reading:\t");
  Serial.print(scale.get_units(), 1);
  Serial.print("\t| average:\t");
  Serial.println(scale.get_units(10), 1);

  scale.power_down();			        // put the ADC in sleep mode
  delay(5000);
  scale.power_up();
}

 

위 샘플코드가 들어있는 라이브러리 링크

https://www.arduino.cc/reference/en/libraries/hx711-arduino-library/

 

HX711 Arduino Library - Arduino Reference

Reference > Libraries > Hx711 arduino library HX711 Arduino Library Sensors Library to interface the Avia Semiconductor HX711 ADC. An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for reading load cells

www.arduino.cc

 

캘리브레이션 설명이 있는 깃허브 링크

 

 

https://github.com/bogde/HX711#how-to-calibrate-your-load-cell

 

GitHub - bogde/HX711: An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for

An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for Weight Scales. - GitHub - bogde/HX711: An Arduino library to interface the Avia Semiconduct...

github.com

 

 

728x90
728x90

맨땅에 헤딩으로 해보는 아두이노

고장난 와이파이모듈때매 헤메고나서 정식으로(?) 부품 주문할때는 와이파이가 포함 된 보드를 구입했다 

 

그러고 로드셀 무게센서를 연결하려는데.....

회로도에는 D2에 연결했는데... 내 보드는...D2가 안보인다..??

일반적인 우노보드모양대로 생겼는데...써있는게 다르다...... 

아두이노를 처음 만져봐서 몹시당황스러웠당 

 

메카솔루션 오픈랩에서 본 회로도..

 

내가 구입한 보드,,

 

근데 1. 어떤핀이 D2와 같은..? 핀인지

2. 그럼 IN_PIN 상수값은 뭘로 해줘야하는지... 두가지에서 멈추었다. 

 

결론은 어떤핀이 어떤역할을 하는지 핀맵에 나와있지만 해석이 안되는 나는....판매 페이지에서 요 표를 참고해서 

샘플회로가 D2에 연결되어있으면 > GPIO4, D3에 연결되어있으면 > GPIO0 에 연결했고

상수값은 각각 4와 0 을 넣어주니 잘 작동했다. 

 

아두이노 다루는 분들이 보면 이게 뭔가 싶겠지만.... 

암튼 나는 여기저기 찾아보고 꽤 힘들게 해결했어서, 또 이 보드를 한동안 가지고 씨름해야할거같아서 정리해봄 

 

 

참고한 회로도는 

https://blog.naver.com/roboholic84/220441853297 

 

[아두이노 강좌] 아두이노 로드셀(Load Cell), 무게측정 센서, 계측 앰프 사용하기 (Sparkfun Load Cell Amp

[아두이노 강좌. 아두이노 로드셀 센서, 앰프 사용하여 무게 측정하기] 마이크로 컨트롤러(아두이노) , 로...

blog.naver.com

상품페이지는 

https://mechasolution.com/shop/goods/goods_view.php?&goodsno=330578 

 

전자부품 전문 쇼핑몰 메카솔루션입니다.

국내 최대 전자부품 쇼핑몰, 아두이노 키트, 라즈베리파이 등 당일발송, 예제 제공, 쇼핑 그 이상을 제공합니다.

mechasolution.com

물론 구매도 여기서했다.. 

 

 

728x90
728x90

안드로이드 코드랩을 참고해 데이터바인딩 + 리사이클러뷰+코루틴을 구현중이다.

 

데이터 바인딩 따로, 리사이클러뷰 따로는 찾아보면 쉽게 나와있는데 섞어서 하려니 한참 해메이다가 결국 코드랩 다시하고 코드랩 코드 보면서 하는중..

 

근데 코드랩 코드에도 빨간줄이 쫘아악 가있는 부분이있다

 

실행은 되는데 해당 코드에서 뜨는 에러는

Unresolved reference: SleepTrackerFragmentDirection 

위와 같다.

 

찾아보니 safeArgs 라는 자동으로 탐색용 객체를 만들어주는 플러그인이 있는데 이걸 포함안해서 나는 오류인듯하다.

 

해결방법은 해당 플러그인 활성화이다.

 

 

1. 최상위 Gradle(Project) 맨 위에 아래 코드 추가

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.4.2")
    }
}

 

 

2. Gradle(Module) plugins 에 아래 코드 추가

id("androidx.navigation.safeargs")

 

3. Sync

 

Trouble shooting :

뭔가 잘 안된다싶으면 해당 action 을 navigation 에서 지웠다가 다시 생성해보기

Build > Rebuild 해보기

gradle.properties 에서

android.useAndroidX=true

인지 확인해보기

 

 

 

 

출처 :

더보기

https://developer.android.com/guide/navigation/navigation-navigate?hl=ko#kts

728x90
728x90

게더타운에 방을 만들고, (이전 글 참조)

 

https://holsui.tistory.com/92

 

게더타운 이용하기/게더타운 방 만들기/ 게더타운 계정생성 / 게더타운 쉬운 설명

집에서 혼자 공부하려니 심심하고 집중도 안되어 친구랑 게더타운에서 만나기로 했다. 구글계정 연동으로 쉽게 캐릭터 생성이 가능하고, 닉이나 아바타도 쉽게 바꿀 수 있다. 1. 게더타운 접속

holsui.tistory.com

 

친구를 초대해야 메타버스의 의미가 있을 것이다...

 

 

우측 하단의 Invite 를 누르고 (만약 사이드바가 안보이면 사람모양 아이콘 누르면 됨)

 

 

초대링크의 지속시간을 지정한 뒤 메일을 보내거나 초대 링크를 복사할 수 있다

 

둘다 해봤는데 이미 로그인 되어있거나 하면 메일로 동작이 잘 안되는 경우도 있어서 나는 앞으로 그냥 링크복사를 주로 쓸듯.... 

 

친구가 해당 링크에 접속하면 지정 된 패스워드를 치고 들어올 수 있다!

728x90
728x90

집에서 혼자 공부하려니 심심하고 집중도 안되어 친구랑 게더타운에서 만나기로 했다.

 

구글계정 연동으로 쉽게 캐릭터 생성이 가능하고, 닉이나 아바타도 쉽게 바꿀 수 있다. 

 

 

1. 게더타운 접속 

아래 링크를 이용하거나, 메일을 받은게 있다면 그 링크로 접속이 가능하다.(단, 무료계정의 경우 메일상 링크는 시간제한이있다..)

 

https://www.gather.town/

 

Gather | A better way to meet online.

Centered around fully customizable spaces, Gather makes spending time with your communities just as easy as real life.

www.gather.town

 

2. 로그인

 

 

나는 평범하게..? 구글 로그인..

 

3. 캐릭터 생성

 

 

캐릭터를 디자인할 수 있다.. 머리나 수염 색 등등을 다 위 컬러차트에서 선택할 수 있다 

 

다 꾸몄다면 Next Step 클릭!

 

4. 닉네임 설정

 

닉네임은 언제든 변경가능하고 중복도 가능하니 부담없이 넣어주자!

 

넣었다면 Finish 클릭

 

5. 메일로 전송받은 링크가 있다면 링크를 통해 접속하자.. 

글을 쓰는 22년 3월 4일 현재는 Explore 기능을 사용할 수 없다. 

 

본인이 방을 만들 예정이거나 게더타운 체험중이라면 방 만들기를 해보자!

 

6. 방 만들기

 

Create Space 를 클릭하고 

 

왼쪽부터 

사무실, 이벤트 공간, 소셜공간(?) 세가지가 있다 

나는 친구들을 초대해 같이 공부하거나 떠들 목적이므로 소셜을 골랐다... 

 

사실 이것도 대충 골라도 괜찮음... 다음화면에서 얼마든지 다른것을 고를 수 있기 때문에...

 

그러고나서 템플릿에서 맘에 드는 방을 선택한다

 

수용인원이 적혀있고 실내/실외 여부가 적혀있다 

 

나는 오픈 마이크 카페를 골랐다 

 

 

마지막으로 방제목과 패스워드(선택)을 입력하고 공간의 목적을 선택하면 끝! 

 

7. 입장

 

카메라, 마이크를 확인하고 Join the Gathering을 클릭해입장하면 된다. 내가 만든 방이니 아무도 없다... 부담 노노 

 

 

다음글은 친구 초대하는방법을 적어보겠당

728x90

+ Recent posts