Expertus metuit
Sergey Stolyarov | 2016-07-16 в 09:20

В unix-системе питоновские пакеты совсем не обязательно нужно ставить в системные каталоги (в /usr/, например). Благодаря virtualenv, пакеты можно установить в любой каталог, инициализировать локально окружение в терминале через специальный скрипт и дальше пользоваться всеми установленными в том каталоге библиотеками и программами. Локальный набор пакетов очень удобен для разработчика, так как позволяет на одной системе переключаться между разными их версиями.

В статье я описываю не только концепт, но и всю процедуру подготовки локального окружения. Сразу же уточнение: всё работает только в терминале, то есть вы запускаете терминал, «активируете» в нём нужный каталог с пакетами и дальше в этом терминале работаете. Базовая операционная система — linux, *bsd или mac os x. Windows я не рассматриваю.

Итак, нам понадобится установленный системно python3. Для линукса он ставится из пакетов вашего репозитория, для макоси — скачивается с офсайта https://www.python.org/downloads/mac-osx/ или через brew. В принципе, можно пользоваться штатной версией из макоси, но она гарантированно не будет последней. Например, в Macos Sonoma 14.5 штатно установлен python3 версии 3.9.6, хотя через brew уже доступна 3.12.3 (июнь 2024 года).

Sergey Stolyarov | 2015-07-30 в 14:43

В современном андроиде версии 4 или выше через кабель невозможно нормально добраться до главного раздела, так как доступ к нему открыт только через глючный и тормозной MTP, а с линуксом ещё хуже — там вообще нет нормальной поддержки MTP.

Многие выкручиваются так: поднимают на девайсе какой-нибудь сервер (обычно FTP), а дальше к нему подключаются через Wi-Fi; затем можно через любой FTP-клиент копировать файлы с девайса и назад. Есть и недостатки: не очень безопасно и часто очень медленно.

Но выход есть и называется он USB-tethering.

Sergey Stolyarov | 2015-01-05 в 11:57

Если запускать Chrome в KDE с выключённым режимом Use system title bar and borders, то кнопки в заголовке окна всегда будут выравнены по правому краю:

Chrome in KDE

Никакими штатными настройками такое поведение изменить невозможно — Chrome при запуске определяет, в каком Desktop Environment он запускается, и если это Metacity/Compiz/Unity, то берёт часть настроек из gconf, в частности — расположение кнопок в заголовке.

Традиционный дисклеймер — все советы ниже годятся для Debian/Ubuntu.

Заставить Chrome «увидеть» себя в другом DE просто, достаточно выставить в переменной окружения XDG_CURRENT_DESKTOP значение Unity. Глобально это не надо делать, лучше всего сделать отдельный sh-скрипт для запуска такого «модифицированного» браузера. Также необходимо установить пакет gconf2, а затем выставить нужный порядок кнопок, например, выполнив такую команду в терминале (это нужно сделать всего один раз):

gconftool-2 --set /apps/metacity/general/button_layout --type string "minimize,maximize,close:"

Получится примерно так:

Chrome in KDE

Естественно, после таких изменений Chrome будет использовать тулкит Gtk для всяких действий типа диалога открывания файла и т.п.

Естественно, есть и проблемы — настройки прокси теперь будут искаться в настройках gnome/unity, поэтому если хотите их конфигурить, ставьте соответствующие пакеты (например, gnome-control-center) или указывайте прокси в аргументах запуска браузера, а также можно пользоваться стандартными переменными окружения типа (http_proxy, auto_proxy, auto_proxy и т.п.)

А вот готовый скрипт:

#!/bin/sh

export XDG_CURRENT_DESKTOP=Unity
google-chrome
Sergey Stolyarov | 2014-08-12 в 16:36

Для второго питона:

python -m SimpleHTTPServer 9090

Для третьего:

python3 -m http.server 9090

Вместо порта 9090 можно указать другой. По умолчанию цепляется ко всем сетевым интерфейсам, но можно указать и конкретный, например:

python3 -m http.server --bind 127.1.2.3 9090
Sergey Stolyarov | 2014-07-14 в 14:15

Чтобы результат селектов в консольном клиенте sqlite3 выглядел по-человечески, нужно в конфиге программы (файл ~/.sqliterc) написать такое:

.headers on
.mode line

При таком конфиге выводе селектов будет примерно таким:

sqlite> select * from track limit 2;
       id = 1
   dir_id = 3
 filename = 01 - хора.mp3
    title = хора
  modtime = 
artist_id = 1
 genre_id = 1
 album_id = 1
    track = 1
   length = 232
     year = 2003

       id = 2
   dir_id = 3
 filename = 02 - айда, недо.mp3
    title = айда, недо
  modtime = 
artist_id = 1
 genre_id = 1
 album_id = 1
    track = 2
   length = 184
     year = 2003
Sergey Stolyarov | 2014-05-11 в 01:33

Задача: монтировать nfs-ресурсы в макоси.

В принципе, в макоси уже встроена поддержка nfs и соответствующие сетевые ресурсы можно монтировать через Finder (⌘K), однако чтобы это работало для обычного юзера, требуется некоторое шаманство на стороне linux-сервера.

И заодно важный момент: я монтирую только на чтение, поскольку если разрешить запись, то макось загадит диск своими служебными файлами.

На линукс-машине в /etc/exports прописываем что-то вроде:

/home/user/downloads 192.168.13.12(ro,sync,no_subtree_check,insecure)

Здесь адрес 192.168.13.12 — это айпишник макосной машины. После чего в Finder стандартным образом (через ⌘K или меню GoConnect to Server...) монтируем ресурс, адрес указываем в виде nfs://nfs-server.name/home/user/downloads.

Опция insecure как раз и нужна, чтобы можно было простым юзером монтировать, без неё будет выдаваться маловразумительная ошибка.

Ещё одна вредная и очень трудноуловимая проблема связана с макосной интерпретаций кодирования «составных» букв в именах файлов, например, «й» или «ё», или «ü». Если имя файла (или вообще где-то в пути до файла встречается) содержит такую букву, то файл просто не откроется, причём с невразумительной ошибкой типа “The application can’t be found.” Я в детали не хочу вдаваться, можете сами погуглить по ключевым словам “mac os x nfc nfd unicode”.

Решение достаточно простое: нужно изменить опции монтирования nfs-ресурсов по умолчанию, для этого добавьте в файл /etc/nfs.conf такую строчку:

nfs.client.mount.options = nfc

Теперь можно монтировать через Finder и всё будет в порядке.

Ну и команда для всяких тестов, вдруг пригодится:

/sbin/mount_nfs -v 192.168.13.12:/home/user/downloads /Volumes/test
Sergey Stolyarov | 2014-02-17 в 15:20

Поразительно, но эта статья всё ещё актуальна в исходном виде в 2024 году.

Изначально я планировал написать небольшую заметку о наиболее часто используемых командах, однако в процессе получилось так много пояснений, что весь старый текст пришлось удалить и написать новый в формате полноценного туториала. Текст рассчитан на новичков, никогда нормально не сталкивавшихся с гитом. Я также старался не углубляться во внутренности работы репозитория или редкие малоиспользуемые в обычной жизни команды.

Структура статьи традиционная: знакомство с git, базовые команды, общепринятые подходы, а в конце справка о терминах и концепциях, список ссылок. Я не хочу углубляться в историю создания git и вообще стараюсь писать кратко, по делу и без воды, без слишком детальных объяснений команд, без копипасты манов или книг, однако при необходимости буду давать ссылки на сайты или книги по теме.

Я буду рассказывать только о классической программе git, работающей из командной строки. Все примеры использования предназначены для UNIX-подобных систем, например, линукса или макоси. Все примеры создания или модификации файлов также рассчитаны на UNIX-подобные системы. Почему именно консольный вариант: в гуёвых программах типа TortoiseGit очень сложно понять концепты, их авторы подразумевают, что вы всё уже знаете, а это не так. Почему линукс и макось: терминал в windows очень некомфортен, работать там больно и мучительно. Если у вас Windows, советую поставить убунту в Virtualbox/VMWare, также в комментариях Искандер упоминает git-bash для windows, но я об этом ничего сказать не могу.

Перед вами именно туториал, то есть в идеале вы должны читать его последовательно с начала и до конца, выполняя примеры из текста. У git обширная собственная терминология и куча общепринятых (в рамках git-экосистемы) названий сущностей; я постараюсь рассказать о самых важных из них, а вы постарайтесь их запомнить, они действительно очень важны и пригодятся, когда вы будете читать документацию или книги. Часть терминов я буду давать в переводе (например, «ветка» для слова «branch»), а часть — в транслитерации, так как адекватного перевода слова нет (например, «дифф» как перевод слова «diff»). Я очень не люблю многословные переводы простых слов и стараюсь по возможности ими не пользоваться, для понимания короткие слова важнее длинных фраз. Поэтому привыкайте к словам типа «коммит» или «репозиторий».

В тексте много примеров, они все согласованы с текстом и рассчитаны на параллельное их исполнение в процессе чтения. То есть дошли до примера, открыли терминал, выполнили указанные в тексте команды, порадовались, дальше читаем.

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

Sergey Stolyarov | 2014-01-23 в 11:10

Инструкции по разворачиванию LXC на Debian-машине. Всё рассчитано на Debian Stable (Debian 12 Bookworm на момент написания статьи) и версию lxc 5.0.x.

LXC (LinuX Containers, http://linuxcontainers.org/) — это система виртуализации на уровне операционной системы, по сути нечто вроде продвинутого chroot. Удобно использовать для разработки и тестирования софта. Здесь рассматривается работа с lxc только средствами пакета lxc, а другие — например, через libvirt — нет.

Устанавливается стандартным образом в debian:

$ sudo apt install lxc

В Ubuntu (да, пакет называется lxc1):

$ sudo apt install lxc1
Sergey Stolyarov | 2014-01-21 в 11:45

Очищаем кеши

Очищаем pagecache:

sync; echo 1 > /proc/sys/vm/drop_caches

Очищаем dentry и inodes:

sync; echo 2 > /proc/sys/vm/drop_caches

Очищаем pagecache, dentry и inodes:

sync; echo 3 > /proc/sys/vm/drop_caches

Эта магия освобождает много памяти. Можно запустить free до и после, чтобы убедиться.

Sergey Stolyarov | 2013-12-16 в 21:37

Как использовать curl для отладки HTTP, то есть для отправки на сервер HTTP-запросов. У меня потребности небольшие, поэтому здесь только конкретно нужные мне команды. Оформлено всё традиционно: описание задачи, решение, описание решения.

Отправить GET-запрос и показать ответ вместе с заголовками

curl -Gi http://google.com

Опция -G указывает использовать HTTP GET, опция -i — включить заголовки в вывод.

© 2006—2024 Sergey Stolyarov | Работает на pyrengine