반응형 분류 전체보기339 Row위젯에서 Text Overflow날 때 앱 막바지 출시 직전에 검토를 하다보니 연세가 있으신분들이 화면을 크게 키워서 overflow이슈가 마구 났었다.생각지도 못한 부분... 임원분께서 나같은 사람들은 어떻게 사용하라고 라는 말 한마디에 많이 반성했다.오버플로우 이슈를 수정하면서 한가지 플러터 꿀팁을 발견했다. 보통 나는 Row안에 좌측에 텍스트, 우측에 아이콘을 넣었는데 그사이에 spacer를 넣었다. 오버플로우 나는 지점이 다 저지점이더라Flexible Expanded 다 넣어봤는데 줄바꿈이 예상보다 심하게 일어난다. 결국에 해결했는데 가장 중요한 포인트는 Spacer를 쓰지 않는다는거다 Spacer를 쓰지 않고 Expanded로 텍스트를 감싸니 화면크기 키우는 이슈는 이쁘게 해결됐다. 고로 기억하자 좌측에 텍스트, 우측에 아이콘.. 2025. 2. 18. GestureDetector 텅빈영역 터치 감지하기 플러터를 하다보면 터치를 주었는데 텅빈영역에서 터치가 안되어서 사용감에 불편을 주는 경우가 많다. 가령 spacer같은 애들... 이를 해결하려면 behavior에 opaque 옵션을 주면 된다. GestureDetector( behavior: HitTestBehavior.opaque, // 빈 공간도 터치 감지 onTap: () { print("Tapped!"); }, child: Text("Tap me!"),), 2025. 1. 9. ios에서 크래시가 났을때 분석방법 product -> scheme -> edit scheme에서 diagnostics탭에 Address Sanitizer를 클릭하면ASan이 돌게 된다. 이 옵션을 활성화 하면 앱이 죽었을 때 코드위치도 깔끔하게 나옴 https://developer.apple.com/documentation/xcode/diagnosing-memory-thread-and-crash-issues-early Diagnosing memory, thread, and crash issues early | Apple Developer DocumentationIdentify runtime crashes and undefined behaviors in your app during testing using Xcode’s sanitizer.. 2025. 1. 2. dynamic사용시 주의점 네이티브에서 플러터쪽으로 함수를 호출했는데 불리지를 않는다. 함수 호출전 까지 갔는데 함수만 안불린다. 이해할수가 없는 현상. 원인은 dynamic이였다. 클래스 안에 있는 메소드에 dynamic을 인풋으로 넣었는데 타입이 안맞아서 함수를 못찾아 불리지 않았다. 별다른 로그도 없고 함수만 안불려서 도대체 뭔가 싶었는데 참 어려운 이슈였음. 따로 다트패드에서 다른방식으로 재현해보니 거긴 로그가 찍히던데 이상하네.. 2024. 12. 31. bloc에서 copyWith을 직접만들면 안되는 이유 흔히보는 copyWith의 코드는 아래와 같다.이 코드의 문제점은 어떤 값을 명시적으로 null로 하고 싶은데 null이 되지 않는다.void main() { User user = User(name: "abc", age:34); print("${user.name} ${user.age}"); user.copyWith(name:null); print("${user.name} ${user.age}"); }class User { final String? name; final int? age; User({this.name, this.age}); User copyWith({ String? name, int? age, }) { return User( name: name .. 2024. 12. 30. 에디터 기능별 단축키 VS CodeAndroid StudioXcodejump to definitionf12cmd + bcmdcursor historyctrl + -, ctrl + shift + -cmd opt generator cmd + enter wrap widgetcmd + .opt + enter auto completectrl + space ctrl + space multiple selectioncmd + dctrl + g find in filescmd + shift + fcmd + shift + f find filecmd + pshift shift find symbolcmd + shift + o(현재파일만)cmd + p 하고 #(전체파일)shift shift auto indentshift + opt + fcmd + .. 2024. 10. 7. flutter gpu 예제 분석 https://github.com/bdero/flutter-gpu-examples GitHub - bdero/flutter-gpu-examplesContribute to bdero/flutter-gpu-examples development by creating an account on GitHub.github.com https://medium.com/flutter/getting-started-with-flutter-gpu-f33d497b7c11 flutter에서 gpu 코드 지원이 가능해졌다고 한다. 관련 내용에 대한 공식사이트 블로그를 보고 예제가 작동이 안되어서 작성자의 깃허브에 들어가 예제코드를 보고 분석하기로 하였다. 간단한 잡지식들GPU 사용법인 초보인 나에게 대충 돌아가는 원리를.. 2024. 9. 11. 맥북에서 LLaMa 파인튜닝 하는방법 하루종일 튜닝방법 찾고 고생하다가 nvidia gpu가 없으면 안되는 이슈를 겪고 포기하던 찰나 애플의 mlx 프레임워크를 사용하고 해결했다. 진짜 애플님들께 감사드린다. 라마 튜닝은 맥북에서 정말 미치도록 쉽다 mlx는 대충 애플실리콘 잘돌아가게 만든 pytorch라고 생각하면 된다. 사용법은 파이토치와 완전 똑같다. 함수이름만 다름. 1. 초간단 개념 정리 llm을 파인튜닝할 때 보통 lora라는놈을 이용한다 이 lora는 모델 자체를 변형시키지 않고, 모델이 어떻게 변해야되는지에 대한 데이터를 내놓는다. 그걸 adapter라고 한다 그리고 adapter와 기존 모델을 fuse 하면 새로운 모델이 나온다. 2. 설치pip install mlx mlx-lm 3. config.yaml 파일.. 2024. 9. 9. 파이토치 큰그림 정리 회사에서 해커톤 대회에 출전할 때 텐서플로우로 이미지 분류를 써본적이 있다. 이번에도 다시 ai를 쓸 일이 있어서 이번에는 파이토치로 도전해보게 되었다. 매번 까먹고 다시공부하고 해서 이번에는 간단히 정리하려 한다 1. 큰그림에서 돌아가는 구조 우리가 일반적으로 아는 인공지능 트레이닝은 흔히 생각하는 신경망 구조를 만든뒤 데이터 넣어주는 작업이다.여기서 막막한 부분은 신경망을 어떻게 구성하고 짜야하는가 인데, 결국 trial and error다. 아무도 모르다는거임 이것만 기억하고 가면 된다. 2. 키워드 한줄요약으로 외우자 텐서 : 인공지능의 넘파이배열 같은거임. 데이터 단위CNN : 이미지 분류같은 2차원에 사용되는 신경망RNN : 1차원에 사용되는 신경망히든레이어 : 신경망 구성할때 세로.. 2024. 9. 5. 연속적인 애니메이션을 만드는 방법 1. Interval을 이용하는 방법 CurvedAnimation을 만들 때 Interval값을 주면 Parent 의 애니메이션 기간에 어떤 부분에서 애니메이션이 실행되고 종료될 지 결정할 수 있다. 2. TweenSequence를 이용하는 방법 https://api.flutter.dev/flutter/animation/TweenSequence-class.html TweenSequence class - animation library - Dart APIEnables creating an Animation whose value is defined by a sequence of Tweens. Each TweenSequenceItem has a weight that defines its percentage .. 2024. 8. 22. Bloc에서 event를 await 하는 방법 그런거 없다 하지만 다른 방법은 있다. 바로 callback 을 사용하면 된다. bloc에서 이벤트를 await 하고 싶은 목적은 아마 state 변경 이벤트를 날리고 이후 변경된 state를 이용하여 무언가를 하기 위한 것 일 것이다. 답은 간단하다. state 를 emit 한 후 콜백을 이용하여 이후 작업을 마저 수행해주면 된다. final class MyEvent extends StudyEvent { void Function()? callback; StopStudyEvent({ this.callback, });} myBloc.add(MyEvent( callback: () async { 하고싶은일 적으면 된다 } })); 이렇게 이벤트에 콜백을 받아와.. 2024. 8. 14. Dart의 class modifier 간단한 정리 매번 까먹어서 유튜브에서 아주 괜찮은 영상을 찾았다. https://www.youtube.com/watch?v=n5WuBICxv_8 아래는 요약된 코드 abstract : 클래스 구현을 다 안해도 된다base : implement를 막는다interface : extends를 막는다final : extends와 implements를 막는다 abstract interface : 다른 언어의 pure interface 만들때 사용 라이브러리 외부일경우// NormalClass can be instantiated, extended, and implementedfinal normalClass = NormalClass();class Normall extends NormalClass {} class N.. 2024. 8. 13. Child가 Rebuild 되지 않도록 하는 원리 플러터의 위젯을 보다보면 어떤 위젯들은 리빌드 될 때 child라는 변수를 받아서 리빌드가 되더라도 child 부분은 리빌드되지 않도록 재활용 한다. 이 원리가 궁금해서 ListenableBuilder를 분석해보았다 위 코드를 보면 이 위젯은 child를 생성자에 받아서 빌더 메소드에 활용한다.빌더 메소드의 정의를 보면 다음과 같다. 여기서 우리가 알 수 있는건, 빌더 메소드는 그저 위젯을 리턴하는 평범한 함수이다. 그리고 child를 받아 이를 위젯만드는데 활용하고 있다. 간단하게 정리하자면, A라는 위젯이 외부에서 만들어진 B라는 위젯을 생성자에서 받아, 이를 빌드 메소드에 사용한다면. 이때 리빌드 되더라도 B는 다시 리빌드 되지 않는다. 걍 한마디로 외부에서 만들어서 넘겨주면 재활용이 .. 2024. 7. 23. 위젯트리에서 중간에있는 위젯만 리빌드 하고 싶을 때 이전에 적은 AnimatedBuilder와 동일한 내용이다. AnimatedBuilder의 상속관계를 보면 ListenableBuilder를 볼 수 있다. 여기서 ListenableBuidler 코드를 확인해보면 똑같이 child를 가짐을 알 수 있다. 고로 Listenable Builder와 ValueNotifier를 조합한 뒤 재활용을 할 때 child를 이용하면 위젯트리의 중간만 리빌드 할 수 있게된다 2024. 7. 22. 애니메이션을 주고싶은데 자식위젯이 너무 많을 때 셀프로 애니메이션을 만들다가 간혹 내가 리빌드할 위젯이 자식위젯이 너무 많이 딸려 있을 때가 있다. 이럴때는 어떻게 해야 할 까? 정답은 AnimatedBuilder를 이용하는 것이다. AnimatedBuilder에는 child 항목이 있는데 여기에 리빌드 되지 않을 위젯을 넣으면 재활용이 가능하다. 또 한가지의 팁은 Listenable에 관한 것이다. 내가 어떤 이벤트를 받을 때 플러터에서 제공하는 대부분의 그러한 클래스들은 Listenable을 상속할 가능성이 높다. 여기서 중요한건 Listenable은 AnimatedWidget에 활용이 가능하다는 점이다!!! 고로 내가 받아올 이벤트가 Listenable과 연관되어 있다면 AnimatedBuilder를 이용하는걸 고려해보자 2024. 7. 11. SliverAppBar에 Sliver 겹치는 방법 결론부터 말하면 안된다. 찾아봤는데 방법이 없다 아니 그럼 어쩌라고? 해결방법은 직접 구현하는 것이다. 하는 방법은 다음과 같다 1. Stack위젯을 만든다2. SliverAppBar에 해당되는 부분을 Container로 만든다3. SingleChildScrollView를 그 위에 덮는다4. 스크롤뷰 탑에다가 패딩을 왕창 물려줘서 AppBar부분 밑까지 내려준다5. ScrollController를 하나 만들어 스크롤뷰에 물려준다 여기서 한가지 중요한 부분이 있다. ScrollController는 Listenable이다 !!! 한마디로 AnimatedBuilder를 사용할 수 있다는것!!! AnimatedBuilder의 장점은 child를 이용해 위젯트리 중간에 위젯만 리빌드하면서 애니.. 2024. 7. 11. HRV 신호 SDNN RMSSD의 차이 기본적으로 정의는 다음과 같다. 아래는 LLM에 물어본 답변이다SDNN과 RMSSD는 모두 심박 변이도(Heart Rate Variability, HRV)를 측정하는 지표이지만, 각각 다른 측면을 나타냅니다. 이 두 지표는 심장의 자율신경계 활동을 평가하는 데 사용되지만, 그들이 측정하는 시간적 스케일과 관련된 신경계 요소가 다릅니다.SDNN (Standard Deviation of NN intervals)정의: SDNN은 모든 연속적인 NN(또는 R-R) 간격의 표준 편차입니다.측정하는 것: SDNN은 장기적인 심장 박동 간격의 변동성을 측정합니다. 이 지표는 전반적인 자율신경계의 조절 능력을 반영하며, 주로 교감신경과 부교감신경의 균형을 나타냅니다.해석: 높은 SDNN 값은 심장의 높은 변동.. 2024. 5. 22. DSP 옛날기억 끄적끄적 1. 주파수 분석 종류 주파수 분석에서 배운 기법들은 푸리에 시리즈푸리에 트랜스폼디스크리트 타임 푸리에 트랜스폼(DTFT)디스크리트 푸리에트랜스폼(DFT)총 4개가 있었음. 푸리에 시리즈는 주기적인 신호에 사용됨 푸리에 트랜스폼은 비주기적인 신호의 주파수성분을 분석할 때 사용됨 디스크리트 타임 푸리에 트랜스폼은 샘플링한 신호를 푸리에 트랜스폼함 마지막 DFT는 DTFT를 주파수 영역에서 한번 더 샘플링함. 그래야 컴퓨터에서 표현 가능하니깐 2. 플롯 주파수 영역을 플롯할 때 절대값을 플롯하는거랑 절대값 제곱을 출력하는 방법 두가지가 있음 절대값은 Amplitude 절대값 제곱은 Power 또는 Energy와 관련되어 있음 푸리에 트랜스폼은 비주기적인 신호를 다룸. 한마디로 얘는 파워가 0임. 고로.. 2024. 5. 17. 파이썬에서 fft를 출력할때 고려해야할 사항 1. fftshift와 fftfreq 그리고 plot 매틀랩에서는 fft데이터를 flot할 때 fftshift를 한번 해주고 plot했던 기억이 있다 이유는 DFT는 주파수 0에서 다음주기 주파수까지 샘플링 하기 때문이다. 하여 원 신호의 주파수 리스폰스(데칼코마니처럼 생긴거)를 보려면, fft한 결과를 반으로 잘라서 오른쪽에있는걸 왼쪽으로 옮겨주어야 한다. 이를 fftshift함수로 이용한다. 나비로 비유하자면, fft로 계산한 결과값은 나비 왼쪽날개가 오른쪽으로 가고, 오른쪽 날개가 왼쪽으로 가있는 상태라, 이를 fftshift로 옮겨주면 된다는말 헌데 파이썬에서는 굳이 fftshift를 안하고 데칼코마니 모양으로 플롯할 수 있다. 코드상 더 깔끔하다 fftfreq는 샘플갯수와 주파수 간격.. 2024. 5. 16. DC 성분이란 (DC Component) 1. DC 성분이란? 어떤 센서로부터 데이터를 받아와서 fft를 하였더니 0hz에서 말도안되는 값이 피크친다. 이유는 다음과 같다. 센서의 데이터는 DC성분과 AC성분이 들어온다. DC성분은 직류 즉 0hz성분이다. 우리는 주파수 분석을 하고싶기에 AC성분이 필요한데, DC성분이 상대적으로 너무 크기에 값이 피크치는 것이다. 2. DC성분 제거하기 scipy에서 이러한 DC 성분을 제거하는 detrend라는 함수를 제공해준다.from scipy import signalsignal = np.array([your data here])signal_without_dc = signal.detrend(signal) 2024. 5. 14. 이전 1 2 3 4 ··· 17 다음 반응형