Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

понедельник, 31 октября 2011 г.

jQuery. Выбрать все опции в мультиселекте.

Длинный способ
$(document).ready(function() {
    $("#selectall").click(function() {
        $("#mylist").each(function(){
            $("#mylist option").attr("selected", "selected"); });
    }) ;
 
    $("#unselectall").click(function() {
        $("#mylist").each(function(){
            $("#mylist option").removeAttr("selected"); });
    }) ;
 
});
Короткий способ
// выбрать все
(function($){
   $('form select option').prop('selected',true);
})(jQuery)

// отменить все
 
(function($){
   $('form select option').prop('selected',false);
})(jQuery)

Linux. cdrecord.

Узнаем адрес устройства
leon@Berta:~$ cdrecord -scanbus
scsibus1:
 1,0,0 100) *
 1,1,0 101) 'HL-DT-ST' 'DVDRAM GH22NS50 ' 'TN03' Removable CD-ROM
 1,2,0 102) *
 1,3,0 103) *
 1,4,0 104) *
 1,5,0 105) *
 1,6,0 106) *
 1,7,0 107) *
Очищаем перезаписываемый cd
leon@Berta:~$ cdrecord -v dev=1,1,0 blank=fast
Пишем iso-образ
leon@Berta:~$ cdrecord -v dev=1,1,0 /home/leon/debian-6.0.3-powerpc-netinst.iso

пятница, 28 октября 2011 г.

Ubuntu. Обновился до 11.10 Oneiric Ocelot.

Все что сделано в сторону Unity и Gnome Shell не прет вообще.
Возвращаем старый добрый gnome, насколько это возможно ...
Выбираем в настройках системы автовход для своего пользователя.
sudo apt-get install gnome-session-fallback
sudo /usr/lib/lightdm/lightdm-set-defaults -s gnome-classic

На панели все двигаем придерживая alt и нажимая среднюю кнопку
alt + правая кнопка - добавить на панель

В итоге получилось вот так

Ubuntu. Глюк c редактированием меню GNOME.

Пробовал отредактировать меню, удалить приложения wine из секции Прочие - меню слетело полностью.
Оказалось, что файл меню ~/.config/menus/gnome-applications.menu - абсолютно пуст.
Запускаю alacarte (утилита редактирования меню) из консоли, результат:
Traceback (most recent call last):
File "/usr/bin/alacarte", line 37, in 
main()
File "/usr/bin/alacarte", line 33, in main
app = MainWindow(datadir, version, sys.argv)
File "/usr/share/alacarte/Alacarte/MainWindow.py", line 49, in __init__
self.editor = MenuEditor()
File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 36, in __init__
self.__loadMenus()
File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 48, in __loadMenus
self.applications.dom = xml.dom.minidom.parse(self.applications.path)
File "/usr/lib/python2.6/xml/dom/minidom.py", line 1918, in parse
return expatbuilder.parse(file)
File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 924, in parse
result = builder.parseFile(fp)
File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 211, in parseFile
parser.Parse("", True)
xml.parsers.expat.ExpatError: no element found: line 1, column 0

В итоге почистил в ~/.local/share/applications/ все что связано с wine, удалил ~/.config/menus/gnome-applications.menu
Завершил сеанс. Меню вернулось к своему первоначальному состоянию.

понедельник, 24 октября 2011 г.

Flash Media Server. Запись потока.

Возникла у меня идея - сохранять трансляции на стороне сервера, так, чтобы при каждой публикации потока создавался новый файл с unix timestamp в имени. И важно чтобы имя потока не менялось, оно прописано в клиенте трансляции. Я как человек практически незнакомый с actionscript, flex, fms и тд, полез в документацию по серверному as и не обнаружил никаких способов получить текущее время на стороне сервера. Допускаю, что такие методы таки есть ...
Но до лучших времен пришлось писать вот такого динозавра с запросом к клиентской части:

клиент app.mxml
<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"    
layout="absolute" creationComplete="init()"> 
<mx:Script>

...

private function init():void
{ 
      // Объект подключения к серверу
      nc = new NetConnection();
      // Клиент - текущий объект приложения
      nc.client = this;

      ...
}

// метод приложения возвращающий timestamp
public function getCurTime():Number
{
      var now:Date = new Date();
      return now.time;
}

...


сервер main.asc
// Разрешаем отладку
// Отладку смотрим в логах fms, ...logs/_defaultVHost_/webcast/_definst_/
application.allowDebug = true;

// Обработчик результата вызова метода клиента
TimeHandler = function()
{
    // Обработчик получения результата
    this.onResult = function(curTimestamp)
    {
        // Формируем имя файла потока
        file = "cast" + curTimestamp;
        trace('Attempt to save the file: ' + file);
        // Пишем поток
        // По-умолчанию все пишется в каталог streams/_definst_ приложения
        // Это можно изменить, создав файл Application.xml
        // и прописав там пути в определенных секциях
        stream = Stream.get(file);
        stream.play("webcast");
        stream.record();
    }
 
    this.onStatus = function(info)
    { 
        trace("Failed with code:" + info.code); 
    } 
};

// Обработчик события публикации потока
application.onPublish = function (clientObj, streamObj)
{
    // Вызываем клиентский метод, передаем обработчик, как параметр
    // обязательно должен быть метод свойства NetConnection.client
    clientObj.call("getCurTime", new TimeHandler());
};

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

пятница, 21 октября 2011 г.

Javascript. Работа с cookie.

function createCookie(name,value,days)
{
    if (days)
    {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++)
    {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0)
            return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name)
{
    createCookie(name,"",-1);
}

суббота, 15 октября 2011 г.

Flash Media Server. Хостинг.

Для своего небольшого flex-приложения для трансляции звука и видео с веб-камеры и микрофона я нашел вот этот хостинг http://www.influxis.com.
Для тестирования идеален тариф Intro за 20$ в месяц. Количество соединений ограничено - 20.
Поддержка мне понравилась, отвечают быстро, очень вежливы.
Если учесть, что хостинг нужен будет время от времени, лучшего варианта я не нашел. Учитывая что подписка adobe 65$/мес + расходы на выделенный сервер + установка и настройка fms на сервере.
Про покупку лицензии я промолчу ;-).

Оплата картой visa, регистрация заняла минуты 2 и все, сервер готов к использованию.

Географическое расположение сервера на выбор: штаты, Англия, Голландия.

среда, 5 октября 2011 г.

Flex. Flash Media Server живая трансляция c помощью веб-камеры и микрофона.

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

Выводим живое изображение с камеры ... app.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"    
layout="absolute" creationComplete="init()"> 
<mx:Script>

    import mx.controls.Alert;
    import mx.core.UIComponent;
    import flash.net.NetConnection;
    import flash.media.Microphone; 
    
    private var nc:NetConnection;
    private var ns:NetStream;
 
    private function init():void
    { 
        // Подключение к медиа-серверу
        nc = new NetConnection();
        nc.client = this;
        nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
        nc.connect("rtmp:/webcast");
    }
 
   // Fix for AS3
   public function onBWDone():void {} 
 
   private function onNetStatus(event:NetStatusEvent):void
   { 
        if (event.info.code != "NetConnection.Connect.Success")
        {
            Alert.show(event.info.code);
            return;
        }
        
        var vContainer:UIComponent = new UIComponent();
        
        var mic:Microphone = Microphone.getMicrophone();
        
        var camWidth:int = 640;
        var camHeight:int = 480;
        
        var cam:Camera = new Camera();
        cam = Camera.getCamera();
        cam.setMode(camWidth, camHeight, 24);
        
        var localvid:Video = new Video(camWidth, camHeight);
        localvid.attachCamera(cam);
        vContainer.addChild(localvid);
        
        canvasVideoIn.addChild(vContainer);
        ns = new NetStream(nc);
        ns.attachCamera(cam);
        ns.attachAudio(mic);
        ns.publish("webcast");
    }
 
 </mx:Script>

 <mx:Canvas width="700" 
               height="550" 
               y="50" 
               horizontalScrollPolicy="off"
               verticalScrollPolicy="off" 
               x="20" 
               backgroundColor="0xcccccc" 
               id="canvasVideoIn">

 </mx:Canvas>
 
 </mx:Application>

Клиентский скрипт client.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"    
layout="absolute" creationComplete="init()"> 
<mx:Script>

    import mx.controls.Alert;
    import mx.core.UIComponent;
    import flash.net.NetConnection;
    
    private var nc:NetConnection;
    private var streamIn:NetStream;  
    private var videoIn:Video;
 
    private function init():void
    { 
        nc = new NetConnection();
        nc.client = this;
        nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
        nc.connect("rtmp:/webcast");
    }
 
   // Fix for AS3
   public function onBWDone():void {} 
 
   private function onNetStatus(event:NetStatusEvent):void
   {         
        if (event.info.code != "NetConnection.Connect.Success")
        {
            //Alert.show(event.info.code );
            return;
        }
        
        videoIn = new Video(320, 240);
        var videoHolder:UIComponent = new UIComponent();
        videoHolder.addChild(videoIn);
        canvasVideoIn.addChild(videoHolder);
        streamIn = new NetStream(nc);
        videoIn.attachNetStream(streamIn);
        streamIn.play("webcast");
    }  
 
 </mx:Script>

<mx:Canvas width="320" 
              height="240" 
              y="50" 
              horizontalScrollPolicy="off" 
              verticalScrollPolicy="off" 
              x="20" 
              backgroundColor="0xcccccc" 
              id="canvasVideoIn" />

 </mx:Application>

Flex. Событие click.

<mx:Script>
...
private function clickHandler(event:MouseEvent):void
{
    Alert.show('hello!');
}
</mx:Script>
...
<mx:Button id="Record" label="Record" y="500" click="clickHandler(event)"></mx:Button>
...

вторник, 4 октября 2011 г.

PHP. Запуск процессов сервера из браузера без ожидания загрузки страницы.

Как писалось тут PHP. Как послать браузеру ответ и продолжить выполнение, так вот когда такое делаем, то не забываем послать вывод скрипта в /dev/null или еще куда в файл.

Adobe Media Server. Настройка.

Для того чтобы зайти в административную консоль сервера надо отредактировать файл конфигурации.
Хотя я указал пароль администратора при установке, но зайти все равно не мог !!!
Файлы конфигурации лежат в каталоге /opt/adobe/fms/conf/, все действия от суперпользователя.
leon@Berta:/opt/adobe/fms$ sudo ls /opt/adobe/fms/conf/
_defaultRoot_  fms.ini Logger.xml  Server.xml Users.xml
leon@Berta:/opt/adobe/fms$ sudo gedit /opt/adobe/fms/conf/fms.ini

В файл добавляем строку ...
...

SERVER.ADMIN_PASSWORD = xxxxxxxx
...

Перезапускаем админ сервер ...
leon@Berta:/opt/adobe/fms$ sudo ./fmsmgr adminserver restart
Admin server:fmsadmin command:restart
Stopping Adobe Flash Media Admin Server (please check /var/log/messages)
Admin Server has shutdown...

Starting Adobe Flash Media Admin Server (please check /var/log/messages)

Аллилуйя !!! Можно зайти в админ консоль, которая лежит тут:
file:///opt/adobe/fms/tools/fms_adminConsole.htm
Так что просто открываем в браузере.

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

Adobe Flash. Отключаем кэширование swf в firefox.

В firefox есть неприятный момент, даже если мы перекомпилируем as браузер загружает swf из кэша и мы не видим никаких перемен ...
1. Открываем новую вкладку
2. Переходим about:config в url
3. Соглашаемся быть очень осторожными и слушаться маму
4. Ставим browser.cache.disk.enable в false
browser.cache.memory.enable в false

Adobe Flash. Установка flash player debug в Ubuntu 64 bit.

К сожалению не существует debug версии для 64bit от adobe. Но есть и хорошие новости, если устанавливаем через apt то получаем 32bit версию с враппером, позволяющим запустить в 64bit браузере. После этого наша задача подменить плагин отладочной версией.

Установка для последнего на данный момент firefox 7.0.1.

1. Удаляем любые установленные плагины flash
leon@Berta:~/Soft/flashplayer_10_plugin_debug$ aptitude search flash
p   flashbake                                                              - automated snapshots with git                                                     
i A flashplugin-installer                                                  - Adobe Flash Player plugin installer                                              
i   flashplugin-nonfree                                                    - Adobe Flash Player plugin installer (transitional package)                       
p   flashplugin64-installer                                                - Adobe Flash Player plugin 64 bit alpha installer                                 
p   flashrom                                                               - Рапознавание, чтение, запись, очистка и проверка BIOS/ROM/FLASH чипов            
p   flashybrid                                                             - automates use of a flash disk as the root filesystem                             
p   m16c-flash                                                             - Flash programmer for Renesas M16C and R8C microcontrollers                       
p   python-webflash                                                        - Portable flash messages for Python WSGI applications                             
p   tvflash                                                                - Mellanox firmware update utility                                                 
p   vrflash                                                                - tool to flash kernels and romdisks to Agenda VR 

...

leon@Berta:sudo apt-get purge flashplugin-nonfree
leon@Berta:sudo apt-get autoremove


2. Устанавливаем плагин:
leon@Berta:sudo apt-get install flashplugin-nonfree

3. Качаем отладочную версию
http://download.macromedia.com/pub/flashplayer/updaters/10/flash_player_10_linux_dev.tar.gz

или http://kb2.adobe.com/cps/142/tn_14266.html

4. Заменяем установленный плагин отладочным
leon@Berta:cd ~/Soft/flashplayer_10_plugin_debug
leon@Berta:~/Soft/flashplayer_10_plugin_debug$ sudo mv libflashplayer.so /usr/lib/flashplugin-installer/
leon@Berta:~/Soft/flashplayer_10_plugin_debug$ sudo cp -r usr /

И что важно !!! копируем каталог usr в корень, без этого не работало.

5. Перезапуск firefox

Отладочный плеер стоит !!! При этом flashbug работает !!!

суббота, 1 октября 2011 г.

Flash Media Server. Установка.

1. Качаем сервер с сайта adobe http://www.adobe.com/products/flashmediaserver/
для linux

2. Качаем flex sdk http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK

3. Устанавливаем сервер.
Распаковываем архив, читаем readme, секцию про установку для linux.
По умолчанию сервер ставится в /opt/adobe/fms.
Код серверной части будет лежать в /opt/adobe/fms/applications.
Там будем создавать приложения, каждое в отдельном каталоге.

4. Устанавливаем sdk (инструметы разработки flex)
Распаковываем архив в любое удобное место (/home/leon/dev/flexsdk).
Настраиваем окружение:
echo "PATH=\${PATH}:~/dev/flexsdk/bin" >> ~/.bashrc
Перезапуск терминала ...

leon@Berta:~$ mxmlc
Загрузка файла конфигурации /home/leon/dev/flexsdk/frameworks/flex-config.xml
Adobe Flex Compiler (mxmlc)
Version 4.5.1 build 21328
Copyright (c) 2004-2011 Adobe Systems, Inc. All rights reserved.

Ошибка: Необходимо указать целевой файл

См. справку "mxmlc для получения информации об использовании командной строки.

5. Проверяем подключение к серверу.
Код клиентской части лежит на хосте веб-сервера (apache) /var/www/fmstest.
Веб-сервер настроен так что доступ по http такой http://localhost/fmstest.
В fmstest создаем файл FMS3Connect.as
В который копипастим код из одной ценной книги ...
package
{
      import flash.net.NetConnection;
      import flash.display.Sprite;
      import flash.text.TextField;
      import flash.events.NetStatusEvent;
    
      public class FMS3Connect extends Sprite
      {
            private var nc:NetConnection;
            private var rtmpNow:String;
            private var msg:String;
            private var connectText:TextField;
            private var posX:Number;
    
            function FMS3Connect ()
            {
    
                 nc=new NetConnection();
                 nc.addEventListener (NetStatusEvent.NET_STATUS,checkConnect);
                 //rtmpNow="rtmpe://192.168.0.11/connect";
                 rtmpNow="rtmpe:/connect";
                 nc.connect (rtmpNow);
            }
            private function checkConnect (event:NetStatusEvent):void
            {
                 connectText=new TextField();
                 msg=event.info.code;
                 connectText.width=250;
                 connectText.text=msg;
                 addChild (connectText);
                 posX=connectText.stage.stageWidth;
                 connectText.x=(posX/2)-((msg.length/2)*(6));
                 connectText.y=175;
            }
      }
}




Для редактирования кода использую Komodo Edit.

Компилирую скрипт:
mxmlc -static-link-runtime-shared-libraries=true -optimize=false -omit-trace-statements=false /var/www/fmstest/FMS3Connect.as

Результат - файл /var/www/fmstest/FMS3Connect.swf

Создаем каталог серверной части приложения /opt/adobe/fms/applications/connect

В браузере переходим http://localhost/fmstest/FMS3Connect.swf

Должны увидеть NetConnection.Connect.Success

Запуск сервера ./fmsmgr server fms start