Oct. 7th, 2016 04:15 pm

Spidey

spiiin: (2D)
Знаете ли вы, как пауки научились плести паутину? Нашёлся один паук, который это сделал. Просто взял и сплёл.

Традиционный взгляд на эволюцию сводится к такой схеме: животные всеми силами пытаются защититься от окружающего мира, и это определяет их поведение, внешний вид и функции организма. Но это только одна сторона медали. Животные могут сами изменять естественный ход эволюции! Они перестают идти на поводу у природы и начинают противиться ее прихотям, используя свои навыки - особую тактику или особые умения. Пауки бросили вызов природе, научившись плести паутину.
Сеть взрослой самки паука-крестовика имеет строго определенное число радиусов и спиралей клейких нитей и постоянное расстояние между соседними витками. Так, например, установлено, что в её ловчей сети имеется 39 радиусов, 35 витков спирали и 1245 точек прикрепления радиусов к спирали.
Наблюдаемый автоматизм строительного инстинкта паука есть результат запрограммирования всего комплекса движений в нервной системе, который закреплен генетически в наследственности, а потому свойствен всем особям. Отсюда становится понятно, почему молодые паучки умеют строить паутинную сеть и ловить добычу подобно взрослым.

Вплетённые в мир



Получил ачивку за 64 решённые задачи по биоинформатике на rosalind.
Осталось ещё примерно столько же.
Tags:
Apr. 20th, 2015 05:10 pm

Rosalind

spiiin: (Default)
Решил первые 16 задачек в Bioinformatics Stronghold на rosalind.info. Это похожий на Project Euler проект, сборник задач на тему биоинформатики. К каждой задаче прилагается практический пример, в котором могло бы помочь решение задачи, что делает процесс решения намного веселее (например, подсчёт популяции кроликов в Австралии вместо обычного рассчёта n-го числа вариации ряда Фибоначчи).

Процесс решения отлично геймифицирован - за решения выдаются достижения, сами задачи разбиты на категории, новые задачи открываются после решения более простых (граф задач), после решения большинства задач выдаётся приз (в виде более раннего доступа к условиям новых задач :) ). Решение воспринимается как процесс прохождения одного большого квеста, после завершения одной задачи интересно посмотреть, какие откроются следующие.

Кроме основного набора задач есть ещё несколько - на применение софта, используемого в биоинформатике, задачи к книгам по алгоритмам и биоинформатике и вводные 5 задачек по python.
Tags:
spiiin: (Default)
http://dranger.com/ffmpeg/ - туториал по использованию библиотеки FFMpeg
Перевел первую часть на C# (враппер Tao.FFmpeg):
100 строк кода )
http://pastebin.com/zshigtN9
- Версия Tao Framework взята из svn, почему-то постоянно падает на открытии файла, примерно как тут
- В папку с бинарником необходимо забросить библиотеки avcodec, avformat, avutil и avdevice из папки win32deps, либо как-то обеспечить их видимость.
- Получается выдиральщик кадров из видео на коленке, аналогичный по результату команде "ffmpeg -i input.dv -r 25 -t 00:00:01 -f image2 images%d.png"
Tags:
Feb. 25th, 2011 11:43 pm

Build

spiiin: (Default)
Тривиальные вещи, а знают не все С++-программисты.

Когда приложение собирается из более чем одного файла, они скармливаются компилятору последовательно. При этом единицей компиляции являются только файлы с исходным кодом. Заголовные файлы aka хидеры просто подставляются на то место исходника, где стоит директива #include (указание препроцессору заменить ее на текст файла), и все, более для компилятора как источник кода эти файлы не существуют.
Т.е. если в двух файлах с исходным кодом написать #include "header.h", то компилятор воткнет этот файл в каждый из исходников, директива #pragma once и #ifdef с уникальным именем файла нужны не для этого. .*
Нету даже защиты от рекурсивного включения - 2 заголовочных файла, включающих друг друга, позволяют проверить, насколько используемый компилятор устойчив к выходкам дураков. Например, MSVS 2008 выдает в таких ситуациях fatal error C1014: too many include files : depth = 1024.
Собственно, компилятор можно попросить остановиться на стадии подстановки инклюдов (как и на любой другой) и изучить результат.

Помимо #include препроцессор также выполняет и другие директивы, например, заменяет __LINE__ на номер текущей строки, и раскрывает макросы. Препроцессор просто заменяет один текст на другой, вычисления на данном этапе не проводятся, и числа существуют только в виде строки текста
Препроцессор проходит по тексту последовательно и имеет состояние, которое может изменяться в ходе обработки текста и проверяться простыми логическими предикатами. Состоянием может управлять текст, который стоит выше места включения и программист/его среда разработки, передающие это состояние при вызове команды компиляции. То есть #define перед #include может полностью поменять то, что попадет в результате в файл.

Дальше идет компиляция собранного большого куска текста. По каким именно правилам она будет проходит, зависит от переданной командной строки. По умолчанию еще часто от расширения файла. Если компиляция прошла успешно, будет создан объектный файл (object file, хз, как адекватно перевести), содержащий код, а также таблицу имен для содержащихся в модуле функций. Для разных языков и компиляторов приняты разные соглашения о названиях имен (Name mangling ), поэтому объектный файл, собранный одним компилятором, может не подойти для другого (скорее всего так и будет!). О подводных камнях именования функций в связке языков C/C++/Objective C/Objective C++ напишу отдельным постом. Также система сборки обычно следит за изменениями в исходных/заголовочных файлах и не занимается пересборкой неизменившихся файлов, но, как и все остальные, эта абстракция иногда протекает.

Если каждый из исходных файлов был успешно перемолот, в дело вступает компоновщик, которые объединяет эти файлы и подставляет нужные адреса функций, используя таблицу имен (за счет этого функции из одного файла могут быть вызваны из другого). На данном этапе может обнаружиться нехватка некоторых функций, которые были где-то объявлены, но ни в одном из файлов так и не нашлось реализации. Напоследок, опять же, в зависимости от правил, переданных компоновщику, он помечает некоторый адрес, как точку начала кода, может прилинковать к выходному файлу ресурсы, обрамляет код метками, по которым, операционная система узнает, что перед ней - библиотека, исполнимый файл или еще что, и рапортует - сборка программы завершена, вероятно ошибок сборки нет!

*[
Из того, что хидер попадет по разу в каждый исходник, который его включает, следует, что в хидеры можно выносить только объявления, а не определения символов. Что является определением, а что объявлением чаще всего понятно (пункт 3.1 стандарта С++, занимает всего одну страницу, как для С++ это очень мало). Впрочем, иногда в случае объявлений даже компилятору без дополнительных подсказок неясно, поэтому в языке появилось слово typename .
Еще становится понятно, что в заголовочных файлах шаблонные функции и классы необходимо и объявлять и определять - в каждый файл должно попасть не только объявление функции, но и ее тело, чтобы компилятор мог по нему инстанциировать шаблонную функцию или класс для каждого типа. Такой подход плох тем, что для одного и того же типа может быть создан одинаковый код шаблонной функции для работы с этим типом. Для обхода этой проблемы придумали,например, export templates /.
]
Tags:

Profile

spiiin: (Default)
spiiin

September 2017

S M T W T F S
     1 2
34 567 89
101112131415 16
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 11:25 am
Powered by Dreamwidth Studios