a32.blog by Constantin BosneagaIts all about. IT and "stuff" :)
http://a32.me/
2016-05-06T15:12:43+01:00text/html2016-02-23T21:04:08+01:00http://a32.me/Constantin BosneagaHow I use WordPress with Git and Composer
http://a32.me/2016/02/how-i-use-wordpress-with-git-and-composer/
<p>Amazing approach! Read full article here http://www.whitewashing.de/2016/02/21/how_i_use_wordpress_with_git_and_composer.html</p>
<p> </p>
text/html2016-02-21T14:10:40+01:00http://a32.me/Constantin BosneagaDebugging REST API of Android App on Mac/Linux
http://a32.me/2016/02/debugging-android-app-with-rest-api-on-mac/
<p>Here is a task. There is Android application which uses some REST API over HTTP. This API is in refactoring phase and sometimes fails on random calls. Through application its not possible to understand the real reason. I need to intercept calls and see the details. How to do it with less blood? I am using Mac</p>
<p><span id="more-15885"></span></p>
<p>Here is the solution. Both devices (Android and Mac) should be connected to the same Wi-Fi spot.</p>
<h2>Configure Android</h2>
<p>First go to your Android Wifi connection settings and configure proxy server</p>
<p><a href="http://a32.me/wp-content/uploads/2016/02/proxy.png" rel="attachment wp-att-15886"><img class="aligncenter size-large wp-image-15886" src="http://a32.me/wp-content/uploads/2016/02/proxy-453x800.png" alt="proxy" width="453" height="800" srcset="http://a32.me/wp-content/uploads/2016/02/proxy-170x300.png 170w, http://a32.me/wp-content/uploads/2016/02/proxy-453x800.png 453w, http://a32.me/wp-content/uploads/2016/02/proxy.png 544w" sizes="(max-width: 453px) 100vw, 453px" /></a></p>
<p>Put <strong>IP address of you Mac</strong> and port for its default value <strong>8080</strong>.</p>
<h2>Run HTTP proxy</h2>
<p>Download a man-in-middle http proxy called <strong>mitmproxy (https://mitmproxy.org/).</strong> There are precompiled binaries for MacOS. Its console application with nice UI for capturing all HTTP requests, looking into details of request/response headers and body. It even can tamper the data.</p>
<p>By default port is 8080, so just run it on console.</p>
<p><a href="http://a32.me/wp-content/uploads/2016/02/mitmproxy-small.png" rel="attachment wp-att-15887"><img class="aligncenter size-large wp-image-15887" src="http://a32.me/wp-content/uploads/2016/02/mitmproxy-small-570x387.png" alt="mitmproxy-small" width="570" height="387" srcset="http://a32.me/wp-content/uploads/2016/02/mitmproxy-small-300x204.png 300w, http://a32.me/wp-content/uploads/2016/02/mitmproxy-small-570x387.png 570w, http://a32.me/wp-content/uploads/2016/02/mitmproxy-small.png 750w" sizes="(max-width: 570px) 100vw, 570px" /></a></p>
<p>Here is a full features list</p>
<ul class="simple">
<li>Intercept HTTP requests and responses and modify them on the fly.</li>
<li>Save complete HTTP conversations for later replay and analysis.</li>
<li>Replay the client-side of an HTTP conversations.</li>
<li>Replay HTTP responses of a previously recorded server.</li>
<li>Reverse proxy mode to forward traffic to a specified server.</li>
<li>Transparent proxy mode on OSX and Linux.</li>
<li>Make scripted changes to HTTP traffic using Python.</li>
<li>SSL certificates for interception are generated on the fly.</li>
<li>And much, much more.</li>
</ul>
<p>Happy debugging!</p>
text/html2016-01-21T14:12:16+01:00http://a32.me/Constantin BosneagaNow on HTTPS
http://a32.me/2016/01/now-on-https/
<p> </p>
<p>Now blog is accessible via HTTPS. There are couple of options nowadays to do it for free. I used the simpliest one.</p>
<p><span id="more-15892"></span></p>
<p>If you haven’t heard about CloudFlare, its time.</p>
<blockquote><p>Once your website is a part of the CloudFlare community, its web traffic is routed through our intelligent global network. We automatically optimize the delivery of your web pages so your visitors get the fastest page load times and best performance. We also block threats and limit abusive bots and crawlers from wasting your bandwidth and server resources. The result: CloudFlare-powered websites see a significant improvement in performance and a decrease in spam and other attacks.</p></blockquote>
<p><a href="http://a32.me/wp-content/uploads/2016/02/overview.png" rel="attachment wp-att-15893"><img class="aligncenter size-large wp-image-15893" src="http://a32.me/wp-content/uploads/2016/02/overview-570x259.png" alt="overview" width="570" height="259" srcset="http://a32.me/wp-content/uploads/2016/02/overview-300x136.png 300w, http://a32.me/wp-content/uploads/2016/02/overview-570x259.png 570w, http://a32.me/wp-content/uploads/2016/02/overview.png 720w" sizes="(max-width: 570px) 100vw, 570px" /></a></p>
<p>One of perk is that you can enable HTTPS just with one switch with ZERO configuration on site itself. CF takes all the dirty job itself. This way visitor talks to CloudFlare using HTTPS and CloudFlare talks to your site using HTTP.</p>
<p>All this comes for free with basic account.</p>
<p>Not a 100% bullet proof, I can’t recommend this setup for any e-commerce site, but for a small blog it does the thing.</p>
<p>Other perks are you got free DNS hosting, site caching, site is down protection etc..</p>
<h2>WordPress tuning</h2>
<ul>
<li>Be sure to read specific article https://support.cloudflare.com/hc/en-us/articles/201717894-Using-CloudFlare-and-WordPress-Five-Easy-First-Steps</li>
<li>Its good idea to force login to SSL
<ul>
<li>define(‘FORCE_SSL_LOGIN’, true);</li>
</ul>
</li>
<li>Install “SSL Insecure Content Fixer” plugin to overcome mixed content warning with images and other content.</li>
</ul>
text/html2014-03-06T12:56:32+01:00http://a32.me/Constantin BosneagaHeredoc variable with Javascript
http://a32.me/2014/03/heredoc-multiline-variable-with-javascript/
<p>Javascript is amazing in terms of unobvious features. Sometimes it solves your problem in way you never think of.</p>
<p>In this case I need a small HTML template to be included into my very simple JS project. Since template is multi-line I want to edit it as-is and dont mess with “+” on each line. Here is a simple and elegant solution:</p>
<p><span id="more-4534"></span></p>
<p>Using the following function:</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> hereDoc<span style="color: #009900;">(</span>f<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000066; font-weight: bold;">return</span> f.<span style="color: #660066;">toString</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.
<span style="color: #660066;">replace</span><span style="color: #009900;">(</span><span style="color: #009966; font-style: italic;">/^[^\/]+\/\*!?/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">)</span>.
<span style="color: #660066;">replace</span><span style="color: #009900;">(</span><span style="color: #009966; font-style: italic;">/\*\/[^\/]+$/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span></pre></td></tr></table></div>
<p>You can have here-documents like this:</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> tennysonQuote <span style="color: #339933;">=</span> hereDoc<span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span><span style="color: #006600; font-style: italic;">/*!
This is HTML template,
With second line,
and no "+" on each line
*/</span><span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>The method has successfully been tested in the following browsers (not mentioned = not tested):</p>
<ul>
<li>IE 4 – 10</li>
<li>Opera 9.50 – 12 (not in 9-)</li>
<li>Safari 4 – 6 (not in 3-)</li>
<li>Chrome 1 – 27</li>
<li>Firefox 17 – 21 (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString#Notes">not in 16-</a>)</li>
<li>Rekonq 0.7.0 – 0.8.0</li>
<li><em>Not supported in Konqueror 4.7.4</em></li>
</ul>
<p>Be careful with your minifier, though. It tends to remove comments. For the <a href="http://www.julienlecomte.net/yuicompressor/README">YUI compressor</a>, a comment starting with <code>/*!</code> (like the one I used) will be preserved.</p>
<p>Don’t want to bother with regexp? Use KISS version:</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> myString <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">{</span><span style="color: #006600; font-style: italic;">/*
This is some
awesome multi-lined
string using a comment
inside a function
returned as a string.
Enjoy the jimmy rigged code.
*/</span><span style="color: #009900;">}</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">(</span><span style="color: #CC0000;">14</span><span style="color: #339933;">,-</span><span style="color: #CC0000;">3</span><span style="color: #009900;">)</span></pre></td></tr></table></div>
<h2>The right way</h2>
<p>This solution sounds like a hack, for serious project I would recommend using any <a href="https://www.google.ca/search?q=Javascript+template+library" target="_blank">Javascript template library</a> available.</p>
text/html2013-08-06T21:00:33+01:00http://a32.me/Constantin BosneagaРаботаем на oDesk: Как же всё таки получить работу?
http://a32.me/ru/2013/08/rabotaem-na-odesk-kak-zhe-vsjo-taki-poluchit-rabotu/
<p style="text-align: justify;"><a href="http://a32.me/wp-content/uploads/2013/08/Job-Search-Tips-for-2011.jpg"><img class="alignleft size-thumbnail wp-image-4135" alt="Job-Search-Tips-for-2011" src="http://a32.me/wp-content/uploads/2013/08/Job-Search-Tips-for-2011-150x150.jpg" width="150" height="150" /></a>В настоящий момент я активно не работаю на oDesk, но имея 800+ часов хочу поделиться опытом. А именно как же получить заказ.</p>
<p style="text-align: justify;"><strong>Сопроводительное письмо</strong> это первый и возможно единственный шанс удивить потенциального клиента или работодателя. Но не пугайтесь. На самом деле сопроводительное письмо это возможность показать себя с лучшей стороны. Оно дает работодателю краткое введение в потенциальный успех, который вы несете за собой. Ваш опыт, личные характеристики и энтузиазм – все это играет роль в получении желаемой работы. Не забывайте об этих данных при оставлении сопроводительного письма.</p>
<p style="text-align: justify;">Как составлять сопроводительное письмо? В общем, пишите честно, искренне и профессионально. Следуйте нижеуказанным простым принципам чтобы создать впечатляющее сопроводительное письмо и работодатель будет просто не в силах устоять перед ним!</p>
<p style="text-align: justify;"><span id="more-3214"></span></p>
<ul style="text-align: justify;">
<li><strong>Начинайте с теплого и официального приветствия.</strong> Работодатель рассматривает вас в качестве потенциального сотрудника, так что способствуйте тому, чтобы он думал о вас как о человеке с которым было бы неплохо поработать. Здесь подойдет <em>«Уважаемый г-н Иванов»</em>, <em>«Уважаемый Иван Иванович»</em> или <em>«Господин Иванов»</em>. Неформальных выражений типа <em>«Привет Иван»</em>, <em>«Как поживаешь Иван?»</em> и им подобных, следует избегать. Вы не знаете имя человека, который решает нанимать вас или нет? «Уважаемый менеджер по набору персонала» – вполне профессиональный тон для хорошего начала.</li>
<li><strong>Сразу к делу.</strong> Ваша сопроводиловка это не роман о победах и поражениях. Достаточно дать работодателю знать о причине вашей заинтересованности, кто вы, какими навыками обладаете, почему он должен нанять именно вас, ссылку на более подробную информацию о вас и вашем опыте работы: <em>«Я заинтересован в вакансии «главный блоггер», которую вы недавно открыли. Я профессиональный писатель с опытом работы девять лет и хорошо знаком с работой в WordPress и Typepad. В течение трех лет я работал главным редактором в BeingInterested, под моим руководством находилась группа писателей, которые делали 5 публикаций в неделю. Вы можете ознакомится с моей работой в портфолио (www.——.com/users/~~…)»</em></li>
<li><strong>Фокусируйтесь на основном.</strong> Большинство вакансий четко указывают желаемые навыки, которыми должен обладать кандидат на должность. Если у вас есть такие навыки -укажите их. Тем самым вы повторите требования работодателя и покажете что вы соответствуете всем критериям и являетесь именно тем, кого работодатель ищет: <em>«Вы указали что ищете человека с опытом работы в журналистике и написании творческих текстов. В колледже я изучал оба предмета в рамках своей специализации «Английский язык и литература». Я начинал свою карьеру с должности ассистента редактора в местной газете, где я на практике научился расследовательскому журнализму».</em></li>
<li><strong>Следуйте указаниям.</strong> Большинство потенциальных работодателей просят кандидатов ответить на какой-либо вопрос или написать что-нибудь конкретное в письме. Это делается для того чтобы они могли быстро просмотреть некоторые заявки и отсеять банальные резюме, авторы которых использовали старое доброе «копи-пасте». Если вас просят ответить на вопрос в письме или вставить ключевое слово в тексте, не забудьте это сделать! В качестве дополнительного преимущества можно отдельно указать об этом, что в свою очередь существенно упростит процесс принятия решения работодателем в вашу пользу, например: <em>«Согласно вашей просьбе, вот три ссылки на мои статьи на тему местных событий, садоводства или технологий…»</em></li>
<li><strong>Замкните круг.</strong> Обязательно дайте им знать о вашем графике и пригласите их обсудить работу более подробно. В том что вы «просите о работе» и усиливаете свое намерение работать именно с этим работодателем нет ничего плохого: <em>«Я могу выделить 15 часов в неделю для вашей компании, количество часов в день обговаривается. Я буду рад помочь вам сделать блог успешным. Пожалуйста, свяжитесь со мной напрямую чтобы обсудить данную вакансию более подробно».</em></li>
<li><strong>Прочтите, отредактируйте и обдумайте.</strong> Перед нажатием «отправить» еще раз прочтите описание вакансии. Вы указали информацию по всем критериям? Если бы вы были работодателем, вы бы наняли себя на основании вашего сопроводительного письма? Ваши данные и портфолио соответствуют вашему письму? (Если нет, не подавайте заявку! Поберегите силы для той должности, которая больше подходит вашим навыкам и способностям.) Если вы не уверены, попросите друга просмотреть вакансию и ваше сопроводительное письмо и внимательно выслушайте его, он может подсказать и увидеть то, что вы упустили и то, что поможет вам получить эту работу!</li>
</ul>
<p style="text-align: justify;">Сопроводительное письмо это первый взгляд на то, что вы из себя представляете, так что прилагайте максимум усилий при его написании.</p>
<p style="text-align: justify;">С каждым разом текст письма будет получаться все лучше и лучше. С тех пор как я стал серьезно относиться к тексту, я стал получать намного больше заказов. Обычно после отправки письма, я почти всегда получал открытие контракта.</p>
<p style="text-align: justify;">Сейчас я могу получить практически любой заказ. А все потому что пишу то, что хочет видеть клиент.</p>
<p style="text-align: justify;">
text/html2013-05-31T07:26:47+01:00http://a32.me/Constantin BosneagaПоход по реке Реут от Оргеева до впадения в реку Днестр (Устия)
http://a32.me/ru/2013/05/pohod-po-reke-reut-ot-orgeeva-do-vpadenija-v-reku-dnestr-ustija/
<p><strong><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0687.jpg"><img class="alignleft" alt="DSC_0687" src="http://a32.me/wp-content/uploads/2013/05/DSC_0687-1024x680.jpg" width="231" height="153" /></a>Гостевой пост! </strong>Как-то в одинадцатом году мы сходили <a title="Пешком вдоль р. Реут – от Оргеева до Днестра" href="http://a32.me/ru/2011/05/along-reut-river/">в замечательный поход по Реуту. </a>В этом году, пока я отсиживаюсь по канадам, мои друзья повторили наш маршрут. Надо сказать что именно весной, в начале Мая, когда уже жарко, но зелень еще не успела сгореть на солнце, этот маршрут особенно впечатляет видами. Далее, рассказ от первого лица:</p>
<p>Участвовали три человека: ваш покорный слуга – Вик, мой сын Дима и верный соратник и друг Саша.</p>
<p><span id="more-3893"></span></p>
<p>Договорились еще в начале весны пройтись пешим походом вдоль реки Реут. Запланировали на начало мая, как раз у Димы каникулы начинаются. Сын никак дождаться не мог, всё время: когда, да когда, до этого он так, с ночёвкой, по-взрослому и на большие расстояния ещё не ходил.</p>
<p>В конце концов, хотя и планировали заранее, получилось все спонтанно. Позвонил Саша и предложил встретиться у автовокзала. Не рассчитали, что конец недели и в Оргеев из Кишинева масса народа ломится. Поэтому и к автовокзалу позже запланированного добрались, и оттуда еле выехали. Маршрутки переполненные, с трудом уехали.</p>
<p>В Оргееве вышли около пешеходного моста. И сразу пожалели, что взяли с собой запас воды. Прямо рядом с мостом большой сильный родник, вода вкуснейшая и, как сказали местные, очень чистая, ее там все набирают. Поэтому решили вылить «городские» запасы и набрать родниковой.</p>
<p>Маршрут с этого места и начали, пошли сразу же вдоль реки, но по верху. Природа красивейшая, речка петляет, к вечеру солнце уже совсем не пекло и светило в спину.<br />
<a href="http://a32.me/wp-content/uploads/2013/05/DSC_0272.jpg"><img class="aligncenter size-large wp-image-3898" alt="DSC_0272" src="http://a32.me/wp-content/uploads/2013/05/DSC_0272-1024x680.jpg" width="550" height="365" srcset="http://a32.me/wp-content/uploads/2013/05/DSC_0272-300x199.jpg 300w, http://a32.me/wp-content/uploads/2013/05/DSC_0272-1024x680.jpg 1024w, http://a32.me/wp-content/uploads/2013/05/DSC_0272-570x379.jpg 570w, http://a32.me/wp-content/uploads/2013/05/DSC_0272.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Если идти от Лазо до Фурчен, то лучше перейти на правый берег, иначе за Лазо река делает громадный крюк влево, а потом снова возвращается обратно и топать приходится намного больше, а, в итоге, проходишь совсем немного. Правда, придется подниматься в горку, а это не так просто, особенно мне, при довольно внушительной комплекции.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/IMG_6945.jpg"><img alt="IMG_6945" src="http://a32.me/wp-content/uploads/2013/05/IMG_6945-1024x768.jpg" width="550" height="412" /></a></p>
<p>А вот после Фурчен Реут делает такой же крюк, но тут уже лучше идти вдоль реки. Во-первых, очень красивый вид, во-вторых путь не сложный, а, в третьих, срезать его придется через лесок, поэтому точно не поймёшь, куда в итоге выйдешь. Тем более мы шли, когда уже темнеть начинало.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0280.jpg"><img class="aligncenter size-large wp-image-3899" alt="DSC_0280" src="http://a32.me/wp-content/uploads/2013/05/DSC_0280-1024x680.jpg" width="550" height="365" srcset="http://a32.me/wp-content/uploads/2013/05/DSC_0280-300x199.jpg 300w, http://a32.me/wp-content/uploads/2013/05/DSC_0280-1024x680.jpg 1024w, http://a32.me/wp-content/uploads/2013/05/DSC_0280-570x379.jpg 570w, http://a32.me/wp-content/uploads/2013/05/DSC_0280.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Шли до самой темноты. Место стоянки выбрали на горке. Ребятам поднялись легко, а мне в гору пришлось через каждый десяток шагов отдыхать, к тому же и до этого прошли не мало.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0516.jpg"><img class="aligncenter size-large wp-image-3901" alt="DSC_0516" src="http://a32.me/wp-content/uploads/2013/05/DSC_0516-1024x678.jpg" width="550" height="364" srcset="http://a32.me/wp-content/uploads/2013/05/DSC_0516-300x198.jpg 300w, http://a32.me/wp-content/uploads/2013/05/DSC_0516-1024x678.jpg 1024w, http://a32.me/wp-content/uploads/2013/05/DSC_0516-570x377.jpg 570w, http://a32.me/wp-content/uploads/2013/05/DSC_0516.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Палатку никакую мы не брали, спали на подстилках, ничуть не пожалели. В темноте её ставить бы тяжело было, а всю дорогу на спине таскать. Димка вообще доволен был, никогда раньше под открытом небом не ночевал.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0289.jpg"><img class="aligncenter size-large wp-image-3900" alt="DSC_0289" src="http://a32.me/wp-content/uploads/2013/05/DSC_0289-1024x680.jpg" width="550" height="365" srcset="http://a32.me/wp-content/uploads/2013/05/DSC_0289-300x199.jpg 300w, http://a32.me/wp-content/uploads/2013/05/DSC_0289-1024x680.jpg 1024w, http://a32.me/wp-content/uploads/2013/05/DSC_0289-570x379.jpg 570w, http://a32.me/wp-content/uploads/2013/05/DSC_0289.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Развели небольшой костёр, благо сухих сучьев рядом было много. Весной комарики и всякая мошкара еще не проснулась и сидеть у костра особенно приятно.</p>
<p>Утром умылись из речки, потом решили искупаться, вода после ночи очень даже неплохой оказалась. Разожгли костер, сварили кофе (брали с собой не котелок, а небольшой чайник), завтракали хлебом, консервами и овощами, прихваченными из дома.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0170.jpg"><img alt="DSC_0170" src="http://a32.me/wp-content/uploads/2013/05/DSC_0170-1024x730.jpg" width="550" height="392" /></a></p>
<p>Выйти дальше получилось только в половине десятого утра. Шли легко, дорога идет под уклон , но вот сам спуск к реке трудный, поэтому пришлось отдохнуть. А еще и солнце теперь уже светило в глаза (обязательно нужны головные уборы с широкими козырьками) и жарило нещадно. Отдыха себе почти не позволяли, поэтому, пока дошли до Требужен очень устали.</p>
<p>Там напились из колодца и пополнили запас воды. Село очень красивое из-за местности, стоит прямо под горой, дома красиво выглядят, даже магазин оригинальный.<br />
<a href="http://a32.me/wp-content/uploads/2013/05/DSC_0726.jpg"><img alt="DSC_0726" src="http://a32.me/wp-content/uploads/2013/05/DSC_0726-1024x680.jpg" width="550" height="365" /></a></p>
<p>Купили у местного жителя брынзу, лук и вино. Он пригласил с брынзой и вином у него посидеть. Народ очень отзывчивый, приятный.</p>
<p>После обеда снова пришлось подниматься в горку и там отдыхать – подъем вроде бы кажется пологим, но на самом деле устаешь. И подремали, и просто посидели, поговорили. Вид с горки открывается отличный.</p>
<p>Вообще по всему маршруту замечательные виды. Левый берег овражистый, крутой, а по правому почти везде леса.<br />
Вечером проходили мимо села Машкауц, увидели памятный знак. Оказывается этому селу чуть ли не 600 лет – основано в 1436 году.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0770.jpg"><img alt="DSC_0770" src="http://a32.me/wp-content/uploads/2013/05/DSC_0770-1024x897.jpg" width="550" height="481" /></a></p>
<p>Ночевали на поляне в сосновом лесу, ссверху вид на мост через реку, на само село.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0748.jpg"><img alt="DSC_0748" src="http://a32.me/wp-content/uploads/2013/05/DSC_0748-1024x680.jpg" width="550" height="365" /></a></p>
<p>Выдвигались с утра пораньше, часов в 8, а к полудню были уже на Днестре. Искупаться не удалось, на месте слияния Реута с Днестром просто негде, да и устали порядочно. Но это такая хорошая усталость была. Довольны остались все, хотя и домой уже хотелось.</p>
<p>Плюсы:<br />
красивые каньоны, таких больше нигде не увидишь;<br />
повсюду зелень;<br />
виды речки;<br />
птички, зверушки, всякие ящерицы, а в реке видели пару змей.<br />
Минусов практически нет, кроме жаркого солнца. И ещё, несмотря на то, что обувь была удобной, волдыри натёрли, хорошо, что лейкопластырь с собой был.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/05/DSC_0687.jpg"><img class="aligncenter size-large wp-image-3902" alt="DSC_0687" src="http://a32.me/wp-content/uploads/2013/05/DSC_0687-1024x680.jpg" width="550" height="365" srcset="http://a32.me/wp-content/uploads/2013/05/DSC_0687-300x199.jpg 300w, http://a32.me/wp-content/uploads/2013/05/DSC_0687-1024x680.jpg 1024w, http://a32.me/wp-content/uploads/2013/05/DSC_0687-570x379.jpg 570w, http://a32.me/wp-content/uploads/2013/05/DSC_0687.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>До новых встреч!</p>
text/html2013-05-30T21:00:55+01:00http://a32.me/Constantin BosneagaЯ прочел: Брэнсон Ричард – “Теряя невинность”
http://a32.me/ru/2013/05/%d1%8f-%d0%bf%d1%80%d0%be%d1%87%d0%b5%d0%bb-%d0%b1%d1%80%d1%8d%d0%bd%d1%81%d0%be%d0%bd-%d1%80%d0%b8%d1%87%d0%b0%d1%80%d0%b4-%d1%82%d0%b5%d1%80%d1%8f%d1%8f-%d0%bd%d0%b5%d0%b2%d0%b8/
<p>Скорее даже не прочел, а прослушал. Книга написана самим Брэнсоном, читается на удивление легко и живо. Не скажу, что он правильный пример бизнесмена для подражания, но кто определял понятие “правильный”? В книге много интересных мыслей, описание приключений и крутых жизненных поворотов. Все это с хорошей долей юмора.</p>
<p>Слушать книги не люблю, всегда предпочитаю найти в формате fb2 и читать с планшета. Однако в этом случае, нашел только mp3 и обнаружил гигантский запас времени который выпадает из жизни, когда мы ходит в магазин, на работу, обедаем, стоим в очереди, итд. Используя это время для прослушивания чего-то полезного, получаешь хороший объем информации без заметных усилий.</p>
<p>Теперь я всегда цепляю наушники когда выхожу из дома, на всякий случай.</p>
text/html2013-05-27T21:00:05+01:00http://a32.me/Constantin BosneagaHow I lost and recovered my photo collection in Africa trip
http://a32.me/2013/05/how-i-lost-and-recovered-my-photo-collection-in-africa-trip/
<p>After some very successful photo sessions in Africa, my collection counted like 2000 photos. I was quite happy since most of them were good to show to my friends.</p>
<p>Once in the evening I open my Picture folder in Ubuntu and found that it is empty. Completely empty, nothing was there. I was totally destroyed, shocked.</p>
<p>But I stayed optimistic, since nothing is lost without tracks, even in some cases it is very hard to destroy piece of information.</p>
<p><span id="more-3378"></span></p>
<p>I found out that undelete does not work well on ext4. Some undelete utility found nothing on that drive related to recently lost file. Looking for other undelete programs I found whole another bunch of restore programs that work based on file signatures.</p>
<p>These programs analyses your HD like a flat file, looking for common signatures of JPEG or other files and tried to restore them.</p>
<h2>Meet foremost</h2>
<p>Foremost is a console program to recover files based on their headers, footers, and internal data structures. This process is commonly referred to as <strong>data carving</strong>. Foremost can work on image files, such as those generated by dd, Safeback, Encase, etc, or directly on a drive.</p>
<p>Most important rule: Do not restore to the same drive. Basically you want to touch source drive as little as possible.</p>
<blockquote><p>$ foremost -t jpg -i /dev/sda5 -o /mnt/restore/</p></blockquote>
<p>/dev/sda5 – is partition that holds my /home partition, /mnt/restore is another partition on same drive to hold restored images. Be sure that target directory can room all restored files, because it restored <strong>everything</strong>, is it deleted or not.</p>
<h2>Filtering photos</h2>
<p>After one night work, it restored thousands of files. That included all not really useful images as well, like my browser cache.</p>
<p>To filter only needed one I grep collection using camera ID stored in EXIF part of picture, using this command:</p>
<blockquote><p>$ find /mnt/restore/* -exec grep -L “PowerShot G12” {} \; | xargs -L 10 /bin/rm</p></blockquote>
<p>It removed all photos where “PowerShot G12” was not found inside. My collection was almost intact, except several files and fact that I had to sort it in folders once again.</p>
<p>Voila!</p>
<p>You can found out more on official Data recovery page here <a href="http://help.ubuntu.com/community/DataRecovery">http://help.ubuntu.com/community/DataRecovery</a></p>
text/html2013-05-20T21:00:10+01:00http://a32.me/Constantin BosneagaЯ прочел: В. Ким Чан и Рене Моборн – “Стратегия голубого океана”
http://a32.me/ru/2013/05/ja-prochel-v-kim-chan-i-rene-moborn-strategija-golubogo-okeana/
<p>Вдумайтесь: все ниши уже заняты, все рынки переполнены конкурентными продуктами, все смартфоны выглядят одинаково, все авиа-компании предлагают одни и те же услуги, все знают примерный размер порции в фастфуде и даже высота стаканов с «колой» строго регламентирована. Конкуренция на таких рынках заключается только в том, как сделать «сильнее, выше, быстрее» свой продукт и при этом «пустить кровь» конкуренту. В этой маркетинговой «крови» захлебываются отделы продаж и топ-менеджеры больших корпораций, а малый бизнес занят только тем, что пытается слепо подражать своим крупным «собратьям» по рынку.</p>
<p>Такая картина и получила название <strong>«алого океана»</strong>: места, где все грызут друг другу глотки за место под солнцем, пытаясь бесконечно улучшать одинаковый продукт, только завернутый в 10 разных по цвету и форме упаковок.</p>
<p>Но уже в начале 90-х годов ХХ века начинают появляться (а далее их становится всё больше) так называемые <strong>«голубые океаны»</strong>. Это участки / сферы / сегменты бизнеса (и даже целые новые индустрии), в которых нет конкурентной «резни» по той простой причине, что и самих конкурентов в них… НЕТ.</p>
<p><span id="more-3293"></span></p>
<h3>5 уроков «Стратегии голубого океана», которые я извлек после прочтения</h3>
<ul>
<li><strong>Современный бизнес может (и должен) быть «экологичным»</strong>. Новым компаниям (даже маленьким) нет смысла вести войну и «загрязнять» рынок маркетинговой шелухой и копиями уже сделанных и всем приевшихся продуктов, если можно создать собственный продукт.</li>
<li><strong>Идеи находятся вокруг вас</strong> и подсказать вам их может даже незначительная особенность продукта / рынка/ услуги, на которую до вас обращали внимание клиенты / пользователи, но не сами компании-производители.</li>
<li><strong>Деньги можно зарабатывать там, где другие предпочитают их терять</strong> или вообще не ищут. Отказ от многих привычных технологий и бизнес-процессов может открыть для вашей компании новую нишу.</li>
<li>Вместо того, чтобы запустить еще один СМИ-проект / еще один интернет-магазин / еще одну закусочную / еще один стартап «как фейсбук, только с инстаграммом», <strong>подумайте, чего вам самим не хватает на рынке</strong>: этот товар или эта услуга и должны быть реализованы вами, если вы решили заняться бизнесом.</li>
<li><strong>Схемы и наглядные расчеты помогут вам</strong> оценить не только риски и издержки, но и спрогнозировать дальнейший путь вашей компании (и кто знает — может быть, даже помогут открыть ваш собственный «голубой океан»)7</li>
</ul>
<h3>Кому рекомендую прочесть</h3>
<p><strong>Бизнесменам</strong> (особенно начинающим) — чтобы пока не поздно, избрать неизбитый путь развития.</p>
<p><strong>Преподавателям экономических вузов</strong> — чтобы не приводить своим студентам скучные и избитые примеры «крупных и успешных» (всё равно 9/10 ваших студентов не создадут корпораций масштаба Microsoft или Ford Motors, так перестаньте же их накачивать заведомо невыполнимыми целями и примерами бизнес-величия!)</p>
<p><strong>Авторам стартапов</strong> — чтобы не создавать очередной клон групона, фейсбука, твиттера или инстаграмма вместе взятых с претензией на мировое господство, а изучить понятие рыночной ниши и обратить внимание на насущные потребности, которые можно решить при помощи онлайн-технологий (помните, что покупать еду, следить за собой и выбирать вещи люди будут всегда, даже тогда, когда закончится мода на всеобщую «вебдванольность» и «лайки ради лайков»).</p>
<p><strong>Маркетологам</strong> — чтобы понять, что правила «больше бюджет — лучше продажи» больше не существует, а есть множество других куда более эффективных способов добиться успеха для компании ( и среди них — перестать плавать в «алом океане»).</p>
text/html2013-05-13T21:00:59+01:00http://a32.me/Constantin BosneagaDiscover PHP bottlenecks with Xdebug or why my site is so slow
http://a32.me/2013/05/discover-php-bottlenecks-with-xdebug-or-why-my-site-is-so-slow/
<p>In this article you will learn about the possible use xdebug by system administrators of web-servers.</p>
<p>If you administer a web-server, often face problems that ordinary users of the site called “slow” or “dead-slow” Of course, this is a very important issue that could have serious financial consequences for the website owner. This formulation is sufficient to begin the investigation.</p>
<p><span id="more-3868"></span></p>
<p><!--more-->Interestingly, the reasons for these problems may be hidden almost anywhere. And these causes can be several, but the problems themselves may be difficult to reproduce. The fact that ultimately the user classifies as a “slow” on the lower level can be:</p>
<ul>
<li>Delays in network access link to the site</li>
<li>Hardware problems on the server</li>
<li>Insufficient amount of server resources</li>
<li>Not optimally tuned operating system</li>
<li>Not optimally configured software</li>
<li>Problems with access to outside resources, access to which is implemented synchronously</li>
<li>Not optimally written code</li>
</ul>
<p>The task of the administrator is to identify and, where possible, eliminate these problems. If they are, of course, are in his area of responsibility.</p>
<p>Lets talk about “Not optimally written code”. Practice shows that this case is about 90% of all the problems associated with the slow work of the site. Sub-optimal code, poorly written SQL-statements, improper use of locks – all of which can lead to a slowing down of the site. And if at some point before the powerful hardware could handle the bad code, after some point «x», it is simply no longer cope with the load. You can increase the capacity and on, but first, they ever run out, and secondly – it’s extra hardware costs. So first of all the problem should start with an analysis of the site code.</p>
<p>It is worth to mention that there are cases where the acquisition of new hardware get more cost-effective than parsing and editing large amounts of code.<br />
The main task of the administrator, oddly enough – server administration. He is not a developer and do not have the moral right to touch the code, even if that does not work. Therefore, for the most detailed diagnosis of this code and identify bottlenecks that cause a slowdown in the site, you need to use tools that do not require editing the code.<br />
Yes, I forgot, we are talking about developing on PHP! That it is used and loved by the majority of web-programmers.</p>
<h2>Xdebug</h2>
<p>Xdebug is an extension to PHP, written by one of the developers of PHP, and designed to collect and analyze debug in php-code. It is important to note that this open-source project.</p>
<p>We will consider xdebug through the lens of the system administrator, affecting only those features that do not require changes of the site code, and does not slow down the server.</p>
<p>Obviously, any profiling or tracing introduces additional delay in the execution of code. Therefore, carrying out diagnosis should not affect the performance site.</p>
<h2>Install xdebug</h2>
<p>If you are using Centos / RHEL / Fedora easiest way to install xdebug will be installing from a repository EPEL:</p>
<p><strong>$ yum install php-pecl-xdebug</strong></p>
<p>If you are using Ubuntu/Debian:</p>
<p><strong>$ apt-get install php5-xdebug</strong></p>
<p>Installation using the pecl:</p>
<p><strong>$ pecl install xdebug</strong></p>
<p>You can also install xdebug from source, first download from the following address <a href="http://xdebug.org/download.php">http://xdebug.org/download.php</a> :</p>
<p><strong>$ tar xvzf xdebug-2.2.1.tgz</strong><br />
<strong>$ cd xdebug-2.2.1</strong><br />
<strong>$ phpize</strong><br />
<strong>$ ./configure –enable-xdebug</strong><br />
<strong>$ make && make install</strong></p>
<h2>Setup xdebug</h2>
<p>Basic setup would be to simply connect the newly installed extensions in the file php.ini. This file is necessary to check for the string:</p>
<p><em>zend_extension = /path/to/xdebug.so<br />
xdebug.default_enable = 0<br />
xdebug.overload_var_dump = 0<br />
</em></p>
<p>If the string has not been added to the php.ini or in one of the header files, such as /etc/php.d/xdebug.ini, you must do it manually. Then restart the web server.</p>
<p>After webserver restart, site developers can use xdebug. The first two directives we specifically disable the advanced display of call stack when an error occurs and the redefinition of the standard function var_dump (). Despite the fact that this is a great functionality, helping to develop, it changes (even slightly) the behavior of the site code, which shouldn’t happen.</p>
<h2>Getting to the analysis: Trace function calls</h2>
<p>The most important and useful method for the diagnosis of the site and identify problem areas – this trace function calls. If you access any chosen us page of the site will be launched statistics collection functions, namely:</p>
<ul>
<li>The start and end of code execution</li>
<li>The order of execution</li>
<li>Execution time of each function</li>
<li>The memory usage of each function</li>
</ul>
<p>This invaluable information will help to determine reliably the “slow” section of code. In addition, it will be possible to determine the amount of memory consumed by a particular function.</p>
<p>Before you start tracing define some variables that will help us to monitor and gather information needed to collect more data during runtime.</p>
<p><strong>xdebug.collect_params</strong> indicates how much detail you need to gather information about the arguments of functions. 0 – minimum, information is not collected. 1 – information is collected on the number and type of arguments. 3 – information on the value of the arguments. 4 – complete information: type, name, value of the argument at the time of the transfer. The more information we want – the longer it will be traced.<br />
<strong>xdebug.show_mem_delta</strong> defines show or not to show the difference in the consumption of memory in the final report for each function call.<br />
<strong>xdebug.trace_enable_trigger</strong> enables or disables the ability to run a trace on demand.<br />
<strong>xdebug.auto_trace</strong> enables or disables the automatic start tracing for each access to the site pages.<br />
<strong>xdebug.collect_assignments</strong> include or not include in the record information about assigning values to variables.<br />
<strong>xdebug.collect_includes</strong> include or not include in the record information about attached files.<br />
<strong>xdebug.collect_return</strong> includes or does not include a report of information on the values returned by the function.<br />
<strong>xdebug.trace_output_dir</strong> specifies the directory in which to chip in reports.<br />
<strong>xdebug.trace_output_name</strong> generates a file name for the report.</p>
<p>The essence of the method would be to run a trace only when the administrator wants it. Enable tracing on a permanent basis is not acceptable as it leads to increased consumption of resources during the execution of the code, and creates a lot of unnecessary reports.</p>
<p>To tell the server that the administrator wants to run a trace function at the time of the query, it is necessary to pass a parameter XDEBUG_TRACE a GET or POST request, or to set a cookie with the same name. The cookie method seems more preferable because POST-send request is not always possible. And when using the GET could be a problem related to the fact that the address bar is often handled on the server with mod_rewrite or more aliases to call PHP-code. Therefore, our variable can not just reach the destination.</p>
<p>Will gather as much information about sent variables, connected files and the difference in memory consumption between function calls. Store reports to / var / tmp. The other settings are the default. In the end, append the following line in php.ini:</p>
<p>xdebug.trace_enable_trigger=1<br />
xdebug.auto_trace=0<br />
xdebug.collect_params=4<br />
xdebug.show_mem_delta=1<br />
xdebug.trace_output_dir=/var/tmp</p>
<p>And restart the web server. For the analysis lets take the following sample code:</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;"><?php</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">"config.inc"</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">"class/db.php"</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">(</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;"><</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
show_num<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000088;">$v</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
alloc_array<span style="color: #009900;">(</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">Get</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"mysql"</span><span style="color: #339933;">,</span> HOST<span style="color: #339933;">,</span> USER<span style="color: #339933;">,</span> PASS<span style="color: #339933;">,</span> NAME<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-></span><span style="color: #004000;">connect</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">"finished"</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> show_num<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #009900;">(</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">)</span> ? show_odd<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span> <span style="color: #339933;">:</span> show_even<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">function</span> show_odd<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">"odd: <span style="color: #006699; font-weight: bold;">$i</span><br>"</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">function</span> show_even<span style="color: #009900;">(</span><span style="color: #000088;">$i</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">"even: <span style="color: #006699; font-weight: bold;">$i</span><br>"</span><span style="color: #339933;">;</span>
<span style="color: #990000;">sleep</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">function</span> alloc_array<span style="color: #009900;">(</span><span style="color: #000088;">$size</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$v</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">(</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;"><</span> <span style="color: #000088;">$size</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000088;">$v</span><span style="color: #009900;">[</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$i</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">?></span></pre></td></tr></table></div>
<p>Imagine that a user tried to open the page in the browser, which is responsible for the code. Page loaded more than ten seconds, which is very long! Our goal is to understand why.</p>
<p>As mentioned earlier, it is necessary to set a variable cookie XDEBUG_TRACE. Usually cookie variables for a particular domain set by the server to the client browser by passing HTTP-header Set-Cookie or are already installed on the client side script JavaScript.</p>
<p>Copy this code to browser address line after you open site page. This will setup new cookin in context of loaded site:</p>
<blockquote><p>javascript:document.cookie=«XDEBUG_TRACE=1»</p></blockquote>
<p>Make a request to the page, and look forward to the end of the request. Next, look for the server in the directory /var/tmp for corresponding trace-file. Let’s look at the results:</p>
<pre>TRACE START [2012-09-25 11:19:54]
0.0005 645152 +645152 -> {main}() /var/www/test.php:0
0.0007 649296 +4144 -> require(/var/www/config.inc) /var/www/test.php:4
0.0007 649504 +208 -> define('HOST', '10.1.1.1') /var/www/config.inc:3
0.0008 649536 +32 -> define('NAME', 'db') /var/www/config.inc:4
0.0008 649568 +32 -> define('USER', 'u0') /var/www/config.inc:5
0.0008 649600 +32 -> define('PASS', 'ps') /var/www/config.inc:6
0.0012 695728 +46128 -> require(/var/www/class/db.php) /var/www/test.php:5
0.0013 694736 -992 -> show_num($i = 1) /var/www/test.php:8
0.0013 694736 +0 -> show_odd($i = 1) /var/www/test.php:21
0.0013 694864 +128 -> show_num($i = 2) /var/www/test.php:8
0.0013 694864 +0 -> show_even($i = 2) /var/www/test.php:21
0.0014 694960 +96 -> sleep(1) /var/www/test.php:30
1.0033 694864 -96 -> show_num($i = 3) /var/www/test.php:8
1.0034 694864 +0 -> show_odd($i = 3) /var/www/test.php:21
1.0034 694864 +0 -> show_num($i = 4) /var/www/test.php:8
1.0034 694864 +0 -> show_even($i = 4) /var/www/test.php:21
1.0035 694960 +96 -> sleep(1) /var/www/test.php:30
2.0047 694864 -96 -> show_num($i = 5) /var/www/test.php:8
2.0048 694864 +0 -> show_odd($i = 5) /var/www/test.php:21
2.0048 695224 +360 -> alloc_array($size = 1024) /var/www/test.php:13
2.0057 843024 +147800 -> DB::Get($type = 'mysql', $host = '10.1.1.1', $user = 'u0', $pass = 'ps', $db = 'db') /var/www/test.php:15
2.0057 843664 +640 -> absDB->__construct($host = '10.1.1.1', $user = 'u0', $pass = 'ps', $db = 'db') /var/www/class/db.php:10
2.0058 843664 +0 -> DB->__construct($host = '10.1.1.1', $user = 'u0', $pass = 'ps', $db = 'db') /var/www/class/db.php:36
2.0058 844000 +336 -> DB->build() /var/www/class/db.php:19
2.0058 844016 +16 -> absDB->connect() /var/www/test.php:16
2.0058 844368 +352 -> mysqli_connect('10.1.1.1', 'u0', 'ps', 'db') /var/www/class/db.php:47
11.0164 8432
TRACE END [2012-09-25 11:20:05]</pre>
<p>In the first and last line of the report displays the time and the beginning of the end of the query, respectively. From this data it follows that the code was executing 11 seconds. The report also displays the order of calls all the functions in the code with their nesting. The first column indicates the total run times in seconds at the time of the function call, the second column shows the memory usage in bytes and at the time of the function call. The third column – the difference in memory consumption caused by the previous function. The remaining columns show the function name, file name and line number in which it was called.</p>
<p>Let’s try to understand what causes slow performance of code. Above all in the eye catches a long work function <strong>mysqli_connect ()</strong>, which executes for almost 9 seconds. Obviously, there are problems accessing the remote server. Note that this function is called through several layers of abstraction and classes. For many frameworks – this is a common thing. In addition, the delay is a function of the sleep (), which is called a user-defined function show_even ().</p>
<p>As for memory consumption, we see a sharp jump over 140kb after calling UDF alloc_array (), as well as a large memory allocation at the beginning of code execution.</p>
<p>We see all the information about the arguments passed to all functions, so the developer will be able to compare these reports with the source code.</p>
<h2>Code profiling</h2>
<p>It is worth mentioning another opportunity provided by xdebug to find bottlenecks in your code, and that the server administrator can use without modifying the code of the site. This is profiling.</p>
<p>Profiling runs similar to the start the trace functions, the cookie variable name. Instead XDEBUG_TRACE used XDEBUG_PROFILE. As a result, we get the profiling data file, which can be recognized from the utility callgrind_annotate vallgrind, and can also be displayed graphically using a utility KCacheGrindpod WinCacheGrind or KDE on Windows. KCacheGrind among them – the richest in functionality.</p>
<p>Configure the profiling on request to the directives of the same directives trace functions:</p>
<blockquote><p>xdebug.profiler_enable=0<br />
xdebug.profiler_enable_trigger=1<br />
xdebug.profiler_output_dir=/var/tmp</p></blockquote>
text/html2013-05-08T20:27:18+01:00http://a32.me/Constantin BosneagaReading directory list – new PHP5 way
http://a32.me/2013/05/reading-directory-list-new-php5-way/
<p>It has been long time for using <strong>opendir</strong>, <strong>readdir</strong> functions or even <strong>scandir</strong> for reading directory listing from the disk. Even myself still using it when in need.</p>
<p>Its time to update your snipped library with <strong>new</strong> PHP5 object oriented code. This is definitely not a new new thing, but still I want to make an article on it to attract more users to use this feature.</p>
<p><span id="more-3856"></span></p>
<h2>Retrieve directory listing</h2>
<p>Using new Iterator thing</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$directory</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DirectoryIterator<span style="color: #009900;">(</span><span style="color: #0000ff;">"/tmp/mystuff"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">(</span><span style="color: #000088;">$directory</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #666666; font-style: italic;">// Do your stuff here</span>
<span style="color: #009900;">}</span></pre></td></tr></table></div>
<p>The good thing here is that<strong> $entry</strong> is an object and you can use some useful methods like</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Checks if entry is regular file, this way you skip '.' or '..' entries</span>
<span style="color: #000088;">$entry</span><span style="color: #339933;">-></span><span style="color: #004000;">isFile</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Checks if entry is a directory</span>
<span style="color: #000088;">$entry</span><span style="color: #339933;">-></span><span style="color: #004000;">isDir</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>
<span style="color: #666666; font-style: italic;">// Get FULL path including filename, for passing to processing function</span>
<span style="color: #000088;">$entry</span><span style="color: #339933;">-></span><span style="color: #004000;">getPathname</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span></pre></td></tr></table></div>
<p>As well as others like $entry->getOwner(), getPerms, getSize, isWritable</p>
<h2>Retrieve recursive directory listing</h2>
<p>Another magic feature it is easy to convert code above to do recursive directory listing, look</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$directory</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RecursiveDirectoryIterator<span style="color: #009900;">(</span><span style="color: #0000ff;">"/tmp/mystuff"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> RecursiveIteratorIterator<span style="color: #009900;">(</span><span style="color: #000088;">$directory</span><span style="color: #009900;">)</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$entry</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #666666; font-style: italic;">// Do your stuff here</span>
<span style="color: #009900;">}</span></pre></td></tr></table></div>
<p>See more docs on <a href="http://www.php.net/manual/en/recursiveiteratoriterator.construct.php" target="_blank">RecursiveDirectoryIterator</a>, it has second parameter to control what is included in final list.</p>
<p> </p>
text/html2013-05-06T17:03:19+01:00http://a32.me/Constantin BosneagaЯ прочел: Наполеон Хилл – “Думай и богатей”
http://a32.me/ru/2013/05/ja-prochel-napoleon-hill-dumaj-i-bogatej/
<p>Точнее я ее прослушал в виде аудиокниги, не смог найти в формате fb2. Такой формат оказался даже полезным в моменты когда читать неудобно: дорога на работу, обед, прогулка. Жаль в аудиокниге невозможно выделить цитаты, многие отрывки я бы процитировал.</p>
<p>Затрагиваются многие аспекты личного роста, отношений между людьми, самоорганизации, мотивации. В целом книга понравилась, рекомендуется к прочтению.</p>
<p><span id="more-3839"></span></p>
<p>Аннотация</p>
<p>Пожалуй, самая значимая и авторитетная книга в мире – руководство по обретению успеха, богатства, жизненной энергии преодоления и целеустремленности. На протяжении 70 лет “Думай и Богатей!” считается классическим учебником по созданию богатства. В каждой главе Наполеон Хилл раскрывает секреты добывания денег, пользуясь которыми тысячи людей приобрели, приумножили и продолжают приумножать свое состояние, одновременно развивая и обогащая свой личностный потенциал.Автор потратил на интервью с миллионерами 30 лет своей жизни и, досконально изучив вопрос, вывел формулу определенных правил успеха, благодаря которой вы можете понять и проработать свои слабые стороны и выйти на новый уровень жизни.</p>
text/html2013-04-02T01:21:55+01:00http://a32.me/Constantin BosneagaTinydeal – blacklisted, do not buy here
http://a32.me/2013/04/tinydeal-blacklisted-do-not-buy-here-problem/
<p>“The friend in need is friend indeed” which is so true what I am going to write about. In short, Tinydeal has bad client service and attitude.</p>
<p><span id="more-3624"></span></p>
<p><!--more--></p>
<p>I use internet shopping for a while and its very useful. When everything goes smooth: goods are in stock, mail delivers in time and in a whole – there is no place for worry.</p>
<p>But in this business many things can go wrong and internet shops must be ready to handle this situation well, so customers are <strong>satisfied</strong> and happy to shop again and again.</p>
<p>This is definitely not a Tinydeal case.</p>
<p>I ordered package for ~$33, <b>Order Date: </b>11/12/2012, <strong>Status</strong>: Shipped. Five (5) months passed and still no package. Standard response of support is: “let’s wait for the news from post office” – I received like 5 of them. Say goodbye to my money.</p>
<p>Package was registered with tracking number which shows that it left Hong Kong but never arrived to country of destination.</p>
<p>I <strong>do not trust</strong> Tinydeal any more won’t shop there and do not recommend it to anyone.</p>
<h2>DX</h2>
<p>Here is good example. I have exactly the same situation with <a href="http://dx.com/" target="_blank">DX</a> site, they lost my package around same time. After I contacted support I received two options below.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/dx_good.png"><img class="size-full wp-image-3626 alignnone" alt="dx_good" src="http://a32.me/wp-content/uploads/2013/04/dx_good.png" width="697" height="274" srcset="http://a32.me/wp-content/uploads/2013/04/dx_good-570x224.png 570w, http://a32.me/wp-content/uploads/2013/04/dx_good.png 697w" sizes="(max-width: 697px) 100vw, 697px" /></a></p>
<p>This is <strong>service</strong>!</p>
<p>Sorry, TD.</p>
text/html2013-03-26T06:32:04+01:00http://a32.me/Constantin BosneagaЯ прочел: Роберт Кийосаки – “Квадрант денежного потока”
http://a32.me/ru/2013/03/ja-prochel-robert-kijosaki-kvadrant-denezhnogo-potoka/
<p>Книга является скорее продолжением популярной книги <a title="Я прочел: Роберт Кийосаки – “Богатый папа, Бедный папа”" href="http://a32.me/ru/2013/01/ja-prochel-robert-kijosaki-bogatyj-papa-bednyj-papa/">Богатый папа – бедный папа</a>. Тут расширяется знание о том как стать богатым. На мой взгляд многовато воды и повторений, но встречаются очень правильные мысли.</p>
<p>Рекомендуется к прочтению. Под катом сборник цитат, которые мне понравились.</p>
<p><span id="more-3491"></span></p>
<p>Он считал, что глупо тратить свою жизнь, работая за деньги и притворяться, что деньги не важны</p>
<hr />
<p>Потому что у людей отличаются технические навыки и навыки быть успешным в каждом секторе. Вы должны изучить и способ мышления, требуемые сектором, чтобы добиться там истинного успеха.</p>
<hr />
<p>Проблема состоит в том, что, если дантист имеет отпуск, то его доход – также. «В», владельцы бизнеса, могут уйти в отпуск навсегда, потому что они имеют систему, не работу.</p>
<hr />
<p>Существует различие между богатыми и состоятельными людьми. Определение состоятельности: «Количество дней, которое Вы можете прожить, не работая физически, и продолжать поддерживать свой высокий уровень жизни».</p>
<hr />
<p>Чтобы получить большую финансовую безопасность, я предлагаю в дополнение к выполнению основной работы в секторах «Е» или «S», получать образование в секторах «В» или «I».</p>
<hr />
<p>Во времена больших экономических изменений всегда случаются большие перемещения богатства. Даже если Вы не имеете много денег, важно вложить свой капитал в свое образование… для того чтобы во время изменений Вы были бы лучше подготовлены к ним. Не позволяйте изменениям застать Вас врасплох.</p>
<hr />
<p>Действительно работа Вашего босса не в том, чтобы делать Вас богатыми. Обязанность Вашего босса удостовериться, что Вы получаете зарплату. А ваша работа: чтобы стать богатым, если Вы хотите.</p>
<hr />
<p>Единственное различие между богатым человеком и бедным человеком в том, что они делают в свое свободное время</p>
<hr />
<p>Если Вы сначала добились успеха как «В», то будете иметь лучший шанс развития в секторе «I».<br />
«I» вкладывает капитал в «В». Если Вы сначала поймете смысл бизнеса, то сможете стать лучшим инвестором.</p>
<hr />
<p>Ты можешь потерять две или три компании, прежде чем построишь одну успешную, которая останется и будет продолжать работать</p>
<hr />
<p>«Успех – плохой учитель», – всегда говорил богатый папа, учимся лучше всего, когда проигрываем, так что не бойтесь неудачи. Неудача – часть процесса успеха. Вы не можете достичь успеха без неудачи. Так что неудачные люди – те, кто никогда не терпит неудачу.</p>
<hr />
<p>Что Вы думаете обо мне – не мое дело. Самое важное – то, что я сам думаю о себе</p>
<hr />
<p>Вместо попытки экономить пенни, они могли бы потратить это время на изучение, как вложить капитал.</p>
<hr />
<p>Проблема в том, что они покупают эти акции слишком поздно, потому что…, ли Вы получаете новости из газеты, то это слишком поздно.</p>
<hr />
<p>Перестаньте ждать, когда появится «большое дело». Войдите в «игру» с «маленькими» делами. Не волнуйтесь, просто начните. Вы научитесь намного больше, как только пустите некоторые деньги в оборот…, хотя бы немного, чтобы начать.</p>
<hr />
<p>В хорошие экономические времена, настоящие капиталисты преуспевают. В плохие экономические времена, истинные капиталисты становятся даже более богатыми. Капиталисты знают, что экономический хаос означает новые возможности. Чаще других, они с самого начала принимают участие в поддержке проекта, изделия, компании или страны. Когда Вы читаете в газете, что в какой-то стране неприятности, война или бедствие, можете быть уверены, что истинный капиталист скоро там будет, или может быть уже там.</p>
<hr />
<p>Средний человек – 95% покупает глазами и только 5 % умом, когда решает, куда вкладывать капитал.</p>
<hr />
<p>Когда люди говорят мне, что вложение капитала опасно, я возражаю: «Вложение капитала не опасно. Быть необразованным опасно».</p>
<hr />
<p>Твоя прибыль создается не тогда, когда ты продаешь… а тогда, когда ты покупаешь</p>
<hr />
<p>Не в диете дело. Не она Вами руководит. Вами руководит тот, кем Вы хотите стать, придерживаясь этой диеты. Все же каждый год миллионы людей ищут совершенную диету, чтобы похудеть. Они сосредотачиваются на том, что они должны делать, а не на том, кем они должны быть. Диета не поможет, если не изменятся Ваши мысли</p>
<hr />
<p>Если Вы хотите быть богатыми, Вы должны «думать». Думай больше, чем другие люди из толпы. Если Вы делаете то, что каждый делает, то Вы закончите тем, что каждый имеет.</p>
<hr />
<p>Плохой игрок в гольф с новым набором для игры в гольф – все еще плохой игрок в гольф.</p>
<hr />
<p>А быть взрослым – это значит делать то, что Вы должны, даже тогда, когда Вы не испытываете желание это делать.</p>
<hr />
<p>Чтобы быть успешным как инвестор или владелец бизнеса, Вы должны быть эмоционально нейтральны как к победе, так и к потерям. Тогда у Вас не будут возникать эмоционально управляемые мысли, такие как опасение и жадность, формирующие Ваше мышление. Победы и потери – только часть игры.</p>
<hr />
<p>Две инструкции берегли меня в это трудное время. Одной из них были слова моего богатого отца, которые он сказал, когда я был на краю срыва, почти готов все бросить и вернуться к прошлому: «Вы же всегда можете выйти…, так почему выходить сейчас?»</p>
<hr />
<p>Другая инструкция, которая часто оберегала меня во время продвижения, была такая: «Гиганты часто путешествуют и падают. Но червяки не падают, потому, что они только роют и ползают».</p>
<hr />
<p>Многие люди ищут кого-то, кого бы обвинить за свое тяжелое финансовое положение. Эти люди часто хотят обвинить богатых за собственные финансовые проблемы, не желая понимать, что это – часто их собственный недостаток информации касательно денег, которые являются основной причиной их тяжелого положения.</p>
<hr />
<p>Для тех, кто думает над тем, чтобы перейти к «В» или «I» квадрантам, я рекомендую начать малый бизнес…, и вкладывать свое время. Можно браться за большее дело только тогда, когда Ваша уверенность и опыт будут гораздо выше в том деле. Помните, что единственное различие между делом на $80.000 и делом на $800.000 – это нуль.</p>
<hr />
<p>На первый взгляд, кажется, будто существуют законы для богатых и, отдельно, для обыкновенных людей. Но в действительности, законы – те же самые. Единственное различие – богатые используют законы для своего преимущества, в то время как бедные и средний класс не используют.</p>
<hr />
<p>Слишком много людей зафиксированы на жизненной философии «разбогатей быстро». Этим людям я желаю удачи, потому что удача – это то, в чем они нуждаются.</p>
<hr />
<p>Одной из целей Вашей собственной жизни может быть такая: учиться, чтобы быть более умным и сообразительным, чем большинство людей, даже, чем Ваш банкир.</p>
<hr />
<p>Люди, которые не могут контролировать наличные деньги, работают на тех, кто может.</p>
<hr />
<p>Посещайте финансовые семинары и занятия. (Я приписываю большую часть моего успеха курсу по торговле недвижимостью, который я прослушал, когда был молодым. Это мне стоило 385 долларов. Поскольку я действовал, это принесло мне прибыль в миллионы долларов за эти годы.</p>
<hr />
<p>Подпишитесь на инвестиционные издания и изучайте их.</p>
<hr />
<p>Выбирайте себе наставников мудро. Обращайте внимание на то, кто дает Вам советы. Если Вы хотите куда-то попасть, найдите кого-нибудь, кто там уже был.</p>
<hr />
<p>Если Вы готовитесь, чтобы начать своё путешествие в поисках собственной прочной финансовой дорожки, я хотел бы предложить Вам те же самые слова поддержки, которые сказал мне богатый папа, когда я учился чему-то новому: «<strong>Будь готов к разочарованию</strong>».</p>
<hr />
text/html2013-03-19T06:00:30+01:00http://a32.me/Constantin BosneagaDynamicly load Google Maps v3
http://a32.me/2013/03/dynamicly-load-google-maps-v3/
<p>Quite often pages are overloaded with 3rd party APIs or widgets and page loading time becomes a bottleneck in user experience. In my project I need google maps support, but only if user selects one particular tab.</p>
<p>So how to load Google Maps V3 dynamicly, on button click or tab select</p>
<p><span id="more-3327"></span></p>
<p>Main steps here are load maps API, wait for load, create map and wait for tiles to load.</p>
<h2>Load maps API</h2>
<p>First step is to load javascript API. One important thing here is <strong>callback</strong> parameter. That function will be executed after API is fully loaded.</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">ajax</span><span style="color: #009900;">(</span><span style="color: #009900;">{</span>
url<span style="color: #339933;">:</span> <span style="color: #3366CC;">"http://maps.googleapis.com/maps/api/js?sensor=false&callback=MapApiLoaded"</span><span style="color: #339933;">,</span>
dataType<span style="color: #339933;">:</span> <span style="color: #3366CC;">"script"</span><span style="color: #339933;">,</span>
timeout<span style="color: #339933;">:</span><span style="color: #CC0000;">8000</span><span style="color: #339933;">,</span>
error<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #006600; font-style: italic;">// Handle error here</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<h2>Create map object and wait for full load</h2>
<p>Next, define function <strong>MapApiLoaded</strong>, good place to create map object and setup.</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">function</span> MapApiLoaded<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #006600; font-style: italic;">// Create google map</span>
map <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> google.<span style="color: #660066;">maps</span>.<span style="color: #660066;">Map</span><span style="color: #009900;">(</span>$<span style="color: #009900;">(</span><span style="color: #3366CC;">'#gmap'</span><span style="color: #009900;">)</span><span style="color: #009900;">[</span><span style="color: #CC0000;">0</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #009900;">{</span>
zoom<span style="color: #339933;">:</span><span style="color: #CC0000;">8</span><span style="color: #339933;">,</span>
mapTypeId<span style="color: #339933;">:</span>google.<span style="color: #660066;">maps</span>.<span style="color: #660066;">MapTypeId</span>.<span style="color: #660066;">ROADMAP</span><span style="color: #339933;">,</span>
panControl<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
streetViewControl<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
mapTypeControl<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span>
<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
map.<span style="color: #660066;">setCenter</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">new</span> google.<span style="color: #660066;">maps</span>.<span style="color: #660066;">LatLng</span><span style="color: #009900;">(</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1.950106</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">29.873887999999965</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Add marker</span>
<span style="color: #006600; font-style: italic;">// Trigger resize to correctly display the map</span>
google.<span style="color: #660066;">maps</span>.<span style="color: #660066;">event</span>.<span style="color: #660066;">trigger</span><span style="color: #009900;">(</span>map<span style="color: #339933;">,</span> <span style="color: #3366CC;">"resize"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Map loaded trigger</span>
google.<span style="color: #660066;">maps</span>.<span style="color: #660066;">event</span>.<span style="color: #660066;">addListenerOnce</span><span style="color: #009900;">(</span>map<span style="color: #339933;">,</span> <span style="color: #3366CC;">'idle'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #006600; font-style: italic;">// Fire when map tiles are completly loaded</span>
<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span></pre></td></tr></table></div>
text/html2013-03-15T05:00:51+01:00http://a32.me/Constantin BosneagaНе дайте Астронавтам Архитектуры вас запугать
http://a32.me/ru/2013/03/ne-dajte-astronavtam-arhitektury-vas/
<p><span style="color: #808080; font-size: small;">Автор: Джоэл Спольски<br />
В оригинале статья называлась <a href="http://www.joelonsoftware.com/articles/fog0000000018.html" rel="nofollow">Don’t Let Architecture Astronauts Scare You</a> и была написана 21 апреля 2001<br />
</span></p>
<p>Когда великие мыслители думают о проблемах, они начинают видеть шаблоны. Они видят людей, посылающих друг другу документы текстового процессора, и затем они видят людей, посылающих друг другу электронные таблицы, и они понимают, что есть общий образец: отправка файлов. Это – первый уровень абстракции. Далее они поднимаются на следующий уровень: люди посылают файлы, но web-браузеры также “посылают” запросы на получение web-страниц. И если немного подумать, вызов метода у объекта походит на отправку сообщения объекту! Это – снова то же самое! Все вышеперечисленное – это операции отправки, так что наш умный мыслитель изобретает новую, более высокую, более широкую абстракцию, называемую messaging, но сейчас она становится действительно неопределенной, и никто на самом деле уже не знает о чем идёт речь. Ерунда.</p>
<p><span id="more-3330"></span></p>
<div><a href="http://local.joelonsoftware.com/wiki/File:Charles_River.jpg"><img class="alignleft" alt="Charles River.jpg" src="http://local.joelonsoftware.com/mediawiki/images/5/51/Charles_River.jpg" width="200" height="134" /></a></div>
<p>Когда вы поднимаетесь слишком высоко, наполненный абстракциями, вы задыхаетесь из-за отсутствия кислорода. Иногда мыслители просто не знают, когда остановиться, и они создают абсурдные, всеобъемлющие, высокоуровневые картины устройства вселенной, которые являются хорошими и изящными, но фактически не означают вообще ничего.</p>
<p>Это – люди, которых я называю Астронавтами Архитектуры. Очень трудно заставить их писать код или проектировать программы, потому что они не перестают думать об Архитектуре. Они астронавты, потому что они находятся выше уровня кислорода, и я не понимаю, как они дышат. Они, как правило, работают в действительно больших компаниях, которые могут позволить себе иметь много непроизводительных людей с действительно большими учеными степенями, но, по сути, не вносящими вклада в результат.</p>
<p>Недавний пример это иллюстрирует. Типичный астронавт архитектуры возьмёт факт вроде “Napster – это пиринговый сервис для скачивания музыки” и проигнорирует всё, кроме архитектуры, думая, что он интересен, потому что он является peer to peer, полностью упуская из вида тот факт, что можно ввести название песни и прослушать её сразу же.</p>
<p>Всё, о чём они будут говорить – peer-to-peer это, то и вон то. Внезапно вы обнаружите peer-to-peer конференции, венчурные фонды peer-to-peer, и даже враждебную реакцию от слабоумных бизнес журналистов, истекающих злорадством в формате peer-to-peer, потому что они копируют истории друг у друга: “Peer-to-peer: умер!”.</p>
<div><a href="http://local.joelonsoftware.com/wiki/File:Harvard_Message_Board.jpg"><img class="alignright" alt="Harvard Message Board.jpg" src="http://local.joelonsoftware.com/mediawiki/images/5/56/Harvard_Message_Board.jpg" width="200" height="286" /></a></div>
<p>Астронавты Архитектуры скажут: “Представьте себе программу вроде Napster, но с возможностью загрузить что угодно, не только песни?”. Далее они начнут разрабатывать приложения вроде Groove, которые как они думают, являются более общими, чем Napster, но которые, похоже, пренебрегают той крошечной маленькой особенностью, что можно напечатать название песни и послушать её. А это именно та особенность, которую мы хотели получить с самого начала. Речь о том, что главное упущено. Если бы Napster не был peer-to-peer приложением, но действительно позволял бы напечатать название песни и послушать её, он был бы столь же популярным.</p>
<p>Другая вещь, которую любят делать Астронавты Архитектуры – это изобретать какую-то новую архитектуру и утверждать, что она что-то там решает. Java, XML, Soap, XmlRpc, Hailstorm, .NET, Jini, о господи, я не выдержу. И это только за последние 12 месяцев!</p>
<p>Я не говорю, что с этими архитектурами что-то не так… ни в коем случае. Это довольно хорошие архитектуры. Что меня раздражает, так это громадное количество очковтирательства, которое их окружает. Помните обзор Microsoft Dot Net?</p>
<blockquote><p>Следующее поколение платформы Windows для десктопов, Windows .NET, поддерживает высокую продуктивность, творческий потенциал, развлечения и многое другое, и она разработана, чтобы дать пользователям возможность контролировать их цифровую жизнь.</p></blockquote>
<p>Это было 9 месяцев назад. В прошлом месяце мы получили Microsoft Hailstorm. В обзоре сказано:</p>
<blockquote><p>Люди не контролируют технологию, которая их окружает… Hailstorm заставляет технологию в вашей жизни работать по вашему поручению и под вашим контролем.</p></blockquote>
<p>О, хорошо, теперь высокотехнологичный галогенный свет в моей квартире перестанет мигать.</p>
<p>Microsoft – не одни такие. Вот – цитата из <a href="http://www.sun.com/jini/whitepapers/whyjininow.html%7C" rel="nofollow">обзора Sun Jini</a>:</p>
<blockquote><p>Эти три факта (вы – новый администратор, компьютеров нигде нет, один компьютер есть везде), должны объединиться, чтобы улучшить мир использования компьютеров, заставляя границы компьютеров исчезать, заставляя компьютер быть всюду, и делая детали работы с компьютером столь же простыми как вставка DVD в лоток домашнего кинотеатра.</p></blockquote>
<p>И даже не напоминайте мне об удобрении, которое Джордж Джилдер распространяет о Java:</p>
<blockquote><p>Фундаментальный прорыв в истории технологии…</p></blockquote>
<p>Уверенное подтверждение факта, что на Вас нападает Астронавт Архитектуры: невероятное количество напыщенности; героическая, утопическая высокопарность; хвастовство; полный недостаток чувства действительности. И люди покупают это! Деловая пресса сходит с ума!</p>
<p>Какого черта люди столь увлекаются скучной архитектурой, которая часто представляет собой не что иное, как новый формат передачи для RPC, или новую виртуальную машину? Эти вещи могли бы быть хорошей архитектурой, они, конечно, принесут пользу разработчикам, которые используют их, но они – не являются, я повторяюсь, не являются, хорошей заменой мессии, въезжающему на белом осле в Иерусалим, или миру во всем мире. Нет, Microsoft, компьютеры внезапно не собираются начинать читать наши мысли и делать то, что мы хотим автоматически только потому, что каждый в мире должен иметь Passport. Нет, Sun, мы не будем способны анализировать наши корпоративные коммерческие данные “так просто как вставка DVD в лоток домашнего кинотеатра”.</p>
<div><a href="http://local.joelonsoftware.com/wiki/File:Harvard_Science_Center.jpg"><img class="alignleft" alt="Harvard Science Center.jpg" src="http://local.joelonsoftware.com/mediawiki/images/2/2b/Harvard_Science_Center.jpg" width="250" height="156" /></a></div>
<p>Помните, что люди архитектуры решают проблемы, которые, как они думают, они могут решить, а не те проблемы, которые полезно решать. Soap + WSDL – это возможно новая горячая штучка, но она на самом деле не позволяет делать что-то, что вы не могли делать ранее с помощью других технологий, если испытывали такую потребность. Вся та нирвана распределённых сервисов, о которой болтают астронавты, уже была обещана в прошлом, если мы использовали DCOM, или JavaBeans, или OSF DCE, или CORBA.</p>
<p>Прекрасно, что мы теперь можем использовать XML для формата данных в сети. Вот это да. Но мне это примерно так же интересно, как и то, что мой супермаркет использует грузовики, чтобы привозить товары со склада. Зевок. Это интересно. Скажите мне что-нибудь новое, чего я не мог делать раньше, о, Астронавты, или оставайтесь там, в космосе и не тратьте больше моё время.</p>
text/html2013-03-12T06:00:23+01:00http://a32.me/Constantin BosneagaЯ прочел: Майкл Гербер – “Создание предприятия которое бы работало”
http://a32.me/ru/2013/03/majkl-gerber-sozdanie-predprijatija-kotoroe-by-rabotalo/
<p>На примере общения с бизнесменом автор рассказывает о типичных засадах в бизнесе и как из избегать. Сара – вымышленный бизнесвумен, которая мечтала открыть свою пекарню, потому что ей очень нравилось печь пироги. Майкл находит её и бизнес в плачевном состоянии, когда есть одно желание – все закрыть, продать и забыть. В книге анализируются причины такого исхода и варианты выхода.</p>
<p>Каждый мечтает создать свой бизнес, что-бы он приносил больший доход за меньшие усилия Но реальность диктует свои условия, и обычно все заканчивается 16 часовым рабочим днем без выходных.</p>
<p>Книга понравилась, читается легко. Под катом, как обычно, цитаты которые мне понравились.</p>
<p><span id="more-3287"></span></p>
<p>Фатальное представление состоит в следующем: если вы понимаете техническую работу бизнеса, вы понимаете бизнес, благодаря которому выполняется техническая работа. Причина фатальности состоит в том, что это представление <strong>не верно</strong>. Техническая работа бизнеса и бизнес, выполняющий техническую работу – это совершенно различные вещи! Однако специалист, начинающий бизнес, упускает это из виду.</p>
<hr />
<p>Вам в голову неожиданно приходит мысль о том, что ваш бизнес стал вашим Начальником, от которого, как вы считали, вам удалось избавиться. От начальника невозможно избавиться!</p>
<hr />
<p>Непозволительно быть специалистом и владельцем бизнеса одновременно! Потому что специалист смотрит на мир снизу вверх, хотя должен смотреть сверху вниз. Специалист видит работу, которую необходимо сделать и сразу же берется за эту работу!</p>
<hr />
<p>«Быть хорошим специалистом – это еще не все, что нужно для построения успешного малого бизнеса.</p>
<hr />
<p>Если твой бизнес полностью зависит от тебя, то ты имеешь не бизнес, ты имеешь работу. И это худшая работа на свете, поскольку ты работаешь на безумца!</p>
<hr />
<p>Главный вопрос не в том, насколько маленьким должен быть бизнес, а в том, насколько большим он должен быть</p>
<hr />
<p>Большинство предпринимателей малого бизнеса имеют модель выполнения работы, а не модель успешного бизнеса</p>
<hr />
<p>Когда предприниматель создает модель, он смотрит вокруг себя, и спрашивает: «Какие существуют возможности?» Определив их, он берет бумагу, карандаш и придумывает, как удовлетворить запросы, возникшие в определенной группе потребителей. Решение получается в форме бизнеса, который выглядит и функционирует так, как это нужно потребителям, а не предпринимателю.</p>
<hr />
<p>Таким образом, предпринимательская модель начинается не с картины бизнеса, который требуется создать, а с картины потребителя, для которого этот бизнес создается.</p>
<hr />
<p>Главная идея в том, что ваш бизнес и ваша жизнь – не одно и то же. Как только вы начинаете понимать, что обслуживание бизнеса не является целью вашей жизни, а наоборот, главная цель вашего бизнеса – обслуживать вашу жизнь, тогда вы можете начать работать над своим бизнесом, а не в нем.</p>
<hr />
<p>Вам нужно постоянно искать ответ на вопрос: как я могу давать потребителю желаемый результат систематически, а не случайно? Можно сказать по-другому: как я могу создать бизнес, результаты которого будут зависеть от системы, а не от отдельных людей?</p>
<hr />
<p>Типичный владелец малого бизнеса предпочитает высокопрофессиональных людей, потому что хочет облегчить себе работу – он может просто положиться на них. То есть, типичный владелец малого предприятия предпочитает менеджмент отречения менеджменту делегирования. К сожалению, подобный подход неизбежно приводит к зависимости бизнеса от настроений и капризов людей. Если они в настроении, работа делается, если нет – не делается.</p>
<hr />
<p>Модель должна обеспечивать потребителя стандартным качественным сервисом.</p>
<hr />
<p>Еще ты говоришь, что это отождествление является причиной всей той боли, которую я чувствую, разочарования, которое я испытываю, когда иду на работу. Я верю, что если я достаточно много работаю, мой бизнес будет процветать, что если я буду затрагивать каждую деталь лично, то ничего плохого не может случиться.<br />
И ты говоришь, что для преодоления разочарования, для настоящего контроля над моим бизнесом, мне нужно перестать отождествлять себя со своим бизнесом. Мне нужно воспринимать свой бизнес совсем не так, как я привыкла. Мне нужно смотреть на свой бизнес, как на продукт. Точно также как мои пироги являются продуктом, мой бизнес тоже является продуктом. И если бы я заняла такую позицию, я бы не могла не задаться вопросом: как должен работать мой бизнес-продукт, чтобы успешно привлекать не только клиентов, но и работников?</p>
<hr />
<p>Прежде чем организовывать свой бизнес, задайте себе следующие вопросы:<br />
Как я хочу, чтобы выглядела моя жизнь? Какой должна быть моя каждодневная жизнь? Что бы я хотел узнать больше всего о своей жизни и в своей жизни? Каким я хотел бы быть с другими людьми в своей жизни – с членами семьи, друзьями, партнерами по бизнесу, клиентами, сотрудниками? Как бы я хотел, чтобы люди думали обо мне? Чем я хочу заниматься через два года? Через десять лет? Через двадцать лет? В конце жизни? Чему именно я хочу научиться в своей жизни – духовно, физически, финансово, технически, интеллектуально? Сколько денег мне понадобится, чтобы сделать эти вещи? К какому сроку они понадобятся?</p>
<hr />
<p>Когда мы спрашиваем человека, каким бизнесом он занимается, он инстинктивно называет продаваемый им товар. «Мы занимаемся компьютерами». Или: «Мы занимаемся ванными». Люди всегда называют товар, а не продукт.<br />
В чем именно разница?<br />
Товар – это та вещь, с которой клиент выходит из вашего магазина.<br />
Продукт – это то, что клиент чувствует, когда он уходит от вас.</p>
<hr />
<p>Почему люди должны принимать игру всерьез, если лидер не следует правилам? Именно для этого нужна организация.</p>
<hr />
<p>Развивая стратегию маркетинга, очень важно забыть о своих мечтах, забыть о своем видении, о своих интересах – забыть обо всем, кроме вашего потребителя! Когда дело доходит до маркетинга, ваши желания не имеют никакого значения. Важно, чего хочет ваш клиент. А хочет клиент, скорее всего, вовсе <strong>не того</strong>, что вы думаете.</p>
<hr />
<p>старинная китайская поговорка:</p>
<p>Когда вы слышите что-то, вы забываете это.<br />
Когда вы видите что-то, вы запоминаете это.<br />
Но только когда вы начинаете делать это, вы начинаете понимать это.</p>
text/html2013-03-05T06:00:21+01:00http://a32.me/Constantin BosneagaHow to connect to rare databases in PHP (informix, oracle, db2)
http://a32.me/2013/03/how-to-connect-to-rare-databases-in-php-informix-oracle-db2/
<p>Recently I took part in integration project and faced interesting problem. PHP application that I deploy must communicate with Informix database for data selecte. This php application aims to corporate market, so its not a extraordinary case. I see that it may require connecto to Oracle or DB2 in near future.</p>
<p>Yes, PHP itself has <a href="http://php.net/manual/en/refs.database.php" target="_blank">wide choose of database connectors</a>, which is a good option to have native database support. The only problem is that most of them are used so rare that are usualy not compiled in all modern Linux destributos. For example in Ubuntu server 12.04 there are five most pupular php5-sybase php5-interbase php5-mssql php5-mysql php5-pgsql.</p>
<p>Thinking of it, I found one interesting solution.</p>
<p><span id="more-3443"></span></p>
<h2>The right way</h2>
<p>The right way seems to compile extention you need for PHP and live happilly. Yes it will work, but has some drawbacks I do not like:</p>
<ol>
<li>You have to make a build environment for PHP – which takes time</li>
<li>Include in build all extension PHP already has – install all needed library in -dev versions</li>
<li>Download SDK from database vendor, install it and tell PHP where to look for files – time consuming.</li>
<li>Build PHP install it and manually add to apache, check and rebuild again to add missing extentions</li>
<li>Keep upgrading PHP manually after security patched are out</li>
<li>Document all work done, so somebody later can do this on another server to match your application specification</li>
</ol>
<p>You see, it does not look so simple after analysis. So what is another way?</p>
<h2>JDBC – <span style="color: #ff0000;">J</span>ava <span style="color: #ff0000;">D</span>ata<span style="color: #ff0000;">B</span>ase <span style="color: #ff0000;">C</span>onnectivity</h2>
<p>Some years ago I was quite deep in Java world. One thing I like the best is that how Java works with databases though JDBC. You only need one *.jar file with database driver written by the vendor. This file is usually small in size and has no other dependency.</p>
<p>In my case, for Informix, I found <strong>ifxjdbc.jar</strong>, which is 800Kb in size and that was all I need.</p>
<p>I imagine next setup:</p>
<p>PHP (calls—->) JAVA program (DB exchange) —–> PHP (receive results)</p>
<p>Java program will be a very simple program to get query on input, connect to database, execute the query and pass results to PHP.</p>
<p>Looks like not a right way, but has almost no negative side effects:</p>
<ol>
<li><span style="line-height: 13px;">Java is easy to install on every linux distribution, just type apt-get install java, or yum install java and you are done</span></li>
<li>Any Java version will work, since task is very simple (openjdk, jdk, icetea, etc..)</li>
<li>Java program can be distributed with your PHP application</li>
<li>JDBC driver in sinlge .jar file and as well, can be distributed with PHP application</li>
<li>Simple to support</li>
</ol>
<h2>So why I love JSON?</h2>
<p>Next step is communication with Java program. There is need to pass something and get something back.</p>
<p>First that comes to mind is to re-invent the wheel, like this:</p>
<pre>java Program --query "query here" --db-server "server" etc</pre>
<p>output result like this</p>
<pre>Field1|Field2|Field3
data1|data1|data1</pre>
<p>That means parsing, parsing and catch unpredictable errors. Not good.</p>
<p>What PHP and Java can do well? Yes, its JSON serialization/deserialization. Lets use it, php will run external java program and pass json data on standard input. Java will do it’s work and pass json on standard output, were PHP will catch it.</p>
<p>For PHP its simple json_encode/json_decode</p>
<p>For Java I used <a href="https://code.google.com/p/json-simple/">json-simple-1.1.1.jar</a> library (20KB).</p>
<p>Below are sources that can give you an idea how it works.</p>
<h2>PHP Source</h2>
<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Put in classpath all needed librararies</span>
<span style="color: #000088;">$classpath</span> <span style="color: #339933;">=</span> <span style="color: #990000;">join</span><span style="color: #009900;">(</span>PATH_SEPARATOR<span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span>
<span style="color: #990000;">dirname</span><span style="color: #009900;">(</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">)</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span>
<span style="color: #990000;">dirname</span><span style="color: #009900;">(</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">)</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'ifxjdbc.jar'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// JDBC driver</span>
<span style="color: #990000;">dirname</span><span style="color: #009900;">(</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">)</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'json-simple-1.1.1.jar'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Prepare command to run (SimpleSelect is java program name)</span>
<span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"java -cp '<span style="color: #009933; font-weight: bold;">%s</span>' SimpleSelect"</span><span style="color: #339933;">,</span> <span style="color: #000088;">$classpath</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$descriptorspec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span>
<span style="color: #cc66cc;">0</span> <span style="color: #339933;">=></span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"pipe"</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">"r"</span><span style="color: #009900;">)</span><span style="color: #339933;">,</span>
<span style="color: #cc66cc;">1</span> <span style="color: #339933;">=></span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"pipe"</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">"w"</span><span style="color: #009900;">)</span><span style="color: #339933;">,</span>
<span style="color: #cc66cc;">2</span> <span style="color: #339933;">=></span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"file"</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">"/tmp/error-output.txt"</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">"a"</span><span style="color: #009900;">)</span>
<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$process</span> <span style="color: #339933;">=</span> <span style="color: #990000;">proc_open</span><span style="color: #009900;">(</span><span style="color: #000088;">$cmd</span><span style="color: #339933;">,</span> <span style="color: #000088;">$descriptorspec</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pipes</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #990000;">is_resource</span><span style="color: #009900;">(</span><span style="color: #000088;">$process</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #666666; font-style: italic;">// $pipes now looks like this:</span>
<span style="color: #666666; font-style: italic;">// 0 => writeable handle connected to child stdin</span>
<span style="color: #666666; font-style: italic;">// 1 => readable handle connected to child stdout</span>
<span style="color: #666666; font-style: italic;">// Send query to Java program</span>
<span style="color: #000088;">$command</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span>
<span style="color: #0000ff;">'dsn'</span> <span style="color: #339933;">=></span> <span style="color: #0000ff;">'jdbc:informix-sqli://10.0.0.1:1526/database;username=xxx;password=yyyy'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'query'</span> <span style="color: #339933;">=></span> <span style="color: #0000ff;">'select * from table WHERE id = ?'</span><span style="color: #339933;">,</span>
<span style="color: #0000ff;">'param'</span> <span style="color: #339933;">=></span> <span style="color: #990000;">array</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span>
<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">(</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">[</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">(</span><span style="color: #000088;">$command</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">(</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">[</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$output</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stream_get_contents</span><span style="color: #009900;">(</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">[</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">(</span><span style="color: #000088;">$pipes</span><span style="color: #009900;">[</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$return_value</span> <span style="color: #339933;">=</span> <span style="color: #990000;">proc_close</span><span style="color: #009900;">(</span><span style="color: #000088;">$process</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Decode output</span>
<span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">(</span><span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">(</span><span style="color: #000088;">$res</span><span style="color: #009900;">[</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">(</span><span style="color: #000088;">$res</span><span style="color: #009900;">[</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$res</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<h2>JAVA Source</h2>
<p>To make it better, I would add passing JDBC driver name as a parameter as well as connection timeout. May be add support for INSERT, UPDATE, DELETE</p>
<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.json.simple.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SimpleSelect <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">Connection</span> conn <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> JSONObject output<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">(</span><span style="color: #003399;">String</span><span style="color: #009900;">[</span><span style="color: #009900;">]</span> args<span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">{</span>
<span style="color: #003399;">Statement</span> stmt <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
output <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSONObject<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Decode jSON</span>
<span style="color: #666666; font-style: italic;">// http://code.google.com/p/json-simple/wiki/DecodingExamples</span>
<span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">(</span><span style="color: #003399;">System</span>.<span style="color: #006633;">in</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">final</span> JSONObject input <span style="color: #339933;">=</span> <span style="color: #009900;">(</span>JSONObject<span style="color: #009900;">)</span>JSONValue.<span style="color: #006633;">parse</span><span style="color: #009900;">(</span>br.<span style="color: #006633;">readLine</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
JSONArray param <span style="color: #339933;">=</span> <span style="color: #009900;">(</span>JSONArray<span style="color: #009900;">)</span>input.<span style="color: #006633;">get</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"param"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
output.<span style="color: #006633;">put</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"error"</span>, <span style="color: #0000ff;">""</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"com.informix.jdbc.IfxDriver"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">(</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">fatal_error</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"FAILED: failed to load Informix JDBC driver."</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #666666; font-style: italic;">// Connect though the thread to handle connection timeout</span>
<span style="color: #003399;">Thread</span> tc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Thread</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Runnable</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">conn</span> <span style="color: #339933;">=</span> <span style="color: #003399;">DriverManager</span>.<span style="color: #006633;">getConnection</span><span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #003399;">String</span><span style="color: #009900;">)</span>input.<span style="color: #006633;">get</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"dsn"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">(</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">fatal_error</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"FAILED: failed to connect to Informix!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
tc.<span style="color: #006633;">setDaemon</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
tc.<span style="color: #006633;">start</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Wait 5 sec for connection</span>
<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span> i <span style="color: #339933;"><=</span> <span style="color: #cc66cc;">500</span> <span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">(</span>conn <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">)</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">{</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">sleep</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">(</span><span style="color: #003399;">InterruptedException</span> ex<span style="color: #009900;">)</span> <span style="color: #009900;">{</span><span style="color: #009900;">}</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">(</span>conn <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">fatal_error</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"FAILED: timeout connect to Informix!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">{</span>
<span style="color: #003399;">PreparedStatement</span> pstmt <span style="color: #339933;">=</span> conn.<span style="color: #006633;">prepareStatement</span><span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #003399;">String</span><span style="color: #009900;">)</span>input.<span style="color: #006633;">get</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"query"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
pstmt.<span style="color: #006633;">setQueryTimeout</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span> i <span style="color: #339933;"><</span> param.<span style="color: #006633;">size</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">)</span>
pstmt.<span style="color: #006633;">setString</span><span style="color: #009900;">(</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span>, <span style="color: #009900;">(</span><span style="color: #003399;">String</span><span style="color: #009900;">)</span>param.<span style="color: #006633;">get</span><span style="color: #009900;">(</span>i<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #003399;">ResultSet</span> rs <span style="color: #339933;">=</span> pstmt.<span style="color: #006633;">executeQuery</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Get column name</span>
JSONArray jsColumn <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSONArray<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #003399;">ResultSetMetaData</span> rsmd <span style="color: #339933;">=</span> rs.<span style="color: #006633;">getMetaData</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;"><</span> rsmd.<span style="color: #006633;">getColumnCount</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span> <span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
jsColumn.<span style="color: #006633;">add</span><span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #003399;">String</span><span style="color: #009900;">)</span>rsmd.<span style="color: #006633;">getColumnName</span><span style="color: #009900;">(</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
output.<span style="color: #006633;">put</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"column"</span>, jsColumn<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Get the data</span>
JSONArray jsData <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSONArray<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">(</span>rs.<span style="color: #006633;">next</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
JSONArray jsRow <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSONArray<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;"><</span> rsmd.<span style="color: #006633;">getColumnCount</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span> <span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
jsRow.<span style="color: #006633;">add</span><span style="color: #009900;">(</span>rs.<span style="color: #006633;">getString</span><span style="color: #009900;">(</span>i<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
jsData.<span style="color: #006633;">add</span><span style="color: #009900;">(</span>jsRow<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
rs.<span style="color: #006633;">close</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
pstmt.<span style="color: #006633;">close</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
output.<span style="color: #006633;">put</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"data"</span>, jsData<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">(</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">fatal_error</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"FAILED: Fetch statement failed: "</span> <span style="color: #339933;">+</span> e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">{</span>
conn.<span style="color: #006633;">close</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">(</span><span style="color: #003399;">SQLException</span> e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
SimpleSelect.<span style="color: #006633;">fatal_error</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"FAILED: failed to close the connection!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">(</span>output<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fatal_error<span style="color: #009900;">(</span><span style="color: #003399;">String</span> str<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
output.<span style="color: #006633;">put</span><span style="color: #009900;">(</span><span style="color: #0000ff;">"error"</span>, str<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">(</span>output<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
<span style="color: #009900;">}</span>
<span style="color: #009900;">}</span></pre></td></tr></table></div>
text/html2013-02-22T06:00:54+01:00http://a32.me/Constantin BosneagaЭнергонезависимое решение
http://a32.me/ru/2013/02/jenergonezavisimoe-reshenie/
<h1><img class="alignleft" style="font-size: 13px" alt="" src="http://habrastorage.org/storage2/9cd/1dc/4d2/9cd1dc4d2de787b2bd9d42f807239498.jpeg" width="218" height="306" /></h1>
<div>
<h2>Понедельник. Постановка задачи</h2>
<p>Девять часов тридцать одна минута утра — я на работе. Вообще-то мы работаем с десяти до семи, но по понедельникам я предпочитаю приходить пораньше — мне нравится наш офис, пока в нём нет людей. Я медленно иду мимо столов — одни завалены распечатками спецификаций и каких-то диаграмм, другие совсем пустые. На одних столах стоят компьютеры, другие пустые. Под некоторыми столами стоит сменная обувь, перед другими нет даже кресла. Да, у нас больше половины столов пустые — это на случай приёма новых сотрудников, или командировки кого-то из других городов и стран. Ведь у нас крупная международная компания с офисами разработки в Омске и Калачинске и головным офисом на Кипре. Мы занимаем четыре этажа в современном офисном центре. Правда, сразу за нашим зданием начинаются руины какого-то авиационного завода, и в день зарплаты мы стараемся там не ходить.<a name="habracut"></a></p>
</div>
<div>
<p><span id="more-3352"></span>Мой стол стоит в углу, между пластиковой перегородкой и стеной. Прямо надо мной висит кондиционер, и, когда на улице делается совсем жарко, мне приходится приносить из дома свитер, чтобы не замёрзнуть. На мой взгляд, лучший кондиционер — это простое открытое окно, но у нас в офисе окна не открываются. Я думаю, архитекторы этого здания слышали о нервном истощении среди офисных работников, и решили минимизировать число суицидов. Зато вид с нашего двенадцатого этажа открывается шикарный. Жаль, большую часть времени окна закрываю жалюзи — чтобы солнечный свет не бликовал на мониторах и не слепил глаза. Поэтому у нас всегда включены лампы дневного света.Какой-то парень поздоровался со мной за руку и уселся за соседний стол. Он сел здесь в прошлый понедельник, неделю назад, но я до сих пор не знаю, как его зовут — мы работаем над разными проектами. Да, кстати, я работаю над проектом под названием Комплексное Корпоративное Решение — сокращённо КОКОРЕШ. Это очень сложная система, состоящая из множества модулей, десятков слоёв и сотен тысяч файлов с исходным кодом. Система такая большая, что никто не знает, что же она делает.</p>
<p>Подёргав мышку, я вывел компьютер из спящего режима и запустил браузер. В минувшую пятницу руководитель нашего проекта, Егор, уехал к потенциальным заказчикам в Демократическую Республику Конго. Сегодня должен состояться митинг по скайпу, в котором, по традиции, примет участие весь наш отдел. Само собой, говорить там будет только Егор и руководитель группы — Костя. Все остальные десять участников выключат микрофоны своих гарнитур и будут лениво читать твиттер и контакт.</p>
<p>Ближе к полудню подошли остальные сотрудники нашего отдела. Пока все здоровались и рассказывали о том, как внезапно пятница сменилась понедельником, неожиданно настало время обеда.</p>
<p>После обеда я получил письмо с приглашением на статус-митинг сегодня в 4 часа. Это означает, у меня есть два часа, чтобы смотреть ролики на Ютубе, ведь во время митинга Ютуб невозможно смотреть — скайп занимает практически весь канал.</p>
<p>В половине пятого запиликал входящий вызов. Я быстро надел гарнитуру, нажал зелёную кнопку ответа на звонок и выключил микрофон. Проджект-меденжера было слышно плохо. Из трубки что-то постоянно бухало, казалось, что где-то недалеко от него бьют барабаны.</p>
<p>— Добрый день, коллеги! — начал он, — Сразу скажу, что здесь у нас нет электричества, и аккумулятор моего ноутбука почти сел. Наши партнёры из Демократической республики Конго, они очень… они крайне дружелюбно настроены, я уверен, и у нашей крупной международной компании тут неплохие перспективы. Нам следует быть настойчивыми, и непрерывно двигаться вперёд. Воля к победе — вот главное, и вместе мы добьёмся много, ведь наше будущее, и значит будущее нашей крупной международной компании, зависит от каждого из нас. Мы должны стремиться к успеху, и, постоянно совершенствуясь, добиваться невозмож…</p>
<p>Тут связь разорвалось. Повисла неловкая тишина.</p>
<p>Я подумал, что Конго — одна из последних стран, где сохранился каннибализм, и что там сейчас как раз время к обеду. Но решил не подрывать корпоративный дух.</p>
<p>Первым заговорил Костя:<br />
— Итак, выяснилось, что в Конго нет электричества. Но это не помешает нам внедрить у них наше Комплексное Корпоративное Решение. Наша задача — разработать энергонезависимый модуль для нашей системы. Наш архитектор Гриша подготовит архитектуру. Так ведь, Гриша?<br />
Гриша заулыбался. Слегка скошенный нос придавал его улыбке неповторимый шарм. Когда-то в молодости он занимался дзюдо и был неплохо сложён, но сейчас практически вся его мышечная масса перешла в жировую.<br />
— Беру на себя обязательство к завтрашнему утру подготовить архитектуру энергонезависимого КОКОРЕШа, — торжественно произнёс он и ещё раз улыбнулся, для закрепления эффекта.<br />
— Отлично, — Костя хлопнул в ладоши, — завтра давайте придём все пораньше, потому что времени на проект у нас мало — до конца недели.<br />
— Я вот подумал, в такой ситуации можно им всем счёты раздать, — неловко пошутил я. Все дружно засмеялись.</p>
<p>Остаток дня мы рисовали на маркерной доске наших африканских партнёров. К сожалению, чёрный маркер кто-то стащил, поэтому мы рисовали их зелёным. Неожиданно рабочий день закончился.</p>
<h2>Вторник. Архитектура</h2>
<p>В девять я уже сидел за рабочим компьютером и читал новости. Конечно, до одиннадцати никого из нашего отдела в офисе не было.</p>
<p>Ближе к полудню пришёл архитектор Гриша со свёрнутыми плакатами под мышкой. Пока он со всеми здоровался и рассказывал, как он стоял в пробке, неожиданно подошло время обеда.</p>
<p>После обеда Костя позвал всех в комнату для совещаний.<br />
— Итак, архитектура решения готова, — с этими словами Гриша развернул и повесил на доске два плаката.<br />
Я посмотрел на них и тяжело вздохнул, закрыв лицо ладонью.</p>
<p><img alt="" src="http://habrastorage.org/storage2/458/258/e0c/458258e0cf023a7f086fcdacd319ca05.png" /></p>
<p>На первом плакате, озаглавленном «КОКОРЕШ», было изображён синий прямоугольник, а рядом с ним — батарейка. На втором плакате, подписанном «ЭНЕКОКОРЕШ», был изображён один только синий прямоугольник.<br />
— На первом плакате вы видите архитектуру существующего, энергозависимого решения. На втором — архитектура энергонезависимого решения, — радостно сообщил Гриша и, повернувшись к нам, заулыбался так, как будто не понимал бессмысленности собственной работы.<br />
— Отлично, Григорий! Молодец! — похвалил его Костя — Как тебе в столь сжатые сроки удалось создать такую архитектуру?<br />
— Ну как, — смутился Гриша, — нормально, Константин.<br />
— Ну ладно, — улыбнулся Костя, — теперь дело за малым — осталось реализовать эту архитектуру.<br />
— Кость, постой… — заговорил я, — компьютеры же без электричества работать не будут…<br />
— Слушай, я тебя, конечно, ценю как специалиста, — нахмурив брови, ответил мне Костя, — но твоё дело — реализация, а архитектура, вот она, — он показал рукой на плакаты, — готова уже. Ну и чего здесь сложного? Написать программу, и всё. Говоришь, без электричества работать не будет. А ты что, пробовал уже?<br />
Честно говоря, я ни разу не пробовал включать компьютер без электричества, но базовые познания в его устройстве подсказывали мне, что он не заработает.<br />
— Нет, не пробовал… — ответил я.<br />
— Ну вот видишь — рассмеялся Костя. И все тоже засмеялись, кроме меня.<br />
Когда митинг закончился, было уже пять часов.</p>
<p>Сразу после митинга Гриша и Костя ушли куда, ни с кем не попрощавшись. Я сидел за своим компьютером и задумчиво листал Контактик. За перегородкой Сергей что-то отчаянно набирал на клавиатуре.<br />
— И всё таки, им нужны счёты, — задумчиво произнёс я. Сергей перестал стучать по клавиатуре, сдавленно хрюкнул за своей перегородкой, и, кажется, обрызгал её слюной.<br />
— Слушай, а что ты там делаешь целыми днями? — спросил я Сергея.<br />
— Я фильмы смотрю, — честно ответил он.<br />
— Как же так, ты же целыми днями что-то набираешь на клавиатуре. Я думал, ты код пишешь, — удивился я.<br />
— Я специально клаву отключаю. А по клавишам стучу просто так, для поддержания рабочей атмосферы в офисе.</p>
<p>Неожиданно рабочий день закончился.</p>
<h2>Среда. Разработка</h2>
<p>Я пришёл на работу в девять сорок две и начал читать свежие твиты. Я специально читаю почти тысячу человек — к моменту, когда я прочту свежую порцию твитов, уже появляются новые. Примерно в половине одиннадцатого пришёл Сергей. Я успел заметить момент, как он, надев наушники, отключил клавиатуру и принялся стучать по клавишам.</p>
<p>Поздним утром, около двенадцати часов, ко мне подошёл Костя, и, наклонившись, тихо сказал:<br />
— Слушай, это… С твоим опытом, с твоими знаниями, я хочу, что бы ты был за старшего. Возьми шефство над Сергеем в этом проекте. Тем более что вы только вдвоём будете работать над ним. И я тебя очень прошу, завершите его в срок.<br />
Я только вздохнул. Ну как мне ему объяснить, что проект в принципе не реализуем? Что архитектор Гриша — дурак со справкой, и поэтому так улыбается? Что руководителя проектов, возможно, уже съели жители республики Конго? Что, в конце-концов, без электричества ни одно электронное устройство работать не может?<br />
— Я считаю, без электричества компьютеры работать не будут. Аборигенам из Конго нужны счёты, — сказал я, нарочно громко и чётко. Повисла напряжённая тишина. Стало особенно чётко слышно, что Сергей за перегородкой почти не нажимает на пробел.<br />
Наконец Костя нарушил молчание:<br />
— Ну давай, работай, не буду тебе мешать — и быстро ушел куда-то, позвав с собой Гришу.</p>
<p>Неожиданно наступило время обеда.</p>
<p>После обеда я решил всё-таки взяться за работу.<br />
— Серёг, — сказал я своему соседу из-за перегородки, — давай найдём место в коде, которое потребляет больше всего электричества?<br />
— Понимаешь, это мы уже делали, — сказал Сергей. На звуке «п» в слове «понимаешь» из его рта вылетела слюна и ударилась о перегородку. Всё-таки хорошо, что они здесь стоят.<br />
— Ну а когда это делали, ты помнишь, номер таски? Коммит в свн?<br />
— Сейчас… — Сергей помедлил, — это была таска KOKORESH-4920.<br />
Я попытался открыть задачу с таким номером в багтрекере, но получил сообщение, что у меня нет прав. Поскольку Кости в зоне видимости не было, я написал тикет в хелпдеск, чтобы мне дали права.<br />
Спустя один час и двадцать минут мне ответили, что права могут дать только в случае подтверждения заявки от менеджера проекта. Я было хотел ответить, что его скорее всего уже съели, но потом подумал, что не так уж и нужна мне эта таска.</p>
<p>Вместо этого я решил написать письмо всем заинтересованным в проекте лицам с целью поставить их в известность, что без электричества компьютеры не работают. Я нажал кнопку «написать письмо», но тут появилось стандартное сообщение об ошибке: «Outlook выполнил недопустимую операцию и будет закрыт». «Ладно, не судьба. Попробую завтра» — решил я, и, выключил компьютер.</p>
<p>Неожиданно рабочий день закончился.</p>
<h2>Четверг. Ещё раз разработка</h2>
<p>Придя в офис, я первым делом написал письмо.<br />
«Добрый день, коллеги!» — начал я своё письмо, — «Я предлагаю упростить задачу с разработки энергонезависимой реализации КОКОРЕШа до поставки готового решения в виде деревянных счёт. Главный довод в пользу этого решения состоит в том, что у наших заказчиков нет электричества. В отсутствии электричества ни одни программно-аппаратный комплекс работать не может. Кроме того, я выражаю своё сомнение в том, что у пользователей, никогда не видевших компьютера, хватит квалификации для работы с КОКОРЕШом.» Я несколько раз перечитал набранный текст, добавил подпись и получателей — руководителя группы Костю, архитектора Гришу и проджет-менеджера Егора. Хотя, положа руку на сердце, я не думаю, что Егор ещё в состоянии что-либо прочесть. Вздохнув, я, для верности, добавил в копию регионального менеджера, Андрэ Эдуардовича Белокрылого, и нажал кнопку «Отправить».</p>
<p>Кстати, после одного неприятного случая на моей предыдущей работе, я всегда сначала пишу письмо, а уже потом добавляю адресатов. Тогда один из множества моих начальнивов спросил меня, как скоро я смогу закончить работу, и требуется ли мне ждать выгрузку данных из коллешена. Я хотел написать «да, мне похоже, придётся дождаться выгрузки данных», но письмо отправилось ровно на середине слова «похоже». В общем, мне пришлось срочно искать работу, да ещё и самыми плохими рекомендациями с предыдущего места. Кроме как в крупную международную компанию, меня никуда не брали. И вот теперь я здесь, вынужден писать программу, которой не требуется электроэнергия.</p>
<p>Неожиданно настало время обеда.</p>
<p>После обеда Костя подозвал меня к себе.<br />
— Знаешь, твоё решение насчёт счёт было не таким уж и плохим, — тихо произнёс он.<br />
— Так значит мы всё-таки внедрим папуасам счёты? — удивился я. Невероятно, чтобы моё письмо могло изменить уже прянтое решение!<br />
— Тише, тише, дослушай. К сожалению, на проработку энергонезависимого КОКОРЕША уже потрачены ресурсы, значительно превышающие стоимость твоего решение со счётами. Так что сам понимаешь, в твоих интересах больше никому про счёты не говорить, иначе получится, что мы зря ресурсы тратили. Ты же умный парень, улавливаешь? А энергонезависимое решение уже практически готово. По моим прикидкам, мы его должны закончить уже сегодня. Поэтому, если сегодня не получится, придётся завтра плотно поработать, и на выходные ничего не планируй. Ну вы должны уложиться, там же немного по сути осталось.<br />
Костя немного помолчал, и, наверное, чтобы приободрить меня, добавил:<br />
-Знаешь, я ведь сам когда-то программировал. Там же всего пару строчек кода написать нужно, неужели не справишься?</p>
<p>Вечером пришёл ответ от самого Андрэ Эдуардовича. Содержательная часть состояла из одной строки: «Я считаю ситуацию, когда рядовые разработчики занимаются вопросами архитектуры, недопустимой. В дальнейшем обсуждении вопроса смысла не вижу.» И далее подпись длинною в восемь строк.</p>
<p>Я подошёл к окну. По небу ползли низкие серые облака, а из них на землю падала неопределённая субстанция. Где-то на горизонте виднелись огромные трубы и радиовышки. «Интересно, сейчас лето или зима?» — пронеслось в моей голове. Для нас, офисных работников, смена времён года имеет чисто формальное значение. Лето отличается от зимы только тем, что летом мы носим свитера в офисе, чтобы не мёрзнуть под кондиционером, а зимой — чтобы добежать от подъезда до своего Форд Фокуса. Мы стараемся, работаем каждый день, хотя ничего и не производим. Наша деятельность не оставляет никаких следов в окружающем мире, хотя это, наверное, и к лучше — ведь всё, что мы делаем — мы делаем плохо. Так что же мы делаем здесь? Ответ прост — мы делаем карьеру.</p>
<p>Многие ошибочно полагают, что русское слово «карьера» происходит от английского «career» — «профессия». Но это не так, какая же профессия может быть у офисного работника? Профессия может быть только у тех, кто что-то производит. Офисный работник же занят исключительно ментальным уничтожением себя. Слово «карьера» происходить от итальянского «cariare», что означает «вызывать гниение». С этим может не согласиться лишь тот, кто никогда не видел, как здоровый юноша или красивая молодая девушка, попав о офис, через пять-шесть лет превращается в безвольное существо с пустыми глазами, двойным подбородком и дряблыми мышцами.</p>
<p>Меня вдруг взяла злость. Нет, даже гнев. Мне захотелось, подобно герою Майкла Дугласа из «Falling down», взять пистолет и убивать. Перестрелять всех бюрократов, всех капиталистов, всех менеджеров среднего и высшего звена, специалистов по поисковой оптимизации, и, конечно же, сотрудников отдела кадров. Я почувствовал, как кровь прилила к голове, а тонкие пальцы сами собой сжались в кулаки. Но потом я вспомнил про свои невыплаченные кредиты, и гнев сменился апатией. Какая, в конце концов, мне разница, возможно ли выполнить полученную мне работу, или нет? Мне платят деньги не за результат, а за время, которое я провожу здесь. Моя деятельность сродни проституции. Вот кстати интересно, получают ли линейные менеджеры удовольствие после общения со своими подчинёнными?..</p>
<p>И тут я понял, что мне следует сделать. Завтра с утра я сделаю свою работу наилучшим из возможных способов.</p>
<p>Неожиданно я ушёл за десять минут до конца рабочего дня, не сказав никому ни слова.</p>
<h2>Пятница. Релиз</h2>
<p>Костя пришёл на работу ранним утром, примерно в половине одиннадцатого, и первым делом подошёл ко мне.<br />
— Ну, каков статус проекта? — спросил он сурово.<br />
— Готов, — спокойно ответил я.<br />
— А покажи, — всё так же сурово попросил Костя.<br />
— Конечно. Вот смотри, — и я открыл папку, в которой лежал один экзешник, и дважды ткнул по нему мышкой. На секунду курсор превратился в песочные часы, и на экране появилось диалоговое окно с сообщением «Энергонезависимый КОКОРЕШ не может быть запущен в энергозависимом окружении»<br />
Лицо Коли расплылось в довольной улыбке:<br />
— Молодец! Это как раз то, что требуется. А энергонезависимое окружение закажем у отдела снабжения, пока они его закупят… Если закупят вообще… Слушай, а точно оно работает без электричества?<br />
— Обижаешь, я же профессионал! — улыбнувшись, ответил я.</p>
<p>За чтением фишек-нет рабочий день закончился, как всегда, неожиданно.</p>
<p><i>Этот рассказ, вместе со многими другими, можно прочесть в книге <a href="http://it-as-is.ru/">IT AS IS</a></i></p>
</div>
text/html2013-02-22T01:50:35+01:00http://a32.me/Constantin BosneagaРуанда – Национальный музей в Бутаре
http://a32.me/ru/2013/02/ruanda-nacionalnyj-muzej-v-butare/
<p><em><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2036.jpg"><img class="alignleft" alt="IMG_2036" src="http://a32.me/wp-content/uploads/2013/04/IMG_2036-1024x841.jpg" width="198" height="163" /></a>22 Февраля 2013</em></p>
<p>Вот и настал последний день в Африке. Проснулся я в далекой Гисакуре, но спешить особо было некуда. В планах был только музей в Бутаре.</p>
<p><span id="more-3712"></span></p>
<p>Утречком после завтрака выхожу на автобусную остановку, покупаю билет и жду автобуса. Даже в самой отдаленной деревне с транспортом без проблем. Через полчаса уже еду в автобусе в город Бутаре. Хотя сейчас он называется Huye, очень страшное название в русской транскрипции.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_1624.jpg"><img class="aligncenter size-large wp-image-3739 bigpic" alt="IMG_1624" src="http://a32.me/wp-content/uploads/2013/04/IMG_1624-1024x768.jpg" width="550" height="412" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_1624-300x225.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_1624-1024x768.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_1624-570x427.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_1624.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Из такого разнообразия старых и новых названий, употребления названия районов вместо городов, возникает большая путаница в голове.</p>
<p>В Бутаре (Хуйе) заправка является по совместительсву автовокзалом, мойкой, магазином, столовой и автомастерской. Сюда я и прехал.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2060-001.jpg"><img class="bigpic" alt="IMG_2060-001" src="http://a32.me/wp-content/uploads/2013/04/IMG_2060-001-1024x695.jpg" width="550" height="373" /></a></p>
<p>Сам музей находился недалеко, спасибо GPS прошелся пешком.</p>
<p>Выглядит солидно. Большой двор, и ухоженный парк.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2021.jpg"><img class="bigpic" alt="IMG_2021" src="http://a32.me/wp-content/uploads/2013/04/IMG_2021-1024x738.jpg" width="550" height="396" /></a></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2016.jpg"><img class="bigpic" alt="IMG_2016" src="http://a32.me/wp-content/uploads/2013/04/IMG_2016-1024x857.jpg" width="550" height="460" /></a></p>
<p> </p>
<p>Вход стоил что-то около 6000FRW, так как я уже избавлялся от денег, то жаба молчала. Фотографировать категорически запретили, ну нельзя так нельзя, подумал я <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_1996.jpg"><br />
</a> <a href="http://a32.me/wp-content/uploads/2013/04/IMG_2002.jpg"><img class="aligncenter size-large wp-image-3718 bigpic" alt="IMG_2002" src="http://a32.me/wp-content/uploads/2013/04/IMG_2002-1024x768.jpg" width="550" height="412" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2002-300x225.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2002-1024x768.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2002-570x427.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2002.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2004.jpg"><img class="aligncenter size-large wp-image-3719 bigpic" alt="IMG_2004" src="http://a32.me/wp-content/uploads/2013/04/IMG_2004-1024x768.jpg" width="550" height="412" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2004-300x225.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2004-1024x768.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2004-570x427.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2004.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2008.jpg"><img class="aligncenter size-large wp-image-3720 bigpic" alt="IMG_2008" src="http://a32.me/wp-content/uploads/2013/04/IMG_2008-1024x541.jpg" width="550" height="290" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2008-300x158.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2008-1024x541.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2008-570x301.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2008.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2010.jpg"><img class="aligncenter size-large wp-image-3721 bigpic" alt="IMG_2010" src="http://a32.me/wp-content/uploads/2013/04/IMG_2010-1024x768.jpg" width="550" height="412" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2010-300x225.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2010-1024x768.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2010-570x427.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2010.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Парк позади музея.<a href="http://a32.me/wp-content/uploads/2013/04/IMG_2016.jpg"><br />
</a> <a href="http://a32.me/wp-content/uploads/2013/04/IMG_2033.jpg"><img class="aligncenter size-large wp-image-3724 bigpic" alt="IMG_2033" src="http://a32.me/wp-content/uploads/2013/04/IMG_2033-1024x767.jpg" width="550" height="411" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2033-300x224.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2033-1024x767.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2033-570x427.jpg 570w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Только местные могут как ни в чем не бывало спать не солнце <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2034.jpg"><img class="aligncenter size-large wp-image-3725 bigpic" alt="IMG_2034" src="http://a32.me/wp-content/uploads/2013/04/IMG_2034-1024x767.jpg" width="550" height="411" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2034-300x224.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2034-1024x767.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2034-570x427.jpg 570w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Это национальные жилища.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2036.jpg"><img class="aligncenter size-large wp-image-3726 bigpic" alt="IMG_2036" src="http://a32.me/wp-content/uploads/2013/04/IMG_2036-1024x841.jpg" width="550" height="451" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2036-300x246.jpg 300w, http://a32.me/wp-content/uploads/2013/04/IMG_2036-1024x841.jpg 1024w, http://a32.me/wp-content/uploads/2013/04/IMG_2036-570x468.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2036.jpg 1600w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p>Внутри сидят национальные девушки и делают национальные изделия. Говорят на франсе и хихикают.</p>
<p><a href="http://a32.me/wp-content/uploads/2013/04/IMG_2041.jpg"><img class="aligncenter size-large wp-image-3727 bigpic" alt="IMG_2041" src="http://a32.me/wp-content/uploads/2013/04/IMG_2041-768x1024.jpg" width="550" height="733" srcset="http://a32.me/wp-content/uploads/2013/04/IMG_2041-225x300.jpg 225w, http://a32.me/wp-content/uploads/2013/04/IMG_2041-768x1024.jpg 768w, http://a32.me/wp-content/uploads/2013/04/IMG_2041-570x760.jpg 570w, http://a32.me/wp-content/uploads/2013/04/IMG_2041.jpg 1200w" sizes="(max-width: 550px) 100vw, 550px" /></a></p>
<p> </p>
<p>Не сказать что я большой любитель музеев, прогулка понравилась. Еще надо исходить из общего количества достопримечательностей в Руанде. Более половины это музеи геноцида, на любителя. Все такие здесь надо смотреть природу.</p>
<p>Через два часа я уже ехал в Кигали, куда и добрался под вечер.</p>
<p>Перепаковал свои вещи, и собрался в аэропорт, где дождался регистрации и вылета. Забавный был выход на посадку, вроде солидный гейт, с корридором, а за ним сразу летное поле. Для посадки пассажиры шли пешком через все взлетное поле, самолет надо было выбрать методом тыка <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Все-таки рейс Стамбул-Кигали-Кампала немного странный. Садимся мы в салон, там уже все сидят. Летим полчаса до Кампалы столица Уганды. Там почти все выходят. Самолет убирают, пылесосят, через час заходят другие пассажиры и мы летим домой <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Вот такие вот приключения <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Итак все выходные успешно освоены!</p>
<p>Последний такой <a title="Путешествие по Грузии: Тбилиси" href="http://a32.me/ru/2011/08/puteshestvie-po-gruzii-tbilisi/">вояж у меня был в Грузии</a>, рекомендую к прочтению.</p>
<h2>А дальше?</h2>
<p><a title="Руанда – Кигали – Как все начиналось" href="http://a32.me/ru/2013/02/rwanda-kigali-kak-vse-nachinalos/">Руанда – Кигали – Как все начиналось</a></p>
<p><a title="Руанда – Кибуйе (Kibuye)" href="http://a32.me/ru/2013/03/rwanda-kibuye/">Руанда – Кибуйе (Kibuye)</a></p>
<p><a title="Руанда – Гисени (Giseniy)" href="http://a32.me/ru/2013/03/rwanda-trevel-giseniy/">Руанда – Гисени (Giseniy)</a></p>
<p><a title="Руанда: Акагера – национальный парк" href="http://a32.me/ru/2013/03/rwanda-akagera-national-park/">Руанда – национальный парк Акагера</a></p>
<p><a title="Руанда – парк Nyungwe – Uwinka" href="http://a32.me/ru/2013/04/rwanda-nyungwe-uwinka/">Руанда – нац. парк Nyungwe – Uwinka</a></p>
<p><a title="Руанда – Kamiranzovu Waterfall" href="http://a32.me/ru/2013/04/rwanda-kamiranzovu-waterfall/">Руанда – Kamiranzovu Waterfall</a></p>
<p><a title="Руанда – Национальный музей в Бутаре" href="http://a32.me/ru/2013/04/ruanda-nacionalnyj-muzej-v-butare/">Руанда – Национальный музей в Бутаре</a></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>