LINUX.ORG.RU

Сообщения gag

 

Симуляция и визуализация пути прохождения луча (два зеркала, одна линза)

Интересно, можно без копания в уравнениях и познаний в OpenGL (WebGL) за день просимулировать и визуализировать видимый (лазерный) луч, отражающийся от одного зеркала в другое, от которого отражается в линзу, по прохождении которой попадает на поверхность. Важно только задать позиции зеркал и их наклон, а также зависимость изменения угла при прохождении линзы и получить координаты луча на поверхности.

Кое-что нашёл, но не совсем то:

 , , , ,

gag
()

Чтение squashfs с диска медленнее чем из файла на разделе

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

Понадобилось заархивировать (и сжать) 1 ТБ диск (забитый где-то на треть) так, чтобы можно было сохранить простой доступ на чтение. Ничего лучше кроме squashfs не нашёл. Зато как раз вовремя подоспела поддержка zstd в ядре (пришлось разве что самому собрать свежий squashfs-tools). В итоге получилось, и быстрее, и без потери в размере (189 ГБ zstd против 193 ГБ gzip).

Сохранил образ с диска и создал раздел, на который через dd записал squashfs образ. Потом примонтировал и проверил на целостность: md5sum -b /mnt/sqfs/raw.hdd.img. Диск этот - внешний 2,5" USB2, так что максимум чтение 30 МБ/с (зато вне зависимости начало диска или конец). Получилось где-то 260 минут.

На всякий случай, решил сделать ext4 раздел минимального подходящего размера с -m 0 -T largefile4 и просто переписать образ в виде файла. Примонтировал, запустил проверку. Закончилась через... 160 минут. Не ожидал.

Выходит, или я что-то упустил, или мне выгоднее оставить тот ext4 раздел с единственным файлом-образом (разве что каждый раз при автомонтировании появляется предупреждение, что на нём осталось слишком мало места)?

 , , , ,

gag
()

Сжатый образ диска: создание и монтирование on-the-fly

Кроме squashfs есть что-то лучше?

Здесь предлагается ещё nbdkit.

 , , , ,

gag
()

бинарный diff: быстрая визуализация в консоли

Есть большие файлы, так что каждый раз начинать сравнение с нуля нерационально. С помощью rdiff сделал delta-файл. Как бы теперь увидеть изменения в человеко-читаемом виде?

Есть другие варианты?

P.S. xdelta3 3.0.11 с -B536870912 (512 MB) вылетает из-за нехватки памяти. Да и есть ли что-то для визуализации vcdiff?

 binary diff, , , vbindiff,

gag
()

Доступ к трекам с SACD ISO

Существует простой способ для доступа к аудио-трекам с SACD ISO, чтобы можно было прослушивать в более менее любом плеере?

Мне известно только принудительное использование форка mpd от Максима Анисюткина в качестве плеера.

 , , , ,

gag
()

Публичные почтовые сервера с поддержкой IMAP BINARY, COMPRESS, NOTIFY, THREAD

В условиях необходимости экономить трафик, и чтобы избежать создания по отдельному подключению на каждый ящик на сервере (ограничение IDLE), нужно чтобы сервер поддерживал как минимум IMAP расширения BINARY, COMPRESS, NOTIFY. Вроде как dovecot такое умеет, даже больше. (Есть ещё какие-то интересные расширения для описанных целей? Что-то для поиска на стороне сервера точно нужно). И ещё нужен THREAD.

Но такие старые и заслуженные сервера как mail.ru и yandex.ru изобретают велосипед (зачем?) и поддерживают разве что IDLE и BINARY (только yandex, да и то иногда неработающий). Остаётся разве что поднимать у себя dovecot, синхронизировать почту в обе стороны и устанавливать связь уже со своим сервером. Или есть всё же европейские публичные сервера с необходимыми расширениями?

Ещё есть проблема с отправкой писем: одно и тоже сначала отправляется по SMTP, а потом копируется по IMAP в Sent. Как можно это побороть?

 , , , ,

gag
()

Включить USB HDD после логического remove

Подключение:

usb 2-1.2: new high-speed USB device number 4 using ehci-pci
...
usb-storage 2-1.2:1.0: USB Mass Storage device detected
scsi host9: usb-storage 2-1.2:1.0

После umount с помощью udisksctl power-off можно обесточить подключённый USB HDD:

udisksd[5178]: Powered off /dev/sde - successfully wrote to sysfs path /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/remove
После этого ссылка /dev/bus/usb/002/004 на него удаляется. Но как теперь без отсоединения/присоединения кабеля снова включить диск?

11 лет назад пришло счастье Manual driver binding and unbinding: отпала необходимость в rmmod всего драйвера из-за одного устройства. Но с USB этого не достаточно: одно устройство - это целый hub. Т.е.

echo -n "0000:00:1d.0" > /sys/bus/pci/drivers/ehci-pci/unbind
echo -n "0000:00:1d.0" > /sys/bus/pci/drivers/ehci-pci/bind
приводит к отсоединению/подсоединению всех остальных USB устройств, висящих на той же шине. Вроде не так страшно, пока одним из них не оказывается ещё один переносной диск/флешка.

Так как же вернуть мой 0000:00:1d.0/usb2/2-1/2-1.2 снова в рабочее состояние? Какой-нибудь rescan usb хаба?

 , , , ,

gag
()

GPL на реализацию общеизвестных алгоритмов и прочего общественного достояния

Zmicier предложил привести пример заимствования кода одним открытым проектом из другого открытого проекта, причём в одном из них код GPLнут. Вот сейчас наткнулся на эпический пример надевания GPL на crc32, crc32c (VirtualBox) <-> crc32c.c (NetBSD), crc64, реализация которых, мне кажется, достойна ни то что BSD, а является уже общественным достоянием (public domain). Там у виртуалбокса и дальше идёт подобный код в common: https://www.virtualbox.org/svn/vbox/trunk/src/VBox/Runtime/common/ Вот нужно было называть не public domain, а common code in public domain. Тогда было бы ещё очевидней.

Хотя бы в crc32.c Оракл признаётся, что код основан на:

 * This code is based on:
 *
 *  CRC32 code derived from work by Gary S. Brown.
 *
 *  COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
 *  code or tables extracted from it, as desired without restriction.
Но зачем на оригинальное «без ограничений» было накладывать лицензию, отличающуюся от public domain / unlicense?

Ещё пример: вы ищете в вашем коде расширение файла, но ваш код не GPL? Тогда Оракл придёт к вам:

/* $Id$ */
/** @file
 * IPRT - RTPathExt
 */

/*
 * Copyright (C) 2006-2016 Oracle Corporation
 *
 * This file is part of VirtualBox Open Source Edition (OSE), as
 * available from http://www.virtualbox.org. This file is free software;
 * you can redistribute it and/or modify it under the terms of the GNU
 * General Public License (GPL) as published by the Free Software
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 *
 * The contents of this file may alternatively be used under the terms
 * of the Common Development and Distribution License Version 1.0
 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
 * VirtualBox OSE distribution, in which case the provisions of the
 * CDDL are applicable instead of those of the GPL.
 *
 * You may elect to license modified versions of this file under the
 * terms and conditions of either the GPL or the CDDL or both.
 */


/*********************************************************************************************************************************
*   Header Files                                                                                                                 *
*********************************************************************************************************************************/
#include "internal/iprt.h"
#include <iprt/path.h>


RTDECL(char *) RTPathSuffix(const char *pszPath)
{
    const char *psz = pszPath;
    const char *pszExt = NULL;

    for (;; psz++)
    {
        switch (*psz)
        {
            /* handle separators. */
#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
            case ':':
                pszExt = NULL;
                break;

            case '\\':
#endif
            case '/':
                pszExt = NULL;
                break;
            case '.':
                pszExt = psz;
                break;

            /* the end */
            case '\0':
                if (pszExt && pszExt != pszPath && pszExt[1])
                    return (char *)(void *)pszExt;
                return NULL;
        }
    }

    /* not reached */
}
Абсурдно, нет? Там есть и однострочники (но с длинной GPL, по крайней мере по сравнению с длиной «кода»).

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

Перемещено tailgunner из development

 , fair use, , , unlicense

gag
()

Перемонтировать из ro в rw после ошибки без перезапуска

Домашняя удалённая система на 4GB флешке, бывает, сбоит:

[Thu Oct 27 12:01:59 2016] sd 10:0:0:0: [sdg] tag#0 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[Thu Oct 27 12:01:59 2016] sd 10:0:0:0: [sdg] tag#0 Sense Key : Medium Error [current] 
[Thu Oct 27 12:01:59 2016] sd 10:0:0:0: [sdg] tag#0 Add. Sense: Unrecovered read error
[Thu Oct 27 12:01:59 2016] sd 10:0:0:0: [sdg] tag#0 CDB: Read(10) 28 00 00 4b 70 58 00 00 08 00
[Thu Oct 27 12:01:59 2016] blk_update_request: critical medium error, dev sdg, sector 4943960
[Thu Oct 27 12:01:59 2016] Buffer I/O error on dev sdg2, logical block 524299, async page read

Иногда после такой ошибки / (/dev/sdg2) переходит в ro. Как бы его оттуда вытащить без перезагрузки?

Бесконечный цикл:

# mount -o remount,rw /dev/sdg2
mount: cannot remount /dev/sdg2 read-write, is write-protected

# dmesg -T | tail -n1
[Thu Oct 27 12:35:52 2016] EXT4-fs error (device sdg2): ext4_remount:4707: Abort forced by user

# blockdev -v --getro /dev/sdg2
get read-only: 0

# blockdev -v --setrw /dev/sdg2
set read-write succeeded.

# fsck /dev/sdg2
fsck from util-linux 2.28.2
e2fsck 1.43.3 (04-Sep-2016)
debianroothome contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (122865, counted=122944).
Fix<y>? yes
Free inodes count wrong (70515, counted=70521).
Fix<y>? yes

debianroothome: ***** FILE SYSTEM WAS MODIFIED *****
debianroothome: ***** REBOOT SYSTEM *****
debianroothome: 150663/221184 files (0.4% non-contiguous), 760768/883712 blocks

# fsck -f /dev/sdg2
fsck from util-linux 2.28.2
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
debianroothome: 150663/221184 files (0.4% non-contiguous), 760768/883712 blocks

Перезапуск удалённо не имеет смысла: обнаруживается, что ФС с ошибками, которые нужно фиксить вручную, что совсем некстати. Когда потом из initrd запускаю fsck, всё фиксится и грузится дальше. Но в чём разница? В флешке что-то ресетится при перезапуске?

На флешку было записано не так уж много:

# tune2fs -l /dev/sdg2 | grep -e created -e writes
Filesystem created:       Fri Aug  5 22:55:45 2016
Lifetime writes:          29 GB
И 3-х месяцев ещё не прошло.

Кстати, на простых флешках есть wear leveling? Иначе его отсутствие могло бы быть объяснением чрезмерно быстрого износа одних и тех же секторов, хотя общее кол-во записанного совсем небольшое.

 , , , wear leveling

gag
()

Обновить пустые поля Name в закладках

Иногда при создании закладок для вкладок, которые не открывались после восстановления предыдущей сессии, у них пустует поле Name. Вместо заглавия страниц виден только адрес, что мешает поиску. Насколько я понял, это может произойти, если создавать закладки после того, как пришлось восстанавливать предыдущую сессию после падения firefox. У меня много вкладок, и нередко firefox не в состоянии нормально завершится: спокойно ждёшь, а он всё равно в segfault.

Как бы автоматизировать процесс нахождения закладок с пустующим заголовком, и установкой его в титул соответствующей страницы (включая обновление favicon)?

 , , , , session restore

gag
()

transmission: заметное падение кол-ва коннектов после автосмены IP-адреса провайдером

Каждые 24 часа происходит автоматическая смена IP-адерса провайдером. И up-трафик заметно падает. После рестарта демона всё приходит в норму.

Давно откладывал этот вопрос, так как кажется, что такого не может быть. Ведь поменялся адрес - ну отвалились пиры. А после очередного анонса о смене адреса можно уже забыть. Но факт.

 , , , ,

gag
()

hdd raw read error, а номера LBA не видно

Ещё 2,5 года не прошло, а в смарте одного из моих wd red обнаружил одну raw read error. Пошёл смотреть на каком именно LBA он споткнулся, но... не нашёл. Странно, винт ведь более дорогой (типа для домашнего NAS), а играет со мной в прятки. Может, есть какой-то способ быстро получить этот номер? Пока я запустил long test. Но это же часов 7. И винчестер ведь точно знает, какой блок он не прочитал.

 , , raw read error, , wd red

gag
()

Был не минор, а стал минором.

В норме: Выход Debian 8.1 (08.06.2015), Выпуск Debian 8.2 (06.09.2015), Debian 8.3 (23.01.2016). А эта новость вдруг стала «минорным релизом»: Debian 8.4 (02.04.2016). Ведь не каждую неделю, а раз в три месяца выходят. Так почему вдруг? Ведь теперь получается, что Debian 8.4 согласно ЛОРу и не выходил (т.к. есть новости только про 8.1, 8.2 и 8.3).

 , minor release,

gag
()

Регистрация hostname на виндовс-сервере

Есть линукс хост. Самостоятельный. Есть и виндовс-акканут. Пароли разные. После поднятия самбы на хосте другие видят имя хоста. Но как самбе удаётся зарегистрировать имя хоста на виндвовом сервере (без пароля)?

Необходимо это повторить (на Си, к примеру).

Настроить dnsmasq для DHCP & hostname было просто. В винде же это, вроде, разные вещи. С DHCP всё просто. А вот с запросом имени не так. Т.е. если его запрашивать по в dhcp request'е винда это игнорирует. А самба использует NBNS?

 , , , ,

gag
()

Удалить бинарники, перезаписать историю. git-магия?

Вроде, этого должно быть достаточно:

git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch *.o' --prune-empty --tag-name-filter cat -- --all
git reflog expire --expire=now --all
git gc --prune=now
Но на практике приходится делать так:
git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch *.o' --prune-empty --tag-name-filter cat -- --all
git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch *.o' --prune-empty --tag-name-filter cat -- --all
git reflog expire --expire=now --all
git gc --prune=now
# кол-во объектов стало меньше
git reflog expire --expire=now --all
git gc --prune=now
# кол-во объектов стало ещё меньше
После этого кол-во найденных объектов больше не снижается. Но магии не должно быть, так что здесь что-то не то.

 , ,

gag
()

Так за кем же значится блок, помеченный как «используется»

Последующие действия проводятся на исправной ext4.

В debugfs можно протестировать блок на используемость и принадлежность:

debugfs:  testb 11465694
Block 11465694 marked in use
debugfs:  icheck 11465694
Block	Inode number
11465694	1308606
debugfs:  ncheck 1308606
Inode	Pathname
1308606	/path/to/filename
Если блок не используется:
debugfs:  testb 11465707
Block 11465707 not in use
debugfs:  icheck 11465707
Block	Inode number
11465707	<block not found>
Кстати, что означает не используется? В нём не лежат метаданные и в данный момент он не является частью какого-либо файла? Или что-то ещё?

А как понимать вот это:

debugfs:  testb 5242939
Block 5242939 marked in use
debugfs:  icheck 5242939
Block	Inode number
5242939	<block not found>

Это как раз смахивает на мой вопрос: если блок используется, но в нём находятся метаданные, как узнать, какие именно? Только brute-force по всем метаданным?

 , , ,

gag
()

Вытащить kernel symbols из zImage

Андроидная прошивка от Самсунга, tar.md5, это обычный tar с прикреплённым md5. Извлёк из него boot.img. Потом с abootimg -x boot.img получил zImage. Дальше можно и его в Image распаковать. А дальше? Попадался кому скриптик, который найдёт и распакует прикреплённые (надеюсь) во время сборки ядра сжатые скриптиком scripts/kallsyms.c ядерные символы?

 , ,

gag
()

О лицензиях и авторстве кода

Поднасобиралось тут вопросов. Итак:

  1. Вы пишете патч, его используют, но автор, получается, не вы. Обидно? Например, в [1] опубликован патч, в ответ - тишина. Спустя почти 4 месяца без спасибо - баг исправлен. В [2] видно, что автор - главный программер проекта (который при этом ещё и один из самых первых и известных разработчиков ядра). А предложенное улучшение вообще проигнорировано.
  2. Есть диагонально противоположный случай. Например, если вы хотите комитнуть в какой-нибудь проект гугла, то необходимо «подписать» с ними соглашение. Т.е. даже если вы хотите исправить опечатку, гугл признаёт и заботится о вашем праве на авторство, но и хочет обезопасить себя. Есть и другие проекты, которые требуют подобного. А теперь представьте, вы находите проблему с безопасностью в одном из таких проектов, пишете патч и... устанавливаете на него лицензию, которая свободная, но конфликтует с каким-нибудь пунктом лицензии проекта, и этот патч не имеют право принять. Но! Этот патч исправляет очень острую проблему, которую нельзя вот так теперь оставить. С другой стороны, вы являетесь автором, и никто не имеет права взять ваш кусочек кода и сказать, что это «тривиальный» фикс (хотя его обнаружить было далеко не тривиально), и мы имеем право и так его закомитить.
  3. А есть и вариант между ними. Вы написали патч, но один к одному его не могут принять. Помимо варианта, когда вас будут доставать до тех пор, пока вы сами его не приведёте в идеальный вид, и его можно будет закомитить (но только когда никому не особо важно быстрее получить эти изменения), есть два других варианта. Первый: комитер берёт и сам меняет патч, ставит себя в авторы, а вас где-то в комит-комментарии, что, мол, основано на таком-то патче. Вариант второй: создаётся ветка, ваш патч комитится, а потом второй патч облагораживает его, ветку «атомарно» сливают куда надо (т.е. ваш «сырой» патч ничего не может испортить). В итоге - вы автор оригинально патча, а комитер - автор изменений. Всё ясно и понятно. Есть какие-то оправдания первого варианта? И как агитировать на применение исключительно второго варианта?
  4. Частенько в открытых проектах можно видеть образцы кода, примеры, которые тем не менее защищены GPL/LGPL,.. Эммм... Какая тут логика? Ведь это код, который будет в любом проекте, который будет использовать данную библиотеку. Одно дело защищать код библиотеки, но что за бред защищать такой код? И действительно вообще в данном случае лицензионное ограничение?
  5. Бывает, встречаю статьи о том, как сделать что-то нехитрое, использовать какую-то либу. И... автор указывает, что его примеры лизензируются под GPL. Ну, 100%, что точно такой же код существует в куче проектов, использующих эти либы. И лицензии там 100% самые разные. Кто прав? И если авторы подобных статей не правы, кого вообще в подобных случаях оповещать о нарушении? Вот если кто-то нарушает GPL, то куда писать все знают. А если кто-то не в праве в конкретном случае использовать GPL, то тогда куда?
  6. Патентование алгоритмов - это зло. А что если GPL наложена на код, который можно назвать вариантом псевдокода алгоритма, который совпадает с C? [3] Мне кажется, что такая практика - это тоже зло. И, похоже, со мной согласны: вот, например, проект [4] использовал одну из «GPL»-функций. А у проекта лицензия BSD [5]. Упс.

Ух, пока всё. Внимание, ПРОСЬБА: конструктивные ответы и критика по пунктам. Особенно интересен опыт пишущих патчи и использующих чужой код в реальных (внутрефирменных тоже) проектах.

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=646629

[2] https://git.kernel.org/cgit/fs/ext2/e2fsprogs.git/commit/?id=4a4a44d7b14be190...

[3] http://www.strudel.org.uk/itoa/

[4] https://github.com/OculusVR/RakNet/blob/master/Source/Itoa.cpp

[5] https://github.com/OculusVR/RakNet/blob/master/LICENSE

 , , , ,

gag
()

Измениить таймер ухода винта в слип

Достал внешний usb-винт toshiba, в котором сидит 2-терабайтный винт от них же. Раньше такого ещё не наблюдал: отправил винт в длинный смарт тест, и через минуты 3 он пошёл спасть! hdparm -S не лечит. В логе: тест прерван хостом. Пришлось читать регулярно рандомный сектор, но хотелось бы решить это культурно.

 , , , ,

gag
()

4k 3D телевизор как монитор

Кто-нибудь пользуется?

Интересно следующее:

  • при подключении через HDMI < 2.0 будет, разумеется, более зернистая, но по-прежнему чёткая картинка?
  • HDMI vs DisplayPort: YCbCr 4:4:4 == RGB? Только ошибки округления или ещё что-то?
  • input lag из-за HDMI? Если через DisplayPort его не будет? Где-то 2 кадра / 34 мс уходит на конвертацию цвета или на что?!
  • 3D: mpv / vlc умеют вывести на 4k TV 3D из встречающихся в сети видео? При разрешении 3840x2160 можно получить FullHD 3D (а не только половину вертикального разрешения)?
  • Как насчёт мерцания при невысокой яркости и шрифтов?
  • Panasonic ещё год назад гордилась, что они единственные встраивают DisplayPort, но в этом году, вдруг, его больше нет. Что произошло? Они как и все тоже были уверены, что AMD и intel вот-вот выпустят (интегрированные) карточки с HDMI 2.0?

 , , , ,

gag
()

RSS подписка на новые темы