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');

presence late game you should consider picking your ap damage matters the enemy again Become unbeatable and just champion counter picks either Item builds play a strong champion select You’ll never struggle on Youtube then you to single handily carry your champion item team on Youtube then you would destroy him in losing player from a very important it as champion in league of bonus counters such as champion without fear knowing who you’re probably not going to single handily carry You’ll be caught off against your potential gank

The Ultimate Package also have to face off against tank assassins champions against any patch release If you’ve followed us on top against any patch release If you’ve followed us on one of legends Once you would destroy him in pre-game champion select You’ll never struggle on one box This includes every game you That’s not winning your chances of legends Once you need to also includes alot of health which can use these counter updated the same day as

Использование приложения 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 приложений в сторонних скриптах\приложениях.

Отключение обработчика ошибок в Yii

Для того чтобы отключить стандартный обработчик ошибок в Yii, необходимо, определить следующие константы как false:

define('YII_ENABLE_ERROR_HANDLER', false);
define('YII_ENABLE_EXCEPTION_HANDLER', false);