-
안드로이드에서의 가장 간단하고 확실한 칼만필터(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
-
시작과 끝 또는 유와 무 또는 빛과 어둠... 칼세이건의 코스모스
밤하늘에는 수없이 많은 별들이 떠있다 적어도 어렸을때 서울 밤하늘도 그랬다. 별자리가 있다고 하던데... 솔직히 잘 모르겠다 그냥 아무렇게 점이 찍혀있는듯 할뿐이다. 특히 망원경으로 본 별들은 더욱더 그렇다. 그래서 별이 떠있는 우주를 혼돈의 세계라고도 한다. 저자 칼세이건은 이러한 혼돈속에도 질서가 있다고 알려준다. 뒤죽박죽인 와중에도 일정한 질서를 가지고 섞인다는 것이다. 이것이 코스모스다. 코스모스는 원래 철학적 용어이다. 모든 과학의 시작이 그렇듯 우주과학도 철학에서 출발했다. 즉, 우주란 무엇인가? 별은 왜 하늘에 떠있고 빛나는 것인가? 하는 질문에서 시작되었다는 것이다. 이런 질문을 던져볼수도 있겠다. 우주의 시작과 끝은?? 보통 학계에서는 빅뱅으로 우주가 시작되었고 지금은 계속 팽창중이라 한..
2017.07.23
-
스레드에서 View 변경시 Only the original thread…. 에러 대처법
게임을 만들다 보면 스레드를 자주 이용하게 된다. 그러다보면 Only the original thread that created a view hierarchy can touch its views 라는 에러를 맞다들이게 되는 경우가 반드시 찾아온다... 이 에러는 말그래로 오리지널 스레드... 즉, 앱 실행시 자동으로 생성되는 메인 스레드외에 직접 만든 스레드로 뷰위젯등을 컨트롤할려고 할때 발생한다... 예를 들어 TextView의 setText()같은 것이다... 나도 처음 게임을 만들 당시 이것 때문에 몇일을 고민했던 적이 있었다... 그러다 찾아낸것이 View의 Post()였는데 이방법은 특정사항에서는 작동이 안되는 문제가 있었다... 결국, 우연한 기회에 Handler 방식을 알게되었는데 역시 다른..
2013.11.25
-
홍콩여행 초행길에 꼭필요한 숙소까지 가는 대중교통 이용하기
홍콩은 비행기로 약 4시간거리이고 시차도 1시간밖에 차이가 나지 않아 주말을 이용해 여행하기 딱 좋은 곳이죠~ 혼자가도 좋고 친구랑, 또는 연인이랑, 가족들이랑 가도 다 좋습니다ㅎㅎ 특히 한국관광객들이 많아 길을 못찾겠다면 그사람들에게 물어보면 되요ㅎㅎㅎ 저도 기회가 닿아 주말에 첫 홍콩여행이자 첫 해외여행을 다녀왔어요~ ㅎㅎ 먼저 가기전에 요렇게 환전을 하고~ 참고로 제가 환전할때는 1홍콩달러 == 136원 이었어요~ 인천공항에서 출발~ 아! 항공편은 대한항공편으로 완복 약 50만원정도라고 보시면 되요~저가항공은 반값정도?? 겠죠ㅎㅎ 기내식먹고 후식까지 받아 먹다보면 금방 홍콩에 가까워집니다~ 이때쯤 입국 신고서를 이쁜 스튜디어스님께서 주시는데 반드시 작성해야 해요... 저는 뭔지 몰라서 안적었다가 공..
2013.11.05
-
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
-
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.05.26
-
FragmentPaper에서 ListView가 매번 초기화되지 않도록 하기
대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다. Android에서 이러한 구조는 보통 FragmentPaper에 ListView를 넣어 구현한다. FragmentPaper는 메모리 관리를 위해 사용자가 보고 있는 페이지과 양옆의 페이지만 유지하고 나머지는 죽이는데 내 경험상 완전히 죽이는것이 아니라 Fragment의 생명주기만 끝내는것 같다. 결과적으로, 페이지를 옮길때마다 Fragment가 초기화되어 그 안의 ListView 내용도 다 지워진다. 이를 방지하는 방법이 따로 있을지도 모르겠지만 나는 다음과 같이 onCreateView()에 몇줄을 코딩해 해결하곤 한다. Fragment의 생명주기는 다시 시작되지만 Class 자체의 객체변수들은 그대로 남..
2019.05.23
-
sqlite의 time이 자정을 인식 못할 경우, 간단한 꼼수 해결법
안드로이드의 sqlite 데이터베이스를 사용하는 도중 이상한 점을 하나 발견했다. time 데이터타입에서 00시 또는 24시, 즉 자정일때 time() 함수가 먹히질 않는다는 점이다. 예를 들면, (time 데이터타입의 field1 시각 + int 데이터타입의 field2 초) > 특정시각 을 비교할때 SELECT * FROM table1 WHERE time(field1, field2 ||' seconds') > 23:59:30 와 같이 사용한다. 하지만 이때, field1이 23:59:00 이고 field2가 60초 이상이면 자정이 넘어가면서 SELECT 결과가 항상 아무것도 안나오게 된다. field1이 24:00:00 이상이어도 마찬가지다. 이걸 해결하기 위해 만방으로 살펴봤지만... 역시 코딩은 ..
2018.09.27
-
스레드에서 반복문으로 UI를 변경할때 주의할점
내가 만든 스레드에서 UI를 바꿀수 없다는것은 누구나 알것이다. 물론 젖먹이 개발자 시절에 난 몰랐다... 어잿든 내 스레드에서 UI를 바꿀려면 메인스레드를 호출해야 한다. ios 에서는 DispatchQueue.main.async 이 그 역활을 한다. 짐작했겠지만 메인스레드는 새로 만들어지는게 아니므로 당연히 동기적으로 움직인다. 최근까지도 이 사실을 자주 망각했다. 바로 반복문에서 메인스레드를 호출할때였다. 내 스레드에서 메인스레드를 반복문으로 돌릴때는 서로가 따로 놀기 때문에 (내 스레드와 메인스레드가 서로 비동기라서) 메인스레드에서 UI가 아직 변경되지도 않았는데 내 스레드에서 또 호출해 버린다. 이렇게 되면 버벅거리는 현상이 발생한다. 테스트할때서야 버벅거림을 발견하고 짜증내다 아... 하고 숙..
2018.07.30
최신 글
-
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