본문 바로가기

분류 전체보기117

인공지능 독학을 위한 예습복습... 머신러닝 쉽게 이해하기 꼬맹이 시절, 다들 그랬겠지만 수많은 만화영화를 보며 자랐다. 특히, 로봇이 나오면 더욱 열광했던것 같다. 그때부터 였을까? 진짜 언젠가는 내손으로 로봇을 만들고 싶어 과학자가 꿈이라고 말했던게... 결국, 공부를 못해 과학자의 길은 포기했지만ㅎㅎ 아직 그때의 감정은 뿌리깊게 남아있다. 소프트웨어 엔지니어가 된 지금, 그 오래된 감정을 끌어내려 한다. 턱없이 부족한 실력일수 있지만.. 인공지능을 구현해 보기로 마음 먹었다. 그 첫번째 단계로 기본 개념을 익히기 위해 이 책을 샀다. 인공지능을 어려운 수식없이 인문학적으로 풀어 쓴게 인상적이었다. 전공과목을 교양으로 듣는 느낌이랄까ㅎㅎ 하지만 번역본이다보니 약간 어색한 글귀가 있어 아쉬웠다. 때론 그림으로도 설명해준다. 인공지능의 핵심이라 할 수 있는 신경.. 2019. 2. 7.
EditText에 자동으로 단위 콤마 넣기 NumberFormat 을 이용하면 숫자에 단위 콤마를 쉽게 찍을수 있다. 하지만 이를 EditText에 적용할려고 하면 한가지 문제가 생긴다. 입력할때마다 콤마가 찍혀야 하는데... addTextChangedListener에서 NumberFormat으로 콤마를 찍으면 당연히 텍스트가 변경되므로 다시 리스너가 호출된다. 즉, 호출이 무한 반복되면서 앱이 멈추게 된다. 그래서 살짝 꼼수를 부려봤다. EditText 밑에 같은 크기의 TextView를 깔고 여기에 콤마를 찍은 텍스트를 대신 써주고, 후에 EditText를 동기화 하는 것이다. 물론, EditText는 투명하게 설정해 안보이게 한다. 사실 임시 방편으로 만든것인데.. 생각보다 잘 작동해 계속 쓰고 있다 ㅎㅎㅎ 소스는 다음과 같다. 요즘 뜨고 .. 2019. 1. 17.
유한하지만 끝이 없는... 시간의 역사 스티븐 호킹.. 그가 대단한것은 상상만으로 이론을 완성했다는 점이다. 손과 발이 자유롭지 못했으니 아마도 그림이나 도표 같은것을 그려보지 못하지 않았을까? 머리속의 생각을 손으로 직접 형상화 하지 않고 정리한다는것은 정말 어려운 일이다. 코딩을 할때도 알고리즘을 직접 작성해 보기 전에는 머리속으로 아무리 생각해봤자 이해하기 힘들다. 이런점에서 천재 물리학자인 그의 저서.. 시간의 역사는 특별하다. 고인이 되었지만 그의 상상이 우리에게 시간이란 무엇인가를 말해주고 있기 때문이다. 저자가 말하는 시간이란 한마디로 "유한하지만 경계가 없다"다. 이것을 무경계 이론이라 부른다. 그럼 유한하지만 경계가 없다라는 말은 대체 무슨 뜻일까? 솔직히 좀 모순된 이야기일수도 있다. 유한하지만 무한하다라는 말로도 이해되기 .. 2018. 12. 23.
round()를 5의 배수로도 반올림 해보자 왜 반올림은 0으로만 할까? 0말고 다른수로도 반올림 해보는건 어떨까? 라는 생각을 가끔씩 해봤는데.. 솔직히 별 필요성을 느끼지 못했었다. 그런데 주식 관련한 로보어드바이저를 만들면서 필요해졌다. 호가를 찍을때 5단위가 되기 때문이다. 아래와 같이 php의 반올림 함수인 round()를 이용하여 5의 배수로 반올림 해주는 코드를 짜봤다. 원리는 굳이 설명안해도 될만큼 간단하다. 여기서 볼것은 round() 함수의 두번째 인수인 반올림 자릿수도 고려한다는 사실이다. 이러한 편리한 기능은 살려놔야 코딩하는 재미가 있다ㅎㅎ function roundCenter($price, $precision) { //지정한 자릿수로 반올림 (1) $round = round($price, $precision); //지정한 .. 2018. 11. 26.
진짜를 찾아라... 워렌 버핏의 재무제표 활용법 워렌 버핏. 주식에 관심이 없어도 한번쯤은 들어봤을 이름이다. 세계 부자 순위에 항상 올라오는 인물이기 때문이다. 그가 지은...줄 알고 샀지만 사실은 그의 며느리였던 메리 버핏이 12년동안 그를 지켜보면서 쓴 책이라고 한다. 조금은 실망스러웠지만 내용을 보니 역시 베스트셀러였다!! 전혀 손색이 없었다. 살짝 내용을 들려준다면... 지속성... 이 한단어면 충분히 설명될것 같다. 버핏이 부자가 될수 있었던 것은 일명.. "장기적인 경쟁우위"를 가진 기업에 투자했기 때문이다. "장기적인 경쟁우위"란 오랫동안 다른 회사들보다 더 많은 돈을 번다는 뜻인데 이는 재무제표로 알수 있다. 예를 들면, 매출은 다른 회사보다 적지만 순이익률이 더 높다면 앞으로는(장기적으로는) 더 많은 돈을 번다는 증거이므로 경쟁우위를.. 2018. 10. 20.
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. 9. 27.
수학적 편견... 대량살상 수학무기 사법부의 재판 거래가 사실로 밝혀지면서 차라리 인공지능한테 재판을 맡기자는 우스갯소리까지 나온다. 그만큼 사법부의 신뢰가 떨어졌다는 의미이다. 그렇다면 왜 하필 인공지능한테 맡기자는 말이 나왔을까? 인공지능은 신뢰할수 있다는 말인가? 아마 많은 사람들이 그렇게 생각할지도 모른다. 많은 사람들의 기대와는 달리, 인공지능의 근간인 알고리즘은 완벽하지 않다. 그 이유는 간단하다. 사람이 만들기 때문이다. IT업종의 종사자 특히, 프로그래머라면 이런한 불편한 진실을 너무나도 잘 알것이다. 기술력도 문제가 되겠지만 그보다는 편견과 조작하고 싶은 욕망이 그렇게 만든다. 즉, 애초부터 불평등이 프로그램되어 있을수 있다는 말이다. WMD, 이책에서 저자가 말하는 대량살상 수학무기가 바로 그런 경우다. 수학이 어떻게 대.. 2018. 8. 27.
스레드에서 반복문으로 UI를 변경할때 주의할점 내가 만든 스레드에서 UI를 바꿀수 없다는것은 누구나 알것이다. 물론 젖먹이 개발자 시절에 난 몰랐다... 어잿든 내 스레드에서 UI를 바꿀려면 메인스레드를 호출해야 한다. ios 에서는 DispatchQueue.main.async 이 그 역활을 한다. 짐작했겠지만 메인스레드는 새로 만들어지는게 아니므로 당연히 동기적으로 움직인다. 최근까지도 이 사실을 자주 망각했다. 바로 반복문에서 메인스레드를 호출할때였다. 내 스레드에서 메인스레드를 반복문으로 돌릴때는 서로가 따로 놀기 때문에 (내 스레드와 메인스레드가 서로 비동기라서) 메인스레드에서 UI가 아직 변경되지도 않았는데 내 스레드에서 또 호출해 버린다. 이렇게 되면 버벅거리는 현상이 발생한다. 테스트할때서야 버벅거림을 발견하고 짜증내다 아... 하고 숙.. 2018. 7. 30.
못판다 하면 안되갔구나... 나는 내성적인 영업자입니다 언제부터인가 내성적이란 단어가 나와 함께했다. 내성적이라 함은 나서기 싫어하고, 조용하고, 소극적이고, 혼자서 즐기는 것을 좋아하는 뭐 이런거 같다. 다 나에게 들어맞는 말이다ㅎㅎ 솔직히 커 가면서 내성적인것이 싫었다. 당연히 항상 중심에서 멀어져 있었고, 존재감도, 자신감도 없었기 때문이다. 또 외향적인 친구들을 보면 뭔가 멋져 보이기도 했다. 그래서 여기서 벗어나고자 나름 꽤나 노력했던것 같다. 어쩌면 지금도 그러는 중일지도 모른다. 하지만 번번히 실패했다. 맞지 않는 옷을 입은듯 왠지 불편해서 딱 어느선까지만 가고 막혔다. 실패에서 더 많은걸 배운다고 했던가ㅎ 자꾸 같은곳에서 거꾸러지면서 소중한 한가지를 배울 수 있었다. 단점만 덮을려고 했지. 장점을 키울 생각은 안했구나... 따지고 보면 내성적이.. 2018. 6. 23.
Intent 전달 방식을 모방하여 부모 activity를 호출하기 IOS에서는 prepare()을 통해서 부모 controller를 쉽게 전달할 수 있다. 하지만 Android에서는 Intent로 activity를 전달하기 쉽지 않다. 뭐, Intent 말고도 여러 전달 방식이 있기 때문에 상관없지만... 깔끔하게 코딩하고 싶은 마음에 함 만들어 보았다. static을 이용하지만, 마치 Intent로 전달하는것 같은 느낌으로ㅎㅎ public class BaseActivity extends FragmentActivity { private static final String KEY_PARAM_CONTEXT_ID = "ParamContextId"; //전달할 Context를 담는 Map private static HashMap mParamContextMap = null; /.. 2018. 6. 7.