Category: it

Category was added automatically. Read all entries about "it".

nepal

debian package management

Как-нибудь я соберусь и напишу манускрипт, полный безысходности и тлена, про пакетирование в Debian. По образу и подобию UNIX Haters Handbook.

Рассказывать в той истории я буду про то, сколько много разных систем создания Debian репозиториев есть. Вот вы не поверите, по-моему, штук 10, не меньше. Причём у каждой из десяти есть, как водится, свои достоинства и недостатки. А нет, наврал, всего лишь 9, хотя наверняка в той статье многие не перечислены.

Ещё я буду рассказывать, как делать пакеты для Дебиана. Как вы догадываетесь, там тоже принцип "пусть цветут все цветы", и простому смертному, в особенности избалованному чем-нибудь вроде RPM или ebuild, с наскоку в этом цветнике не разобраться. Для таких даже сделали специальную систему equivs, которая несколько маскирует сложность.

Обязательно и подробно я расскажу о том, как пакетируются исходники. Не забуду упомянуть, что тарбол с оригинальными сорцами должен непременно называться _orig, а всякие дополнительные патчи и контрол-файлы кладутся не в tar и даже не в cpio, а непременно в файл с патчем, который потом жмётся.

О, наступит день, и я сорву покровы и расскажу обо всём!

А пока мне надо с этим всем как-то взлететь.
nepal

ps, top и мёртвые дети

Помогите мне, а то я туплю уже не первый день.



Хочу узнать топ самых популярных процессов в системе (по времени выполнения, включая тех самых мёртвых детей). Запускаю топ, сортирую по времени, нажимаю S (When 'Cumulative time' mode is On, each process is listed with the cpu time that it and its dead children have used). Вижу картинку:



  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND                                               
    1 root      20   0 48612 4704 1800 S   0.0  0.1   2405:47 systemd                                               
  836 root      20   0  290m 3168 2500 S   0.0  0.0 954:48.30 gdm-binary                                            
 1663 kir        9 -11  684m  10m 5648 S   0.0  0.1  63:59.77 pulseaudio                                            
28910 root      20   0  222m  40m  22m S   3.3  0.5  45:37.09 Xorg                                                  
29238 kir       20   0  878m  22m  14m S   0.3  0.3  20:04.62 gnome-panel                                           
29401 kir       20   0  244m  71m  25m S   0.7  0.9  17:09.19 skype                                                 
29287 kir       20   0  446m  16m  12m S   2.7  0.2  14:21.82 gkrellm                                               
   10 root      20   0     0    0    0 S   0.3  0.0   8:20.43 rcu_sched  


Это как раз та картинка, которую я хочу видеть. Понятно, что systemd запустил вообще всё, что есть в системе, вот у него и время такое, а gdm запустил иксы и всё что в иксах, поэтому он на почётном втором месте.



Теперь хочу тот же фокус проделать с ps. Там тоже есть ключик --cumulative. Но он не работает, или я не на то смотрю.



ps -e --no-header -o time,comm --cumulative --sort -time | head
01:04:01 pulseaudio
00:47:18 Xorg
00:23:11 gkrellm
00:20:36 skype
00:08:32 rcu_sched
00:08:24 adb
00:03:44 thunderbird
00:02:59 udisksd
00:02:52 chrome
00:02:10 dbus-daemon


Картинка такая же, как и без Cumulative time в top, и не изменяется от добавления/удаления флага --cumulative.

Однако, мне удалось найти поле bsdtime, на которое --cumulative влияет так, как мне надо:

ps -e --no-header -o bsdtime,comm --cumulative --sort -bsdtime

Но при этом, блин, сортировка по этому полю нихрена не работает.

Вопросы. Что я делаю не так? Стоит ли обижаться на разработчиков этих модных тулзов?
nepal

Фундаментальные проблемы парсинга df

Век живи, век учись[, дураком помрёшь].

Взгляните на вывод команды df:
$ df /
Filesystem                    1K-blocks     Used Available Use% Mounted on
/dev/mapper/vg_kirpad-lv_root  52765228 40972332   9105920  82% /

Казалось бы, чтобы отсюда узнать, сколько всего на файловой системе блоков, нужно взять второе поле из последней строки, например, вот так:
$ df / | awk 'END {print $2}'
52765228

Всё работает. Ан нет. В природе, оказываются, существуют хосты, которые печатают вот так:
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/volume3_part5
                     162693204    230624 148202134   2% /

И с использованием вышеприведённой конструкции мы получаем 230624 вместо 162693204.

Правильное решение -- вероятно, использовать stat -f /, надеясь, что он не оборудован такими выкрутасами, как df.

Костыль -- считать поля с конца, а не с начала, то есть
awk 'END {print $(NF-4)}'.
  • Current Mood
    какой уж тут муд
  • Tags
    ,
dark

Про паразитов, злобное

Тут один человек написал пост про OpenVZ. Вроде бы надо пройти мимо и не тратить время, но меня зацепило, поэтому далее подробный разбор.

Если подумать, можно обнаружить, что довольно много софта, который мы используем, не является стабильным, не смотря на название конкретных версий.

Например, openvz.


Прочитав это, я обеспокоился. Подумал, у человека какой-то серьёзный баг, он полгода тщетно пишет нам в багзиллу, а мы игнорируем и не чиним. Так ведь бывает иногда -- то времени нет, то баг не воспроизводится, то у нас и у пользователя разные представления о его (бага) критичности.

Читаю дальше.

Я уже неоднократно писал про полное отсутствие суппорта со стороны что разработчиков, что комьюнити,

Хмм. Не баг. Сокрушается отсутствием саппорт со стороны разработчиков и комьюнити. Причём тут стабильность вообще? Какая-то внезапная подмена зелёного на квадратное произошла.

Про разработчиков могу сказать, что у нас примерно 10 кернель дивелоперов плюс я. Если мы начнём посвящать своё рабочее время саппорту пользователей, OpenVZ очень быстро загнётся. Как говорил проф. Ф.Ф. Преображенский, "если я, вместо того, чтобы оперировать, каждый вечер начну у себя в квартире петь хором, у меня настанет разруха".

Про комьюнити -- по сути, автор поста сам себя критикует, он и есть часть комьюнити.

и вот ещё один пример - я несколько дней написал вопрос на форуме - vzmigrate without ssh or any encryption. 1160 просмотров темы и ни одного ответа за 5 дней. Что я могу сказать, всем на это просто положить.

Я посмотрел, у него 78 сообщений на forum.openvz.org, и это топики, начатые им, с его вопросами. Я не просмотрел все 78 постов, конечно, но я не смог найти ни одного, где бы он сам помогал другому пользователю. Зато увидел какое-то количество ответов наших дивелоперов -- и теперь мне жалко их времени, оно явно могло быть потрачено с бОльшим толком.

Опенсорс -- это симбиоз разработчиков и сообщества, где все друг другу помогают. А это -- паразит, нахлебник. Это и по его высказыванию видно, и по виду активности в форуме.

Что делать, в принципе ясно. Перестать всё это использовать.

Вот тут я полностью согласен и горячо подддерживаю! Я не вижу смысла в таком вот пользователе, который не желает читать документацию, думать, смотреть в шелл-скрипты и учиться, а вместо этого отнимает время у разработчиков, потом критикуя как их, так и сам продукт.

К счастью, не всё комьюнити состоит из таких неприятных людей, что доказывают хотя бы комменты coolcold к тому посту.
nepal

sed -i wrt symlinks

Оказалось, что sed -i, применённый к симлинку, делает из симлинка файл. А если этот симлинк -- /etc/grub.conf, который смотрит в /boot/grub/grub.conf, то потом на CentOS новые ядра не ставятся...

Чтобы этого не происходило, надо говорить sed -i -c.

Вот такая приключилась.
nepal

OpenVZ, LXC, vanilla kernel и все-все-все

Я тут разразился программным постом про OpenVZ, LXC, ваниллу и прочие интересные вещи. Ниже копи-паста. Комменты надо оставлять там, чтобы не распылять дискуссию по разным местам.

Здравствуйте! Я работаю в компании Parallels менеджером проекта OpenVZ. Хотел рассказать про то, что такое LXC (а также cgroups и namespaces), какое отношение всё это имеет к OpenVZ, и в целом о нашей работе с основным ядром. А то уже устал отвечать на одни и те же вопросы (и реплики) вроде таких:

* Планируется ли интеграция OpenVZ в ванильное ядро?
* Когда наконец OpenVZ начнёт использовать LXC?
* С тех пор, как в ванилле появились cgroups, OpenVZ можно выкидывать!
* Будущее за LXC, а OpenVZ отправляется на свалку истории.
* и т.п.

Постараюсь объяснить на пальцах, то есть упрощённо, максимально понятно, но при этом кратко (у меня нет времени писать, а у вас нет времени всё это читать). Получится, как обычно, всё равно долго, заумно и не смешно. Ну да ладно, кому надо смешно, погуглите "даёшь молодёжь", например.

Collapse )
А у меня ещё вопрос!.. Постараюсь ответить, например, вот здесь.
nepal

CyanogenMod 7 on a B&N Nook Color

Вчера поставил CyanogenMod 7 (nightly build, 7.1pre) на свой Nook Color. Причём она стоит на карточке, поэтому если карточку вынуть, то будет грузиться то, что на нуке стоит во внутреннем флеше.

Оказалось всё довольно просто, инструкции и образы тут: [ROM][CM7] [v1.3] Size-agnostic SD Card image and CM7 installer for SD Cards

1. Берём microSD на 2, 4 или 8 гигов и кард-ридер (сам нук для этого использовать нельзя).

2. Скачиваем generic-sdcard-v1.3.img.gz и записываем на карту (не на раздел, а на карту целиком):
wget http://nook.handhelds.ru/sdimage/generic-sdcard-v1.3.img.gz
gzip -d generic-sdcard-v1.3.img.gz
dd if=generic-sdcard-v1.3.img of=/dev/sde bs=1M
sync
sync


3. Вынимаем карту, ставим обратно. Видим, что появился раздел boot.

4. Скачиваем образ цианогена вот отсюда, копируем его на карту. Синкаем, отмонтируем...

5. Ставим карту в нук, включаем нук. С карты запускается инсталлятор, который переразмечает карту и распаковывает на неё цианоген, рисуя строчки на нуке. Когда процедура закончится, нук выключится.

6. Включаем нук, он грузит с карты цианоген. Настраиваем вай-фай и выключаемся.

7. Вынимаем карту, ставим в кард-ридер. Скачиваем google apps отсюда (сейчас это gapps-gb-20110613-signed.zip) и кладём файлик на карту (на первый раздел, который boot).

8. Ставим карту в нук. Удерживая кнопку "нук" (перевёрнутую U), нажимаем на power и ждём, пока на экране не появится надпись, а потом пропадёт. Отпускаем power (продолжая удерживать "нук"), нажимаем снова и держим ещё несколько секунд. Снова что-то появляется на экране, отпускаем power, ждём, пока экран погаснет, отпускаем "нук".

Альтернативно, просто грузимся в цианоген, нажимаем power, выбираем "перезагрузиться" и далее "перезагрузиться в рекавери".

Прошиваются gapps, нук перезагружается.

9. Получаем картинку "первый запуск" -- надо ввести логин в гугле и т.п. У меня почему-то с первого раза этого "первого запуска" не получилось, перезагрузился, всё починилось.

10. Enjoy.

PS у девайса нет GPS, GSM (GPRS/EDGE/HSPDA/3G), камеры, микрофона. Всё остальное вроде бы есть. С cyanogenmod добавляется bluetooth, так что микрофон можно в теории получить внешний.
nepal

vim + cscope quick howto & tips

Если вы не программируете на Си и не используете для этого vim, дальше можно не читать.

Если вы пользуетесь тегами (ctags) в vim, то вы, конечно, знаете, что с их помощью можно по Ctrl-] прыгать с места, где вызывается функция, на место, где она определена (и по Ctrl-T прыгать обратно). Это удобно и здорово, и не только для функций работает, но и, скажем, для структур.

Иногда, однако, хочется прыгать в другую сторону -- в место (места), где эта функция используется (вызывается). Для этого ctags не подходит, а подходит cscope. vim тоже умеет интегрироваться с cscope, но есть нюансы.

Например, не нашлось комбинации клавиш для "прыганья", и читать базу cscope (файлик cscope.out) при настройках по умолчанию (vim-7.3, Fedora 14) vim хочет только из текущего каталога (а хочется ещё и из каталога этажом выше, или двумя этажами выше). Что касается комбинации клавиш, я не придумал ничего лучше, как использовать соседнюю с Ctrl-], а именно Ctrl-\. Они рядом, в этом есть логика. Обратно прыгаем точно так же, как и с тегами, по Ctrl-T.

Решить обе вышеописанные проблемы получилось вот таким кусочком заклинаний для ~/.vimrc:

" CScope
if has("cscope")
        " Ctrl-\ does reverse search (i.e. "who calls this function")
        nmap  :cscope find c <c-r>=expand("<cword>")<cr><cr>

        set nocsverb
        if filereadable("../cscope.out")
                cs add ../cscope.out ..
        elseif filereadable("../../cscope.out")
                cs add ../../cscope.out ../..
        endif
        set csverb
endif


Что ещё? Базу для cscope можно сгенерить командой cscope -R -b, находясь в корне исходников проекта. В общем, больше ничего и не надо.
nepal

cm7 nightlies gapps trouble

Решил, раз не сплю, накатить в свой телефон свежий CM7 (билд #12 от 3 марта -- новее почему-то нет). До этого там стояло что-то с датой в середине февраля. Накатил (благо с ROM Manager это делается на раз-два, то есть в несколько кликов). После апдейта перестали работать market, gmail, gtalk.

Почистил (отформатировал, через CWM recovery menu) /cache. Не помогло.

Выполнил fix permissions (там у каждого приложения свой uid/gid и файлы данных должны принадлежать ему -- иногда, почему-то, это сбивается) -- тоже с помощью ROM Manager. Не помогло.

Перенакатил gapps. Помогло лишь отчасти -- маркет открылся, но gmail и youtube продолжали делать FC (force close, что-то вроде SEGFAULT).

И тут я сделал гениальную по своей простоте вещь -- деинсталлировал gmail и youtube и поставил их заново. Помогло!

PS я знаю, что помогает сделать wipe /data, но уж очень не хотелось прибегать к таким радикальным мерам.
PPS я знаю, что это напоминает войну с неработающим Линуксом, но надо учесть, что это nightly build неофициального форка Андроида -- нормальные люди такой bleeding edge себе не ставят, конечно, и у них всё работает.
nepal

Сохранение и работа с метками Яндекс.Карт на Андроиде

Насколько я понял, реализация мобильных Яндекс.Карт на Андроиде отстаёт от аналогичных решений на, скажем, Симбиане. В частности, вносимые пользователем метки хранятся локально в базе sqlite3, причём хранятся не на SD карточке, а в памяти телефона (на /data).

Проблема в том, что после перепрошивки (скажем, со штатной на CyanogenMod) или хард-ресета (мне приходилось его однажды делать) все ваши метки бесследно исчезают. Конечно, хотелось бы, чтобы они хранились или на SD карточке, или в гуглооблаке, или в яндексе, но увы, пока это не так.

Приходится заботу о метках брать в свои руки. Последующий текст предполагает, что у вас есть компьютер, на котором стоит ADB, а телефон присоединён к компьютеру через USB. Возможно, всё это работает только на рутованном телефоне!

Чтобы скачать метки с телефона на компьютер:
adb -d pull /data/data/ru.yandex.yandexmaps/databases/labels.db

В случае, если вы используете модифицированные Яндекс.Карты' от Александра Хохлова:
adb -d pull /data/data/ru.yandex.yandexmaps.khokhlov/databases/labels.db

Метки можно редактировать с помощью командной строки sqlite, если вы знаете SQL:

sqlite3 labels.db
SQLite version 3.6.23.1
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> .mode line

sqlite> SELECT * from sqlite_master;
    type = table
    name = android_metadata
tbl_name = android_metadata
rootpage = 3
     sql = CREATE TABLE android_metadata (locale TEXT)

    type = table
    name = mylabels
tbl_name = mylabels
rootpage = 4
     sql = CREATE TABLE mylabels (_id INTEGER PRIMARY KEY,label_name TEXT,label_name_tolower TEXT,lat LONG,lon LONG,geocode TEXT,date LONG)

sqlite> SELECT * FROM mylabels LIMIT 1;
               _id = 1
        label_name = Офис
label_name_tolower = офис
               lat = 55.8746625377941
               lon = 37.5884219154757
           geocode = Россия, Москва, Алтуфьевское шоссе, 44
              date = 1292572012292

Обратно в телефон labels.db запихиваются тоже через adb, только вместо pull говорим push:
adb -d push labels.db /data/data/ru.yandex.yandexmaps/databases/labels.db
или для карт от Хохлова:
adb -d push labels.db /data/data/ru.yandex.yandexmaps.khokhlov/databases/labels.db