Jekyll2020-05-10T09:27:29+00:00https://futurezoom.in/feed.xmlFuture zoomingre-searching the futureKonstantin RubinovWhat are we missing when testing our Android apps?2018-05-30T00:00:00+00:002018-05-30T00:00:00+00:00https://futurezoom.in/tech/android-testing-cs<p>A couple of years ago (in 2016 to be precise) myself and prof. Luciano Baresi have asked ourselves this question. What followed was a thorough study of the Android testing landscape with its hills and ditches.</p>
<p>The comprehensive overview of our thoughts and opinions from back then, has been recently <a href="https://ieeexplore.ieee.org/document/8352077/">published</a> in the Computer Magazine. If you don’t have access beyond the paywall, simply reach out and I’ll be glad to discuss them with you.</p>
<p>The top items in the article are about testing for and with:</p>
<ul>
<li>Multiple devices</li>
<li>Lifecycle and system interactions</li>
<li>Context-awareness and sensor data</li>
<li>Dynamic UIs (read Fragments)</li>
<li>Complex UI interactions</li>
<li>Inter-app interactions</li>
</ul>Konstantin RubinovA thorough study of the Android testing landscape with its hills and ditchesWhy passing data inside a mobile app is difficult?2017-03-20T00:00:00+00:002017-03-20T00:00:00+00:00https://futurezoom.in/tech/mobile-web-app<blockquote class="small text-left">
<p>“The solutions all are simple… After you’ve already arrived at them. But they’re simple only when you already know what they are.”
<cite>Robert M. Pirsig, “Zen and the Art of Motorcycle Maintenance”</cite></p>
</blockquote>
<p><img src="https://futurezoom.in/images/kovacs_2016.jpg" alt="Kovacs shot put" class="align-center" /></p>
<p>You’re learning to develop Android apps and very early on you’re stuck. You’ve faced
a problem that <strong>you just can’t easily pass data within your app</strong>. That’s
unexpected. And solutions seem to be much more complex than you’ve hoped for in
this beginner stage. It feels like you’re just wasting time trying to read all
the docs. What’s going on?</p>
<p>I suspect that some fundamental concept about app structure has not been
explained to you. Let me try to set it straight.</p>
<p>First, let’s see where you find yourself. You’ve <a href="https://developer.android.com/training/basics/firstapp/index.html">built your first
app</a>
following the Google developer tutorial. Added a few simple activity classes
that represent individual screens of your app. And now you wish to send some
data between them (beyond a string of text). Say, a captured picture, an object of
a class <code class="language-plaintext highlighter-rouge">Person</code> filled with some contact details, or an <code class="language-plaintext highlighter-rouge">ArrayList</code> of
records. You try to put it in an <code class="language-plaintext highlighter-rouge">Intent</code>, but it’s not working. (By the way,
you’re still confused whether intents are to open other activities or to send
data between them).</p>
<p>You promptly discover that intents can only carry little additional
information, mostly primitive types, to be packed as key-value pairs. You go
to <em>Stack Overflow</em> to discover that you’ve got to use <a href="http://stackoverflow.com/a/2141166/3419014">something
<code class="language-plaintext highlighter-rouge">Parcelable</code></a> to send objects
between
activities.</p>
<p>– “What is that? I’ve just started learning? Can’t we have it simpler?”</p>
<p>You go back to Google tutorials that give you options to save app data in
<a href="https://developer.android.com/training/basics/data-storage/index.html">Key-Value Sets, files, or SQL
Databases</a>.</p>
<p>– “Isn’t that an overkill for just sharing simple pieces of data within a
trivial app? Come on!”</p>
<h2 id="the-web-app-metaphor">The “web app” metaphor</h2>
<p>Here you need to pause and understand that you probably miss something essential
about Android apps and their structure. The most useful metaphor
that I have to share with you is this:</p>
<p>think of <strong>your phone as a web browser</strong> and <strong>your app as a web app – a
collection of web pages</strong>.<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup></p>
<p>In a web app each page is standalone, the data it needs is loaded from a server
or other resources on the web (it does not come directly from the preceding
page). Each page knows to open another one using links. As you follow to open
the next page, it takes place of the previous one that gets closed.</p>
<p>Mobile apps essentially follow the same structure. <strong>Each activity is
standalone, responsible for obtaining its own resources, just like a web
page.</strong> Starting from the launcher activity (app’s home page), user navigates
around the app using “links” to reach other activities. If a phone call arrives,
the app is not closed, the “browsing history” with the latest activity on top
is preserved in the background by the operating system (imagine a web page
covered with a new opened tab). After the calling app is closed, you see your
app as you left it.<br />
The only difference is that our app can only be shown in “one tab” of our
“browser”, and only one page (activity) of our app is visible at a time.</p>
<p>What you might have imagined about Android app structure being a monolith
application made of different Java classes, is actually several smaller
independent “apps” (activities) packed together.</p>
<h2 id="how-is-it-useful">How is it useful?</h2>
<p>Now you should start to see why sending data between activities is not trivial.
It’s about connecting smaller independent “apps”. And trying to put more data
in an <code class="language-plaintext highlighter-rouge">Intent</code> is like trying to send pictures between two web pages, instead of
uploading a picture to the server and make it accessible to both. You also
start to see why do you might need <code class="language-plaintext highlighter-rouge">Services</code> for long-running operations.</p>
<p>Armed with a good metaphor you don’t waste your time hacking workarounds and
getting red eyes after browsing dozens of <em>Stack Overflow</em> questions/answers, and
instead focus on learning the stuff you’ll need time and again (such as, for
example, working with SQL Databases).</p>
<p><img src="https://futurezoom.in/images/kovacs_2016_2.jpg" alt="Kovacs happy" class="align-center" /></p>
<p><strong>P.S.:</strong> Can you do me a favor and leave a comment about any other useful
Android metaphor you’ve come across?</p>
<div class="footnotes">
<ol>
<li id="fn:1">
<p>I am not talking about web-based mobile apps right now, just in general. <a href="#fnref:1" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>Konstantin RubinovThe 'web app' metaphor helps to grasp Android app structure. Makes clear why passing data between activities is difficult.InEx app is out2016-12-17T00:00:00+00:002016-12-17T00:00:00+00:00https://futurezoom.in/news/inex-is-out<p class="text-justify">Today I’ve released
<span style="font-family: 'Lobster', cursive;">InEx</span>
– a simple Android app for tracking breathing and meditative sessions with minimal distraction.</p>
<p><a href="https://futurezoom.in/inex/"><img src="https://futurezoom.in/images/inex-logo-small.png" alt="InEx Logo" class="align-right" /></a></p>
<p class="text-justify">If you’re into Wim Hof method or breathing/meditative techniques, you can learn more about its features
<a href="https://futurezoom.in/inex/">here</a>, of simply try it out.<br />
<a href="http://play.google.com/store/apps/details?id=in.futurezoom.inex&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1"><img alt="Get it on Google Play" border="0" height="80" style="border:0px;height:80px;" src="https://futurezoom.in/images/en_badge_web_generic.png" /></a></p>
<p>P.S.: I am planning a follow-up article about what I learned from building and releasing this app. Stay tuned.</p>Konstantin RubinovToday I’ve released InEx – a simple Android app for tracking breathing and meditative sessions with minimal distraction. If you're into Wim Hof method or breathing/meditative techniques, you can learn more about its features here.App4Tomorrow results2016-10-15T00:00:00+00:002016-10-15T00:00:00+00:00https://futurezoom.in/tech/app4tomorrow<p><img src="https://futurezoom.in/images/a4t-logo.png" alt="App4Tomorrow logo" class="align-center" /></p>
<p>I want to share my excitement about an innovative course I had a privilege to
co-teach. The <a href="http://www.mip.polimi.it/it/news-eventi/news/samsung-app-academy-app4tomorrow-edition/">“Samsung App Academy - App4Tomorrow
edition”</a>
is a fruit of labor of Filippo Maria Renga and his team. It’s a product of
<em>Samsung Italy</em>, in collaboration with <em>MIP Politecnico di Milano Graduate
School of Business</em> and the <em>Department of Electronics, Computer Science and
Bioengineering</em> of the Politecnico di Milano.</p>
<p>The innovative nature of the course is that (apart from helping recent
graduates to acquire the latest digital-world skills, being highly intensive
and practice-driven) the course was propelled by an <strong>audacious goal – students
had to demonstrate their training by developing real projects of social
significance and impact in collaboration with industry partners</strong>. Student
were not working on abstract course projects, nope. Instead they had to
collaborate with local businesses to deliver real-world apps to address the
business and societal needs.</p>
<p>As an instructor, the biggest challenge of this course was to teach young
graduates to design mobile applications <strong>regardless of their previous education</strong>.
Most of the students came in without any technical background, yet with
tremendous motivation.</p>
<p>In the course of four months the students were introduced to the world of
<strong>object-oriented programming</strong> and <strong>Android app development</strong>. They had to grasp
basic and advanced programming concepts (Java, mobile operating systems,
graphical user interface design, databases, etc.) in a course of few weeks, and
sometimes days.</p>
<p><strong>And guess what? They delivered!</strong></p>
<p>A couple of examples: <em>Petruzzelli Theater</em> has a new mobile look. <em>Hospital
San Lazzaro</em> received a mobile solution to help patients tracking their
therapies. Another app shows real-time data about obstacles for accessing
public spaces for handicapped.</p>
<p>Very proud of each and all of them!</p>
<p class="align-center"><img src="https://futurezoom.in/images/a4t-final.png" alt="App4Tomorrow presentation" /></p>
<p><strong>P.S.:</strong> a few of the press releases (in Italian):</p>
<ul>
<li>
<p><a href="http://www.mobile4innovation.it/mobile-app/samsung-app-academy-studenti-imprese-e-universita-per-migliorare-la-vita-e-il-business_43672152298.htm">Samsung App Academy: studenti, imprese e Università per migliorare la vita e il business.</a></p>
</li>
<li>
<p><a href="http://www.corrierecomunicazioni.it/digital/43893_idee-per-migliorare-la-qualita-della-vita-i-7-progetti-e-i-25-finalisti-della-samsung-app-academy.htm">Idee per migliorare la qualità della vita: i 7 progetti e i 25 finalisti della Samsung App
Academy.</a></p>
</li>
<li>
<p><a href="https://www.linkedin.com/hp/update/6188751854659256322">Samsung Italy announcement of the App4Tomorrow
course.</a></p>
</li>
</ul>Konstantin RubinovProud of my students who delivered real apps to local businesses.Lifecycle and Event-Based Testing for Android Applications2016-09-27T00:00:00+00:002016-09-27T00:00:00+00:00https://futurezoom.in/research/simone-lifecycle-test<p class="align-center"><img src="https://futurezoom.in/images/simone-teaser.png" alt="slide" /></p>
<p>Great work on “Lifecycle and Event-Based Testing for Android Applications” by
Simone Graziussi, the student I’ve co-advised with Luciano Baresi.</p>
<p>Simone has written an <a href="https://github.com/Simone3/Thesis">excellent thesis</a> that
focussed on two particular challenges of mobile testing that have been largely
overlooked to date, lifecycle management and event concurrency.</p>
<p>First of its kind, the approach presents static code analysis to recognize
possible misuses of app components, and a dynamic technique that allows the
developer to drive the application lifecycle to test its robustness.</p>
<p>His thesis develops an event-based testing approach that allows to observe
several events during the application execution and to express consistency
checks on their stream by means of a proposed temporal assertions language.</p>
<p>Together, the thesis forms a <strong>comprehensive framework</strong> to automating testing of
events in Android applications, allowing to express existence, ordering,
causality and quantification conditions on them, as well as to better control
the critical lifecycle transitions.</p>
<p><strong>P.S.:</strong> A concise view of the work is available in the <a href="https://futurezoom.in/images/2016-poster.pdf">poster</a> presented at the Open House 2016 <sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup> @ DEIB of the
Politecnico di Milano.</p>
<div class="footnotes">
<ol>
<li id="fn:1">
<p>The Open House event disseminates and promotes research to students and companies by presenting scientific activities, teaching courses and job opportunities that a Master of Science Degree in Computer Science and Engineering offers. <a href="#fnref:1" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>Konstantin RubinovA comprehensive framework to automating testing of events in Android applications.Challenges in mobile app testing2016-09-15T00:00:00+00:002016-09-15T00:00:00+00:00https://futurezoom.in/tech/itmo-presentation<p>My presentation at ITMO University about challenges in Android app testing and some interesting research directions.</p>
<figure class="third ">
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.006.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.006.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.007.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.007.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.008.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.008.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.009.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.009.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.011.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.011.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.013.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.013.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.014.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.014.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.015.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.015.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.017.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.017.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.018.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.018.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.028.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.028.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.029.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.029.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.031.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.031.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.032.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.032.png" alt="" />
</a>
<a href="https://futurezoom.in/images//itmo-present/mobile-app-test.033.png">
<img src="https://futurezoom.in/images//itmo-present/mobile-app-test.033.png" alt="" />
</a>
</figure>
<p>A pdf copy of the full presentation is available <a href="http://is.ifmo.ru/present/ITMO_Rubinov_slides.pdf">on the ITMO web site</a>.</p>Konstantin RubinovMy presentation at ITMO University about challenges in Android app testing and some interesting research directions.Automated Partitioning of Android Applications for Trusted Execution Environments2016-06-15T00:00:00+00:002016-06-15T00:00:00+00:00https://futurezoom.in/research/tz<p>When software systems are put on different platforms, new issues start to
dominate their quality argument. In particular, for mobile systems the security
and trustworthiness of an application and device are paramount.
At the same time, much of software security concerns cannot be completely
relieved with thorough software testing and design, whereas in the context of
mobile applications, even the operating system (OS) cannot be trusted to
provide security guarantees.</p>
<p>My work in this area tackles the issue of adaptation and reuse of existing mobile
applications to take advantage of the hardware backed protection. This work
views security as a combined responsibility of software and hardware.</p>
<h3 id="abstract">Abstract:</h3>
<p class="text-justify">The co-existence of critical and non-critical applications on computing devices, such as mobile phones, is becoming commonplace. The sensitive segments of a critical application should be executed in isolation on Trusted Execution Environments (TEE) so that the associated code and data can be protected from malicious applications. TEE is supported by different technologies and platforms, such as ARM Trustzone, that allow logical separation of “secure” and “normal” worlds.
We develop an approach for automated partitioning of critical Android applications into “client” code to be run in the “normal” world and “TEE commands” encapsulating the handling of confidential data to be run in the “secure” world. We also reduce the overhead due to transitions between the two worlds by choosing appropriate granularity for the TEE commands. The advantage of our proposed solution is evidenced by efficient partitioning of real-world applications.</p>
<p><a href="https://futurezoom.in/assets/files/TZ-ICSE16.pdf">Download PDF preprint</a></p>
<figure class="half ">
<a href="https://futurezoom.in/images/approach-tee.png">
<img src="https://futurezoom.in/images/approach-tee.png" alt="" />
</a>
<a href="https://futurezoom.in/images/tee.png">
<img src="https://futurezoom.in/images/tee.png" alt="" />
</a>
</figure>
<h4 id="bibtex-record">Bibtex record</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@inproceedings{Icse2016Partition,
Author = {Rubinov, Konstantin and Rosculete, Lucia and Mitra, Tulika and Roychoudhury, Abhik},
Title = {Automated Partitioning of Android Applications for Trusted Execution Environments},
Booktitle = {Proc. of 38th Int. Conf. on Software Engineering (ICSE)},
Doi = {10.1145/2884781.2884817},
Isbn = {978-1-4503-3900-1},
Numpages = {12},
Pages = {923--934},
Series = {ICSE '16},
Year = {2016},
Url = {http://doi.acm.org/10.1145/2884781.2884817}}
</code></pre></div></div>
<p>Published and presented at the <a href="http://2016.icse.cs.txstate.edu/">2016 IEEE/ACM 38th IEEE International Conference on Software Engineering</a></p>Konstantin RubinovAdaptation and reuse of existing mobile applications to take advantage of the hardware backed protectionHercules: Reproducing Crashes in Real-World Application Binaries2015-05-25T00:00:00+00:002015-05-25T00:00:00+00:00https://futurezoom.in/research/hercules<p>One of the core issues in software testing, debugging, verification, and security, is to comprehend software systems, to get insights into program structure and semantics. Symbolic execution, one of the approaches for getting these insights, concisely captures program semantics as first order logic formulae over symbolic program input, and, as of today, provides a solid foundation for development of efficient tools for software verification and analysis. This work is pushing this frontier further by leveraging and enhancing symbolic execution based approaches for solving difficult problems in the field of security, such as vulnerability detection and reproducing crashes in real-world application binaries.</p>
<h3 id="abstract">Abstract:</h3>
<p class="text-justify">Binary analysis is a well-investigated area in software engineering and security. Given real-world program binaries, generating test inputs which cause the binaries to crash is crucial. Generation of crashing inputs has many applications including off-line analysis of software prior to deployment, or online analysis of software patches as they are inserted. In this work, we present a method for generating inputs which reach a given “potentially crashing” location. Such potentially crashing locations can be found by a separate static analysis (or by gleaning crash reports submitted by internal / external users) and serve as the input to our method. The test input generated by our method serves as a witness of the crash. Our method is particularly suited for binaries of programs which take in complex structured inputs. Experiments on real-life applications such as the Adobe Reader and the Windows Media Player demonstrate that our Hercules tool built on selective symbolic execution engine S2E can generate crashing inputs within few hours, where symbolic approaches (as embodied by S2E) or blackbox fuzzing approaches (as embodied by the commercial tool PeachFuzzer) failed.</p>
<p><a href="https://futurezoom.in/assets/files/hercules.pdf">Download PDF preprint</a></p>
<figure class="third ">
<a href="https://futurezoom.in/images/approach-hercules.png">
<img src="https://futurezoom.in/images/approach-hercules.png" alt="" />
</a>
<a href="https://futurezoom.in/images/phases-hercules.png">
<img src="https://futurezoom.in/images/phases-hercules.png" alt="" />
</a>
<a href="https://futurezoom.in/images/exploration-hercules.png">
<img src="https://futurezoom.in/images/exploration-hercules.png" alt="" />
</a>
</figure>
<h4 id="bibtex-record">Bibtex record</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@inproceedings{Icse2015Hercules,
Author = {Pham, Van-Thuan and Ng, Wei Boon and Rubinov, Konstantin and Roychoudhury, Abhik},
Booktitle = {Proc. of 37th Int. Conf. on Software Engineering (ICSE)},
Doi = {10.1109/ICSE.2015.99},
Pages = {891--901},
Title = {Hercules: Reproducing Crashes in Real-World Application Binaries},
Year = {2015},
Url = {http://dx.doi.org/10.1109/ICSE.2015.99}}
</code></pre></div></div>
<p>Published and presented at the <a href="http://2015.icse-conferences.org">2015 IEEE/ACM 37th IEEE International Conference on Software Engineering</a></p>Konstantin RubinovSolving the problems of vulnerability detection and reproducing crashes in real-world application binaries using symbolic execution and binary analysisThe last Word2014-05-10T00:00:00+00:002014-05-10T00:00:00+00:00https://futurezoom.in/opinions/the-last-word<p>John Gruber with the help of Aaron Shwarz relieved the pain of writing awkward
html to writing straightforward
<a href="http://daringfireball.net/projects/markdown/">Markdown</a>. Yes, yes, yes and
yes! Was it difficult? - I cannot know. Was it needed? - Yes!</p>
<!-- more -->
<p>From:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"entry-content"</span><span class="nt">><p></span>John Gruber with the help of Aaron Shwarz
relieved the pain of writing awkward html to writing straightforward
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://daringfireball.net/projects/markdown/"</span><span class="nt">></span>Markdown<span class="nt"></a></span>.
Yes, yes, yes and yes! Was it difficult? <span class="ni">&ndash;</span> I cannot know.
Was it needed? <span class="ni">&ndash;</span> Yes!<span class="nt"></p></span>
</code></pre></div></div>
<p>we’ve got:</p>
<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>John Gruber with the help of Aaron Shwarz relieved the pain of writing awkward
html to writing straightforward
<span class="p">[</span><span class="nv">Markdown</span><span class="p">](</span><span class="sx">http://daringfireball.net/projects/markdown/</span><span class="p">)</span>. Yes, yes, yes and
yes! Was it difficult? - I cannot know. Was it needed? - Yes!
</code></pre></div></div>
<p>In the following I will argue that before long <em>Markdown</em> will kill <em>Word</em>. I
am talking about <em>MS Word</em>. <em>Markdown</em> with all its
seemingly superficial simplicity has the power to throw such an
blow.</p>
<h2 id="prelude">Prelude</h2>
<p>We seemed to have been stuck with <em>Word</em> forever.</p>
<p>Except for things do not stay in one place. In the last decade a number of
species of text manipulation and formatting tools have become dramatically
better and fitter, though working with plain text (code) for computer programs.
<em>Word</em> seems to remain much the same and we seem to have become resigned to its
interface and behavior.</p>
<p>When I say dramatically better, I am looking into the direction of the modern
text and code editors and IDEs, tools that software developers and designers
use. Just look at <em>Sublime Text</em> and catching up <em>Atom</em> or <em>Coda2</em> – sleek,
extensible, fast.<sup id="fnref:2"><a href="#fn:2" class="footnote">1</a></sup> <em>Sublime Text</em>, for instance, has taken the best of what
is out there in code manipulation and put it into an appealing interface. Any
software developer or web designer who cares about her tools has a well-tuned
IDE or editor of choice.</p>
<p>Other alternatives to <em>Word</em> have been around since early Cenozoic times:
powerful text editors like <em>Vim</em> or <em>Emacs</em> are around for decades. Whereas
<em>LaTeX</em> – a typesetting system for formatting sophisticated articles – is
extensively used in scientific community since 1980s.<sup id="fnref:3"><a href="#fn:3" class="footnote">2</a></sup></p>
<h2 id="the-effort">The effort</h2>
<p>After working with <em>Markdown</em> documents for long enough, I
realized that Markdown-style text editing is a great middle point between
WYSYWIG and markup-based text processing. (I am aware of pro and contra
decoupling text manipulation from styling.) However, only now <strong>the effort of
working with markup-based solution is less than an effort of editing in WYSYWIG
mode</strong>. To me, this is a new spiral in a slow evolution of text manipulation
– a tipping point for adoption of Markdown-style text editing by general
users.</p>
<p>And it’s already there. <em>Markdown</em> kinds spread over the Web and are now
almost everywhere: Wikipedia, StackOverflow, Github, blogs (including this one)
to name a few. New stylish editors for Markdown appear:
<a href="http://mouapp.com">Mou</a>, <a href="http://ulyssesapp.com">Ulysses III</a>.</p>
<p>Why? Because <em>Markdown</em> is simple and adequate. You can type it in a <em>Notepad</em>
or on your phone and get a result of a <em>Word</em> value.<sup id="fnref:4"><a href="#fn:4" class="footnote">3</a></sup></p>
<h2 id="separation-of-concerns-content-structure-and-style">Separation of concerns: content, structure and style</h2>
<!-- This one is not new. No one needs to invent a wheel here. -->
<p><em>Markdown</em> allows you to focus on Content and Structure, and only on them.<sup id="fnref:5"><a href="#fn:5" class="footnote">4</a></sup>
Then you focus on Style, independently. Style is external to the content and it
can be flexibly adjusted. Have you even written a postcard? Didn’t you try out
wording on a scratch paper first?</p>
<p>There is still something we need to work on: <strong>How do we add style?</strong></p>
<p>Of course style can be in <em>CSS</em> – that is how we have it in the Internet –<br />
<code class="language-plaintext highlighter-rouge">Markdown -> HTML</code> + <code class="language-plaintext highlighter-rouge">CSS</code> = <code class="language-plaintext highlighter-rouge">Happy</code>. Except for <em>CSS</em> is not convenient to
learn or use by general users. There must be some visual editor that would help
them to tweak and adjust styling in a intuitive way. Ideally, tweaking should
humbly live in the <em>Markdown</em> editor and spit out <em>SASS</em> or <em>CSS</em> if asked.</p>
<p>Visual <em>CSS</em> editors start to appear. For instance,
<a href="http://www.skybound.ca">Stylizer</a> is tuned for intuitive style editing with
immediate feedback, though still not an option for anyone who does not know
<em>CSS</em>.</p>
<p><a href="http://decksetapp.com">Deckset</a> approaches <em>Markdown</em> styling from another
angle – it takes care of the style and generates styled presentations. You
focus on the content and the app provides you with predefined trendy styles
(that you can’t change, yet).</p>
<p>The solutions are out there to be put together. We don’t need <em>Word</em> anymore. We
are changing the way we think about text editing.</p>
<p>P.S.: Now that <em>Word</em> is sorted out, how do we go about <em>Excel</em>?</p>
<div class="footnotes">
<ol>
<li id="fn:2">
<p><a href="http://www.sublimetext.com">Sublime Text</a> and <a href="http://panic.com/coda/">Coda2</a> are not free, <a href="https://atom.io">Atom by Github</a> is <a href="#fnref:2" class="reversefootnote">↩</a></p>
</li>
<li id="fn:3">
<p>Forgot to mention – these are free. <a href="http://tug.ctan.org/tex-archive/macros/latex/contrib/elsarticle/doc/els2.pdf">Here’s one example of what <em>LaTeX</em> can produce</a> <a href="#fnref:3" class="reversefootnote">↩</a></p>
</li>
<li id="fn:4">
<p>More details about <em>Markdown</em> and tools for OSX on <a href="http://computers.tutsplus.com/tutorials/introducing-markdown-on-os-x--cms-20764">Tuts+</a> <a href="#fnref:4" class="reversefootnote">↩</a></p>
</li>
<li id="fn:5">
<p>You can separate them in <em>Word</em> as well, but only in the first edit. Once you’ve formatted your text in Word, all consecutive edits will require adjustment of Content, Structure and Style altogether. <a href="#fnref:5" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>Konstantin RubinovWe seemed to have been stuck with _Word_ forever. Except for things do not stay in one place.Run vertically2014-03-30T00:00:00+00:002014-03-30T00:00:00+00:00https://futurezoom.in/future/run-vertically<p>I’m no runner myself, however, once I received an essential
lesson about running. My cousin Alex told me - “Don’t run vertically, run
forward!”</p>
<p>– “What do you mean <em>forward</em>? How else can one run? Don’t I run forward
already?”
In the next two minutes with very little effort I could perceive what he meant.</p>
<!-- more -->
<p>– “You don’t just push upward. Focus on getting further forward with every kick.”
This was very easy to try. And it felt sooo different! I could feel the air
moving against my face and shoulders even though I was jogging! This felt
very different and new.</p>
<p>There is one difficulty to this technique. It has to be remembered. If you’re
a dilettante runner like myself, then by default you don’t think about this
‘trick’ and consequently you don’t use it. It requires continuous mental effort
to remember that you need to keep pushing forward. If not - you just forget doing that.</p>
<p>I believe that the same principle applies to my daily work: each action can
push me and those with me forward in a perceivable movement. And the same
difficulty applies too: if I don’t think actively about pushing forward, then I
may work without moving anywhere, jump on the same place, googling some useful
stuff, for instance.</p>
<p>I am convinced that with enough exercise “pushing forward” becomes a mental
habit. Needless to say, some work is needed.</p>
<p>P.S.: Try pushing forward when walking, it works.</p>Konstantin RubinovI’m no runner myself, however, once I received an essential lesson about running. My cousin Alex told me - “Don’t run vertically, run forward!” – “What do you mean forward? How else can one run? Don’t I run forward already?” In the next two minutes with very little effort I could perceive what he meant. – “You don’t just push upward. Focus on getting further forward with every kick.” This was very easy to try. And it felt sooo different! I could feel the air moving against my face and shoulders even though I was jogging! This felt very different and new. There is one difficulty to this technique. It has to be remembered. If you’re a dilettante runner like myself, then by default you don’t think about this ‘trick’ and consequently you don’t use it. It requires continuous mental effort to remember that you need to keep pushing forward. If not - you just forget doing that. I believe that the same principle applies to my daily work: each action can push me and those with me forward in a perceivable movement. And the same difficulty applies too: if I don’t think actively about pushing forward, then I may work without moving anywhere, jump on the same place, googling some useful stuff, for instance. I am convinced that with enough exercise “pushing forward” becomes a mental habit. Needless to say, some work is needed. P.S.: Try pushing forward when walking, it works.