오늘 아침 눈뜨자 마자 갑자기 코딩이 하고 싶어서 일요일인데도 불구하고 6시 10분에 눈이 번쩍 하고 떠졌다.


꿈을 꾼것인지, 뭔지 ... 


어제는 계속 낚시하는 공부만 하다가 잤는데, 눈뜨자마자 그간 미뤄왔던 안드로이드 앱 수정과 그에 맞는 웹호스팅중인 php 코드도 좀 수정을 해야 겠다 마음을 먹고 바로 컴퓨터를 켰다.


오전내내 만들고 수정한것은 사람들이 대체 무엇을 검색하고 왜 검색하는지 다음,네이버 등을 들어가서 일일이 클릭해서 보는게 귀찮아서 내가 보고 싶을때, 사람들이 많이 본 검색어와 뉴스들을 한방에 긁어오는 웹앱을 만들었다. 근데 웹앱으로 만들어두니까, 가독성도 떨어지고, 나중에 저장해뒀다가 보는것이 불편해서 아예 이슈만 저장하는 블로그를 하나 팠다.


한번씩 긁 읽어볼 필요가 있을때, 즐겨찾기 해둔 웹앱을 실행해서 긁어다가 블로그에 넣고 앉아서 클릭 또는 넣어놓고 출퇴근중에 하나씩 보면 꿀같은 휴식을 취할수가 있다.


이런 웹앱 만드는것은 너무나 간단해서 아주 아주 오래전에 만들어뒀던 php 코드를 살짝 수정해서 완성했다.

처음에는 물론 버그가 있어서, 제일처음 글 올린것은 링크가 다 ....깨졌다.


오늘 자기전에 긁어서 저장해놨다가 내일 출근할때 봐야지.


이런 웹앱을 만드는데는 다른 것을 많이 사용하는 것보다 php로 curlsimplehtmldom 라이브러리만 있으면 만들수 있다.


예제 코드를 하나 올려보면 아래와 같이 함수로 하나 만들어두면 글을 긁어올수 있고, simplehtmldom을 사용하여 요소별로 분리할수 있다.





이것을 하고 나니, 오후가 되었는데, 왠지 오늘 코딩빨이 좀 받는 느낌이 들어서, 그간 귀찮아서 미뤄두었던 kpop app 의 업데이트를 위한 서버 작업, 앱 수정 배포도 했다.




생각보다 많은 외국인들이 사용해주고 메일도 주고 해서 업데이트를 빨리 해야지 하고 있었는데, 지난 몇년간 시달림이 있다보니, 이런 여유시간도 많이 없었고, 여유시간에 코딩을 한다는 것 자체가 정말 오랫만이되어버려서 2년인가 4년 만에 코딩을 다시 한 느낌이 든다.


지금 업데이트 올려보니, 그간 구글에서 많은 정책이 바뀌어서 그것 하나 하나 맞춰주느라.. 진땀 뺐다.


그리고 그간 사용하던 도메인하고, 웹호스팅도 다음달부로 만료된다고 해서 그것들도 다 연장하고 결재하고나니 일요일이 휘리릭 다갔네~


그래도 뭔가 그간 화장실 가고 싶은데 못갔던 느낌으로 몇년간 지내다가 이참에 정리해버리니 뭔가 정리된 느낌도 들고, 이제 앱 리뷰 오는거랑 해서 잘 업데이트 하면서 관리좀 해야지~~ 하며 마음을 다 잡았다.



안드로이드는 추가된 어카운트에 동기화 기능을 추가하기 아주 쉬운 Sync Adapter 인터페이스를 제공하고 있다.


그 구현하는 방법도 그렇게 어렵지 않게, 서비스 1개, AndroidManifest meta 정의 1개, xml 정의 1개로 기본적인 동기화 서비스를 제공할수 있도록 되어있다.


물론 해당 계정에 대한 인증같은 부분은 따로 처리를 해주어야 하지만, 해당 계정의 특정 authority(동기화 항목)에 대한 동기화는 아래 와 같은 세가지를 구현하면 기본적인 준비가 되게 된다.


1.Sync Adapter 정의 xml 추가

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.android.contacts"
    android:accountType="[계정타입,예를 들면 com.google 같은것]"
    android:supportsUploading="[업로드지원여부] true"
/>


2.Sync Adapter Service 구현

public class SyncService extends Service {

	@Override
	public void onCreate() {			
		
	}

	@Override
	public IBinder onBind(Intent intent) {
		return new SyncAdapter(getApplicationContext(), true).getSyncAdapterBinder();
	}
	
        // Sync Adapter
	public static class SyncAdapter extends AbstractThreadedSyncAdapter {	
	
		public SyncAdapter(Context context, boolean autoInitialize) {
			super(context, autoInitialize);			
		}	
	
		@Override
		public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {				
			// Sync 가 실행될때 할일들
		}
	
		@Override
		public void onSyncCanceled() {
			super.onSyncCanceled();	
		       // Sync가 취소 될때 할일들
		}
	}
}


3.Android Manifest 수정


            
                
            

            
     


아주 아주 오래전 간단한 서비스를 하는 어플을 하나 만들었는데, 어플이 웹과 연동도 되어야 하고, 주기적으로 정보도 갱신을 해야되는데 어플에서는 네트워크 비용이 최대한 들어가지 않도록 설계를 해야 했었다.


그래서 고민하고 고안한 방법이, 서비스를 제공하는 어플은 단지 별도로 제작한 웹에서 정보를 읽어만 오고, 해당 웹에 정보를 채워넣기 위해서 웹앱을 하나 만들어서 주기적으로 어플에서 로딩만 하게 하면, 모든 처리는 서버내에서 이루어지게 되므로, 스마트폰에서는 별도의 추가적인 네트워크가 많이 발생하지 않게 되었다.


일단 주기적으로 특정한 웹페이지를 계속해서 로딩하는 방법은 여러가지가 있지만 아주 간단하게, 서비스 하나와 타이머로 스마트폰이 켜져있고 네트워크가 연결되어있는한 계속해서 실행할수 있다.


코드는 아래와 같이 아주 간단하게 만들어주면 된다.



public class Scheduler extends Service {
	private String TAG = "Scheduler";
	private static final String url = "[웹페이지주소]";
	private static final long delta = 30 * 60 * 1000; // 30분마다 한번

	@Override
	public void onCreate() {
		

	}

	@Override
	public int onStartCommand(final Intent intent, int flags, int startId) {
		super.onStartCommand(intent, flags, startId);

		start();
		return START_STICKY;  // 이 서비스는 불멸이다.

	}

	private void start() {

		Timer timer = new Timer();
		
		timer.schedule(new TimerTask() {
			public void run() {
				URL obj;
				try {
					obj = new URL(url);
					HttpURLConnection conn = (HttpURLConnection) obj.openConnection();

					BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
					String inputLine;

					while ((inputLine = in.readLine()) != null) {
						Log.v(TAG, inputLine);
					}
					in.close();
				} catch (MalformedURLException e) {					
					e.printStackTrace();
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
		}, 0, delta);
	}

	@Override
	public IBinder onBind(Intent arg0) {		
		return null;
	}
}

의외로 간단한건데, 가끔 까먹고  Custom Theme를 만들거나 수정해서 title bar를 제거하는 경우가 있는데, 

다음부터는 아래와 같이 manifest에서 아예 제거해주면 된다.



<activity
            android:name=".CandleActivity"
            android:label="@string/title_activity_candle" 
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>



너무 간단해서 잘 까먹게 된다. ㅠ.ㅠ




요즘 Android NDK를 사용해서 JNI를 사용한 개발을 하고 있는중인데, eclipse가 Java만 지원하는 줄 알고.. 정말 불편하게 java코드는 eclipse에서 개발하고, cpp JNI코드는 vi 에디터로 개발하는 정말 힘들고 불편한 시간을 보내고 있었다.


그래서 무슨 좋은 방법이 있을것 같은데 하고 찾아봤더니...

훌륭하신 선구자님들이... CDT를 만들어두셨다.. eclipse에서 C개발환경을 제공..한다.. 크흑... 


1. Help -> Install New Software 에서 CDT를 설치하기 위해 site 추가




2. 플러그인들 선택하기~~ 다해버리자... 뭔지 모르지만 언제 쓰일지 모른다.!!!




3. 설치하고나면 eclipse를 restart할래요?? 라고 물어본다. 그러고 재시작해보면...



이제 JNI를 제대로 만드는 일만 남았다...!!!!


+ Recent posts

티스토리 툴바