Pages

Showing posts with label you. Show all posts
Showing posts with label you. Show all posts

Saturday, April 23, 2016

Do you want to write on Android Revolution HD blog

Its time to expand. This place has a potential and I want it to become even more popular. If you are interested in making this place even better and more crowded, please keep reading!

So, what I am looking for?

Strong written English
This is essential. Its fine if English isnt your first language, its not if I have to rewrite all your posts. Your grammar and variety of vocabulary must be at an advanced level.

Good understanding of mobile tech and an attention to detail
Know the areas you want to write about, know the sources and strive for accuracy. Your articles must have some particular level of quality, otherwise it cant be published.

Have an opinion
Re-posting news from other tech-sites is not welcomed. You need to be able to understand what things mean, put it in context and share your thoughts with our readers. Im more interested in creating the opinion rather then passing some news along.

Regular contribution
This isnt a job offer, but this might change in the future. For now I want to create a friendly place where dedicated people can share their thoughts (and there is a lot to share nowadays). I ask that all applicants are able to post on average 1-2 times a week. News posts dont have to be thousands of words, in most cases a couple of hundred will suffice.

Technologies
Im mostly interested in Android / Windows Phone articles, however the variety of potential topics is: "Linux Kernels" | "Linux General" | "Android General" | "Android Devices" | "Windows Devices" | "Other OS Devices" | "Tablets" | "Gadgets" | "Manufacturers News" | "PC News" | "your idea".


There is no age limitation. Everyone can have hobby and be addicted to gadgets :)

How to apply
Please contact us via our Twitter profile: Twitter
Read More..

Friday, April 8, 2016

The Meenova Micro SD Card Reader for Android

A few months back I decided to pledge $12 US to a Kickstarter Project for a miniaturised USB card reader for Android smartphones. The idea looked promising, and I had a spare $12, so I took the gamble, and this week it paid off. Through the post I received the dividend on my investment. Ill follow up this mini-review with some details on performance once I can get hold of a class 10 card, but for now here are some first impressions and opinions.

The concept of USB OTG (on-the-go) storage is a good one, especially for the increasing number of us of us whose favourite phones dont have an SD card slot. However, one of the big issues with the regular arrangement for OTG is the need to carry a male-female adapter cable and a card reader or memory stick around in addition to the telephone. Doing away with this inconvenient clutter was really what attracted me to the idea of the Meenova reader.

I knew that a tiny, almost weightless device, which clips to my keyring, but which can take exchangeable micro SD cards at least up to 64Gb, would be worth $12 to me just for the convenience. The Meenova reader ticks all those boxes at around 2cm square by 8mm thick and weighing in at only 3 grammes.

Unboxing the Meenova


The reader arrived by mail, safe in a protective envelope, direct from the manufacturing facility. US customers receive theirs via USPS, the rest of the world via Hong Kong Post. Inside the envelope the reader was neatly packaged, and the pack included the reader, a USB adapter for lap/desktop connectivity, and a keyring clip.
 


All the items were well made and well finished. The only exception was the tiny split ring for the keyring adapter, which was quite flimsy, but that was such an insignificant part of the package that I just replaced it with a better one for five cents. The cap clips onto the reader with a satisfying and tight click, and the reader is securely held. 

That led me to thinking that instead of hanging the reader from my keyring, I should hang the cap from the ring and clip the reader in/out of it as I used it. I punched a small hole in the cap, threaded the tiny keyring through it, and I am very happy with the modification. 


N.B. - Later Edit 
Do NOT hang the reader on your keyring as I described above. My reader came unclipped twice today and I almost lost it !! Use the tag provided on the body of the reader and pass the spring clip through that. Only use the ring to hang the cap from the clip when the reader is in use.

Getting To Grips with the Meenova


Having got it all ready to use, my next step was to rummage in the spares bin. Luckily I found an old 8Gb class 4 SD card to use for the first test. I slotted it into the reader, plugged the reader into the USB adapter and plugged all that into my trusty iMac.

Partitioning and formatting the card was quick, easy and there were no issues.  A nice touch is that USB connector on the reader is mounted in a raised, transparent, plastic "plinth" and from inside the casing a blue LED flashes to indicate any activity.


The Meenova is actually much smaller than it appears here
My first test was to load up my entire photo library from iPhoto to see what would happen. 2 Gb was a heavy enough load, and during the loading process I also deleted around 400 of the photos from the card during the load to see if that caused any issues. The process took a while, but there was no noticeable slowdown during the deletions and no data dropouts or corruption.

Following the successful upload I unmounted the device and plugged it into the USB port of my HTC One. The One immediately reported "Preparing USB storage, Please Wait" and then "USB storage is ready" which popped up almost too quickly for me to take the screen shots.




ES File Explorer, showed me that the USB was mounted automatically by the OS at the mount point /mnt/usb. On opening, Explorer already had the USB folder open and I was able to examine the contents just as I would any other part of the file system.

The next step in this little test was to open Gallery and look for the photos I uploaded. They had already been found by the Gallery app and the app was in the process of making them available. Once the photos folder had been opened in Gallery, the photos themselves did take some time to appear, but until I can get hold of a faster card I can only speculate on whether this was caused by the cheap, slow card, the reader, or the OTG/USP processing in the phone OS.

Gotcha !!!


After playing with it for a while I was ready to hang the reader back on my keyring and drop my One into its slip case ... That was the only point at which I had an issue with the setup. In my haste, I just pulled the reader out of the USB socket and immediately received the notification "USB Storage unexpectedly removed" ...



Oops ... My Bad ... I had forgotten to unmount before removal!


I was only reading from the card so on this occasion it wasnt a painful experience, but no excuses ... some cards can be very sensitive to superblock corruption so its never a sensible thing to just pull them out without first unmounting, and definitely not advisable following a write to the card.

Just to make sure I knew what to do in future, I reinserted the reader and went in search of the unmount action. I have to admit, I was naively expecting a bar in the notifications or settings pull-down with some obvious wording such as "USB/OTG storage - Click to unmount" ...

No such luck ... I eventually found the action buried in the basement !! ... Its actually in Settings->Storage->USB Storage->Unmount USB Storage.



For the sake of user convenience, I think there is a good case for smartphone manufacturers to do some rethinking about where that action should be placed. In my opinion, it belongs in a much more prominent position.

Third-Party Apps and the Meenova


Because of that one thing, I went in search of an OTG/USB third-party app to see if I could make the unmount a little more convenient. I tried two (see *** footnote) and both worked well. However, both of them were designed to manage the mount and unmount themselves. That is, they are set up to create a mount point and mount to/unmount from that point. When using these apps on the HTC One, the OS native mount is maintained in addition to the ones set up by the tool, so a final unmount will still need to be done from within the settings page.

If you have a phone with an OS which automatically mounts the OTG/USB storage, then dont bother with third-party apps. Just be sure you know how to unmount the device. If, on the other hand your OS doesnt automount the storage, but you have an OTG-aware kernel, then these third party apps can make your use of OTG devices easier.

OTG Compatibility


There is a list of known compatible devices on the Meenova web site, but in this rapidly changing world, the list may not be complete. In hard terms, the device is only a micro card reader, and the chipset is the same one that can be found in many regular readers, so the rule of thumb is that if your phone works with a cable and memory stick, either with native or third-party software, then the chance is good that it will work with a Meenova Reader as well.

On the general subject of OTG compatibility my advice is for you to research your phone carefully before buying anything. Not all versions of Android support OTG and manufacturer support can also very variable, even between model ranges from the same company. Dont just assume that because your phone is fairly new and your Android is 4.x then it will have OTG. Check it out.

Conclusion (for now)


Overall I am already satisfied with my $12 investment, and at this point I feel that I can recommend this device to anyone looking for a compact, handy, OTG/USB storage solution.

In Part Two (coming soon) I will take a closer look at the Meenova readers performance with music and video files, and I will try to run a set of timing comparisons using Class 4 and class 10 Micro SD cards.

Have any questions or comments? Feel free to share! Also, if you like this article, please use media sharing buttons (Twitter, G+, Facebook) below this post!



*** The OTG Storage managers I tested were:

USB Storage Manager by Goprasoft
USB OTG Helper (Root) by Ray of Light

As for Meenova the company, the Kickstart project seems to have been a great success. Plenty of cash was raised to get the project onto a stable footing, and I have yet to read a negative comment about either the Meenova reader or the guys who set it all up. The initial seed stock has now been dispatched to all the original backers, and the company are now taking pre-orders for the next batch of devices.
Read More..

Tuesday, March 11, 2014

10 things you probably didnt know about App Engine

What could be better than nine nifty tips and tricks about App Engine? Why, ten of course. As weve been participating in the discussion groups, weve noticed that some features of App Engine often go unnoticed so weve come up with just under eleven fun facts which might just change the way that you develop your app. Without further ado, bring on the first tip:

1. App Versions are strings, not numbers

Although most of the examples show the version field in app.yaml and appengine-web.xml as a number, thats just a matter of convention. App versions can be any string thats allowed in a URL. For example, you could call your versions "live" and "dev", and they would be accessible at "live.latest.yourapp.appspot.com" and "dev.latest.yourapp.appspot.com".

2. You can have multiple versions of your app running simultaneously

As we alluded to in point 1, App Engine permits you to deploy multiple versions of your app and have them running side-by-side. All the versions share the samedatastore and memcache, but they run in separate instances and have different URLs. Your live version always serves off yourapp.appspot.com as well as any domains you have mapped, but all your apps versions are accessible at version.latest.yourapp.appspot.com. Multiple versions are particularly useful for testing a new release in a production environment, on real data, before making it available to all your users.

Something thats less known is that the different app versions dont even have to have the same runtime! Its perfectly fine to have one version of an app using the Java runtime and another version of the same app using the Python runtime.

3. The Java runtime supports any language that compiles to Java bytecode

Its called the Java runtime, but in fact theres nothing stopping you from writing your App Engine app in any other language that compiles to JVM bytecode. In fact, there are already people writing App Engine apps in JRuby, Groovy, Scala, Rhino (a JavaScript interpreter), Quercus (a PHP interpreter/compiler), and even Jython! Our community has shared notes on what theyve found to work and not work on the following wiki page.

4. The IN and != operators generate multiple datastore queries under the hood

The IN and != operators in the Python runtime are actually implemented in the SDK and translate to multiple queries under the hood.

For example, the query "SELECT * FROM People WHERE name IN (Bob, Jane)" gets translated into two queries, equivalent to running "SELECT * FROM People WHERE name = Bob" and "SELECT * FROM People WHERE name = Jane" and merging the results. Combining multiple disjunctions multiplies the number of queries needed, so the query "SELECT * FROM People WHERE name IN (Bob, Jane) AND age != 25" generates a total of four queries, for each of the possible conditions (age less than or greater than 25, and name is Bob or Jane), then merges them together into a single result set.

The upshot of this is that you should avoid using excessively large disjunctions. If youre using an inequality query, for example, and you expect only a small number of records to exactly match the condition (e.g. in the above example, you know very few people will have an age of exactly 25), it may be more efficient to execute the query without the inequality filter and exclude any returned records that dont match it yourself.

5. You can batch put, get and delete operations for efficiency

Every time you make a datastore request, such as a query or a get() operation, your app has to send the request off to the datastore, which processes the request and sends back a response. This request-response cycle takes time, and if youre doing a lot of operations one after the other, this can add up to a substantial delay in how long your users have to wait to see a result.

Fortunately, theres an easy way to reduce the number of round trips: batch operations. The db.put(), db.get(), and db.delete() functions all accept lists in addition to their more usual singular invocation. When passed a list, they perform the operation on all the items in the list in a singledatastore round trip and they are executed in parallel, saving you a lot of time. For example, take a look at this common pattern:

for entity in MyModel.all().filter("color =",
old_favorite).fetch(100):
entity.color = new_favorite
entity.put()

Doing the update this way requires one datastore round trip for the query, plus one additional round trip for each updated entity - for a total of up to 101 round trips! In comparison, take a look at this example:

updated = []
for entity in MyModel.all().filter("color =",
old_favorite).fetch(100):
entity.color = new_favorite
updated.append(entity)
db.put(updated)

By adding two lines, weve reduced the number of round trips required from 101 to just 2!

6. Datastore performance doesnt depend on how many entities you have

Many people ask about how the datastore will perform once theyve inserted 100,000, or a million, or ten million entities. One of the datastores major strengths is that its performance is totally independent of the number of entities your app has. So much so, in fact, that every entity for every App Engine app is stored in a singleBigTable table! Further, when it comes to queries, all the queries that you can execute natively (with the notable exception of those involving IN and != operators - see above) have equivalent execution cost: The cost of running a query is proportional to the number of results returned by that query.

7. The time it takes to build an index isnt entirely dependent on its size

When adding a new index to your app on App Engine, it sometimes takes a significant amount of time to build. People often inquire about this, citing the amount of data they have compared to the time taken. However, requests to build new indexes are actually added to a queue of indexes that need to be built, and processed by a centralized system that builds indexes for all App Engine apps. At peak times, there may be other index building jobs ahead of yours in the queue, delaying when we can start building your index.

8. The value for Stored Data is updated once a day

Once a day, we run a task to recalculate the Stored Data figure for your app based on your actual datastore usage at that time. In the intervening period, we update the figure with an estimate of your usage so we can give you immediate feedback on changes in your usage. This explains why many people have observed that after deleting a large number of entities, theirdatastore usage remains at previous levels for a while. For billing purposes, only the authoritative number is used, naturally.

9. The order that handlers in app.yaml, web.xml, and appengine-web.xml are specified in matters

One of the more common and subtle mistakes people make when configuring their app is to forget that handlers in the application configuration files are processed in order, from top to bottom. For example, when installing remote_api, many people do the following:

handlers:
- url: /.*
script: request.py

- url: /remote_api
script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
login: admin

The above looks fine at first glance, but because handlers are processed in order, the handler for request.py is encountered first, and all requests - even those for remote_api - get handled by request.py. Since request.py doesnt know about remote_api, it returns a 404 Not Found error. The solution is simple: Make sure that the catchall handler comes after all other handlers.

The same is true for the Java runtime, with the additional constraint that all the static file handlers in appengine-web.xml are processed before any of the dynamic handlers in web.xml.

10. You dont need to construct GQL strings by hand

One anti-pattern that comes up a lot looks similar to this:

q = db.GqlQuery("SELECT * FROM People "
"WHERE first_name = " + first_name
+ " AND last_name = " + last_name + "")

As well as opening up your code to injection vulnerabilities, this practice introduces escaping issues (what if a user has an apostrophe in their name?) and potentially, encoding issues. Fortunately,GqlQuery has built in support for parameter substitution, a common technique for avoiding the need to substitute in strings in the first place. Using parameter substitution, the above query can be rephrased like this:

q = db.GqlQuery("SELECT * FROM People "
"WHERE first_name = :1 "
"AND last_name = :2", first_name, last_name)

GqlQuery also supports using named instead of numbered parameters, and passing a dictionary as an argument:

q = db.GqlQuery("SELECT * FROM People "
"WHERE first_name = :first_name "
"AND last_name = :last_name",
first_name=first_name, last_name=last_name)

Aside from cleaning up your code, this also allows for some neat optimizations. If youre going to execute the same query multiple times with different values, you can useGqlQuery .bind() to rebind the values of the parameters for each query. This is faster than constructing a new query each time, because the query only has to be parsed once:

q = db.GqlQuery("SELECT * FROM People "
"WHERE first_name = :first_name "
"AND last_name = :last_name")
for first, last in people:
q.bind(first, last)
person = q.get()
print person


Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries.

Read More..