понедельник, 20 августа 2012 г.

Stora и Samsung 2012

Пару недель назад привезли мне новые телевизоры UE40ES5500 и UE32ES6757. Но общая радость, а особенно детей, т.к. 32" телевизор предназначался для детской, была недолгой. Встроенный AllShare Play видел домашние медиа-серверы с фильмами, мультфильмами и фотографиями, но при подключении писал, что список содержимого пуст.
Как оказалось, что-то не так в "королевстве" Samsung с протоколом DLNA или, возможно, отстает Mediatomb в развитии.
Техническая поддержка Samsung, как я и полагал, ответила, что технически устройство исправно, обновите прошивку и радуйтесь. Как будто они не знают, что при подключении телевизора со Smart TV к сети, первое, что он сделает - обновится!
В общем, как обычно, "спасение утопающих - дело рук самих утопающих". После долгих поисков и разочарований вышел на следующее решение.
Но, решение надо проверить. Тем более, оно рассчитано на, так сказать, полноценный Mediatomb с исходными текстами и компиляцией, а в моем случае использовалcя скомпилированный пакет для NetGear Stora, а вернее для nix'ов внутри нее.
В общем, с помощью друга на виртуальной машине была поднята Ubuntu 11.04. Под нее был скомпилирован Mediatomb с поддержкой javascript и указанным выше патчем. Надежды оправдались! Телевизоры увидели новый медиаплеер в сети, успешно к нему подключились, показали содержимое каталога и даже пытались проигрывать фильмы. Очевидно, из-за нехватки ресурсов попытка проиграть фильмы больше 2 Гб приводили к исчезновению связи с медиасервером.
Разумеется, такое не устроило меня и после недолгих раздумий на домашний "недосервер" была установлена та же Ubuntu 11.04 со всеми полезными пакетами: sshd, vsftpd, transmission, mediatomb, samba.
Подцепить сетевые хранилища удалось с помощью samba. В /etc/fstab прописал:

//192.168.10.5/FamilyLibrary/Audio /home/bsdadm/FamilyLibrary/Audio cifs user=Alxd,password= password 0 0
//192.168.10.5/FamilyLibrary/Video      /home/bsdadm/FamilyLibrary/Video cifs user=Alxd,password=password 0 0
//192.168.10.6/FamilyLibrary/Photos     /home/bsdadm/FamilyLibrary/Photos cifs user=Alxd,password= password 0 0

В настройке Mediatomb пришлось изменить mimetype для mkv в файле /etc/mediatomb/config.xml:
было map from="mkv" to="video/x-matroska"
стало map from="mkv" to="video/x-msvideo"

Кроме этого, там же изменил custom-http-header, чтобы заработали кнопки управления проигрывателем на пульте телевизора:

      add header="transferMode.dlna.org: Streaming"
      add header="contentFeatures.dlna.org: DLNA.ORG_OP=11;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000"

Также, в настройке Mediatomb включил ffmpegthumbnailer, т.к. на Ubuntu он заработал без проблем (NAS не поддерживает).

Отмечу, что на Ubuntu установленным на "железо" Mediatomb работает очень быстро. И еще, интересно, что некоторые фильмы, которые наотрез отказывались проигрываться посредством Mediatomb установленным на NAS, теперь начали проигрываться без проблем! В общем, теперь, можно просматривать фильмы, фотографии и домашние видеозаписи на любом телевизоре или переносном устройстве с поддержкой DLNA! И все это управляется с телевизионного пульта каждого телевизора!

Дополнение 1:
Ждал подобного комментария. Скачивайте mediatomb и устанавливайте в ubuntu командой apt-get install *.deb


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

Yii и дерево

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

Критерии:
  1. Источник данных - база данных mysql.
  2. Данные должны располагаться в одной таблице (можно и больше, но мне и одной хватило).
  3. Иерархичность должна обеспечиваться одним полем записи - ParentID (в моем случае - pid).
  4. Таблица данных должна формироваться на стороне mysql (хранимая процедура).
  5. Результат должен быть представлен в виде дерева похожего на "аккордеон".
  6. У каждой записи должен быть доступен набор команд.

Внешний вид, который планировалось получить и который получился в итоге:
Widget получил название  AlxdDataTree. Позволяет отобразить упорядоченный иерархический набор данных в виде раскрываемого как "аккордеон" дерева.
Входные данные для AlxdDataTree:
  1. Данные должны передаваться в AlxdDataTree в виде массива записей упорядоченных так, как они будут отображаться в дереве.
  2. Обязательно должны присутствовать поля: id - идентификатор; title - наименование, которое будет отображаться в дереве; level - уровень записи в дереве; count - количество записей в родителе.
  3. Перечень доступных команд для записей должен описываться в виде массива.
В путь...
Прежде всего, мне потребовалось создать таблицу и написать хранимую процедуру для получения данных, которые будут переданы контроллеру, а позже -  AlxdDataTree. 
Таблица получила название classificator. Вот ее перечень полей:

Описание полей:
id - уникальный идентификатор каждой записи
pid - идентификатор родителя
oid - идентификатор владельца классификатора
code - системное имя классификатора
name - наименование классификатора
createtime - дата создания записи
modifytime - дата изменения записи
Пример хранимых данных:

Следующим шагом стало написание хранимой процедуры. Мне понадобилось две хранимые процедуры. Первая используется рекурсией, вторая вызывается из контроллера и возвращает конечный результат.
Первая процедура получает на входе id родителя и его текущий level. Вторая процедура получает на входе oid владельца классификатора. Если владелец как таковой не нужен, можно удалить соотв. поле oid из таблицы и убрать входной параметр oid. Разумеется, придется поправить и сами процедуры.
Результат выполнения процедуры Call getClassificators(1):

Затем создал модель classificator с помощью Gii и контроллер с CRUD операциями. В коде действия Admin добавил следующее:
$classificators = Yii::app()->db->createCommand('call getClassificators('.$oid.');')->queryAll();

$this->render('admin',array(
'classificators'=>$classificators,
));
где, $oid - идентификатор владельца классификатора.

Как следствие, надо пришлось поправить и файл вида admin.php. Удалил в нем widget создающий CGridView. Добавил следующее:
$this->widget('ext.AlxdDataTree.AlxdDataTree', array(
'data'=>$classificators,
'idField'=>'id',
'titleField'=>'name',
'levelField'=>'lvl',
'countField'=>'cnt',
)
);

Как видно, AlxdDataTree расположен в каталоге extension в папке AlxdDataTree. Вот так:

Результат работы приложения:


Вот и все!

А вот и AlxdDataTree со всеми стилями, скриптами, картинками и sql-запросами. Никакой регистрации приложения в Yii не требуется, достаточно просто распаковать архив в папке extension. Файлы sql исключительно для примера и на работу самого widget'а не влияют. Каждый может написать свою процедуру для получения конечной таблицы данных.



среда, 23 мая 2012 г.

Новенькое в ATable 8.x (май 2012)

Описывать исправленные ошибки как всегда не стану, они были, есть и будут есть. Без них никто не пишет. Стараюсь делать код стабильнее и "непадучее".
Из новенького...
1. Пополнил наконец-то список свойств таблицы в окне свойств объекта


2. Добавил подсвечивание выбранных ячеек в чертеже


3. Добавил опцию управления таблицей через командную строку и выбор ячеек мышкой (пока тестовый режим и не все субопции работают)


Пока все. Удачи!

Таблицы ATable 6.x превращаются в ATable 8.x

Я точно знаю, что на нашей Земле много пользователей, которые использовали и, вероятно, до сих пор используют, ATable 6.x (в основном версию 6.8). В первую очередь для них я написал модуль ATable6x2Grid, который включил в пакет ATable for AutoCAD 2012, который позволяет импортировать таблицы сделанные в старой версии 6.х в новый редактор версии 8.х.

Импорт описывать нет смысла, он вызывается из меню:

























Потом на чертеже достаточно выбрать таблицу сделанную в ATable 6.х и все! Удачи в работе!

AlxdExtension


Хочу отдельно написать о модуле AlxdExtension, который предназначен в первую очередь для добавления математических функций в ATable for AutoCAD, но может быть использован и без последнего.
В настоящий момент в AlxdExtension всего 2 дополнительные функции:
Sum – сумма всех передаваемых параметров. При суммировании отбрасываются те параметры, которые не могут быть интерпретированы как число.
Пример на Lisp: (sum 1 2 a b) результат 3
Пример в ATable: =sum(1;2;a;b) результат 3

Sumproduct – сумма произведений всех передаваемых значений. Значения должны передаваться списками равной длины.
Пример на Lisp: (sum '(1 3) '(2 2)) результат 8
Пример в ATable: =sum(A1:A2;B1:B2) результат 8

вторник, 17 апреля 2012 г.

Excel2Grid

Обычная задачка, которая возникает наверное у каждого проектировщика каждый день. Выполнил некий табличный расчет в Microsoft Excel, а оформить его надо бы в чертеже AutoCAD. Вот только копирование через буфер из Microsoft Excel в Autodesk AutoCAD не очень красивое. Кто-то мирится с получаемым результатом, кто-то ищет обходные пути, в конечном счете, оба пути верные.
Я предпочел пойти вторым путем и написал модуль Excel2Grid, который позволяет перенести выбранный диапазон ячеек из Microsoft Excel в редактор таблиц ATable с минимальным искажением результата.
Вот пример таблицы, которую используют специалисты строительного отдела:


 Вот так выглядит лист, на котором надо разместить эту таблицу.


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


В редакторе таблиц ATable в меню Таблица выбрать пункт Импорт из Excel....


В диалоговом окне Excel2Grid необходимые вернуть ссылку нажатием кнопки Ссылка и указать параметры импорта.
Многие параметры говорят сами за себя, а некоторые я поясню:
Использовать размер диапазона из Excel - означает, что размер импортируемой таблицы будет определен исходя из диапазона выбранных ячеек в Microsoft Excel, а не исходя из размера таблицы ATable.
Коэф. преобразования размеров - коэффициент применяемый для преобразования ширины и высоты ячеек из единиц измерения Microsoft Excel в единицы измерения AutoCAD.
Вписать ширину таблицы в - игнорирует коэффициент преобразования размеров и рассчитывает его исходя из размера в который надо вписать таблицу. Например, в моем случае, таблица будет вписана в 395 мм по ширине.


Если все параметры указаны и ссылка определена можно смело жать Обновить и наслаждаться процессом переноса таблицы в ATable.


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


Нарочно показываю результат импорта крупно, чтобы было видно, что учтено и объединение ячеек, и поворот текста и т.п.


Добавлю, что Excel2Grid позволяет не только выполнить единовременный импорт данных из Microsoft Excel в ATable, но и установить связь между таблицей и файлом xls. После закрытия Excel2Grid записывает ссылку и параметры импорта в свойства таблицы ATable. Таким образом, если "экселевский" файл претерпит изменения, все их можно увидеть в чертеже вызвав команду обновления таблицы не открывая ATable!

Итак, две команды:
atUpdateExcel2Grid - обновить выбранные таблицы в соответствии с ссылками.
atUpdateAllExcel2Grid - обновить все таблиц в соответствии с ссылками.
В итоге, все изменения "экселевских" файлов отразятся в таблицах ATable!
Одно лишь требование, пути к файлам Excel'а не должны меняться, иначе обновление не получится. Но это не проблема для тех, у кого четко структурировано хранение документов. :)
Удачи!


Pseudo2Grid

Pseudo2Grid - уникальный модуль, посредством которого можно перенести псевдо-таблицы из чертежа AutoCAD в таблицу ATable for AutoCAD. Но прежде, чем дальше объяснять как им пользоваться, сперва надо определиться с терминами.
Псевдо-таблица - это таблица начерченная примитивами AutoCAD'а, т.е. линиями, полилиниями и текстом. Внешне набор примитивов похож на таблицу, но работать с ним как с таблицей не получится.
В общем, выглядит это примерно так:

Знакомо? Часто попадаются такие таблицы и их надо поправить или дополнить? Начнем?

Предполагается, что в ATable уже есть подходящий стиль таблицы. Если его нет - не беда, можно и без выбора стиля. Но я все таки покажу, как выбрать стиль таблицы.
В меню Стиль выбираем пункт Выбрать стиль....


В появившемся диалоговом окне надо найти подходящий стиль. В моем случае, он находится в папке Технология производства.


Применяю его к текущей таблице и получаю в чертеже таблицу с шапкой и колонками нужной ширины. Красота!


В меню Таблица выбираю пункт Импорт ручной таблицы.... Вызов команды отправит меня в командную строку AutoCAD'а.

Выбираю секущей рамкой примитивы таблицы. Все разом без разбора: линии, текст, полилинии.


На рисунке ниже видно, что именно попало в выборку. Если результат выбора устроил, можно жать Enter.


Магические преобразования и псевдо-таблица превратилась в таблицу ATable. 


Разумеется, не стоит ожидать однозначного переноса внешнего вида таблицы в редактор таблиц ATable. Но главное, перенесен текст. Он разнесен по колонкам и ячейкам. Теперь таблицу уже несложно причесать до нужного вида и можно вносить изменения любой сложности.
А если исходная таблица большая? Представьте себе, сколько времени экономит этот модуль!
Кстати, преобразованную таким образом псевдо-таблицу можно из ATable скопировать через буфер обмена в Microsoft Excel или Microsoft Word! Тоже неплохое подспорье!