Поиск по этому блогу

суббота, 17 марта 2018 г.

Настройка поддержки двух видеокарт на Ubuntu 18.04

В ходе поиска решения не раз славливал чёрный экран при запущенных иксах, супернизкое разрешение, и прочие прелести...
После долгих мучений наконец нашёл способ, пользуйтесь на свой страх и риск.


1. sudo apt-get remove --purge nvidia-*

2. sudo apt-get update && sudo apt-get upgrade

3. sudo apt-get install gcc make linux-headers-`uname -r`
sudo apt-get install dkms bbswitch-dkms


4. sudo add-apt-repository ppa:graphics-drivers/ppa

5. sudo apt-get --no-install-recommends install nvidia-390

6. sudo apt-get --no-install-recommends install bumblebee primus

7. sudo mv /etc/bumblebee/bumblebee.conf /etc/bumblebee/bumblebee.conf.bak

[bumblebeed]
VirtualDisplay=:8
KeepUnusedXServer=false
ServerGroup=bumblebee
TurnCardOffAtExit=true
NoEcoModeOverride=false
Driver=nvidia
XorgConfDir=/etc/bumblebee/xorg.conf.d

[optirun]
Bridge=primus
VGLTransport=proxy
PrimusLibraryPath=/usr/lib/x86_64-linux-gnu/primus:/usr/lib/i386-linux-gnu/primus
AllowFallbackToIGC=false

[driver-nvidia]
KernelDriver=nvidia
PMMethod=auto
LibraryPath=/usr/lib/nvidia-390:/usr/lib32/nvidia-390
XorgModulePath=/usr/lib/nvidia-390/xorg,/usr/lib/xorg/modules
XorgConfFile=/etc/bumblebee/xorg.conf.nvidia

[driver-nouveau]
KernelDriver=nouveau
PMMethod=auto
XorgConfFile=/etc/bumblebee/xorg.conf.nouveau

8. sudo systemctl restart bumblebeed.service

9. /etc/modprobe.d/bumblebee.conf:

...
# 390
blacklist nvidia-390
blacklist nvidia-390-updates
blacklist nvidia-experimental-390
blacklist nvidia_drm
blacklist nvidia_modeset
blacklist nvidia_uvm
blacklist nvidiafb
blacklist nvidia

10. sudo apt-get install mesa-utils mesa-utils-extra

11. vblank_mode=0 optirun -vv glxgears

12. sudo reboot

Источники:

1. Ubuntu NVIDIA Optimus setup - Install bumblebee and nvidia drivers

2. How can I uninstall a nvidia driver completely?

суббота, 6 мая 2017 г.

Монтирование нескольких каталогов в одну точку

Периодически возникает необходимость использования файлов модуля в каталоге с основной программой.
До этого использовал симлинки или mount -o bind.
Но такой способ оказался крайне неудобным, поскольку файлов в модуле много, они все сильно вложенные, так что приходится прописывать каждый файл... В общем, геморройно это.
Сегодня нашёл на просторах интернета интересный способ монтирования в одну точку и написал для этого такой скриптик, назовём его union_mount:

#!/usr/bin/env bash

# Union mount two directories into one mount point

dir1=$1
dir2=$2
result_mount_point=$3

if [[ (-z $dir1) || (-z $dir2) || (-z $result_mount_point) ]]; then
echo "Usage: $0 dir1 dir2 result_mount_point"
exit 1;
fi

sudo mount -t aufs -o br=${dir1}=rw:${dir2}=rw none $result_mount_point

exit 0;

Он разработан для двух каталогов, но ничто не мешает добавить сколько нужно.

Как он работает. Допустим, есть каталог A: /path1/Afile.txt, каталог B: /path2/Bfile.txt и каталог C: /path3 (рабочий каталог проекта)
Вызываем union_mount /path1 /path2 /path3
В результате получаем: /path3/{Afile.txt,Bfile.txt}, т.е., содержимое точки монтирования не "перетирается" последним смонтированным, а объединяется с предыдущим.

Надеюсь, идея понятна.

суббота, 11 марта 2017 г.

Конфиг xdebug

1) Узнаём, где у нас лежит xdebug.so, чтобы потом вставить этот путь в параметр zend_extension: find / -name xdebug.so
2) sudo vim /etc/php.d/15-xdebug.ini

zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.remote_connect_back=1

xdebug.remote_handler=dbgp
xdebug.remote_port=9005

xdebug.var_display_max_depth = -1
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1

xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = on
xdebug.profiler_output_name = cachegrind.out.%t.%p

Я ещё добавляю xdebug.remote_autostart=1, хоть это немного и замедляет работу php, для разработки такое замедление некритично. Если ты, конечно, не используешь virtualbox filesystem. Там всё печально со скоростью, но это уже другая история.
Без автостарта нужно добавлять параметр XDEBUG_SESSION_START=idekey к запросу в браузере.

http://telegra.ph/XDEBUG-03-11

пятница, 29 марта 2013 г.

Удаленное выполнение команд с помощью ssh


Частенько бывает нужно просто выполнить пару команд удалённо, без захода в шелл.

Следующая команда ssh может быть использована для удаленного создания файла:

ssh user@ssh-server.com '( cd /tmp/ && touch ssh_file.txt )'

Создание локальной копии удаленного файла /etc/passwd в /tmp/passwd:

ssh user@ssh-server.com '( cat /etc/passwd )' > /tmp/passwd

Выполнение сценария на удаленном сервере с помощью ssh:

Примечание: мы предполагаем, что сценарий существует, он исполняемый и у вас есть права на его выполнение.

ssh user@ssh-server.com '( cat ~/myscript.sh )'

В этом примере мы сделали bzip2 локальной копии файла /var/log/auth.log в локальный каталог /tmp/:

ssh user@ssh-server.com '( cp /var/log/auth.log /tmp/; cd /tmp/ && tar -jcvf — auth.log )' > /tmp/auth.tar.bz2

Оригинал: http://www.linuxconfig.org/executing-commands-remotely-with-ssh-and-output-redirection

Этот материал находится на сайте http://compiling.ru

суббота, 17 марта 2012 г.

Детектирование Apple Safari 5.1.1 useragent с помощью jquery и javascript


Строка user-agent Safari от Apple выглядит так:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22

function checkSafariVersion(version) {
    $.browser.chrome = $.browser.webkit && !!window.chrome;
    $.browser.safari = $.browser.webkit && !window.chrome;
    if ($.browser.safari && navigator.userAgent.match(/Version\/(.*\s)/)[1].trim() < version) {
        alert('Update your Safari');
    }
    return;
}

checkSafariVersion('5.1.2');


Простой nginx+php+windows без всякой хни

1. Установка nginx

Качаем с http://nginx.org/ru/download.html последнюю версию
Распаковываем в удобное место.

2. Создаём батник для запуска

cd c:\www\_servers\nginx\
start nginx
c:\www\_servers\xampp\php\php-cgi.exe -b 127.0.0.1:9000 -c c:\www\_servers\xampp\php\php.ini
exit

(php-cgi.exe устанавливается вместе с php, я использовал php от xampp, апач которого предварительно прибил в службах и запретил ему запускаться)

3. Конфиг nginx.conf


worker_processes 1;

events {
    worker_connections 1024;
}


http {
    include mime.types;
    default_type application/octet-stream;

    sendfile on;

    keepalive_timeout 65;

    server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    server {
        listen 80;
        server_name test.local;
        index index.html index.php;
        root c:/www/_!sites/test.local/;
        location ~ \.php$ {
            root c:/www/_!sites/test.local/;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME c:/www/_!sites/test.local/$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

4. Запуск службой

Я использовал для этих целей плагин для total commander под названиием Services (локальные службы). В качестве запускаемого приложения указал вышеупомянутый батник.

В переменную окружения записываем PHP_FCGI_MAX_REQUESTS со значением 0 (это для того, чтобы fcgi не отваливался по достижению максимального количества запросов)

В принципе, этого достаточно для запуска web-сервера nginx на вашем windows-"box".


суббота, 11 февраля 2012 г.

Complete property Internet Explorer

Оказывается, всеми горячо "любимый" браузер Internet Explorer (речь идёт о 9-й версии сего детища браузеростроения) как всегда, по-своему обрабатывает свойство complete DOM-элемента image (попросту - картинки).

Если просто размещать картинки и прикольные фотки на странице, то ничего страшного в этом нет, ты никогда об этом даже не узнаешь.

Но мы (корейские пионеры), создаём интерактивные приложения на html canvas, поэтому сей баг здорово подпортил нам кровь. Дело в том, что некоторые библиотеки (в частности, jcanvas) используют это свойство в своих функциях.

К счастью, решение проблемы существует в виде плагина к jQuery под названием $.fn.imagesLoaded jQuery plugin.
Пример использования:

$(imagesContainer).imagesLoaded(function(){
        делаем свои дела ;
});

imagesContainer  -  контейнер, в который загружаются картинки.

Вот и всё. Всем удачи.