<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bappoy&#039;s blog &#187; рабочие будни</title>
	<atom:link href="http://bappoy.pp.ru/tag/%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b5-%d0%b1%d1%83%d0%b4%d0%bd%d0%b8/feed" rel="self" type="application/rss+xml" />
	<link>http://bappoy.pp.ru</link>
	<description>Линуксоид на велосипеде с моторчиком</description>
	<lastBuildDate>Mon, 06 Feb 2012 08:28:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Пересборка ruby gem на примере hiredis в FreeBSD</title>
		<link>http://bappoy.pp.ru/2011/11/06/gem-hiredis-freebsd.html</link>
		<comments>http://bappoy.pp.ru/2011/11/06/gem-hiredis-freebsd.html#comments</comments>
		<pubDate>Sun, 06 Nov 2011 17:30:18 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[рабочие будни]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=1076</guid>
		<description><![CDATA[<p>Для тех админов, кому <s>лень</s> некогда копаться во внутренностях ruby и гуглить невнятные ошибки, но надо срочно поставить ruby gem, отсутствующий в портах. В моем случае — hiredis (ruby обвязка для одноименной библиотеки доступа к БД redis). Установка методом
<pre>gem install hiredis</pre>
<p> не работает, т.к. где-то внутри жестко зашито название утилиты make, а FreeBSD-версия  /usr/bin/make серьезно отличается по синтаксису от GNU Make, который все привыкли использовать, поэтому в STDERR сыпятся ошибки:</p>
<pre># gem install hiredis
Fetching: hiredis-0.4.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing hiredis:
	ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby18 extconf.rb
"Makefile", line 11: Missing dependency operator
"Makefile", line 21: Need an operator
"Makefile", line 22: Missing dependency operator
"Makefile", line 33: Need an operator
"Makefile", line 43: Need an operator
"Makefile", line 44: Need an operator
"Makefile", line 82: Need an operator
"Makefile", line 86: Need an operator
"Makefile", line 88: warning: duplicate script for target "hiredis-example-ae" ignored
"Makefile", line 89: Need an operator
make: fatal errors encountered -- cannot continue
creating Makefile

make
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c connection.c
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing  -fPIC  -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c hiredis_ext.c
cc -I. -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I/usr/local/lib/ruby/1.8/amd64-freebsd8 -I. -I/usr/include    -fPIC -I/usr/include -O2 -pipe -fno-strict-aliasing -fPIC  -I/usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis -c reader.c
cc -shared -o hiredis_ext.so connection.o hiredis_ext.o reader.o -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L. -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread -rdynamic /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a -Wl,-soname,hiredis_ext.so   -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby18  -lcrypt -lm -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread
cc: /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/vendor/hiredis/libhiredis.a: No such file or directory
*** Error code 1

Stop in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext.

Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/hiredis-0.4.1/ext/hiredis_ext/gem_make.out
</pre>
<p>GNU-версия make в freebsd называется gmake. Чтобы исправить вызов make в gem&#8217;е, пришлось его пересобрать. Вот полная версия установки пакета:</p>
<pre>$ mkdir ~/hiredis &#038;&#038; cd ~/hiredis
$ gem fetch hiredis  # в текущем каталоге появляется файл hiredis-0.4.1.gem
Downloaded hiredis-0.4.1
$ gem unpack hiredis-0.4.1.gem
Unpacked gem: '/home/bvk/hiredis/hiredis-0.4.1'
$ gem spec  hiredis-0.4.1.gem > hiredis.spec # извлекли спецификацию gem'а, по которой будем собирать пакет
$ cd hiredis-0.4.1
# тут в ext/hiredis_ext/extconf.rb нужно поменять "make static" на "gmake static",
# а в Rakefile "make clean" на "gmake clean"
# собираем пакет
$ gem build ../hiredis.spec
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: hiredis
  Version: 0.4.1
  File: hiredis-0.4.1.gem
# устанавливаем
$ sudo gem install hiredis-0.4.1.gem
Building native extensions.  This could take a while...
Successfully installed hiredis-0.4.1
1 gem installed
Installing ri documentation for hiredis-0.4.1...
Installing RDoc documentation for hiredis-0.4.1...</pre>
<p>Теперь внимательно читаем porters handbook, делаем порт и далее действуем по правилам.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2011/11/06/gem-hiredis-freebsd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как я однажды тупил два дня на ровном месте</title>
		<link>http://bappoy.pp.ru/2011/10/18/dst.html</link>
		<comments>http://bappoy.pp.ru/2011/10/18/dst.html#comments</comments>
		<pubDate>Tue, 18 Oct 2011 09:17:45 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[лытдыбр]]></category>
		<category><![CDATA[рабочие будни]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=515</guid>
		<description><![CDATA[<p>В преддверии первой годовщины последнего осеннего перевода часов в России вспомнился один факап трехлетней давности (начало 2008 года). Я тогда занимался починкой  статистики посещаемости на одном региональном сайтике, который я поддерживал по дружбе.</p>
<p>У них было два сервера, один в интернете показывал контент посетителям, а второй располагался в офисе и содержал интерфейс администрирования сайта. Все хозяйство работало под FreeBSD 6.1 на очень стареньких машинах, на основном сервере  был Pentium 3 и 384 мегабайта памяти (однако много лет назад о такой конфигурации <a href="http://www.lib.ru/WEBMASTER/wwwhard.txt#4">можно было лишь помечтать</a>). Apache 2.2.2 вёл лог посещений в режиме &laquo;combined&raquo;, а по ночам всё накопленное за последние сутки обрабатывалось штатной программкой <a href="http://httpd.apache.org/docs/2.2/programs/logresolve.html">logresolve</a> (преобразовывает IP-адреса посетителей в имена хостов) и копировалось в отдельный файл resolved.log. Затем офисный сервер забирал получившийся файл по HTTP (в целях безопасности все &laquo;альтернативные&raquo; способы обмена файлами решили не использовать) и парсил его awstats&#8217;ом. Такая вот нехитрая схемка. Но проработала она ровно два месяца до середины декабря 2006 года и перестала.<br />
<!--more--><br />
Кроме нескольких программных ошибок обнаружилось еще пара стратегических провалов. Во-первых, офисный сервер иногда отключался из-за проблем с электричеством, и лог не забирался вовремя, а на следующий день просто дополнялся; после двух-трёх пропущенных дней файл с логами разросся до таких размеров, что даже в сжатом виде слишком долго передавался бы по http, и забирающий скрипт просто отваливался по таймауту. Во-вторых, установленный там logresolve натурально портил логи: читал из строки первые 1024 байта, обрабатывал IP-адрес и печатал их в STDOUT, завершив переводом строки; затем читались следующие 1024 байта и т.д. В результате строки, содержащие, например, длинные реферрерские URL, оказались разбитыми на несколько строк по 1024 байта каждая, что, возможно, не имело значения для awstats, но крайне затрудняло дополнительную обработку такого лога.</p>
<p>В итоге с декабря 2006 года лог-файл увеличился в размерах до полутора гигабайт. Я решил, что лучше его разбить на месяцы и скормить эти месяцы парсеру поочерёдно, однако сначала нужно было разобраться с лишними разрывами строк. Быстренько набросал однострочник на sed, который удаляет лишние переводы строк, если в третьем поле не содержится даты.</p>
<p>Однако несмотря на то, что на как на небольших, так и на довольно больших отрывках resolved.log данный скриптик отрабатывал относительно нормально, из реального лога читались только первые 170 мегабайт с копейками и скрипт надолго зависал. Решил, что, возможно, чего-то не учёл из-за малого опыта написания такого рода сценариев на sed, и переделал тот же самый алгоритм на perl и c  — безуспешно: после прочтения первых 170 мегабайт ничего не происходило.</p>
<pre>my $b='';
while(<>){
        chomp;
        if(/\[[0-9]+\/[a-zA-Z]+\/[0-9:]+\ \+0300\]/){
                print "$b\n";
                $b=$_;
        } else {
                $b.=$_
        }
}
print "$b\n";
</pre>
<p>Я несколько раз прогнал эти скрипты через valgrind с максимальными проверками утечек, избавился от некоторых ошибок, в конце концов перечитал кучу документации по freebsd на тему возможных ограничений на размер процесса в памяти (хотя больше восьми килобайт программа в памяти не занимала) и т.д. В общем, на два дня выпал из жизни, проводя это время в отладке&#8230; </p>
<p>В конце концов нашел причину моих мучений: в регулярном выражении, определявшем признак начала записи лога, была жестко прописана временная зона +0300, тогда как при переходе на летнее время она изменялась на +0400. Поэтому, когда цикл доходил до марта 2007 года, несколько сотен тысяч строк до следующего октября просто пропускались, а поскольку сервер был медленный, то на Ctrl+C и kill -TERM скрипты реагировали не сразу, и тем создавалось ощущение зависания.</p>
<p>После того, как я исправил этот регэксп, всё пошло как по маслу: скормил awstats&#8217;у старые логи, прикрутил logrotate, научил скрипты забирать статистику через scp; параллельно крону поставил <a href="http://sourceforge.net/projects/anacron">anacron</a>, благодаря чему забор и анализ логов стал производиться ежедневно вне зависимости от того, включен ли &laquo;офисный&raquo; сервер в 4 часа 15 минут утра. А потом и вовсе уговорил начальство поставить внешние счетчики. Теперь там стоит google analytics и все счастливы, а я немного прокачал скилл профайлинга.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2011/10/18/dst.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Немного о работе</title>
		<link>http://bappoy.pp.ru/2009/04/14/about-my-job.html</link>
		<comments>http://bappoy.pp.ru/2009/04/14/about-my-job.html#comments</comments>
		<pubDate>Tue, 14 Apr 2009 11:20:16 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[nvidia]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[лытдыбр]]></category>
		<category><![CDATA[рабочие будни]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=589</guid>
		<description><![CDATA[<p>Уже более двух месяцев тружусь на новом рабочем месте в отделе решений voip <a href="http://www.mfisoft.ru">нашей компании</a> — занимаюсь поддержкой веб-интерфейса управления основным продуктом: исправляю накопившиеся баги, создаю новые :), а также готовлю релизы. Все работает под Debian Lenny, на базе Apache 2 + PHP5 + MySQL 5.</p>
<p>По сравнению с предыдущей деятельностью сменилось вроде бы немногое — базовый дистрибутив поменялся с Fedora на Debian, PostgreSQL — на MySQL (с удивлением узнал, что хранимые процедуры в MySQL появились только начиная с 5.0, а подзапросы тут и сейчас кривоваты), PHP4 на PHP5 (exceptions рулят), плюс ко всему в окне стало видно небо и две трубы :) Но рабочее окружение пришлось слегка модифицировать. Поначалу были предпосылки к тому, чтобы перейти обратно на Windows, но, попробовав что-то серьёзно там поделать, я понял, что в операционнойп системе без родного клиента ssh и человеческого терминала я жить не смогу, плюнул и остался на Ubuntu 8.10. К тому же мне выдали новый компьютер (Athlon 64 X2 вместо Pentium 4) с двухголовой Nvidia GeForce 8500 GT (вместо интегрированного i815), и после перетыкания жесткого диска XP просто перестала загружаться.</p>
<p>Да и в убунте из-за того, что всё железо, кроме жесткого диска, полностью новое, возникли некоторые проблемы, в частности, зависал Xorg (и тянул за собой клавиатуру) при двух подглюченных мониторах. Решение в конце концов свелось к перенастройке сети и установке драйверов от nvidia (драйвер nv из xorg почему-то не захотел нормально работать):</p>
<p>1. загрузился в single mode<br />
2. отключил запуск сервиса gdm:</p>
<pre>sudo update-rc.d gdm remove</pre>
<p>3. в <code>/etc/udev/rules.d/70-persistent-net.rules</code> в строчке, относящейся к старой сетевой карте, поменял mac-адрес на новый:</p>
<pre>SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1a:92:15:61:33", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"</pre>
<p>4. перезагрузился, убедился, что сеть доступна (пришлось сходить к админам и попросить их также поменять mac-адрес в настройках корпоративного DHCP на новый)<br />
5. установил свежий (на тот момент) комплект драйверов от nvidia:</p>
<pre>sudo apt-get install nvidia-glx-173 # (последняя на момент установки версия nvidia-glx)
sudo mv /etc/X11/xorg.conf /etc/X11/xorg.`date "+%Y%m%d%H%m%S"`.conf
sudo nvidia-xconfig # создался новый xorg.conf</pre>
<p>6. загрузился в графическую оболочку (<code>service gdm start</code>), запустил nvidia-settings, включил TwinView в режиме &laquo;растягивания&raquo; рабочего стола на два монитора 1280&#215;1024 (получилось разрешение 2560&#215;1024)<br />
7. вернул автозапуск gdm:</p>
<pre>update-rc.d gdm defaults</pre>
<p>Продолжение следует.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2009/04/14/about-my-job.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thinkpad X61s и альтернативные Mini PCI Express-адаптеры</title>
		<link>http://bappoy.pp.ru/2008/12/23/thinkpad-x61s-mini-pcie.html</link>
		<comments>http://bappoy.pp.ru/2008/12/23/thinkpad-x61s-mini-pcie.html#comments</comments>
		<pubDate>Tue, 23 Dec 2008 13:34:19 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[рабочие будни]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=464</guid>
		<description><![CDATA[<p>Клиенты прислали свой ноутбук Lenovo Thinkpad X61s для специфической настройки. Перед отправкой они воткнули туда свежеприобретённый Mini PCIe-адаптер Intel PRO Wireless 3945ABG, но проверить его толком не успели за недостатком времени. Когда я включил этот ноутбук, он вообще отказался загружаться с хамской формулировкой:</p>
<pre>1802: Unauthorized network card is plugged in - Power off and remove the miniPCI network card.</pre>
<p>Расследование этого факта привело на страницу <a href="http://www.thinkwiki.org/wiki/Problem_with_unauthorized_MiniPCI_network_card">Problem with unauthorized MiniPCI network card</a>, откуда я узнал, что в биосе ноутбуков Thinkpad &laquo;зашит&raquo; белый список PCI-ID&#8217;ов Mini PCIe-устройств, явно разрешённых к использованию, все остальные устройства запрещены. Все разрешённые устройства выпущены под маркой Lenovo и стоят в полтора-два раза дороже, чем их немаркированные аналоги. Как <a href="http://www-307.ibm.com/pc/support/site.wss/document.do?sitestyle=lenovo&#038;lndocid=MIGR-69757">разъясняет</a> справочный центр Lenovo, это вызвано тем, что во избежание порчи эфира сочетание карты и антенны должно быть сертифицировано FCC (североамериканская федеральная комиссия по связи) или аналогичной организацией в других странах, и Lenovo не может гарантировать, что какой попало адаптер будет соответствовать этим требованиям. Поэтому официальный совет по избавлению от этой ошибки: выкиньте свой адаптер и купите правильный втридорога.<br />
<!--more--><br />
Неофициальные способы обойти хитрых IBM-овцев перечислены на вышеупомянутой странице. Вариантов несколько: добавить PCI ID устройства в bios, модифицировать PCI ID на самом устройстве (речь идёт о subvendor id), использовать несколько вариантов программ для изменения пары байтов в биосе, отключающих проверку по белому списку&#8230; В итоге сработало простое перетыкание адптера в соседний слот: видимо, проверка PCI ID работает только для одного слота.</p>
<p>После перетыкания ноутбук включился, но на этом приключения не кончились :) Выяснилось, что при любом состоянии переключателя wifi в логи выводится сообщение, подобное следующему:</p>
<pre>Dec 20 20:20:56 hostname kernel: ipw3945: Radio Frequency Kill Switch is On:
Dec 20 20:20:56 hostname kernel: Kill switch must be turned off for wireless networking to work.</pre>
<p>При этом в файле <code>/sys/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/rf_kill</code> содержится число 2, что означает &laquo;залочено железом&raquo;. Т.е. карточка считает, что wifi выключен и отказывается работать, и никакие хоткеи, включающие wifi, тут не помогут.</p>
<p>Решение в виде грязного хака нашлось на той же странице: необходимо чем-нибудь заклеить 20 контакт карточки бумажкой, чтобы она не получала сигналов о состоянии переключателя wifi, которые, видимо, не доставляются во второй слот. Действительно, судя по <a href="http://www.interfacebus.com/Mini_PCI_Express_Bus.html#b">распиновке Mini PCI express</a>, 20 пин зарезервирован и вполне может использоваться для сигнализации о включении/выключении функциональности wifi.</p>
<p>Мы заклеили этот 20 контакт кусочком первой попавшейся липкой бумажки, и всё прекрасно работает. Надолго ли?..</p>
<p><strong>Upd.</strong> Пока писал, забыл, чего сказать-то хотел :) Мораль сей басни такова: подумайте дважды, прежде чем Thinkpad брать — готовы ли вы модные рюшечки поменять на понятные, но нервирующие заносы производителя и потенциально обрести проблемы на пустом месте?</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2008/12/23/thinkpad-x61s-mini-pcie.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

