?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Entries by category: литература

Все течет, все меняется
nyaload
_winnie
Тонкая ошибка в такой схеме базы данных про книги и их авторов:


таблица 1: id книжки (ключ) | список id авторов книги | название книжки

таблица 2: id автора (ключ) | имя автора

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

--------------------------------------------------------------
Никогда-никогда-никогда-никогда не буду больше использовать доставку EMS россии. Единственное что там лучше чем Почта России - это хорошая поддержка по телефону.

В остальном - тоже самое, заполнять паспортные данные и свой адрес при вручении посылки, а чуть что-то нестандартное с посылкой - необходимо ехать в офис, который сильно дальше чем ближайшее отделение обычной почты. Если в 8 утра не ответил на единственный звонок от курьера - считается, что "вручить не удалось"

--------------------------------------------------------------

А ещё я почти научился фотореалистичным срисовкам (на фото сверху IRL натюрморт, на экране снизу - срисованное):
Read more...Collapse )

π++
nyaload
_winnie
в С++ нет числа π в стандартной библиотеке. M_PI/_USE_MATH_DEFINES зачем-то сломали в g++ при использовании -std=c++11, а взамен ничего не предложили.

http://stackoverflow.com/questions/1727881/how-to-use-the-pi-constant-in-c

В результате проще в каждом cpp файле копипастить строчку «const double pi = 3.14159265358979323846;» (или «constexpr auto pi = 3.14159265358979323846» в c++11, или acos(-1) вместо константы).

--------------
PS. этот пост дубликат предыдущего, предыдущий я удалил из-за этого бага. Уже оставленные чужие коментарии достал из почты, скопирую в комментарии.
Tags:

binary search
nyaload
_winnie
В книге "жемчужины программирования" сообщается, что невозможно написать binary search с первого раза.

На самом деле его невозможно написать с первого раза, если не осознаешь что такое инвариант цикла. Если осознаёшь - то скорее всего запросто напишешь (я вот уже в третий раз за год написал).

Если не осознаёшь инвариант цикла, то с большой вероятностью будет одна из ошибок:

* mid = (lo+hi)/2 или hi/2+lo/2 ? (и нет, дело не в overflow, эти формулы просто разные (1+3)/2 != 1/2 + 3/2 ).Read more...Collapse )

Как писать двоичный поиск чтобы он не бажил:
* Выбрать инвариант "если искомый элемент существует, то он в [lo, hi)", изначально выбрать lo,hi = 0, N.
* mid = lo+(hi-lo)/2 (при этом для кода верно утверждение "промежуток длиннее 1 всегда укоротится").
* Если ищем первый среди равных - то сравнение выглядит как key<=array[mid-1], если последний - key<array[mid]
* в зависимости от сравнения присваиваем mid в lo или hi (в любом случае, не mid-1).



Двоичный поиск для равномерно распределённых ключей (хешей) ускоряется простым хаком "для каждого из 65536 двубайтовых префиксов запомнить, где он начинается", это убирает 16 начальных итераций.Read more...Collapse )
Tags:

Температура возгорания бумаги - 230°C (451° по Фаренгейту)
nyaload
_winnie
Сейчас я вам представлю доказательства того, что температура самовоспламенения бумаги - 230 градусов (или 451° по Фаренгейту), плюс-минус 10°.

ссылка 1) Информация с английской вики: http://en.wikipedia.org/wiki/Autoignition_temperature#cite_note-8
Скриншот: http://dobrokot.ru/pics/i2014-07-08__01-52-26_27kb.png

ссылка 2) А. Я. Корольченко, Д. А. Корольченко Пожаровзрывоопасность веществ и материалов и средства их тушения
Книга - http://dwg.ru/dnl/9002 , скриншот нужной страницы http://dobrokot.ru/pics/i2014-07-08__01-51-02_133kb.png

ссылка 3)
http://www.tcforensic.com.au/docs/article10.html#2.1 — Австралийский журнал «Firepoint». Physical constants for investigators, см. "paper"

Поверили? Справочники и английская вики - надёжный источник? На название романа я не ссылаюсь, это художественная литература. А вот справочники и википедия врать не должны.

Update: у меня духовка греет только до 250°C (правда, не знаю как это проверить). У кого-нибудь есть, которая греет сильней чем 250, но заведомо меньше 400?

fuzzy search grep своими руками
nyaload
_winnie
Если нужно провести неточный поиск слова по большому файлу (напр. по дампу википедии), то самое простое - это сгенерить регулярное выражение со всеми нужными вариантами опечаток, и сунуть в хорошую библиотеку регулярных выражений ( стандартный grep - OK, PCRE/python.re - NOT OK ).

Например, слово WORD превращается в регулярку:
.ORD|ORD|W.RD|WRD|W.ORD|WO.D|WOD|WO.RD|WOR.|WOR|WOR.D

Если нужен поиск по UTF-8 файлу - то можно ускорить поиск, используя вместо точки и UTF8-локали - "[^\x80-\xbf][\x80-\xbf]*" и C-локаль.

Если нужен case-insensitive поиск - то при генерации регулярки вместо СЛОВО писать (С|с)(Л|л)(О|о)(В|в)(О|о). И вы сами определяете, что вы хотите - [iI] или [Iiı], ẞ или (ß|ẞ|SS|S-S|ss|SSS|SZ), ё или (е|ё).

Пример генератора, который генерирует регулярку для всех вариантов на расстоянии 1 по Левенштейну: https://gist.github.com/dobrokot/6150988
Tags:

почему зеркало меняет право и лево, а верх и низ нет
nyaload
_winnie
Совершил диверсию: предложил коллегам на кухне задачку "почему зеркало меняет право-лево, но не верх и низ".

Мои мысли по этому поводу: фотки прилагаются!Collapse )
Tags: , ,

binomial distribution simulation С++ source code
nyaload
_winnie
Сложно найти код биномиального распределения. То находится в интернете - это подсчет n! / k!(n-k)!, либо симуляция через rand(0,1)+rand(0,1)+rand(0,1)+rand(0,1)+rand(0,1)+rand(0,1). Иногда встречаются ответы на форумах, что можно заменить нормальным распределением, но для маленьких вероятностей и на хвостах это не работает.

В конце концов вспомнил, что в питоньей библиотеке для численых расчетов numpy есть биномиальное распределение, значит можно выдрать оттуда.

binomial distribution simulation С++ source code: source code of numpy ( http://sourceforge.net/projects/numpy/files/NumPy/1.6.0/numpy-1.6.0.tar.gz ), file numpy-1.6.0/numpy/random/mtrand/distributions.c

maven jar hell
nyaload
_winnie
maven теперь остался в том месте, где он хорошо справляется - разрешать зависимости библиотек, скачивать их из интернета, и исходники к ним качать.
К сожалению, даже тут он справляется на "хорошо", а не на "отлично". На 4 с плюсом, но не на 5.

Во-первых, когда при diamond-dependency-hell нужны библиотеки разных версий - он тупо выбирает самую большую, из-за этого возникают никогда не тестировавшиеся комбинации библиотек. Ну это ладно, похоже для java это неизбежное зло.

Во-вторых, мейтейнеры библиотек часто в библиотеках с разными именами используют одинаковые классы. Например, asm-3.1.jar в зависимостях hibernate и asm-all-3.3.1.jar.

В проекте используется три XML-парсера (org.xml.sax), лежащие в трёх следующих файлах, и выбирается рандомный из них. А они выдают разный порядок атрибутов из xml-тега, мля.
/usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/rt.jar
vendor/jars/xml-apis-1.3.04.jar
vendor/jars/gnujaxp-1.0.0.jar

Read more...Collapse )

operator*(const float3 &, const float3 &)
nyaload
_winnie
overloaded операция '*' для векторов a,b должна делать покомпонентное умножение, (a.x*b.x, a.y*b.y, a.z*b.z). Ибо вот.

Так сделано в шейдерных языках со встроенной математикой (HLSL в D3D, GLSL в OpenGL, ). Это удобно: часто хочется сделать что-то вроде
(a + float2(-1, 1)*b)
(a + float2(0, -1)*b)
(a + float2(screenWidth, screenHeight)*b)
light_color * surface_diffuse_color


Если сделали у вектора конструктор из float* - не забудьте сделать его explicit.
Не делайте у векторов неявного преобразования в float*. Сделайте явное, типа float* ptr(). Это не так часто нужно, что бы создавать грабли с неявными преобразованиями. Не потому что "так правильно", а потому что бьёт по лбу даже в домашних микропроектах.

Оператор нормализации вектора должен давать детерменированный результат на невалидном векторе нулевой длины. Например, (0,0,1) во всех конфигурациях. И ещё assert в debug. Не оставляете недетерменированный результат даже в release билде, намучаетесь с NaN в рендере, экспорте, физике, игровой логике и везде.

Прежде чем делать 1001-ю библиотеку для 2d/3d/4d математики - посмотрите на HLSL/GLSL, что бы быть ближе к классике.

Геометрические Алгоритмы. Пересечение двух отрезков на плоскости.
nyaload
_winnie
Пусть есть два отрезка A,B и C,D. Надо понять, пересекаются ли они, и если да, то где именно. Во всех исходниках и книжках, которые я смотрел, это было сделано с кучей ненужного мусора, не смотря на то, что вроде бы очень простая и распространённая задача. Read more...Collapse )

Смотри ещё: • Угол между двумя векторами
Смотри ещё: • Проверка точки внутри многоугольника