<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>sergeydumik.com</title>
	
	<link>http://sergeydumik.com</link>
	<description />
	<lastBuildDate>Wed, 25 Jan 2012 13:31:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/sergeydumik" /><feedburner:info uri="sergeydumik" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/sergeydumik" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fsergeydumik" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item>
		<title>Thinking of full-featured iOS automation</title>
		<link>http://feedproxy.google.com/~r/sergeydumik/~3/mY6hSry2WVI/</link>
		<comments>http://sergeydumik.com/2012/01/25/full-featured-ios-automation/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 12:00:00 +0000</pubDate>
		<dc:creator>Sergey</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[QA]]></category>

		<guid isPermaLink="false">http://sergeydumik.com/?p=176</guid>
		<description><![CDATA[The purpose of this article is to share my experience of iOS automation as wide as possible. So that&#8217;s why I&#8217;m writing it in English. The other reason &#8211; I still can&#8217;t find the answers I need (on the Internet). So I&#8217;m happy to post MY research. The main question here is how to set up a continuously integrated [...]]]></description>
			<content:encoded><![CDATA[<p>The purpose of this article is to share my experience of iOS automation as wide as possible. So that&#8217;s why I&#8217;m writing it in English. The other reason &#8211; I still can&#8217;t find the answers I need (on the Internet). So I&#8217;m happy to post MY research. The main question here is how to set up a continuously integrated iOS automation. Because I think that &#8216;true&#8217; automation is supposed to require as little manual effort as possible. Bugs in code have to be discovered and fixed ASAP. So in my opinion it&#8217;s reasonable to run the test suite after each build.</p>
<p>I would not talk here about iOS automation basics. There are lots of good articles about that. So I&#8217;d better point the most distinguishing of them.<br />
<a href="http://answers.oreilly.com/topic/1646-how-to-use-uiautomation-to-create-iphone-ui-tests/" target="_blank">O&#8217;REILLY article</a><br />
<a href="http://alexvollmer.com/posts/2010/07/03/working-with-uiautomation/" target="_blank">Alex Vollmer &amp; tuneup_js library</a><br />
<a href="http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html" target="_blank">Apple&#8217;s UIAutomation documentation</a><br />
<a href="http://cocoamanifest.net/articles/2011/11/changes-to-ui-automation-in-ios-5.html" target="_blank">Changes to UIAutomation in iOS 5</a></p>
<p>We assume that we selected Instruments app + UIAutomation framework as our tool. I worked with this tool for some months and here what I can say about the advantages:</p>
<ul>
<li>Native Apple support</li>
<li>Works with iOS simulator as well as with real device</li>
<li>Simulation of user interactions (works from UI perspective)</li>
<li>Extensible API, so we can build the whole testing framework</li>
<li>We don&#8217;t need to incorporate any additional code in our app</li>
<li>Can be used in concert with other instruments such as memory leak checking</li>
</ul>
<p>The only disadvantage is that the tool is a bit buggy and raw (in my opinion). But almost every software is so <img src='http://sergeydumik.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  And one more thing. The tool is not supposed to work in continuous integration. But I think I solved that. And I want to share my solution with you.</p>
<p>At the beginning I had an iOS app that is used to get access to online backup system. It&#8217;s build process is automated using <a href="http://en.wikipedia.org/wiki/Bamboo_(software)" target="_blank">Bamboo</a>. There were some unit tests written in Xcode. The idea was to start working on functional regression testing. So I started with very simple framework built on top of tuneup_js library and error handling code provided on <a href="http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009771-CH1-SW1" target="_blank">Apple&#8217;s site</a>. Other prerequisites for starting the automation are:</p>
<ul>
<li>You have to build debug version of your app. For instance, if you are testing on iOS Simulator, you need an app file usually located here &lt;build-dir&gt;/build/Debug-iphonesimulator/&lt;appname&gt;.app  where &lt;build-dir&gt; is your main build dir and &lt;appname&gt; is the name of your app.</li>
<li>You have to specify accessibility labels for controls (buttons, fields etc) in your app using Interface Builder in Xcode (please read details in Alex Vollmer article) and set AccessibilityEnabled and ApplicationAccessibilityEnabled settings of iOS Simulator to TRUE (if you are testing on simulator) (please see below how to do it).</li>
</ul>
<p>OK, so I wrote an easy test that logs in to account, makes some assertions and quits:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">test<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Test 01&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>target<span style="color: #339933;">,</span> app<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//login screen init</span>
loginWindow <span style="color: #339933;">=</span> app.<span style="color: #660066;">mainWindow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
navBar <span style="color: #339933;">=</span> loginWindow.<span style="color: #660066;">navigationBar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
mainView <span style="color: #339933;">=</span> loginWindow.<span style="color: #660066;">scrollViews</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
loginField <span style="color: #339933;">=</span> mainView.<span style="color: #660066;">textFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;username&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
passField <span style="color: #339933;">=</span> mainView.<span style="color: #660066;">secureTextFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;password&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
loginButton <span style="color: #339933;">=</span> mainView.<span style="color: #660066;">buttons</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;loginbutton&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//login screen actions</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Log In&quot;</span><span style="color: #339933;">,</span> navBar.<span style="color: #000066;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
loginField.<span style="color: #660066;">setValue</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;login&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
passField.<span style="color: #660066;">setValue</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;password&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
loginButton.<span style="color: #660066;">tap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
loginButton.<span style="color: #660066;">waitForInvalid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//my computers screen init</span>
mainWindow <span style="color: #339933;">=</span> app.<span style="color: #660066;">mainWindow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
navBar <span style="color: #339933;">=</span> mainWindow.<span style="color: #660066;">navigationBar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
settingsButton <span style="color: #339933;">=</span> navBar.<span style="color: #660066;">leftButton</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
mainTable <span style="color: #339933;">=</span> mainWindow.<span style="color: #660066;">tableViews</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//my computers screen actions</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;My Computers&quot;</span><span style="color: #339933;">,</span> navBar.<span style="color: #000066;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
settingsButton.<span style="color: #660066;">tap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
settingsButton.<span style="color: #660066;">waitForInvalid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//settings screen init</span>
settingsWindow <span style="color: #339933;">=</span> app.<span style="color: #660066;">mainWindow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
navBar <span style="color: #339933;">=</span> settingsWindow.<span style="color: #660066;">navigationBar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
settingsTable <span style="color: #339933;">=</span> settingsWindow.<span style="color: #660066;">tableViews</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
logOutCell <span style="color: #339933;">=</span> settingsTable.<span style="color: #660066;">cells</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;Log Out&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//settings screen actions</span>
assertEquals<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Settings&quot;</span><span style="color: #339933;">,</span> navBar.<span style="color: #000066;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
logOutCell.<span style="color: #660066;">tap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
target.<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Let&#8217;s think &#8211; what will we need if we run this test after each build? Of course we need gathering and handling of test results! So that we will have the statistics: which error appeared/fixed in which build. When this script is running via command line version of Instruments we have the messages in console like:</p>

<div class="wp_syntax"><div class="code"><pre class="language" style="font-family:monospace;">2012-01-24 19:23:37 +0200 Start: Test 01
2012-01-24 19:23:38 +0200 Debug: target.frontMostApp().mainWindow().scrollViews()[0].textFields()[&quot;username&quot;].tap()
2012-01-24 19:23:38 +0200 Debug: target.frontMostApp().mainWindow().scrollViews()[0].secureTextFields()[&quot;password&quot;].tap()
2012-01-24 19:23:39 +0200 Debug: target.frontMostApp().mainWindow().scrollViews()[0].buttons()[&quot;loginbutton&quot;].tap()
2012-01-24 19:23:49 +0200 Error: &lt;My Computers&gt; but received &lt;Log In&gt;</pre></div></div>

<p>But Bamboo assumes to work with structured results, e.g. in JUnit format. And UIAutomation can&#8217;t produce such results. No problem! I wrote a <a href="http://sergeydumik.com/files/TxtToJunit.jar" target="_blank">Java solution</a> that converts the output of Instruments to JUnit-compatible xml (the usage is explained below). So we will have the xml like:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testsuite</span> <span style="color: #000066;">errors</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">failures</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">hostname</span>=<span style="color: #ff0000;">&quot;Mac OS X&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;RunTestSuite&quot;</span> <span style="color: #000066;">package</span>=<span style="color: #ff0000;">&quot;com.ios.tests&quot;</span> <span style="color: #000066;">tests</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">time</span>=<span style="color: #ff0000;">&quot;12&quot;</span> <span style="color: #000066;">timestamp</span>=<span style="color: #ff0000;">&quot;2012-01-24T19:23:37&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testcase</span> <span style="color: #000066;">classname</span>=<span style="color: #ff0000;">&quot;com.ios.tests&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Test 01&quot;</span> <span style="color: #000066;">time</span>=<span style="color: #ff0000;">&quot;12&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;failure</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Expected &amp;lt;My Computers&amp;gt; but received &amp;lt;Log In&amp;gt;&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;Failure&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
target.frontMostApp().mainWindow().scrollViews()[0].textFields()[&quot;username&quot;].tap()
target.frontMostApp().mainWindow().scrollViews()[0].secureTextFields()[&quot;password&quot;].tap()
target.frontMostApp().mainWindow().scrollViews()[0].buttons()[&quot;loginbutton&quot;].tap()
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/failure<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testcase<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testsuite<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>We also will need a .trace file that is used as parameter when launching tests from command line. I didn&#8217;t find a way to omit that <img src='http://sergeydumik.com/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />   That is a binary file created by Instruments app, so you&#8217;ll have to create you own. All you need is to open Instruments, select a proper target (the debug version of your app or some physical device) and save. But the issue here is that you&#8217;ll not be able to change the path to your target in any way  other than re-saving the .trace file. We are doing the continuos integration, you remember? <img src='http://sergeydumik.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  So the trick is to put the target file on your local machine in a folder that exactly equals to folder on build machine. And only after that select it in Instruments and save. Other issue with .trace file is that it is actually a folder, so I had problems when tried to save it to <a href="http://en.wikipedia.org/wiki/Apache_Subversion" target="_blank">SVN</a> and checkout again. The workaround is to zip this file and unzip during the automation testing process.</p>
<p>So here is my bash script that does all the magic:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#ensure xcode4 location is specified in /etc/path-to-xcode4.2</span>
<span style="color: #666666; font-style: italic;">#by this we assume that xcode4 is installed on current machine</span>
<span style="color: #007800;">XCODE</span>=<span style="color: #ff0000;">&quot;<span style="color: #780078;">`cat /etc/path-to-xcode4.2`</span>&quot;</span>; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$XCODE</span>&quot;</span> == <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;No suitable Xcode found&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span>; <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#alias for xcodebuild (of xcode4) with our project</span>
<span style="color: #007800;">xcodebuild</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #007800;">$XCODE</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>xcodebuild <span style="color: #660033;">-project</span> <span style="color: #ff0000;">&quot;appname.xcodeproj&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#alias for instruments (of xcode4)</span>
<span style="color: #007800;">instruments</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #007800;">$XCODE</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>instruments<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#ensure we have iphonesimulatorsdk &gt;= 5.0</span>
<span style="color: #007800;">SIMULATOR_SDK</span>=<span style="color: #ff0000;">&quot;<span style="color: #780078;">`$xcodebuild -showsdks | perl -ne 'next unless m/(-sdk iphonesimulator(\d+\.\d+))/; next unless $2 &gt;= 5.0; print &quot;$1\n&quot;; last'`</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$SIMULATOR_SDK</span>&quot;</span> == <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;error: iphonesimulatorsdk5.0 or later is not available.&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">2</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#build needed appname.app using iphonesimulatorsdk5.0 (not included in regular build)</span>
.<span style="color: #000000; font-weight: bold;">/</span>Tools<span style="color: #000000; font-weight: bold;">/</span>with-keychain CodeSigning.keychain <span style="color: #ff0000;">'password'</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$xcodebuild</span>&quot;</span> <span style="color: #660033;">-target</span> appname <span style="color: #660033;">-configuration</span> Debug <span style="color: #007800;">$SIMULATOR_SDK</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#location of needed appname.app file</span>
<span style="color: #007800;">appnameapp</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">/</span>build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphonesimulator<span style="color: #000000; font-weight: bold;">/</span>appname.app<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#setting Accessibility defaults to TRUE</span>
defaults <span style="color: #c20cb9; font-weight: bold;">write</span> ~<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>iPhone\ Simulator<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">5.0</span><span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Preferences<span style="color: #000000; font-weight: bold;">/</span>com.apple.Accessibility AccessibilityEnabled <span style="color: #660033;">-bool</span> TRUE
defaults <span style="color: #c20cb9; font-weight: bold;">write</span> ~<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>iPhone\ Simulator<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">5.0</span><span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Preferences<span style="color: #000000; font-weight: bold;">/</span>com.apple.Accessibility ApplicationAccessibilityEnabled <span style="color: #660033;">-bool</span> TRUE
&nbsp;
<span style="color: #666666; font-style: italic;">#unzip tests.trace</span>
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">777</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>tests.trace.zip
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>tests.trace.zip tests.trace<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #660033;">-d</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#run the test</span>
<span style="color: #ff0000;">&quot;<span style="color: #007800;">$instruments</span>&quot;</span> <span style="color: #660033;">-D</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>tests.trace <span style="color: #ff0000;">&quot;<span style="color: #007800;">$appnameapp</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>res.txt <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#convert res.txt to junit format</span>
java <span style="color: #660033;">-jar</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>TxtToJunit.jar .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>res.txt <span style="color: #000000; font-weight: bold;">&gt;</span> .<span style="color: #000000; font-weight: bold;">/</span>UIAutomation<span style="color: #000000; font-weight: bold;">/</span>result.xml
&nbsp;
<span style="color: #666666; font-style: italic;">#quit iOS Simulator</span>
osascript <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'tell application &quot;iPhone Simulator&quot; to quit'</span></pre></td></tr></table></div>

<p>I need to comment on the next things:</p>
<ul>
<li>I assume Xcode 4.2 or later is installed on build machine. In my case I was forced to work with exact version of Xcode (Xcodes 4 and 3 were installed side-by-side for some purposes) so that&#8217;s why path to Xcode 4.2 is specified in file /etc/path-to-xcode4.2 and is reading from that file. If it can&#8217;t be read, we exit the test (lines 5-6)</li>
<li>I also need iphonesimulatorsdk5.0 or later so I check for it&#8217;s presence in system (lines 15-19)</li>
<li>During the automation test process we are building the needed appname.app file (debug version) and we are using our CodeSigning.keychain file with all necessary Code Signing info (line 22)</li>
<li>We are also setting the accessibility settings for iOS Simulator (lines 28-29)</li>
<li>As you can see, in line 36 we are specifying the exact path to our app despite it&#8217;s specified already in tests.trace file. This is a &#8220;feature&#8221;. I can&#8217;t simplify this for now.</li>
</ul>
<p>So this bash script is saved in run_automation.sh file (in the main build dir) and is launched after each build of app. For that I&#8217;ve added 2 tasks on Bamboo (to existing build process): one for launching of &#8216;run_automation.sh&#8217; and another is task of &#8216;JUnit Parser&#8217; type (and I specified the folder where result.xml file will appear after the whole process).</p>
<p><a href="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/plans.png"><img src="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/plans.png" alt="" title="plans" width="600" class="aligncenter size-full wp-image-234" /></a></p>
<p>Another epic issue I encountered (that almost killed my hope to success) was access to &#8216;console&#8217;. So I found that in order to launch Instruments (with iOS Simulator) on remote machine you need your build user to be logged to console there. Let me explain. Usually (in Mac OS X) every remote user connects to some terminal (TTY) like s001, s002 etc. But there is also a possibility to connect to console (remotely). For instance, via VNC. If you go this way, use short-term trick &#8211; switch to &#8216;Login Window&#8217; back (using Fast User Switching) and quit VNC client. So in this case your user remains logged to console. You can discuss other ways with your IT administrator.</p>
<p><a href="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/oola_w1.png"><img class="aligncenter size-full wp-image-222" title="oola_w" src="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/oola_w1.png" alt="" width="542" height="117" /></a></p>
<p>So after solving all these blockers I&#8217;ve got working automation. You can login to Bamboo interface and view all the runs or manually trigger a new run.</p>
<p style="text-align: center;"><a href="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/bamboo.png"><img class="aligncenter size-full wp-image-226" title="bamboo" src="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/bamboo.png" alt="" width="600" /></a></p>
<p>But why I name this article &#8220;<b>Thinking</b> of full-featured iOS automation&#8221;? Because I&#8217;m thinking of further steps. In my vision it could be:</p>
<ul>
<li>Creating of data repository: accounts, pages, objects to verify etc (for instance using JavaScript objects)</li>
<li>Building the test framework on top of UIAutomation API</li>
<li>Writing the tests, grouping them in suites</li>
</ul>
<p>If you have any questions, please contact me.</p>
]]></content:encoded>
			<wfw:commentRss>http://sergeydumik.com/2012/01/25/full-featured-ios-automation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://sergeydumik.com/2012/01/25/full-featured-ios-automation/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=full-featured-ios-automation</feedburner:origLink></item>
		<item>
		<title>Закон Мура</title>
		<link>http://feedproxy.google.com/~r/sergeydumik/~3/OV7u8x7eIgU/</link>
		<comments>http://sergeydumik.com/2012/01/02/moore-law/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 11:58:56 +0000</pubDate>
		<dc:creator>Sergey</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[обо всём]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[Гордон Мур]]></category>

		<guid isPermaLink="false">http://sergeydumik.com/?p=165</guid>
		<description><![CDATA[автор изображения  Wgsimon С удивлением для себя узнал, что Закон Мура появился ещё в 1965 году &#8211; времени, когда формально компьютеров не было, а полупроводниковая отрасль лишь зарождалась. Какими же визионерскими качествами надо обладать, чтоб предсказать подобное! А ведь закон действует и по сей день&#8230; Впрочем, из Википедии: &#8220;В 2007 году Мур заявил, что закон, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/1000px-Transistor_Count_and_Moores_Law_-_2011.png"><img class="aligncenter size-full wp-image-168" title="1000px-Transistor_Count_and_Moore's_Law_-_2011" src="http://sergeydumik.com/wordpress/wp-content/uploads/2012/01/1000px-Transistor_Count_and_Moores_Law_-_2011.png" alt="" width="560" height="503" /></a>автор изображения  <a href="http://commons.wikimedia.org/wiki/User:Wgsimon" target="_blank">Wgsimon</a></p>
<p style="text-align: left;">С удивлением для себя узнал, что <a href="http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9C%D1%83%D1%80%D0%B0" target="_blank">Закон Мура</a> появился ещё в 1965 году &#8211; времени, когда формально компьютеров не было, а полупроводниковая отрасль лишь зарождалась. Какими же визионерскими качествами надо обладать, чтоб предсказать подобное! А ведь закон действует и по сей день&#8230;</p>
<p style="text-align: left;">Впрочем, из Википедии:<br />
&#8220;В 2007 году Мур заявил, что закон, очевидно, скоро перестанет действовать из-за атомарной природы вещества и ограничения скорости света.&#8221;</p>
<p style="text-align: left;">Нужно отдать должное инженерам Intel, одним из основателей которой был Мур. Intel сейчас &#8211; передовая компания по разработке чипов и, в основном благодаря её разработкам, закон до сих пор актуален.</p>
]]></content:encoded>
			<wfw:commentRss>http://sergeydumik.com/2012/01/02/moore-law/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sergeydumik.com/2012/01/02/moore-law/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=moore-law</feedburner:origLink></item>
		<item>
		<title>Шоссе</title>
		<link>http://feedproxy.google.com/~r/sergeydumik/~3/vEBYA_jFCHw/</link>
		<comments>http://sergeydumik.com/2012/01/01/road/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 18:51:37 +0000</pubDate>
		<dc:creator>Sergey</dc:creator>
				<category><![CDATA[вело]]></category>
		<category><![CDATA[MTB]]></category>
		<category><![CDATA[road]]></category>
		<category><![CDATA[Specialized]]></category>
		<category><![CDATA[мтб]]></category>
		<category><![CDATA[шоссе]]></category>

		<guid isPermaLink="false">http://sergeydumik.com/?p=139</guid>
		<description><![CDATA[Чем больше пробую шоссе и изучаю шоссейный велосипед, тем больше убеждаюсь, что это и есть настоящий, true, первозданный велосипед. Более &#8220;тру&#8221; только сингл-спид или фикс, но это не мой выбор. Я очень люблю горный велосипед, моя любимая гонка &#8211; Король Гор, также я хочу поехать на Трофи в этом году, и я даже интересуюсь даунхиллом [...]]]></description>
			<content:encoded><![CDATA[<p>Чем больше пробую шоссе и изучаю шоссейный велосипед, тем больше убеждаюсь, что это и есть настоящий, true, первозданный велосипед. Более &#8220;тру&#8221; только <a href="http://en.wikipedia.org/wiki/Single-speed_bicycle" target="_blank">сингл-спид</a> или <a href="http://cyclepedia.ru/content/chto-takoe-fiksed-gir" target="_blank">фикс</a>, но это не мой выбор. Я очень люблю горный велосипед, моя любимая гонка &#8211; <a href="http://www.velokiev.com/forum/viewforum.php?f=111" target="_blank">Король Гор</a>, также я хочу поехать на <a href="http://www.mtbtrophy.com/" target="_blank">Трофи</a> в этом году, и я даже интересуюсь даунхиллом и экстремальными видами катания, но ничто не манит меня больше, чем шоссе. Думаю, дело в ощущениях и самом шоссейном байке. Он является тем идеальным инструментом, что позволяет трансформировать всю твою энергию в скорость. Всё зависит только от тебя: тут нет подвески, которая может работать неправильно, нет техничных трасс с корнями и камнями, нет шин с плохим накатом, нет лишнего веса, словом, нет ничего лишнего. Есть только прямая зависимость между твоей силой и скоростью, которую ты можешь развить. А ощущения&#8230; раньше я не мог поверить, что по разбитым дорогам Киева и окрестностей можно с таким кайфом ездить на абсолютно жесткой вилке (карбон). Да и что вообще на велосипеде можно ездить так быстро!</p>
<p>Раньше я не представлял себе других велосипедов, кроме мтб. Не понимал, зачем они нужны. Но теперь появилось ощущение истоков, корней, понимание, что всё произошло от шоссе. Стандарный мтб вел &#8211; это вынужденно усиленный шоссер с тракторными шинами, созданный с целью езды по пересечённой местности и даунхилла. Что то вроде дани моде, обстоятельствам (когда зарождался мтб спорт). Конечно, он даёт массу новых возможностей и ощущений, но уводит от минималистичной концепции &#8211; перемещение из точки А в точку Б по дороге. Мтб можно сравнить с внедорожниками: вместо того, что перемещаться по городу на маленькой малолитражке, мы зачем то покупаем Ленд крузер.</p>
<p>Но ещё раз &#8211; ни в коем случае не умаляю достоинств мтб велосипеда и с нетерпением жду лета и жёстких горных трасс. Но пока &#8211; отлавливаю кайф на любимом карбоновом шосcере Specialized. Кстати, если зимы и дальше будут такими, я руками и ногами ЗА глобальное потепление! <img src='http://sergeydumik.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sergeydumik.com/2012/01/01/road/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sergeydumik.com/2012/01/01/road/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=road</feedburner:origLink></item>
		<item>
		<title>Компьютерная зависимость и наркомания</title>
		<link>http://feedproxy.google.com/~r/sergeydumik/~3/y-eCknoJmI0/</link>
		<comments>http://sergeydumik.com/2011/12/13/computer-addict/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 12:34:48 +0000</pubDate>
		<dc:creator>Sergey</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[обо всём]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[зависимость]]></category>
		<category><![CDATA[образ жизни]]></category>

		<guid isPermaLink="false">http://sergeydumik.com/?p=131</guid>
		<description><![CDATA[Видео проняло до глубины души. Долго не мог успокоиться. Раньше казалось, что компьютерная зависимость &#8211; это больше газетный термин, ну или из серии &#8220;бабки-гадалки&#8221;. Короче, миф. Теперь вижу, что всё намного серьёзнее. Но хочется понять &#8211; в чём же такая огромная сила притяжения? Ведь это не реальный наркотик, действующий физиологически. С другой стороны, видимо, именно [...]]]></description>
			<content:encoded><![CDATA[<p>Видео проняло до глубины души. Долго не мог успокоиться. Раньше казалось, что компьютерная зависимость &#8211; это больше газетный термин, ну или из серии &#8220;бабки-гадалки&#8221;. Короче, миф. Теперь вижу, что всё намного серьёзнее. Но хочется понять &#8211; в чём же такая огромная сила притяжения? Ведь это не реальный наркотик, действующий физиологически. С другой стороны, видимо, именно психологическая зависимость самая сильная &#8211; дело не в химических реакциях.</p>
<p><iframe src="http://www.youtube.com/embed/ibb9UsyFJPY" frameborder="0" width="480" height="360"></iframe></p>
<p>Ты никогда не бросишь курить и пить, если не хочешь. Любые заменители, типа делать это меньше, электронные сигареты, кодирование &#8211; бесполезны, я абсолютно уверен. Но виртуальный мир намного коварнее. Ведь его опасность неочевидна. Что плохого в том, чтоб замочить пару монстров или завести пару друзей в фейсбуке?</p>
<p>Мы зависимы от образа жизни, который не можем себе позволить. Виртуальные миры &#8211; туда же. Проблема в отсутствии собственного анализа ситуации и осознания ответственности за свои действия. Ведь намного проще копировать то, что делают другие, в надежде, что это приведёт к лучшей жизни. Примеры повсеместы. Дети, которые не могут наиграться в игрушки, выростают в подростков, которые &#8220;заводят семью&#8221; в 15 лет (и тут же её разрушают), а далее &#8211; студенты, списывающие из шпаргалок; машины, купленные в кредит. Ну и в особо тяжёлых случаях &#8211; покупка замков для любовницы просто  чтобы утереть кому то нос. Хотя нет, бывает хуже &#8211; политики, устраивающие войны чтоб потешить своё самолюбие.</p>
<p>Что же можно сделать? В случае с этим мальчиком вроде всё понятно: меньше баловать, мотивировать, добиваться разговоров по душам (вместо наказаний), развивать всесторонее. В глобальном же плане я выделю такие понятия как персональная ответственность, честность перед самим собой и &#8230; генетику. В смысле, тщательно выбирать с кем заводить детей, осознавать, что только ты ответственен за вложение в чадо базовых принципов морали. Ну и честность. Если ребенок заподозрит, что ты не откровенен с ним, он обязательно будет искать правду на стороне. Чем это закончится, догадаться несложно&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://sergeydumik.com/2011/12/13/computer-addict/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sergeydumik.com/2011/12/13/computer-addict/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=computer-addict</feedburner:origLink></item>
		<item>
		<title>Apple: управление и сознание</title>
		<link>http://feedproxy.google.com/~r/sergeydumik/~3/HCFbBKBtzSI/</link>
		<comments>http://sergeydumik.com/2011/12/08/apple-control-sense/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 11:24:07 +0000</pubDate>
		<dc:creator>Sergey</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Flipboard]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacBook Air]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://sergeydumik.com/?p=106</guid>
		<description><![CDATA[За последний год значительно изменились компьютеры в моей жизни. В основном благодаря Apple, которая просто перевернула мое представление о том, какие они бывают, как управляются, какие ощущения от использования они дают. Это же относится к iPhone. Можно сказать, Apple стремительно ворвалась в мою жизнь в этом году. Но обо всём по-порядку&#8230; В начале года я [...]]]></description>
			<content:encoded><![CDATA[<p>За последний год значительно изменились компьютеры в моей жизни. В основном благодаря Apple, которая просто перевернула мое представление о том, какие они бывают, как управляются, какие ощущения от использования они дают. Это же относится к iPhone. Можно сказать, Apple стремительно ворвалась в мою жизнь в этом году. Но обо всём по-порядку&#8230;</p>
<p>В начале года я был убеждённым поклонником Nokia, скептически относился к айфонам, но дома у меня стоял iMac (2007 года), который я купил чисто из любопытства. Расскажу про iMac: когда я вёз его домой, предвкушал чудо, но его не произошло. Да &#8211; красиво, да &#8211; быстрее, да &#8211; нет проблем с вирусами, да &#8211; меньше глюков (это всё в сравнении с миром PC). Что интересно, когда я попробовал Magic Mouse, мне стало сложнее управлять своим компьютером, но я мучался, думая, что со мной что-то не так, ведь особых жалоб на эту мышку я не слышал. Единственное, во что я влюбился сразу и безоговорочно, это корпус и дизайн компьютера в целом. Практически бесшумный, идеальная система охлаждения, приятный алюминий, продумана каждая мелочь, ну и так далее. Правда глянцевый экран не радовал &#8211; днём блики ощутимо мешали работать.</p>
<p>Затем я купил iPad (1й в максимальной версии). К планшетам я присматривался сравнительно давно, даже купил какую-то no-name поделку на Android 1.5, но она оказалась совершенно неюзабельной. Про iPad отовсюду слышны были восторженные отзывы и я решил попробовать. Собственно на этом и началась революция в моей голове. Я не мог поверить своим глазам и рукам! Насколько всё удобно, быстро, инновационно; шикарный экран, 10 часов работы даже в б/у планшете, безупречный дизайн. Особо поразили такие приложения как Twitter for iPad, Flipboard, Garage Band, iBooks &#8211; они дают совершенно новые ощущения от работы, о которых я даже не догадывался в мире настольных ПК. Ну и конечно Multi-touch.</p>
<p>Потом я понял, что на iPhone стоит такая же система. И всё сложилось просто отлично &#8211; в то время 4й айфон уже можно было купить по нормальной цене в Киеве. Дело в том, что предыдущие айфоны мне никогда не нравились по дизайну (корпусе в форме куска мыла). 4й же айфон, как известно, имеет бузупречный дизайн (доказано iPhone 4S). И конечно же, с первого дня я влюбился в этот телефон. Я совершенно согласен со Стивом, что &#8220;Apple reinvented the phone&#8221;. Так и есть: помимо форм-фактора, который стал стандартом де-факто, есть безумно удобное 2х-кнопочное управление. Честно, я не представляю себе на данный момент более удобного управления телефоном. Оно абсолютно интуитивно именно благодаря количеству, форме и расположению этих кнопок.</p>
<p>Ну а недавно произошло главное событие. MacBook Air 2011 года. Я совершенно уверен, что на данный момент это лучший в мире ноутбук. Не буду описывать его достоинства, они хорошо известны. Скажу лишь о трёх вещах, которые он изменил в моей компьютерной жизни:</p>
<ul>
<li>теперь у меня нет десктопа дома (и не думаю, что он понадобится)</li>
<li>теперь я почти не пользуюсь мышкой (только на PC, что бывает нечасто)</li>
<li>теперь я почти не использую PC на работе (впрочем тут заслуга не столь моего Air&#8217;а, сколь 17&#8243; MBP с 8 Gb оперативки, который мне удалось раздобыть в офисе)(а ещё я подумываю перейти на Air полностью, во всех сценариях использования компьютера в моей жизни, благо он это позволяет).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sergeydumik.com/2011/12/08/apple-control-sense/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sergeydumik.com/2011/12/08/apple-control-sense/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=apple-control-sense</feedburner:origLink></item>
	</channel>
</rss>

