우선 테스트 영상. 첫 번째 실습부터 삽질이다. 칩 두이노에 LED 와 스위치를 연결하여 스위치를 한 번 누르면 LED 가 켜지고 다시 한 번 누르면 깜빡 거리고 다시 한 번 누르면 더 빨리 깜빡거리고 마지막으로 꺼지는 것을 만들고자 하였다. 마치 자전거용 전조등처럼 말이다. 추후에 자전거 전조등 자작을 염두에 둔 실습이었는데, 스위치에 좋지 않은 문제가 하나 있었다. 바로 기계식 스위치가 갖고 있는 문제인 바운스 현상이라 하는데, 스위치 내부에 스프링위에 올라간 접점이 붙거나 떨어질때 탄성으로 인하여 한 번 더 붙거나 하는 현상이 다. 아래 그림을 보면 이해가 쉬울 것 이다. 스위치 바운스. 처음에는 본인 직업인 소프트웨어 개발자 답게 코딩으로 딜레이를 주는 방식으로 해결해볼려고 했는데 아무래도 물리적..
요즘 즐겨보는 간행물인 Make 에 보면 아두이노는 꼭 빠지지 않는 단골 소재다. 이 잡지를 보면서 항상 아두이노에 대하여 감탄해왔다. 그리고 최근 결정적으로 아두이노에 입문하게 되게 해준 계기가 있었는데, 바로... 이 녀석들 이다.. 스노보드와 자전거가 취미인 내게 고글에 속도가 디스플레이 된다는 것이 큰 매력으로 다가왔다. 하지만 가격이 적어도 한국 돈으로 40만원 이상 하는 것들이라 가난한 월급쟁이인 저는 좌절 할 수밖에 없었다. 하지만 그 순간! 아두이노가 머릿속에 떠올랐다! 그리고 아두이노와 기기들에 대하여 조사를 해 본 결과 웨어러블 기기를 만드는데 딱 좋은 사이즈인 Cheapduino 라는 좋은 제품을 발견할 수 있었다. 요즘 많이 사용하는 아두이노 우노 R3에 비하여 스팩과 퍼포먼스가 많..
1. AndroidManifest.xml 파일에서 화면 회전을 막고자 하는 해당 액티비티의 엘리먼트에 다음과 같은 속성을 추가. android:screenOrientation="landscape" android:screenOrientation="portrait" 2. Activity 의 public 메소드인 setRequestedOrientation 사용. 런타임 환경에서 강제로 화면을 회전시킬 수 있다. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
앱을 실행하자마자 아래와 같은 이미지를 띄우고 대략 2~3초 뒤에 메인 화면으로 넘어가는 동작을 구현해 보겠습니다. 우선 가장 무난한 페이스북 인트로 화면을 예제로 잡아보겠습니다. 우선 아래와 같이 인트로로 사용할 이미지를 준비합니다. 저는 가장 무난한 페이스북 이미지에 나인패치를 입혀서 적용했습니다. 화면을 다 덮는 이미지를 사용해도 되지만 intro 화면에 사용될 Drawable 을 정의한 xml 파일을 사용하는 것이 좋습니다. 우선 values 폴더의 style.xml 파일에 다음과 같은 테마를 하나 추가시켜줍니다. 액션바와 타이틀을 제거하고 인트로에 사용될 배경 이미지를 출력하는 테마입니다. 그리고 AndroidManifest.xml 에서 Intro 를 보여줄 Activity 에 해당하는 엘리먼트..
ActionBar 의 View 를 가져올 수 있으며 아래 코드는 Activity 내부에서 사용한 예. private View getActionBarView() { Window window = getWindow(); View v = window.getDecorView(); int resId = getResources().getIdentifier("action_bar_container", "id", "android"); return v.findViewById(resId); } 이렇게 가져온 ActionBar 의 view 를 이용하여 애니메이션등을 구현할 수 있습니다.
1. manifest.xml 파일의 manifest 엘리먼트 안에 아래와 같이 추가해준다. 2. application 엘리먼트 바로 안에 다음과 같이 추가해준다. 3. File->New->JUnit Test Case 를 선택하고, 상단 라디오 버튼중에 New JUnit 4 test 를 선택한다. Name 에 적당한 이름을 입력하고 Finish 버튼을 눌러준다. 4. 새로 생성된 JUnit 테스트 케이스를 다음과 같이 편집하고 이 곳에 테스트 코드를 삽입한다. import org.junit.Test; import android.app.Activity; import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase..
자주쓰는 함수라 매번 코딩하기 귀찮아서 올려 놓는다. 아래는 4개의 길이를 갖는 byte 배열을 int 로 바꾸거나 int 를 4개의 길이를 갖는 byte 배열로 바꾸는 것이다.// 아래의 방법 외에 다음과 같이 간단한 방법도 존재한다. :// byte[] byteArray = ByteBuffer.allocate(4).putInt(value).array(); public byte[] intToByteArray(int value) { byte[] byteArray = new byte[4]; byteArray[0] = (byte)(value >> 24); byteArray[1] = (byte)(value >> 16); byteArray[2] = (byte)(value >> 8); byteArray[3] = ..
안드로이드1 : https://medium.com/marojuns-android/
안드로이드의 Task 내부에는 여러 액티비티들을 갖고 있으며 이 것들은 동일한Affinity 값을 갖고 있고 하나의 스택위에 유지되고 있다. 우선 첫 번째로 동일한 Task 내에서 액티비티를 시작할 때, 자주 쓰이는 플래그값에 대하여 알아보겠다. 아래 설명되는 옵션들은 아래와 같이 사용할 수 있다. Intent intent = new Intent(this, activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); 참고로 startActivity 는 Context 의 메소드이다. 실제로 어떻게 동작하는지 궁금하여 아래 스샷과 같이 실험 앱을 만들어보고 정리해 보았다. (코드를 너무 날림으로 만들어서 공개..
짜증나는 월요일. 턱을 괴고 무념 무상으로 마우스 오른쪽 버튼을 딸깍딸깍 거리고 있는 지루한 월요일 오전에 간담을 서늘하게 만드는 문자가 한 통이 왔다. 그림1. 또 걸린거야?! ㅠㅠ 어라? 그런데, 링크 주소가 조금 수상했다. 무인단속장비에 적발 되었다는데 URL 은 유사 국민은행? 그림2. 고객님 당황하셨어요 여기서 그냥 넘어갈 수 없었다. 서늘했던 마음이 타오르면서 분노가 들끓었다. 그래서 직접 당해보기로 했다. 물론 테스트용 공기계로. 그림3. 뜬금없는 다운로드. 문자 메세지로 날아온 URL을 통하여 웹 브라우저로 접속하면, 난데없이 APK(앱 설치파일) 을 다운로드 받는다. 그림4. 스미싱앱의 요구 권한ㅡ , ㅡ 위에 표시된 권한 외에 핸드폰 시작시에 자동 시작되도록 하는 권한도 있다. 위 그림..
드디어 내 베이스인 비발디 파크의 첫 심야 개장이 24-25일에 이루어졌다. 개장한 슬로프는 발라드(반라드...), 레게(역시 절반만), 그리고 테크노1,2. 재즈는 오픈을 안 해서 매우 아쉬웠지만, 그래도 심야 개장한다는 소식에 일을 마치고 바로 달려가서 지인들을 만났다. 혹시 백만대군이 이미 슬로프를 점령하지 않았을까 하는 불안한 기대감을 갖고 말이다.. ::슬로프 상태.반라드 상단에 몰려있는 저 사람들을 보라. 심야 개장 첫 날에도 역시 백만대군 비발디파크.ㅠㅠ 수도권 구석구석 다니는 무료 셔틀 버스 덕분에 접근성이 좋고, 의외로 즐길거리들이 많아서 비발디 파크는 항상 인기가 좋다. 그래서 이 날도 어김없이 많은 인파가 몰렸었다. 발라드 슬로프에서는 벌써부터 사이드 슬립 연습을 하는 많은 사람들이 ..
구글 플레이 서비스가 설치되어 있지 않은 안드로이드 디바이스에서 구글 API (구글 플러스, GCM, 구글 맵, 구글 드라이브등) 를 사용하려고 하면 아래와 비슷한 Exception 을 발생시키며 죽는다. android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://play.google.com/store/apps/details?id=com.google.android.gms flg=0x80000 pkg=com.android.vending } 우선 이 문제가 발생하는 이유 첫 번째로 기기에 설치되어 있는 플레이 서비스가 너무 구 버전이거나 또는 아예 설..
(2015년 3월 추가. 지금은 안드로이드 SDK 에서 x86 에뮬레이터를 제공하기 때문에 Genymotion 이 필요 없습니다. ) Genymotion 을 이용하면 Android SDK 에 포함된 느려터진 기본 에뮬레이터 대신 VirtualBox 위에서 돌아가는 x86 기반의 빠른 안드로이드를 이용하여 편하게 개발할 수 있다. 또, GPS와 같은 센서에서 받아오는 값등을 임의로 입력할 수 있고, 네트워크 환경을 다양하게 바꿀 수 있는등 개발에 편리한 기능들을 제공한다. 다만 다음과 같은 단점이 있는데, 이를 유념하여야 한다.- 실제 기기에서 돌아가는 것과 100% 동일하지 않다.- Genymotion 의 안드로이드 에뮬레이터는 x86 기반이므로 arm 으로 컴파일된 NDK 를 사용할 수 없다.- Gen..
안드로이드 내에서 픽셀에서 DP 로 또, DP 에서 픽셀로 변환하는 메소드다. 출처 : http://stackoverflow.com/questions/8309354/formula-px-to-dp-dp-to-px-android /** * 픽셀을 DP 로 변환하는 메소드. * @param px 픽셀 * @return 픽셀에서 dp 로 변환된 값. */ private int pxToDp(Context context, int px) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT))..
블로그를 이사한 뒤에 쓰는 첫 여행기!! 단지 먹기위해서 떠난 전주.사진은 거의 먹었던 음식 위주로 찍었습니다.이 날 전주 온도가 37도를 찍는 기록적인 폭염이었는데, 사진이고 뭐고 그냥 빨리 에어콘 빵빵하게 나오는 곳으로 들어가서 쉬고 싶더라고요. 전주 한옥마을 거리 모습.사실, 사진 정말 못 찍어서 이렇게 나왔습니다.실제로 보면 길거리 양쪽으로 늘어선 기와지붕의 한옥들과 대문들이 한국적인...됐고~!!우린 먹으러 왔기 때문에 일단 맛집 부터 검색해 봤습니다. 이런 돌담 사이의 골목길도 들어가보고... 첫 번째로 찾아간 교동 떡갈비. 번호표를 뽑고 들어가야 하는데, 이미 우리 앞에 30팀이나 기다리고 있었습니다.한 팀 빠지는데 대략 2~5분은 기다려야 했지만, 번호표만 뽑고 조용히 사라진 팀들이 많더라..
일을 하다보면 작성하기 귀찮은 코드들을 찾기 위해 구글링을 통하여 무한 복불을 한다. 랜덤 문자열 생성도 마찬가지로 이곳저곳 검색해서 많이 사용 했었는데, 간혹 특정한 문자 값들로 랜덤 문자열을 만들거나, 또는 랜덤 문자열에서 제외할 문자 값을 설정할 필요가 있어서 만들었다. :: 사용법 String randStr;// 숫자를 제외한 길이 32의 랜덤 문자열 생성.randStr = new RandomStringBuilder(). putExcludedChar(RandomStringBuilder.NUMBER). setLength(32).build();System.out.println(randStr); // 알파벳으로 이루어진 길의 32의 랜덤 문자열 생성.randStr = new RandomStringBui..
TextView 는 HTML 태그를 사용할 수 있지만 일부 지원하지 않는 태그들이 있다. 그 중에 대표적인 것이 이렇게 취소선을 긋는 태그인데, 이는 직접 PaintFlag 라는 속성값을 줘서 해결할 수 있다. 단 TextView 내부의 모든 텍스트들에 취소선이 생긴다. textView.setText("취소선"); textView.setPaintFlags(someLabel.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 만약 취소선을 제거하고 싶으면 연산자 '^' 를 사용하여 속성을 제거해주면 된다.textView.setPaintFlags(someLabel.getPaintFlags() ^ Paint.STRIKE_THRU_TEXT_FLAG);
마이티 마우스의 가장 큰 단점은 바로 내구성이 매우 약하다는 것이다. 특히 스크롤을 담당하는 볼의 틈 사이로 먼지가 들어가서 먹통이 되는 문제와, 시간이 지나면서 마우스 오른쪽 버튼 기능을 상실해 간다. 스크롤 볼의 먼지 문제는 마우스를 분해하여 그 롤러 막대에 낀 먼지를 제거해 주면 되지만, 이 것을 여러번 반복하면 내구성이 많이 줄어들고 선이 단선 될수도 있다. 게다가 오른쪽 버튼 기능을 담당하기 위한 센서는 한 번 고장나면 이런 방식으로 고칠수가 없다. 유선 마이티 마우스는 고장날 때 마다 고쳐 쓰다가 완전히 작동 불능 상태가 되면 새로운 것으로 구입해 쓰면 되지만, 무선 마이티 마우스는 이제 단종되어서 새 제품을 구하는 것이 쉽지 않다. 그래서 기존의 유선 마이티 마우스의 뚜껑(?)을 이용하여 무..
이 것도 예전 네이버 블로그를 하면서 올렸던 건데 블로그 이사하면서 다시 올려본다. 정말 초 간단한 카드 섞기 알고리즘 이다.루프를 돌면서 배열의 현재 위치와 다음 위치중에 랜덤한 위치의 값을 바꿔주는것 이다. - 예)빨간색 블록은 현재의 인덱스 이고, 하늘색 블록은 랜덤하게 선택한 블록이다. 마지막으로 연 보라색 블록은 이미 카드섞기가 끝난 블록이다.Input 12345Step 1. 12345Step 2. 21345Step 3. 24315Step 4. 24135Step 5. 현재 인덱스의 다음 인덱스가 더 이상 존재하지 않으면 종료. 24153 #include #include #include void swap(int *A, int *B); // 변수를 서로 바꿔주는 함수void randomCard(in..
예전에 네이버 블로그에 올렸던 건데, 이 쪽으로 이사하면서 다시 올려본다. 이를 c언어 코드로 나타낼려면 다음 코드와 같이 재귀를 사용 하여야 한다. 이곳에 붙여넣는 과정에서 주석의 스페이스가 모두 없어졌습니다. 이점 양해해 주세요. #include#include#include #defineCARDSIZE10 // 정수배열의사이즈 voidMergeSort(int* array, intsize, intfirst, intend); // 합병정렬을하는함수voidprintArray(int* card, intsize); // 정수배열을화면에출력하는함수. intmain(){ intCard[CARDSIZE]; // 정수배열선언 inti; // 반복문에쓰일변수 srand((unsignedint)time(NULL)); /..
안드로이드 디바이스의 CPU 코어 개수를 가져오는 코드이다. 이 코드의 출처는 : http://stackoverflow.com/questions/7962155/how-can-you-detect-a-dual-core-cpu-on-an-android-device-from-code 원리를 설명하자면 우선 /sys/devices/system/cpu/ 디렉토리를 찾고 이 내부에 cpu[0-9] 의 이름 규칙을 갖는 디렉토리를 찾는다. 만약 쿼드 코어라면 /sys/devices/system/cpu/cpu0/sys/devices/system/cpu/cpu1/sys/devices/system/cpu/cpu2, /sys/devices/system/cpu/cpu3 형태로 디렉토리가 존재한다.그럼 그 디렉토리 개수를 확인 ..
다음과같은코드를이용하여코드상에서폰과태블릿을구분할수있다.(코드상에서폰인지태블릿인지를가져올수있다.) int screenSizeType = (/*context.*/getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK);if(screenSizeType == Configuration.SCREENLAYOUT_SIZE_XLARGE) {// 매우 큰 화면 사이즈, 10인치 이상 태블릿 : 갤럭시탭 10.1, 갤럭시노트10.1, 기타 등등.}else if(screenSizeType == Configuration.SCREENLAYOUT_SIZE_LARGE) {// 큰 화면 사이즈, 약 7인치 태블릿 : 넥서스7, 갤탭, 기타..
- Total
- Today
- Yesterday
- 부트로더
- 침블락
- arduino
- ndk
- ENC28J60
- ESP8266
- oled
- 안드로이드 개발
- HC-06
- 병렬 프로그래밍
- Java
- 알리익스프레스
- 아두이노
- activity
- 스마트 무드등
- 안드로이드
- Cheapduino
- 개발
- NeoPixel
- Android
- 이더넷
- bluetooth
- ATtiny85
- 가습기
- WS2812B
- Iot
- noidemcu
- 칩두이노
- 블루투스
- json
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |