Сегодня 4 июня, вторник ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7274
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Евгений Ламской
Евгений Ламской
Голосов: 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

Запускается так:

sudo php mirrorselect.php

Ниже приведен исходный код

<?php


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

su -
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, практическую пользу.



Страницы: 1 2 3 4 5 6 

 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по сумме баллов (758) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.