Отладка в XCode как корень

Критика других ответов здесь:

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

Например, текущий верхний ответ заканчивается:

[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74]]

Я просто ненавижу этот ворчать в конце!

Другие, такие как list(grouper(3, xrange(7))) и chunk(xrange(7), 3), оба возвращают : [(0, 1, 2), (3, 4, 5), (6, None, None)]. None просто набивают, и, на мой взгляд, довольно неэлегантно. Они НЕ равномерно разбивают фрагменты.

Почему мы не можем разделить их лучше?

Мое решение (я)

Вот сбалансированное решение, адаптированное из функции, которую я использовал в производстве (Примечание в Python 3 для замените xrange на range):

def baskets_from(items, maxbaskets=25):
    baskets = [[] for _ in xrange(maxbaskets)] # in Python 3 use range
    for i, item in enumerate(items):
        baskets[i % maxbaskets].append(item)
    return filter(None, baskets) 

И я создал генератор, который сделает то же самое, если вы поместите его в список:

def iter_baskets_from(items, maxbaskets=3):
    '''generates evenly balanced baskets from indexable iterable'''
    item_count = len(items)
    baskets = min(item_count, maxbaskets)
    for x_i in xrange(baskets):
        yield [items[y_i] for y_i in xrange(x_i, item_count, baskets)]

И, наконец, так как я видим, что все вышеперечисленные функции возвращают элементы в непрерывном порядке (как они были заданы):

def iter_baskets_contiguous(items, maxbaskets=3, item_count=None):
    '''
    generates balanced baskets from iterable, contiguous contents
    provide item_count if providing a iterator that doesn't support len()
    '''
    item_count = item_count or len(items)
    baskets = min(item_count, maxbaskets)
    items = iter(items)
    floor = item_count // baskets 
    ceiling = floor + 1
    stepdown = item_count % baskets
    for x_i in xrange(baskets):
        length = ceiling if x_i < stepdown else floor
        yield [items.next() for _ in xrange(length)]

Выходные данные

Чтобы проверить их:

print(baskets_from(xrange(6), 8))
print(list(iter_baskets_from(xrange(6), 8)))
print(list(iter_baskets_contiguous(xrange(6), 8)))
print(baskets_from(xrange(22), 8))
print(list(iter_baskets_from(xrange(22), 8)))
print(list(iter_baskets_contiguous(xrange(22), 8)))
print(baskets_from('ABCDEFG', 3))
print(list(iter_baskets_from('ABCDEFG', 3)))
print(list(iter_baskets_contiguous('ABCDEFG', 3)))
print(baskets_from(xrange(26), 5))
print(list(iter_baskets_from(xrange(26), 5)))
print(list(iter_baskets_contiguous(xrange(26), 5)))

Что распечатывает:

[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19], [20, 21]]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'B', 'C'], ['D', 'E'], ['F', 'G']]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]

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

26
задан Anton 23 June 2009 в 14:46
поделиться

3 ответа

Обновление : для Xcode 4.5 и более поздних версий см. этот ответ .


Единственный известный мне способ сделать то, что вы просите - запускать Xcode от имени пользователя root.

>> sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode

Если вы работаете с правами root, все процессы, запущенные из Xcode, также будут выполняться от имени root. Однако обратите внимание, что если вы создаете или редактируете какие-либо файлы, они будут принадлежать пользователю root, а это означает, что вам придется chown их, прежде чем вы сможете редактировать их сначала как обычный пользователь.

Мне бы хотелось, чтобы Xcode говорил «Запустить процесс от имени пользователя root», но, насколько мне известно, такой возможности нет.

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

>> sudo gdb /path/to/my/application

Затем вы можете оставить Xcode открытым, модифицировать по желанию и отлаживать свою программу в gdb. Я обычно этим и занимаюсь

РЕДАКТИРОВАТЬ : Читатели из будущего: см. Ответ Александра Ставонина; он говорит о том, как это сделать. Если у вас все в порядке с ключами ssh и включением пользователя root в вашей системе, его ответ - лучший вариант.

24
ответ дан 28 November 2019 в 06:40
поделиться

Отладка с правами root через SSH.

Редактировать активный исполняемый файл -> Отладка -> Отладка исполняемого файла удаленно через SSH.

0
ответ дан 28 November 2019 в 06:40
поделиться

Xcode может запускать приложение отладки как root. Для этого необходимо выполнить следующие шаги:

  1. Включите пользователя root для локальной машины.

    a. Запустите «Утилиту каталогов» (/ System / Library / CoreServices / Directory Utility.app)

    b. Выберите «Включить корневого пользователя» в меню «Правка» и введите пароль root.

  2. Разрешить удаленный вход.

    a. В Системных настройках… -> Общий доступ, отметьте Удаленный вход. Эта опция включает демон ssh.

  3. Создайте открытый / закрытый ключи ssh и скопируйте открытый ключ в папку .ssh / authorized_keys для пользователя root.

    a. Откройте терминал на локальном компьютере и введите ssh-keygen -t rsa

    b. Примите расположение по умолчанию и введите пароль для root.

    c. Войдите как root su - и создайте каталог ~ / .ssh. (~ == / var / root)

    d. Скопируйте открытый ключ в корень: cat ~ / .ssh / id_rsa.pub | sshroot @ localhost "cat - >> ~ / .ssh / authorized_keys"

    e. Проверяем, все ли в порядке. Введите ssh root @ localhost . Он не должен запрашивать пароль root.

  4. Включите удаленную отладку через ssh в Xcode.

    а. Выберите «Получить информацию» в раскрывающемся меню «Исполняемые файлы»

    b. В настройках «Отладка» отметьте «Отладка исполняемого файла удаленно через ssh» и поставьте root @ localhostв качестве информации «Подключиться к».

  5. Теперь все должно быть в порядке ☺

Из блога

13
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: