![]() ![]() ![]()
Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера Евгений Ламской/Записи в блоге |
Евгений Ламской
Голосов: 1 Адрес блога: http://lamskoy.livejournal.com/ Добавлен: 2010-05-18 17:01:15 |
|
Утилита для выбора зеркал пакетов в Archlinux
2010-09-22 16:35:23 (читать в оригинале)Вот и обещанная утилита, которая выбирает зеркала пакетов в Archlinux.
Выбирает она не отдельные зеркала, а группами - по странам
Выглядит она так:
Требования: PHP 5.2.x (с отключенным open_basedir, safe_mode и разрешенным вызовом exec()), dialog
Запускается так:
Ниже приведен исходный код
class Mirrorlist
{
protected $_filename;
protected $_data;
public function __construct()
{
$this->_data = array();
$this->_filename = false;
}
public function read($filename)
{
if(!is_file($filename) || !is_readable($filename)) {
throw new Exception ("Cannot read file: $filename");
}
$this->_filename = $filename;
$f = fopen($this->_filename, 'r');
$currentTitle = '';
while(!feof($f)) {
$line = fgets($f, 1024);
$isServer = preg_match("/^[\s]?([#]?)[\s]?Server[\s]+=[\s]+([^\s]+)[\s]?$/", $line, $serverMatches);
$isTitle = $isServer ? false : preg_match("/^[\s]?#[\w\s]+$/i", $line, $titleMatches);
$trimmed = trim(ltrim($line, "#"));
if(!$trimmed) {
continue;
}
if($isTitle) {
$currentTitle = $trimmed;
} elseif ($isServer) {
$active = empty($serverMatches[1]);
$uri = $serverMatches[2];
$title = $currentTitle ? $currentTitle : "Custom servers";
if(!isset($this->_data[$title])) {
$this->_data[$title] = array ( 'servers' => array(), 'allactive' => true, 'count' => 0 );
}
$this->_data[$title]['count']++;
$this->_data[$title]['servers'][$uri] = $active;
if($active == false) {
$this->_data[$title]['allactive'] = false;
}
}
}
fclose($f);
return $this;
}
public function __toString()
{
if(!count($this->_data)) {
return '';
}
$data = "# Selectmirror generated \n\n";
foreach($this->_data as $country=>$cdata) {
if(!$data['servers']) {
continue;
}
$data .= "# $country\n";
foreach($cdata['servers'] as $uri=>$enabled) {
$data .= ($enabled ? '' : '#') . "Server = " . $uri . "\n";
}
$data .= "\n\n";
}
return $data;
}
public function save($filename = false)
{
if(false == $filename) {
$filename = $this->_filename;
}
if(false === $filename) {
return $this;
}
if (false === file_put_contents($filename, $this->__toString())) {
throw new Exception ("Cannot write to file: $filename");
}
return $this;
}
public function getCountriesList()
{
return $this->_data;
}
public function setEnabledCountries($countries, $disableRest = true)
{
if(!$countries) {
return $this;
}
$countries = (array) $countries;
foreach($this->_data as $c => $data) {
foreach($this->_data[$c]['servers'] as $k=>$v) {
if(in_array($c, $countries)) {
$this->_data[$c]['servers'][$k] = true;
$this->_data[$c]['allactive'] = true;
} elseif($disableRest) {
$this->_data[$c]['servers'][$k] = false;
$this->_data[$c]['allactive'] = false;
}
}
}
return $this;
}
}
class DialogMirrorlist extends Mirrorlist
{
public function getCommand()
{
if(!count($this->_data)) {
return false;
}
$command = "dialog --checklist --stdout \"Select countries closest to you\" 0 0 0 ";
foreach($this->_data as $name => $data) {
$count = $data['count'];
$active = $data['allactive'] ? 'on' : 'off';
$command .= " \"${name}\" \"Mirrors count: ${count}\" $active ";
}
return $command;
}
public function setEnabledCountries($countriesString, $disableRest = true)
{
$countriesList = preg_split('/"[\s]+"/', trim($countriesString, '"'));
return parent::setEnabledCountries($countriesList, $disableRest);
}
}
class App {
public static function exec($cmd)
{
$outArr = array();
$returnInt = null;
$out = exec(escapeshellcmd($cmd), $outArr, $returnInt);
return array('code'=> (int) $returnInt, 'out' => $out, 'all' =>$outArr);
}
public static function findOnPath($cmd)
{
$return = self::exec("which $cmd");
return $return['code'] == 0;
}
public static function checkRequirements()
{
if(ini_get('open_basedir')) {
throw new Exception("Set open_basedir = Off directive in your php.ini before using this script.");
}
if(!function_exists("exec")) {
throw new Exception("exec() function is disabled in PHP. Can't work without it's support.");
}
if(!self::findOnPath('dialog')) {
throw new Exception("dialog utility is not found on path");
}
}
public static function run()
{
try {
self::checkRequirements();
$mirrors = new DialogMirrorlist();
$command = $mirrors->read('/etc/pacman.d/mirrorlist')->getCommand();
if(!$command) {
echo "No mirrors detected it given mirrorlist. Nothing to do. \n";
exit(0);
}
$return = self::exec($command);
if($return['code'] == 0) {
$mirrors->setEnabledCountries($return['out'])->save();
}
exit(0);
} catch (Exception $e) {
echo "Error: {$e->getMessage()} \n";
exit(1);
}
}
}
App::run();Syhi-подсветка кода
Archlinux и устаревший список зеркал
2010-09-22 13:34:16 (читать в оригинале)Заметил что в Archlinux бывает проблема с обновлением списка зеркал. В пакете pacman-mirrorlist на используемых мной зеркалах не всегда самая свежая версия этого списка.
Есть простое решение этой грабли:
забрать wget-ом список зеркал прямо с сайта арча
поправить его руками, выбрав нужные зеркала
и сделать pacman -Syyu
wget -O /etc/pacman.d/mirrorlist http://www.archlinux.org/mirrorlist/all/
nano -w /etc/pacman.d/mirrorlist
pacman -Syyu
Планирую накидать небольшую тулзу на bash + dialog чтобы можно было выбирать зеркала без ручной правки mirrorlist-а.
Autounmask - полезная утилита для Gentoo
2010-06-09 14:06:17 (читать в оригинале)Наткнулся на весьма полезную утилиту для автоматического размаскирования пакета с его зависимостями. Называется autounmask. Ставится из официального репа:
emerge -av autounmask
Очень удобно размаскировать такие метапакеты как kde-base/kde-meta (с учетом всех зависимостей)
autounmask =kde-base/kde-meta-4.4.3
Времени занимает много, однако все же меньше, чем ковыряться с пакетами вручную.
Xorg-server 1.8 - новые старые конфиги
2010-05-29 17:52:58 (читать в оригинале)Опробвал xorg-sever 1.8.1 на Gentoo
Как известно, в 1.8 выпилили поддержку HAL и перешли на udev. Вместо унылых конфигов в духе /etc/hal/fdi/policy/*.fdi вернулись старые - формата xorg.conf - с новыми ключевыми словами
Теперь подключаемые конфиги лежат в /etc/X11/xorg.conf.d в отдельных файлах *.conf
Вот пример конфигурации клавиатуры (90-keyboard.conf):
Section "InputClass" Identifier "keyboard" MatchIsKeyboard "yes" Option "XkbLayout" "us,ru" Option "XkbVariant" ",winkeys" Option "XkbOptions" "terminate:ctrl_alt_bksp,grp:caps_toggle,grp:switch,grp_led:scroll,numpad:microsoft,compose:ralt" EndSection
ИМХО, MatchIsKeyboard "yes" стало удобнее писать, чем конструкции match в HAL-овских fdi
В добавок приведу конфиг моего тачпада (90-touchpad.conf):
Section "InputClass" Identifier "touchpad catchall" Driver "synaptics" MatchIsTouchpad "on" Option "AlwaysCore" "true" # send events to CorePointer Option "Protocol" "auto-dev" Option "SHMConfig" "true" # configurable at runtime? security risk Option "VertEdgeScroll" "true" # enable vertical scroll zone Option "HorizEdgeScroll" "true" # enable horizontal scroll zone Option "MinSpeed" "0.20" # speed factor for low pointer movement Option "MaxSpeed" "0.50" # maximum speed factor for fast pointer movement Option "AccelFactor" "0.005" # acceleration factor for normal pointer movements Option "VertTwoFingerScroll" "true" # vertical scroll anywhere with two fingers Option "TapButton1" "1" Option "TapButton2" "2" Option "TapButton3" "3" EndSection
P.S. Не забудьте персобрать xf86-* драйверы под новую версию иксов на Gentoo
P.P.S. В ArchLinux нужно только подключить testing репозиторий и обновить систему
Radeon и горизонтальные полоски при просмотре видео
2010-05-20 01:13:09 (читать в оригинале)На сей раз расскажу об извечной проблеме с Radeon - горизонтальными полосками при просмотре в видео во всех плеерах, начиная с mplayer, заканчивая vlc.
Проблему эту наблюдаю давно, на разных конфигурациях как на x86, так и на x86_64: всегда и везде присутствуют эти надоедливые горизонтальные полоски, называемые на англоязычных форумах tearing
Довольно долго пользовался обходным путем - устанавливал OpenGL в качестве движка для отрисовки и это помогало, но наблюдались проблемы с производительность при просмотре видео большого разрешения. Ох уж этот ATI Radeon :D
Решение получено в результате эксперимента с настройками XVideo после прочтения man-а xorg-video драйвера radeon - а именно строки, где упоминается утилита xvattr:
The driver supports the following X11 Xv attributes for Textured Video. You can use the "xvattr" tool to query/set those attributes at runtime.
Утилита не xvattr не входит в стандартную поставку xorg (по крайней мере в ArchLinux), поэтому я собрал ее из AUR:
yaourt -S xvattr
В итоге я поигрался с параметром XV_BICUBIC, сбросив его в 0 командой:
xvattr -a XV_BICUBIC -v 0
Свершилось чудо - видео стало воспроизводиться без этого самого tearing-а! Горизонтальные полосы исчезли навсегда
Решение для ATI Radeon оказалось настолько рядом, что я не мог себе этого представить.
Убедился еще раз: господа, читайте маны! Стоит попробовать поиграться со всеми возможными (и невозможными) настройками, чтобы получить желаемый результат.
Буду рад, если мой пост принесет владельцам ATI Radeon, сидящим под Linux, практическую пользу.



Загрузка...

взяты из открытых общедоступных источников и являются собственностью их авторов.