Да движиш някакъв проект в който се програмира активно без контрол над версиите в днешно време е пълно безумие. Като цяло има множество опции bazaar , mercurial , git , svn . Така тука ако ще очаквате да обяснявам кой контрол над версиите е по добър и защо няма да е. При нас използваме git. Причини много – лесно се настройва, много е гъвкав, написан е от Линус Торвалдс за да обслужва Linux Kernel версиите, последното са поне 2 причини 😉 . Днес ми се наложи да създам ново хранилище, че се започна нов проект. Реално съм създавал малко хранилища и то преди много време когато са ни трябвали и съм забравил тънките моменто по това. Създавам хранилището блъснах няколко файла за първото съхранение всичко мина точно. Самата настройка на хранилището беше стандартна:


git init
echo "Short project's description" > .git/description
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git commit -a
touch .git/git-daemon-export-ok

В общи линии нищо което да не е наред. След това реших да тествам от отдалечена машина да съхраня съдържание и при опита да го push-на ми изгърмя с грозното съобщение:

Pushing to git://gitHost/project
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require ‘git reset –hard’ to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set ‘receive.denyCurrentBranch’ configuration variable to
remote: error: ‘ignore’ or ‘warn’ in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: ‘receive.denyCurrentBranch’ configuration variable to ‘refuse’.
To git://gitHost/project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to ‘git://gitHost/project’

Така очевидно се опитвам да комитвам в главното дърво на проекта и софтуера вежливо ме режи. Като цяло нямам никакво намерение да правя допълнителен бранч понеже хората които участват по проектите са си ясни и ред други причини. Тука идва момента да отбележа че съм дефинирал много некадърно заглавието но това е друг момент. Като цяло решението на проблема е тривиално в .git/config на проекта ви трябва да добавите следната директива:


[receive]
denyCurrentBranch = false

След това всичко си идва на мястото.

http://www.youtube.com/watch?v=16bRiH5zfOY

Packet Tracer

Image via Wikipedia

Днес ми се наложи да демонстрирам една симулация през Cisco Packet Tracer на машина на която не беше инсталиран. В общи линии малоумщината е, че стимулатора на Cisco е за x86 машини а при мен машината беше x64. При опит за инсталация умира с грозното съобщение

Attempting to install package now
dpkg: error processing PacketTracer-5.3_3.i386.deb (–install):
package architecture (i386) does not match system (amd64)
Errors were encountered while processing:
PacketTracer-5.3_3.i386.deb

Общо взето всичко е очевидно Debian-ския пакет не иска да се инсталира защото е за друга архитектура. От тук нататък проблема е ясен dpkg + форсирано инсталиране за да байпаснем грешката за различна платформа. Bin-ския файл на инсталатора реално е само разархивиращ се архив който се разархивира в /tmp/selfextract.XXXXX папка където XXXXX е произволен низ. В тази директория се намира .deb файлът на Packet Tracer-a. Инсталацията се извършва с командата

dpkg -i --force-all /tmp/selfextract.XXXXX/PacketTracer-5.3_3.i386.deb

Естествено с root права.

Enhanced by Zemanta

Вчера след обновяване на версията на mysql, server-ът ми започна да ми крещи, че има табличка, която не е била затворена чисто и има нужда от поправка и прочие. Блах, коя ще е тая таблица, все пак са ми около 30-тина на тоя сървър. Единият вариант е да видите в log-овете какво пише по въпроса и да пуснете поправка на съответната таблица или другият вариант – далеч по-добрият – е да пуснете поправка, проверка и оптимизиране на всички таблици. За тази цел ще използвам mysqlcheck инструмента. Общо взето вариантите в случая са като и двете коменди са синонимни една на друга:


mysqlcheck -Aor -u root -p

mysqlcheck -u root -p --auto-repair --check --optimize --all-databases

Общо взето, която и от двете команди да използвате, ефектът ще е еднакъв – ароматична поправка, проверка  и оптимизация на всички таблици. След като напишете която и да е от двете команди, ще бъдете попитани за root паролата на mysql server-a ви.

Днес си играх да оптимизирам една бавна SQL заявка от вида


SELECT * FROM 'table' WHERE `field` LIKE '%word%'

Къде е проблемният момент тука – последната част ‘%word%’ и в още по-голяма конкретност знака % преди думата, за която правим. Wildcard символът % ,преди която и да е стойност, директно ни превръща заявката директно в бавна, защото по този начин заявката ни спира да ползва индекси на полето. Решения както винаги има, но не винаги са ясни 😆 Общо взето MySQL си имат решение на тоя проблем с fulltext search индексиране на полето. Как става смяната на полето има много написано в документацията, но набързо ще опиша как се променя горната заявка, защото ще стигнем и до една малка драма накрая. Следка като приложим fulltext на полето горе, заявката трябва да се промени във вида:


SELECT * FROM `table` WHERE MATCH (field) AGAINST ('word')

Така структурата е очевидна и няма нужда от излишна дискусия. Горната заявка ще влезе в сила, ако думата, за която правите заявка е поне 4 символа, по подразбиране е това стойността, ако искате да я модифицирате трябва да укажете стойността, която желаете в my.cnf в частта  [mysqld] с декларацията ft_min_word_len=3 или 2, 1 не е добър избор очевидно 😉  . След като смените стойността и рестартирате mysql server-a трябва да направите repair на таблиците си, за да може новото индексиране да влезе в сила. До тук всичко ясно: правя промените, рестартирам, ребилдвам индексите и правя заявката и ми връща 0 реда 😀 Проверявам с


SHOW VARIABLES

Виждам че стойностите, който съм задал са влезли в сила, ребилдвам пак индексите – същия резултат. 🙄 Неприятно, много неприятно. От тук нататък започна едно голямо ругаене и ровене за ключа за бараката 😀 Който се оказа доста, доста интересен. Като цяло, като започнах да чета документацията за не знам кой път и стигнах до един интересен пасаж

 Such a technique works best with large collections (in fact, it was carefully tuned this way). For very small tables, word distribution does not adequately reflect their semantic value, and this model may sometimes produce bizarre results. For example, although the word “MySQL” is present in every row of the articles table shown earlier, a search for the word produces no results

ГРЕДА 😳  Дам табличката ми беше малка – все пак беше тестова. Наших заявката в една голяма таблица с над 2 000 000 реда и там нещата заспаха. Добре вече е ясен проблемът. За да стане ясно решението, ще спомена накратко, че full text search поддържа 3 разширени режима BOOLEAN , EXPRESSIONS и NATURAL LANGUAGE като последния работи по подразбиране. За различните режими може да проверите документацията, аз ще обясня с 2-3 думи за BOOLEAN понеже в него е разковничето. Той поддържа логически оператори от типа AND, OR , NOT и прочие и може да се правят разни магии с търсените фрази, да има една, да няма друга и прочие. Поддържа и символа *, който е еквивалент на wildcard символа % 😉 Той е полезен, когато търсената дума е под дължината на ft_min_word_len или за малки таблички ;). Поне при мен на таблица с около 100 реда върши идеална работа. Остана само да видим и завършената заявка:


SELECT * FROM `table` WHERE MATCH (field)
AGAINST ('*word*' IN BOOLEAN MODE)

Тука вече идва момент дали ни работи индексирането с wildcard символа – отговорът е не знам. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Enhanced by Zemanta

How PulseAudio works.

Image via Wikipedia

Днес най- накрая след една камара време реших да си купя още кабели за да си закача 5.1 аудио системата ми пълноценно. Досега я ползвах със нормален стерео кабел и след това системата сама си правеше деление на аудио каналите. Което не е никак добре. Сега вече за всеки канал си има отделен кабел и звукът е доста по чист (естествено), по плътен а на филмите усещането е подобрено много кратно. Имаше няколко малки драми които се оправят относителни интуитивно. Основната драма беше, че звукът тръгна само в front колоните без буфер център или задните след като пренастроих звуковата схема на Gnome да е 5.1 . В повечето плеъри имам опция за настройка в alsa часта за колко канално да е аудиото но има програми в които отсъствува такава възможност като да речем adobe flash player. Първоначалната ми идея беше просто да пренастроя .asoundrc като задам параметри да дублира звукът по всички канали – решение с което не се гордея защото не го обмислих изобщо. Конфигурацията тривиална :

pcm.!default {
type plug
slave.pcm „surround51“
slave.channels 6
route_policy duplicate
}

С нея нещата си дойдоха на място докато не осъзнах че alsa може да обработва само по 1 процес и докато тои не приключи да я ползва друг не може. 😳  Неприятно но факт бях забравил времената в който слушаш или player или youtube и ако едното ти омръзне трябва да затвориш програмата, че да ползваш другата апликация. Което веднага ми подсказа къде е истинския корен на нещата – конфигурацията на pulseaudio сървъра. Pulseaudio е най грубо казано прокси сървър който обработва информацията между аудио хардуера и аудио софтуера който иска да го ползва. Система която с години се доказа много кратно. При нея конфигурацията се намира в /etc/pulse/daemon.conf. По подразбиране всичко е закоментирано с ; така че ако не сте праивли промени може направо смело да добавите следните редове накрая на файлът:

enable-lfe-remixing = yes

default-sample-rate = 48000
default-sample-channels = 6

Имената на опциите са очевидни задаваме стойноста на колко канално аудио ще сме малък тунинг на стандартния битрейт и разрешване на lfe ремиксирането.  След това остава да рестартирате alsa и pulseaudio с

sudo /etc/init.d/alsa-utils restart && pulseaudio -k

От тук нататък за мен остана само а се наслаждавам на вече по доброто аудио.

edit: .asoundrc трябва да е със съдържание за да нямате проблеми със skype и някой други апликации

pcm.pulse {type pulse }
ctl.pulse { type pulse }

Enhanced by Zemanta