Tuesday, November 29, 2016

Genesjs: a neat implementation of genealogy tree in pure HTML5/CSS3/JavaScript


As a new spare-time project I have just released small web-application. This is actually a single page intended for offline use. It provides a viewer functionality for interactive genealogy trees, and uses JavaScript or JSON file as a source of the actual data about your family. The number of supported types of graphs is minimal, but sufficient for the start. The diversity of personal fields and relations is not large as well. Yet on the other hand, the simplicity is a plus.

The idea behind the project was to provide a tool for building genealogy trees without a need to install a heavy application with long dependencies or register somewhere. Genesjs is a solely in-browser and standalone solution and solves all the problems.

If you think there is a typo in the name, then it's not. An application concerning your genesis and written in js should surely have name Genesjs ;-).

Here is some screeshots.







You can download version 1.0 here.

Bugs, suggestions? Feel free to contact me.

Thursday, September 22, 2016

Droidcon Moscow 2016


Today, on September 22-nd 2016, the 3-rd Droidcon conference was help in Moscow. This is a great opportunity for russian developers to get acquainted with latest Android trends and technologies, especially taking into account that Google I/O has its residence at other side of the Earth. ;-)

Of course Android 7.0 was presented as a new target for development, as well as many other topics, including usability, testing and even piracy on mobile market. Two sections were dedicated to VR and IoT. Although these terms are well established, and some products such as Google Cadrboard are very popular, they are seemingly still waiting for greater adoption and maturity. At least, I'm not impressed neither by next generation VR headset Daydream, nor by smartness and value of connected "things". The former looks too large for me and lacks natural human-computer interface (it still utilizes old plain extended manual control, obviously called "controller"), the latters are no more than toys at the moment (imho). I must admit that I did not see or test Daydream in real life, so my impressions are based solely on discrepancies between what I wanted and what I can get according to available information. Anyway, it's good to know about the work in progress, and I'm eagerly anticipating next releases.

Unfortunately this time there was no a hardware exhibition as a part of the event, so the only things that could be touched by hands and twiddled with came with speakers and were few.

Sunday, July 17, 2016

Smart glasses evolution is too slow

Back in 2014 I attended Android developer's conference in Moscow, and then published an overview here in the blog. One of the interesting things presented there was Epson smart glasses Moverio BT-200. Today, in 2016, Epson has announced the next generation of the smart glasses - Moverio BT-300 and started collecting pre-orders for it (unfortunately, only in US!).

I do not have the device yet, I only have read the specs. But here is my thoughts.

Most valuable improvement for me is HD display. The former one was too rude for eyes. The controller box is reduced in size, but it's still there, and I don't know why (read my first post for an explanation of my point of view). They added a camera, which is good, but the camera is only one, which is bad. It would be natural for such device to have 2 cameras for (1) streaming stereo vision from one device to another, (2) 3D recording, (3) 3D macro view and (4) 3D telescope view modes. I know they have stereo camera in their industrial smart headset. But I think this is a must have feature for home users as well.

To recap, they do evolve step by step, but I'd like to get smart glasses with more features, more light-weight and convenient. And I know it's doable on Android right now.

Friday, April 1, 2016

Space review for Snappy mobile browser

April 1-st. Google Play published apps reviews from space. Here is what they say about Snappy - an extendable browser for Android:

Tuesday, February 16, 2016

Snappy: mobile browser with Chrome-like extensions

I'm happy to announce a brand new product for Android - Snappy. This is a mobile browser which supports Chrome-like extensions.

The extendable browsers are standard de-facto on desktops. Yet mobile browsers provide very limited facilities for extension. Some of them declare a support of so called "plug-ins" or "add-ons", while the others withdraw such possibility completely due to supposedly large resource consumption that "plug-ins" would impose. Anyway, the range of features supported by extensions for desktop browsers is far wider than that's available for mobile browsers. This is why I decided to port a considerable part of Chrome extensions API to Android, using the mobile WebView based on the same Chromium project.

Today you may try it yourself. The browser is available in Google Play (Android 5+, WebView 48+ is highly recommended). Please visit the home page for further details. As the very first release, it may have some issues, but I hope that the whole idea is so powerful and universal to produce positive impression nevertheless.

Tuesday, January 12, 2016

Google thinks my tablet is a car

As an Android developer I often analyze system logs from my tablet. Starting from some recent updates (presumably, since Android 6.0) I see peculiar records there from time to time.

I/ActivityManager(591): Start proc 7994:com.google.android.gms:car/u0a21 for service com.google.android.gms/.car.CarService ... D/ChimeraCfgMgr(7994): Loading module com.google.android.gms.car from APK com.google.android.gms ... D/CAR.SERVICE(7994): Connecting to CarCallService... D/CAR.SERVICE(7994): com.google.android.projection.gearhead isn't installed. D/CAR.TEL.Service(7994): Creating a new CarCallService. W/ActivityManager(591): Unable to start service Intent { act=local_bind cmp=com.google.android.gms/.car.InCallServiceImpl } U=0: not found D/CAR.TEL.PhoneAdapter(7994): setListener: com.google.android.gms.car.dn@43460a D/NativeLibraryUtils(7994): Install completed successfully. count=14 extracted=0 D/CAR.TEL.Service(7994): Starting CarCallService with initial phone null ... D/CAR.SERVICE(7994): mConnectedToCar = false, abort E/ActivityThread(7994): Service com.google.android.gms.car.CarService has leaked ServiceConnection com.google.android.gms.car.hr@b3012b2 that was originally bound here E/ActivityThread(7994): android.app.ServiceConnectionLeaked: Service com.google.android.gms.car.CarService has leaked ServiceConnection com.google.android.gms.car.hr@b3012b2 that was originally bound here E/ActivityThread(7994): at android.app.LoadedApk$ServiceDispatcher.(LoadedApk.java:1092) E/ActivityThread(7994): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:986) E/ActivityThread(7994): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1303) E/ActivityThread(7994): at android.app.ContextImpl.bindService(ContextImpl.java:1286) E/ActivityThread(7994): at android.content.ContextWrapper.bindService(ContextWrapper.java:604) E/ActivityThread(7994): at android.content.ContextWrapper.bindService(ContextWrapper.java:604) E/ActivityThread(7994): at android.content.ContextWrapper.bindService(ContextWrapper.java:604) E/ActivityThread(7994): at com.google.android.gms.common.stats.g.a(SourceFile:128) E/ActivityThread(7994): at com.google.android.gms.common.stats.g.a(SourceFile:145) E/ActivityThread(7994): at com.google.android.gms.car.hc.(SourceFile:319) E/ActivityThread(7994): at com.google.android.gms.car.CarChimeraService.onCreate(SourceFile:74) E/ActivityThread(7994): at com.google.android.chimera.ServiceProxy.setImpl(SourceFile:115) E/ActivityThread(7994): at com.google.android.chimera.ServiceProxy.onCreate(SourceFile:105) E/ActivityThread(7994): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2877) E/ActivityThread(7994): at android.app.ActivityThread.-wrap4(ActivityThread.java) E/ActivityThread(7994): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427) E/ActivityThread(7994): at android.os.Handler.dispatchMessage(Handler.java:102) E/ActivityThread(7994): at android.os.Looper.loop(Looper.java:148) E/ActivityThread(7994): at android.app.ActivityThread.main(ActivityThread.java:5417) E/ActivityThread(7994): at java.lang.reflect.Method.invoke(Native Method) E/ActivityThread(7994): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) E/ActivityThread(7994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

What this means is that Android lives its own life, very far from reality, and tries to run tons of useless crap behind the scene, without user consent.

I don't have a car and my tablet has not ever been connected to one. Yet Google thinks it's acceptable to waste device's resources unconditionally and embed such ridiculous services into the system core. For example, the car service lives inside com.google.android.gms, which is a part of indispensable Google Play.

Monday, January 4, 2016

Chrome extension for secure, private, and faster Internet browsing

If you're reading this, you're definitely browsing Internet at the moment. Perhaps you spend a lot of time in the net. So am I. This is why it's important to know that we can surf the web securely, privately and fast. For this purpose I've made a browser extension which was originally developed for FireFox back in 2008, but then ported to Chrome. I've been using it for all these years and continue improving.

Not long ago the source code and downloadable crx-file have been moved from discontinued code.google.com to Bitbucket, where the latest version of Domain Cage is available.

You may say that there are a lot of analogous extensions and you'll be partially right. Yet Domain Cage has an optimal set of features: it's small, universal, standalone, customizable for your needs, and most importantly very restrictive by default - this helps you to keep privacy and security on unknown sites (what is very common situation in Internet). You may find further details in the introduction and the user guide.