프로그래밍 2024. 3. 14. 11:59

세차언제


언제 세차하지? 세차일 고민 끝!
기상청 예보를 바탕으로 세차 예상 지속일을 알려드립니다.

 

안드로이드
https://play.google.com/store/apps/details?id=kr.sheeps.car_washing_day.car_washing_day
IOS
https://apps.apple.com/kr/app/%EC%84%B8%EC%B0%A8%EC%96%B8%EC%A0%9C/id6476641505

 

홈 화면

등록 지역의 일기예보에 맞춰 예상 세차 지속일을 알려줍니다.

 

일자 화면

기상청의 단기, 중기예보를 바탕으로 각 날짜별 예상 지속일을 알려줘요.

특정 날짜에 세차 예정을 등록할 수 있고, 당일이 되면 알림을 보내줍니다.

 

마이페이지

세차 지속 예상에 쓰이는 강수확률을 직접 설정 가능해요. 개인별 맞춤 설정이 가능합니다.

 



안드로이드
https://play.google.com/store/apps/details?id=kr.sheeps.car_washing_day.car_washing_day
IOS
https://apps.apple.com/kr/app/%EC%84%B8%EC%B0%A8%EC%96%B8%EC%A0%9C/id6476641505

posted by Luen
:
프로그래밍/AWS 2024. 2. 6. 10:59

aws 람다에서 사용할 계층을 만들며 고생한 것을 정리한 것입니다.

 

윈도우 환경에서 개발중인데, 일부 패키지들은 OS에 따라 구성이 다르기때문에 Lambda에서 사용할 수 없습니다.

 

이 문제를 해결하기 위한 Docker 사용 등 다른 방법도 있지만 AWS Lambda와 환경이 같은 Cloud9을 이용해서 layer에 사용할 패키지를 설치하는게 가장 깔끔하겠다고 생각해서 이 방법으로 진행했습니다.

 

Cloud9 세팅

AWS Cloud9 환경 생성

 

기본 세팅으로 생성해줍니다.

 

Cloud9 IDE 실행

 

터미널 창 열기

 

 

필요한 파이썬 버전 설치

파일 내려받기

wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz

저는 파이썬3.12.0 버전을 사용했고, 필요한 버전으로 변경해서 사용하면 됩니다.

필요한 버전 파일 확인은 여기서.
https://www.python.org/ftp/python/

파일 추출

tar xvf Python-3.12.0.tgz

설치

cd Python-*/
./configure --enable-optimizations
sudo make altinstall

1 파이썬 디렉토리로 이동

2 최적화

3 기존 설치 버전을 덮어쓰지 않고 설치

시간이 좀 걸립니다.

설치 확인

python3.12 -V

정상적으로 설치되었다면 버전을 확인할 수 있습니다.

 

패키지 설치

가상 환경 생성

cd ..
mkdir packaging
cd packaging
python3.12 -m venv layer_package

1 디렉토리 이동

2 packaging 디렉토리 생성

3 디렉토리 이동

4 가상 환경 생성

 

가상 환경 활성화

source layer_package/bin/activate

패키지 설치

pip install firebase-admin

필요한 패키지를 설치합니다.

저는 lambda에서 fcm을 보내기 위해 firebase-admin을 설치했습니다.

 

firebase-admin의 경우 호환성 관련 에러로 인해 특정 패키지를 다운그레이드 해줬습니다.

pip install cryptography==3.4.8

가상 환경 비활성화

deactivate

패키지 압축

mkdir python
cp -r layer_package/lib/python3.12/site-packages/* python/
zip -r lambda_layer.zip python

1 디렉토리 생성

2 패키지 아카이브

3 압축

다운로드

명령줄로 layer를 만들어 줄 수있지만, 그냥 다운로드 받아서 콘솔에서 업로드 해주었습니다.

 

끝.

 

 

도움되셨다면 하트 눌러주세요!

 

 

참고한 글 목록

https://awstip.com/create-aws-lambda-layers-using-cloud-9-694895903ca5 - 전체적인 방법

https://github.com/pyca/cryptography/issues/9060 - 호환성 에러 관련

posted by Luen
:

Dart에 String method를 전부 실험해봤다.

//실행결과 /type /설명

 

 

 

다트패드로 이것저것 건드려보면 잘 사용하게 될 듯..

dartpad.dev

 

DartPad

 

dartpad.dev

 

posted by Luen
:
프로그래밍/안드로이드 2016. 9. 19. 15:10



layout.setVisibility(View.VISIBLE);

해당 뷰를 보여줌


layout.setVisibility(View.INVISIBLE);

해당 뷰를 안 보여줌(공간은 존재)


layout.setVisibility(View.GONE);

해당 뷰를 안 보여줌(공간마저 감춤)




보여주는 모습이 약간 헷갈릴 수 있는데 예를 들자면 이렇다.



가운데 B2라고 적힌 레이아웃을 setVisibility(View.INVISIBLE)해주면

이렇게 된다. 원래 B2가 있던 공간이 자리를 차지하고 있다.

여기서 아까 그 레이아웃을 layout.setVisibility(View.GONE)해주면

이렇게 된다. 자리를 차지하고 있던것도 사라진다.



posted by Luen
:
프로그래밍/안드로이드 2016. 9. 13. 14:05

이번에 분수 계산하는 클래스를 만들면서 약분을 어떻게 해야할까 고민하다가 검색을 해보니 이런 알고리즘이 있더군요.

최대공약수를 구하는 알고리즘으로 유클리드.. 잘은 모르지만 활용만 해봤습니다.


유클리드 호제법(- 互除法, Euclidean algorithm)은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 유클리드의 《원론》 제7권, 명제 1부터 3까지에 해당한다.

출처 : https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95


최대공약수가 이렇게 간단한 알고리즘으로 구해진다는게 신기하더라구요




해서 위의 알고리즘을 이용하여 코드를 만들면 이렇게 됩니다.

약분때문에 혼자 한참 골머리 앓았는데.. 간단하네요.


posted by Luen
:
프로그래밍/안드로이드 2016. 7. 22. 12:23

안드로이드 특수문자 입력방법입니다.


텍스트뷰나 기타등등에 특수문자를 입력할 때 유니코드를 이용하여 입력합니다.


먼저 특수문자의 유니코드를 알아야겠죠


윈도우즈 실행창에 다음과 같이 입력해서 문자표를 실행시켜줍니다.



그럼 문자표가 뜨는데요




여기서 원하는 기호를 눌러주면 유니코드가 보입니다



이 코드를 입력해주면 되겠습니다.


\u003d 와 같이 입력합니다. 역슬래시라는것에 주의합니다.



xml에도 같은 방법으로 입력할 수 있습니다.

posted by Luen
:
프로그래밍/안드로이드 2016. 7. 15. 17:29
setTextColor에 int를 집어넣으라길래 한참 멘붕해서 검색하다가 찾았다.  

 항상 찾고나서 느끼는건 겁나 간단하다는것.. Reference문서만 봐서는 알 방법이 없다.



posted by Luen
:
프로그래밍/안드로이드 2016. 7. 14. 17:34

난수를 만들어주는 두가지 방법


첫 번째 방법


Math 클래스의 random메소드를 이용한다.


random메소드는 0과 1사이의 double형 난수를 만들어준다.


예시


두 번째 방법

Random 클래스를 이용한다.

Random 클래스의 nextInt(int n), nextDouble, nextBoolean 등등의 메소드를 이용한다.

nextInt(int n)의 경우 0과 n-1사이의 정수형 난수를 만들어 줘서 편하게 사용할 수 있다.


Random클래스의 자세한 부분은 Reference문서 참조
https://developer.android.com/reference/java/util/Random.html


posted by Luen
:
프로그래밍/안드로이드 2016. 7. 13. 15:38

Intent를 이용하여 전환합니다.


먼저 새로 만든 액티비티를 매니페스트 문서에 등록해줍니다.



그리고 새로운 액티비티로 전환할 액티비티의 온클릭 등 적당한 위치에 Intent를 이용하여 새 액티비티를 띄워줍니다.




끝! 간단하네요.


posted by Luen
:
프로그래밍/안드로이드 2016. 7. 13. 13:48

ExpandableList가 깔끔하고 좋아보이길래 테스트를 했습니다만..


OnItemClickListener로 클릭 할 수 없더라구요!?


그래서 여기저기 검색한 결과


GroupClick과 ChildClick으로 나눠져 있더군요


그리고 onChildClick메소드가 void가 아니라 boolean이던데 왜 그런지, 어떤 효용인지는 아직 잘 모르겠네요


어떻게 쓰는거지..


리스너는 다음과 같이 쓰면 되더라구요



Reference

https://developer.android.com/reference/android/widget/ExpandableListView.html

https://developer.android.com/reference/android/widget/ExpandableListView.OnChildClickListener.html


posted by Luen
: