<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:wfw="http://wellformedweb.org/CommentAPI/"
 xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
 xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
>
<channel>
<title>Ken's Blog</title>
<description>Full Posts from Current Stories</description>
<lastBuildDate>Thu, 19 Nov 2015 22:23:22 -0400</lastBuildDate>
<link>http://www.keysolutions.com/blogs/kenyee.nsf</link>
<item><title>Installing SHA-256/SHA-2 SSL Certificate on Lotus Domino</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-A4F5Z6</link><description><![CDATA[ For those of you still using Lotus Domino and trying to get an SSL certificate installed now that everyone has moved to SHA-256 signed SSL certificates, here are two helpful links:
- using the kyrtool to generate the keyfile, CSR, and import keys
- using ...]]></description><dc:subject>IBM/Lotus</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-A4F5Z6</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-A4F5Z6</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">For those of you still using Lotus Domino and trying to get an SSL certificate installed now that everyone has moved to SHA-256 signed SSL certificates, here are two helpful links:</font>
<br /><font size=2 face="sans-serif">- </font><a href="https://www-10.lotus.com/ldd/ndseforum.nsf/xpTopicThread.xsp?documentId&igrave;CC40A836DA3C1885257D99004BF9B0"><font size=2 color=blue face="sans-serif">using the kyrtool</font></a><font size=2 face="sans-serif"> to generate the keyfile, CSR, and import keys</font>
<br /><font size=2 face="sans-serif">- </font><a href=https://frostillic.us/blog/posts/6AF303DE836BA02D85257D570058B1CA><font size=2 color=blue face="sans-serif">using nginx for SSL</font></a><font size=2 face="sans-serif"> as a reverse-proxy in front of the Domino server and also load balancing</font>
<br /> ]]></content:encoded><pubDate>Thu, 19 Nov 2015 22:23:22 -0400</pubDate><slash:comments>2</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=3C5A53C0FEB846ED85257F0300096EDD</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=3C5A53C0FEB846ED85257F0300096EDD</wfw:comment></item><item><title>Reproducible Cooking w/ Anova's Sous Vide Circulator</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9FQRKW</link><description><![CDATA[ After adding a sous-vide circulator to my cooking tools last year, I realized how much of a similarity this had w/ some of the Jenkins build automation work I've done. &nbsp;Restaurants use sous-vide to provide almost an idiot-proof consistency to their ...]]></description><dc:subject>Fun</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9FQRKW</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9FQRKW</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">After adding a sous-vide circulator to my cooking tools last year, I realized how much of a similarity this had w/ some of the Jenkins build automation work I've done. &nbsp;Restaurants use sous-vide to provide almost an idiot-proof consistency to their dishes as well as create dishes that weren't possible with control of temperatures and cooking time. &nbsp;Consistency in cooking is as important as it is in the software build process.</font>
<br /> ]]></content:encoded><pubDate>Sat, 17 Jan 2015 00:00:00 -0400</pubDate><slash:comments>1</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=ADFC44DFB81BAE5885257C6C006E703E</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=ADFC44DFB81BAE5885257C6C006E703E</wfw:comment></item><item><title>Book Review: Learning AngularJS for .Net Developers</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9QL5RY</link><description><![CDATA[ Learning AngularJS for .Net Developers, written by Alex Pop and published by PACKT, provides a good introduction to single page applications with the AngularJS framework using Visual Studio 2013 as your development environment. &nbsp;There is a lot of ...]]></description><dc:subject>.Net</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9QL5RY</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9QL5RY</guid><content:encoded><![CDATA[ <a href=http://bit.ly/1pBOkQm><font size=2 color=blue face="sans-serif">Learning AngularJS for .Net Developers</font></a><font size=2 face="sans-serif">, written by Alex Pop and published by </font><a href=http://www.packtpub.com><font size=2 color=blue face="sans-serif">PACKT</font></a><font size=2 face="sans-serif">, provides a good introduction to single page applications with the AngularJS framework using Visual Studio 2013 as your development environment. &nbsp;There is a lot of information available online for </font><a href=https://angularjs.org><font size=2 color=blue face="sans-serif">AngularJS</font></a><font size=2 face="sans-serif">, so the topics I'd like to see covered include in such a book include: how AngularJS is used on the client side, what support is provided by Visual Studio, how to write a .Net backend to support AngularJS, how authentication/security works in a client side application, how localization works, how the site is tested, and how the site can handle desktop web and mobile clients (aka
</font><a href=http://cordova.apache.org><font size=2 color=blue face="sans-serif">Cordova/PhoneGap</font></a><font size=2 face="sans-serif">). &nbsp;Most of these topics are covered sufficiently in this book except the last topic of using PhoneGap.</font> ]]></content:encoded><pubDate>Wed, 5 Nov 2014 22:11:52 -0400</pubDate><slash:comments>2</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=A3684F25CBFD126085257D8800119339</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=A3684F25CBFD126085257D8800119339</wfw:comment></item><item><title>Android's Horrid 64K DEX Method Limit</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9LP5ND</link><description><![CDATA[ One of the worst design decisions in the Android Dalvik virtual machine is the 64K method limit (this limit includes all methods in your application and all libraries you link in; note that this is not the same as Facebook's 64K Dalvik Runtime issue. ...]]></description><dc:subject>Android</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9LP5ND</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9LP5ND</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">One of the worst design decisions in the Android Dalvik virtual machine is the 64K method limit (this limit includes all methods in your application and all libraries you link in; note that this is not the same as </font><a href="https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920"><font size=2 color=blue face="sans-serif">Facebook's 64K Dalvik Runtime</font></a><font size=2 face="sans-serif"> issue. &nbsp;The cryptic compile time error you'll get during a build of your project is:</font>
<br /><tt><font size=1>&nbsp; java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536</font></tt>
<br />
<br /><font size=2 face="sans-serif">This problem will manifest easily if you hook in a few libraries that have a lot of methods, including notably the </font><a href="http://jakewharton.com/play-services-is-a-monolith/"><font size=2 color=blue face="sans-serif">Google Play Services Library</font></a><font size=2 face="sans-serif"> &nbsp;which can suck up 1/3 of this limit. &nbsp;Other libraries that are huge include the Amazon Web Services library and Guava and Protobufs (which you can substitute with Square's </font><a href=https://github.com/square/wire><font size=2 color=blue face="sans-serif">Wire</font></a><font size=2 face="sans-serif"> to reduce the method count). &nbsp;You can analyze the method count using
</font><a href="https://github.com/mihaip/dex-method-counts"><font size=2 color=blue face="sans-serif">dex-method-counts</font></a><font size=2 face="sans-serif">.</font>
<br />
<br /><font size=2 face="sans-serif">Note: Google's official workaround is
</font><a href=https://developer.android.com/tools/building/multidex.html><font size=2 color=blue face="sans-serif">multidex support</font></a><font size=2 face="sans-serif">.</font>
<br /> ]]></content:encoded><pubDate>Sun, 17 Aug 2014 00:00:00 -0400</pubDate><slash:comments>4</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=6853E1B1F99DDC1785257D0B001107CA</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=6853E1B1F99DDC1785257D0B001107CA</wfw:comment></item><item><title>OrmLite provides a standard ORM data mapping layer for Android, but if you want to avoid the performance hit from reflections (it uses annotations), you have to run a generator to make a configuration file that can be loaded at runtime.  Unfortunately, there's no documented automated way of doing this.  We were evaluating OrmLite for Mustbin's Android application and I ended up automating the generation of this file.</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9UM3CN</link><description><![CDATA[ At the top level of your project, create an ormlite-gen directory. &nbsp;You'll typically have beans w/ annotations in a beans or DB directory in your own application. &nbsp;These beans might use classes that are Android based (e.g. Parceable), so the ...]]></description><dc:subject>Android</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9UM3CN</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9UM3CN</guid><content:encoded><![CDATA[ <br /><font size=2 face="sans-serif">At the top level of your project, create an ormlite-gen directory. &nbsp;You'll typically have beans w/ annotations in a beans or DB directory in your own application. &nbsp;These beans might use classes that are Android based (e.g. Parceable), so the ormlite-gen directory has to include Android libraries to compile your beans. &nbsp;You'll need a simple AndroidManifest.xml:</font>
<br /><tt><font size=1>&lt;manifest xmlns:android=&quot;</font></tt><a href=http://schemas.android.com/apk/res/android><tt><font size=1>http://schemas.android.com/apk/res/android</font></tt></a><tt><font size=1>&quot;<br />  &nbsp; &nbsp;package=&quot;com.mustbin.mustbin&quot;<br />  &nbsp; &nbsp;android:versionCode=&quot;1&quot;<br />  &nbsp; &nbsp;android:versionName=&quot;1.0&quot; &gt;<br />
<br />  &nbsp; &nbsp;&lt;uses-sdk<br />  &nbsp; &nbsp; &nbsp; &nbsp;android:minSdkVersion=&quot;8&quot;<br />  &nbsp; &nbsp; &nbsp; &nbsp;android:targetSdkVersion=&quot;19&quot; /&gt;<br />
<br />  &nbsp; &nbsp;&lt;application &gt;<br />  &nbsp; &nbsp;&lt;/application&gt;<br />
<br /> &lt;/manifest&gt;</font></tt>
<br />
<br /><font size=2 face="sans-serif">Then you also need a build.gradle in the ormlite-gen directory:</font>
<br /><tt><font size=1>import org.apache.tools.ant.taskdefs.condition.Os<br />
<br /> buildscript {<br />  &nbsp; &nbsp;repositories {<br />  &nbsp; &nbsp; &nbsp; &nbsp;mavenCentral()<br />  &nbsp; &nbsp;}<br />  &nbsp; &nbsp;dependencies {<br />  &nbsp; &nbsp; &nbsp; &nbsp;classpath 'com.android.tools.build:gradle:0.8.+'<br />  &nbsp; &nbsp;}<br /> }<br />
<br /> apply plugin: 'android'<br />
<br /> repositories {<br />  &nbsp; &nbsp;mavenCentral()<br /> }<br />
<br /> dependencies {<br />  &nbsp; &nbsp;compile 'com.j256.ormlite:ormlite-android:4.48'<br />  &nbsp; &nbsp;compile 'com.google.code.gson:gson:2.2.+'<br /> }<br />
<br /> android {<br />  &nbsp; &nbsp;compileSdkVersion 19<br />  &nbsp; &nbsp;buildToolsVersion '19.0.1'<br />  &nbsp; &nbsp;sourceSets {<br />  &nbsp; &nbsp; &nbsp; &nbsp;main {<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;manifest {<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;srcFile 'AndroidManifest.xml'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;java {<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;srcDir 'src'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;srcDir '../app/src/main/java/com/mustbin/mustbin/api/beans'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;srcDir '../app/src/main/java/com/mustbin/mustbin/db'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exclude 'MustbinOpenHelper.java'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resources {<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;srcDir 'src/resources'<br />  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />  &nbsp; &nbsp; &nbsp; &nbsp;}<br />  &nbsp; &nbsp;}<br /> }<br />
<br /> ext.CfgFileName = 'ormlite_config.txt'<br /> ext.SrcCfgPath = '../app/src/main/res/raw/'<br /> ext.GenCfgPath = 'build/classes/debug/app/src/main/res/raw/'<br />
<br /> task copyConfigHereTask(type: Copy) {<br />  &nbsp; &nbsp;from SrcCfgPath+CfgFileName<br />  &nbsp; &nbsp;into GenCfgPath<br /> }<br />
<br /> task copyConfigBackTask(type: Copy) {<br />  &nbsp; &nbsp;from GenCfgPath+CfgFileName<br />  &nbsp; &nbsp;into SrcCfgPath<br /> }<br />
<br /> task runOrmGenTask(type: Exec) {<br />  &nbsp; &nbsp;workingDir './build/classes/debug'<br />  &nbsp; &nbsp;if (Os.isFamily(Os.FAMILY_WINDOWS)) {<br />  &nbsp; &nbsp; &nbsp; &nbsp;commandLine 'cmd', '/c', 'java', '-cp', '../../../libs/*:.', 'com.mustbin.mustbin.db.DatabaseConfigUtil'<br />  &nbsp; &nbsp;} else {<br />  &nbsp; &nbsp; &nbsp; &nbsp;//commandLine 'pwd'<br />  &nbsp; &nbsp; &nbsp; &nbsp;commandLine 'java', '-cp', '../../../libs/*:.', 'com.mustbin.mustbin.db.DatabaseConfigUtil'<br />  &nbsp; &nbsp;}<br /> }<br />
<br /> task genOrmCfg(dependsOn: ['clean', 'assembleDebug', 'copyConfigHereTask', 'runOrmGenTask', 'copyConfigBackTask']) {<br />  &nbsp; &nbsp;println &quot;Generating OrmLite Config...&quot;<br />  &nbsp; &nbsp;// the following locks the order of execution<br />  &nbsp; &nbsp;assembleDebug.mustRunAfter clean<br />  &nbsp; &nbsp;copyConfigHereTask.mustRunAfter assembleDebug<br />  &nbsp; &nbsp;runOrmGenTask.mustRunAfter copyConfigHereTask<br />  &nbsp; &nbsp;copyConfigBackTask.mustRunAfter runOrmGenTask<br /> }</font></tt>
<br />
<br /><font size=2 face="sans-serif">The main task is named genOrmCfg and copies over the OrmLite DatabaseConfigUtil to do the compile of the beans that are referenced by the srcDir parameters. &nbsp;Once that is done, it copies the ormlite_config.txt back to the appropriate place in your app's project.</font>
<br />
<br /><font size=2 face="sans-serif">Lastly, you have to modify your app's build.gradle to run this genOrmCfg task:</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT118"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">//// This section generates the config file for OrmLite and copies it to the right place</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT119"></a><font size=1 color=#2f2f2f face="Consolas">task runOrmGenTask(type: Exec) {</font>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;buildFile = '../ormlite-gen/build.gradle'</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/7cabd4b050b18c32d1812496aefdc85eef0c99b0#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/7cabd4b050b18c32d1812496aefdc85eef0c99b0#Lapp/build.gradleT122"></a><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;tasks = ['genOrmCfg']</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT127"></a><font size=1 color=#2f2f2f face="Consolas">}</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT128"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">Android.applicationVariants.all { variant -&gt;</font>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;ext.variantname = &quot;assemble&quot; + variant.name.capitalize()</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT130"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;//println &quot;Looking for variant ${variantname}&quot;</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT131"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;def targetTask = project.tasks.findByName(&quot;${variantname}&quot;)</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT132"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;if (targetTask != null) {</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT133"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp; &nbsp; &nbsp;println &quot;Adding dependency to ${variant.name}&quot;</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT134"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp; &nbsp; &nbsp;targetTask.dependsOn(&quot;runOrmGenTask&quot;)</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT135"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp; &nbsp; &nbsp;targetTask.mustRunAfter(&quot;runOrmGenTask&quot;)</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT136"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp; &nbsp;}</font>
<br /><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#add-comment"></a><a href="https://bitbucket.org/mustbin/mustbin-android/commits/2e85204b4ea1a8388693d3571a57cb9ad6970f50#Lapp/build.gradleT137"></a>
<br /><font size=1 color=#2f2f2f face="Consolas">&nbsp;}</font>
<br />
<br /><font size=2 face="sans-serif">This will run the OrmLite generator every time you compile to make sure everything is up-to-date. &nbsp;If you want to cut down your compile times, you can run the &quot;runOrmGenTask&quot; manually instead, but you might run into a situation where your classes are newer than the ormlite_config.txt file.</font>
<br /> ]]></content:encoded><pubDate>Mon, 17 Feb 2014 00:00:00 -0400</pubDate><slash:comments>2</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=AD333920D80C225A85257E0900063F14</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=AD333920D80C225A85257E0900063F14</wfw:comment></item><item><title>Eclipse Importing Android Libraries as Gradle Projects</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9EBT2G</link><description><![CDATA[ If you ever have problems importing an Android library into Eclipse because Eclipse keeps importing the library as Gradle project (not useful for adding to your Android project), be sure the &quot;.gradle&quot; and &quot;.settings&quot; subdirectories are ...]]></description><dc:subject>None</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9EBT2G</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9EBT2G</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">If you ever have problems importing an Android library into Eclipse because Eclipse keeps importing the library as Gradle project (not useful for adding to your Android project), be sure the &quot;.gradle&quot; and &quot;.settings&quot; subdirectories are removed from the project before import. &nbsp;The &quot;.classpath&quot; and &quot;.project&quot; files are also not needed.</font> ]]></content:encoded><pubDate>Thu, 12 Dec 2013 16:20:41 -0400</pubDate><slash:comments>2</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=6C6AE1436A28ADDC85257C3F0075434E</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=6C6AE1436A28ADDC85257C3F0075434E</wfw:comment></item><item><title>Gradle Dynamic Dependencies Also Use Ivy Syntax</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9BLL8H</link><description><![CDATA[ Most build.gradle dependencies I've seen specify them using the standard &quot;+&quot; Gradle syntax:
&nbsp; compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.+' 
But if you use the maven-plugin that can generate pom.xml files and upload your ...]]></description><dc:subject>Java</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9BLL8H</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9BLL8H</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">Most build.gradle dependencies I've seen specify them using the standard &quot;+&quot; Gradle syntax:</font>
<br /><font size=2 face="Consolas">&nbsp; compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.+' </font>
<br /><font size=2 face="sans-serif">But if you use the maven-plugin that can generate pom.xml files and upload your project to a Maven repository, this breaks Maven builds because the &quot;1.7.+&quot; is not Maven syntax. &nbsp;You can use this instead:</font>
<br /><font size=2 face="Consolas">&nbsp; compile &quot;org.slf4j:slf4j-api:[1.7,1.8)&quot;</font>
<br /><font size=2 face="sans-serif">This mathematical set range notation does effectively the same thing. &nbsp;It includes all 1.7 versions but stops at 1.8. &nbsp;If you wanted it to include any version above 1.7 (including 2.0, etc.), you'd specify:</font>
<br /><font size=2 face="sans-serif">&nbsp; compile &quot;org.slf4j:slf4j-api:[1.7,)&quot;</font>
<br /><font size=2 face="sans-serif">There's a bit more info on the </font><a href="http://www.maestrodev.com/better-builds-with-maven/creating-applications-with-maven/resolving-dependency-conflicts-and-using-version-ranges/"><font size=2 color=blue face="sans-serif">Maven/Ivy dynamic version syntax on Maestro's blog</font></a><font size=2 face="sans-serif">.</font>
<br /> ]]></content:encoded><pubDate>Sat, 5 Oct 2013 00:00:00 -0400</pubDate><slash:comments>2</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=3BD34CD2E6EB3F4285257BE8005518DA</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=3BD34CD2E6EB3F4285257BE8005518DA</wfw:comment></item><item><title>Adding Google/Facebook/LinkedIn OAuth Support to DropWizard</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9B845E</link><description><![CDATA[ DropWizard is a nice lightweight ops-friendly (provides health metrics) one-fat-jar (not a WAR file because it embeds jetty so it doesn't require a Java app server) Java REST web service framework that provides Basic authentication and OAuth (same server) ...]]></description><dc:subject>Java</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9B845E</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9B845E</guid><content:encoded><![CDATA[ <a href=http://dropwizard.codahale.com/><font size=2 color=blue face="sans-serif">DropWizard</font></a><font size=2 face="sans-serif"> is a nice lightweight ops-friendly (provides health metrics) one-fat-jar (not a WAR file because it embeds jetty so it doesn't require a Java app server) Java REST web service framework that provides Basic authentication and OAuth (same server) authentication for your web services, but it doesn't provide 3rd-party OAuth authentication (e.g., logging in via your Facebook or Google+ ID). &nbsp;OAuth authentication requires that you write your own OAuthProvider which isn't documented very well in the manual (where it says &quot;</font><a href=http://dropwizard.codahale.com/manual/auth/#oauth2><font size=2 color=blue face="sans-serif">Because OAuth2 is not finalized, this implementation may change in the future</font></a><font size=2 face="sans-serif">&quot;), though there is </font><a href="https://github.com/oharsta/university-foo"><font size=2 color=blue face="sans-serif">one limited functionality sample of doing it</font></a><font size=2 face="sans-serif">.</font>
<br />
<br /><font size=2 face="sans-serif">As an alternative, there is a DropWizard example that supports OpenID, but </font><a href="http://softwareas.com/migrating-user-accounts-from-google-openid-to-google-oauth-to-google-plus"><font size=2 color=blue face="sans-serif">OpenID isn't as flexible</font></a><font size=2 face="sans-serif"> as the OAuth APIs. &nbsp;OpenID primarily provides login/authentication. &nbsp;OAuth on the other hand, also provides authorization for more rich APIs (e.g., Facebook's Opengraph and Google G+, where you can access a users contacts, albums, post to feed, etc. which is just as important as authentication in applications today), and can provide login/authentication if you add the email scope to your OAuth request (unless you're using Twitter for your authentication in which case you can't get the user's email address so it can't be used as an authentication source effectively). &nbsp;To confuse matters more, Google also support OpenID, but if you're planning to use your backend for Android authentication, you'll have to use OAuth; you don't want to be </font><a href="http://softwareas.com/migrating-user-accounts-from-google-openid-to-google-oauth-to-google-plus"><font size=2 color=blue face="sans-serif">migrating users after choosing OpenID by mistake</font></a><font size=2 face="sans-serif"> like Player.FM did.</font>
<br /> ]]></content:encoded><pubDate>Sun, 15 Sep 2013 00:00:00 -0400</pubDate><slash:comments>6</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=BDC26A562B33866D85257BDC0009E2A1</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=BDC26A562B33866D85257BDC0009E2A1</wfw:comment></item><item><title>Quirks w/ Sencha Touch Hybrid App Development on BB10 w/ Sencha Architect</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9AMLP2</link><description><![CDATA[ I've always been curious about how well Sencha Touch works on mobile devices (I found jQuery Mobile to be sluggish when its swiping code was added to Bootstrap's carousel code), so when Blackberry announced a program to try Sencha Architect and a BB10 device, ...]]></description><dc:subject>Mobile</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9AMLP2</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9AMLP2</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">I've always been curious about how well Sencha Touch works on mobile devices (I found jQuery Mobile to be sluggish when its swiping code was added to Bootstrap's carousel code), so when Blackberry announced a program to try Sencha Architect and a BB10 device, I signed up for it thinking it'd be easy to port one of my simple Android apps to it. &nbsp;It turns out quirks in Sencha Architect and the Blackberry packaging tools made it a lot more painful than it needed to be.</font> ]]></content:encoded><pubDate>Sun, 25 Aug 2013 00:00:00 -0400</pubDate><slash:comments>3</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=3A91F94424452A5385257BC900577B19</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=3A91F94424452A5385257BC900577B19</wfw:comment></item><item><title>Building Android native clients for the Meteor.js framework</title><link>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9A7LNY</link><description><![CDATA[ Today's mobile developers generally fall into the responsive-css-hybrid or native app camps. &nbsp;On the one hand, the idea of a single web application that runs on the site and on mobile devices sounds great to the decision makers (and generally works for ...]]></description><dc:subject>Android</dc:subject><dc:creator>Ken K. Yee</dc:creator><comments>http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9A7LNY</comments><guid isPermaLink="true">http://www.keysolutions.com/blogs/kenyee.nsf/d6plinks/KKYE-9A7LNY</guid><content:encoded><![CDATA[ <font size=2 face="sans-serif">Today's mobile developers generally fall into the responsive-css-hybrid or native app camps. &nbsp;On the one hand, the idea of a single web application that runs on the site and on mobile devices sounds great to the decision makers (and generally works for simpler apps). &nbsp;Unfortunately, if you want the best experience for your mobile users (you generally won't find out about issues in hybrid apps until you're mostly done with it), you may very well need a native application as </font><a href="http://readwrite.com/2013/04/01/the-facebook-phone-the-triumph-of-native-apps-over-html5#awesm=~odnhbs59MjQZm9"><font size=2 color=blue face="sans-serif">Facebook found out when they kept trying to use HTML5</font></a><font size=2 face="sans-serif">.</font>
<br />
<br /><font size=2 face="sans-serif">In choosing a web platform for your application's web site and as an endpoint for your mobile applications, one of the checklist items inevitably includes whether it's possible to write a pure native client that will talk to your web stack because decision makers like having insurance. &nbsp;Meteor.js doesn't have the typical RESTful web service APIs that other web stacks have, though you can run another Node.js instance in parallel to do this with direct access to the database. &nbsp;To provide the reactivity and realtime data sync that is
</font><a href=http://www.meteor.com><font size=2 color=blue face="sans-serif">Meteor.js</font></a><font size=2 face="sans-serif">' real strength, you have to talk to the server via the DDP websocket protocol. &nbsp;For the two main mobile platforms (iOS and Android) as well as ASP.Net (including Windows Phones), this is now possible.</font>
<br /> ]]></content:encoded><pubDate>Sat, 3 Aug 2013 00:00:00 -0400</pubDate><slash:comments>3</slash:comments><wfw:commentRss>http://www.keysolutions.com/blogs/kenyee.nsf/CommentsRSS?Open&amp;id=0166F616B8A3673785257BBB00576FDA</wfw:commentRss><wfw:comment>http://www.keysolutions.com/blogs/kenyee.nsf/PostComment?RunAgent&amp;id=0166F616B8A3673785257BBB00576FDA</wfw:comment></item></channel>
</rss>
