Какой рейтинг вас больше интересует?
|
Главная /
Каталог блогов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, практическую пользу.
+2036 |
2053 |
Ищешь oldMike? - Это ЗдесЪ! |
+1994 |
2064 |
Splash_Phantom |
+1961 |
2094 |
ДеВаЧкА-НеФоРмАлКа |
+1948 |
2106 |
ROMAHA.SU |
+1947 |
2080 |
Yurenzo |
-1 |
1366 |
Выдающиеся женщины |
-8 |
543 |
absit_omen |
-8 |
18 |
anmak |
-9 |
17 |
ВАДОС |
-10 |
10 |
Всё о Заработке в Интернет, а так же Интернет Новости |
Загрузка...
взяты из открытых общедоступных источников и являются собственностью их авторов.