-
안드로이드에서의 가장 간단하고 확실한 칼만필터(Kalman Filter) 테스트
얼마 전 아는 지인을 통해 칼만필터(Kalman Filter)라는것을 알게 되었다. 오래전 기울기센서를 이용한 "운전좀하냐" 라는 게임을 만들때에 자동차가 엄청 흔들리고 불안정해서 온갖방법과 테스트를 해보았지만 결국 만족스러운 결과를 못내고 출시해야 했다ㅠㅠ 그런데 우연히 지인을 통해 알게된 칼만필터를 써보니!! 한방에 해결이 되는게 아닌가ㅎㅎ 물론 좀더 손을 봐야 할것 같지만 어쨋든 예전소스랑 칼만필터를 결합하니 제법 만족스런 결과를 얻어냈다 그래서 여기에 직접 칼만필터의 위력을 보여주고자 한다... 우선 칼만필터란 잡음같은것을 없에는 기법이다. 기울기센서에서는 민감한 센서에 의해 아주작은 손떨림에도 반응하여 값이 흔들리는 현상을 보정해 준다 기본원리는 간단하다. 기울기센서 값을 계속 저장해 두었다가 ..
2014.03.17
-
삼각 분포로 난수 발생시키기
가우시안 분포 즉, 정규분포로 난수를 발생시켜야 하는 경우가 종종 있다. 하지만 우리가 흔히 사용하는 rand() 함수는 균일 분포로 난수를 가져오므로 따로 구현해야 한다. 다행히 정규분포 난수 발생 소스는 인터넷상에서 쉽게 구할수 있기 때문에 별 문제 될 건 없다. 한 가지 딴지를 걸자면 정규분포는 피 적분이 안되기 때문에 반복문을 사용해 난수를 만들어야 한다. 만약, 아주 많은 난수를 한꺼번에 발생시킨다면, 부하가 걸릴 수 있다는 말이다. 물론, 아주 쓸데없는 걱정이다. 그정도로 21세기의 컴퓨터는 나약하지 않다ㅎㅎ 어쨌거나 반복문이 없는 확률 밀도 기반 난수를 쓰고 싶다는 어리석은 생각에 다음과 같은 삼각 분포 난수 함수를 만들어 보았다. 삼각형 그래프는 정적분이 쉬워서 면적을 비율 삼아 난수를 발..
2019.10.28
-
사각형 말고 원형 충돌검사
게임상에서 가장 기본적인 충돌검사는 사각, 원, 선 검사라고 생각한다 왜냐하면 이 세가지의 개념을 조합하면 좀더 정밀한 다각형, 픽셀 검사를 할수 있기 때문이다 여기서는 단순하게 원형끼리의 검사를 살펴보겠다 원은 한점에서 일정거리 만큼의 영역을 가지는 도형이다 그래서 두 원의 영역이 겹치는 조건은 중심점끼리의 거리로 판단한다. 위와 같이 중심점 사이의 거리가 두 반지름의 합보다 크면 서로 떨어져 있는 것이다. 두점 사이의 거리는 중3때 배우는 공식을 사용하면 된다 (http://mathbang.net/138) 반대의 경우로 중심점 거리가 반지름의 합보다 작아지면 겹치게 된다. 즉, 이때가 충돌한 것이다. 충돌이긴 한데.. 완전히 겹치는, 다시 말해 한 원에 완전히 포함되는 경우는 반지름의 차로 계산한다...
2016.01.25
-
초간단 꺽은선 그래프 만들기
그래프는 텍스트로 표현하기 복잡한 정보를 한결 보기좋게 만드는 매력이 있다. 그래서 간편함의 상징인 모바일에서는 빠질수 없는 요소이다. 특히 많이 쓰이는 것이 막대 그래프와 꺽은선 그래프 일것이다. 그런데 꺽은선 그래프는 선이 하나로 이어져 있기 때문에 만드는데 애를 먹을때가 있다 그때를 대비해 초간단 꺽은선 그래프뷰를 만들어 놓자~ 구미에 맞게 확장해서 쓰면 매우 유용하다 public class GraphView extends View { private ShapeDrawable mLineShape; private Paint mPointPaint; private float mThickness; private int[] mPoints, mPointX, mPointY; private int mPointSiz..
2016.04.25
-
EditText에 자동으로 단위 콤마 넣기
NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다. 하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다. 입력할때마다 콤마가 찍혀야 하는데... addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다. 그래서 살짝 꼼수를 부려봤다. EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고, 후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다. 사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ 소스는 다음과 같다. 요즘 뜨고 ..
2019.01.17
인기글
-
손쉽게 아이폰 앱을 새로 실행 시키는 코드 한줄
안드로이드에서는 메인 activity를 종료하고 다시 호출하면 바로 재시작이 된다. 하지만 아이폰에서는 그렇게 할수가 없었다. 혹시나 하는 마음에 재시작 시키는 함수를 찾아봤지만 이 또한 없었다. 나의 구글링 실력이 부족해서 못찾은거일수도 있지만... 좌절하고 있는 순간... 정말 우연하게 방법을 알아냈다. 사실 실수로 코드를 잘못 넣었는데... 재시작이 되는것이다... 아! 실수로 찍은 로또나 될것이지.. 어쨋든 기분은 좋다. 불로소득같은 느낌이다. 방법은 진짜 간단하다. AppDelegate 의 applicationWillEnterForeground 에서 exit(0)를 호출해주면 된다. 아마도 잠에서 깨어나기 직전에 종료를 해주면 깨어나는 작업이 중단되지 않고 계속 진행되면서 재시작되는 효과가 나오..
2018.03.26
-
DialogFragment에 DismissListener를 쉽게 사용하는 방법
DialogFragment를 종료한 후 결과를 받아서 처리해야 할때가 있다. 당연히 이때는 DismissListener를 사용하면 된다. 하지만 그냥 사용하는것보다 약간의 튜닝을 하면 더 편하다. public abstract class DialogDismissListener implements DialogInterface.OnDismissListener { private HashMap mStrMap; private HashMap mIntMap; private HashMap mBoolMap; public void setValue(String key, String value) { if(mStrMap == null) mStrMap = new HashMap(); mStrMap.put(key, value); } ..
2015.09.21
-
오전과 오후가 만나는 곳 실미도 해수욕장
서울에서 가장 가기 쉬운 바닷가하면~ 인천이겠죠~ 그중에서도 영종고속도로로 한방에 뚫려있는 무의도는 단연 최고에요ㅎㅎ 무의도로 들어갈려면 일단 배를 타야 하는데요~ 차를 가지고 왔다면 2만원에.. 사람 한명당 3,800원을 내면 왕복 가능해요 저기 보이는 배로 가는거죠~ 배를 타면 새우깡을 먹고사는 갈매기가 따라오죠 엄청 빨리 도착합니다. 거리가 별로 안돼요ㅎㅎ 그래서 인지 무의도와 연결되는 다리가 공사중이에요... 사진의 왼쪽에 보이시죠 아마 조만간 배를 타지 않아도 될듯 하네요... 갈매기들의 밥줄이 끊기는 거죠ㅠ 무의도에는 두개의 해수욕장이 있는데요.. 하나개와 실미도입니다 하나개가 좀더 크긴한데 실미도를 보기 위해 실미 해수욕장으로 가보죠~ 주차비는 하루동안 5000원!! 오전이에요~ 사람도 별로..
2016.08.15
-
View를 서서히 나오고 사라지게 하는 간단 방법
Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An..
2022.03.13
-
날짜 텍스트에 일수를 더해보자
우리는 종종 string형 날짜에 int형 일수를 더하는 작업을 하게 된다. 이때, 다음과 같이 간단한 함수를 하나 만들어 사용하자 코틀린으로 작성했다. fun afterDate(date: String, day: Int, pattern: String = "yyyy-MM-dd"): String { val format = SimpleDateFormat(pattern, Locale.getDefault()) val calendar = Calendar.getInstance() format.parse(date)?.let { calendar.time = it } calendar.add(Calendar.DAY_OF_YEAR, day) return format.format(calendar.time) } date에 날짜 ..
2020.01.31
-
FragmentPaper에서 ListView가 매번 초기화되지 않도록 하기
대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다. Android에서 이러한 구조는 보통 FragmentPaper에 ListView를 넣어 구현한다. FragmentPaper는 메모리 관리를 위해 사용자가 보고 있는 페이지과 양옆의 페이지만 유지하고 나머지는 죽이는데 내 경험상 완전히 죽이는것이 아니라 Fragment의 생명주기만 끝내는것 같다. 결과적으로, 페이지를 옮길때마다 Fragment가 초기화되어 그 안의 ListView 내용도 다 지워진다. 이를 방지하는 방법이 따로 있을지도 모르겠지만 나는 다음과 같이 onCreateView()에 몇줄을 코딩해 해결하곤 한다. Fragment의 생명주기는 다시 시작되지만 Class 자체의 객체변수들은 그대로 남..
2019.05.23
-
인과 관계... 인공지능:튜링테스트에서 딥러닝까지
코딩을 하다보면 언제나 그 끝은 인공지능으로 귀결되는듯 하다. 아무래도 좀더 나은 프로그램을 짜려다 보면 점점 자동화되는 부분이 많아지고 이것은 결국, 모든것이 자동화되는 순간.. 인공지능이 되기 때문이다. 매번 이렇게 느끼면서도 막연히 "인공지능은 어려워.. 지금 내가 어떻게 만들어" 하며 미루기만 했는데 이젠 때가 된것 같았다.. 아니, 더이상 미룰수 없다는것을 알았다. 인공지능의 관심도가 극도로 높아진 지금이 개발의 적기이며 지금 안하면 앞서가기 힘들지 않을까 해서다. 마음은 급하지만 천리길도 한걸음부터이니.. 기초부터 탄탄히 다지는것이 필요해 정독할만한 교재를 찾았다. 인공지능의 전반적인 내용을 기초부터 담고 있을것 같아 이 책을 골랐다. 2개월에 걸쳐 끝까지 봤는데.. 솔직히, 절반의 절반도 이..
2019.03.25
-
기준점을 중앙으로 Scale UIView 애니메이션 하기
swift 에서는 간단하게 뷰 애니메이션을 구현할 수 있다. 그런데 크기를 변경시키는 애니메이션에서는 주의 해야 할 점이 있다 바로 기준점이다 다음을 보자 let width = frame.width let height = frame.height frame.size.width = width * 0.2 frame.size.height = height * 0.2 UIView.animateWithDuration(1, delay: 0, options: [.CurveEaseInOut], animations: { self.frame.size.width = width self.frame.size.height = height }, completion: nil) 20% 작은 크기에서 원래 크기로 애니메이션 효과를 주었다 ..
2017.03.21
-
막대 그래프의 처음은 이렇게
가장 기본이 되는 그래프인 막대 그래프를 만들어 보자~ 위와 같이 막대와 그 수치를 넣을 것이다 예전에 올렸던 꺽은선 그래프를 살짝 변경해서 코딩했다. private Paint mLinePaint, mTextPaint; private float mTextGap; private int[] mPoints, mPointX, mPointY; private int mUnit, mOrigin, mDivide; public GraphView(Context context, AttributeSet attrs) { super(context, attrs); setTypes(context, attrs); } //그래프 옵션을 받는다 private void setTypes(Context context, AttributeSet ..
2016.10.24
-
더이상 뛰지말고 열차 전광판을 손에 쥐고 다니자~
지하철 역안에 들어가서야 어! 열차 오네!! 뛰자!!! 하는 겸험이 누구나 있을거에요... 스마트한 시대에도 이러면 안될것 같아 부족한 실력에도 연구에 연구를 거듭해 만들었죠.. 그게 2011년도 일이니... 꽤 오래됬네요... 그리고 발전에 발전을 거듭해 여기까지 왔어요~ 노선도위를 열차가 이렇게 막 다니죠... 노선도 전체가 전광판인 셈이에요 특히, 급행을 빨갛게 강조해 놨어요~ 저는 급행이 언제 올지가 가장 궁금해서요ㅎㅎ 맵을 손가락으로 쫙~ 더 확대하면 상하선 열차가 서로 다른 줄로 움직여요~ 한줄에 있으면 겹쳐서 안 보일때가 있더라고요ㅎㅎ 열차 전체 시간표도 볼수 있어요~ 원래 시간표에는 초단위가 00초나 30초처럼 0으로 끝나는데... 8로 끝나죠? 이건 실시간 지연정보를 더해서 그래요... ..
2016.06.27
최신 글
-
SwiftUI TextField 에서 placeholder color 변경하기
안녕하세요 오랜만에 글을 올립니다~ 그동안 나이만 먹고 살림살이는 나아지지 않아 슬프지만.. 오늘도 저처럼 힘겨운 날을 보내고 계실 개발자분들을 위해 조금이라도 힘내시라고 작은 지식 하나 공유해 봅니다 이번 포스팅은 SwiftUI TextField 에서 겪은 삽질? 에서 비롯되었는데요.. 문자를 입력하기 전 디폴트로 뜨는 희미한 도움말인 placeholder 의 글자색이 변경이 안되는 겁니다!! UIKit에선 오래전부터 알려진 방식으로 손쉽게 할수 있었는데, SwitfUI 이넘은 아직 생긴지 얼마 안되서 그런지 구글신의 힘도 미약하고, 잘 안되서... SwiftUI의 특성을 최대한 이용해 아래와 같이 만들어 봤습니다. textfield costom 뷰... import SwiftUI struct Plac..
2022.07.29
-
View를 서서히 나오고 사라지게 하는 간단 방법
Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An..
2022.03.13
-
지성,행동,성장 ... 착한 사람이 이긴다
여차여차해서 A+에셋(보험관련 금융사)에서 우리 아이템을 발표 할 기회가 있었다. 물론, 좋은 결과는 없었지만 뜻밖에도 책을 선물받았다. 착한 사람이 이긴다 ... A+그룹의 관근호 회장님의 책이었다. 마침 읽을책을 한권 사야겠다고 생각하던차여서 바로 읽어보았다. 아무래도 직접 경험하신 보험과 회사 이야기가 많았다. 그리고 적절한 비유를 성경 이야기로 덧붙여 설명한것도 인상적이었다. 착한 사람이란 그저 이타적인 사람일까? 도와주었는데 오히려 피해만 주었다면? 내 식구는 외면하고 남만 도와준다면? 과연 착하다고 할 수 있을까? 그렇다. 이것은 그냥 착한척 하는 멍청한 호구다 착해질려면 남을 도울정도로 지성과 능력을 갖추어야 한다. 또한, 행동할 줄 알아야한다. "행동하지 않는 양심은 악의 편이다." 대통령..
2021.08.15
-
어떤 주식이 오를까? 알수 없다... 현명한 투자자
1년전에 읽었던 책인데 이제야서 리뷰를 올린다. 그동안 새 개정판도 나왔다고 하는데.. 요즘 투자에 대한 관심이 높긴 한것 같다. 뭐, 워낙 유명한 투자 고전 서적이기도 해서 겠지만ㅎㅎ 이 책은 워런버핏의 스승으로 더 알려진 벤저민 그레이엄의 명저이다 또한 가치투자를 창설한 분이 바로 이분이니, 가치투자 교과서라고도 할수 있다. 내용이 길어지면 지루할테니 내가 가장 주목한 부분이자 가장 핵심이라고 생각 했던 챕터 2곳만 소개하겠다. 첫번째는 7장 "적극적인 투자자를 위한 포트폴리오 전략: 긍정적인 면" 이다. 여기서 저자가 말하고자하는 바는 공식에 의한 투자 시기 선택은 불가능하다는 것이다. 즉, 우리가 차트 분석을 해서 지금이 살때다!! 하는건 그렇게 믿고 싶을뿐이지 확률적으로는 5:5... 맞으면 좋..
2021.08.01
-
seekbar로 만든 진행바에 터치가 안되게 하기
진행바를 seekbar로 만드는 경우, 터치 했을때 바가 움직여 버린다. 다음과 같이 간단히 막아버리자 class TouchlessSeekBar: SeekBar { private var seek: Int constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) init { seek = 0 thumb = ColorDrawable(Color.TRANSPARENT) //터치아..
2020.03.24
-
전문경영인?의 탄생... 종횡무진 서양사1
서양과 동양의 차이는 어디서 왔을까? 순전히 나의 관심사 안에서 찾아보았다. 책 속의 내용중 일부를 정리해 가면서 살펴보자 이집트에서 메소포타미아까지의 초승달 지역을 오리엔트라고 하는데 여기서 서양의 역사가 시작된다. 아프리카의 이집트와 메소포타미아의 히타이트가 맞붙은 세기의 전쟁에서 세계 최초의 국제조약(여기서 서양의 조약 문화가 시작된다)이 이루어지고, 500년 후 강력한 군사국가 아시리아가 최초의 통일을 이룬다. 아시리아의 뒤를 이은 페르시아는 대제국을 건설하지만, 도시국가(폴리스) 연합체인 그리스와의 전쟁에서 패배하면서 문명의 중심은 그리스로 넘어간다. 동 지중해를 장악한 그리스는 아테네를 중심으로 특별한 번영을 누린다. 민주정의 탄생이 그것이다. 사실 동양의 중국처럼 확실한 구심점이 없어서 가능..
2020.02.26
-
날짜 텍스트에 일수를 더해보자
우리는 종종 string형 날짜에 int형 일수를 더하는 작업을 하게 된다. 이때, 다음과 같이 간단한 함수를 하나 만들어 사용하자 코틀린으로 작성했다. fun afterDate(date: String, day: Int, pattern: String = "yyyy-MM-dd"): String { val format = SimpleDateFormat(pattern, Locale.getDefault()) val calendar = Calendar.getInstance() format.parse(date)?.let { calendar.time = it } calendar.add(Calendar.DAY_OF_YEAR, day) return format.format(calendar.time) } date에 날짜 ..
2020.01.31
-
Int 난수 함수로 Float 난수 깔끔하게 발생시키기
php 에는 float 난수를 발생시키는 함수가 따로 없다. 그래서 int 난수 함수인 rand() 함수를 이용해 float로 변환해야 한다. 다음은 float 변수형의 최소, 최댓값을 인수로 받아 float 난수를 반환하는 함수이다. 자주 사용할것 같아 만들어 보았다. function randOnFloat($min, $max) { //최소,최대값중에 소수점 자리수가 더 큰쪽을 선택 $radix_min = radix($min); $radix_max = radix($max); $radix = $radix_min[front] > $radix_max[front] ? $radix_min : $radix_max; //입력된 float값을 int값으로 변환후 int난수를 발생시키고 다시 float로 변환한다 ret..
2019.12.26
-
우리 역사속 일상과 상상 사이... 한국괴물백과
불확실한 미래에 대한 작은 위로로써 공상은 오랫동안 인류와 함께 했다. 두려움은 무지에서 온다는 말처럼 무서운 괴물은 아직 알수 없는 것에서 생겨나기 마련이다 그래서 옛날 사람들이 특히, 우리 선조들이 일상에서 어떤 어려움을 겪어 왔는지 괴물 이야기를 통해 알수 있다. 농업사회에선 역시 흉년이 가장 큰 어려움이 아니었을까? 흉년이나 풍년에 관한 괴물들이 많이 나온다. 죽음은 옛날이나 지금이나 큰 두려움이다. 크고 작은 자연재해 또한 당시에는 예측이 더 불가능했을 것이다. 날씨에 관한 괴물도 꽤 보인다. 위생이 좋지 않았던 과거에는 불쾌한 환경이나 질병도 걱정의 대상이었다. 이 책은 제목처럼 백과 형식의 짧은 글로 엮어 있어 틈틈히 가볍게 읽기 좋다. 자신만의 관점으로 상상하며 읽어보면 더욱 좋을듯 하다...
2019.11.30
-
삼각 분포로 난수 발생시키기
가우시안 분포 즉, 정규분포로 난수를 발생시켜야 하는 경우가 종종 있다. 하지만 우리가 흔히 사용하는 rand() 함수는 균일 분포로 난수를 가져오므로 따로 구현해야 한다. 다행히 정규분포 난수 발생 소스는 인터넷상에서 쉽게 구할수 있기 때문에 별 문제 될 건 없다. 한 가지 딴지를 걸자면 정규분포는 피 적분이 안되기 때문에 반복문을 사용해 난수를 만들어야 한다. 만약, 아주 많은 난수를 한꺼번에 발생시킨다면, 부하가 걸릴 수 있다는 말이다. 물론, 아주 쓸데없는 걱정이다. 그정도로 21세기의 컴퓨터는 나약하지 않다ㅎㅎ 어쨌거나 반복문이 없는 확률 밀도 기반 난수를 쓰고 싶다는 어리석은 생각에 다음과 같은 삼각 분포 난수 함수를 만들어 보았다. 삼각형 그래프는 정적분이 쉬워서 면적을 비율 삼아 난수를 발..
2019.10.28