Making no sense

вторник, 25 ноября 2014 г.

Intersystems Caché - Approaching Community Package Manager - Part II

This is the second part of my long post about package managers in various operating systems and language distributions. Now you probably "buy the idea" that convenient package manager and 3rd party code repository is the key factor in establishing of a live and popular ecosystem. In the second part we will discuss the action plan for creating of a package-manager for the Caché​ database environment.

​So let try to estimate how much we should implement if we would try to add some basic package management facilities to Caché ecosystem? Should we do anything in the kernel, or could it be done as external service? What is the minimum functionality necessary at the beginning to establish anything resembling package management repository? Which still be useful?

Format

1st question to answer - what is composing the “package”? What about simplest ever case - when only Caché classes to be deployed? How we keep multiple file types? In the ideal case – some ZIP container could be used, but in the  simplest case even the simple XML file, as a Caché Studio project export could serve the purpose, because even now we could embed all supported file types (CLS, RTN, INC, CSP, ZEN, CSS, GIF, etc.) to such XML export files. Not everything is possible to add to the project using Studio UI, but AFAIK much less restrictions applied if we use the Studio API classes.

Yes XML export is very inefficient, bloated, and although it could handle binary files as base64 encoded, but it would generate large files. For the initial implementation though we could ignore this inefficiency for the moment

Metadata file

2nd question to answer - what should we put as the metadata info? Certainly there should be “dependency information” (to make possible recursive install of all dependent packages), but what else?

Here is the example of metadata information from some abstract CPAN module using ExtUtils::AutoInstall package functions, which is not usually part of distribution, but one has handy facility for dependency tracking:

use inc::Module::Install; name 'Joe-Hacker'; abstract 'Perl Interface to Joe Hacker'; author 'Joe Hacker <joe@hacker.org>'; include 'Module::AutoInstall'; requires 'Module0'; # mandatory modules feature 'Feature1', -default => 0, 'Module2' => '0.1'; auto_install( make_args => '--hello', # option(s) for CPAN::Config force => 1, # pseudo-option to force install do_once => 1, # skip previously failed modules ); WriteAll;

Here is the example of NPM package dependencies description:

{ "dependencies" :
 { "foo" : "1.0.0 - 2.9999.9999"
 , "bar" : ">=1.0.2 <2.1.2"
 , "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
 , "asd" : "http://asdf.com/asdf.tar.gz"
 , "til" : "~1.2"
 , "elf" : "~1.2.3"
 , "lat" : "latest"
 , "dyl" : "file:../dyl"
 }
}

As a rough approximation, we could start with JSON format used by the NPM packages. However, for the simplicity sake, before we have better JSON support in the kernel, we could start with XML metadata file information.

Honestly, I hate XML, but let face it - XML and JSON are quite interchangeable, and all about the same, they are 2 different way to serialize hierarchical info. So whatever is described in JSON, could be similarly described in XML, and vice versa.
Once we have better JSON support in the product, we could easily switch the gears, and use JSON instead of XML for metadata information file.

Dependency on system classes

When we are talking about dependencies on some classes there is interesting problem to address - how to mark dependency on some “built-in” Caché/Ensemble/HealthShare/TrakCare class(es), which may have been introduced with some particular version? And in general - how to denote dependency on anything from %CACHELIB and similar system database?

For simplicity matter (in the initial implementation) we may just ignore that problem, and if deployed extra class will reference to anything of system database then just assume it’s just there.

In the ideal case we should have facilities to require dependency on some particular version (i.e. “>2014.1”) of particular product (“Cache”, “Ensemble”, “HealthShare”, “EM”, etc.) or even some particular package installed (“iKnow”, “SetAnalysis”, etc) This is too early though at the moment to try to invent some definitive mechanism, so we may leave this question unanswered.

Cross-platform binary modules

CPAN would not get so much success if there would be no way to distribute packages, which are partially implemented in C, and part in Perl. So for calling to some mission critical, highly optimized code, or as a wrappers for sokme externally available C/C++ library. In Perl they have XS API facilities which allows you to call C code from Perl module, and in reverse. If you would look into the implementation details you would quickly realize that XS is modelled very similar to Caché callout - similarly as in our case, there is no simple and direct wayto call any C/C++ API, you have to write wrapper to call it. But dislike to callout there are available a number of service utilities which simplify the process of a wrapper creation, such as:

  • h2xs preprocessor to generate XS header using the given C header file (well with some limitations);
  • xsubpp - preprocessor to convert XS code to pure C code, etc;

While dealing with callout code from COS we have a little help from the system, and most of the code should be written manually. [Fortunately, now we are allowed to write DLL callouts, and not obliged to statically recompile Caché kernel, the situation I remember at the early 2000]

There are a couple of rather modern, and relatively convenient approaches to call external C/C++ code from Caché kernel:

From the practical prospective though, taking into account multiple Caché platforms we should handle equally well (Windows, Linux, Mac OS X, oreven VMS), and the fact that these both FFI (foreign-function interfaces) are not yet officially supported, I should admit that they both are not ready yet, and could not be recommended as a way to handle deployment of mixed C/COS packages. Now it’s not a big issue, but eventually, once we will go to cross-platform with binary packages we should revisit this topic.

Unit Testing

CPAN example showed us yet another good practice, which may positively affect the maturity and stability of 3rd party eco-system – built-in testing support. Each popular Perl package had built-in set of unit-test, which supposed to be run after compilation completed and before installation happen. If there this unit-testing is not passed for the target system then installation will not happen.

For simplicity sake we may ignore unit-testing support in the 1st implementation, but once it will evolve to the binary package format (i.e. ZIP) and binary modules support added – then testing should become required step before installation.

Command-line access

User experience is a key factor here - if this system would be inconvenient to use then there is big chance to stay unnoticed. To be useful for COS developers community here we supposed to handle “package installations” both directions:

  • be it invoked from COS shell, via simple package-manager shell `do ^CPM`
  • or from command-line, i.e. `cpm install DeepSee-Mobile`
From practical point of view they should be interchangeable and provide the same side-effect for each operation. But having CLI access to package manager is important for administrators due to scripting needs.
In the longer term, once infrastructure is established and mature enough there should be developed GUI wrapper for package manipulations (say, callable from SMP), but GUI is not required at the 1st step.

Mirroring and CDN

In 199x-200x years each package management system faced yet another problem, they had to address separately - how to make their repository respond fast, and preferably from geo-optimized mirror location? And while we are at this topic - what about that mirror system should be DDoS resistant at the same time? Such “old school” software repositories usually relied on community power to deploy huge network of geo-spread mirrors (CPAN, CTAN, Debian, etc.). They are still using the same approach, and still have multiple mirrors spread over the planet, but today we have easier soluion to this same problem.

Today there is available a cheap facility of CDN providers. If we need to just host some set of static binary files then CDN is just “that doctor ordered”. I have no idea who is the best selection for our scenario: whether it will be some generic VM-hosting provider like Amazon or Azure, or, may be, we would need to select between Amazon CloudFront, or MaxCDN or anything similar. Anything of mentioned is easy to handle nowadays, and not require any extra mirroring effort from the community.

If you have any prior experience with CDN, and have strong preference on something, please provide us advice - we will be curios to know any details.

Final words

This is my simple take on the apparent problem of missing convenient repository for 3rd party components used in Caché database problem. They are either hard to find, or hard to install, or unmaintained, or all at once. We need more utilities, more classes available, and more developers involved in the ecosystem. Central repository like CPAN could be a trigger point in changing the scenario of how an average Joe "the COS developer" develops their new solutions.

I hope it's clear now that package manager might be doable right now, even with current database platform support, and could be done in reasonable amount of time. So...

So who is wanting to participate? Do we have community demand here?

Intersystems Caché - Approaching Community Package Manager - Part I

​ Here is the problem as I see in the Caché developers community - if you are newbie COS/Ensemble/DeepSee developer then it's very hard to find any suitable 3rd party component, library or utility. They are spread over the Internet, some of them are in the GitHub, some of them in SourceForce, rare ones are on their own sites, etc. Yes,there are many useful components or tools (there are even standalone debugger or VCS) but it takes some time to discover all the useful location, and get to used to this situation.
There is no single location and there is no convenient way to find and install extension or utility.
Which is not very competitive comparing to other languages and development environment. In these articles I will try to investigate this problem further (this part I), and will propose some simple decision (part II)

​What do you think about "package manager" and its importance for the community success? For me, package manager is absolutely a must, and most important ingredient for the language success and maturity of eco-system. You could not find any single language community where there would be no convenient package manager with huge collection of available 3rd party packages. After all these years spent hacking in Perl, Python, JavaScript, Ruby, Haskell, Java, (you name other) you pretty much used to expect that when you start a new project you have a plenty of external components which may help you to cook the project fast and seamless. `PM install this`, `PM install that` and quite easy and fast you get something working and useable. Community works for you.

These words about CPAN and its experience are pretty much characterizing the importance of the precedent of CPAN and it's later impact toother languages and environments:

"Experienced Perl programmers often comment that half of Perl's power is in the CPAN. It has been called Perl's killer app.Though the TeX typesetting language has an equivalent, the CTAN (and in fact the CPAN's name is based on the CTAN), few languages have an exhaustive central repository for libraries. The PHP language has PECL and PEAR Python has a PyPI (Python Package Index) repository, Ruby has RubyGems R has CRAN Node.js has npm Lua has LuaRocks Haskell has Hackage and an associated installer/make clone cabal but none of these are as large as the CPAN. Recently, Common Lisp has a de facto CPAN-like system - the Quicklisp repositories. Other major languages, such as Java and C++, have nothing similar to the CPAN (though for Java there is central Maven).
The CPAN has grown so large and comprehensive over the years that Perl users are known to express surprise when they start to encounter topics for which a CPAN module doesn't exist already."

RPM

Other

OS X (pkg)

and

Application Extensions

Application extensions

Cross-platform

Source redacted - https://en.wikipedia.org/wiki/Package_manager

Here you see the redacted (significantly simplified) picture of WikiPedia article about package managers. They are a lot, be them source-based, or binary-based ones, particular architecture specific, OS-specific or cross-platform. I will try to cover them to some degree below. I will mix to the picture some language-specific package-management facilities, because without them picture would be of no much usefulness. And we are talking about language-/development-platform specific package managers in any case...

One important observation you could get from the table above – the more popular particular operating system and API ecosystem is, the more chances you have to receive multiple concurrent package managers for this platform. See situation in the Linux, Windows or Mac OS X as good examples. The more package managers used out there, the faster ecosystem is evolving. Having multiple package managers is not a requisite for fast ecosystems development pace, but rather side-effect of one.
Simply putting - if we eventually would get the situation where we would have several package managers with different repositories, than that would be rather indication about good ecosystem state, not bad.

Simplified timeline

Here is the approach I will use: get most important operating systems and language package managers, put them to the timeline, explain their specifics and interest for us, then do some generalizations and conclusions for Caché as a platform.

As we all know "picture worth a thousand word" so trying to simplify explanation I have drawn this silly timeline, which references all "important" (from my personal point of view) package managers which were used till the moment. Upper part is about language-specific package managers, and lower part is about operating system/distribution specific ones. X-axis steps is by 2 years (from January 1992 until today).

Package managers: Timeline from 1992 till 2014

CTAN, CPAN & CRAN

90ties were years of source-based package managers. We already had internet working as a distribution manager, but all package managers were operating on the same scenario:

  • Given the requested package name PM has downloaded the resolved tar-file;
  • Extracted it locally to the user/site specific area;
  • And invoked some predefined script for "building" and installing those sources to the locally installed distribution.

CTAN was the 1st language distribution which established such handy practice to install contributed content (Tex packages and extensions) from central repository. However, real explosion to this model happened when Perl community started to employ this model – since the moment of CPAN inception in the 1995 it collected "140,712 Perl modules in 30,670 distributions, written by 11,811 authors, mirrored on 251 servers."

This is very comfortable to work with language and within environment where for each next task you have the 1st question you ask: "Whether there is already module created for XXX?" and only in a couple of seconds (well minutes, taking into consideration the internet speed in middle-late nineties) after the single command executed, say:

>cpan install HTTP::Proxy

You have this module downloaded, source extracted, makefile generated, module recompiled using this generated makefile, all tests ran, sources, binaries and documentation installed into the local distribution and all is ready to use in your Perl environment via simple "use HTTP::Proxy;"!

Worth to mention that most of CPAN modules are Perl-only packages (i.e. beyond Perl Makefile.pl there are only source files written in Perl, thus not extra processing is necessary, which is simplifying deployment). But also worth to note that Perl Makefile.pl is flexible enough to easily handle combination of Perl sources with some binary modules (e.g. program, which is usually written in C, which in turn to be downloaded and compiled locally, using target specific compiler and its ABI).

The same model used by Tex in CTAN, and Perl in CPAN, developers of statistical language R tried to use in CRAN. The similar repository (archive) of all available sources, and similar infrastructure for easy download and install. The problem with CRAN was the language (R) which was not very famous and so widespread as Tex or Perl. But regardless this fact even "relatively rarely used R" accumulated 6000+ packages of extensions.

BSD world: FreeBSD Ports, NetBSD pkgsrc, and Darwin Ports

At the same period in the middle of 90-ies, FreeBSD introduced their own way to distribute open-source software via their own "ports collection". Various BSD-derivatives (like OpenBSD and NetBSD) maintained their own ports collections, with few changes in the build procedures, or interfaces supported. But in any case the basic mechanism was the same after `cd /port/location; make install` invoked:

  • Sources were installed from appropriate media (be it CD-ROM, DVD or internet site);
  • Product built using the Makefile given and compiler(s) available;
  • And build targets installed according to the rules written in the Makefile or other package definition file;

There was an option to handle all dependencies of a given port if there was request, so full installation for bigger package could still be initiated via single command and package manager handled all the recursive dependencies appropriately.

From the license and their predecessors prospective I consider Darwin Ports/MacPorts as the derivative of this BSD port collection idea – we still have the collection of open source software, which is conveniently handled by a single command, i.e.:

$ sudo port install apache2
It's worth to emphasize – until the moment both language-based repositories (CTAN/CPAN/CRAN) and BSD port collections (FreeBSD/OpenBSD/NetBSD/MacPorts) were all representing the 1st class of package-managers - sourcecode-based package managers

Linux: Debian and Red Hat

Sourcecode-based package management model was working well (till some degree) and produced impression of full transparency and full control. There were only several "small" problems:

  • Not all software could be deployed in source form, there is real life beyond open-source software, and proprietary software still need to be deployed conveniently;
  • And building of a big project may took a huge chunk of time(hours).

There was apparently a need to establish a way to distribute packages (and all dependencies) in their binary form, already compiled for the given architecture and ready for consumption. So we introduce binary package formats, and the 1st which of some interest for us – is the .deb format use by Debian package manager (dpkg). Original format, introduced in the Debian 0.93 in the March 1993, was just the tar.gz wrapper with some magic ASCII prefixes. Currently .deb package is both simpler and more complex – it's just the AR archive consisting of 3 files (debian-binary with version, control.tar.gz with metadata and data.tar.* with the installed files). You are rarely using dpkg in the practice - most current Debian-based distributives are using APT (advanced packaging tool). Surprisingly (at least for me for the moment I started to write this review) APT has outgrown Debian distros, and has been ported to Red Hat based distros (APT-RPM), or Mac OS X (Fink), or even Solaris.

"Apt can be considered a front-end to dpkg, friendlier than the older dselect front-end. While dpkg performs actions on individual packages, apt tools manage relations (especially dependencies) between them, as well as sourcing and management of higher-level versioning decisions (release tracking and version pinning)."

https://en.wikipedia.org/wiki/Advanced_Packaging_Tool

The apt-get' reach functionality and easiness has influenced all later package managers.

Another good example for binary packaging systems is the RPM (Red Hat Package Manager). RPM introduced with Red Hat V2.0 the late 1995. Red Hat quickly became the most popular Linux distribution (and solid RPM features was one of the factors winning competition here, till some moment at least). So it is not a big surprise that RPM started to be used by all RedHat-based distributions (e.g. Mandriva, ASPLinux, SUSE, Fedora or CentOS), but even further, beyond Linux it was also used by Novell Netware, or IBM AIX.

Similar to APT/dpkg there is Yum wrapper for RPM packages, which is frequently used by end-users, and which provides similar high-level services like dependency tracking or building/versioning.

Mobile software stores: iOS App Store, Android Market/Google Play

Since the introduction of Apple iOS App Store, and later Google Android Market, we have received most probably most popular software repositories which we have seen to date. They are essentially OS specific package managers with extra API for online purchases. This is not yet an issue for App Store, but is an issue for Android Market / Google Play – there are multiple hardware architectures used by Android devices (ARM, X86 and MIPS at the moment), so there are some extra care should be done before customer could download and install binary package containing executable code for some application. Given hardware agnostic Java code, you either supposed to compile Java-to-native binary upon installation on the target device, or repository itself could take care about this and recompile the code (with full optimizatons enabled) on the cloud, before downloading to the customer device.

In any case, regardless of where and how such optimizing native adaptation is done, this part of installation process is considered a major part of software packaging services done by operating system. If software supposed to be running on many hardware architectures, and if we are not deploying software in the source-code form (as we done in BSD or Linux) then repository and package maneeger should handle this problem transparently and in an some efficient manner.

For a time being, I'm not considering any cross-platform issues, and will handle in the 1st implementation only fully open-source packages. We may return back to this question later, to resolve both cross-version and cross-architecture issues simulateneously.

Windows applications: Chocolatey Nuget

It was a long-standing missing feature - despite the popularity of Windows on the market, we didn't have any central repository, as convenient as for Debian is apt-get, where we could find and install any (many/most) of available applications. There used to be Windows Store for Windows Metro applications (but nobody wanted to use them :) ), even before then, there used to be nice and convenient NuGet package manager, installed as plugin to Visual Studio, but (the impression was that) it was only serving .NET packages, and was not targeting "generic Windows desktop applications". Even farther, there was Cygwin repository, where you could download (quite conveniently though) all Cygwin applications (from bash, to gcc, to git, or X-Window). But this was, once again, not about "any generic windows application", but only about ported POSIX (Linux, BSD, and other UNIX compatible APIs) applications which could be recompiled using Cygwin API.

That's why development of Chocolatey Nuget in 2012 got me as a nice surprise: apparently having NuGet as a basis for package manager, with added PowerShell woodoo upon installation, and with added some central repository here you could pretty much have the same convenience level as with apt-get in Linux. Everything could be deployed/wrapped as some Chocolatey package, from Office 365, to Atom editor, or Tortoise Git , or even Visual Studio 2013 Ultimate! This quickly became the best friend of Windows IT administrator, and many extra tools used Chocolatey as their low-level basis have been developed, best example of such is - BoxStarter, the easiest and fastest way to install Windows software to the fresh Windows installations.

Chocolatey shows nothing new, which we didn't see before in other operating systems, it just shows that having proper basis (NuGet as a package manager, PowerShell for post-processing, + capable central repository) one could built generic package manager which will attract attention quite fast, even for the operating system where it was unusual. BTW, worth to mention that Microsoft decided to jump to the ship, and are now using Chocoatey as one of repositories, which will be available in their own OneGet package manager to be available since Windows 10.

On a personal note, I should admit, I do not like OneGet as much as I like Chocolatey - there is too much PowerShell scripting I'd need to plumbing for OneGet. And from user experience prospective Chocolatey hides all these details, and is looking much, much easier to use.

Node.js NPM

There are multiple factors which have led to recent dramatical success of JavaScript as a server-side language. And one of most important factors in this success (at least IMVHO) - the availability of central Node.js modules repository - NPM (Node Package Manager) . NPM is bundled with Node.js distribution since version 0.6.3 (November 2011).

NPM is modeled similarly as CPAN: you have a wrapper, which from command-line connects to central repository, search for requested module, download it, parse package metainfo, and if there are external dependencies then process this recursively. In a few moments, you have working binaries and sources available for local usage:

C:\Users\Timur\Downloads>npm install -g less
npm http GET https://registry.npmjs.org/less
npm http 304 https://registry.npmjs.org/less
npm http GET https://registry.npmjs.org/graceful-fs
npm http GET https://registry.npmjs.org/mime
npm http GET https://registry.npmjs.org/request
…
npm http GET https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz
npm http 200 https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz
npm http 200 https://registry.npmjs.org/asn1
npm http GET https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz
npm http 200 https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz
C:\Users\Timur\AppData\Roaming\npm\lessc -> C:\Users\Timur\AppData\Roaming\npm\node_modules\less\bin\lessc
less@2.0.0 C:\Users\Timur\AppData\Roaming\npm\node_modules\less
├── mime@1.2.11
├── graceful-fs@3.0.4
├── promise@6.0.1 (asap@1.0.0)
├── source-map@0.1.40 (amdefine@0.1.0)
├── mkdirp@0.5.0 (minimist@0.0.8)
└── request@2.47.0 (caseless@0.6.0, forever-agent@0.5.2, aws-sign2@0.5.0, json-stringify-safe@5.0.0, tunnel-agent@0.4.0, stringstream@0.0.4, oauth-sign@0.4.0, node-uuid@1.4.1, mime-types@1.0.2, qs@2.3.2, form-data @0.1.4, tough-cookie@0.12.1, hawk@1.1.1, combined-stream@0.0.7, bl@0.9.3, http-signature@0.10.0)

Wortth to note that changes which NPM authors introduce to the package manager practices - they use JSON format for package metainformation, instead of Perl-based ones used in the CPAN.

To be continued…

Ok, enough about current practice used elsewhere, in the 2nd part of this article we will talk more in details about simple proposal for a package manager in Caché. Stay tuned!.

четверг, 16 октября 2014 г.

Intersystems Meetup в Питере

понедельник, 21 апреля 2014 г.

DroidCon Moscow, 11 апреля 2014

Я вообще не знал и ранее не слышал про DroidCon конференцию, случайно встретил ссылку на неё в твитере Ya.Events. Ну и так как Яндекс предоставлял "хак" позволяющий бесплатно сходить на эту конференцию, я и пошел. Почему бы нет? Андроид я люблю. Хакатонов отродясь не видел. Посмотрим на молодое поколение, может чего нового узнаем.

Расписание было дурацким, и мало информативным. Более того, в случае когда в одном слоте было несколько докладчиков, оно было еще и неверным (не тот порядок имен). Проблему усугубляло еще и неудачное ведение (вернее его отсутствие) сессий. Так, например, я только к концу рассказа первого иностранного докладчика понял как его зовут, и только благодаря тому что он указал название твитера на последнем слайде. Когда треки разделились на 4 трека (где 2 было про "технологии" и 2 про "бизнес") я обычно посещал 1 из технологических треков. Посему, совершенно не представляю что было на бизнесовых, надеюсь, что-то интересное....

Dan Romescu - "augmented citizen"

Dan Romescu, называя себя "Augmented Citizen Advocate", любит всякие носимые штучки. Поэтому весь его рассказ был посвящен новым фиговинкам, которые он недавно приобрел (например, те же Google Glass, которые на нем были надеты, и наверное работали первую часть дня): "Blah-blah-blah is very cool!", "Blah-blah-blah - billions of devices!"

Признаемся сразу, вступление Дена было достаточно эмоционально, но бессмысленно. Слава богу, что коротко и не отняло у нас много времени. Также для участников хакатона Ден привез несколько гаджетов, которые они могли попрограммировать (например, iBeacon для навигации внутри помещений)

После завершения своего выступления Ден, к моему удивлению, приступил к "модерации" выступлений. Казалось, что Droidcon это изобретенный им формат, и он выступал таким посланником от английского Droidcon UK. (Хотя при ближайшем рассмотрении все права на формат Droidcon принадлежат немецкой MobileSeasons и какова роль Дена Ромеску здесь остается неясным)

В комменты призываются организаторы московской встречи, которые могли бы человеческим языком рассказать кто был изначальным и кем являлся Ден?
С другой стороны, модерация выступлений Деном была немного условной. Т.к. он не понимал ни одного слова по-русски, и т.к. российские организаторы конференции не предоставили ему наушников для перевода. Думаю, что переводчика в зале вообще не планировалось. Что, конечно, странно, т.к. Красный Октябрь обладает нужной инфраструктурой, и предоставляет её при желании организаторов. Например, на ALM Summit, случившийся там же в Октябре месяцем ранее все желавшие того слушатели могли взять радионабор и слушать перевод (воспользовались этим, вроде как, меньшинство, но все же, все же).
  • Потом выступили какой-то чувак из Гугл (blah-blah-blah что делать с Android устройствами, blah-blah-blah Россия - один из лидеров в использовании и разработке для Android);
  • Александр *, менеджер из APPS4ALL;
  • Вадим Исаченко из RU Google Developer Group, который, кстати, так же как и Дэн носивший Google Glass, и так же рассказавший ниочем;
  • Кто-то из Nokia попытался завлечь нас в платформу NokiaX ("developer.nokia.com с анализатором совместимости" и другими пирогами), но надеюсь никто не дал слабину

Далее треки разделились, я остался в главном зале...

David Ostrowski - program manager из Google

Представляясь Дэвид упомянул про свой профиль в Google+ +DavidOstrowski. Заметим, что у него нет никакого суффикса в виде цифры, которая появляется если создавать такой профиль "простому смертному" (так, например, мой профиль называется так https://plus.google.com/u/0/+TimurSafin1/ и я не нашел способа избавиться от этой 1 в качестве суффикса). Может это был блат для своих?

Дэвид рассказал много (воозлможно и довольно базовых, но для меня новых) вещей про платформу Google Cloud. До поры до времени слова App Enginne, Compute Engine, Cloud Storage, Cloud Databse, Cloud SQL звучат как набор buzzwords. Теперь же я понимаю в чем отличие App Engine и Compute Engine, или же Cloud Storage и Cloud Datastore.

Dmitry Ryzhkov - Intel INDE (Android development kits) и Android Media Pack

Если вы разрабатываете для x86 Android (да даже если и не разрабатываете) то советую сразу заглянуть на страницу беты Intel INDE (Integrated Native Developer Experience, ух). Там вы найдете компиляторы, инструменты и библиотеки для оптимизации вашего x86 Android кода. Там (впервые!) доступен оптимизирующий Intel C Compiler бесплатно (как часть всего набора).

Кроме компилятора ICC там так же есть набор интеловских библиотек, например, Intel Threading Building Blocks (TBB). Compute Code Builder для отладки OpenCL. И очень важный компонент, позволяющий отлаживать любой OpenGL код (будь то native X86 или даже чистый Java) - Intel GPA System Analyzer.

Читайте больше в статье Дмитрия на Хабре - "Intel INDE"

Philip Kandal - location based services

Одним из наиболее интересных рассказов в этот день (если не самым лучшим) был рассказ Филипа Кэндела и геолокационных сервисах в Андроид и носимых устройствах, и связанных с этим возможностями для разработчиков.

Но тут стал виден еще один косяк организаторов - они не следили за синхронизацией расписаний между треками. Людям, которые слушали предыдущий доклад в одном зале, и желавшим перебежать в перерыве (вроде бы как общем) в другой зал не оставляли ни малейшего шанса. Дима Рыжков закончил на 10минут раньше времени и Фил Кэндел начал свой рассказ без промедления, не ожидая времени своего слота. И рассказ довольно-таки интересный. Было намного обидно за людей пришедших через 10 минут с других треков, увидевших что некоторые ключевые слайды уже прошли.
Всегда, всегда на конференциях с несколькими треками надо четко следить за временем, не позволяя затягивать, и, тем более, не позволяя начинать раньше общего времени.

Фил работает в Scobbler и потому не из чужих рук знает текущие возможности геосервисов, и их текущие ограничения. Но, что более важно он хорошо формулирует те 12 областей, где в сейчас уже, а может и в ближайшее время можем получить интересные, чувствительные к гео-контексту, сценарии применения. Перечислю его формулировки как есть, если есть возможность найдите его слайды.

  • #1 google glass - augmented reality, navigation example
  • #2 smart watches like pebble
  • #3 car integration (mirrorlink, carplay, windows in the car, android in the car)
  • #4 rise of indoor location (NFC & iBeacon);
  • #5 styling - custom maps on app UI;
  • #6 the rise of open data and open maps;
  • #7 - alwayson location; - lowerpower GPS in 2014/15;
  • #8 glonas & more accurate location;
  • #9 geofencing (preserves battery)
  • #10 html5 geolocation and ip fallback;
  • #11 discovery over searching;
  • #12 - from distance to time based

Jose Uglia из разработчиков Wunderlist

Хосе пытался нас убедить, что за неделю можно написать Android приложение, вернее его бекэнд. Ну ок. (Заметим что в детали никто не вдавался, слава богу, ссылчоку на примеры дал)

Перерыв - обед

В отличие от очень негативного опыта обеда там же в Красном Октябре на конференции ALM Summit (проводимой Microsoft), где раздачи не справлялись, работали медленно, и некоторым в очереди не хватало в итоге продуктов, и они фактически остались без обеда, то в этот раз поставщики справились относительно безболезненно. Конечно же, дело упрощало отсутствие всяких вторых блюд, и использование уже заранее подготовленных бутербродов и сендвичей. В итоге кроме стояния в очередях у народа оставалось время и на поговорить. Что хорошо.

Я, например, хорошо пообщался с представителем YotaPhone, спросив про читалки и совместимость с YP наших любимых fbreader и coolreader, обнаружил что FBReader уже портирован на YotaPhone SDK. В чем мы и убедились быстро поставив стандартный FBReader из Google Play, и помацав в нем стандартные доки из поставки. Все как надо показывается на обратной eInk стороне. Остался, конечно, вопрос - для чего ему YotaPhone если у него даже не было читалки на тот момент? Какой смысл в таком eInk-е?

(to be continued...)

четверг, 10 апреля 2014 г.

Troubleshooting object inspector in Blogspot preview

I don't know how you, but I do use frequently the CSS/JavaScript debugger in the browser, and it bothers me a lot when I see situations, sites, pages where I'm unable to use it easily. Blogspot page preview is the such case - they intercept click events on the pages while showing me preview page, and as a side effect of this interception Chrome debugging tools are unable to show me information about selected object (because click is not real click here).
If you open preview page and invoke debugger tools, CSS inspector (Ctrl+Shift+I), and try to select the reading area you will probably fail here...
You will probably select the object which cover whole reading pane, and which "coincidentally" has CSS class "Blogger-clickTrap". Taking into account the intention of this div box has been added there I prefer to get rid of it. Yes, just delete this node in the DOM tree in the left:

Since now on you have 2 nice side effects:

  • CSS debugger object selector is able to work again;
  • and click events are properly working for all JavaScript on the page.
That's the desired effect we wanted to return.

Troubleshoooting Blogspot embedding problems

Let imagine you carefully writing longish blog post, which you've accompanied with a number of embedded videos from Yandex.Video or slides from SlideShare. But eventually you want to see your blogpost preview, and OMG, all this embedded content gone! Nothing is visible, only silly boxes.

What the heck? No problemo - all browser problems should be properly logged to the the browser log. For the Chrome it would contains those entries:

Do you see the problem? You are watching this preview page via https:// protocol, but embedded content is using http:// instead. This could be fixed 2 ways:
  • You properly craft embedded blocks and change URIs mentioned to use default protocol of the page
  • or simply change preview page address from using https:// to http:// leaving all other tokens intact...

 Viola!

воскресенье, 23 марта 2014 г.

Московская группа пользователей C++ - заключение

Если Вы не читали предыдущие посты про Московскую встречу пользователей Си++ то их можно почитать здесь:
  • Часть №1
  • Часть №2
  • Часть №3
  • Часть №4
  • Часть №5
  • Но прежде чем перейти к части с выводами, надо вернуть долг и рассказать про последний доклад дня...

    Александр Путилин - C++ и mapreduce

    Александр Путилин из Яндекса, будучи вовлеченным в bigdata c относительно недавных времен, легко и непринужденно ввел в курс дела, и объяснил концепции map-reduce для аудитории Си++ программистов, в массе своей незнакомой с bigdata. Тут, конечно, облегчило процесс то, что он занимается этим недавно, и сам изучал это еще вчера.

    Сначала Александр рассказал про базовые принципы Map-Reduce а потом перешел к специфике Yandex реализации (о котором впервые было рассказано на Yac'2010 более 3 лет назад). Несмотря на то, что большинство слушателей никогда не работало с кластерами и тем более с big-data (все-же, не в каждой конторе есть такой технический парк машин, как в Яндексе, да, прямо скажем, ни у кого) но в целом данная презентация была принята с интересом, и не вызвала отторжения как предыдущая про HPC. Потому что Yandex MapReduce это все же C++, со своими заморочками (посмотрите, например, в слайдах как они именуют типы, как называется их тип строк, и какие коллекции они применяют), но все же C++.

    Что дальше?

    А теперь общее впечатление про данную встречу и мои мысли как это можно/нужно сделать в будущем.

    Было ли это интересно? Да, большей частью. Было ли это легко? Нет, такие встречи отнимают почти целый день. С учетом того, что условиями аренды зала не было предусмотрено никакого обеда, а только перерыв на чай, то это было сложно вдвойне. Более того, насколько я могу судить аренда зала обошлась в 50-70 тысяч, и случилась только благодаря упомянутому ранее спонсорству "неизвестной" конторы. Нужно ли повторять такой формат (много докладов и целый день?) Думаю, нет.

    Такие полнодневные события не могут происходить часто. Это скорее подходит для формата ежегодных конференций (типа YAC), но никак не для встречи пользователей какого-то языка программирования, которую хотелось бы проводить чаще чем раз в год (например, раз в квартал, или даже раз в месяц, как делают Берлинские Си++ программисты). Конечно же, в таком случае такие встречи должны быть достаточно короткими (1-2 доклада) и, самое главное, эффективными с точки зрения финансов, например, за счет проведения в помещении какой-нибудь релевантной конторы спонсора, со своей армией Си/Си++ программистов (в Москве такими могут быть Яндекс, Гугл, Майкрософт, Интел, и многие другие). С учетом того, что это не будет встреча на весь день, то и проводить её можно в любой день недели, по завершении рабочего дня (например, с 7 вечера). Заодно и пиво можно попить после такой встречи...

    Какой формат встречи я считаю оптимальным? Например, такой как был у Яндекса в недавнем "MongoDB meetup"

    Если осмотреться вокруг, то может оказаться что Яндекс проводит встречи не только про BigData как в случае с MongoDB, но и с C++ как в случае C++ party". Пока не знаю как это будет проходить с организационной точки зрения и насколько возможно это было бы расширить для generic C++ аудитории, не связанной со спецификой Яндекса, но посетить это событие я все же планирую. Да и вам советую.

    пятница, 21 февраля 2014 г.

    Московская группа пользователей C++ - часть 5

    Дмитpий Hecтepук - Высокопроизводительные вычисления на С/С++

    Многие из нас знают про питерский JetBrains, и если хоть раз сталкивалось с программированием для Android или .NET скорее всего любит. Любит за IntelliJ IDEA/Android Studio, ReSharper и многие другие средства разработки. И если на собрание Си++ разработчиков приходит "технический евангелист" из такой уважаемой фирмы, то он сразу получает большой кредит доверия

    Кроме всего прочего Дмитрий Нестерук является MVP (Most-valuable Professional) по Visual C# с 2009 года. Он разработчик курсов на PluralSight по Matlab и CUDA, любит заниматься финансовой математикой (чтобы это ни значило), закончил британский университет в Саутгемптоне, и живет в Швеции. Всё говорило за то, что его длинная, полуторачасовая презентация должна быть очень интересна и полезна аудитории ("она же про HPC/высокопроизводительные вычисления!"), но...

    Начал Дмитрий с рассказа про управляемый (managed) и нативный код. И перешел сразу же к управляемому коду. Что, конечно, слегка напрягало, т.к. аудитории это было в-общем то чуждо.

    Не знаю почему, может в силу больших ожиданий от "евангелиста", мне периодически казалось что Дмитрию непривычно и некомфортно выступать на русском. Например, иногда смешили переводы на русский некоторых терминов, так он применял "портативный" вместо "переносимый" для "portable". Кажется, просто не хватило адекватного review данной презентации.

    Как и в каждой презентации про HPC было рассказано про disk-bound vs cpu-bound, параллелизм, SIMD/SSE* (и не сказано про AVX).

    JetBrains пытается ускорить все стадии циклов разработки, начиная от редактирования и заканчивая параллельной сборкой. На этом месте Дмитрий показал Incredibuild как средство параллелизации построения большого проекта (привет DISTCC)

    Далее он перешел к рассказу про высокоуровневые технологии параллелизации/векторизации вычислений: CUDA (сказал много) vs OpenCL (сказал почти ничего). Когда надо больше параллелизма (но нет еще достаточно мотивации и денег на реальный кластер) то технологии FPGA и Xeon Phi могут помочь как ускорители вычислений работающих на desktop компьютерах.

    В этом месте некоторая часть аудитории достигла точки кипения и все-же спросила: "Когда же про Си++ то начнем?". Резонный вопрос.

    Интеловские технологии Xeon Phi aka MIC, большим фанатом которых с недавних пор Дмитрий является, стали пожалуй спасителями презентации и впервые он говорил собственно о Си++ (Intel C++ compiler) и как его применять для компиляции MIC кода.

    Ну и чтобы Си++ разработчики не чувствовали себя совсем обманутыми нам под конец еще раз показали текущее состояние дел их (JetBrains) кросс-платформенной среды разработки Си++ со всеми, свойственными JetBrains пирогами и плюшками (удобные средства рефакторина и кодогенерации). Но вы скорее всего это уже видели на Хабре месяц назад. И должен признаться, что визуально это пока не очень впечатляет, выглядит не сильно лучше чем KDE редактор Kate, к которому приделали меню рефакторинга. В-прочем, на таком раннем этапе развития продукта никто большего и не ожидал.

    В-целом, выступление Дмитрия оставило двойственное впечатление: с одно стороны рассказ про технологии, скорее всего был многим полезен, но все-же его надо читать в другое место и другое время, это был очень сильный оффтопик для группы пользователей Си++. Персонально я не узнал ничего нового, и лучше бы еще какой материал про Си++11/14 послушал. Слишком много интересного происходит последние пару лет собственно в языке Си++, чтобы тратить время на такие общеобразовательные лекции. Извините.

    Читайте заключение в следующей статье...

    четверг, 20 февраля 2014 г.

    Московская встреча пользователей Си++ - часть 3

    Андрей Иванитский - C++ Memory model

    Перед тем как говорить про собственно презентацию, немного о фирме Андрея Иванитского. Как мы потом узнали эта таинственная, неназванная фирма была спонсором Московского мероприятия. Но по каким-то причинам они предпочли не называть своего имени. Но мы не привыкли играть по таким правилам, потому я попытался найти того "Андрея Иванитского", который мог бы показаться релевантным здесь. Имея достаточно обширную сеть в Linkedin я попытался найти Андрея Иванитского там, и после нескольких фальстартов увидел 2 возможных кандидата
    [Про размер сети сейчас сказать точно невозможно, т.к. linkedin некоторое время назад убил страницу статистики сети, но когда то они утверждали что круги 3-го порядка достигают у меня пару миллион контактов, что я расцениваю это как сеть, покрывающую большую часть российского программирования. За исключением самой дремучей его части, которые не завели себе профиля в LinkedIn.]

    Второй Андрей Иванитский работает в IT подразделении Тандем, фармацевтической фирмы. Кажется не очень релевантным. Первый же является главой тренинг центра Naumen, и занимается XP, Agile и всем таким. Все кажется вполне релевантным, посему я предлагаю считать что это тренинг центр Naumen спонсировал данное собрание.
    За что ему отдельное большое спасибо!

    Но вернемся к материалам доклада. C++ memory model - не легкая тема. Не легкая и противоречивая. Мне кажется в этом отчасти виноват и сам Бьерн, т.к. он не лез в соответсвующие части и отдал на откуп Ханс Боэму (С/C++ garbage collector помните?). Мне всегда казалось, что Ханс очень не любит простых путей, часто запутывая остальных. Понятно, что работа с памятью в многопроцессорной среде не может быть простой. Понятно, что работа с памятью в таком множестве различных архитектур, в каком поддерживается Си++, не может быть унифицировнным. Понятно, что в стандарте придется допускать расхождения в любую сторону. Но не до такой же степени должно быть заморочено!

    (Часто перечисление записанного мной в Твитере будет малосвязанным, т.к. полной ясности до сих пор нет. Уж извините!) Было рассказано про отношения порядка: synchronize-with и happens-before. При рассмотрении порядка доступа к памяти (memory ordering) были введены различные типы синхронизаций: sequenciallly consistent (консистентно для следующих друг за другом), acquire-release (захват, освобождение), и relaxed orderings ("расслабленное" упорядочивание).

    Были даны обобщенные советы, чтобы аудитория никогда не использовала relaxed ordering, и вообще не заморачивалась про memory ordering и блокировки, а лучше использовала высокоуровневые примитивы типа std::future или packaged_tasks. На что Григорий Демченко (предыдущий докладчик про synca библиотеку) разумно возразил что ему не заморачиваться не удается, и в жизни такое часто.

    Подводя итог, могу заметить что Андрей Иванитский затронул важную, мало освещенную, мало понимаемую часть стандарта Си++. Но проблема в том, что, очевидно, эта часть еще им самим не хорошо была изучена, и как результат ясности понимания у аудитории не возникло. С другой стороны, важная часть эффекта все же была достигнута - меня и многих других этот доклад заставил заглянуть в стандарт и соответствующие материалы группы WG21. Надеюсь в будущем это позволит вновь вернуться к данному вопросу и рассказать о нем уже с практической точки зрения, но уже на новом уровне понимания.

    Продолжение следует...

    среда, 19 февраля 2014 г.

    Московская встреча пользователей Си++ - часть 4

    Антоний Полухин - Boost и C++11/C++14: Новости с фронта, или обо всём понемногу

    Доклад Антона Полухина, одного из контрибьюторов Boost-а ("В свободное от работы время"), не был посвящен какой-то определенной теме, а рассказывал о многом, что было недавно (за прошлый год) сделано в Boost. Больше всего такой рассказ был похож на, скажем, квартальный "Status Update" доклад о достижениях команды часто делаемый в больших корпорациях. К нему ты не сильно обычно готовишься (15 минут - час), в него ты быстро набрасываешь все основные пункты из отчетов за период, и большую часть информации доносишь уже на презентации. Обычно аудитория в контексте (они читали твои регулярные отчеты), ты знаешь все ответы на вопросы (потому что ты собственно все это и делал), и такой доклад не сильно отвлекает от дел. Ты ведь программист а не менеджер, тебе надо кодить а не языком молотить?

    Именно такая легкость и некоторая часть импровизации импонировала в докладе Антона. Даже несмотря на малую связанность экранов между собой :) Нам всем был интересен прогресс в библиотеке Boost, т.к. большинство аудитории являлось, надеюсь, этой библиотеки пользователями

    Антон рассказал как введение в Си++ шаблонов с переменным количеством аргументов (varidadic templates) счастливым образом отразилось на простоте кода библиотеки, уменьшении размера кода и отладочной информации.

    Было упомянуто что была активность по адаптации Boost к Android NDK, и все внесенные модификации должны быть доступны к следующему релизу. Соответствующие билд-боты будут поддерживать состояние Android порта через запуск набора регрессионных тестов.

    Как-то так получилось, что Антон пропустил дискуссию где решалось на какую DVCS переходить, и не понял почему была выбрана Git, а не скажем Mercurial. Но уж что случилось, то случилось. С начала года Boost теперь хостится на Github, и разработчики, вне зависимости как они относятся к Git (плохо относятся, чего уж) обязаны его использовать. Может привыкнут когда, так везде. В-любом случае, побочным эффектов перехода на GitHub был значительный рост внешних патчей. Очевидно, что популярность GitHub тут сыграла определенную роль.

    При недавнем выпуске Visual Studio 2013 разработчики и пользователи Boost обнаружили что новый VS2013 несовместим с последним Boost в С++11 режиме. Хотя ничего не предвещало, и бета версия компилятора была вполне в рабочем состоянии. Пришлось править Boost и большей частью выпиливать variadic-template в некоторых частях проекта.

    Не знаю и из каких соображений, но Антон упомянул об одном странном баге, который никто не знает как лечить ticket #8555. Если Вы знаете в чем закавыка - все будут премного благодарны.

    И, кстати, вы, наверное, знаете что Антон является автором книги про Boost" - "Boost C++ Application Development Cookbook"?

    Так вот, оказывается у него до сих пор нет ни одной копии этой книги. Издательство уже несколько раз пыталось прислать книгу автору, но каждый раз что-о не срасталось, и она возвращалась. Российская таможня - твердый орешек!

    Даже с учетом таких проблем с таможней, я думаю имеет смысл (хотя бы некоторым из нас) пойти на сайт издательства и купить электронную и/или твердую копию этой полезной книги. Поддержим копеечкой отечественного автора!

    Продолжение следует...