Вообще говоря именно пропажа текста в dwg-файлах в 99% из-за SHX-шрифтов.
Неправда ваша. При отсутствии shx-шрифтов авто/нанокады осуществляют автоматическую замену на shx-шрифт по умолчанию. И ситуация опять сводится к наличию глифов для соответствующих символов (в смысле юникодных codepoint). Отсутствующие глифы обычно заменяются глифом знака вопроса.
Кроме того, одной из постоянно возникающих сложностей была и остается пропажа текста при передаче *.dwg-файлов.
Вообще-то говоря, именно пропажа текста может быть только в одном случае: когда на принимающей системе отсутствует использованный в чертеже TTF, а услужливая Винда при замене шрифта подсовывает TTF, в котором необходимые глифы либо отсутствуют, либо не содержат графики (типа пробела). В остальных случаях текст либо в нечитаем (если в TTF отсутствующие глифы заменяются на, к примеру, перечёркнутый прямоугольник, или на символ другого языка), либо отображается другим шрифтом, что ведёт к нарушению форматирования. При этом обычно понятно, что это текст, а с его отображением возникли проблемы.
Причину тут может не заметить даже опытный проектировщик, ведь на его компьютере всё отображается корректно. А в файле заказчика полностью или частично исчезает текстовая часть.
Если уж начистоту, это результат плохого знания «опытным проектировщиком» того интсрумента (САПР), с которым он работает. Или банальное раздолбайство. В первом случае статья возможно и поможет. Во втором — скорее всего нет.
Не путайте мягкое с тёплым. ГОСТовские шрифты могут быть и в виде TTF, и в виде SHX.
Статья не о том, использовать ГОСТовские шрифты или нет, и вообще выполнять ли требования ГОСТ. (Кстати, в разных странах разные ГОСТы и разные требования по их исполнению.) Вам в техникуме было выставлено требование выполнения норм ГОСТ — вы его выполняли (и это правильно). А где-то это совершенно необязательно.
В идеальном мире чистых абстракций с бесконечной производительностью и нулевыми задержками это работает. Так же как и идея составных документов, когда в условный вордовский документ на локальном компьютере вставлены объекты условных Excel, PowerPoint, etc., находящиеся на других компьютерах, разбросанных по всему миру. В идеальном мире это работает. В реальном — применимо, если вы мазохист (ну или поставлены в такие условия извне). И это не единичные примеры.
С другой стороны, всегда надо думать, что ты собираешься сделать. Разархивировать файлы через Ctrl-X/Ctrl-P — явно не лучшая идея, если вы не тестировщик.
С третьей стороны, Windows9x (да и не только 9x) позиционировались как «ОС для домохозяек». А эта категория пользователей не будет задумываться, чем отличается zip-архив от дисковой файловой системы. Поскольку не знает, что такое «zip-архив» и «файловая система». Тут однозначно прокол при тестировании.
Интересно то, что такая сложная атака имела целью такую мизерную сумму. И ведь понятно, что эту схему долго и/или для большого количества потенциальных жертв эксплуатировать не получится. Профит в чём?
О'кей, если вы отвечаете за снабжение детских домов ноутбуками по всей стране, не буду ваши слова подвергать сомнению. Но смысл моего комментария был несколько иной.
Однако у обобщённого программирования в C++ есть огромный минус: возникающие ошибки — это боль.
Ещё одна боль метапрограммирования в C++ — это отладка. Нужно либо досконально знать логику работы компилятора при обработке шаблоного кода, либо довольствоваться верой в то, что ваша метапрограмма будет компилироваться правильно при всех условиях. На сколько я понимаю, все средства отладки ограничиваются, условно говоря, тестовой печатью.
Плюсовый компилятор, если не вдаваться в подробности, состоит из собственно компилятора C++ (без шаблонов) и интерпретатора мета-языка шаблонов. И если с отладкой исполняемого кода всё более или менее в порядке, то отлдка мета-языка находится где-то на уровне 60-х годов прошлого века: на входе колода перфокарт, на выходе телетайп. Как-то посмотреть промежуточные результаты вычислений интерпретатора весьма затруднительно. Не говоря уже про точки останова и прочие плюшки отладчика.
Конечно отладка — это не вопрос Стандарта. Но и производители компиляторов и IDE не спешат что-то делать в этом направлении. (А прошло, на минуточку, уже больше 30 лет с момента появления первого компилятора C++.) Поэтому метапрограммирования на C++ стараются, по возможности, избегать (иногда даже запрещать на уровне корпоративного code-style). А когда это невозможно, метапрограммные части кода являют собой достаточно примитивные конструкции, правильность которых можно оценить невооружённым глазом. И только малый процент мета-кода является действительно сложными программами на мета-языке.
И помните, что никакие советы не помогут сохранить анонимность, если вами заинтересуются действительно серьёзные ребята (типа АНБ/ФСБ/Моссад).
Конечно не надо светить своими личными данными на каждой интернет-помойке во избежание контактов с мелкими бандюками, мошенниками и аферистами. Ну и от своей первой, официальной, хорошо засвеченной личности избавиться сложно, затратно, неудобно.
В 90-е было дело. У моего друга и коллеги была своя BBS. После того, как клиент всё-таки дозванивался по dial-up'у и подключался к BBS, он видел экран приветствия, на котором в частности было написано «For continue press Ctrl-Alt-Del twice...» (на самом деле «press any key»). И что вы думаете? Один товарищ на полном серьёзе написал на него жалобу в профильную FIDO'шную эху по поводу того, что это безобразие и издевательство: он не может войти на BBS, владельцем которой является имярек <адрес FIDO>, потому что после первого Ctrl-Alt-Del его компьютер перезагружается.
По поводу вашего списка примеров блюза на 160 bpm.
Во-первых, пп.1 и 2 блюзом являются только очень формально, только поскольку используют блюзовый квадрат. А вообще-то буги-вуги. Rock'n'roll ведь формально тоже блюз. Только сильно убыстренный. Это к качеству выборок композиций для анализа.
Во-вторых, п.4, на мой чисто любительский взгляд, ну не как на 160. Скорее 120 bpm. Я не знаю, как там с четвертями, но если отстукать темп (по ударнику, по басу, по сильным долям) — получается примерно 2 удара в секунду. Это к качеству анализа композиций.
Может, конечно, вы дали не слишком удачный список примеров, а может надо подумать о качестве датасетов и качестве анализа композиций (это вам уже написали, присоединяюсь).
Как-то всё примитивно получилось. Как оценка приложения в условном GooglePlay: как-то работает — одна звёздочка, хорошо работает, да ещё и удобный интерфейс — пять звёздочек. А что там под капотом у приложения — никого не интересует.
Понятие совершенного кода, imho, в первую очередь подразумевает код, который лёгок в сопровождении, расширении и модификации. Всё остальное: читаемость, комментарии, алгоритмы, оптимизации — вытекает из этого. Не говоря уж о том, что код должен работать и выполнять свою задачу.
Во-первых, такой функции нет в стандарте С++. Т.е. сразу непереносимо.
Во-вторых, в данном случае, использование этой функции эквивалентно объявлению локальной переменной-массива. С теми же потенциальными граблями и, возможно, дополнительными ключами компиляции.
А оно надо?
Не всё так однозначно. Если двухмерный (многомерный в в общем случае) массив объявлен так, как это показано в статье, то он однозначно «лежит в памяти одним блоком».
Но в этом случае, вот это
Зная второй вариант, [skipped]. Например, он может быть полезен, когда нужно избавиться от лишних звездочек от указателей на указатели на указатели.
совершенно неправильно. «Указатели на указатели на указатели» появляются только в том случае, когда многомерный массив размерности n реализуется с помощью массива указателей на массивы с размерностью n-1. И, да, в этом случае данные массива будут разбросаны по памяти. Обычно это бывает при создании многомерного массива в куче при размерах массива, неизвестных на этапе компиляции. Хотя и в этом случае, если чуть-чуть напрячься и заморочиться с адресной арифметикой, можно написать класс, реализующий многомерный массив, данные которого будут лежать в куче единым блоком.
Я чего-то не понял. Вот это «новое» — это ещё не забытое старое? До 10-ки были регулярные (плюс-минус) обновления системы и «других продуктов Microsoft». В 10-ке решили отказаться от этого и сказали, что систему будем патчить 2 раза в год, но по-крупному. Исключения — только хотфиксы безопасности. Теперь, как я вижу, просто возвращаются к старой схеме. Не?
Как альтернативный вариант наверное можно рассмотреть встраивание шрифтов в файл чертежа без возможности их экстракции, как это сейчас делается в PDF.
Собственно так оно сейчас и работает. И для TTF, и для SHX. Только без запроса к пользователю.
Неправда ваша. При отсутствии shx-шрифтов авто/нанокады осуществляют автоматическую замену на shx-шрифт по умолчанию. И ситуация опять сводится к наличию глифов для соответствующих символов (в смысле юникодных codepoint). Отсутствующие глифы обычно заменяются глифом знака вопроса.
Вообще-то говоря, именно пропажа текста может быть только в одном случае: когда на принимающей системе отсутствует использованный в чертеже TTF, а услужливая Винда при замене шрифта подсовывает TTF, в котором необходимые глифы либо отсутствуют, либо не содержат графики (типа пробела). В остальных случаях текст либо в нечитаем (если в TTF отсутствующие глифы заменяются на, к примеру, перечёркнутый прямоугольник, или на символ другого языка), либо отображается другим шрифтом, что ведёт к нарушению форматирования. При этом обычно понятно, что это текст, а с его отображением возникли проблемы.
Если уж начистоту, это результат плохого знания «опытным проектировщиком» того интсрумента (САПР), с которым он работает. Или банальное раздолбайство. В первом случае статья возможно и поможет. Во втором — скорее всего нет.
Статья не о том, использовать ГОСТовские шрифты или нет, и вообще выполнять ли требования ГОСТ. (Кстати, в разных странах разные ГОСТы и разные требования по их исполнению.) Вам в техникуме было выставлено требование выполнения норм ГОСТ — вы его выполняли (и это правильно). А где-то это совершенно необязательно.
С другой стороны, всегда надо думать, что ты собираешься сделать. Разархивировать файлы через Ctrl-X/Ctrl-P — явно не лучшая идея, если вы не тестировщик.
С третьей стороны, Windows9x (да и не только 9x) позиционировались как «ОС для домохозяек». А эта категория пользователей не будет задумываться, чем отличается zip-архив от дисковой файловой системы. Поскольку не знает, что такое «zip-архив» и «файловая система». Тут однозначно прокол при тестировании.
Если уж «бабла немеряно» отдали бы рояль и ноут куда-нибудь в детский дом. Всё польза была бы.
Ещё одна боль метапрограммирования в C++ — это отладка. Нужно либо досконально знать логику работы компилятора при обработке шаблоного кода, либо довольствоваться верой в то, что ваша метапрограмма будет компилироваться правильно при всех условиях. На сколько я понимаю, все средства отладки ограничиваются, условно говоря, тестовой печатью.
Плюсовый компилятор, если не вдаваться в подробности, состоит из собственно компилятора C++ (без шаблонов) и интерпретатора мета-языка шаблонов. И если с отладкой исполняемого кода всё более или менее в порядке, то отлдка мета-языка находится где-то на уровне 60-х годов прошлого века: на входе колода перфокарт, на выходе телетайп. Как-то посмотреть промежуточные результаты вычислений интерпретатора весьма затруднительно. Не говоря уже про точки останова и прочие плюшки отладчика.
Конечно отладка — это не вопрос Стандарта. Но и производители компиляторов и IDE не спешат что-то делать в этом направлении. (А прошло, на минуточку, уже больше 30 лет с момента появления первого компилятора C++.) Поэтому метапрограммирования на C++ стараются, по возможности, избегать (иногда даже запрещать на уровне корпоративного code-style). А когда это невозможно, метапрограммные части кода являют собой достаточно примитивные конструкции, правильность которых можно оценить невооружённым глазом. И только малый процент мета-кода является действительно сложными программами на мета-языке.
Конечно не надо светить своими личными данными на каждой интернет-помойке во избежание контактов с мелкими бандюками, мошенниками и аферистами. Ну и от своей первой, официальной, хорошо засвеченной личности избавиться сложно, затратно, неудобно.
Там написано, что эта программа CARDWARE. Вы послали postcard (или хотя бы e-mail) автору программы?
Во-первых, пп.1 и 2 блюзом являются только очень формально, только поскольку используют блюзовый квадрат. А вообще-то буги-вуги. Rock'n'roll ведь формально тоже блюз. Только сильно убыстренный. Это к качеству выборок композиций для анализа.
Во-вторых, п.4, на мой чисто любительский взгляд, ну не как на 160. Скорее 120 bpm. Я не знаю, как там с четвертями, но если отстукать темп (по ударнику, по басу, по сильным долям) — получается примерно 2 удара в секунду. Это к качеству анализа композиций.
Может, конечно, вы дали не слишком удачный список примеров, а может надо подумать о качестве датасетов и качестве анализа композиций (это вам уже написали, присоединяюсь).
Понятие совершенного кода, imho, в первую очередь подразумевает код, который лёгок в сопровождении, расширении и модификации. Всё остальное: читаемость, комментарии, алгоритмы, оптимизации — вытекает из этого. Не говоря уж о том, что код должен работать и выполнять свою задачу.
Во-вторых, в данном случае, использование этой функции эквивалентно объявлению локальной переменной-массива. С теми же потенциальными граблями и, возможно, дополнительными ключами компиляции.
А оно надо?
Но в этом случае, вот это
совершенно неправильно. «Указатели на указатели на указатели» появляются только в том случае, когда многомерный массив размерности n реализуется с помощью массива указателей на массивы с размерностью n-1. И, да, в этом случае данные массива будут разбросаны по памяти. Обычно это бывает при создании многомерного массива в куче при размерах массива, неизвестных на этапе компиляции. Хотя и в этом случае, если чуть-чуть напрячься и заморочиться с адресной арифметикой, можно написать класс, реализующий многомерный массив, данные которого будут лежать в куче единым блоком.