Страницы

Поиск по вопросам

пятница, 5 июля 2019 г.

Ошибка при копировании больших объемов данных (Ubuntu)

Возникла такая проблема, копирую файлы с винды по локальной сети, около 1 млн файлов весом в 200Гб (простым способом, наутилусом). После того как скопировалось 411242 файлов 26,6Гб (это последняя попытка) система зависает, и выдает какие-то кракозябры на черном экране, среди которых можно найти sdb1 - это сам винт (4Тб HDD). Смонтирован он в /mnt/sdb1/, фс ext4. Почем так происходит? Ведь если копировать понемногу то все работает нормально.
ЛОГИ dsmeg и syslog: http://rghost.ru/6Mqrjp4PN


Ответ

возможно, в файловой системе закончились inode. посмотреть ситуацию по ним можно для всех примонтированных файловых систем командой df -i. пример вывода (в пятом столбце — процент использованных inode):
$ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/dm-0 920272 207134 713138 23% / udev 497545 440 497105 1% /dev tmpfs 499982 769 499213 1% /run tmpfs 499982 3 499979 1% /dev/shm tmpfs 499982 7 499975 1% /run/lock tmpfs 499982 14 499968 1% /sys/fs/cgroup /dev/sda1 124496 335 124161 1% /boot tmpfs 499982 9 499973 1% /run/user/1000
для конкретной файловой системы можно указать точку монтирования (у автора — /mnt/sdb1):
$ df -i /mnt/sdb1
или, даже если файловая система не примонтирована, с помощью команды sudo tune2fs -l /dev/sdb1 | grep -i inode. пример вывода:
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Inode count: 920272 Free inodes: 713166 Inodes per group: 8144 Inode blocks per group: 509 First inode: 11 Inode size: 256 Journal inode: 8 First orphan inode: 1863 Journal backup: inode blocks
обратить следует внимание на inode count и free inodes
к сожалению, после создания файловой системы ext* уже невозможно изменить количество inode в ней. надо пересоздавать файловую систему (предварительно сохранив куда-нибудь всё её содержимое), указав, например, другой тип использования файловой системы.
задать тип можно параметром -T usage-type программы mkfs.ext4
список типов можно посмотреть в /etc/mke2fs.conf
очень большое количество inode будет создано, например, для типа news (чем меньше inode_ratio, тем больше inode будет создано, а файловая система будет разбита на большее количество «кусочков» меньшего размера).
а можно, не указывая тип использования, передать программе mkfs.ext4 непосредственно желаемый inode_ratio с помощью параметра -i
например, так:
$ sudo mkfs.ext4 -i 4096 /dev/sdb1
предупреждение: только не увлекайтесь уменьшением inode_ratio: каждый inode «отбирает» несколько байт (задаётся с помощью inode_size, который лучше самому не изменять) «полезной ёмкости» для «служебной» информации.

Как добавлять файлы в Git по их номеру в отчете `git status`?

Я часто сталкиваюсь со следующей ситуацией:
modified: assembly/main.debug.s modified: ../src/cd/Config.java modified: ../src/cd/memoization/cfg/SubgraphFinder.java modified: ../src/cd/memoization/cfg/SubgraphMap.java modified: ../src/cd/profiler/Profile.java modified: ../test/cd/test/TestSamplePrograms.java modified: ../../notes/20150521.txt
Файлов очень много и у них сложные пути. Их неудобно добавлять из консоли, приходится вручную прописывать сложный путь. Я хотел бы добавлять их по номерам:
git magic-status
1 modified: assembly/main.debug.s 2 modified: ../src/cd/Config.java 3 modified: ../src/cd/memoization/cfg/SubgraphFinder.java 4 modified: ../src/cd/memoization/cfg/SubgraphMap.java 5 modified: ../src/cd/profiler/Profile.java 6 modified: ../test/cd/test/TestSamplePrograms.java 7 modified: ../../notes/20150521.txt
git magic-commit 2,3,5 -m "Простой и удобный способ"
Как можно это сделать?
Для пометки связанных вопросов на разных языках: https://stackoverflow.com/questions/30411901/how-to-add-specific-files-in-git-by-their-number-in-git-status
Это перевод собственного ответа с EN.SO


Ответ

Демонстрационный репозиторий:
Для примеров я использую репозиторий с четырьмя файлами: a, b, c, d. Из них a - отслеживается, изменен, добавлен (tracked, changed and staged); b отслеживается, изменен, но не добавлен (tracked, changed and not staged); c не отслеживается, но добавлен; d просто ещё не отслеживается.

1. Отдельная утилита: git-number
При запуске без аргументов, git number выполняет обычный git status, добавляя уникальный номер каждой выводимой строке с именем файла. Он "запоминает" соответствие номера файлу.
При запуске с аргументами:
$ git number <любая команда git> [одно или несколько чисел, и/или --аргументов]
git number запускает эту <любую команду>, заменяя все числа соответствующими именами файлов. Нечисловые аргументы передаются в git без изменений.

Пример с командой diff :

2. Отдельная утилита: SCM Breeze
SCM Breeze - это набор shell-скриптов для bash и zsh. Он дает новые возможности работы с Git. Он интегрируется в вашу командную оболочку и добавляет упоминание файла по номеру, индекс репозитория с автодополнением по Tab и многие другие функции.
SCM Breeze использует горячие клавиши и псевдонимы (aliases) команд:
Ctrl + x, c => git_add_and_commit - добавить выбранные файлы и сделать коммит всех добавленных изменений.
Ctrl + x, Space => git_commit_all - сделать коммит всех имеющихся изменений.
git add
$ ga 1
git diff
$ gd 2
git reset
$ grs 3
git commit
$ gco 4
3. "Родными" средствами: git add -i
git add -i
Из Git reference
-i --interactive Добавить содержимое рабочей папки в индекс в интерактивном режиме...
Этот режим можно запомнить как -iнтуитивный, поскольку он невероятно понятен и удобен (по крайней мере, для бывалого пользователя Vim). Если не можете выйти из режима добавления, нажмите Return с пустой строкой.
Входим в интерактивный режим:
Добавляем измененный отслеживаемый файл:
Добавляем неотслеживаемый файл:
Смотрим на результат:
Если вам интересно, что это за консоль/цвета/оформление: iTerm2 + zsh + oh-my-zsh

Apple сделала reject приложению

Ребята, у меня в принципе простое приложение. Которое должно проигрывать музыку посредством AVPlayer'a. Вроде все хорошо, сделал чтобы она играла и тогда когда приложение идет в background.
Но я все сделал так как Apple говорит Здесь
И так:
First, declare your application provides specific background services and must be allowed to continue running while in the background. To do this, add the UIBackgroundModes key in your app's Info.plist file. Its value is an array that contains one or more strings that identify which background tasks your application supports. Specify the string value audio to indicate the application plays audible content to the user while in the background:
Плюс так:
Listing 1 Setting the audio category to allow playback when the screen locks or when the Ring/Silent switch is set to silent.
#import #import
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *setCategoryError = nil; BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; if (!success) { /* handle the error condition */ }
NSError *activationError = nil; success = [audioSession setActive:YES error:&activationError]; if (!success) { /* handle the error condition */ }
Но сегодня пришел реджект со словами:
June 17, 2015 at 6:12 AM От: Apple 2.16 - Multitasking Apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc. 2.16 Details Your app declares support for audio in the UIBackgroundModes key in your Info.plist, but we were unable to play any audible content when the application was running in the background. Next Steps The audio key is intended for use by applications that provide audible content to the user while in the background, such as music player or streaming audio applications. Please revise your app to provide audible content to the user while the app is in the background or remove the "audio" setting from the UIBackgroundModes key. Resources If you have difficulty reproducing a reported issue, please try testing the workflow described in Technical Q&A QA1764: How to reproduce bugs reported against App Store submissions. If you have code-level questions after utilizing the above resources, you may wish to consult with Apple Developer Technical Support. When the DTS engineer follows up with you, please be ready to provide: - complete details of your rejection issue(s) - screenshots - steps to reproduce the issue(s) - symbolicated crash logs - if your issue results in a crash log
Подскажите что не так делаю, запутался если честно((
Заранее спасибо!


Ответ

В принципе все так как советовал товарищ Sega-Zero
в коде исправил мелкие недочеты написал развернутое сообщение интервьюеру, от том как правильно запустить и зачем, а главное когда нужно воспроизведения музыки в фоне
После чего получил одобрение в apple store

Возникновение сигнала SIGPIPE (ошибка EPIPE) при обращении из браузера Android устройства

Написал демон на С++ (Линукс). Он слушает запросы от устройства на Android.
Причем сделал универсально: в браузере на Android в адресной строке указывается IP-адрес/сайт (на котором слушает демон), и сам демон посылает в ответ файл, который сохраняется в браузере.
Использую неблокирующие сокеты, TCP и т.д.
Спустя некоторое время после начала отправки файла приходит ошибка EPIPE (errno = 32 - Broken pipe). После этой ошибки я закрываю сокет.
Не знаю как будет работать на других Android телефонах, но мой делает повторный запрос и скачивает файл со второго раза без ошибки EPIPE. Боюсь, что на других телефонах файл просто не скачается.
Если я проделываю то же самое со своего компьютера, то никаких ошибок EPIPE не возникает.
Хотелось бы разобраться почему так происходит.


Ответ

Разобрался... Потратил кучу времени, чтобы выяснить - просто так на моём китайском телефоне (хотя вроде хуавей хвалят) работает браузер...
в нете попадается информация, что стандартный загрузчик на Андроиде (особенно ниже 3.х) с ошибками скачивает файлы, и предлагается установить альтернативный браузер со встроенным менеджером загрузок, может Вам тоже этот подход попробовать? – margosh

Переполнение буфера при помощи “jmp esp” в gnu/linux

Я пытаюсь написать программу для переполнения буфера в ОС gnu/linux
В одной статье, посвящённой этой проблеме, нашла следующий способ:
[мусор]+[адрес инструкции jmp/call esp]+[шеллкод]
Дизассемблирование уязвимой программы не помогает.
Каким образом можно найти адрес инструкции jmp %esp в gnu/linux?


Ответ

по вот этой инструкции собрал бинарник на 32-битной системе (на 64-битной ошибка: Error: operand type mismatch for 'jmp', см. обновление ниже).
текст программы:
$ cat vuln.c #include #include
// hard coded jmp *esp function ;-) void jmpesp() { __asm__("jmp *%esp"); }
int main(int argc, char *argv[]) { char buffer[100]; strcpy(buffer, argv[1]); printf("buffer: [%s].
", buffer); return 0; }
сборка бинарника vuln
$ gcc vuln.c -o vuln -ggdb -fno-stack-protector -z execstack
а вот она, инструкция:
$ objdump -d vuln | grep 'ff e4' 804844f: ff e4 jmp *%esp

обновление
на 64-битной системе, видимо, вместо esp следует использовать rsp
__asm__("jmp *%rsp");
тогда сборка проходит удачно. и инструкция присутствует:
$ objdump -d vuln | grep 'ff e4' 40054a: ff e4 jmpq *%rsp

Адресация по объектам BeautifulSoup

Пищу парсер на Python 2.7, используя BeautifulSoup 4. Возникла трудность.
Извлек я все элементы со страницы.
for p in allPosts: postIMG = p.find_all('img')
В итоге получилось:
Название Название 2
Как обратится к тексту? Можно как-то через точку? postIMG.alt ? Или как лучше? Как красивее всего извлечь урл картинки?


Ответ

find_all возвращает список объектов класса bs4.element.Tag и к аттрибутам элемента можно обратиться через словарь attrs
for p in allPosts: postIMG = p.find_all('img') print postIMG[0].attrs['alt'] print postIMG[0].attrs['src']
Если картинка в посте одна, то удобнее использовать метод find, вместо find_all
for p in allPosts: postIMG = p.find('img') print postIMG.attrs['alt'] print postIMG.attrs['src']

Алгоритм попадания точки в кривую

Есть класс для отрисовки кривой:
class Curve { // Набор точек. public List Points {get; set;}
// Толщина кривой. public int Thinkness {get; set;}
public void Draw(Graphics g) { using (var pen = new Pen(Color.Black, Thinkness)) { g.DrawCurve(pen, Points); } } }
Отрисовка выполняется методом Graphics.DrawCurve. Нужно добавить метод, который будет определять, принадлежит ли произвольная точка этой кривой:
public bool Contains(Point pt);
Кто-нибудь может подсказать алгоритм, с помощью которого можно решить данную задачу? Может быть, каким-то образом можно использовать Matrix или сам Graphics?


Ответ

Придумал следующее решение. В методе Draw рисуем не закругление (DrawCurve), а Path (DrawPath). Способ получения Path и пера выносим в отдельные методы. После этого используем метод IsOutlineVisible для получения информации о вхождении точки в Path.
class Curve { // Набор точек. public List Points {get; set;}
// Толщина кривой. public int Thinkness {get; set;}
private GraphicsPath GetPath() { var path = new GraphicsPath(); path.AddCurve(Points.ToArray()); return path; }
private Pen GetPen() { return new Pen(Color.Black, Thinkness); }
public void Draw(Graphics g) { using (var pen = GetPen()) using (var path = GetPath()) { g.DrawPath(pen, path); } }
public bool Contains(Point p) { using (var pen = GetPen()) using (var path = GetPath()) { return path.IsOutlineVisible(p, pen); } } }