Thursday, March 13, 2014

Inspecting Android: introducing inspectroid

Let's try something new: today's blogpost is written in Google Drive, because the editor there is SO much better than the one here. It's about a new app (more a proof-of-concept) I've been working on...

To the article:
http://goo.gl/qv0Yot

Happy reading!
Tom

Thursday, February 13, 2014

Learning by Reading

There's so many websites coming out of nowhere interested in "disrupting" education by offering it for free / cheap on the internet: Udacity, Khan Academy, Treehouse, Codeacademy, etc, etc. I like the idea of learning in the internet, and I love how polished most of these courses are (especially Treehouse and Codeacademy). But there's one thing that keeps me from actually completing such courses: all of them are video-only: you have to watch through video after video - each being just a few minutes - then they interrupt you listening to the teacher and give you a - sometimes completely unnecessary ("what did I just tell you in the last 10 seconds?") - quiz to complete. Then you're off to watch two or more short videos again until the next quiz approaches.

I'm sure this technique works great for some people. I can imagine this works perfectly for people who are just starting in a specific area (e.g. computer science), but it doesn't work for me. It annoys me, it makes me feel unproductive and I end up quitting the course.

What I like to do is read about a topic as much as possible until I feel confident enough to start applying the technique / programming language / framework / whatever learned in a little project. However, watching through several videos and completing little quizzes feels like a waste of time to me...

Another problem, which is why I actually decided to write this post is that I want to learn things while I'm commuting. Watching a video doesn't work because I have to put my phone away every 5 minutes or so (not to speak of a lack of mobile clients for aforementioned education providers).
One thing I actually tried is listening to the videos only. That kind of works, but it's super hard to stay focused while you're on the go and you probably only catch half of the content in the end.

So to sum all that up / TLDR; why is there nothing like Udacity that allows me to learn things by reading shorter articles?

Of course there's books. A friend of mine told me about those things lately. The problem I have with books is that they are longer than they should be by design. Authors try to put as much information into a book as possible and try to phrase everything as lengthy as possible.

Tuesday, January 28, 2014

BugSense vs. Crittercism

When I started working at indoo.rs we were already using BugSense, which seemed pretty nice to me and so I didn't really question its existence. A few months later we started rolling out our iOS SDK / app publicly and I didn't hesitate to continue the tradition on another platform, so we now used BugSense on both Android and iOS. A few crashes later we were facing a problem: we weren't able to desymbolicate (i.e. make the stacktrace readable again) manually. BugSense urged us to upgrade to a paid plan, which includes automatic desymbolication on their server. 20$ per month was a bit too much when the only benefit (for me) was automatic desymbolication. I was willing to desymbolicate the one or two crashes a week manually on my PC.

The colleague assigned with the task of desymbolicating the crashes reported by BugSense eventually came to the conclusion that this doesn't seem to be possible. In fact, the stacktraces reported where... confusing, to say the least (I don't have an example at hand unfortunately because they store the data only for 7 days). My colleague's solution was easy: switch to Crittercism.

I hesitated to do the switch, because I'd never heard of Crittercism before. Anyway, we went for it and I had the pleasure to integrate the Crittercism SDK in our Android SDK / app. A few minutes later (literally!) everything was ready for the first bug report. What was shown to me on the Crittercism dashboard was stunning: detailed information about all running threads when the crash occured, memory usage, battery level, disk space, sdcard space, all kinds of information about the device, network requests (!!) and the best feature a bug reporter could ever have: logcat (only on Android; optional opt-in feature). Seriously, this is just amazing. Having all this information at hand, fixing bugs might actually be a task to have fun with.




On BugSense we have... well, there is actually nothing BugSense offers Crittercism doesn't (information-wise). One thing I like about BugSense though: their pricing model is much more forgiving. For my app, OpenDocument Reader, I'm still able to use a Free-plan, although we have hundreds of thousands of active users. With Crittercism we'd be forced to upgrade to a paid plan already, because their plans are priced by "monthly active users". The free plan, for example, only allows 30k such monthly active users.


TLDR; Crittercism offers so much more insight into what was going on while the user experienced a crash, but if your app is "too popular" you will be forced to upgrade to a paid plan.

Saturday, January 4, 2014

Battlefield 4 - How To Rock The Scout Helicopter

I recently managed to go on some amazing kill streaks in the Scout Helicopter and caught myself thinking about what I’m actually doing right (or wrong). After another equally good round I found a few things that - I think - make me a fairly good Scout Helicopter pilot.

If you don't want to read throught he whole post, you could simply watch some gameplay of me, doing pretty much all of the tips below:

Lesson 1: Loadout

I prefer the 7.5mm minigun over the 25mm cannon because the former is basically a never ending stream of bullets, destroying most light vehicles in one streak. Even if it overheats, it'll be back up after a few seconds. However, it's probably easier to kill infantry even with bad aim, as the 25mm cannon has a higher blast radius.


If you want to survive longer than just a few minutes as a Scout Helicopter you have to unlock and equip the Heatseekers as soon as possible! There's no viable alternative to that in my opinion.


Belt feeder and IR flares form the rest of my loadout. The latter can be replaced with ECM jammer if you know what you're doing, but I wasn't quite able to figure out how to use ECM correctly so far...


More information on the exact damage of a specific weapon can be found at symthic.com:

Lesson 2: Control

You can improve your control over the vehicle by going from full speed into hovering and flying under bridges, between narrow buildings, etc. This is how I started back in Battlefield 2 with the Attack and Transport Helicopters.


Always make sure to be aware of surrounding street poles. They are OP!

Lesson 3: Act defensively, get aggressive temporarily

Always make sure you’re near cover from lock-on missiles (see Lesson 6). If you hit the enemy chopper once, it’s okay to score the final hit on him by following him into unsafe areas.

Lesson 4: choose the right map

Maps without Attack Helicopters are great, but it’s also important to have enough cover. For example, Golmud Railway has Attack Helicopters and it doesn’t have much cover, so it’s a bad map if you ask me.

Great maps

  • Floodzone
    • amazing cover.
  • Paracel Storm
    • make sure your team has E capped all the time and get into that chopper if possible (makes sure your team has two choppers, enemy only one!)
    • watch out for the AA at B

Good maps

  • Hainan Resort
  • Lancang Dam

Lesson 5: know your enemies

Remember: never fuck with heavy machinery. Unless your loadout allows it, of course. But if you don’t have the air-to-ground-missile equipped, you shouldn’t try to attack anything that smells like a tank. Attack Boats are too big for you too - don’t even try.


Your main targets are infantry, light vehicles (jeep, etc) and all other air vehicles. Attack Helicopters without a gunner are easier targets than other Scout Helicopters, for example. We’ll get to fighting jets in another lesson.

Lesson 6: break the looock!

Don’t waste flares unnecessarily if you can simply get behind cover instead. Tall buildings are great for that, but sometimes even bigger rocks can save you from a hit (depending on where the enemy shot from).


Remember: even if the missile is already on its way (constant beeping sound), you still have time to get into cover. Again, depending on where the enemy shot from. A shot from 100m away is a near-instant hit.


As soon as you’re out of flares you should get back behind cover to recharge flares.

Lesson 7: Killing people

Two tips for using your weapons properly:
  1. against other air vehicles: lock-on, shoot only one missile, wait for the enemy to flare, lock-on again and then shoot your second missile. After getting one missile into him, you can attack him aggressively by following him and making the final hits with your minigun.
  2. against infantry: don’t shoot your minigun until it’s overheated, but only shoot small bursts when your crosshair is actually on a target

Lesson 8: Jets.

Defense

You know that you’re being attacked by a jet if you take damage from a fast-firing minigun out of nowhere. In that case pull down your chopper as fast as possible - jets are not as agile as a Scout Helicopter.


Another important countermeasure against jets is early flares. Most jet pilots don’t fire their missile until they’re only a few meters away from you. If you didn’t break the lock already, the missile will hit you immediately without a chance to flare. However, don’t do the same for other lock-on missiles though! This will result in death.

Offense

Don’t hesitate to lock-on a jet if you know you’re safe from other threats.

Lesson 9: have a Mechanic with you

This isn’t really something you can do, but if you want to go on a flawless kill streak, there’s no other chance than getting a mechanic into your helicopter. Sometimes random people stick with you in the helicopter without asking them, because they recognize that you’re a good pilot. Better than that would be a friend of course. Although it’s a stupid job, it gets the mechanic tons of points… He can also shoot out of the helicopter and get some kills on his own. Even better, he can help you kill choppers in a breeze if he takes a Stinger with him. His missile makes the chopper flare, you can get your two missiles into him.


The most important thing you get from a mechanic is time. Instead of just one hit by a lock-on missile and you’re pretty much dead, you can survive up to three of them if you’re lucky. This gives you enough time to get into cover and recharge your flares.

Lesson 10: Be one step ahead

There's so many threats around you on the battlefield and you should always watch out for... everything. Especially RPGs and tank shells could cause your death. So never fly too close to the ground and fly unpredictable. Slow turns and straight movement towards your target make an easy kill for RPGs and tanks.


That's about it. Get on the Test Range and give the Scout Helicopter a go! If you want to know more about the Scout Helicopter, I'd recommend you to check out the following videos:

Saturday, October 26, 2013

Professional App Translation / Localization

A few weeks ago I decided that our app is now popular enough to justify a little investment: get some (wannabe?) professionals to translate the app into the languages it's most used for. In our case the most popular languages were the following (vs. most popular across Google Play):

I think the big differences between our app and Google Play are caused by the target group of this app: only countries were the use of ODF (OpenOffice / LibreOffice) is widespread are likely to install our app in the first place. Captain Obvious strikes again.

Finding a serious looking translation service was actually harder than I thought - especially when the Google Play Developer Console puts a banner right in front of you: "Need help localizing your application?". Nope, that service seems to be dead now. A few weeks after signing up I didn't even get a confirmation mail or anything. Thanks for your help Google! So I went searching for an active translation service and found: tethras.com.

One thing that's really important before using a translation service is finalizing your strings.xml as much as possible. If you are about to rewrite and redesign your app I would recommend to hold off until the app is in a "stable" state. Also make sure to think about what could happen next with your app (feature-wise). If there's a new feature or the removal of an old feature around the corner, don't ask the translation service to translate the related strings.

After cleaning up my strings.xml I requested translation for Spanish, French, Russian, Italian, Polish and Portuguese. I've also requested to translate not only strings.xml, but our Google Play description and promo text too. All in all it cost me far under 400$ (about 70$ per language), which is completely fine for me considering that this is covered by our monthly earnings. It's an investment, which hopefully further spreads our app in the affected countries in return.

I speak German natively, so I went for the German translation on my own. In retrospective I have to say though, that the German translation would have been worth 70$ easily for me. Translating an app is such a pain in the ass!

One thing I completely forgot about though is telling the translators about the (stupid) character limitations in Google Play. I had to cut a few words out of all the promo text-translations myself (based on good-guess - I hope they're still grammatically correct).

Unfortunately using professional translation services seems to be completely uncompatible with something like crowdin.net, because you don't seem to be able to upload finished translations and ask users to improve on top of that. What I ended up doing was completely removing the languages I have translated from crowdin.net now...

If you're asking yourself why I'm paying for translation if I'm already using crowdsourced translation:
1. crowdin.net isn't free for everyone, so the monthly fee would quickly sum up to the one-time fee paid for professional translation
2. the internet is bad. I had users translating the app name (!) to "fuck you" or "test". Checking each and every submission is way too much work for me.

All in all I can say that I'm really happy with Tethras. I won't hesitate to use their service again for future projects.