cppmm's Tech blog

Разные, на мой взгляд, интересные замечания, связанные с компьютерами в частности и техникой вообще.

понедельник, 18 апреля 2016 г.

Заметочки: CS:GO и ошибка Could not find required OpenGL entr...

Заметочки: CS:GO и ошибка Could not find required OpenGL entr...: Решил, значит, зайти в Counter-Strike Global Offensive, чтобы посмотреть демо из Overwatch и причаститься к наказанию адептов WH, AIMbot и...

воскресенье, 3 марта 2013 г.

О эталонах криворукости.

Есть пользователи, которые слабо разбираются во всех этих компьютерах, и могут что-то поломать по незнанию.
Есть пользователи, которые слабо разбираются, но думают, что это не так и ломают всё постоянно опять же по незнанию, но уверены, что виновата система.
Эти категории привычные и от них никуда не деться. Но вот когда есть целые компании, довольно успешные, но продолжающие выпускать совершенно кривые продукты, это странно. Нет, я не о Microsoft сейчас. :)
Есть у нас в стране фирма "1с". Я не знаю, насколько хорошо или плохо у них со всякими бухгалтериями, совсем немного сталкивался с их битриксом, но вот с деятельностью этой компании на поприще издательства игр, к сожалению, приходится знакомиться часто.
Первое знакомство было после покупки игры "Космические рейнджеры 2. Доминаторы". Их защита от нелицензионного копирования StarForce много крови выпила в своё время. Вплоть до того, что когда диск с игрой от старости и затёртости перестал читаться, я, не сумев добиться от компании какого-либо способа восстановить официально купленную игру в итоге вынужден был купить игру заново. Может, конечно, это такой маркетинговый ход, не знаю.
В другой раз пришлось повоевать, когда я пытался привязать к своему Steam-аккаунту изданную 1с-ом игру "Serious Sam: First Encounter". До сих пор не получилось, потому как узнать ключ, необходимый для привязки мне так и не удалось. Так и приходится каждый раз при желании поиграть, вставлять диск.
Множество мелких косяков типа танцев с бубном для установки очередного апдейта и прочих я уже упоминать не буду. Но на днях я встретился просто с эталонным проявлением криворукости. Купил жене игру "Ведьмак 2: Убийцы королей". Вот это было шаманство так шаманство.
Сперва игру попыталась поставить жена без меня. Но не смогла. Как сказала по телефону(я в это время был не дома), игра не может найти какие-то установочные файлы, хотя долго их куда-то копировала. По телефону я помочь не смог и решено было, что установлю сам, когда вернусь.
Немного забегая вперёд, стоит отметить, что все и абсолютно все действия, описанные ниже, стали необходимы исключительно из-за того, что по неизвестным мне причинам, компания 1с поставляет игру с каким-то своим фирменным инсталлятором. Чем им не угодил оригинальный, я не знаю.
Итак, описание эротического квеста по установке игрушки.  

вторник, 17 июля 2012 г.

MySQL: Дамп всех таблиц с определённым префиксом

Попалась недавно одна кривая база. В ней были одновременно два проекта. У одного из них для всех таблиц использовался один префикс(условно xxx_), у другого соответственно другой(скажем yyy_). Понадобилось разделить эту таблицу на две разных. Были идеи дампить каждую таблицу отдельно, а потом в консоли объединять cat'ом или писать скрипт, который по регекспу сдампит только те таблицы, что мне нужны. Но оба решения мне показались костылями, поэтому немного подумав пришёл в итоге к такому вот решению(параметры -u, -p, -h опустил намеренно для наглядности): mysql -NB information_schema -e "select table_name from tables where table_name like 'prefix_%'" | xargs mysqldump dbname > only_prefix.sql

вторник, 21 февраля 2012 г.

Восстановление базы установленных пакетов в debian

Решил тут перейти на нетбуке со стабильной ветки debian'а на тестинг. Так как на моей eeepc'шке всего 4 гига флешка внутри, места для dist-upgrade не хватило бы. Но я уже обновлял его с lenny до squeeze в своё время, так что это не проблема. Беру обычную флешку, форматирую в ext3, подключаю и тут я допускаю первую ошибку. Вместо того, чтобы просто примонтировать эту флешку как /var/cache/apt/archives, я копирую на неё содержимое /var/ и командую mount /dev/sdb1 /var/. Само по себе это тоже не проблема. Я спокойненько обновился, отмонтировал флешку и ребутнулся. Это было второй ошибкой. Дело в том, что помимо всего прочего на /var/ лежит база установленных пакетов dpkg. Находится она в /var/lib/dpkg/status. И тут я понимаю, что после того, как система обновилась, я допустил третью ошибку. Мне понадобилась флешка и я её снова форматнул.
Итак, ситуация. На нетбуке установлен Debian Wheezy. Но dpkg думает, что там squeeze(я же монтировал просто поверх /var/, и всё, что там было, осталось неизменным). В итоге dpkg и apt в ступоре. Они смотрят в базы установленных пакетов, сравнивают их с репами и понимают, что надо обновляться. Но при попытке что-нибудь установить или обновить, dpkg проверяет установленные файлы и понимает, что они не соответствуют тому, что у него в базе(версии-то разные) и отказывается что-либо делать. И я его понимаю. Например, он ругается на libc6. Он же видит, что у меня динамический линковщик ссылается на определённую библиотеку. Но у него в базе говорится, что стоит другая библиотека. Поэтому dpkg честно выдаёт "Ты там разберись сперва с тем, что в обход меня поставил, а потом уже обновляйся, а то я тебе всё сломать могу". Итого - система как бы работает, но пакетный менеджер как бы умер.
Есть два выхода. Каким-то образом восстановить dpkg или переустановить всё с нуля, забекапив конфиги. В случае со вторым вариантом, желательно ещё узнать, какие пакет у меня были установлены, чтобы потом не сидеть и не вспоминать, чего там где было. И пока я думал, как же вытащить список пакетов, в голову пришла идея "если у меня будет список пакетов, зачем переустанавливать? Можно же просто записать их в базу dpkg и работать дальше". На том и порешили.
Для начала надо получить список. Чем славится debian(ну и любой нормальный linux)? Правильно. Тем, что у него на каждый пакет обязательно существует документация. И находится она прямо в системе. Не нужно ни интернетов, ни толстых книжек. Всё с собой. А это значит, что мне нужно посмотреть, на что у меня есть доки и я узнаю, какие у меня стоят пакеты. Решение для первой части проблемы есть.
Но это даст мне только названия пакетов. А для dpkg нужно версии, зависимости и ещё целую кучу всякой информации. И лучшее место, где взять эту информацию - репы. Собственно, это всё тоже уже в системе. Мы получаем все версии, описания, зависимости и т.д., когда командуем apt-get update. И, к счастью, для этой команды не важно - есть там что-то в базе установленного или нет. Она работает и так.
Осталось дело за малым - написать скрипт, который пройдётся по докам, соберёт имена, а потом с этими именами пробежится по спискам пакетов из реп, распарсит это дело и сложит в нужном виде в базу dpkg.

Собственно, вот этот скрипт.

#!/usr/bin/perl -w
#

my $docsdir = "usr/share/doc/";
my $listsdir = "var/lib/apt/lists/";

my (@packages, @lists);

# Get package names
print "Reading all installed packages.\n";

opendir(DOCSDIR, "$docsdir") or die "Couldn't open $docsdir : $!";
while (defined(my $packagename = readdir(DOCSDIR))) {
        push(@packages, $packagename) if (!($packagename =~ m/([A-Z]|^debian$|\.+)/));
        print ".";
}
print "\n";
closedir(DOCSDIR);
print "Reading complete.\n";
my $p_count = $#packages + 1;
print "There was $p_count packages found.\n";
undef $p_count;

# Get package indexes
opendir(LISTSDIR, "$listsdir") or die "Couldn't open $listsdir : $!";
while (defined(my $listname = readdir(LISTSDIR))) {
        push(@lists, $listname) if ($listname =~ m/Packages/);
}
closedir(LISTSDIR);

# Searching information and make new dpkg status file.
open(my $statusfile, '>', 'status');
foreach my $package (@packages) {
        my %information;
        foreach my $list (@lists) {
                my $filepath = join('/', $listsdir, $list);
                open(my $listfile, '<', $filepath);
                my $write = 0;
                my $multiline = 0;
                while ( defined($line = readline($listfile)) ) {
                        if (grep(/^Package: $package$/, $line)) {
                                print "Package $package found in list $list.\n";
                                $write = 1;
                        }
                        if ( ($write) && (!$multiline) ) {
                                if ( $line =~ m/^Tag/ ) {
                                        $multiline = 1;
                                } else {
                                        my @data = split(/:\s/, $line);
                                        $information{"$data[0]"} = $data[1];
                                }
                        }
                        if ( ($write) && ($multiline) ) {
                                if ( $line =~ m/^Tag/ ) {
                                        my @data = split(/:\s/, $line);
                                        $information{"$data[0]"} = $data[1];
                                } elsif ( $line =~ m/^\s/ ) {

                                        $information{"Tag"} = join('', $information{"Tag"}, $line);
                                } else {

                                        $multiple = 0;
                                }
                        }
                        $write = 0 if ($line =~ m/^$/);
                }
                close($listfile);
        }
        print { $statusfile } "Package: $information{'Package'}" if (defined($information{"Package"}));
        print { $statusfile } "Status: install ok installed\n" if (defined($information{"Package"}));
        print { $statusfile } "Priority: $information{'Priority'}" if (defined($information{"Priority"}));
        print { $statusfile } "Section: $information{'Section'}" if (defined($information{"Section"}));
        print { $statusfile } "Installed-Size: $information{'Installed-Size'}" if (defined($information{"Installed-Size"}));
        print { $statusfile } "Maintainer: $information{'Maintainer'}" if (defined($information{"Maintainer"}));
        print { $statusfile } "Architecture: $information{'Architecture'}" if (defined($information{"Architecture"}));
        print { $statusfile } "Source: $information{'Source'}" if (defined($information{"Source"}));
        print { $statusfile } "Version: $information{'Version'}" if (defined($information{"Version"}));
        print { $statusfile } "Depends: $information{'Depends'}" if (defined($information{"Depends"}));
        print { $statusfile } "Description-md5: $information{'Description-md5'}" if (defined($information{"Description-md5"}));
        print { $statusfile } "Homepage: $information{'Homepage'}" if (defined($information{"Homepage"}));
        print { $statusfile } "Multi-Arch: $information{'Multi-Arch'}" if (defined($information{"Multi-Arch"}));
        print { $statusfile } "\n" if (defined($information{"Package"}));
}
close($statusfile);

syntax highlighted by Code2HTML, v. 0.9.1

Небольшие пояснения. Сначала мы указываем пути, где лежит документация и где списки пакетов, скачанные с реп при обновлении. Потом получаем список пакетов и начинаем по очереди для каждого из них искать информацию, складывать её в хеш, из которого потом в свою очередь записывать в файл в формате, необходимом dpkg. Вот и всё. Запускается скрипт без параметров, работает долго, на выходе выдаёт файл status, который надо положить в /var/lib/dpkg/.

Какие можно из всего этого сделать выводы?
1. Не начинайте делать серьёзных вещей в два-три часа ночи. По невнимательности можно допустить несколько казалось бы мелких ошибки, из-за которых потом придётся долго отдуваться.
2. GNU/Linux - система неубиваемая. Даже после конца света, она будет работать, хотя, может быть, людей уже и не останется.

суббота, 26 февраля 2011 г.

Ошибка Drupal и ImageCache при использовании nginx в качестве проксирующего web-сервера

Есть у меня под присмотром один сервер. Сервер это находится чёрт знает где, а компания, которая предоставляет его довольно жадная. На сервере около 20-ти разнообразных сайтов и на всё про всё 192 метра оперативки. Вот, недавно нагрузка окончательно стала добивать его, поэтому было решено воткнуть nginx как фронтенд как установленному там апачу(изначально не сделал так, потому как там не полноценный сервер, где что хочу, то и творю, а выделенный в chroot на FreeBSD). Собрал, поставил, настроил. Всё хорошо, нагрузка упала, но через некоторое время на части сайтов(те, что с Drupal, как раз) не отображались уменьшенные изображения залитых после перехода на связку nginx+apache картинок.

суббота, 15 января 2011 г.

Управление зонами в BIND9

Давно обещал немного рассказать про организацию своей домашней сети. Надеюсь, в дальнейшем это выльется в цикл статей.
Начнём с DNS.
У меня стоит отдельный роутер и разумеется внутри сети используются так называемые серые ip-адреса. Когда компов мало, можно ходить на них по ip, но я админ ленивый, а потому стараюсь всегда упростить себе жизнь. Ещё один минус связи исключительно по ip-адресам - скрипты. Ну, например, укажу я монтирование удалённого диска в скрипте по ip-адресу, а через пару месяцев захочется мне этот ip сменить(мало ли чего, всякое бывает). Придётся в скрипте править. А если таких скриптов много? Возникает проблема. Чтобы такого не было, лучше настроить связь между компами по именам, тогда при смене ip одного из компов, будет достаточно лишь поправить запись в DNS.

воскресенье, 26 декабря 2010 г.

Весёлый hddtemp.

ВНИМАНИЕ: Диск /dev/sdb не включен в базу данных поддерживаемых приводов.
ВНИМАНИЕ: Но с использованием распространенных параметров он что-то выдает.

Понимаю, что ничего необычного в этом выводе нет, но всё же как-то бросается в глаза фраза "он что-то выдаёт". :) Звучит настораживающе.