Friday, September 21, 2012

The Easter Egg in Android tools

Try:

aapt dump badger [you app name].apk

and have a nice badger :)

Thursday, September 20, 2012

npm xmas

I haven't looked at npm code before, and today I did.
So if you run: npm xmas
you will be in for a surprise ;)

Thursday, September 06, 2012

A feature of Android "Jelly Bean": android:isolatedProcess

Just stumbled upon one interesting feature of the Jelly Bean.
The service tag got a new attribute android:isolatedProcess. 

"If set to true, this service will run under a special process that is isolated from the rest of the system and has no permissions of its own."

The application of this feature is quite limited, but interesting from a security perspective.

Basically, if you need to run some script (javascript, lua, etc) that you received from untrusted source or maybe some third-party library that might have some security issues, it allows you to isolate that part of you application in it's own "sandbox" process that doesn't inherit all the permissions of you primary application.

Friday, June 08, 2012

JSLint Vim plugin

I got involved in helping with the web project recently with lots of javascript (client and server-side frameworks etc) pretty much everywhere.
Yeah it's kind of amazing what javascript has become, amazing and a bit terrifying, cause the things can get real messy real fast without proper coding discipline on the team.

Anyways, I started to use jslint a lot in order to keep things cleaner and neater.
Here is an extremely useful Vim plugin that I use a lot recently:
https://github.com/hallettj/jslint.vim 
The inline highlighting with quickfix window support are awesome features and you can use ~/.jslintrc file to define your globals "directives" for jslint to avoid polluting the source code with it.

Enjoy!

Thursday, May 10, 2012

Mac OS X tar util adds files with "._"


So, if you got surprised after uncomressing the tar.gz file that was created on Mac OS X and finding a bunch of extra files starting with "._" for every file and directory, here is a solution for you.
To avoid these extra files to be added into tar.gz on Mac OS X, define the environment variable:
export COPYFILE_DISABLE=true

Wednesday, May 09, 2012

Android NDK8 now with MIPS arch support

With the support for MIPS architecture in the latest release of NDK8, the life of NDK developers became a bit more difficult again. We have 4 architectures to cross-compile a bunch of native libraries for: armebi, armebi-v7a, x86 and mips. I guess, this is just one more push to move towards Java code for better portability and smaller .APKs, etc.

By the way the issue with libc on x86 builds that I was posting about since NDK6 still exists.
One the native libraries that I use fails to build with the following errors:
undefined reference to `siglongjmp'
undefined reference to `sigsetjmp'
See here: http://aleksmaus.blogspot.com/2011/11/more-fun-with-android-ndk7.html

The x86 build fails with both Mac OS X and Linux NDK8.

If anybody on Android NDK team reads this, please, please, please fix it.

Monday, May 07, 2012

Mac OSX file handles limits

 I stumbled on this issue many times trying to run the services that open too many handles on Mac OS X (Lion). Even when you see the ulimit tool returning "unlimited" value, it's not actually unlimited.

Here are the couple of commands that I have to run to actually increase the number of allowed opened handles:
$ sudo launchctl limit maxfiles 500000 500000 
$ ulimit -n 500000


Wednesday, May 02, 2012

Bulding AOSP on Ubuntu 12.04

Update (July, 11, 2012):
Just built the Android 4.1.1 (Jelly Bean) branch from AOSP on Ubuntu 12 with no problems whatsoever. This makes this post no longer relevant.
Many thanks for that to Android development team.

//************************************************************************


I just started to play with Ubuntu 12.04 and stumbled on few issues while building Android source tree (AOSP master branch).

Here are few things that might be useful to know in order get AOSP building:

1. First, follow the instructions here http://source.android.com/source/initializing.html to install all the dependencies and set everything up.

2. Then install Sun JDK6, here is the link to the latest download at the moment:
http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html

After downloading it, execute these commands:

$ chmod u+x jdk-6u32-linux-x64.bin
$ ./jdk-6u32-linux-x64.bin
$ sudo mv jdk1.6.0_32 /usr/lib/jvm/
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_32/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_32/bin/javac" 1

then switch to this version of java with:
$ sudo update-alternatives --config java
and
$ sudo update-alternatives --config javac

You can probably get away with OpenJDK6 (disable the java version check in the build/core/main.mk). I remember I had a problem compiling one of the CTS tests and fixing that required some java code modifications.

3. The failure while building qtools build can be fixed with changing
common_cflags := -O0 -g 
to
common_cflags := -O0 -g -Wwrite-strings -fpermissive
in the sdks/emulator/qtools/Android.mk

4. The failure with OpenGL libraries linking can be fixed with 
sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so

5. The failure while building obbtool, can be fixed in the  
build/core/combo/HOST_linux-x86.mk file by changing the following line
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
to
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

6. The failure with:
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] Error 1
can be fixed with adding the 
#include <stddef.h>
at the top of the external/mesa3d/src/glsl/linker.cpp file.

7. The failure external/oprofile/libpp/format_output.h:94:22: error: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
can be fixed by changing the external/oprofile/libpp/format_output.h file
mutable counts_t & counts;
to 
counts_t & counts;

8. The failure external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11: error: ‘ptrdiff_t’ does not name a type
can be fixed by adding 
#include <cstddef>
into the external/gtest/src/../include/gtest/internal/gtest-param-util.h file. 

9. The failure /external/llvm/lib/Support/Mutex.cpp:143: undefined reference to `pthread_mutex_trylock'
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/test-librsloader_intermediates/test-librsloader] Error 1
can be fixed by adding 
LOCAL_LDLIBS := -lpthread -ldl 
into external/llvm/llvm-host-build.mk file.

10. For the failure frameworks/compile/slang/slang_rs_export_foreach.cpp:249:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
I just commented out that line since the ParamName is not used anyways.

This might not be the best solution, but it builds and leaves me some time to improve it if I need it.

Hope this saves you a bit of time.

Friday, April 20, 2012

Javascript from the command line 2

I already wrote about this here: Javascript from command-line on Mac OS X.
Here is another tip.
The console.log() is not available for jsc, and you have to use the debug() API.
In order to keep using the console.log() calls just define:
var console = {log:function(msg){debug(msg);}}

Enjoy,
Alex

Wednesday, April 11, 2012

JSON.NET for ASP.NET

I had to add a JSON service to a very old ASP.NET 2.0 website I worked on quite awhile back.
Upgrading to the latest ASP.NET 4.0 was not an option. So the first thing that comes in mind is to quickly implement Http handler. Here is a pretty nice JSON serialization library that I stumbled upon and that worked for me quite well: http://json.codeplex.com

Friday, March 30, 2012

Google IO 2012: here I come!

The Google IO conference registration becomes tougher and tougher each year.
As I mentioned before Google decided to do one registration for everybody this year, no preregistration.
I haven't seen the official report, but the "sold out" message on the web site appeared in under 30 minutes since the registration opened. 
Many of my friends were trying to get in with no luck. 
After about 10 mins of unsuccessful attempts to registrer I got to the screen with registration confirmation. Yep, I got lucky this time. 
I'M GOING TO GOOGLE IO, YEAAHHH !!!! :)
I'm very excited and looking forward to it :)

javascript web development

Just wanted to share a few useful libraries if you plan to do a pure javascript web development:

* jQuery http://jquery.com/ - who doesn't know it, right ?

* Backbone.js http://documentcloud.github.com/backbone/ - a useful and light MVC framework, that effortlessly works with JSON server-side APIs

* RequireJS http://requirejs.org/ - the framework that provides bunch of useful functionality, such as automatic namespacing for the modules, javascript minification, pluggins support etc. One of the useful plug-ins is I18N that provides a good support for localization.

* Dust  http://akdubya.github.com/dustjs/ - fast and light templating engine.

Enjoy!

MongoDB: copy collections


Recently I got involved in the node.js type of project, with MongoDB back-end. Last time I played with MongoDB was more than a year ago, so I'm pretty much refreshing my memory at this point.

Here is,  for example how to copy the data from one collection to another:

db.srcCollection.find().forEach( function(c){db.destCollection.insert(c)} )


Thursday, March 22, 2012

Android: Updated SDK Tools and ADT revision 17

Google released the new update for Android SDK tools and ADT 17. Lots of yummy goodies inside.

I'm particularly excited about the new x86 emulator image running in virtualization mode (means faster emulator), that what I actually needed to test some of my native libs on x86 architecture.

For more details go to this link:
http://android-developers.blogspot.com/2012/03/updated-sdk-tools-and-adt-revision-17.html

At the end just wanted to add: I'm very impressed how well Google executes on it's Android initiative.

Wednesday, March 21, 2012

MacPorts: p5.12-term-readkey compilation failed

Just got the p5.12-term-readkey compilation failed error when I tried to upgrade outdated ports.

Here is the link to the ticket for more details:
https://trac.macports.org/ticket/33675

The solution:

$ sudo port -n upgrade --force perl5.12
$ sudo port clean p5.12-term-readkey

After that just continue upgrading the ports.

Tuesday, March 20, 2012

Objective-C "abstract" base class

Once upon a time I needed to port some Java code from Android to Objective-C iOS.

Just wanted to share one useful tip on how to express the abstract class in Objective-C.

Basically in the "abstract" base class the "abstract" methods should be implemented like this, for example:


- (int) myAbstractMethod {
    [self doesNotRecognizeSelector:_cmd];    
    return 0;
}

Then the method should be implemented as needed in the concrete child class.

Monday, March 19, 2012

"How Much Would You Pay for the Universe?"

I just have to repost this inspiring video, because it feels exactly as Neil deGrasse Tyson said:
"Nobody’s dreaming about tomorrow anymore".

Thursday, March 15, 2012

Google IO 2012

By the way, the Google IO 2012 registration dates were announced a couple of days ago:
https://developers.google.com/events/io/register

I'm really looking forward to it. Hopefully I'll get the ticket (if I'm lucky enough).

I went to Google IO for two years before in 2010 and 2011.
The last year registration was crazy, thankfully I got my ticket with preregistration invite.

Google did many things right for the registration process this year: there will be no preregistration, everybody will get the change to try to register, they rised the ticket price and they do not allow the tickets transfers (which should hopefully reduce number of tickets being resold on eBay, etc.)

To me the Google IO experience is more than just attending the sessions,  after all you can watch the sessions in the comfort of your home for free. The free hardware is a plus, but it doesn't really matter, I would attend the conference without this as well.

To me Google IO experience is a good boost of creative energy that gets me charged at least for few months after the conference. I could say that it kind of brings the best of software engineer in me (true story, not a cliché).

See you at Google IO!

P.S. keeping my fingers crossed

Thursday, March 08, 2012

iOS device: EXC_BAD_ACCESS error with EXC_ARM_DA_ALIGN code

I spent a day hunting down one nasty bug in my code.
This code worked fine on Android ARM7 build, iPhone simulator (i386) build,
but started to crash once I run it on iPhone 4 device.

The code was implementing simple wrappers for the mutex, the event and the thread API.

For example the mutex handle looked something like this:

typedef struct _MUTEX_HANDLE {
    .........
    pthread_mutex_t mutex;
} MUTEX_HANDLE;

Then the event and thread structures where built upon this.

The problem only surfaced on iOS device, with error EXC_BAD_ACCESS and the code EXC_ARM_DA_ALIGN. I checked and double checked all the structures in memory their alignment etc., and still could not see anything wrong.  I searched online and got distracted with many articles reporting the similar type of problem and suggesting memcpy as a solution in order to "fix" this alignment issue.

The definitions of the pthread handles though was kind of curious:
struct _opaque_pthread_mutex_t { long __sig; char __opaque[__PTHREAD_MUTEX_SIZE__]; };
in addition to the signal handle there was an array.

Eventually I narrowed this down to the simple assignment by value where I just initialized 
pthread_mutex_t variable and assigned it by value to my structure member.

static int createMutex(MUTEX_HANDLE **pHandle) {
    pthread_mutex_t mtx;
    int err = initMutex(&mtx);
    if (!err) { 
        MUTEX_HANDLE *ph = malloc(sizeof(MUTEX_HANDLE));
        if (ph) {
           ph->mutex = mtx; //the problem is here, never do this!!! 

The pthread_mutex_t type is very simple structure on Android with one int member, so I kind of assumed that assigning pthread_mutex_t by value would not incur that much overhead or side effects and just did what I did above. So, this was not the best decision on my part.

The fix was to eliminate the temporary pthread_mutex_t variable on a stack and use the mutex member of the MUTEX_HANDLE structure directly: 

static int createMutex(MUTEX_HANDLE **pHandle) {
    MUTEX_HANDLE *ph = malloc(sizeof(MUTEX_HANDLE));
    if (ph) {
        int err = initMutex(&ph->mutex);

So, the EXC_ARM_DA_ALIGN error was just a big distraction that had me wasting quite a bit of time looking in the wrong direction. 


iOS 5.1 and Xcode 4.3.1 upgrade

I got the iOS 5.1 upgrade for my iPhone yesterday.
Then the Xcode needed to be upgraded to 4.3.1 in order to work with my phone with iOS 5.1.
Then cpp compiler link got screwed up again.
In the previous post I mentioned that you can fix with creating the new link:
sudo ln -s llvm-cpp-4.2 cpp


The old directory /Developer is gone now and the new one where you have to create the link is:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Enjoy!