All streams
Search
Write a publication
Pull to refresh
40
0
Павлов Николай Александрович @ZyXI

Инженер

Send message
(zyx-desktop:zyx:~/tmp/c) 2 % grep -P '^#\s*define\s+TRUE' /usr/include/*.h --files-with-match
/usr/include/atasmart.h
/usr/include/bfd.h
/usr/include/curses.h
/usr/include/gif_lib.h
/usr/include/jmorecfg.h
/usr/include/lcms2.h
/usr/include/lcms.h
/usr/include/ncurses.h
/usr/include/notmuch.h
/usr/include/odbcinstext.h
/usr/include/pth.h
/usr/include/slcurses.h
/usr/include/twolame.h
Как видите, определён в куче файлов, но ни в одном из стандартных заголовков:
(zyx-desktop:zyx:~/tmp/c) 2 % grep -P '^#\s*define\s+TRUE' /usr/include/*.h --files-with-match | xargs qfile | cut -d ' ' -f 1 | sort | uniq
dev-db/unixODBC
dev-libs/libatasmart
dev-libs/pth
media-libs/giflib
media-libs/lcms
media-libs/libjpeg-turbo
media-sound/twolame
net-mail/notmuch
sys-libs/ncurses
sys-libs/slang


Полагаю, что просто писать такой #define в заголовочном файле — весьма частое явление, считающееся де‐факто стандартом. В приведённом коде замена true на TRUE заработать не должна.
Почему не оптимально? Если вы включите оптимизацию (хотя бы -O1), то получите ровно то же самое. Писать, конечно, дольше, но если использовать сниппеты, то без разницы.
Если говорить о чисто текстовых файлах, то да, абзац — это строка, заканчивающая признаком конца строки (символами 13, 10 в Windows или только 13 в Linux).
Обычно строка — это строка. А абзац — это либо внутренняя терминология редактора (вроде «абзац — это набор строк, ограниченных строками, не содержащими не пробельных символов, либо началом/концом файла» (основное определение для Vim)), либо терминология того формата данных, в котором записан текстовый файл (свои абзацы есть и в FB2, и в *TeX), либо терминология отображающей программы (читалки при чтении текстовых файлов обычно имеют своё представление о том, как текст должен биться на абзацы, причём зачастую он бьётся совершенно не по строкам).
Т.к. абзацы длиной 10 МБ встречаются крайне редко (я бы даже сказал, никогда не встречаются)
Я так понял, вы под «абзацами» понимаете «строки текста»? Если да, то один из любимых примеров: XML в одну строку. Мне, правда, никогда не доводилось редактировать XML, который обязан занимать одну строку, что позволяло пользоваться xmllint, но других люди говорят: им нужно. Собственно, эта необходимость упоминается фактически в каждой теме, где кто‐то говорит, что «обратка длинных строк не нужна».

Если нет, то как вы определяете границы абзаца?
У vim память, кажется, выделяется блоками на N≥1 строк. Целых строк. Кроме того, даже если найдётся кто‐то, кто перепишет memline.c, чтобы работать с большими строками, средства навигации по таким строкам практически отсутствуют. И вывод на экран тоже под такие строки не рассчитан. Но я не работаю с настолько большими файлами в одну строку, так что у меня всё почти всегда упирается в подстветку синтаксиса.

Я бы эту проблему решал с помощью пары фильтров: xmllint --format - при чтении и xmllint --noblanks - при записи.
Дело в том, что все эмуляторы консоли, которые я проверял, считают глифы из других шрифтов имеющими размеры символа данного шрифта, не зависимо от реального размера глифа. Но для FULLWIDTH символов и терминал, и Vim считают ширину равной двум. Я, правда, не смог найти ни одного моноширинного шрифта, в котором fontforge показал бы наличие глифов для данных символов. А я‐то считал (из‐за отсутствия обычных проблем с отображением, обычно отличающих отсутствующие глифы) «A» присутствующей в шрифте.

Эмуляторы терминала со спанами явно не заморачиваются: слишком широкий символ из другого шрифта в зависимости от расположения звёзд может либо перекрываться другим символом, либо двигать все прочие символы. Причём состояние «перекрывается»/«двигает» может меняться даже без изменения отображаемого текста (например, при выделении).
Что есть «перебить Гугл»? Неправильное с литературной точки зрения, но корректное речевое сокращение фразы «перебить ставку Гугла»? С браузером ещё хуже пример. Некорректное использование глагола. По крайней мере для меня такая фраза становится бессмысленной лапшой.
В этой ситуации неудивительно, что вице-президент Google буквально запаниковал и написал свой пост — ему просто надоело постоянно получать пощечины. И в его словах говорится не столько об обиде, сколько о сговоре, в ходе которого софтверный гигант (Microsoft) пригласил на ужин, а после лег в постель с остальными компаниями, отдавшими деньги за патенты. С одной лишь целью — перебить Google.
(http://habrahabr.ru/post/125852/) Здесь, правда, возможно имелось ввиду «перебить ставку Google». Или «уничтожить Google».

Вот ещё чистый «превзойти»:
В этой связи автор рассуждает, может ли Google взять и отказаться от Flash на своих сервисах, прежде всего YouTube, чтобы перебить монополию Flash какой-то своей технологией (для начала — плагинами для браузеров, в перспективе — HTML5).
. Правда это, похоже, комментарий к удалённому посту: сохранился только в кэше Google в избранном одного человека, ссылка на пост слева уже отсутствует. Номер комментария: 2546951, автор: dimag0g. Ссылка на кэш Google.

Я ещё где‐то видел аналогичный комментарий в отношении другой компании и какого‐то продукта, но этот вариант употребляется реже даже, чем мой вариант значения. Где я видел «перебить {продукт}» и «перебить {компания}» я не нашёл.
По поводу предметов — нет, «перебить спутники» не вполне корректная фраза, она явно просится на пополнение уточняющим определителем «все»/«американские»/… А с определителем значение слова воспринимается легче. Впрочем вы нашли верное расширение значения.
В исходном тексте было указано, сколько и каких спутников надо перебить: здесь обсуждалась устойчивость работы ГЛОНАСС при уничтожении части спутников.
Извините, но не воспринимаются мной фразы подобные «перебить работу чего-то». Если бы вы хоть раз перебивали провода — вы бы знали что это именно в значении сломать. Связано с определённым действием — повреждением провода в результате (чаще всего неудачного) действия ударного характера (молотком, гвоздём, ломом, лопатой, ...)
Это всё же не «сломать». Слишком узкие ограничения. Когда вы перебиваете провод, вы прерываете соединение, которое этим проводом осуществляется. Я знаю это значение применительно к проводам, но «перебить провод» ≠ «сломать провод». И оно отлично обобщается на другие вещи (в одном из словарей «перебивали» трубу огнём из пушки, руку). «Прерывание» (а лучше «нарушение связности») протяжённого процесса/вещи отлично обобщает «перебивание» провода, руки, значение «не дав договорить, прервать» и даже часть из «нарушения проявления, развития, течения чего‐либо».
Просто с моноширинными шрифтами не нужно рендерить глифы, чтобы её узнать.
Данное утверждение тоже, кстати, не всегда верно. Современные системы отображения текста умеют брать отсутствующие глифы из шрифтов, где они присутствуют. Если основной шрифт моноширинный, и при том отображающая шрифт программа расчитывает на определённые размеры символа, то это приводит к различным глюкам отображения, так как символ из другого шрифта имеет другие размеры.
У Vim огромные проблемы с подсветкой таких файлов. Кроме того, как вы в Vim проскроллите на миллион пикселей вправо? Горизонтальной полосы прокрутки в нём отродясь не было.

И ещё: с какой стати в моноширинном шрифте ширина всех символов одинакова? Это не так. В моноширинном шрифте символ «A» занимает ровно две ячейки (это относится ко всем символам, которые имеют свойство east_asian_width равное ́«F» (и, кажется, «W»), а иногда также и «A» (последнее зависит от шрифта и настроек терминала)). А три символа «а́݅» (русская «а» и два диакритических знака) занимают одну ячейку. Я не говорю уже о том, что для отрисовки текста с некоторой позиции нужен индекс байта, а не символа.

Моноширинные шрифты дают преимущество в смысле, что не нужно запускать рендерер, чтобы узнать, насколько текст широк. Но оно не настолько велико, как вы здесь описываете. Складывать ширину всех символов нужно всегда. Просто с моноширинными шрифтами не нужно рендерить глифы, чтобы её узнать.
У меня интересный вопрос: а как в такой структуре с поиском/заменой регулярных выражений? Кроме того, если вы берёте какой‐либо редактор с встроенным API для расширений на каком‐либо языке, то вы наверняка встретитесь как с возможностью вставки текста в любом месте, а не только в месте нахождения курсора, так и с дополнениями, которые хотят эту возможность использовать. Поиск/замена является частным случаем возможности вставки/удаления в произвольном месте.
— «местечковым» назвал потому, что такой термин не имеет широкого хождения (я до вас всего пару раз слышал его в таком значении)…
«Местечковый» и «малораспространённый» не являются синонимами. Если вы называете это слово «местечковым термином», то вы должны знать, где он распространён. «Перебить [данные] [в компьютер]» я в устной речи слышал часто в различных гос. учреждениях, в которых доводилось сдавать какие‐либо документы, и у себя на работе.
— иные значения: у нас форма «перебить что-то», в то время как значения прервать, убить всех могут быть использованы только для формы «перебить кого-то», перебить ставку — устоявшееся выражение (не знаю исторических предпосылок), ещё есть значение «сломать», но к ситуации так же значения не имеет.
Если повторите мой поисковый запрос, то увидите, что «перебить» в значении «превзойти» употребляется не только по отношению к ставке, но и к компаниям, и их продуктам: как напрямую, (т.е. «перебить Google», «На мой взгляд, браузер одно из самых ресурсоемких приложений в системе, перебить его могут только игры, видео-кодирование и 3d».), так и как часть выражения «перебить цену»; также есть различные вариации вида «одним очень сильным сигналом перебить все прочие»: тоже «превзойти».

«Перебить» в значении «убить всех» надо было изменить на «уничтожить всех». Оно употребляется далеко не только к одушевлённым предметам: в том же поиске вы увидите и предложение «перебить спутники».

И «перебить» в значении «прервать» тоже не относится только и исключительно к одушевлённым предметам: «перебить работу чего‐то», «перебить провод». Последний пример — это совсем не «сломать»: попробуйте применить «перебить» к случаю, когда 1. ломается не протяжённый предмет и 2. «поломка» не означает «прекращение связности в некотором конкретном месте». Толковые словари, правда, так не обобщают, но все приводимые ими примеры подпадают под оба условия (ломается протяженный предмет, при том под поломкой полагается прекращение связности). «Перебить [речь] собеседника» у меня обобщается вместе со «сломать», потому что речь 1. протяжённая во времени, 2. перебивание нарушает связность речи и 3. набор возможных поломок ограничен слишком сильно, чтобы под «перебить» можно было понимать «сломать».

Ещё, конечно, можно иметь ввиду «сломать всех», но это значение уже часть «уничтожить всех». В таком контексте не предполагается возможность починки.



Вот о чём действительно все забыли: это «перебить кресло» (в смысле «заменить обивку кресла на новую»)/«перебить подушки». Между прочим, не помню упоминания в таком значении на habrahabr вообще.
Выражайтесь точнее и без местечковых терминов — перебить в значении изменить (перебить номера на машине) имеет куда большее хождение, нежели перебить со значением скопировать.
Значение «изменить» не сильно подходит по смыслу к моей фразе. Но даже если к самому первому абзацу его прилепить как‐то можно, то второй абзац получается совершенно не согласованным с первым: зачем мне смотреть лог, если я изменяю MAC адрес? И с третьим. И с вашим комментарием, на который я отвечаю: ни намёка на изменение MAC адреса там не было.

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

Конечно, на habrahabr, это значение заметно менее распространено. Но по запросу «перебить site:habrahabr.ru/post/» в Google я увидел как минимум 6 из 133 употреблений в значении «перенести данные». 4,5 % — это больше, чем доля linux на десктопах:

habrahabr.ru/post/145121/
habrahabr.ru/post/122842/
habrahabr.ru/post/117101/#comment_3805022
habrahabr.ru/post/102443/#comment_3184286
habrahabr.ru/post/107278/#comment_3387163
habrahabr.ru/post/8330/#comment_127456

Замечу, что «перебить» в значениях «прервать», «убить всех» и «превзойти» («перебить ставку» и т.п.) встречаются вроде чаще «изменить». Как минимум, «прервать» и «превзойти» — точно, на счёт «убить всех» — не уверен.
Не знаю, как у VLC, а у mplayer можно указать до 1 ГиБ кэша. И значение его заполненности, с которого начнётся воспроизведение. Жалко только, что он не начинает кэшировать следующий файл из списка воспроизведения до конца просмотра предыдущего. Использую кэш как диагностику нашей любимой ошибки 12309, уже упомянутой ниже: если не помогло (чаще всего), то ошибка 12309 не причём. (При такой диагностике mplayer’у говорится, чтобы он ждал заполненности 1 ГиБ кэша на 99 % (на 100 % нельзя), что эффективно помещает в кэш большинство файлов целиком.)
А зачем мне перебивать-то? Мне нужно просто добавить его в список разрешенных на роутере.
Не понимаю, как там окажется MAC адрес, если вы его не перебьёте?
Все бы было так, как вы говорите, если бы долбаный Netgear показывал мак в логах. А он не показывает.

И вы сейчас оперируете логикой «вам это не нужно» и «как бы так хитровывернуться, чтобы обойти этот прошлеп». Что не отменяет факта, что такая банальнейшая вещь, как мак-адрес (которая в век wifi очень актуальна), запрятана в какие-то глубокие гребеня.
Не «хитровывернуться». Я добавлял к себе устройства на Ubuntu, Windows Mobile (двух версий), iOS. Потенциально мог добавлять ещё на всех дистрибутивах linux, Windows Phone и бог знает чём ещё. На всём, что я видел, место отображения MAC адреса и место ввода пароля различалось, причём второе было проще найти. Так зачем мне было вообще искать?

В Windows есть много неудачных интерфейсных решений. Но необходимость смотреть MAC в консоли не является одним из них с моей точки зрения. Вот если бы это было сложно посмотреть даже в предназначенной для выполнения администраторских задач консоли… Или её бы не было вовсе…

Насколько мне помнится, iOS на iPad’е требовала интернет с самого начала. MAC не отображался. Тем же страдал Android. Не знаю, как с iOS, но с Android можно было отказаться от указания аккаунта Google прямо сейчас, но тогда возникли бы две проблемы: где найти MAC и как ввести аккаунт. Не могу сказать, насколько их сложно было бы решать, поскольку я поступил точно так же: ввёл простой пароль, посмотрел логи, создал новый пароль на роутере, ввёл его в свой телефон.
А как вы хоть из GUI, хоть из консоли перебьёте адрес, не имея интернета? Ручками?

Всё гораздо проще: говорите ноуту подключиться к вашей точке с любым паролем (он, естественно, заведомо неправилен). Смотрите лог, копируете оттуда MAC адрес. Затем вставляете адрес и пишете пароль куда вам надо.

Способ работает с любой системой, способной подключиться к вашей точке. Не надо ломать голову, откуда здесь‐то брать MAC: MAC всегда можно найти в логах.
Там не «почти 300», а очень даже 200. Точнее, 23 assert’а (20 + 1 на три строки) и 200 прочих строк.
Вообще‐то именно это и делается. hg incoming — это тот же hg log. Для пустого репозитория он выведет именно список всех изменений.

Если нужен распарсенный лог с моим кодом, то надо немного изменить SAX парсер, чтобы он также запоминал автора, дату и описание изменения: они там есть, просто парсер их игнорирует.

И учтите две проблемы:
  1. Вам всё равно надо иметь пустой репозиторий где‐то.
  2. Этот вариант работает примерно в три раза медленнее, чем hg clone на tmpfs (причём проблема в hg incoming, а не в моём коде). В принципе, он нужен только если вам принципиально не нравится идея клонировать себе потенциально очень большой репозиторий: что будет, если забьётся tmpfs я не знаю и не хочу знать, а вот то, что если забьётся память, то я ничего хуже MemoryError не получу (из‐за limits.conf я даже не забью себе память), я знаю.
Я считаю костыльной неочевидную логику, когда set nocompatible в начале vimrc эквивалентно наличию .vimrc с определённым именем файла в определённом месте, загружаемого определённым образом (точнее, одним из двух определённых способов: по‐умолчанию и с $VIMINIT; во втором случае имя не важно). Это слишком много условий, для того, чтобы на них можно было положиться. И слишком много возможных причин их нарушить (хотя, конечно, нарушение не происходит в большинстве случаев).

Если быть точным: я бы не стал внедрять такую логику вообще, если бы писал Vim.
А я в изменённом выше сообщении собирался сказать, что (x for x in range(N)) должно заменять на iter(range(N)). Правда, потом всё же сообразил, что iter(range(N)) со статьёй не вяжется. Но примеры действительно лучше бы выбрать такими, чтобы использование генераторов было уместным.
set nocompatible — это и есть учёт. «Не надеяться на то, что где‐то будет уже всё предусмотрено» для собственного файла настроек имеет не больше смысла, чем засовывать весь vimrc в аргументы командной строки. Чем строчка set nocompatible так принципиально отличается от inoremap ,a <C-o>A, что на присутствие второй я надеяться могу, а на присутствие первой — нет?

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity