Экспозиция представлена костюмами и аксессуарами из коллекции Александра Васильева.
Очень выразительный подбор экспонатов, показывает настроения и эволюционный путь развития моды.
Экспозиция представлена костюмами и аксессуарами из коллекции Александра Васильева.
Очень выразительный подбор экспонатов, показывает настроения и эволюционный путь развития моды.
Кое как освободил место на диске. Установил VIDA. Теперь знаю, как устроена моя машинка.
Вчера разобрал обшивку, что бы пустить под ней провод для регистратора. Тот, который к регистратору прилагался, сильно длинный (около 3-х метров), и от этого мешается в салоне, а кроме того, занимает нелишний разъём прикуривателя.
В процессе оказалось, что длинных mini-USB кабелей у меня нет. Оригинальный, на всякий случай, разбирать не стал. Так с полуразобранным салоном прокатился за 30 минут до закрытия магазина в ТЦ Кристиине и взял там идеально подошедший кабель.
Установка заняла не более 10 минут. Оказалось, что под обшивкой потолка неимоверное количество свободного места. Самым сложным оказалось протянуть кабель от стойки к бардачку, потому как там везде пеноизоляция и USB разъём постоянно за неё цеплялся.
Запитался от выведенного также в бардачок USB разъёма от магнитолы.
Сама разборка и последующая аккуратная сборка были по времени гораздо дольше установки. В VIDA не указано наличие некоторых неожиданных защёлок. Поэтому когда вроде всё открутил, а аккуратное подёргивание не помогает снять деталь, то приходилось тщательно изучать где же там ещё что-то может держать. В конце концов, оказалось, что просто надо сильнее выдёргивать. Защёлки надёжные, не поломаются.
Следующий шаг — установка радиатора охлаждения ГУР. Для этого надо будет снимать бампер и, возможно, вентилятор с блока радиаторов охлаждения.
Лежала у меня уже давно старая вспышка FIL 11M произведённая местным заводом Norma в советские времена.
На вспышке имеется высоковольтный синхроконтакт, который идеально согласуется с плёночными фотоаппаратами Zenit.
Теперь время плёночных аппаратов уже прошло и им на смену пришли цифровые. Однако принципы фотографии не поменялись и свет, в том числе от вспышки по прежнему нужен. Наигравшись со вспышкой Canon EX420, я решил добавить в схему освещения вторую вспышку. Брать оригинальные вспышки — удовольствие не дешёвое, а китайские — лотерея. Подумал, что можно как то использовать имеющуюся в наличии старую вспышку.
Гугление показало, что на современных камерах синхроконтакт низковольтный, поэтому нужно делать переходник. Однако, провода — не очень удобный способ связи вспышки и фотоаппарата и существуют способы световой синхронизации, когда вторая вспышка срабатывает по свету от первой. Так как свет доходит от вспышки до синхронизатора практически мгновенно, а время срабатывания и съёмки относительно этого продолжительны, то можно считать, что обе вспышки в таком случае работают одновременно.
Дальнейшие поиски вывели меня на отличный сайт osipoff.ru, где обсуждается различная электроника связанная с фотовспышками и имеется большое количество схем синхронизации.
Я быстро нашёл простую схему, с большим количеством положительных отзывов, под названием «Mercedes», от разработчика Верютина. Схема рассчитана на синхронизацию высоковольтных вспышек, с напряжением до 300 В, что как раз соответствовало характеристикам FIL 11M. Собирать стал из того, что есть под рукой и стараясь уложиться в минимальные габариты, а соответственно использовал в основном SMD детали. Так как под рукой были только резисторы типоразмера 0805, а они рассчитаны на напряжение не более 150 В, то пришлось большое сопротивление на 22 МОма набирать из нескольких, последовательно соединённых.
Синхронизатор заработал с первого раза. К сожалению тут же выяснилось, что схема не подходит для синхронизации с современными фотоаппаратами, которые делают 2 вспышки на кадр. Одну слабую для оценки освещённости и для дальнейшей установки диафрагмы и потом вторую, расчётной мощности. Со светосинхронизатором «Mercedes», вспышка срабатывала по предварительной вспышке и кадр был недосвеченным в момент съёмки.
Пошерстив форум на сайте, я обнаружил несколько схем для синхронизации по второй вспышке. На этот раз я не стал брать схему Верютина, так как она была несколько странно оформлена. Да и деталей таких уже не осталось. Зато нашёл другую, аналогичную, и взялся за неё. На сборку ушло раза в 2 больше времени и с первого раза схема синхронизатор не заработал. Проверив схему тестером, нашёл одно место, где отсутствовало соединение и запаял его. Синхронизатор тут же начал уверенно работать. На этой схеме имеется переключатель срабатывания либо по первой, либо по второй вспышке. Проверил работу в обоих режимах. Схема работает безупречно.
Теперь жду возможности устроить какую-нибудь фотосессию с новыми схемами освещения.
FTDI, крупный производитель полупроводников, недавно выпустил обновление драйверов для популярных устройств, которые «отключают» устройства изготовленные с использованием поддельных микросхем. Это вызвало волну негодования среди пользователей, потому как они практически не имеют возможности установить, используются ли в купленных ими устройствах настоящие или поддельные микросхемы. К счастью, FTDI убрал это обновление на данный момент. Кроме того имеются способы восстановления работоспособности устройств с поддельными микросхемами. Тем не менее компания по прежнему не оставляет своих планов по написанию таких драйверов, которые бы мешали пользоваться поддельными микросхемами. По подробнее об этом можно почитать, например, здесь: FTDI наносит ответный удар
Но взглянем на микросхему, о которой речь.
FT232RL — чрезвычайно удобна. Она служит мостом между виртуальным последовательным портом на кампьютере и UART на устройстве. Помимо этого, она поддерживает режим bit-bang, который позволяет реализовать программную поддержку многих протоколов (например SPI, I2C, и т.д.). В довесок идёт внутренняя схема, которая позволяет подключаться как линиям данных как при напряжении 5В, так и при 3,3В.
С точки зрения программирования, необходимо лишь подключить устройство с FT232 к порту USB, установить драйвер и вот уже есть доступ к виртуальному последовательному порту. Нужен режим bit-bang? Тогда скачиваете библиотеку с описанием на сайте FTDI и пользуетесь.
Идеальная железка для любых проектов, не смотря на заявленые цены.
Но обычно, такие устройства подключают по одному. Другие устройства уже общаются с компьютером через основное.
Что же делать, если ты разработчик и нужно подсоединить несколько устройств одновременно?
Подключаем и Бам! Ничего не работает.
После некоторого времени проведённого в экспериментах и выдирании волос с головы, обнаруживаем в Диспетчере Устройств следующую картину:
Все устройства пытаются занять один и тот же виртуальный порт и в результате ни одно из них не может общаться. Почесав затылок, можно обнаружить, что для каждого устройства, можно руками поменять номер порта в свойствах. Удобно ли? По моему абсолютно нет.
Но взглянем же в документацию. Она нам говорит, что номера портов назначаются последовательно. На самом деле, FTDI?
Эта ошибка присутствует ещё с самого первого релиза микросхемы.
Неужели не нашлось времени её починить? Неужели борьба за копирайт отнимает все ресурсы, и ведётся даже путём ухудшения репутации компании?
Разбирал старые фотографии и наткнулся на этот залаз.
Удалось побывать на крыше здания Морской Академии в пору его заката, а ныне пустующего.
Ранее руки не доходили до обработки и склейки панорам снятых сверху, и вот наконец, публикую фотоотчёт.
Все картинки кликабельны. Полноразмерные фотографии доступны из фотогалереи на gallery.dmmedia.org
Проводили нас мимо охранника под видом кадетов. Для чего пришлось прилично одеться и снять с рюкзака отражатели.
Читать далее
Давно ничего не писал и тому была причина. А имя той причине 3D принтер RigidBot.
После почти двухлетнего ожидания исполнения кампании на Kickstarter, я наконец то получил принтер. Взнос делал за сборный вариант, размерами 25х25х25 см. Вес посылки составил 19 килограммов. Кроме того мне пришлось заплатить дополнительно за международную пересылку, так как основатель кампании Майкл Лундвол вышел за рамки бюджета, постаравшись, что бы кампания удалась.
Довелось как-то посмотреть на такой девайс изнутри. К сожалению, не догадался отснять процесс ремонта.
Принесли его мне с симптомами, что устройство не видно компьютером и вроде как кто-то умудрился подключить к нему кабель USB B перевернув на 180 градусов.
Первыми мыслями были про выгоревший регулятор питания или предохранитель. Открыв корпус, однако, ни явно сгоревших деталей, ни постороннего запаха я не обнаружил. Проследил на сколько мог цепи питания и не нашёл предохранителя, зато сразу же обнаружился LDO регулятор, переводивший 5В в 3.3. Самым странным оказалось, что с помощью мультиметра не смог прозвонить цепь питания от USB разьёма до входа регулятора. Дорога после феррита просто ныряла через переходное отверстие в глубинные слои платы и больше нигде не прозванивалась. Ничего похожего на предохранитель или защитный диод или транзистор я так и не смог где-либо найти.
Подключение питания давало появление 5В в начале цепи вплоть до переходного отверстия. Дальше видно было только пару десятков милливольт. Не обнаружив никаких замыканий, в том числе в регуляторе, я соединил куском медного провода переходное отверстие, после всех фильтров питания, со входом LDO регулятора. И девайс ожил. Светодиоды загорелись и по очереди моргнули, винда нашла новое устройство и стала устанавливать к нему драйвер.
Установив софтину с родного сайта диагноста, я подключил устройство ещё раз и убедился, что все функции работают, соответствующие светодиоды моргают, насколько это было возможно без кабеля, который можно было бы подключить к автомобилю.
Таким образом, я сделал вывод, что где-то во внутреннем слое не выдержала дорога питания или переходное отверстие, в результате КЗ, которое случилось, когда кабель USB был подключен в неправильном положении и питание подавалось на схему в обратной полярности. Аккуратно кинул провод от переходного отверстия ко второй части цепи питания, убедился, что нигде ничего не греется, собрал прибор и вернул его владельцу.
Недавно получил, заказанные с eBay, тачпад с 16 клавишами, на базе чипа TTP229.
К сожалению продавец не предоставил никакой документации по этому модулю, а так же нет её и на просторах интернета. Поиск даташита на микросхему TTP229 дал несколько неудовлетворительные результаты, потому как в свободном доступе даташита именно на ту ревизию микросхемы, что используется в модулях, попросту нет. Однако нашлись даташиты на другие ревизии, а кроме того, на одном китайском блоге, нашлось сравнение всех ревизий микросхем.
С этой информацией уже можно было работать. Я отследил какие дороги, как подключены к выводам чипа и узнал его распиновку и конфигурацию. Оказалось, что по умолчанию схема настроена на работу только с первой группой из 8 клавиш. Допаяв на плату отсутствовавшие разьёмы-гребёнки, я получил возможность с помощью перемычек менять настройки.
Всего с двумя дополнительными перемычками заработали все 16 клавиш, и кроме того поменялся режим выхода с активного низкого, на активный высокий. Для быстрого тестирования и демонстрации принципов работы с модулем, набросал простенький скетч для Arduino, который можно найти в моём репозитории на GitHub https://github.com/dmmedia/TTP229B_16keypad. Загрузив скетч и подключившись к Arduino через SerialMonitor, можно наблюдать события нажатия и отпускания или смены кнопок.
Далее в планах переписать этот скетч в полноценную библиотеку, и начать использовать модули в моих экспериментах и проектах. Модули довольно хорошо для этого подходят: они тонкие, особенно если заменить разьём-гребёнку на паянные перемычки и провода, там где это надо. Клавиатуру модуля можно закрыть плёночной или бумажной мембраной с собственным дизайном. А цена на эти модули позволяет покупать их пачкой, вместо того, что бы тратить своё время на изготовление.
Бесконечное количество раз уже упоминалось в интернете о том, что все строковые параметры, особенно те, что приходят от пользователя, не только желательно, но и даже обязательно нужно экранировать при использовании в SQL запросах.
Однако снова и снова открываешь какой-нибудь энтерпрайз проект и видишь что то наподобие этого:
CString sql = "SELECT * FROM categories WHERE category = '" + category + "'";
где category
никем не проверяемая и неэкранированная переменная, которую создают прямиком из введённых пользователем данных.
Ведь практически каждая современная СУБД позволяет через свой API либо автоматически, во время подготовки запроса(prepared statements), либо в ручную, вызвав спец. метод экранировать такие строки. Но нет, кто-то продолжает писать код на коленке, когда надо по быстрому сдать проект. По моему надо учить обработке пользовательских данных буквально на любом курсе программирования, что бы потом это было на уровне рефлексов. А не так как сейчас, где некоторые темы на курсах совсем не затрагиваются или обращается мало внимания на качество кода.
Для того, что бы удалить эелемент из контейнера типа vector, string, list или deque мы пользуемся методом erase, которому параметром передаём итератор на ненужный элемент.
В какое то время, происходит оптимизация кода или же изначально закладывается возможность поиска ненужного элемента с помощью алгоритма STL remove_if.
Далее код обрастает использованием boost::bind для удобства и прочими артефактами.
И тут в какой то момент становится нужно удалять не один элемент, а несколько. Неважно, в новом коде, или же расширяя возможности старого. И здесь многие новички в C++ делают ошибку, не зная и не посмотрев в документацию метода erase. Они копируют по примеру код, написанный ранее и переделывают условие поиска элементов для remove_if. Но они забывают, что если методу erase передаётся один аргумент, то этот метод удаляет именно тот элемент, итератор на который был передан аргументом.
Для удаления нескольких элементов существует перегруженный метод erase, который принимает два аргумента — на начало и конец итеративной последовательности, подлежащей удалению. В большинстве случаев, когда используется алгоритм remove_if, он реорганизует последовательность так, что все элементы не подлежащие удалению переставляются в начало контейнера. Например, у нас есть vector
1 2 3 1 2 3 1 2 3
Если вызвать
bool IsTwo (int i) { return (i == 2); }
tstart = remove_if(v.begin(), v.end(), isTwo)
//удалить элемент со значением 2 из контейнера v
получится
1 3 1 3 1 3 ? ? ?
где ? — некий мусор. Итератор tstart, который возвратит remove_if, будет указывать на первый мусорный элемент, в этом случае на третий с конца. Мусорные элементы могут иметь те же значения, что и до вызова remove_if, то есть 1 2 3, а могут иметь и любые другие, на это полагаться не стоит. Размер контейнера остается неизменным.
Таким образом, если мы запишем полный кусок кода, с которым работает новичок, то получится следующее:
v.erase(remove_if(v.begin(), v.end(), isTwo));
Соответственно erase удаляет первый мусорный элемент и изменяет размер контейнера на единицу. В результате содержимое контейнера начинает выглядеть так:
1 3 1 3 1 3 ? ?
что является неправильным и соответственно приводит к непредсказуемым последствиям при дальнейшей работе с этим контейнером.
Как же не допускать такого? Когда, разработчик не уверен в своих знаниях, то хорошим тоном будет проверить их по документации и узнать, что если вызвать erase таким образом:
v.erase(remove_if(v.begin(), v.end(), isTwo), v.end());
то все мусорные элементы будут удалены.
Если же разработчик уверен (иногда случается ложная уверенность, это нормально), то тестирование всё равно никогда не бывает лишним. Причём не ленимся, и пишем пограничные варианты тестов в том числе. В нашем случае, мы должны проверить на вскидку не только правильность удаления одного элемента, но также нескольких, и ни одного, и конечно же случай, когда контейнер вообще пуст.