tag:blogger.com,1999:blog-88746625579789467162024-03-13T06:40:24.328-07:00Обыкновенный блогОстровок obyknovenius в океане ИнтернетаAnonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-8874662557978946716.post-39057270947370088232014-03-02T09:31:00.001-08:002014-03-02T09:33:55.004-08:00Перетягивание с фиксацией (drag-lock) в Gnome 3Возможно я ретроград, но мне нравится, когда перетягивая окно я могу оторвать палец тачпада, например когда дошел до края, перенести палец и продолжить перетаскивать окно. Это касается и выделения больших абзацев текста. В OS X эта функция называется "пертягивание с фиксацией" или просто "drag-lock". К сожалению, в Gnome 3 сделать это с помощью стандратных настроек невозможно. Там просто нет соответсвующего пункта:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-tqVUoX0L-ss/UxNq0kSamPI/AAAAAAAAAS8/17rLYskaQZo/s1600/Screenshot+from+2014-03-02+21:20:01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-tqVUoX0L-ss/UxNq0kSamPI/AAAAAAAAAS8/17rLYskaQZo/s1600/Screenshot+from+2014-03-02+21:20:01.png" height="157" width="320" /></a></div>
Но это же Linux! Здесь все можно исправить вооружившись консолью!<br />
Все что нужно это добавить следующие настройки в файл <span style="font-family: Courier New, Courier, monospace;">/etc/X11/xorg.conf</span>:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"># Drag-Lock on the touchpad</span><br />
<span style="font-family: Courier New, Courier, monospace;">Section "InputClass"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Identifier<span class="Apple-tab-span" style="white-space: pre;"> </span>"finger-touchpad-draglock"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> MatchDriver<span class="Apple-tab-span" style="white-space: pre;"> </span>"synaptics"</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span># enable drag-lock</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Option<span class="Apple-tab-span" style="white-space: pre;"> </span>"LockedDrags"<span class="Apple-tab-span" style="white-space: pre;"> </span>"on"</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>Option<span class="Apple-tab-span" style="white-space: pre;"> </span>"LockedDragTimeout"<span class="Apple-tab-span" style="white-space: pre;"> </span>"3000"</span><br />
<span style="font-family: Courier New, Courier, monospace;">EndSection</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
и перзагрузить иксы (ну или компьютер целиком).<br />
Это решение было найдено на просторах <a href="http://forums.fedoraforum.org/showpost.php?p=1659115&postcount=2" target="_blank">форума Fedora</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-43707281443078560552013-05-10T14:59:00.000-07:002014-03-02T09:27:42.801-08:00Отладка Go кода с помощью GDB. Введение<br />
<a href="http://golang.org/doc/gdb" target="_blank">Оригинал</a><br />
<br />
<i>Нижесказанное относится к инструментарию <span style="font-family: Courier New, Courier, monospace;">gc</span>. Gccgo имеет встроенную поддержку gdb. Помимо этого обзора Вы можете консультироваться с <a href="http://sourceware.org/gdb/current/onlinedocs/gdb/" target="_blank">руководством по GDB</a>.</i><br />
<i><br /></i>
<i><br /></i>
<i><br /></i>
Когда Вы компилируете и компонуете ваши Go программы с помощью инструментария gc в Linux, Mac OS X или FreeBSD, полученные в результате бинарные файлы содержат отладочную информацию DWARFv3, которую отладчик GDB последней версии (>7.1) может использовать для исследования живого процесса или дампа.<br />
<br />
Чтобы опустить отладочную информацию передайте флаг <span style="font-family: Courier New, Courier, monospace;">'-s'</span> компоновщику (например, <span style="font-family: Courier New, Courier, monospace;">go build -ldflags "-s" prog.go</span>).<br />
<br />
Код, генерируемый компилятором gc, включает встраивание вызовов функций и регистеризацию переменных. Эти оптимизации иногда могут сделать отладку с помощью GDB сложнее. Чтобы отключить их на время отладки, передайте флаг <span style="font-family: Courier New, Courier, monospace;">-gcflags "-N -l"</span> команде <a href="http://golang.org/cmd/go" target="_blank"><span style="font-family: Courier New, Courier, monospace;">go</span></a>, которая используется для сборки отлаживаемого кода.<br />
<br />
<h3>
Распространенные операции</h3>
<ul>
<li>Показать файл и номер строки кода, установить точку останова и дизассемблировать:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>list</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>list <i>line</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>list <i>file.go:line</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>break <i>line</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>break <i>file.go:line</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> (gdb) <b>disas</b></span><br />
<ul>
<li>Показать трассировку и раскрученные стековые кадры:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>bt</b><br /><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>frame <i>n</i></b></span><br />
<ul>
<li>Показать имя, тип и расположение в стековом кадре локальных переменных, аргументов и возвращаемых значений:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>info locals</b><br /><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>info args</b><br /><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>p variable</b><br /><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>whatis variable</b></span><br />
<ul>
<li>Показать имя, тип и расположение глобальных переменных:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>info variables <i>regexp</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b><i><br /></i></b></span>
<br />
<div>
<div>
<h3>
Go расширения</h3>
Новый механизм расширений GDB позволяет загружать скрипты расширений для заданного двоичного файла. Инструментарий использует этот факт, для того чтобы расширить GDB небольшим числом команд, позволяющих исследовать внутренности исполняемого кода (такие как горутины) и красиво отображать встроенные типы словарей, срезов и каналов.<br />
<ul>
<li>Красивое отображение строк, срезов, словарей, каналов или интерфейсов:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>p <i>var</i></b></span><br />
<ul>
<li>$len() и $cap() функции для строк, срезов и словарей:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>p $len(<i>var</i>)</b></span><br />
<ul>
<li>Функция для приведения интерфейсов к их динамическим типам:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>p $dtype(<i>var</i>)</b><br /><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>iface <i>var</i></b></span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><b>Известная проблема:</b> GDB не может автоматически находить динамический тип значения интефейса, если его длинно имя отличается от короткого (раздражает, когда выводится трассировка стека, вместо красивого отображения мы получаем короткое имя типа и указатель).<br />
<ul>
<li>Исследование горутин:</li>
</ul>
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>info goroutines</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>goroutine <i>n cmd</i></b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>help goroutine</b></span><br />
Например:<br />
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>(gdb) <b>goroutine 12 bt</b></span><br />
<br />
Если Вы хотите узнать как скрипт расширения работает или хотите расширить его, посмотрите <a href="http://golang.org/src/pkg/runtime/runtime-gdb.py" target="_blank">src/pkg/runtime/runtime-gdb.py</a> в директории исходных кодов Go. Он зависит от нескольких специальных магических типов (<span style="font-family: Courier New, Courier, monospace;">hash<T,U></span>) и переменных (<span style="font-family: Courier New, Courier, monospace;">runtime.m</span> и <span style="font-family: Courier New, Courier, monospace;">runtime.g</span>), описание которых в DWARF коде обеспечивает компоновщик (<a href="http://golang.org/src/cmd/ld/dwarf.c" target="_blank">src/cmd/ld/dwarf.c</a>).<br />
<br />
Если Вам интересно как выглядит отладочная информация, запустите '<span style="font-family: Courier New, Courier, monospace;">objdump -W 6.out</span>' и просмотрите секции <span style="font-family: Courier New, Courier, monospace;">.debug_*</span>.<br />
<br />
<h3>
Известные проблемы</h3>
<ol>
<li>Красивое отображение строк срабатывает только для типа строка, а не для для типов, наследуемых от него.</li>
<li>Информация о типах отсутствует для частей библиотеки времени выполнения написанных на C.</li>
<li>GDB не понимает определения имен Go и рассматривает <span style="font-family: Courier New, Courier, monospace;">"fmt.Print"</span> в качестве неструктурированного литерала с <span style="font-family: Courier New, Courier, monospace;">"."</span>, который должен быть помещен в кавычки. Это еще более относится именам методов `<span style="font-family: Courier New, Courier, monospace;">pkg.(*MyType).Meth</span>`.</li>
<li>Все глобальные переменные причисляются к пакету <span style="font-family: Courier New, Courier, monospace;">main</span>.</li>
</ol>
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-7653205200753786172013-04-26T12:36:00.000-07:002013-04-26T12:38:13.123-07:00Я теперь захабренный!<div class="separator" style="clear: both; text-align: center;">
<span id="goog_157645390"></span><span id="goog_157645391"></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-CTuIQi1fhOc/UXrTq0xZOmI/AAAAAAAAAQs/u7XqMiIyz1Y/s1600/habr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="335" src="http://3.bp.blogspot.com/-CTuIQi1fhOc/UXrTq0xZOmI/AAAAAAAAAQs/u7XqMiIyz1Y/s400/habr.png" width="400" /></a></div>
Да, это наконец-то случилось!<br />
<br />
Как только я узнал о хабре, я сразу захотел стать частью его сообщества. Но тогда я был зеленым студентом и написать статью, тянущую на инвайт мне было не под силу. Со временем я перестал придавать этому большое значение и бросил попытки. На самом деле их было не так много. Но когда я знакомился с новыми людьми из области IT, я все же робко интересовался, нет ли у них лишнего инвайтика.<br />
<br />
Но сегодня, благодаря предыдущей статье из этого блога, это произошло! На самом деле, это не было главной целью для меня. В первую очередь статья писалась (переводилась) именно для этого блога, а не для хабра. Так что это своего рода побочный эффект. Но от этого не менее приятный. Пожалуй пойду отмечу это событие баночкой Löwenbräu.Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-60438649457771058692013-04-26T00:57:00.002-07:002013-04-26T10:30:36.592-07:00Крэши, вызванные исключениями<a href="http://blog.labix.org/2013/04/23/exceptional-crashes" target="_blank">Оригинал</a><br />
<br />
На прошлой неделе я вместе с несколькими моими коллегами участвовал в громкой речи о том факте, что Go обрабатывает ошибки в ожидаемых сценариях посредством возвращения кода ошибки вместо использования исключений или другого схожего механизма. Это довольно спорная тема, потому что люди привыкли избегать ошибки с помощью исключений, а Go возвращает <a href="http://golang.org/doc/articles/error_handling.html" target="_blank">улучшенную версию</a> хорошо известной модели, ранее принятой несколькими языками - включая C - при которой ошибки передаются через возвращаемые значения. Это значит, что ошибки маячат перед глазами программиста и вынуждают иметь с ними дело <i>все время</i>. Кроме того, спор переходит в направление того факта, что в языках с исключениями каждая ошибка безо всяких дополнительных действий несет в себе полную информацию о том, что и где произошло, а это может быть полезно в некоторых случаях.<br />
<br />
<a name='more'></a>Однако все эти удобства имею стоимость, которую легко сформулировать:<br />
<b><i>Исключения учат разработчиков не заботиться об ошибках.</i></b><br />
<br />
Печальным следствием является то, что это актуально, даже если Вы блестящий разработчик, так как на Вас оказывает влияние окружающий мир, который снисходителен к ошибкам. Проблема проявится в библиотеках, которые Вы импортируете, в приложениях, установленных на ваш компьютер, а также <i>на серверах, которые хранят ваши данные</i>.<br />
<br />
Реймонд Чен так описал эту проблему <a href="http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx" target="_blank">в 2004</a>:<br />
<br />
<blockquote class="tr_bq">
<i>Написание корректного кода в модели с выбрасыванием исключений в некотором смысле труднее, чем в модели с возвращением кода ошибки, так как что угодно может потерпеть неудачу и Вы должны быть готовы к этому. В модели с возвращением кода ошибки, момент когда вы должны произвести проверку на наличие ошибок очевиден: как только вы получили код ошибки. В модели с исключениями Вы просто должны знать, что ошибки могут произойти в любом месте.</i></blockquote>
<blockquote class="tr_bq">
<i>Другими словами, в модели с возвращением кода ошибки, когда кто-то пропускает обработку ошибки это происходит явно: они не проверяют код ошибки. В то же время в модели с выбрасыванием исключений при рассмотрении кода, в котором кто-то обрабатывает ошибку все не так ясно, так как ошибка не указана явно.<br />(…)<br />Когда Вы пишете код, задумываетесь ли Вы о том, каковы могут быть последствия каждого исключения, которое может возникнуть в каждой строчке кода? Вы должны делать это, если собираетесь писать корректный код.</i></blockquote>
<br />
Это абсолютно верно. Каждая строка, которая может вызвать исключение несет скрытую ветку "else" для ошибочного сценария, о которой очень легко забыть. Даже если внедрение кода для обработки ошибок кажется бессмысленным повторением, его написание заставляет разработчиков помнить об альтернативном сценарии, и довольно часто этот код оказывается не пустым.<br />
<br />
Я не первый раз пишу об этом и, учитывая споры, которые окружают это заявление, поэтому я нашел пару примеров, которые подтверждают проблему. Лучший пример, который я смог найти на сегодняшний день находится в модуле <a href="http://docs.python.org/3/library/pty.html" target="_blank">pty</a> стандартной библиотеки Python 3.3:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">def spawn(argv, master_read=_read, stdin_read=_read):</span><br />
<span style="font-family: Courier New, Courier, monospace;"> """Create a spawned process."""</span><br />
<span style="font-family: Courier New, Courier, monospace;"> if type(argv) == type(''):</span><br />
<span style="font-family: Courier New, Courier, monospace;"> argv = (argv,)</span><br />
<span style="font-family: Courier New, Courier, monospace;"> pid, master_fd = fork()</span><br />
<span style="font-family: Courier New, Courier, monospace;"> if pid == CHILD:</span><br />
<span style="font-family: Courier New, Courier, monospace;"> os.execlp(argv[0], *argv)</span><br />
<span style="font-family: Courier New, Courier, monospace;"> (...)</span><br />
<br />
Каждый раз, когда кто-нибудь вызовет этот код с неправильным именем исполняемого файла в argv, будет порожден неиспользуемый, не подверженный сборки мусора и неизвестный приложению Python процесс, потому что execlp потерпит неудачу и форкнутый процесс будет проигнорирован. И будет ли клиент этого модуля ловить исключение или нет не имеет значения. Локальное обязательство не было выполнено. Конечно ошибка может быть исправлена тривиально добавлением try/except внутрь самой функции spawn. Однако, проблема в том, что <i>это логика показалась нормальной всем, кто когда-либо видел эту функцию начиная <a href="http://hg.python.org/cpython/rev/8c9cc054c5ed#l1.99" target="_blank">с 1994</a> года, когда Гвидо ван Россум впервые закоммитил ее</i>.<br />
<br />
Вот другой интересный пример:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">$ make clean</span><br />
<span style="font-family: Courier New, Courier, monospace;">Sorry, command-not-found has crashed! Please file a bug report at:</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">https://bugs.launchpad.net/command-not-found/+filebug</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">Please include the following information with the report:</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">command-not-found version: 0.3</span><br />
<span style="font-family: Courier New, Courier, monospace;">Python version: 3.2.3 final 0</span><br />
<span style="font-family: Courier New, Courier, monospace;">Distributor ID: Ubuntu</span><br />
<span style="font-family: Courier New, Courier, monospace;">Description: Ubuntu 13.04</span><br />
<span style="font-family: Courier New, Courier, monospace;">Release: 13.04</span><br />
<span style="font-family: Courier New, Courier, monospace;">Codename: raring</span><br />
<span style="font-family: Courier New, Courier, monospace;">Exception information:</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">unsupported locale setting</span><br />
<span style="font-family: Courier New, Courier, monospace;">Traceback (most recent call last):</span><br />
<span style="font-family: Courier New, Courier, monospace;"> File "/.../CommandNotFound/util.py", line 24, in crash_guard</span><br />
<span style="font-family: Courier New, Courier, monospace;"> callback()</span><br />
<span style="font-family: Courier New, Courier, monospace;"> File "/usr/lib/command-not-found", line 69, in main</span><br />
<span style="font-family: Courier New, Courier, monospace;"> enable_i18n()</span><br />
<span style="font-family: Courier New, Courier, monospace;"> File "/usr/lib/command-not-found", line 40, in enable_i18n</span><br />
<span style="font-family: Courier New, Courier, monospace;"> locale.setlocale(locale.LC_ALL, '')</span><br />
<span style="font-family: Courier New, Courier, monospace;"> File "/usr/lib/python3.2/locale.py", line 541, in setlocale</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return _setlocale(category, locale)</span><br />
<span style="font-family: Courier New, Courier, monospace;">locale.Error: unsupported locale setting</span><br />
<br />
Это довольно серьезный крэш из-за отсутствия данных о локали в системном приложении, которое, по иронии судьбы, должно сообщать пользователям, какие пакеты надо установить, если команда отсутствует. Заметьте, что на вершине сетка ссылка на <i>crash_guard</i>. Это функция предназначена для перехвата всех исключений на краю стека и отображении детальной системной информации и трейсбека, чтобы помочь в решении проблемы.<br />
<br />
Такой "парашютный перехват" довольно распространен в исключение-оринетриованном программировании и это подход, как правило, дает разработчикам ложное чувство хорошей обработки ошибок в приложении. Вместо настоящей <i>защиты</i> приложения он становится просто удобным способом крэша. В данном случае, правильнее было бы вывести предупреждение, если это вообще необходимо, и позволить программе работать как обычно. Это можно было бы сделать простым оборачиванием вот этой строки:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">try:</span><br />
<span style="font-family: Courier New, Courier, monospace;"> locale.setlocale(locale.LC_ALL, '')</span><br />
<span style="font-family: Courier New, Courier, monospace;">except Exception as e:</span><br />
<span style="font-family: Courier New, Courier, monospace;"> print("Cannot change locale:", e)</span><br />
<br />
Очевидно, это легко сделать. Но, опять же, проблема в том, что это было естественно не делать этого сразу. На самом деле, это более чем естественно: действительно <i>кажется лучше</i> не рассматривать ошибочный путь. В этом случае произойдет сокращение кода, он будет более прямолинейным, и в результате остается только тот, который приводит к желаемому результату.<br />
<br />
В следствие этого, к сожалению, мы погружаемся в мир хрупкого программного обеспечения и розовых слонов. Хотя более выразительный стиль возвращения ошибок выстраивает правильное мышление: вернет ли функция или метод ошибку в результате? Как она будет обработана? Действительно ли функция взаимодействующая с системой не вернет ошибку? Как решается проблема, которая наверняка может возникнуть?<br />
<br />
Удивительное количество крэшэй и просто непредсказуемое поведение является результатом такой непроизвольной небрежности.Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-4097288014685718772011-07-08T21:59:00.000-07:002011-07-08T21:59:52.019-07:00Linux для встраиваемых систем in Google Docs now!Перевод "Linux для встраиваемых систем для начинающих" плавно перехал в Google Docs, но работа продолжается. Если кому-то интересна эта тема, скажите писать ли перевод сюда?Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-23164183095490266442011-04-01T04:56:00.000-07:002011-04-01T04:56:49.038-07:00Linux для встраиваемых систем. Часть 1.2. Linux для встраиваемых систем сегодня<!--StartFragment--> <br />
<div class="MsoNormal"><span lang="RU">Нет ничего удивительного, в том что доля Linux в области встраиваемых систем значительно возросла. Действительно, тот факт, что Вы читаете эту книгу указывает на то, что он затронул и Вашу жизнь. Трудно оценить размер рынка, потому что многие компании продолжают создавать собственные дистрибутивы Linux для встраиваемых систем.<o:p></o:p></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span lang="RU"><a href="http://LinuxDevices.com/">LinuxDevices.com</a>, популярный новостной и информационный портал, основанный </span><span style="mso-ansi-language: EN-US;">Rich Lenhrbaum, </span><span lang="RU">проводит ежегодный обзор рынка </span><span style="mso-ansi-language: EN-US;">Linux </span><span lang="RU">для встраиваемых систем. В своем последнем исследовании, они сообщают, что </span><span style="mso-ansi-language: EN-US;">Linux </span><span lang="RU">стала доминирующей операционной системой, используемой в тысячах новых разработках каждый год. Действительно, почти половина опрошенных сообщили об использовании </span><span style="mso-ansi-language: EN-US;">Linux </span><span lang="RU">во встраиваемых устройствах, в то время как ближайшая конкурирующая операционная система, как сообщается, использовалась только примерно одним из восьми опрошенных. Даже если у Вас есть причины подвергнуть сомнению эти результаты, нельзя не принимать во внимание взрывной рост рынка </span><span style="mso-ansi-language: EN-US;">Linux </span><span lang="RU">для встраиваемых систем сегодня.<o:p></o:p></span></div><!--EndFragment-->Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-12608589680737991572011-03-31T03:23:00.000-07:002011-04-01T04:58:52.937-07:00Linux для встраиваемых систем. Часть 1.1. Почему Linux?<div class="MsoNormal"></div><div class="MsoNormal"><div style="text-align: justify;"><div style="text-align: left;">Из-за многочисленных экономических и технических преимуществ, мы видим сильный рост в применении Linux для встраиваемых систем. Эта тенденция вошла практически во все рынки и технологии. Linux применяется во встраиваемых продуктах всемирной коммутируемой телефонной сети, глобальной сети передачи данных, мобильных сотовых устройств, а также в оборудовании, которое управляет этими сетями. Linux пользуется успехом в автомобильных приложениях, потребительских товарах вроде игр и КПК, принтерах, корпоративных коммутаторах и маршрутизаторах. Набирающий темп Linux для встраиваемых систем продолжает расти, и конца этому процессу не видно.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Вот некоторые причины роста Linux для встраиваемых систем:</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"></div><ul><li style="text-align: left;">Linux превратился во взрослую, высокопроизводительную, стабильную альтернативу традиционным проприетарным встраиваемым операционным системам.</li>
<li style="text-align: left;">Linux поддерживает огромное разнообразие приложений и сетевых протоколов.</li>
<li style="text-align: left;">Linux может масштабироваться от маленьких, ориентированных на потребителя, устройств до больших, мощных коммутаторов и маршрутизаторов операторского класса.</li>
<li style="text-align: left;">Linux может быть развернут без отчислений за пользование лицензиями и патентами, требуемыми традиционными встраиваемыми операционными системами.</li>
<li style="text-align: left;">Linux привлекает огромное число активных разработчиков, что позволяет ему быстро обзавестись поддержкой новых аппаратных архитектур, платформ и устройств.</li>
<li style="text-align: left;">Все большее число аппаратных и программных поставщиков, в том числе практически все производители и независимые поставщики ПО топ-уровня, теперь поддерживают Linux.</li>
</ul><div style="text-align: left;"><br />
По этим и другим причинам, мы наблюдаем увеличение темпа использования Linux во многих предметах домашнего обихода, начиная от телевизоров высокой четкости и заканчивая сотовыми телефонами<br />
<br />
<a href="http://www.obyknoveni.us/2011/04/linux-12-linux.html">Часть 1.2. Linux для встраиваемых систем сегодня</a></div><ul></ul><ol></ol><ul></ul></div>Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-16409424518124015912011-03-31T03:17:00.001-07:002011-03-31T03:54:48.914-07:00Linux для встраиваемых систем. Глава 1. Введение<div style="text-align: justify;"><div style="text-align: left;"><span lang="RU">Уход от проприетарных операционных систем вызывает настоящий переполох в корпоративных офисах компаний, занимающихся традиционными операционными системами (ОС). По многим хорошо обоснованным причинам </span>Linux, <span lang="RU">в настоящее время, принимается в качестве операционной системы во многих продуктах за пределами своего традиционного оплота – серверных приложений. Примеры этих <i style="mso-bidi-font-style: normal;">встраиваемых систем</i> включают в себя сотовые телефоны, </span>DVD<span lang="RU"> плееры, видео игры, цифровые камеры, сетевые коммутаторы и устройства беспроводных сетей. Вполне возможно, что </span>Linux <span lang="RU">уже в Вашем доме или Вашем автомобиле.</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span lang="RU"><br />
</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><a href="http://www.obyknoveni.us/2011/03/linux-11-linux.html">Часть 1.1. Почему Linux?</a></div></div>Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-45050043522394064482011-03-31T03:16:00.000-07:002011-03-31T03:56:44.833-07:00Linux для встраиваемых систем<div style="text-align: justify;"><div style="text-align: left;">Этой статьей я начинаю серию переводов книги <a href="http://book.opensourceproject.org.cn/embedded/embeddedprime/">Embedded Linux Primer</a>. Эта книга нужна в первую очередь мне самому для работы. Ее переводов на русский язык я не нашел, поэтому решил переводить сам. Надеюсь, мой перевод поможет кому-нибудь еще сэкономить время и силы.<br />
<br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Сама книга разбита на короткие кусочки, что позволяет мне публиковать ее перевод в виде отдельных статей. Все статьи будут помеченых тегами "linux", "embedded", "primer", "перевод", поэтому Вы легко сможете "собрать" ее из кусочков. Также я буду добавлять ссылки к следующей части в конце текста.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Если Вы найдете орфаграфическую ошибку, ошибку в переводе, битую ссылку или у Вас появятся замечания и пожелания - пишите их в комментарии.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;"><a href="http://www.obyknoveni.us/2011/03/linux-1.html">Глава 1. Введение</a></div></div>Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-70032671707705264142011-02-17T23:22:00.000-08:002011-03-31T03:55:11.854-07:00Установка VMware Tools на Fedora 14<div style="text-align: justify;"><div style="text-align: left;">После покупки Мака, если мне нужен был Linux, я использовал последнюю версию Ubuntu и VMware Fusion. В этом случае VMware Tools устанавливались мной сразу после завершения установки самого дистрибутива еще до обновления системы. При этом никаких дополнительных пакетов не требовалось. Однако, недавно мне понадобился RPM-based дистрибутив. Выбор пал на Fedora 14. Но, к сожалению, с VMware Tools тут не все так просто. Итак по-порядку.</div></div><div style="text-align: justify;"><div style="text-align: left;"><br />
</div></div><div style="text-align: justify;"><div style="text-align: left;">Все действия должны выполнятся от имени пользователя <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">root</span>, поэтому:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[obyknovenius@fedora ~]$<b>su</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Password:</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora obyknovenius]#<b>cd</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Обновляем все пакеты (обязательно!):</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>yum update</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Будут перечислены пакеты для обновления. В моем случае 346 Мбайт. Соглашаемся на загрузку и установку:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Total download size: 346 M</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Is this ok [y/N]: <b>y</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Терпеливо ждем... Далее устанавливаем все необходимое для компиляции модуля ядра:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>yum install gcc make kernel-devel perl</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">В <a href="http://www.sysprobs.com/fedora-14-vmware-install-vmware-tools-fedora-14">этой</a> статье говорится о необходимости установки kernel-PAE-devel, если вы используете 32-битную версию Fedora. Однако, в этом есть смысл, только если Ваша виртуальная машина была настроена на использование более чем 4 Гбайт во время установки дистрибутива, т. к. в этом случае будет установлено ядро с поддержкой технологии <a href="http://ru.wikipedia.org/wiki/PAE">Physical Address Extension</a>.</div></div><div style="text-align: justify;"><div style="text-align: left;">Соглашаемся на загрузку и установку:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Total download size: 29 M</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Installed size: 79 M</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Is this ok [y/N]: <b>y</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Перезагружаемся:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>reboot</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">После перезагрузки снова повышаем права до <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">root</span>:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[obyknovenius@fedora ~]$<b>su</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Password:</span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora obyknovenius]#<b>cd</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Далее в главном меню VMware Fusion выбираем <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><b>Virtual Machine -> Install VMware Tools</b></span>. Во всплывающем окне нажимаем кнопку <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><b>Install</b></span>. Содержимое CD/DVD привода виртуальной машины заменится ISO-образом, содержащим VMware Tools. Монтируем полученный образ:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>mount -t iso9660 /dev/sr0 /mnt</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">mount: block device /dev/sr0 is write-protected, mounting read-only</span></div></div><div style="text-align: justify;"><div style="text-align: left;">Распаковываем файлы в домашний каталог пользователя root:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>tar xzf /mnt/VMwareTools-8.4.5-332101.tar.gz -C ~</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">Запускаем установочный скрипт и все значения оставляем по умолчанию (отвечаем на все вопросы нажатием клавиши <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><b>Enter</b></span>)</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>vmware-tools-distrib/vmware-install.pl</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;">После установки ISO-образ отмонтируется автоматически. Осталось только убрать за собой и перезагрузиться:</div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>rm -rf vmware-tools-distrib</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">[root@fedora ~]#<b>reboot</b></span></div></div><div style="text-align: justify;"><div style="text-align: left;"><span class="Apple-style-span" style="font-family: inherit;">Данный метод применим также для VMware Workstation и VMware Player.</span></div></div>Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-18053820787844616092011-01-31T10:05:00.001-08:002011-03-31T03:40:24.833-07:00Android Honeycomb на телефонах?..Сейчас в Интернете много разговоров об Android 3.0 Honeycomb. В основном, это связано с заточкой системы под планшеты. Однако меня, как владельца смартфона со словом Google на корпусе, больше интересует будут ли "соты" работать на устройствах, помещающихся на ладони. Если посмотреть превью в Android SDK, видно что Honeycomb поддерживает только WXGA, то есть не меньше 720×800. Но что будет, если вручную указать разрешение 800x480, которое сейчас является стандартным для большинства смартфонов?<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-vaFscIHmtvE/TV138uvQ-TI/AAAAAAAAAEQ/5qN9B9EcY1o/s1600/Edit+Android+Virtual+Device.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-vaFscIHmtvE/TV138uvQ-TI/AAAAAAAAAEQ/5qN9B9EcY1o/s320/Edit+Android+Virtual+Device.png" width="259" /></a></div>А вот что:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-zwZkiFfNXi4/TV14GGle8cI/AAAAAAAAAEU/m2EKfBsZAaU/s1600/Honycomb+800x480.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-zwZkiFfNXi4/TV14GGle8cI/AAAAAAAAAEU/m2EKfBsZAaU/s320/Honycomb+800x480.png" width="192" /></a></div>Значит ли это, что Android Honeycomb попадет на смартфоны? Не знаю. Думаю, мы все узнаем 2 февраля. А пока остается только гадать.Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-88638182307478392802011-01-16T06:25:00.000-08:002011-03-31T03:56:01.844-07:00Nexus One. Несчастья продолжаютсяИ снова с моим Nexus'ом произошло несчастье. Сегодня он был заподозрен в поломке микрофона. Человек, которому я звонил, совсем меня не слышал. В голову крались самые мрачные мысли. Но, как и в первый раз, проблема оказалась банальной. Утром я уронил свой телефон в... торт. Он упал на край тарелки и почти не испачкался, поэтому я не обратил на происшествие большого внимания. Однако, этого падения в сладкую жизнь хватило, чтобы наглухо забить микрофон аппарата вкусным домашним тестом. Проблема решилась высокотехнологичным методом прочистки отверстия микрофона с помощью все той же иголки. В итоге, торт в наказание съеден, иголке объявлена благодарность.Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0tag:blogger.com,1999:blog-8874662557978946716.post-16677133793614271092011-01-14T12:14:00.000-08:002011-03-31T03:55:50.614-07:00Про Nexus One, mini-jack и карманы<div style="text-align: justify;"><div style="text-align: left;">Свой Nexus One я брал с рук. И поэтому он достался мне без какого-либо чехла, а купить новый как-то не случилось. Да и все предыдущие аппараты я никогда не одевал ни в какие варежки. Телефон я ношу просто в кармане. Как и в большинстве телефонов, для подключения наушников в Nexus'е используется стандартный <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BD%D0%B8-%D0%B4%D0%B6%D0%B5%D0%BA">mini-jack</a>. Так вот, сегодня вечером я решил послушать музыку. Вытащив телефон из кармана и вставив в него наушники, мне показалось, что они вошли не до конца. Придя домой и вооружившись иголкой, мне удалось извлечь из порта для mini-jack'а небольшой комочек ниточек, которые обычно собираются в уголках карманов после стирки.</div></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_9S6s5GzVPyU/TTCtcuocG2I/AAAAAAAAABQ/tHuQcOMaq5w/s1600/SAM_6863.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/_9S6s5GzVPyU/TTCtcuocG2I/AAAAAAAAABQ/tHuQcOMaq5w/s320/SAM_6863.JPG" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_9S6s5GzVPyU/TTCt6V6SrAI/AAAAAAAAABU/y3TYXjzrWes/s1600/SAM_6864.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/_9S6s5GzVPyU/TTCt6V6SrAI/AAAAAAAAABU/y3TYXjzrWes/s320/SAM_6864.JPG" width="320" /></a></div><div style="text-align: center;"><div style="text-align: justify;"><div style="text-align: left;">Так что будьте внимательны. Если наушники не до конца входят в телефон, может туда тоже что-нибудь попало.</div></div></div>Anonymoushttp://www.blogger.com/profile/09011653402700668400noreply@blogger.com0