Naive application development - Learning Android from failure 2010/03/17 shakalaca
About shakalaca (shaka) <ul><li>Engineer @ Qisda </li></ul><ul><ul><li>Android UI development & system integration </li></...
Outline <ul><li>A short introduction </li></ul><ul><li>Go ahead and DIY ? </li></ul><ul><li>Taking picture should be easy ...
A short introduction
About PlurQ <ul><li>“ Missing the timeline view of Plurk? Enjoying surfing between Plurk mesages? PlurQ provides almost th...
Story of PlurQ <ul><li>API first developed @ 2009/Mar </li></ul><ul><ul><li>As a practice of getting started with Android ...
PlurkClient (former PlurQ)
Birth of PlurQ <ul><li>Published @ 2009/12/15 </li></ul><ul><ul><li>via Qiss </li></ul></ul><ul><ul><ul><li>A Group of peo...
Screenshot
Screenshot
Download and play !
Go ahead and DIY ?
DIY is good, but.. <ul><li>Don’t reinvent wheel </li></ul><ul><ul><li>Official API </li></ul></ul><ul><ul><li>Unofficial A...
Analyzing first.. <ul><li>No official API </li></ul><ul><ul><li>Unofficial Plurk API :  http://plurkapi.com  (down) </li><...
Go go go ! Fire in the hole ! <ul><li>Shim code </li></ul><ul><ul><li>Wrapper for underlying API </li></ul></ul><ul><ul><l...
Dealing with strange output <ul><li>Format of “date” in return JSON object is wrong </li></ul><ul><ul><li>(&quot;Mon, 12 J...
Taking picture should be easy ?
Get picture from camera <ul><li>Use intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForRe...
Only thumbnail ? <ul><li>For HTC devices protected void onActivityResult(int req, int result, Intent data) {   super.onAct...
Get larger picture <ul><li>Set temp URI at first Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File tmpFile...
Get larger picture (cont.) <ul><li>Get result protected void onActivityResult(int req, int result, Intent data) {   super....
Side Story <ul><li>Activity closed after launching camera </li></ul><ul><ul><li>Sometimes FC after taking picture </li></u...
Lots of memory out there ?
Memory is big enough, right ? <ul><li>&quot;640K ought to be enough for anybody&quot; </li></ul><ul><li>Specs of phones </...
Truth is .. <ul><li>http://developer.android.com/intl/zh-TW/reference/android/app/ActivityManager.html </li></ul><ul><ul><...
BitmapCache <ul><li>Scale down if image is too big </li></ul><ul><ul><li>BitmapFactory.Options options = new BitmapFactory...
Problem with SKIA <ul><li>What happened in this code ? </li></ul><ul><ul><li>in = new BufferedInputStream(url.openStream()...
Solution <ul><li>Use  BitmapFactory.decodeByteArray   instead Bitmap bitmap = null; InputStream in = null; BufferedOutputS...
Memory optimization tools <ul><li>ddms process heap monitor </li></ul><ul><li>Memory Analyzer for Eclipse </li></ul><ul><u...
Networking is simple as doc told you so ?
Problems <ul><li>Users complain </li></ul><ul><ul><li>Can’t login (a few users) </li></ul></ul><ul><ul><li>Can’t see pictu...
Dealing with proxy <ul><li>Java.net.Proxy private void configureHttpProxy() {   this.httpProxyHost = android.net.Proxy.get...
Set timeout <ul><li>Connection timeout & socket timeout </li></ul><ul><li>HttpParams HttpParams params = new BasicHttpPara...
Secure connection <ul><li>SchemeRegistry </li></ul><ul><ul><li>SchemeRegistry schemeRegistry = new SchemeRegistry(); </li>...
Pretending a browser <ul><li>Change the way fetching images in BitmapCache </li></ul><ul><ul><li>urlc = url.openConnection...
Upload and your app should be published ?
Problems <ul><li>Can’t be found in Android Market </li></ul><ul><ul><li>Tattoo </li></ul></ul><ul><ul><li>A688 </li></ul><...
SDK issues <ul><li>Always use the latest Android SDK release </li></ul><ul><ul><li>1.6+ </li></ul></ul><ul><li>Use emulato...
Layout (screen) issues <ul><li>res/layout, res/layout-*dpi </li></ul><ul><ul><li>At least ldpi </li></ul></ul><ul><li>Andr...
Ugly layout <ul><li>Because of  android:anyDensity=&quot;true&quot;  </li></ul><ul><ul><li>Android won’t auto adjust UI el...
Add permission only when needed <ul><li>Story </li></ul><ul><ul><li>PlurQ is not found on Tattoo market -> Problem solved ...
My 2 cents
Experience sharing.. <ul><li>Field try is important </li></ul><ul><ul><li>Buy one ! </li></ul></ul><ul><ul><li>Borrow one ...
Experience sharing.. (cont.) <ul><li>Don’t be sad when you only have an old G1 </li></ul><ul><ul><li>If your program can r...
Performance tuning <ul><li>Tools </li></ul><ul><ul><li>Log.* </li></ul></ul><ul><ul><li>traceview </li></ul></ul><ul><li>T...
Q & A
Any re Q uests or  A dvises ?
On-going features <ul><li>Social Activity </li></ul><ul><ul><li>View profile / View plurks / Add friend,fan.. </li></ul></...
Wish list <ul><li>Friend Browser / Editor </li></ul><ul><ul><li>Send private plurk / clique </li></ul></ul><ul><li>Theme <...
Reference <ul><li>Plurk API </li></ul><ul><ul><li>http://code.google.com/p/jplurk/ </li></ul></ul><ul><ul><li>http://code....
Upcoming SlideShare
Loading in...5
×

Naive application development

2,588
-1

Published on

Learning android from failure - PlurQ development experience sharing

Published in: Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,588
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
26
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • Launcher/src/com/android/launcher/LiveFolderAdapter.java ( http://www.google.com/codesearch/p?hl=en#4r7JaNM0EqE/src/com/android/launcher/LiveFolderAdapter.java )
  • Naive application development

    1. 1. Naive application development - Learning Android from failure 2010/03/17 shakalaca
    2. 2. About shakalaca (shaka) <ul><li>Engineer @ Qisda </li></ul><ul><ul><li>Android UI development & system integration </li></ul></ul><ul><li>Where to find me ? </li></ul><ul><ul><li>@plurk, @facebook, @twitter </li></ul></ul><ul><li>Contact </li></ul><ul><ul><li>@gmail.com </li></ul></ul><ul><li>Published Android App </li></ul><ul><ul><li>PlurQ / Beauty Clock Widget </li></ul></ul>
    3. 3. Outline <ul><li>A short introduction </li></ul><ul><li>Go ahead and DIY ? </li></ul><ul><li>Taking picture should be easy ? </li></ul><ul><li>Lots of memory out there ? </li></ul><ul><li>Networking is simple as doc told you so ? </li></ul><ul><li>Upload and your app should be published ? </li></ul><ul><li>My 2 cents </li></ul><ul><li>Q & A </li></ul>
    4. 4. A short introduction
    5. 5. About PlurQ <ul><li>“ Missing the timeline view of Plurk? Enjoying surfing between Plurk mesages? PlurQ provides almost the same look-n-feel as Plurk on your web browser. Feature: -Similar look-n-feel as Plurk on web browser, including the timeline view” - http://www.cyrket.com/p/android/mobi.qiss.plurq/ </li></ul>
    6. 6. Story of PlurQ <ul><li>API first developed @ 2009/Mar </li></ul><ul><ul><li>As a practice of getting started with Android </li></ul></ul><ul><li>River view first developed @ 2009/Sep </li></ul><ul><ul><li>Inspired by HTC sense™ UI </li></ul></ul><ul><ul><li>Creating custom view </li></ul></ul><ul><ul><li>PlurkClient as a Demo </li></ul></ul><ul><ul><li>Spare time project </li></ul></ul>
    7. 7. PlurkClient (former PlurQ)
    8. 8. Birth of PlurQ <ul><li>Published @ 2009/12/15 </li></ul><ul><ul><li>via Qiss </li></ul></ul><ul><ul><ul><li>A Group of people interested in Android Market </li></ul></ul></ul><ul><ul><li>“ Shrek” as mascot </li></ul></ul><ul><ul><ul><li>Cute version of Android Robot </li></ul></ul></ul><ul><ul><li>Not spare time project anymore </li></ul></ul><ul><li>Statistics (2010/03/15) </li></ul><ul><ul><li>4710 download, 2833 active installs (60%) </li></ul></ul>
    9. 9. Screenshot
    10. 10. Screenshot
    11. 11. Download and play !
    12. 12. Go ahead and DIY ?
    13. 13. DIY is good, but.. <ul><li>Don’t reinvent wheel </li></ul><ul><ul><li>Official API </li></ul></ul><ul><ul><li>Unofficial API </li></ul></ul><ul><ul><li>Do a search on http://code.google.com/ or http://github.com/ first </li></ul></ul><ul><li>Bad for PlurQ </li></ul><ul><ul><li>Not noticing this open source project : http://code.google.com/p/jplurkapi/ </li></ul></ul>
    14. 14. Analyzing first.. <ul><li>No official API </li></ul><ul><ul><li>Unofficial Plurk API : http://plurkapi.com (down) </li></ul></ul><ul><li>Problems </li></ul><ul><ul><li>Not all methods are listed </li></ul></ul><ul><ul><li>Input/Output are not match to current state </li></ul></ul><ul><ul><li>Plurk said there will be official API .. soon ? </li></ul></ul>
    15. 15. Go go go ! Fire in the hole ! <ul><li>Shim code </li></ul><ul><ul><li>Wrapper for underlying API </li></ul></ul><ul><ul><li>Easy to change difference implementation </li></ul></ul><ul><ul><ul><li>2 days after official API released </li></ul></ul></ul><ul><li>Digg plurk.com </li></ul><ul><ul><li>Firefox + Live HTTP header add-on ( https://addons.mozilla.org/en-US/firefox/addon/3829 ) </li></ul></ul><ul><ul><li>Get methods from .js </li></ul></ul><ul><ul><li>Faster than reading document . </li></ul></ul>
    16. 16. Dealing with strange output <ul><li>Format of “date” in return JSON object is wrong </li></ul><ul><ul><li>(&quot;Mon, 12 Jan 1976 00:01:00 GMT&quot;) </li></ul></ul><ul><li>Solution </li></ul><ul><ul><li>Copy from android and hack </li></ul></ul><ul><ul><li>Not used after official API released </li></ul></ul>
    17. 17. Taking picture should be easy ?
    18. 18. Get picture from camera <ul><li>Use intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, Common.PLURKPOST_REQ_IMAGE); </li></ul><ul><li>Get result (thumbnail) protected void onActivityResult(int req, int result, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (result == RESULT_CANCELED) return; switch (req) { case Common.PLURKPOST_REQ_IMAGE: { mBitmapOfSmallerUploadImage = (Bitmap) data.getExtras().getParcelable(&quot;data&quot;); doUploadImage(); } break; } } </li></ul>
    19. 19. Only thumbnail ? <ul><li>For HTC devices protected void onActivityResult(int req, int result, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (result == RESULT_CANCELED) return; switch (req) { case Common.PLURKPOST_REQ_IMAGE: { mUriImage = data.getData(); mBitmapImage = (Bitmap) data.getExtras().getParcelable(&quot;data&quot;); doUploadImage(); } break; } } </li></ul><ul><li>But for other devices ? </li></ul>
    20. 20. Get larger picture <ul><li>Set temp URI at first Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File tmpFile = File.createTempFile(&quot;plurq-camera&quot;, &quot;.jpg&quot;); mUriOfPicFromCamera = Uri.fromFile(tmpFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriOfPicFromCamera); startActivityForResult(intent, Common.PLURKPOST_REQ_IMAGE); </li></ul>
    21. 21. Get larger picture (cont.) <ul><li>Get result protected void onActivityResult(int req, int result, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (result == RESULT_CANCELED) { if (mUriOfPicFromCamera != null) { File tmpFile = new File(mUriOfPicFromCamera.getPath()); tmpFile.delete(); mUriOfPicFromCamera = null; } return; } switch (req) { case Common.PLURKPOST_REQ_IMAGE: { if (data != null) { mUriImage = data.getData(); mBitmapImage = (Bitmap) data.getExtras().getParcelable(&quot;data&quot;); } doUploadImage(); } break; } } </li></ul>
    22. 22. Side Story <ul><li>Activity closed after launching camera </li></ul><ul><ul><li>Sometimes FC after taking picture </li></ul></ul><ul><li>Analysis </li></ul><ul><ul><li>Due to memory issue </li></ul></ul><ul><li>Solution </li></ul><ul><ul><li>Do no assumptions </li></ul></ul><ul><ul><li>Do login check when activity starts </li></ul></ul>
    23. 23. Lots of memory out there ?
    24. 24. Memory is big enough, right ? <ul><li>&quot;640K ought to be enough for anybody&quot; </li></ul><ul><li>Specs of phones </li></ul><ul><ul><li>G1 : 192MB </li></ul></ul><ul><ul><li>HTC Magic : 288MB (or 192MB) </li></ul></ul><ul><ul><li>HTC Hero : 288MB </li></ul></ul><ul><ul><li>Nexus One : 512MB </li></ul></ul>
    25. 25. Truth is .. <ul><li>http://developer.android.com/intl/zh-TW/reference/android/app/ActivityManager.html </li></ul><ul><ul><li>getMemoryClass() </li></ul></ul><ul><ul><ul><li>Return the approximate per-application memory class of the current device. This gives you an idea of how hard a memory limit you should impose on your application to let the overall system work best . The returned value is in megabytes; the baseline Android memory class is 16 (which happens to be the Java heap limit of those devices); some device with more memory may return 24 or even higher numbers. </li></ul></ul></ul><ul><li>On G1 or most device : 16MB </li></ul><ul><li>Droid & Nexus One : 24MB </li></ul>
    26. 26. BitmapCache <ul><li>Scale down if image is too big </li></ul><ul><ul><li>BitmapFactory.Options options = new BitmapFactory.Options(); </li></ul></ul><ul><ul><li>options.inSampleSize = 2; </li></ul></ul><ul><ul><li>bitmap = BitmapFactory.decodeStream(in,null,options); </li></ul></ul><ul><li>Remember to clear </li></ul><ul><ul><li>Catch OutOfMemoryError is not enough </li></ul></ul><ul><ul><li>HashMap + SoftReference </li></ul></ul><ul><li>For PlurQ : policy is changing all the time </li></ul><ul><ul><li>What to cache ? (avatar -> thumbnail -> all ?! </li></ul></ul><ul><ul><li>When to clear ? (600K -> LRU -> each page) </li></ul></ul>
    27. 27. Problem with SKIA <ul><li>What happened in this code ? </li></ul><ul><ul><li>in = new BufferedInputStream(url.openStream(), 4096); </li></ul></ul><ul><ul><li>bitmap = BitmapFactory.decodeStream(in); </li></ul></ul><ul><ul><li>decoder->decode returned false error </li></ul></ul>
    28. 28. Solution <ul><li>Use BitmapFactory.decodeByteArray instead Bitmap bitmap = null; InputStream in = null; BufferedOutputStream out = null; try { in = new BufferedInputStream(url.openStream(), 4096); final ByteArrayOutputStream ds = new ByteArrayOutputStream(); out = new BufferedOutputStream(ds, 4096); copy(in, out); out.flush(); final byte[] data = ds.toByteArray(); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } catch (...) { } private void copy(InputStream in, OutputStream out) throws IOException { byte[] b = new byte[4096]; int read; while ((read = in.read(b)) != -1) { out.write(b, 0, read); } } </li></ul>
    29. 29. Memory optimization tools <ul><li>ddms process heap monitor </li></ul><ul><li>Memory Analyzer for Eclipse </li></ul><ul><ul><li>Finding memory leaks </li></ul></ul>
    30. 30. Networking is simple as doc told you so ?
    31. 31. Problems <ul><li>Users complain </li></ul><ul><ul><li>Can’t login (a few users) </li></ul></ul><ul><ul><li>Can’t see picture (some users) </li></ul></ul><ul><ul><li>Sometimes it takes a long time loading something </li></ul></ul><ul><li>Analyze </li></ul><ul><ul><li>Proxy </li></ul></ul><ul><ul><li>Timeout </li></ul></ul><ul><ul><li>Secure connection </li></ul></ul>
    32. 32. Dealing with proxy <ul><li>Java.net.Proxy private void configureHttpProxy() { this.httpProxyHost = android.net.Proxy.getDefaultHost(); this.httpProxyPort = android.net.Proxy.getDefaultPort(); if (this.httpProxyHost != null && this.httpProxyPort != null) { SocketAddress proxyAddress = new InetSocketAddress( this.httpProxyHost, this.httpProxyPort); this.httpProxy = new Proxy(Proxy.Type.HTTP, proxyAddress); } else { this.httpProxy = Proxy.NO_PROXY; } } urlc = url.openConnection(this.httpProxy); </li></ul><ul><li>Tips </li></ul><ul><ul><li>Useful in simulator </li></ul></ul><ul><ul><li>Some operators use proxy (?) </li></ul></ul>
    33. 33. Set timeout <ul><li>Connection timeout & socket timeout </li></ul><ul><li>HttpParams HttpParams params = new BasicHttpParams(); params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 20000); params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); DefaultHttpClient client = new DefaultHttpClient(params); </li></ul><ul><li>Tips </li></ul><ul><ul><li>Adjust timeout value with care </li></ul></ul><ul><ul><li>Weak connection with TWM + Galaxy </li></ul></ul><ul><ul><ul><li>Auto timeout adjustment </li></ul></ul></ul>
    34. 34. Secure connection <ul><li>SchemeRegistry </li></ul><ul><ul><li>SchemeRegistry schemeRegistry = new SchemeRegistry(); </li></ul></ul><ul><ul><li>schemeRegistry.register(new Scheme(&quot;http&quot;, PlainSocketFactory.getSocketFactory(), 80)); </li></ul></ul><ul><ul><li>schemeRegistry.register(new Scheme(&quot;https&quot;, SSLSocketFactory.getSocketFactory(), 443)); </li></ul></ul><ul><ul><li>DefaultHttpClient client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params); </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>Option to toggle </li></ul></ul><ul><ul><ul><li>Not supported by all phones or operators </li></ul></ul></ul><ul><ul><ul><li>Exception happened in Galaxy </li></ul></ul></ul>
    35. 35. Pretending a browser <ul><li>Change the way fetching images in BitmapCache </li></ul><ul><ul><li>urlc = url.openConnection(); </li></ul></ul><ul><ul><li>urlc.setRequestProperty(&quot;User-Agent&quot;, &quot;Mozilla/5.0&quot;); </li></ul></ul><ul><ul><li>urlc.setReadTimeout(DEFAULT_READ_TIMEOUT); </li></ul></ul><ul><ul><li>urlc.setConnectTimeout(DEFAULT_CONN_TIMEOUT); </li></ul></ul><ul><ul><li>in = new BufferedInputStream(urlc.getInputStream(), 4096); </li></ul></ul>
    36. 36. Upload and your app should be published ?
    37. 37. Problems <ul><li>Can’t be found in Android Market </li></ul><ul><ul><li>Tattoo </li></ul></ul><ul><ul><li>A688 </li></ul></ul><ul><li>Analysis </li></ul><ul><ul><li>SDK </li></ul></ul><ul><ul><li>Layout (screen) </li></ul></ul><ul><ul><li>Layout (screen) </li></ul></ul><ul><ul><li>Permission </li></ul></ul>
    38. 38. SDK issues <ul><li>Always use the latest Android SDK release </li></ul><ul><ul><li>1.6+ </li></ul></ul><ul><li>Use emulator provided by vendors </li></ul><ul><ul><li>SE : http://developer.sonyericsson.com/wportal/devworld/home?cc=gb&lc=en </li></ul></ul><ul><ul><li>Motorola : http://developer.motorola.com/ </li></ul></ul><ul><li>Put in your AndroidManifest.xml </li></ul><ul><ul><li><uses-sdk android:minSdkVersion= &quot;3”/> </li></ul></ul><ul><ul><li>Not sure: android:targetSdkVersion= &quot;4“ </li></ul></ul>
    39. 39. Layout (screen) issues <ul><li>res/layout, res/layout-*dpi </li></ul><ul><ul><li>At least ldpi </li></ul></ul><ul><li>AndroidManifest.xml </li></ul><ul><ul><li><supports-screens </li></ul></ul><ul><ul><li>android:largeScreens=&quot;true“ </li></ul></ul><ul><ul><li>android:normalScreens=&quot;true“ </li></ul></ul><ul><ul><li>android:smallScreens=&quot;true“ </li></ul></ul><ul><ul><li>android:anyDensity=&quot;true&quot; /> </li></ul></ul><ul><li>Yeah ! Can be found on Tattoo & A688, but.. </li></ul>
    40. 40. Ugly layout <ul><li>Because of android:anyDensity=&quot;true&quot; </li></ul><ul><ul><li>Android won’t auto adjust UI elements </li></ul></ul><ul><ul><li>UI hell if you’re coding in the wrong way </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>Prefer wrap_content, fill_parent and the dip unit to px in XML layout files ( sp for text) </li></ul></ul><ul><ul><li>Avoid AbsoluteLayout </li></ul></ul><ul><ul><li>Do not use hard coded pixel values in your code </li></ul></ul><ul><ul><li>Use density and/or resolution specific resources </li></ul></ul><ul><ul><li>http://developer.android.com/intl/zh-TW/guide/practices/screens_support.html#dips-pels </li></ul></ul>
    41. 41. Add permission only when needed <ul><li>Story </li></ul><ul><ul><li>PlurQ is not found on Tattoo market -> Problem solved </li></ul></ul><ul><ul><li>PlurQ uses camera, should add “ android.permission.CAMERA ” to AndroidManifest.xml </li></ul></ul><ul><ul><li>PlurQ is not found on Tattoo market, again. </li></ul></ul><ul><ul><li>Only AndroidManifest.xml differs </li></ul></ul><ul><ul><li>After hours of testing, remove this stupid change and Booom ! </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>Add permission only when exception occurs. </li></ul></ul>
    42. 42. My 2 cents
    43. 43. Experience sharing.. <ul><li>Field try is important </li></ul><ul><ul><li>Buy one ! </li></ul></ul><ul><ul><li>Borrow one ! </li></ul></ul><ul><ul><li>Go local store and try it ! </li></ul></ul><ul><ul><li>Win one ! </li></ul></ul><ul><ul><ul><li>ADC or ADL ? </li></ul></ul></ul><ul><li>Record exception log </li></ul><ul><ul><li>You don’t know WTF is going on with users’ phone </li></ul></ul><ul><ul><li>Log should be easily turn on/off and get </li></ul></ul>
    44. 44. Experience sharing.. (cont.) <ul><li>Don’t be sad when you only have an old G1 </li></ul><ul><ul><li>If your program can run flawlessly on G1, robustness++ for your application! </li></ul></ul><ul><li>Don’t be frustrated by your defective Nexus One </li></ul><ul><ul><li>If your program can survive under the horrible networking environment on NO, robustness++ for your application! </li></ul></ul>
    45. 45. Performance tuning <ul><li>Tools </li></ul><ul><ul><li>Log.* </li></ul></ul><ul><ul><li>traceview </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>Some UI components can be created later </li></ul></ul><ul><ul><li>Use AsyncTask if you want to something in background and return result to UI </li></ul></ul>
    46. 46. Q & A
    47. 47. Any re Q uests or A dvises ?
    48. 48. On-going features <ul><li>Social Activity </li></ul><ul><ul><li>View profile / View plurks / Add friend,fan.. </li></ul></ul><ul><li>Share via … </li></ul><ul><li>Widget </li></ul><ul><li>Notification </li></ul>
    49. 49. Wish list <ul><li>Friend Browser / Editor </li></ul><ul><ul><li>Send private plurk / clique </li></ul></ul><ul><li>Theme </li></ul><ul><li>Short url </li></ul><ul><li>Video upload </li></ul><ul><li>Search plurker </li></ul><ul><li>Music listening </li></ul><ul><li>GPS support </li></ul>
    50. 50. Reference <ul><li>Plurk API </li></ul><ul><ul><li>http://code.google.com/p/jplurk/ </li></ul></ul><ul><ul><li>http://code.google.com/p/anplurkapi/ </li></ul></ul><ul><ul><li>http://code.google.com/p/jplurkapi/ </li></ul></ul><ul><li>Mobile development </li></ul><ul><ul><li>LG : http://developer.lgmobile.com/lge.mdn.mai.RetrieveMainPage.dev </li></ul></ul><ul><ul><li>Samsung : http://innovator.samsungmobile.com/ </li></ul></ul><ul><ul><li>Acer : http://mobile.acer.com/en/developers/ </li></ul></ul>
    1. ¿Le ha llamado la atención una diapositiva en particular?

      Recortar diapositivas es una manera útil de recopilar información importante para consultarla más tarde.

    ×