<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7128344070283616074</id><updated>2024-10-06T21:06:17.283-07:00</updated><title type='text'>Official Rebrand Software Blog</title><subtitle type='html'>Creating awesome indie apps and private label software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-880562105099142169</id><published>2015-03-06T12:19:00.000-08:00</published><updated>2015-03-06T12:19:37.528-08:00</updated><title type='text'>Safely use IndexedDB in iOS 8</title><content type='html'>&lt;br /&gt;
I&#39;m in a situation where users of my app ScoreGeek are filling up the 5MB limit imposed on LocalStorage and I need to switch to IndexedDB.&lt;br /&gt;
&lt;br /&gt;
Upon making the switch I found that iOS and IndexedDB is &lt;a href=&quot;http://www.raymondcamden.com/2014/9/25/IndexedDB-on-iOS-8--Broken-Bad&quot;&gt;seriously buggy&lt;/a&gt;&amp;nbsp;when it comes to non-unique keys (it deletes values across separate tables if they share the same key... &amp;nbsp;jaw dropping bad bug).&lt;br /&gt;
&lt;br /&gt;
I have a workaround that does essentially this:&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;Whenever you set an object from IDB you pass the existing object ID and the table name&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;The table name, original ID and variable type are used to create a unique string&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;The unique string is used as the new key. &amp;nbsp;The original key is appended to the object as &quot;origKey&quot;.&lt;br /&gt;
&lt;br /&gt;
4) &amp;nbsp;When you get an object you pass the table name and key again. &amp;nbsp;That is used to find the object. &amp;nbsp;Then the &quot;origKey&quot; value is set back to the keypath and the object is returned.&lt;br /&gt;
&lt;br /&gt;
Using this method no two tables will ever have the same key, so the iOS bug is avoided.&lt;br /&gt;
&lt;br /&gt;
If you must sort numerically by ID then you will want to create an Index for origKey and sort using that. You can also create a KeyRange for origKey to find specific values or ranges.&lt;br /&gt;
&lt;br /&gt;
Hopefully this will help other people who are pulling their hair out over this. &amp;nbsp;I have tried to comment out any lines that are specific to my code (like the Toast.toast stuff) but I haven&#39;t run this code standalone.&lt;br /&gt;
&lt;br /&gt;
Here is the code:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbConvertId = function(id, table) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var s = &quot;?&quot;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var sKeyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (typeof id === &quot;string&quot;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s = &quot;s&quot;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sKeyPath = id;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else if (typeof id === &quot;number&quot;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s = &quot;n&quot;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sKeyPath = id.toString();&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; sKeyPath = sKeyPath.replace(/\//g, &quot;[[[fs]]]&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; id = table + &quot;/&quot; + s + &quot;/&quot; + sKeyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; return id;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
idbRevertId = function(obj, keyPath) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; obj[keyPath] = obj.origKey;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; delete obj.origKey;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; return obj;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbSetObj = function(obj, table, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var value = JSON.parse(JSON.stringify(obj));&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var db = myIndexedDB.db;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (db) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var trans = db.transaction([table], &quot;readwrite&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var store = trans.objectStore(table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var keyPath = store.keyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; value.origKey = value[keyPath];&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; value[keyPath] = idbConvertId(value[keyPath], table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var request = store.put(value);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trans.oncomplete = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(true);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; trans.onabort = function(event) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var error = event.target.error; // DOMError&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (error.name == &#39;QuotaExceededError&#39;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Fallback code comes here&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Toast.toast(&quot;Storage quota exceeded, some data was not saved&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Toast.toast(&quot;Transaction &quot; + err.name + &quot;: &quot; + err.message);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //console.log(err);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request.onerror = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Toast.toast(&quot;Request &quot; + err.name + &quot;: &quot; + err.message);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (err) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Toast.toastMiniLong(&quot;Store &quot; + err.name + &quot;: &quot; + err.message);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CloudAll.abort = true;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbGetObj = function(id, table, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var db = myIndexedDB.db;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (db) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var trans = db.transaction([table], &quot;readonly&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var store = trans.objectStore(table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var keyPath = store.keyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var keyRange;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id = idbConvertId(id, table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; keyRange = IDBKeyRange.only(id);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cursorRequest = store.openCursor(keyRange);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var ret;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onsuccess = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var result = e.target.result;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (result) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = result.value;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = idbRevertId(ret, keyPath);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(ret);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(null);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onerror = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbFindObjs = function(tableName, keyRangeObj, indexName, maxRecords, sortOrder, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var count = 0;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var max;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (maxRecords === 0) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max = 100000000;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max = maxRecords;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var objs = [];&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var db = myIndexedDB.db;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var ret;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (db) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var trans = db.transaction([tableName], &quot;readonly&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var store = trans.objectStore(tableName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var keyPath = store.keyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cursorRequest;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!indexName) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest = store.openCursor(keyRangeObj, sortOrder);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var myIndex = store.index(indexName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest = myIndex.openCursor(keyRangeObj, sortOrder);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onsuccess = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var result = e.target.result;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (result) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = result.value;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = idbRevertId(ret, keyPath);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; objs.push(ret);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count++;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (count &amp;lt; max) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.continue();&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(objs);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(objs);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onerror = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(Globals.empty);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(Globals.empty);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbFindObjKeys = function(tableName, keyRangeObj, indexName, maxRecords, sortOrder, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var count = 0;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var max;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (maxRecords === 0) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max = 100000000;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; max = maxRecords;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var objs = [];&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var db = myIndexedDB.db;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; if (db) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var trans = db.transaction([tableName], &quot;readonly&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var store = trans.objectStore(tableName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var cursorRequest;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!indexName) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest = store.openCursor(keyRangeObj, sortOrder);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var myIndex = store.index(indexName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest = myIndex.openCursor(keyRangeObj, sortOrder);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onsuccess = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var result = e.target.result;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (result) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; objs.push(result.primaryKey);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count++;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (count &amp;lt; max) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.continue();&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(objs);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(objs);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cursorRequest.onerror = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(Globals.empty);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; } else {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(Globals.empty);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbDelObj = function(id, table, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var db = myIndexedDB.db;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var trans = db.transaction([table], &quot;readwrite&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var store = trans.objectStore(table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var keyPath = store.keyPath;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var new_id = idbConvertId(id, table);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var request = store.delete(new_id);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; trans.oncomplete = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(true);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; request.onerror = function(e) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(false);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
var idbDelObjs = function(tableName, keyRangeObj, indexName, maxRecords, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var a;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var id;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; idbFindObjKeys(tableName, keyRangeObj, indexName, maxRecords, &#39;next&#39;, function(keys) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var l = keys.length;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var delIt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delIt = function(id, tableName) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idbDelObj(id, tableName, function(success) {});&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (var i = 0; i &amp;lt; l; i++) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; a = keys[i].split(&quot;/&quot;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id = a[2];&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (a[1] === &quot;n&quot;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id = parseInt(id, 10);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delIt(id, tableName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (i === (l - 1)) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(true);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (l === 0) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(true);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; });&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
And here are some of the ways I &#39;ve been using it:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
this.findAllLocations = function(callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var tableName = &quot;Locations&quot;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var keyRange = null;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var indexName = null;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var maxRecords = 0;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var sortOrder = &#39;next&#39;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; idbFindObjs(tableName, keyRange, indexName, maxRecords, sortOrder, function(results) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(results);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; });&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
this.deleteLocationById = function(name, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; idbDelObj(name, &quot;Locations&quot;, function(success) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(success);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; });&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
this.findBreakdownByScore = function(score_id, callback) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var tableName = &quot;Breakdowns&quot;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var id = idbConvertId(score_id, tableName);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var keyRange = IDBKeyRange.only(id);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var indexName = &#39;scoreId&#39;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var maxRecords = 0;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; var sortOrder = &#39;next&#39;;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; idbFindObjs(tableName, keyRange, indexName, maxRecords, sortOrder, function(results) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; callback(results);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; });&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
};&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/880562105099142169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2015/03/safely-use-indexeddb-in-ios-8.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/880562105099142169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/880562105099142169'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2015/03/safely-use-indexeddb-in-ios-8.html' title='Safely use IndexedDB in iOS 8'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-2406160841765281991</id><published>2014-10-15T19:35:00.000-07:00</published><updated>2014-10-15T19:35:07.281-07:00</updated><title type='text'>How to Preload Audio in PhoneGap</title><content type='html'>&lt;br /&gt;
I just spent days making a simple buzzer in an iOS app! &amp;nbsp;You push a big red button and it plays a buzzing sound.&lt;br /&gt;
&lt;br /&gt;
Actually, it took about 20 minutes to get it working, but there was a 1-2 second pause after pushing the button before the sound would play, which is unacceptable.&lt;br /&gt;
&lt;br /&gt;
So of course I googled Preload Audio Phonegap and the found a bunch of plugins that claim to do that. &amp;nbsp;Implementing them was time consuming and no matter what I did I just couldn&#39;t get them working.&lt;br /&gt;
&lt;br /&gt;
Then I thought: I wonder what will happen if I just play the file once at zero volume to preload it?&lt;br /&gt;
&lt;br /&gt;
Well, folks, that&#39;s all it took. &amp;nbsp;I feel so foolish for wasting my own time; maybe this post will help you not waste yours.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;playAudio&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(&lt;/span&gt;src&lt;span class=&quot;s3&quot;&gt;, &lt;/span&gt;preload&lt;span class=&quot;s3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s3&quot; style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; //requires Cordova Core Media plugin&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; //src is the path to the file in your www folder&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; // for example, audio/buzzer.mp3&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;audioSuccess&lt;span class=&quot;s3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.&lt;span class=&quot;s4&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;&quot;[AUDIO]: Created &quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;+ &lt;/span&gt;src);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;audioError&lt;/span&gt;(&lt;span class=&quot;s8&quot;&gt;msg&lt;/span&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.&lt;span class=&quot;s4&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;&quot;[AUDIO]: Error &quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;+ &lt;/span&gt;msg);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p6&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;// Create Media object from src&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;span class=&quot;s6&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;my_media &lt;span class=&quot;s7&quot;&gt;= new &lt;/span&gt;Media(src, audioSuccess, audioError);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p6&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Play audio&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p7&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s7&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(preload &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s9&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;my_media.setVolume(&lt;span class=&quot;s9&quot;&gt;0&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;span class=&quot;s7&quot;&gt;else &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;my_media.setVolume(&lt;span class=&quot;s9&quot;&gt;1&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_media.play();&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/2406160841765281991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2014/10/how-to-preload-audio-in-phonegap.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/2406160841765281991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/2406160841765281991'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2014/10/how-to-preload-audio-in-phonegap.html' title='How to Preload Audio in PhoneGap'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-8346665565124872865</id><published>2014-09-23T14:20:00.003-07:00</published><updated>2014-09-23T14:23:11.035-07:00</updated><title type='text'>Firefox OS: Converting a camera image to a base64 encoded image URL</title><content type='html'>&lt;br /&gt;
I&#39;m porting my apps ScoreGeek and Easy Password Storage to Firefox OS, and ran into some issues with saving images returned by the camera or gallery picker.&lt;br /&gt;
&lt;br /&gt;
The problem is that I am used to Android and iOS returning a base64 image URL, but Firefox OS returns a blob URL that points to a local location on the device, like this:&lt;br /&gt;
&lt;br /&gt;
blob://alksdjfoasdi029alfiasfjalsia93lrahsfhaslekfhasfe&lt;br /&gt;
&lt;br /&gt;
You can load that URL into a image tag&#39;s source and it displays, but you can&#39;t resize it, save it, send it to another device, or even keep it around after you turn off the phone.&lt;br /&gt;
&lt;br /&gt;
My objective is to save it as a Base64 encoded image URL and then put it into LocalStorage or push it to my cloud server to be downloaded by other devices.&lt;br /&gt;
&lt;br /&gt;
After days of fooling around with FileReader I gave it up and found the correct approach: use a picker to get the photo data (as a blob:// url), load the blob URL into an image, then copy the image data to a canvas, and convert it to a Data URL. &amp;nbsp;The result is a base64 encoded image URL that can be saved on the device.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve copied the relevant functions from my code below, but it will require some modification to run in your environment.&lt;br /&gt;
&lt;br /&gt;
I hope this helps someone else with the same problem!&lt;br /&gt;
&lt;br /&gt;
var devicePlatform = getDevicePlatform();&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;pick &lt;span class=&quot;s2&quot;&gt;= new &lt;/span&gt;MozActivity({&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name: &lt;span class=&quot;s3&quot;&gt;&quot;pick&quot;&lt;/span&gt;,&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data: {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type: [&lt;span class=&quot;s3&quot;&gt;&quot;image/png&quot;&lt;/span&gt;]&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s6&quot;&gt;pick.&lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;onsuccess&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;res&lt;span class=&quot;s2&quot;&gt;=&lt;/span&gt;pick.result;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class=&quot;s6&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// Create object url for picked image&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s5&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;photoURL&lt;span class=&quot;s2&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s9&quot;&gt;window&lt;/span&gt;.URL.createObjectURL(res.blob);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;gamePicSuccess(photoURL);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pick.&lt;span class=&quot;s7&quot;&gt;onerror &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;function&lt;/span&gt;() {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.&lt;span class=&quot;s8&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;s10&quot;&gt;this&lt;/span&gt;.error);&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
gamePicSuccess: &lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;(&lt;span class=&quot;s2&quot;&gt;imageData&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;$el &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;$(&lt;span class=&quot;s4&quot;&gt;&#39;#imgGameImage&#39;&lt;/span&gt;); //jquery variable pointing to the element where the image will be displayed&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s3&quot;&gt;if &lt;/span&gt;(devicePlatform &lt;span class=&quot;s3&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;FirefoxOS&quot;&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;elDom &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;document&lt;/span&gt;.getElementById(&lt;span class=&quot;s4&quot;&gt;&quot;imgGameImage&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;myLoad&lt;/span&gt;() {&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elDom.removeEventListener(&lt;span class=&quot;s4&quot;&gt;&#39;load&#39;&lt;/span&gt;, myLoad); // to avoid a loop&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;imgCanvas &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;document&lt;/span&gt;.createElement(&lt;span class=&quot;s4&quot;&gt;&quot;canvas&quot;&lt;/span&gt;),&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; imgContext &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;imgCanvas.getContext(&lt;span class=&quot;s4&quot;&gt;&quot;2d&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; imgCanvas.width &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;elDom.width;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;s7&quot;&gt; &lt;/span&gt;imgCanvas.height &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;elDom.height;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; imgContext.drawImage(elDom, &lt;span class=&quot;s8&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;s8&quot;&gt;0&lt;/span&gt;, elDom.width, elDom.height);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;imgAsDataURL &lt;span class=&quot;s3&quot;&gt;= &lt;/span&gt;imgCanvas.toDataURL(&lt;span class=&quot;s4&quot;&gt;&quot;image/png&quot;&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $el.attr(&lt;span class=&quot;s4&quot;&gt;&#39;src&#39;&lt;/span&gt;, imgAsDataURL).load();&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elDom.addEventListener(&lt;span class=&quot;s4&quot;&gt;&quot;load&quot;&lt;/span&gt;, myLoad, &lt;span class=&quot;s8&quot;&gt;false&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $el.attr(&lt;span class=&quot;s4&quot;&gt;&#39;src&#39;&lt;/span&gt;, imageData).load();&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;};&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;function &lt;/span&gt;getDevicePlatform&lt;span class=&quot;s2&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//console.log(&quot;getDevicePlatform&quot;);&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;device;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;deviceArray;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;var &lt;/span&gt;userAgent &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;navigator&lt;/span&gt;.userAgent;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//console.log(navigator.userAgent);&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//userAgent = &quot;Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0&quot;;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(userAgent.match(&lt;/span&gt;/(iOS|iPhone|iPod|iPad|Android|Windows Phone|Mobile)/&lt;span class=&quot;s2&quot;&gt;)) {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; deviceArray &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;userAgent.match(&lt;/span&gt;/(iPhone|iPod|iPad|Android|Windows Phone|Mobile)/&lt;span class=&quot;s2&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;//console.log(devicePlatformArray);&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;deviceArray[&lt;span class=&quot;s6&quot;&gt;0&lt;/span&gt;];&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s4&quot;&gt;if &lt;/span&gt;(device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;Mobile&quot;&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; deviceArray &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;userAgent.match(&lt;span class=&quot;s8&quot;&gt;/(Firefox)/&lt;/span&gt;);&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;deviceArray[&lt;span class=&quot;s6&quot;&gt;0&lt;/span&gt;];&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s4&quot;&gt;if &lt;/span&gt;(device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;Firefox&quot;&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;FirefoxOS&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;span class=&quot;s4&quot;&gt;else &lt;/span&gt;{&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;Browser&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;if &lt;/span&gt;(device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;iPhone&quot;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;|| &lt;/span&gt;device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;iPod&quot;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;|| &lt;/span&gt;device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;iPad&quot;&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;iOS&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s4&quot;&gt;if &lt;/span&gt;(device &lt;span class=&quot;s4&quot;&gt;=== &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;Windows Phone&quot;&lt;/span&gt;) {&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;WinPhone&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; } &lt;span class=&quot;s4&quot;&gt;else &lt;/span&gt;{&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; device &lt;span class=&quot;s4&quot;&gt;= &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;&quot;Browser&quot;&lt;/span&gt;;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p5&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;return &lt;span class=&quot;s2&quot;&gt;device;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
};&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/8346665565124872865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2014/09/firefox-os-converting-camera-image-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8346665565124872865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8346665565124872865'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2014/09/firefox-os-converting-camera-image-to.html' title='Firefox OS: Converting a camera image to a base64 encoded image URL'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-7896295195252683466</id><published>2014-01-17T14:41:00.000-08:00</published><updated>2014-01-17T14:41:07.150-08:00</updated><title type='text'>Windows 8 Microsoft Account Login Complaints</title><content type='html'>I think that using a Microsoft Account as the method to login to a computer is bad security.&lt;br /&gt;
&lt;br /&gt;
I have been trying to shore up the security of my online accounts recently. &amp;nbsp;The way I&#39;ve been doing it is to use my password manager, Easy Password Storage, to create random passwords for each of my website accounts.&lt;br /&gt;
&lt;br /&gt;
Then, when I need to visit a website, I open Easy Password Storage and copy my password to the clipboard so that I can paste it into the website I&#39;m visiting&amp;nbsp;(I try to use at least 36 random characters to prevent brute force attacks, which means I don&#39;t know my passwords by memory any more). &amp;nbsp;The app makes this easy by launching the appropriate URL and copying my password to the clipboard so that I can paste it into the website&#39;s login form.&lt;br /&gt;
&lt;br /&gt;
Window 8 allows me to set up my PC login using my Microsoft Account. &amp;nbsp;The problem is that when I&#39;m logging into a computer I need a password that I can remember because I can&#39;t access my app to copy and paste my password when logging in to my PC.&lt;br /&gt;
&lt;br /&gt;
My Microsoft Account protects much more than just my PC login: it protects my apps, my financial data, email and more. &amp;nbsp;I want a secure password, but there&#39;s no way I can remember 36 random characters each time I launch Windows.&lt;br /&gt;
&lt;br /&gt;
I think the solution here would be to have a separate PC login password when using your Microsoft Account to log into your PC. &amp;nbsp;The chances of anyone at Microsoft reading this blog are slim, but I suppose it could happen....&lt;br /&gt;
&lt;br /&gt;
Until then I think there are some alternatives, like using a PIN or a picture password... &amp;nbsp;they don&#39;t seem very secure to me either but I guess it&#39;s the only option if I want a very secure password for my Microsoft Account. &amp;nbsp;Maybe someone can recommend a more secure method in the comments?&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Easy Password Storage, by Rebrand Software, LLC is currently available at the following locations:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Android - Google Play&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&quot;&gt;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Android/Kindle - Amazon&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.amazon.com/gp/product/B00HPAL0TS&quot;&gt;http://www.amazon.com/gp/product/B00HPAL0TS&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;iPhone/iPad/iPod - iTunes&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Mac OS X - Mac App Store&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows/Mac OS X - &amp;nbsp;Direct from RebrandSoftware.com&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=17&quot;&gt;http://www.rebrandsoftware.com/app.asp?id=17&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows Phone&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&quot;&gt;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Android - AppsLib&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.appslib.com/&quot;&gt;http://www.appslib.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/7896295195252683466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/windows-8-microsoft-account-login.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/7896295195252683466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/7896295195252683466'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/windows-8-microsoft-account-login.html' title='Windows 8 Microsoft Account Login Complaints'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-6343373006027043734</id><published>2014-01-16T08:54:00.000-08:00</published><updated>2014-01-16T09:02:54.111-08:00</updated><title type='text'>Securing Your Online Identity After Being Hacked</title><content type='html'>The other day my Twitter account &lt;a href=&quot;http://www.twitter.com/MikeKGibson&quot;&gt;@MikeKGibson&lt;/a&gt; was hacked. &amp;nbsp;The attacker sent out messages to everyone who follows me with URLs to other twitter users&#39; status updates, which in turn were links to suspicious websites.&lt;br /&gt;
&lt;br /&gt;
Luckily, I caught it within an hour before the hackers had a chance to tweet something like &quot;I like to #SniffMyOwnButt&quot; on my behalf. &amp;nbsp;I tweeted my followers warning them not to click on the links.&lt;br /&gt;
&lt;br /&gt;
But, worst of all, the attackers now have access to my password, giving them easy access to any other website where I used the same password. &amp;nbsp;Let&#39;s be honest, many of us use the same or similar passwords on all our website accounts.&lt;br /&gt;
&lt;br /&gt;
If your own passwords are ever compromised (&quot;before your own passwords are compromised&quot; may be more accurate) here are steps you can take to minimize the damage by using a password manager app like my own Easy Password Storage.&lt;br /&gt;
&lt;br /&gt;
The idea is not only to create strong passwords that cannot be brute forced, but to use a unique password for every website you visit. &amp;nbsp;That way one stolen password cannot be used to access any account but the one that is hacked. &amp;nbsp;You never know which big company is going to be hacked, or which website stores your passwords in plain-text.&lt;br /&gt;
&lt;br /&gt;
Here is how I use Easy Password Storage to deal with this:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Each time I create an account on a website I open my password manager, Easy Password Storage&lt;/li&gt;
&lt;li&gt;I add the account to my list and use the password generator to generate a random password with as many characters as possible. &amp;nbsp;I aim for at least 36 random characters if it is allowed by the website.&lt;/li&gt;
&lt;li&gt;I turn off &quot;Save password&quot; features of the browser. &amp;nbsp;It&#39;s a pain to lose this feature, but it&#39;s so easy for a hacker to gain access to them (have you ever tried typing &quot;chrome://settings/passwords&quot; in Chrome, for example?)&lt;/li&gt;
&lt;li&gt;When I know I&#39;m going to visit a website that will require a password, like my bank, I tab over to Easy Password Storage, select my bank entry, and click the Launch button. &amp;nbsp;This copies my long, random password to my clipboard and opens my bank&#39;s URL. &amp;nbsp;Now I can simply paste my password in.&lt;/li&gt;
&lt;li&gt;I have Easy Password Storage set to erase my clipboard 30 seconds after I copy my password for extra security.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
I won&#39;t lie, it&#39;s more time consuming to create random passwords for each website, but I suspect it&#39;s nothing compared to the time I would have to spend changing passwords and recovering accounts after a major hack.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Once you have put a system like this in place it means you no longer know your own passwords from memory. &amp;nbsp;It&#39;s important that you have access to your passwords on all your devices. &amp;nbsp;That&#39;s why Easy Password Storage has cloud sync as well as offline import/export ability. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As a developer I have all sorts of computers (Mac, Windows, iPad, Android Tablet, Android phone) where I need to have access to my passwords, and Easy Password Storage keeps them encrypted and synchronized automatically in the Cloud. &amp;nbsp;For more information, here is an article I wrote on &lt;a href=&quot;http://rebrandsoft.blogspot.com/2014/01/using-easy-password-storage-in-cloud.html&quot;&gt;Using Easy Password Storage in the Cloud&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Luckily, my Twitter password was unique and can&#39;t be used to hack my other accounts. I recommend you put a similar process in place with your own accounts now: it&#39;s much easier to deal with hackers now, before they have a chance to get into your bank account or trick people into thinking you #SniffYourOwnButt.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
Easy Password Storage, by Rebrand Software, LLC is currently available at the following locations:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Android - Google Play&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&quot;&gt;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Android/Kindle - Amazon&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.amazon.com/gp/product/B00HPAL0TS&quot;&gt;http://www.amazon.com/gp/product/B00HPAL0TS&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;iPhone/iPad/iPod - iTunes&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Mac OS X - Mac App Store&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows/Mac OS X - &amp;nbsp;Direct from RebrandSoftware.com&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=17&quot;&gt;http://www.rebrandsoftware.com/app.asp?id=17&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows Phone&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&quot;&gt;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Android - AppsLib&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.appslib.com/&quot;&gt;http://www.appslib.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/6343373006027043734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/securing-your-online-identity-after.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6343373006027043734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6343373006027043734'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/securing-your-online-identity-after.html' title='Securing Your Online Identity After Being Hacked'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-8601372195736189873</id><published>2014-01-14T08:22:00.000-08:00</published><updated>2014-01-14T08:22:04.257-08:00</updated><title type='text'>Using Easy Password Storage in the Cloud</title><content type='html'>&lt;br /&gt;
Easy Password Storage is my password management app which has been receiving great reviews like:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&quot;&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;This is the best password app at the app store. You have to have it!&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;-The Bold Man, Mac App Store&lt;/span&gt;&lt;/blockquote&gt;
&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;It’s simple, easy to use, high level of encryption and is fast, so not waiting ages for logins or anything. Very handy, I’d be lost without it.&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Arial, &#39;Helvetica Neue&#39;, Helvetica, sans-serif; font-size: 12px;&quot;&gt;-dbirch, Mac App Store&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Version 4 recently unveiled cloud support and mobile companion apps for the following platforms:&lt;br /&gt;
&lt;br /&gt;
iOS / Android / Kindle / Windows Phone / Mac OS X / Windows (links to app stores below)&lt;br /&gt;
&lt;br /&gt;
This version comes with the ability to synchronize passwords between all of your devices in the cloud. I want to touch on some of the ways you can benefit from using the free cloud service on your devices.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Backup&lt;/b&gt;: Even if you don&#39;t have multiple devices to synchronize you can still benefit form having an encrypted backup of your passwords in the cloud. &amp;nbsp;If you drop your phone in the toilet and replace it with a new one, just install the app and your passwords will be restored.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Similar Device Sync&lt;/b&gt;: One copy of the iOS app will work your iPhone, iPad and iPod as long as you&#39;re using the same apple account. &amp;nbsp;Add a password on one and it shows up instantly on the others.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sync cross-platform&lt;/b&gt;: Add passwords on your iPhone, they show up on your Kindle Fire and your Windows Desktop versions of the app.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Easily switch phones:&lt;/b&gt; If you decide to switch from your Android phone to an iPhone in the future, no problem, your passwords will come with you.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Security is our number on concern. &amp;nbsp;Here is how the app handles your data before sending it to the cloud:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Your passwords are encrypted by the app with your private Master Password with your choice of either Blowfish 448 bit or Advanced Encryption Standard (AES) 256 bit encryption.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Next, the app encrypts that data with our developer key using 448 bit encryption. &amp;nbsp;Now your data is doubly encrypted. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;That data is encoded for extra security and ease of transfer&lt;/li&gt;
&lt;li&gt;A connection to the cloud server is established over an HTTPS connection&lt;/li&gt;
&lt;li&gt;The data is encrypted in transit to our cloud server using SSL&lt;/li&gt;
&lt;li&gt;Your private Master Password is never sent to the cloud or stored anywhere. &amp;nbsp;That means we can&#39;t access your passwords (and unfortunately means we can&#39;t recover them either, so remember your Master Password!)&lt;/li&gt;
&lt;li&gt;All that is done in reverse when the data is sent back to your devices. &amp;nbsp;Only an app with the same username, master password and encryption type can decrypt your data, and the user must be signed into your cloud account as well.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Even with that level of security you may still decide you want to backup or sync your data offline, which is why we have included the ability to import/export passwords encrypted in file or text format. The app can run completely offline and still keep your passwords synchronized.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here are all the devices and app stores where Easy Password Storage is currently available:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Android - Google Play&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&quot;&gt;https://play.google.com/store/apps/details?id=com.rebrandsoftware.easypasswordstorageios&amp;amp;h&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Android/Kindle - Amazon&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.amazon.com/gp/product/B00HPAL0TS&quot;&gt;http://www.amazon.com/gp/product/B00HPAL0TS&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;iPhone/iPad/iPod - iTunes&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Mac OS X - Mac App Store&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&quot;&gt;https://itunes.apple.com/us/app/easy-password-storage/id727687157?ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows/Mac OS X - &amp;nbsp;Direct from RebrandSoftware.com&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=17&quot;&gt;http://www.rebrandsoftware.com/app.asp?id=17&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Windows Phone&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&quot;&gt;http://www.windowsphone.com/s?appid=3cf0de36-c432-4fbf-add9-d6c4720f8c11&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Android - AppsLib&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.appslib.com/&quot;&gt;http://www.appslib.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/8601372195736189873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/using-easy-password-storage-in-cloud.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8601372195736189873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8601372195736189873'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2014/01/using-easy-password-storage-in-cloud.html' title='Using Easy Password Storage in the Cloud'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-1828634129803174427</id><published>2013-04-25T07:16:00.001-07:00</published><updated>2013-04-28T06:50:11.766-07:00</updated><title type='text'>Recovering From Accusations of Malware</title><content type='html'>&lt;h2&gt;
Introduction&lt;/h2&gt;
&lt;br /&gt;
Here is the story of my 8 year battle against false reports of malware in my software, how I eventually won that battle, and how you can ensure the same thing doesn&#39;t happen to your website or products.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
The Beginning: Can one person make an effective anti-spyware product?&lt;/h2&gt;
&lt;br /&gt;
In 2005 my software company was two years old, I had a good number of customers, and people were hungry for more private label software. &amp;nbsp;The economy was great and I had a lot of requests to create new private label applications.&lt;br /&gt;
&lt;br /&gt;
In particular, there were many requests for anti-spyware and anti-virus products. &amp;nbsp;However, I always turned them down citing the inability to maintain a good definitions database.&lt;br /&gt;
&lt;br /&gt;
Eventually, I found a way that I could maintain a definitions database for spyware (not antivirus) by creating internal software that sourced information about files from the web, meaning I didn&#39;t need a team to maintain definitions. &lt;br /&gt;
&lt;br /&gt;
With that, I created what I think was a fairly good and safe anti-spyware product that I called Ad-Purge. &amp;nbsp; &amp;nbsp;Upon release it sold well and people seemed to like it for a light-weight spyware solution. &amp;nbsp;However, because of the crowd sourced definitions it was prone to false positives: if a lot of websites thought a file was spyware then Ad-Purge did too.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
The Spyware Warrior on the Offensive&lt;/h2&gt;
&lt;br /&gt;
Within a few months of release Ad-Purge was labeled as a &quot;rogue anti-virus product&quot; by a person who called himself Spyware Warrior. &amp;nbsp;I, of course, was appalled. &amp;nbsp;I wrote to him trying to clear my name; I made changes to the software to make it more consumer friendly; I kept a close watch on the definitions to avoid false positives, but Spyware Warrior was determined that I created the product with bad intentions. &lt;br /&gt;
&lt;br /&gt;
I eventually decided that Mr. Spyware Warrior was simply a jerk and went back to what I enjoyed: writing software instead of spending time trying to appease him. &amp;nbsp;This was a mistake, for the spyware community took his opinions as fact causing Ad-Purge, and worse my website, to show up on many different blacklists and malware sites.&lt;br /&gt;
&lt;br /&gt;
In 2008 I was forced to simply discontinue Ad-Purge in order to avoid being caught up in any more of these false accusations. &amp;nbsp;Eventually the false positives went away for the most part and business resumed as usual. &amp;nbsp;I continued to sell the private label version but made sure my customers could not repeat my mistakes. &amp;nbsp;In particular, I turned down many requests from my customers to make the demo version detect spyware but not remove it until the software was purchased in full.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Five Years Later&lt;/h2&gt;
&lt;br /&gt;
Recently, in 2013, I became aware that my website and business had extremely negative reviews on a crowd sourcing security website called Web of Trust (WOT). &amp;nbsp;Upon closer inspection I discovered that we had some good customer reviews but the vast majority listed us as a malware website!&lt;br /&gt;
&lt;br /&gt;
Here is our current Web of Trust page:&amp;nbsp;&lt;a href=&quot;http://www.mywot.com/en/scorecard/rebrandsoftware.com&quot;&gt;http://www.mywot.com/en/scorecard/rebrandsoftware.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I began by replying to each of the user reviews that cited malware and asking them to reevaluate their ratings. &amp;nbsp;They were helpful but reluctant to change their rating unless I had my software removed from various website reputation scanners, for example:&lt;br /&gt;
&lt;br /&gt;
URL Void:&amp;nbsp;&lt;a href=&quot;http://www.urlvoid.com/scan/rebrandsoftware.com/&quot;&gt;http://www.urlvoid.com/scan/rebrandsoftware.com/&lt;/a&gt;&lt;br /&gt;
Virus Total:&amp;nbsp;&lt;a href=&quot;https://www.virustotal.com/en/url/88a6e02c0e01ae67f2d5724a828af9d2ae5bd0396f283860b9d078798d412c46/analysis/1366895547/&quot;&gt;https://www.virustotal.com/en/url/88a6e...&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
These tools list scan results from various security software vendors. &amp;nbsp;If any of the vendors think your website is malicious then it is a bad sign.&lt;br /&gt;
&lt;br /&gt;
RebrandSoftware.com was listed by over 20 different vendors as being a distributor of malware. &amp;nbsp;When I contacted some of the vendors they made circular references: we can&#39;t take you off our list because you&#39;re listed on URL Void. &amp;nbsp;Obviously I couldn&#39;t get removed from URL Void without them first taking me off their list.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
The Solution&lt;/h2&gt;
&lt;br /&gt;
What I had to do was track down every suspicious file or URL that was being tracked by these vendors, make sure it was actually safe, and use all of their false positive reporting tools to contact them individually.&lt;br /&gt;
&lt;br /&gt;
I noticed when scanning my software executables that VirusTotal.com thought many of my programs written in Visual Basic 6, our older programming language, were spyware. &amp;nbsp;As a simple test I recompiled the software on an updated system, resigned our executables and installers, and uploaded the new copies to our website. &amp;nbsp;This took care of about 75% of the false positives. &amp;nbsp;I don&#39;t know what they were keying on, maybe an old VB6 .dll file, but I suspect that those files are used by potentially millions of applications written in the early 2000s that are also being falsely accused of being spyware.&lt;br /&gt;
&lt;br /&gt;
Next, I went through all the URLs on our site that were flagged as malicious. &amp;nbsp;Many of them were old URLs that are not even in use, pointing to blank pages or error messages. &amp;nbsp;It seemed that many of the vendors never bothered to check what was actually at the URL they were condemning, they simply found it listed by other vendors and added it to their own database.&lt;br /&gt;
&lt;br /&gt;
Armed with the knowledge that everything on my website was safe I began submitting false positive reports to the antivirus vendors. &amp;nbsp;Sometimes you have to sign up and post on a forum, sometimes there is a false positive submission form, and sometimes you have to download the company&#39;s product and register your email address (sketchy).&lt;br /&gt;
&lt;br /&gt;
Most vendors removed the false positives right away, but many took no action or used more circular logic. &amp;nbsp;I wonder if they actually look at the content of files and URLs or they just crowd-source their definitions like I did... lesson learned.&lt;br /&gt;
&lt;br /&gt;
When it came down to only 4 or 5 websites reporting malware I resolved to contact them every day, repeatedly, until they responded. &lt;br /&gt;
&lt;br /&gt;
I have also been tracking down blog posts which list us as a malware distributor and leaving comments that explain what my company does. &amp;nbsp;A quick look at my website shows that my apps are highly rated on places like the Mac App Store and the Windows Store, meaning they have been scrutinized and vetted by companies who hopefully would never let malware into their systems. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Are My Customers Malicious?&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I wonder how, after the 2008 incident, all this started up again and I suspect that I have a small number of customers who are actively using my rebranding services to create fake programs and distribute viruses with them. &amp;nbsp;I rebrand our software for other companies to sell, and I suspect that some of my customers must be modifying the executables after I deliver them.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I don&#39;t have a good way of knowing whether it is deliberate or not. &amp;nbsp;It&#39;s certainly possible that one of my customers had an infected computer, purchased clean software from me, downloaded it, it was infected on their computer, and then they tried to distribute it. &amp;nbsp;Obviously this is a bad practice and all software should be verified clean before distribution.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One sure indicator of a fraud is when I am paid hundreds of dollars for a product and the purchaser seems to take no interest in their final product&#39;s quality. &amp;nbsp;They will upload poor quality images even though my artist can create professional graphics for them for free. &amp;nbsp;Sometimes they provide URLs which are dead or point to an unregistered domain. &amp;nbsp;Then their payment will be charged back and I know the whole thing was a ruse. &amp;nbsp;Was this someone with malicious intent or just someone trying to use a stolen credit card? &amp;nbsp;Maybe both? &amp;nbsp;I don&#39;t know.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I&#39;ve learned to spot those obvious cases, but I certainly can&#39;t tell a person&#39;s intentions from their normal transactions with me. &amp;nbsp;It is against our terms of service for our customers to do anything illegal with the software purchased from us, including distribute malware or engage in scamming. &amp;nbsp;The vast majority of my customers are people interested in making money with shareware or trying to offer a bonus product to their customers. &amp;nbsp;Having software with your name on it can impress clients, make your website more legitimate, create more sales for other products when packaged, etc.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I don&#39;t think it&#39;s up to me to judge people&#39;s intentions. &amp;nbsp;All I can really do is respond to any inquiries by anti-virus vendors. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;u&gt;The number of anti-virus vendors who have contacted me in the past 10 years about my software or my customer&#39;s? &amp;nbsp;Zero.&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In the end I simply decided to discontinue the anti-spyware product entirely. &amp;nbsp;I will continue to update the definitions database for the legitimate customers who vastly outnumber the potentially bad ones.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
My Name Is Cleared, Kinda&lt;/h2&gt;
&lt;br /&gt;
Now, finally, I have been removed from every major website credibility reporting tool and most anti-virus vendors. &amp;nbsp;One vendor, AlienVault, responded to my technical support request with a phone call from a sales rep. &amp;nbsp;When I asked him if the support team knew how I could report a false positive he asked them and responded &quot;They don&#39;t know but they&#39;re looking at like 7 monitors right now.&quot; &amp;nbsp;Ugh.&lt;br /&gt;
&lt;br /&gt;
I have bookmarked my WebOfTrust, URLVoid and VirusTotal pages and intend to check them frequently. &amp;nbsp;If you have websites or distribute shareware I highly recommend you do the same. &amp;nbsp;These anti-virus vendors are not going to contact to you if your site or products get falsely accused. &amp;nbsp;And worse, if any false positives start making the rounds they are sure to be amplified by security vendors copying each other&#39;s records. &amp;nbsp;It&#39;s something that has to be stopped immediately or it spreads out of control.&lt;br /&gt;
&lt;br /&gt;
Web of Trust currently reports that my website is trusted, but only barely. &amp;nbsp;My hope is that their users will reevaluate my website and change their scores. &amp;nbsp;I&#39;m also going to start promoting Web of Trust on my website so that my actual customers can report their good experiences. &amp;nbsp;If you have a moment, I sure would appreciate a positive rating there:&amp;nbsp;&lt;a href=&quot;http://www.mywot.com/en/scorecard/rebrandsoftware.com&quot;&gt;http://www.mywot.com/en/scorecard/rebrandsoftware.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Now, hopefully, I can get back to what I really love: writing apps!</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/1828634129803174427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/04/recovering-from-accusations-of-malware.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/1828634129803174427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/1828634129803174427'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/04/recovering-from-accusations-of-malware.html' title='Recovering From Accusations of Malware'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-6294167506919178353</id><published>2013-02-28T12:59:00.000-08:00</published><updated>2013-02-28T13:15:19.182-08:00</updated><title type='text'>Losing Weight With Easy Calorie Counter: Part 1</title><content type='html'>&lt;h2&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Introduction&lt;/span&gt;&lt;/h2&gt;
I&#39;ve been developing and using my app&amp;nbsp;&lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=33&quot;&gt;Easy Calorie Counter&lt;/a&gt;&amp;nbsp;(available for Windows and Mac) for about a year now and using it in conjunction with running and exercise to lose weight. &amp;nbsp;You can see a screenshot of it below:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=33&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ5DeMUPnM9NpHn6tR3nkl2uARkytUHJ1fPS_Iypim16vMKKL7YnIJmERpq81AQ61UQ1DuJ0DjTDgC29wLKqlWrjU0Xy31fprSIY5nDqU9l0sYHLsh6Y7VrDLm8nLKPN8qj79T9jF2Q_bf/s320/English1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I&#39;m male, 34 years old, 5&#39;8&quot;, and I brew my own beer which makes it particularly easy to go overboard on calories if I&#39;m not careful.&lt;br /&gt;
&lt;br /&gt;
In the Summer and Fall of 2012 I managed to lose 13 lbs, moving from 165 lbs. to 152 lbs, and have kept the weight off since then. &amp;nbsp;I&#39;ve learned a lot about what works so I&#39;ll be posting a series of tips for others who might be struggling. &lt;br /&gt;
&lt;br /&gt;
Tracking your calories is the key. &amp;nbsp;During my first cycle of P90X I actually gained weight, going from 162 to 165 over a period of three months. &amp;nbsp;I was so hungry from all the extra exercise that I ate a lot of high calorie foods, and I didn&#39;t track what I ate.&lt;br /&gt;
&lt;br /&gt;
You don&#39;t have to use Easy Calorie Counter for this to work, but it&#39;s only a few dollars and there&#39;s a &lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=33&quot;&gt;free demo available here&lt;/a&gt;. &amp;nbsp;You could even start tracking what you eat with pen and paper, that&#39;s what I did and what prompted me to write the app in the first place.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Tip #1 - Finding your target calorie level&lt;/h2&gt;
&lt;div&gt;
Losing weight is all about math. &amp;nbsp;The bottom line is that you have to burn more calories than you take in and your body will do the rest. &amp;nbsp;Easy Calorie Counter has a built in calculator to help you find your target fat loss calorie level. &amp;nbsp;Here&#39;s a screenshot:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7JPDRRFNGftkMMHRhlJlLywFUW3GeRqLAW-BMrldoVfuym4h8WtJgpYtKhBDAnK-mAiW8ksUaRcaTPHxf05fLU_aA6P_51c5lJjDkXe_y9HItXITsqCzPjrtK2nkR9k8Ap3lGyQmL9o-3/s1600/Screen+Shot+2013-02-28+at+3.42.32+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;266&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7JPDRRFNGftkMMHRhlJlLywFUW3GeRqLAW-BMrldoVfuym4h8WtJgpYtKhBDAnK-mAiW8ksUaRcaTPHxf05fLU_aA6P_51c5lJjDkXe_y9HItXITsqCzPjrtK2nkR9k8Ap3lGyQmL9o-3/s320/Screen+Shot+2013-02-28+at+3.42.32+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Here you can see I&#39;ve selected Lightly Active. &amp;nbsp;I work at a computer all day but I exercise every day of the week, which would probably make me Moderately Active. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I think that this calculator, which uses either of two respected formulas for calculating fat loss calories, gives results that are a bit on the high side. &amp;nbsp;My sweet spot seems to be 1600 calories per day. &amp;nbsp;With that amount I tend to lose a little bit more than 1 pound per week. &amp;nbsp;But everyone is different, and a computer can never give a perfect number for something like this, so here is how to find your real fat loss calorie level:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Run the calculator to get an estimate of your fat loss calories&lt;/li&gt;
&lt;li&gt;Weigh yourself on an empty stomach (try it right after you wake up and use the bathroom)&lt;/li&gt;
&lt;li&gt;Use a calorie calculator to eat as close to your target calories as you can for 1 week&lt;/li&gt;
&lt;li&gt;At the end of the week, weigh yourself again on an empty stomach. Did you:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Maintain your weight? &amp;nbsp;Consume 500 fewer calories per day and repeat step one&lt;/li&gt;
&lt;li&gt;Gain weight? &amp;nbsp;Consume 500 fewer calories per day and repeat step one&lt;/li&gt;
&lt;li&gt;Lose 1-2 pounds? Perfect! &amp;nbsp;Maintain to reach your target weight!&lt;/li&gt;
&lt;li&gt;Lose 3 or more pounds? &amp;nbsp;Consume 300 more calories per day and repeat step one*&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;*People who are heavier are likely to lose 3+ pounds per week, which is ok&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Repeat those steps until you find your real number for fat loss calories that causes you to lose 1-2 pounds per week. &amp;nbsp;It might take a few weeks, it took me 2 or 3, but once you know that number you&#39;ll be armed with all the information you need to really lose weight and keep it off.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In the next installment I&#39;m going to show some examples of ways to shave off calories without being hungry all the time. &amp;nbsp;There are some nice substitutions you can make in your diet that make it easy. &amp;nbsp;You might even still have room for a beer if you&#39;re careful!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/6294167506919178353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/losing-weight-with-easy-calorie-counter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6294167506919178353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6294167506919178353'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/losing-weight-with-easy-calorie-counter.html' title='Losing Weight With Easy Calorie Counter: Part 1'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ5DeMUPnM9NpHn6tR3nkl2uARkytUHJ1fPS_Iypim16vMKKL7YnIJmERpq81AQ61UQ1DuJ0DjTDgC29wLKqlWrjU0Xy31fprSIY5nDqU9l0sYHLsh6Y7VrDLm8nLKPN8qj79T9jF2Q_bf/s72-c/English1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-1984541032726733825</id><published>2013-02-28T11:56:00.000-08:00</published><updated>2013-02-28T12:24:01.064-08:00</updated><title type='text'>Getting my apps on the Windows Store requires...  a Mac?!</title><content type='html'>&lt;br /&gt;
It seems that Microsoft is intent on turning me against them.&lt;br /&gt;
&lt;br /&gt;
First, they don&#39;t allow my Desktop Apps to be truly listed on the Windows Store. &amp;nbsp;They link to my app&#39;s external website instead. &amp;nbsp;Not that there&#39;s anything wrong with &lt;a href=&quot;http://www.rebrandsoftware.com/app.asp?id=17&quot;&gt;the homepage for Easy Password Storage&lt;/a&gt;, the app I&#39;m trying to register, but I wish customers could use the payment information they have already entered into the Windows Store and directly rate my app. &amp;nbsp;Apparently that is only possible with Metro style* apps, despite the fact that my apps run great on everything from Windows XP to Windows 8.&lt;br /&gt;
&lt;br /&gt;
Next, in order to get my app certified I have to have a $99 signing certificate from Symantec and only Symantec will do. &amp;nbsp;What&#39;s wrong with my industry standard Comodo certificate which have already paid for and jumped through many hoops to obtain? My guess is nothing...&lt;br /&gt;
&lt;br /&gt;
So, eventually, I received my Symantec wonder-certificate and my MS developer account and had my Windows App Certification Kit software installed. &amp;nbsp;When I ran it I was informed that reports generated with Remote Desktop were invalid for some reason that is not made clear.&lt;br /&gt;
&lt;br /&gt;
Luckily, I managed to find&amp;nbsp;&lt;a href=&quot;http://rebrandsoft.blogspot.com/2013/02/how-to-use-windows-app-certification.html&quot;&gt;a workaround which allows me to connect remotely&lt;/a&gt;&amp;nbsp;and still certify my apps, essentially proving that either Remote Desktop is a crappy application or there is no reason to refuse a Remote Desktop application when certifying apps.&lt;br /&gt;
&lt;br /&gt;
I finally ran the certification kit, got a result of &quot;Passed&quot;, and was ready to submit my app! &amp;nbsp;Hooray!&lt;br /&gt;
&lt;br /&gt;
Not so fast! &amp;nbsp;When I uploaded my certification XML file to the Windows App Certification page, I was informed that:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red; font-family: &#39;Segoe UI&#39;, &#39;Lucida Grande&#39;, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px;&quot;&gt;* The submission package is invalid as this was generated using an invalid toolset architecture. This website accepts submissions from 64 bit toolset architecture only.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, no problem, I purchased Windows 7 a few years ago and my current hardware supports 64 bit architecture: I&#39;ll just upgrade to a 64-bit version, right? &amp;nbsp;Wrong. &amp;nbsp;You can&#39;t update Windows from 32 bit to 64 bit without wiping your machine, reinstalling all your software and restoring all of your backed up files. &amp;nbsp;It&#39;s possible but risky, not to mention a huge waste of my time.&lt;br /&gt;
&lt;br /&gt;
So what is my solution? &amp;nbsp;Use my Mac. &lt;br /&gt;
&lt;br /&gt;
I&#39;m currently installing a copy of my Windows 7 64 bit using VirtualBox on my Macbook Pro.&lt;br /&gt;
&lt;br /&gt;
Then I can use my virtual copy of Windows on my Mac to complete the Windows App Certification. &lt;br /&gt;
&lt;br /&gt;
Ah, the irony.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPTrjYaHZFsOkw4OxvQsJQ0zeutuzZN5Xz12Xmteqms5gvI12NhhSaIdigYWBihoRwS5QvgdJZMaQCOtIFJl6S8IFsPAF8Ph0_8y-HzkcRfFOlTOTyIskh0eulOPfvpLB8NFgm73rqMbx2/s1600/Screen+Shot+2013-02-28+at+3.07.28+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPTrjYaHZFsOkw4OxvQsJQ0zeutuzZN5Xz12Xmteqms5gvI12NhhSaIdigYWBihoRwS5QvgdJZMaQCOtIFJl6S8IFsPAF8Ph0_8y-HzkcRfFOlTOTyIskh0eulOPfvpLB8NFgm73rqMbx2/s320/Screen+Shot+2013-02-28+at+3.07.28+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;*I know Microsoft has tried to ditch the name &quot;Metro&quot; but it&#39;s burned in my brain and I like to tease them with it.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/1984541032726733825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/getting-my-apps-on-windows-store.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/1984541032726733825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/1984541032726733825'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/getting-my-apps-on-windows-store.html' title='Getting my apps on the Windows Store requires...  a Mac?!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPTrjYaHZFsOkw4OxvQsJQ0zeutuzZN5Xz12Xmteqms5gvI12NhhSaIdigYWBihoRwS5QvgdJZMaQCOtIFJl6S8IFsPAF8Ph0_8y-HzkcRfFOlTOTyIskh0eulOPfvpLB8NFgm73rqMbx2/s72-c/Screen+Shot+2013-02-28+at+3.07.28+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-6676539601052396519</id><published>2013-02-28T09:45:00.003-08:00</published><updated>2013-02-28T10:09:26.551-08:00</updated><title type='text'>How to use the Windows App Certification Kit through Remote Desktop</title><content type='html'>In the past few years I&#39;ve become a Mac lover dispite decades of Windows use. I work primarily on my Macbook Pro and have disassembled my old home office in favor of an all-mac, all wireless environment.&lt;br /&gt;
&lt;br /&gt;
About a year ago I moved my Windows XP and Windows 7 machines into the &quot;server room&quot; where they run without monitors, keyboards or mice. &amp;nbsp;I use Remote Desktop from my Macbook to connect to them so now I can work from anywhere in the house or on the patio wirelessly.&lt;br /&gt;
&lt;br /&gt;
Recently I decided to get my &lt;a href=&quot;http://rebrandsoftware.com/&quot;&gt;RebrandSoftware.com&lt;/a&gt; apps listed on the Windows Store. &amp;nbsp;This week I&#39;ve been paying a lot of attention to &lt;a href=&quot;http://www.rebrandsoftware.com/EasyPasswordStorage&quot;&gt;Easy Password Storage&lt;/a&gt;, one of my most highly rated apps on the Mac App Store, and the fone I want to get posted on the Windows Store first. &amp;nbsp;To get it approved I have to run the Windows App Certification Kit. &amp;nbsp;It installs my app, checks that all the files have a digital signature, runs diagnostics and gives a report which can be uploaded to Microsoft. &lt;br /&gt;
&lt;br /&gt;
There&#39;s one hitch, though: Remote Desktop is not allowed! &amp;nbsp;I assume it has something to do with video benchmarks, but it&#39;s a major annoyance for me. &amp;nbsp;Surely there is someone else in this situation, which is why I decided to write about it.&lt;br /&gt;
&lt;br /&gt;
Imagine my surprise when I found out that to get my app certified I would need to get a monitor, keyboard and mouse, hook them into my old Windows box and sit on the floor next to a cat litter box. &amp;nbsp;Yes, it&#39;s true, the &quot;server room&quot; is really a closet where cats poop all day. &amp;nbsp;That is the extent of my disdain for those old windows boxes.&lt;br /&gt;
&lt;br /&gt;
If you try to certify your app over Remote Desktop your app is immediately rejected. &amp;nbsp;I gathered my old monitor, keyboard and mouse but could not find a cord for my monitor. &amp;nbsp;After two years of almost all wireless the ordeal seemed particularly archaic. &amp;nbsp;Shouldn&#39;t I be able to stream an HD version of my monitor? &amp;nbsp;I can stream HD movies from Netflix... Why would app certification require a physical monitor?&lt;br /&gt;
&lt;br /&gt;
It turns out my distress was for naught because I have found a simple workaround: as of this writing the Windows App Certification Kit doesn&#39;t realize the connections using LogMeIn.com are remote desktop connections. &amp;nbsp;The workaround will probably work with other remote login services as well but I have only tested with LogMeIn.com.&lt;br /&gt;
&lt;br /&gt;
The results: Passed with Warnings. &amp;nbsp;Here&#39;s a screenshot:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhudst5IxIB8dMMnQmH2qz2zUf4QBiPOhkapxH_fD1julsy5OwQSSs7XiPpfaLuAlb6mvJS_a3CD35HOvDD-jWet_faNW-voLBB822XtZba3EtuIN4P1Yq0fZ2cxyathNh9NI8CcGe-k2hy/s1600/Screen+Shot+2013-02-28+at+12.42.27+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhudst5IxIB8dMMnQmH2qz2zUf4QBiPOhkapxH_fD1julsy5OwQSSs7XiPpfaLuAlb6mvJS_a3CD35HOvDD-jWet_faNW-voLBB822XtZba3EtuIN4P1Yq0fZ2cxyathNh9NI8CcGe-k2hy/s320/Screen+Shot+2013-02-28+at+12.42.27+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
The warnings are unrelated to using a Remote Desktop agent: it says my app didn&#39;t properly respond to system restart notifications. &amp;nbsp;I think it&#39;s safe to ignore, but it could certainly be the topic of a future blog rant.&lt;br /&gt;
&lt;br /&gt;
The real victory: I won&#39;t have to endure the &quot;server room&quot; any time soon!</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/6676539601052396519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/how-to-use-windows-app-certification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6676539601052396519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/6676539601052396519'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/how-to-use-windows-app-certification.html' title='How to use the Windows App Certification Kit through Remote Desktop'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhudst5IxIB8dMMnQmH2qz2zUf4QBiPOhkapxH_fD1julsy5OwQSSs7XiPpfaLuAlb6mvJS_a3CD35HOvDD-jWet_faNW-voLBB822XtZba3EtuIN4P1Yq0fZ2cxyathNh9NI8CcGe-k2hy/s72-c/Screen+Shot+2013-02-28+at+12.42.27+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-8331272363686133913</id><published>2013-02-21T11:35:00.003-08:00</published><updated>2013-02-21T11:51:31.167-08:00</updated><title type='text'>Tips for external links and social media within apps</title><content type='html'>I&#39;ve been trying to link to social media sites within all of my apps. &amp;nbsp;Within each app you can do the following things:&lt;br /&gt;
&lt;br /&gt;
-Click to Rate (this either brings you to our website&#39;s rate page, or the Mac App Store)&lt;br /&gt;
-Click to Tweet (composes an example tweet that links to the proper app)&lt;br /&gt;
-Click to Follow (launches &lt;a href=&quot;http://www.rebrandsoftware.com/follow.asp&quot; target=&quot;_blank&quot;&gt;my twitter page&lt;/a&gt;)&lt;br /&gt;
-Click to Like (launches the appropriate facebook page for the app)&lt;br /&gt;
-Click to Friend (launches &lt;a href=&quot;http://www.rebrandsoftware.com/friend.asp&quot; target=&quot;_blank&quot;&gt;my facebook page&lt;/a&gt; to friend or follow)&lt;br /&gt;
&lt;br /&gt;
If you click any of the links above you&#39;ll see that they&#39;re not actually linking to Facebook or Twitter, but to my own website, &lt;a href=&quot;http://rebrandsoftware.com/&quot;&gt;RebrandSoftware.com&lt;/a&gt;. &amp;nbsp;From there, a page on my website redirects to the actual Facebook or Twitter page.&lt;br /&gt;
&lt;br /&gt;
I never know if/when I might have to change my Facebook URL or my Twitter handle. &amp;nbsp;This way, all my apps are pointing to a page on my website instead of directly to Facebook or Twitter. I can change that page to redirect to a new URL at any time.&lt;br /&gt;
&lt;br /&gt;
I will never have to change the URLs within my apps again. &amp;nbsp;If my Facebook or Twitter URLs change I can update the pages on my website, instead of rebuilding and redistributing all of my apps. &amp;nbsp;Even customers using old versions will be brought to the correct URL without having to update first.&lt;br /&gt;
&lt;br /&gt;
I think this lesson applies to any time you&#39;re linking to an outside source: keep control of the links by sending them through your own server first to redirect to the proper URL. &amp;nbsp;It&#39;s also a handy memory tool:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.rebrandsoftware.com/follow.asp&quot;&gt;http://www.rebrandsoftware.com/follow.asp&lt;/a&gt;&lt;br /&gt;
is much easier to remember than&lt;br /&gt;
&lt;a href=&quot;https://twitter.com/intent/follow?screen_name=MikeKGibson&quot;&gt;https://twitter.com/intent/follow?screen_name=MikeKGibson&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/8331272363686133913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/tips-for-external-links-and-social.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8331272363686133913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8331272363686133913'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/02/tips-for-external-links-and-social.html' title='Tips for external links and social media within apps'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-7941786047346095936</id><published>2013-01-26T09:02:00.000-08:00</published><updated>2013-01-26T09:02:02.053-08:00</updated><title type='text'>Going live with a new website!</title><content type='html'>&lt;br /&gt;
It&#39;s been many months in the making and today I&#39;m going live with a complete redesign of RebrandSoftware.com.&lt;br /&gt;
&lt;br /&gt;
There is an overwhelming amount of legacy data and services that we have to continue supporting through the merge:&lt;br /&gt;
&lt;br /&gt;
-Existing customers, usernames and passwords&lt;br /&gt;
-Services that our software depends on&lt;br /&gt;
-Existing sales&lt;br /&gt;
-Integration with SoftLocker.net&lt;br /&gt;
&lt;br /&gt;
So I&#39;ve tried my best to make sure everything will work with only minor interruptions. &amp;nbsp;Let&#39;s hope for the best and email me at mike@rebrandsoftware.com if you&#39;re having any issues!</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/7941786047346095936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2013/01/going-live-with-new-website.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/7941786047346095936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/7941786047346095936'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2013/01/going-live-with-new-website.html' title='Going live with a new website!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-8441489704227473197</id><published>2012-11-28T07:13:00.000-08:00</published><updated>2012-11-28T07:13:04.104-08:00</updated><title type='text'>Amazon Checkout HMAC-SHA1 With Classic ASP</title><content type='html'>I&#39;ve been trying to implement Amazon Checkout for the last few days. &amp;nbsp;Using Classic ASP it&#39;s been a real nightmare: no sample code to work with.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve finally cracked it with the help of some &lt;a href=&quot;http://code.google.com/p/google-checkout-classicasp-sample-code/downloads/list&quot;&gt;Google Checkout cryptography libraries&lt;/a&gt;&amp;nbsp;, specifically the file &quot;GlobalAPIFunctions.asp&quot; located in the sample code linked to above.&lt;br /&gt;
&lt;br /&gt;
You will also need to get the &lt;a href=&quot;https://google-developers.appspot.com/checkout/samples/Google_Checkout_Sample_Code_ASP_InstallTxt&quot;&gt;GCrypt COM object installed&lt;/a&gt; on your server. &amp;nbsp;I had to ask my hosting company to do this, it might already be installed since Google Checkout is popular.&lt;br /&gt;
&lt;br /&gt;
Here is the code that worked. &amp;nbsp;Before you use it:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Download the GlobalAPIFunctions.asp file and install it on your server&lt;/li&gt;
&lt;li&gt;Edit the include file URL to point to GlobalAPIFunctions.asp&lt;/li&gt;
&lt;li&gt;Edit the AWSSecretKey, AWSAccessKeyID, and AWSMerchantID variables to match your Amazon Checkout account&lt;/li&gt;
&lt;li&gt;Make sure GCrypt COM Object is installed&lt;/li&gt;
&lt;li&gt;Edit the cart XML for your purposes&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--#include virtual=&quot;/api/GlobalAPIFunctions.asp&quot;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;This is a Base64 encode that doesn&#39;t put line breaks in like Google&#39;s does&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Dim Base64Chars&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Base64Chars =&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot; &amp;amp; _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;&quot;abcdefghijklmnopqrstuvwxyz&quot; &amp;amp; _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;&quot;0123456789&quot; &amp;amp; _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;&quot;+/&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&#39; Functions for encoding string to Base64&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Public Function base64_encode( byVal strIn )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Dim c1, c2, c3, w1, w2, w3, w4, n, strOut&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;For n = 1 To Len( strIn ) Step 3&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;c1 = Asc( Mid( strIn, n, 1 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;c2 = Asc( Mid( strIn, n + 1, 1 ) + Chr(0) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;c3 = Asc( Mid( strIn, n + 2, 1 ) + Chr(0) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;w1 = Int( c1 / 4 ) : w2 = ( c1 And 3 ) * 16 + Int( c2 / 16 )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;If Len( strIn ) &amp;gt;= n + 1 Then&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;w3 = ( c2 And 15 ) * 4 + Int( c3 / 64 )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;Else&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;w3 = -1&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;End If&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;If Len( strIn ) &amp;gt;= n + 2 Then&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;w4 = c3 And 63&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;Else&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;w4 = -1&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;End If&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;strOut = strOut + mimeencode( w1 ) + mimeencode( w2 ) + _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;     &lt;/span&gt; &amp;nbsp;mimeencode( w3 ) + mimeencode( w4 )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Next&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;base64_encode = strOut&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;End Function&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Private Function mimeencode( byVal intIn )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;If intIn &amp;gt;= 0 Then&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;mimeencode = Mid( Base64Chars, intIn + 1, 1 )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Else&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;mimeencode = &quot;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;End If&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;End Function&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&#39; Function to decode string from Base64&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Public Function base64_decode( byVal strIn )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Dim w1, w2, w3, w4, n, strOut&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;For n = 1 To Len( strIn ) Step 4&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;w1 = mimedecode( Mid( strIn, n, 1 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;w2 = mimedecode( Mid( strIn, n + 1, 1 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;w3 = mimedecode( Mid( strIn, n + 2, 1 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;w4 = mimedecode( Mid( strIn, n + 3, 1 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;If w2 &amp;gt;= 0 Then _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;strOut = strOut + _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;     &lt;/span&gt;Chr( ( ( w1 * 4 + Int( w2 / 16 ) ) And 255 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;If w3 &amp;gt;= 0 Then _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;strOut = strOut + _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;     &lt;/span&gt;Chr( ( ( w2 * 16 + Int( w3 / 4 ) ) And 255 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;If w4 &amp;gt;= 0 Then _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;strOut = strOut + _&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;     &lt;/span&gt;Chr( ( ( w3 * 64 + w4 ) And 255 ) )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Next&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;base64_decode = strOut&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;End Function&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;Private Function mimedecode( byVal strIn )&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;If Len( strIn ) = 0 Then&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;mimedecode = -1 : Exit Function&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;Else&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;mimedecode = InStr( Base64Chars, strIn ) - 1&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;End If&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;End Function&lt;br /&gt;
&lt;br /&gt;
&#39;AMAZON VARS&lt;br /&gt;
dim AWSSecretKey&lt;br /&gt;
dim AWSAccessKeyID&lt;br /&gt;
dim AWSMerchantID&lt;br /&gt;
dim AWSSignature&lt;br /&gt;
dim AWSCart&lt;br /&gt;
dim AWSCartB64&lt;br /&gt;
&lt;br /&gt;
AWSSecretKey = &quot;XXXXXXXXXXXXXXXXXXXXXXX&quot;&lt;br /&gt;
AWSAccessKeyID = &quot;123ABCDEFG&quot;&lt;br /&gt;
AWSMerchantID = &quot;123XZY&quot;&lt;br /&gt;
&lt;br /&gt;
&#39;AMAZON VARS END&lt;br /&gt;
&lt;br /&gt;
AWSCart = AWSCart &amp;amp; &quot;&amp;lt;?xml version=&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot;1.0&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot; encoding=&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot;UTF-8&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot;?&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Order xmlns=&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot;http://payments.amazon.com/checkout/2009-05-15/&quot; &amp;amp; &quot;&quot;&quot;&quot; &amp;amp; &quot;&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Cart&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Items&amp;gt;&quot;&lt;br /&gt;
&lt;br /&gt;
&#39;while &#39;Iterate through the items in the cart here&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;&#39;AMAZON ADD ITEM TO CART&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Item&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;SKU&amp;gt;&quot; &amp;amp; YourSKU &amp;amp; &quot;&amp;lt;/SKU&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;MerchantId&amp;gt;&quot; &amp;amp; AWSMerchantID &amp;amp; &quot;&amp;lt;/MerchantId&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Title&amp;gt;&quot; &amp;amp; YourItemName &amp;amp; &quot;&amp;lt;/Title&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Price&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Amount&amp;gt;&quot; &amp;amp; YourPrice &amp;amp; &quot;&amp;lt;/Amount&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;CurrencyCode&amp;gt;USD&amp;lt;/CurrencyCode&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;/Price&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;Quantity&amp;gt;&quot; &amp;amp; YourQuantity &amp;amp; &quot;&amp;lt;/Quantity&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;/Item&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;&#39;AMAZON ADD ITEM TO CART END&lt;br /&gt;
&#39;wend &#39;Finished iterating through items in the cart&lt;br /&gt;
&lt;br /&gt;
&#39;AMAZON Process Cart&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;/Items&amp;gt;&quot;&lt;br /&gt;
&amp;nbsp; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;/Cart&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCart = AWSCart &amp;amp; &quot;&amp;lt;/Order&amp;gt;&quot;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSSignature = cryptObj.generateSignature(AWSCart, AWSSecretKey)&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;AWSCartB64 = base64_encode(AWScart)&lt;br /&gt;
&lt;br /&gt;
set cryptObj = Nothing&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;!-- AMAZON CHECKOUT BUTTON --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&#39;text/javascript&#39; src=&#39;https://static-na.payments-amazon.com/cba/js/us/sandbox/PaymentWidgets.js&#39;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- For Switching to Production, comment out the lines above and uncomment the lines below --&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;script type=&#39;text/javascript&#39; src=&#39;https://static-na.payments-amazon.com/cba/js/us/PaymentWidgets.js&#39;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&quot;cbaButton1&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;img src=&quot;https://payments-sandbox.amazon.com/gp/cba/button?type=cart&amp;amp;cartOwnerId=&amp;lt;%= AWSMerchantID %&amp;gt;&amp;amp;color=orange&amp;amp;size=large&amp;amp;background=white&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;!-- For Switching to Production, comment out the line above and uncomment the line below --&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;!--&amp;lt;img src=&quot;https://payments.amazon.com/gp/cba/button?type=cart&amp;amp;cartOwnerId=&amp;lt;%= AWSMerchantID %&amp;gt;&amp;amp;color=orange&amp;amp;size=large&amp;amp;background=white&quot;/&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&#39;text/javascript&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp; new CBA.Widgets.StandardCheckoutWidget({&lt;br /&gt;
&amp;nbsp; &amp;nbsp; merchantId:&#39;&amp;lt;%= AWSMerchantID %&amp;gt;&#39;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; orderInput: {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; format: &quot;XML&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; value: &quot;type:merchant-signed-order/aws-accesskey/1;order:&amp;lt;%= AWSCartB64 %&amp;gt;;signature:&amp;lt;%= AWSSignature %&amp;gt;;aws-access-key-id:&amp;lt;%= AWSAccessKeyID %&amp;gt;&quot;},&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buttonSettings: { size: &#39;large&#39;,color:&#39;orange&#39;,background:&#39;white&#39;}&lt;br /&gt;
&amp;nbsp; }).render(&quot;cbaButton1&quot;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- END AMAZON CHECKOUT BUTTON --&amp;gt;&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/8441489704227473197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2012/11/amazon-checkout-hmac-sha1-with-classic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8441489704227473197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8441489704227473197'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2012/11/amazon-checkout-hmac-sha1-with-classic.html' title='Amazon Checkout HMAC-SHA1 With Classic ASP'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7128344070283616074.post-8568168230304373869</id><published>2012-11-20T08:41:00.002-08:00</published><updated>2013-01-25T10:55:14.017-08:00</updated><title type='text'>New Website</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
I&#39;ve been hard at work updating &lt;a href=&quot;http://rebrandsoftware.com/&quot;&gt;RebrandSoftware.com&lt;/a&gt; with a focus on apps.&lt;br /&gt;
&lt;br /&gt;
The new site features easier navigation, the ability to review apps, a much better support section, and news via the official blog. &amp;nbsp;You can also get a glimpse of me and my family in the new About section.&lt;br /&gt;
&lt;br /&gt;
Along with the new website comes a new app, Easy Calorie Counter which I will post about in more detail soon.&lt;br /&gt;
&lt;br /&gt;
It&#39;s also much easier to track your app purchases now. &amp;nbsp;We keep the download links and registration information available on the new My Apps page, and also give you the ability to rate apps you purchase or switch computers.&lt;br /&gt;
&lt;br /&gt;
Most of our apps are now on the Mac App Store, so Mac users can choose whether you want to get them there or through our website.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been working on the site for months now, but there are bound to be some issues when it goes live. &amp;nbsp;Hopefully we will be able to work through those quickly.</content><link rel='replies' type='application/atom+xml' href='http://rebrandsoft.blogspot.com/feeds/8568168230304373869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rebrandsoft.blogspot.com/2012/11/new-website.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8568168230304373869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7128344070283616074/posts/default/8568168230304373869'/><link rel='alternate' type='text/html' href='http://rebrandsoft.blogspot.com/2012/11/new-website.html' title='New Website'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/14910464531406274306</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>