Hackaton — первый день

Подходит к концу первый день хакатона. Небольшой отчет по первому дню.

Что получилось сделать за этот день:

  • Реализовали прототип удаленного управления нашими стробоскопами. С помощью него каждый может попробывать поиграться с нашим прототипом, заходите сюда, единственное задержка на нашем канале youtube примерно 30 секунд. Реализованы две веб-морды на PHP — Silex’e и Boostrap’e и Erlang — Chicago Boss. К этому всему добавилась логика в Arduino nano и магия с настройками сетей)
  • Убедились, что ethernet-кабелю можно запитывать лампы. По ним мы будем питать наши лампы.

Проблемы с которыми сегодня столкнулись:

  • Для работы Arduino ей необходимо какое-то время на инициализацию, соотвественно не возможно с ней работать по схеме сервер-клиент, клиенту приходится выставлять таймауты, что есть очень ни очень. Решили проблему, написав небольшой сокет сервер, который по сути открывает блочное устройство на чтение \ запись и вещает на свободный порт. Все внешние приложение уже общаются с портом прозрачно.
  • Инфраструктура. Из нас ни кто не имеет реального опыта в работе с arduino и вообще железом. Приходится подтягивать мат.часть на ходу.
  • Не успели все, что хотели подготовить к завтрашнему дню по аппаратной части.

Завтра должно быть продакшен решение, поэтому будет жарко. Смотрите за нами на нашем канале и нашими друзьями.

Сравнение двух phpinfo()

Часто для разработки используются один сервер, а рабочий проект лежит на другом сервере и возникает необходимость чтобы настройки среды были одинаковы. Чтобы сравнить настройки php есть такая простая функция, которую все разработчики узнают одну из первых — phpinfo(). Но настроек там много и сравнивать все флаги глазами ни очень приятно, а если еще не знаешь, что ищешь, то вообще беда. Не много погуглив нашел решение, которое удовлетворяет поставленной задаче вполне — сравнить два phpinfo. Теперь просто приведу код:
На 1ом сервере, создаем файл и пишем в него следующий код:

<?php echo serialize(ini_get_all()); ?>

На 2ом сервере, создаем файл и пишем не много более «сложный» код:

<?php 
function ini_flatten($config) { 
    $flat = array(); 
    foreach ($config as $key => $info) { 
        $flat[$key] = $info['local_value']; 
    } 
    return $flat; 
} 
function ini_diff($config1, $config2) { 
    return array_diff_assoc(ini_flatten($config1), ini_flatten($config2)); 
} 
$config1 = ini_get_all(); 
$export_script = 'http://servername1.ru/filename.php';
$config2 = unserialize(file_get_contents($export_script)); 
$diff = ini_diff($config2, $config1);
?> 
<pre><?php print_r($diff) ?></pre>

На выходе получаем массив, такого виду:

Array
(
    [error_log] => /work/www/project.loc/log/php.log
    [expose_php] => 1
    [extension_dir] => /usr/lib/php5/ext/
    [include_path] => .:/usr/share/php:/usr/share/pear
    [max_execution_time] => 30
    [open_basedir] => 
    [safe_mode] => 
    [session.gc_probability] => 1
    [session.save_path] => /work/www/project.loc/sessions
    [upload_tmp_dir] => /work/www/project.loc/tmp
    [xdebug.auto_trace] => 0
    [xdebug.collect_assignments] => 0
    [xdebug.collect_includes] => 1
 )

Относительные пути при работе с кроном

При разработке консольных приложений, которые будут выполняться по крону, есть свои особенности. Одна из таких — это пути. Можно сделать рабочие консольное приложение, протестировать его, но попробовав запустить его через крон поймать ошибок связанных с использованием относительных путей при подключение внешних файлов и т.п. Для того чтобы такого не произошло в «индексном» файле стоит указать:

chdir(dirname(__FILE__));

Использование JS кода в описание событий компонентов Yii

Часто встречаются вопросы, как в описание события компонента Yii написать JS код? Рассмотрим данный вопрос на примере конфигурации виджета CJuiTabs(просто было отображение с этим виджетом под рукой ;)). После загрузки виджета, необходимо показать alert() с надписью It’s work!.

$this->widget('zii.widgets.jui.CJuiTabs', array(
    'tabs'=>array(
        'StaticTab 1'=>'Content for tab 1',
        'StaticTab 2'=>array('content'=>'Content for tab 2', 'id'=>'tab2'),
    ),
    // additional javascript options for the tabs plugin
    'options'=>array(
        'onload'=>'js:alert("It's work!")',
    ),
));

Главная особенность в том, что необходимо при написание JS кода, необходимо сначала указать js: и дальше уже писать код.

'onload'=>'js:alert("It's work!")',

CClienScript — вызов цепочкой

С выходом Yii 1.1.5, хотелось бы отметить возможность вызова CClienScript «цепочкой». Вот что это из себя представляет:

Yii::app()->clientScript->registerCssFile('/css/screen.css')
                        ->registerCssFile('/css/print.css')
                        ->registerCssFile('/css/main.css')
                        ->registerCssFile('/css/form.css')
                        ->registerScriptFile('/js/highlight/highlight.pack.js')
                        ->registerScriptFile('/js/jquery.utils.js');

Использование приложения Yii в сторонних скриптах\приложениях

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

out.php

// путь до фреймворка
$yii=dirname(__FILE__).'/yii/framework/yii.php';
// путь на конфигурационного файла
$config=dirname(__FILE__).'/protected/config/main.php';

require_once($yii);
// инициализируем приложение
Yii::createWebApplication($config);

Теперь данный файл можно подключить, там где это необходимо.

// подключаем наш файл
include "out.php";
// делаем запрос 
$command = Yii::app()->db->createCommand("SELECT COUNT(*) FROM '{{users}}");
$count = $cmd->queryScalar();
// выполняем экшен(ы)
Yii::app()->runController('site/index');
Yii::app()->runController('articles/list');
//логинем пользователя
$identity = new UserIdentity($username,$password);
if($identity->authenticate())
    Yii::app()->user->login($identity);

Это простой пример, который демонстрирует возможность использования ваших Yii приложений в сторонних скриптах\приложениях.