Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!

Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 
Показаны сообщения с ярлыком how to. Показать все сообщения
Показаны сообщения с ярлыком how to. Показать все сообщения

вторник, 21 января 2025 г.

Разделяем проект на части вместе с git репозиторием

Есть проект. Хочется его опубликовать. Но часть из негоявляется тайной. Как быть?

Есть ровно 2 тулы, которые позволили мне вчера это сделать:
- BFG Repo-Cleaner
- git filter-branch 

Запишу тут скрипт, который уверен поможет в будущем, когда потребуется снова. 

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

Все команды будем ранать из корня проекта. 

Все команды выполняются в bash.

Первая папка - в ней оставим все кроме папки (всех папок с этим именем):

# файл bfg-1.15.0.jar берем тут https://repo1.maven.org/maven2/com/madgag/bfg/1.15.0/bfg-1.15.0.jar
java -jar bfg-1.15.0.jar --delete-folders folder_to_extract --no-blob-protection
Вторая папка - из нее удалим все, кроме этой папки:
# удалить все удаленные репозитории, в них нет смысла, т.к. появится новый
git remote | xargs -n 1 git remote remove

# удалить все теги
git tag -d $(git tag -l)

# удалить все недокомиченные локальные вресии
git stash & git stash drop 0

# удаление всех веток кроме текущей
git branch | grep -v "$(git symbolic-ref --short HEAD)" | xargs git branch -D
 
# тут указывается полный путь, следовательно придется повторить несколько раз для каждого такого вхождения
# оставить только текущую папку git filter-branch --subdirectory-filter ./src/main/resources/folder_to_extract -- --all # удалить все что осталось после фильтрации git stash & git stash drop 0
На здоровье!

вторник, 15 октября 2019 г.

Разделение git репозитория на два с сохранением истории

Привет!

Сегодня возникла интересная задачка, ее хочу сохранить на память, т.к. уверен, что буду неоднократно использовать ее в будущем. А блог мой - это записная книга.

Предыстория. Есть большой Codenjoy репозиторий со всеми проектами: сервер, игры, клиенты к играм, скрипты для запуска, воспомагательные скрипты и так далее. Есть сообщество контрибюторов, и они делают форки. Иногда в этих форках они что-то полезное фиксят. Мне это надо в моем master. Я прошу их предлагать пулриквесты, но часто в этих пулриквестах содержится много всякого разного, что мне не очень надо в master - скажем изменения правил и дизайна под ивент, фиксы с которыми я не согласен. А так как все делалось наспех (ивент готовится обычно в свободное от работы время), то естественно контрибьютор не работал с веткой и может предложить либо все либо ничего. А мне потом выбирать коммит за коммитом. Брррр...

Задача. Разделить проекты на подпроекты так, чтобы с одной стороны у меня была возможность одной git командой (clone, pull, log, commit, push) работать сразу со всеми проектами; а с другой - принимать только те Pull Request что мне надо фильтруя лишнее. Читать дальше...

вторник, 14 марта 2017 г.

Doodle - моя первая работа

Для начала пруф :) А потом уже как такого добился. Работа хоть еще не завершенная - надо сделать так, чтобы свободного места почти не было, но хочется уже сейчас вдохновлять :) Ведь классно жеж получилось! И я думал что сложно, а оказывается вовсе и нет!


Итого, напомню как все начиналось. Рисовать я любил еще с детства, как любой ребенок. Но потом что-то случилось (школа скорее всего) и я рисовать перестал. Попытки вернуться к этому делу шли с переменным успехом. В основном рисовал, чтобы где-то на тернинге выпендриться или с докладом :) Даже раз сходил на тренинг. Там узнал про термин Doodle. Это все происходило с очень большими перерывами... 

Потом как-то купил себе планшет и начал рисовать плотнее. Слайды к презентациям (тынц, пумц, трюмц). Набив руку, даже вебинар сочинил на эту тему. Потом снова затишье. Работа, дела... Но понимаю что рисовать тянет. Потому беру планшет и смотрю на чистый лист с мыслью, какую первую линию надо провести. 

Рисуется все обычно так как в кодинге :) Да вообще во всем. Ты берешь чистый лист и задаешь себе вопрос. Что тут должно быть? Мысль о надписи JuJa сразу пришла в голову. Записал. Стер (потому как не вписался в размеры странички). Записал снова. Снова стер, потому как начертание не нравилось. Снова записал, снова стер... И так очень много раз. Потом был коммит - я сохранил картинку, потому что иногда программы имеют тенденцию слетать не сохраняя последних изменений. Риспект тем программам, которые все же сохраняют куда-то в temp всю работу и потом предлагают оттуда восстановиться (привет Camtasia Studio!).

Когда надпись была готова - пошел поиск того, кто должен сидеть на буковках (свисать с них, карабкаться на них, быть к ним приклеенными и так далее - что в голову придет). Тут важно понимать, что вся картинка в голову сразу не приходит никогда. Только очередной шаг. И выбор этого монстрика, которого ты в последствии срисовываешь - дело минут 10-15. Ключевое слово Doodle - поиск в гугле по картинкам. И находишь массу работ. Вот приблизительно как это делается на примере паучка

Дальше ты пытаешься срисовать понравившегося монстрика, опеределив то место, где ему быть. Слава векторному редактору на планшете - есть возможность отменить последнее действие, сделать больше/меньше, поменять цвет и другие редакторские штуки. Видели бы вы монстриков, которые получались у меня сразу :) Ужас! Все то что на картинке, продукт 5-7-10-15 повторений каждой линнии. Нарисовал круг. Стер. Нарисовал. Стер. Нарисовал. Блин ну что за кривые руки. Стер. Нарисовал. О! Овал вышел ничего так. Рисуем глаза. Нарисовал. Стер. Нарисоавал... Ну вы поняли... Потому каждый монстрик у меня сейчас занимает минут 20-30. Работа эта медитативная и хорошо прочищает мозг. Потому я с удовольствием за нее берусь... Нарисовал монстрика, рефрешнулся и переключился обратно на работу...

Классное качество планшета моего еще в том, что он позволяет записывать то как ты рисовал. именно из этого я потом делаю ускоренное в 10 крат видео. Напомню, тут не видно всех тез 90% попыток, которые у меня не получались, а только те линии, которые остались в результате.


Так монстрик за монстриком. А чтобы показать из чего они были выбраны, предоставлю тут пару работ с ссылками на источники, с которых я срисовывал... Как говорится найдите 10 отличий :) или скорее совпадений.

Результат пошуку зображень за запитом "doodle"

(взято тут http://graffitipicture.com/cute-doodle-monsters-graffiti/)

Чтобы сравнить с тем, что у меня получается без подглядываний за работами других ребят. Вот :) Мой перфекционист негодует.


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

Так что весь опыт и все мастерство исчисляется СаняЧасами которые проведены за рисованием. У меня пока порядка 30-50 часов за всю историю. До 10 000, когда обещают стать мастером - мне еще далеко. Но я думаю, что хорошие результаты получаются намного раньше. 

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



пятница, 19 декабря 2014 г.

Как выучить java?

Решил тут собрать все рекомендации, что когда либо озвучивал для трейни у себя в блоге. Итак.

Статья о том, какой путь необходимо пройти чтобы уверенно себя чувствовать.

Рекомендации перед стартом по мотивам коучинга других стартующих джава тренинг
Книги:
Мотивирующие доклады - что ждет в компании и как готовиться к этому:
Описание моей программы Java Basic для тех, кто хочет сам менторить или же трейниться.

Процесс, который я рекомендую для менторинга учащегося, как я его называю пинг-понг - минимум времени ментора, максимум пользы трейни.

Пока это все, но дока будет расширяться.

Какие рекомендации новичкам можешь добавить?

ПриЁм

понедельник, 17 ноября 2014 г.

Slidecaster на javascript

Сегодня будем писать слайдкастер. Эту такая штука, которая в браузере позволит совместить слайды с аудио. Вместо того, чтобы писать avisynth скрипт вручную, дергая постоянно virtualdub, я буду загружать весь контент в браузер и мышкой мувать ползунки - где когда какой слайд начать. Удобно - я такую фичу на SlideShare видел. Хочу такую же! Бесплатно и для всех докладчиков.

В начале реализаици любой фичи идет ее декомпозиция на подзадачи, каждая из которых гуглится - т.е. решение можно за 5-10 минут найти в сети и попробовать у себя в интеграции с существущим кодом. Самое первое, что мне приходит в голову - это сделать банальный прогрессбар и научиться управлять им со скрипта. Вперед! Гуглим что-то типа "jquery progressbar" и смотрим что предлагает гугл. И первый же пример мне подходит! берем волшебный copy past driven development и копируем исходник себе в файлик 1.html, оставляя пометку // спасибо за http://jqueryui.com/progressbar/ чтобы не терять связь с автором.

Вот он код. Что я сделал - поменял заголовок. У нас жеж наше приложение. Добавил комментарий и пути к скриптам сделал абсолютными.
<!doctype html>
<-- thanks for http://jqueryui.com/progressbar/ -->
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Slidecaster</title>
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
    <script src="https://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
    <script>
        $(function() {
            $( "#progressbar" ).progressbar({
                value: 37
            });
        });
    </script>
</head>
<body> 
    <div id="progressbar"></div>
</body>
</html>
Вот как это выглядит

Сразу после этого я создам git репозиторий в той же папке что и скрипт и отправлю изменения в файловый рай.

Шаг второй - добавить сверху на прогрессбарчик мувалку - наверное это будет какой-то дивчик, который я смогу мувать по прогрессбарчику. Вместе с этим позиция прогрессбарчика будет меняться в точку где размещен дивчик - ползунок.

Задачу так же можно дробить. Для начала просто отрисую поверх прогрессбара дивчик. Потом научусь его мувать. Потом свяжу позицию с состоянием на прогрессбарчике. Вроде как не дробится больше.

Что надо сделать - добавить новый дивчик, задать ему стиль.
<!doctype html>
<!-- thanks for http://jqueryui.com/progressbar/ -->
<html lang="en">
<head>
    ...
    <script>
     ...
    </script>
    <style>
        .move {
            width: 2px;
            height: 40px;
            background-color: black;
            cursor: e-resize;
            position: absolute;
        }
    </style>
</head>
<body> 
    <div id="progressbar"></div>
    <div class="move"></div>
</body>
</html>
Идем дальше. Дивчик надо заставить муваться. Для понимания как это сделать гуглим "jquery drag div" и первая же статья наша. Добавили в скрипт строчку
$(".move").draggable();
Но теперь надо ограничить передвижения дивчика. Как? Гуглим "jquery draggable only x" и первый же ответ stack overflow наш. Добавляем вызов функции draggable один параметр
$(".move").draggable({ axis: "x" });
Еще один маленький штришок - надо сделать чтобы дивчик мувался по прогрессбару а не под ним. Добавим еще одну строчку.
$(".move").css("top", $("#progressbar").position().top - 5);
$(".move").height($("#progressbar").height() + 10);
Как это делается я помню, так как неоднократно делал уже. Но если че загуглить можно было бы по "jquery position get/change". Надо бы сохраниться! И посмотреть как это выглядит.


Следующий шаг - влиять на прогрессбар. И тут начинается самое интересное, поскольку оказывается, что тот прогрессбар, который предоставляется jquery немного не попиксельно перемещается. Вот как-то так изменилась функция.
$(function() {
    $("#progressbar").progressbar({  
        value: 0,  // позицию по умолчанию в ноль - там где и курсор
        max: $("#progressbar").width()     // количество делений прогрессбара такое же как и ширина 
    });
    $(".move").css("top", $("#progressbar").position().top - 5);
    $(".move").height($("#progressbar").height() + 10);
    $(".move").draggable({ axis: "x" }); 
   
    // добавили новый обработчик драга дивчика при его перемещении - меняется и состояние прогрессбара
    var drag = function(event){
        var pos = $(".move").position().left - $('#progressbar').position().left;
        $("#progressbar").progressbar("value", pos);
    };
       $('body').bind('drag', drag);
});
Посмотреть как это выглядит можно по этой линке или ниже в iframe.


Продолжение следует! А пока можешь погуглить в чем дело :)

воскресенье, 16 ноября 2014 г.

Рисовать просто - у тебя получится

Меня после доклада спрашивали, а как ты научился так рисовать? Камон! Каждый из нас умеет рисовать, но остановился в развитии где-то на уровне 6-летнего ребенка. Спасибо Наташе Трениной и ее тренингу Doodle Time - теперь я продолжил свое развитие в этом направлении у меня уже опыт 7-летнего ребенка. 

Алгоритм простой как двери.  Допустим ты хочешь нарисовать свою презентацию. Допустим слайд номер 5 у тебя - про нетворкинг. 

Делай раз - какое одно-два слова якорят текущий твой слайд? Сеть. Какие ассоциации приходят? Паук. Много мушек. Тут важно, что ассоциация у тебя может быть какой угодно - презентация ведь твоя. Допустим это паутина, а в углу сидит паук...

Делай два - гуглим по этим ключевым словам. Паук + паутина. Только на англиском. Добавляем к этому всему слово "doodle". И смотрим все рисунки, которые находим - что-то должно зцепиться за глаз. Выбираем то, что сами сможем срисовать - не слишком сложное, что-то дял нашего 6-летнего ребенка-художника. Значит гуглим "spider web doodle" в картинках и видим вот что 


Мне понравился вот этот милый паучок. И не сложно и симпатично


Делай три - срисовываем это. Срисовать можно подглядывая. Срисовать можно просто записав на планшет в качестве подложки исходную картинку. Если планшета с гарфическим пером нет, а я рекомендую обзавестись Samsung Galaxy Note Pro 12.2. Можно распечатать на принтере картинку и подложить под чистый листочик A4 - сквозь которого будет виден контур. Но лучше, конечно же срисовать "на глаз" - так больше + к опыту. Планшет же сохраняет все в векторной графике, так что можно рисовать одним цветом а потом разрисовать, нарисовать линию и стереть ее, если неудачная и так далее...


Внимание! Во-первых видео ускорено в 10 раз. Во вторых я пока рисовал раз 80 жмакал Ctrl-Z на планшете - линии выходили неудачные и кривые. То, что рисуется на видео - это лишь удачные штрихи вошедшие в продакшен. Это еще одна классная фича планшета. А вторая его классная фича - это запись того, как я рисую. Но пойдем дальше.

Паучка нарисовал, Теперь можно посмотреть на картинку и решить, чего в ней не хватает. А потому

Делай четыре - дорисуй деталей. Тут как в создании чего-либо с чистого листа. Вначале ты пишешь/рисуешь/играешь/кодишь первую линию, потом смотришь и решаешь чем этой линии стать. Дорисоываешь детали. Потом детали к деталям и так далее, пока внутренний цензор не успокоится. Срисовывая картинку важно разбить ее на ряд примитивов - дуга, линия, элипс, которые накладываются послойно друг на друга. Мелкие детали рисуются в самую последнюю очередь.

Делай пять - разукрась в цвета. Так же итеративно. По чуть-чуть. Цветовую палитру выбери такой, чтобы от слайда к слайду сформировать у читателя привычку - заголовок синим, основной текст черным, герой зеленым, антигерой красным и так далее... Все на глаз, пока тебе самому не понравится. Можно показать кому-то, но лучше не стоит - поскольку замечаний будет масса - 6-летнего ребенка покритиковать любой может, а вот подбодрить...

Делай шесть - не заморачивайся и быстрее отправляй в продакшен. Если один слайд выглядит неуклюже, то 10 слайдов в том же стиле выглядят как стильная задумка. Просто нафигачь 20 слайдов как нибудь. Потом отложи на день, а после возьми снова в руки исправь детали. После можно сразу в продакшен :)

Делай семь - с презентацией надо выступить. А после выступления обязательно выложить ее в сеть. Если на конференции тебя посмотрели 100 участников, то в сети тебя увидят 1000. Конференция - как способ вытащить из тебя инфу - весь сок в сети.

Как-то так. 

суббота, 2 ноября 2013 г.

Делаем видео панораму

На простых фото панорамах (в том числе сферических) я уже сгрыз все локти.


И вот сутра собирая материал для очередной, пришла идея - а что, если смонтировать видео панораму? Но как? А ХЗ, но точно знаю одно - без сырцов никаких панорам не будет, потому снял 5 видеороликов секунд по 30.

Снимал точно так же как и для фото-панорам - кадры должны перекрываться % на 30, чтобы программа могла найти на них общие точки и смерджить. После поспешил домой, дабы поэксериментировать.

Первым делом полез в гугл и нашел там статью, в которой это самое "КАК?" расписано по самое не могу.  Суть вкратце в том, чтобы сделать видеопанораму надо разобрать ее на серию кадров (каждый кадр, как отдельная фотка), склеить первые кадры из всех видеороликов и создать на основе этого проекта темплейт, по которому прогнать все остальные кадры. После полученные панорамы конвернуть в видео с исходной частотой.  Ну что, цель видна! Вперед.

Исходный материалом будет 5 видеороликов продолжительностью около 20 секунд. Снимал на Nikon, потому формат MOV. Я точно помню, что VirtualDub Mod умеет разбивать видео на кадры и чтобы его подружить с MOV форматом я воспользовался этим советом. Итого у меня получилось как-то так


Каждый видеофайл (avs) по очереди я перегнал в серию bmp изображений и разместил их в отдельных папках. Поехали!

Открываю первый файл в VirtualDub Mod и выбираю на нем интервал, который мне больше всего нравится. Ползунком (1) выбирается положения начала, после чего кликается кнопка (2), затем выбирается конец фрагмента и нажимается кнопавка (3).


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

Во втором и следующих видео (чуть позже) я буду выбирать диапазон отталкиваясь от того, что я выбрал на первом - так как съемка велась не синхронно с 5 камер, а последовательно с 1, то надо совместить периодичность того, что меняется (у нас это волны) на всех 5 выборках. Конечно же мне не удастся найти 5 одинаковых момента, но все же можно найти приблизительно похожие колебания.


После того как я определился с диапазоном я удаляю все, что было до него и после него. Делается это так. Ctrl-X, Ctrl-A, Del, Ctrl-V.

Кстати, на картинке выше можно увидеть насколько перекрываются разные ракурсы.

После того, как в окно VirtualDub Mod перетащил первый аvs файл, выбрал меню File -> Save image sequence... (1) после в диалоге добавил к расширению файла суффикс _N (2), где N - номер видеоролика по порядку. Это надо сделать - так как формат, который кушает следующая программа - [номер кадра]_[номер камеры].[расширение]. Дальше указал папку (3) (для удобства я пока все кадры одной камеры/ракурса сохраняю в отдельную папку). Выбрал bmp (4) как формат без потерь (осторожно в результате на винте будет очень много места скушано). Поставил галку (5), что значит что я сейчас не хочу процессить эту задачу, а добавлю ее в список ожидания. Аминь! (6) Затем перетягиваю в окно программы следующий avs файл и проделываю то же самое, только теперь N=2 и результирующая папка тоже другая.


В результате появилось 5 новых папок, по одной на каждый видеоролик. В каждый папке большое число изображений формата bmp (и каждая весит около 2Gb на 15 секунд видео).


После того, как я опроцессил все видяшки, я удаляю лишнее. Например в первом ролике у меня 16 секунд видео и 390 кадров. Значит в остальных папках можно смело удалять все файлы с номером от 391 и выше.  

Следующие грабли, которые я попытаюсь исправить - это то что я снимал с рук, а не со штатива. Дело в том, что с рук камера немного ходит туда сюда, а качания камеры не синхронны - это сильно испортит результирующую картинку. Значит вывод №1 - снимать сырцы только со штатива. Если это сделать, то следующий этап можно пропустить.

А выравнивать кадры будем вот так. Понадобится нам программа PTGui в нее загружаем все 390 кадров из первой папки (путем выделения и перетаскивание файлов в окно программы). Есть один нюанс, не позволяющий нам перетаскивать сразу все файлы - их порядок нарушится внутри программы. Потому перетаскиваем вначале файлы с номерами 0-9, потом 10-99 а потом 100-999 и так далее 1000-9999 (для продолжительного видео).

При перетаскивании выскочит диалоговое окно (просто в bmp раскадровке нет информации о линзах фотоаппарата, а потому надо ему помочь) - нажимаем Normal Lens (1) дальше в самой программе жмем Align Images (2) и ждем, пока обработаются все фотки серии.


Так мы заставим программу найти общие точки на каждом кадре и выровнять их тем самым устранив качание камеры в руках.


Может случиться глюк и кадры выравняются как-то не так. Потому после зайдем в Panorama eitor (1) и убедимся, что все кадры наложились один на другой (2).

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

Дальше нам нужно указать границы по которым программа обрежет фотки в результате. Делается это путем перемещения границы на то место, где она должна быть (1-4). Тут шахматная доска - это то что будет залито черным цветом - его нам в результате не надо.


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

Вот например у меня на 87 кадре (1) такое случилось (2) и я опустил чуть ниже шахматки желтую границу (3). Самое обидное тут то, что чем дольше снимаешь с рук - тем сильнее уползает камера.



Далее на вкладке Project Assistant (1) нажимаем Advenced (2)



После  на вкладке Create Panorama (1) выбираем размер панорамы максимлаьный (2), указываем, что хотим в результате получить все слои (3) указываем папку, в которую поместим результат (4) и создаем панораму (5).



После в папке ...\1\pan\ появится множество jpeg файлов. Теперь можно удалять исходные bmp - они нам больше не понадобятся.

Ту же процедуру стоит проделать и с другими bmp из других ракурсов.  

Теперь можно заняться поклейкой кадров ракурсов в серию панорам. Подробней об этом.

Для начала в каждой папке с jpeg кадрами ракурса я сделал несложное переименовывание всех файлов в общий формат. Делается это с помощью простого bat-ничка (текстовый файл с расширением bat) с содержимым
rename *.jpg ?????_1.jpg
Это у нас будет первый ракурс. bat для второго ракурса будет
rename *.jpg ?????_2.jpg
И так далее... После выполнения bat файла все файлы переименуются как-то так и порядок их будет строго в порядке увеличения номера кадра.

 
Вслед за этим сливаем все кадры-ракурсы в одну папку.


И первую серию 00000_1 ... 00000_5 отправляем в PT Gui. Там выбираем Normal Lens (1), кликаем Ok (2) и клеим панорамку (3)


Быть может понадобится нам немного выровнять ее, сшить вручную или подкорректировать то, что предложил автомат - это ручная работа. В результате нам надо добиться того, чтобы панорама была максимально ровной. Так же в Panorama Editor стоит обрезать края, как мы это делали раньше. 


Дальше нам стоит отправиться на последнюю вкладку PT Gui и там настроить все как на картинке


Можем собрать панораму и посмотреть как получилось, но это вовсе не обязательно. Нам надо сохранить проект как


Имя стоит выбрать template.pts

После этого потребуется джарник, который я написал для этих целей (есть возможность воспользоваться встроенным в PTGui батчером, но у меня были с ним проблемы и я написал свой). Конечно же для работы с ним понадобится установить java.
Команда выполняется так 'java -jar batch-builder.jar [1] [2] [3] [4] [5]', где:
[1] - Номер первого кадра панорамы (обычно 0)
[2] - Номер последнего кадра панорамы
[3] - Номер первой камеры/ракурса (обычно 1). Все последующие рассчитываются в зависимости от количества кадров в одной панораме.
[4] - (опционально) Имя файла сохраненного проекта pts (по умолчанию 'template.pts')
[5] - (опционально) Формат имен файлов кадров (по умолчанию '%image_%camera.bmp',
                    где %image = задает позицию номера кадра, а %camera - позицию номера ракурса')
[6] - (опционально) задает количество символов в части имени %image.
                    Если параметр равен 0 или не указан, то сичтается что исходные изображения будут называться
                        1_1.bmp, 2_1.bmp, 3_1.bmp ... 10_1.bmp ... 100_1.bmp
                    Если параметр равен, например 6, то ожидается работа с исходными изображениями в формате
                        000001_1.bmp, 00002_1.bmp, 000003_1.bmp ... 000010_1.bmp ... 000100_1.bmp
Итого выполняем команду
D:\pan>java -jar batch-builder.jar 0 390 1 template.pts %image_%camera.jpg 5
Процессинг кадров с номерами [0-2] от для камер начиная с номера 1,
файл шаблона - 'template.pts', формат кадров '%image_%camera.jpg', для номеров кадров включено дополнение до длинны 5.
Обработка началась!
Количество камер в темплейте - 5
Обработка прошла успешно!
В результате в исходной папке появятся так же и файлики от 0_panorama.pts до 390_panorama.pts, открыв любой из которых можно посмотреть склеенную панораму для определенного кадра.

Теперь открываем PTGui, в нем в меню Tools->Batch sticher


И дальше перетягиваем в новооткрытый диалог все тепленькие pts файлы. Тут же начнется сборка панорам.


 Через несколько минут (в зависимости от количества кадров и размера исходных изображений) все будет готово. В исходной папке появятся файлы с 0_panorama.jpg и до 390_panorama.jpg.


Теперь их можно склеить в видео используя уже знакомый нам VirtualDubMod. Для этого выбираем File->Open video file


Далее выбираем первый по порядку файл 0_panorama.jpg (1) и выделяем галочку (2) и открываем (3).


Все файлы загрузятся последовательно. Уменьшим изображение, чтобы оно помещелось на экране - правой кнопкой мыши (1) а потом выбрать (2) процент по-меньше. После запустим плеер и просмотрим результат (3).


 Если VirtualDub крешнулся как у меня - не расстраиваемся. Открываем его с начала и загружаем все рисунки. После можно просмотреть кадр за кадром пользуясь кнопками Влево/Вправо...
 
Теперь нам осталось выбрать кодек и сжать видео. Идем в Video-Compression


Выбираем какой-то подходящий кодек. 


Выбираем очень большой битрейт



Иногда бывает так, что кодек накладывает на исходное видео ограничение (например ширина и высота кадра кратна 4) - в таком случае надо кропнуть размер кадра.

Но наш кодек не накладывает никаких ограничений, а потому мы кроппинг можем скипнуть. На всякий опишу как он делается - меню Video-> Filters


Потом добавить NullTransform фильтр


Дальше выделить его (1) и кликнуть Cropping (2), а на нем обрезать сверху и слева на столько пикселей, чтобы результирующий размер (1) соответствовал требованиям кодека.


Дальше нам надо выйти из этих диалогов. И зайти в File-Save as...


Выбрать имя файла и сохранить видео.

Конечно что-то может пойти не так. А потому надо немного потраблшутить. С вопросами пиши в комментах. Если с кодеком получается лажа (большой файл, скушать не может) значит надо попробовать сохранить видео в несжатом виде. При этом размер будет просто огроменный, но гарантированно будет. После видео можно ужать другими видеоредакторами.



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

вторник, 12 июня 2012 г.

Ловим молнию на мыльничку

Ночь. На улице гроза. Сверкает. Жутко и в то же время красиво. В кармане есть мыльничка, но прошлый опыт подсказывает, что ничего толкового со съемки молнии на фотик не получится. Ан-нет. Есть возможность поймать молнию даже мыльничкой.


Для этого нужно сделать несколько несложных шагов.

Во многих фотиках (в cannon точно) эта кнопка имеет 3 состояния – нажата, отжата и слегка нажата. В слегка нажатом состоянии фотик видит перед собой картинку и фокусируется на нее (если автофокус) и подбирает размер диафрагмы/выдержку/ISO (смотря что за режим выбран). Если мы немного дожмем кнопку, то фотик сделает снимок с тем, что ему удалось настроить.

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

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

Секрет состоит в том, чтобы настроиться где-то на стороне, а потом переместить камеру в место съемки и продолжить фоткать там. Делаем это так.

Включаем серийную съемку (режим, при котором пока не отпустим кнопку спуска фотографирование не прикратится). Наводим фотик на какую-то яркую лампу которая находится на расстоянии 4-5 метров от нас и немножко прижимаем большую круглую кнопку спуска затвора.

Наша цель – лампа в фокусе, а задержка 1/100 при 200 ISO. Сем меньше задержка тем короче будет молния. Чем больше зедержка тем длиннее, но есть вероятность засветить кадр.

Когда эти цифры увидели на дисплее – не дергая пальцем перемещаем фотик в сторону молний и дожимаем кнопку до конца не отпуская, пока не поймаем молнию.

Держать иной раз прийдется долго. Я могу сделать 200 фоток, пока найду момент. Помочь может несколько вещей: уменьшить разрешение и качество фотографии которая запишется на флешку или поставить более быструю флешку. Потому как при 1/100 можно теоретически сделать 100 фотографий, но время записи на флешку чаще больше и потому ждать приходится больше.

воскресенье, 16 октября 2011 г.

Java for fun: Пишем приложение на Android: Первый запуск

Привет.Попишем немного под Android.

Идея проекта проста как двери. Я программист, а потому часто забываю, сидя за компом, сделать важные вещи - попить водички, сходить размяться, позвонить домой семье, сделать перерыв, сходить покушать, уделить время другим сегодняшним задачам. Нужно напоминать. Это все можно было реализовать под Windows и установить на рабочий компьютер. Более того такая программа уже есть, и это все не то. Смартфон - это не рабочий компьютер, это что-то похожее на зубную щетку - ближе к телу что-ли, а потому приложение-напоминалка, написанное для смартфона, будет полезнее (чем то же, но для стационарного компьютера).

Итак все начинается с установки окружения. Много времени уделять этому не стану - в сети полно мануалов по установке рабочего окружения. Скажу лишь только, что надо установить Eclipse IDE for Java Developers (у меня Indigo), JDK6, Android SDK, плагин ADT для Eclipse. Ну и все. Если будут с этим проблемы - дай знать, и я напишу мануал на эту тему.

Итак окружение же установлено - будем создавать проект. Открываем рабочий workspace в Eclipse (рабочий workspaсe - вот завернул). Создаем там новый Android проект.



Он имеет какую-то структуру. Предлагаю проглянуть ее по диагонали, чтобы если найдем какой-то код в сети, то знать приблизительно куда его вставить.




Некоторые из них автоматически генерируются системой - нам легче :)

Итак первое что хотелось бы сделать - это при запуске выдавать диалог, с одним единственным сообщением "сходи отдохни!". Вторым шагом зацепим таймер. Третьим - сделаем возможным конфигурировать интервалы. Далее - больше сообщений. Потом еще что-то :) Но для начала - простой диалог при запуске.

Посмотрим насколько самодостаточно генерированное Eclipse приложение - запустим его.

Для начала нам надо подключить телефон через USB кабель к компьютеру и настроить его. После подключения телефон предложит (либо нет) выбрать режим подключения


Так же надо сделать доступной отладку через USB


Добраться до этих двух окошек настроек, должно быть не сложно - после подключения телефона к компьютеру на его task bar (или как он там называется) засветятся две иконки.


Растянем окно с текущими задачами, там можно добраться до соответствующих настроек.


Чтобы это все получилось, на компьютере должен быть установлен драйвер Android устройства


Вообще-то при подключении телефона к компьютеру Windows определит новое устройство, и тут надо бы указать драйвер из папки


А драйвер этот скачивается при обновлении AndroidSDK. Для этого запускаем Android SDK and AVD manager


Потом выбираем драйвер и жмем установить


После установки появится папка с драйвером.

Могут быть трудности типа Windows не может найти драйвер, тогда в свойствах нового неизвестного оборудования (телефон без установленного драйвера в Windows Device Manager будет отмечен как устройство с иконкой - желтый вопросительный знак - вот его свойства и надо посмотреть)


Теперь откроем файл android_winusb.inf на редактирование и добавляем туда две строки одинаковые строки в два раздела (код берется из свойств устройства)


После этого Windows должна найти в папке "...\android-sdk-windows\extras\google\usb_driver" драйвер


Если и это не помогло - пиши в комменты к посту, попробуем разобраться.

Хух, после этого всего шаманства можно пробовать запустить Android приложение через Eclipse.


Запуск прокатил не с первого раза, но со второго все получилось.


На экране я заметил вот такую картинку.


Кстати, чтобы сделать скриншот с телефона надо запустить "Dalvik Debug Monitor". Делается это просто запуском команды ddms в консоли


Консольное приложение находится в папке с установленной AndroidSDK


И если оно не запустилось, то вероятно в переменных окружения Windows не прописана переменная ANDROID_HOME


+ в переменной Path не указана папка tools


Если все ок, то увидим окно дебаггера, где выберем подключенное устройство + меню Device->Screen Capture.


А дальше сохраним скриншот


Итак наше приложение работает. Но я хотел диалоговое окно с кнопкой OK, а не окно на весь экран. Исправим!

Вот то, что я хочу сделать :) Только чтобы текст был мой, а не какой-то там "Ой! Ошибка!"


Правильно иль нет я создал диалог - узнаем в будущем, пока мне достаточно - я увидел на экране то, что хотел.

Кстати вот книга, в которой я подглядел код для создания диалогового окна. Хороша для новичков.

Продолжение, как всегда, следует...