четверг, 26 декабря 2013 г.

redmine контакты сотрудников на домашней странице

правим файл /usr/share/redmine/app/views/welcome/index.html.erb вставляем туда код
    <% if User.current.logged? || !Setting.login_required? % >
     <div>
       <h3>Контакты</h3>
      <% if User.current.admin? %>
   <table>
       <%User.find(:all).each do |user|%>
    <% if user.active? %>
          <tr>
       <td style="text-align: left;">
         <a href="#<%=user.id%>"><%=user.firstname%> <%=user.lastname%></a>
       </td>
       <td style="text-align: left;">
         <a href="mailto:<%=user.mail%>"><%=user.mail%></a>
       </td>
          </tr>
    <% end %>
       <%end%>
   </table> 
      <% end %>
       </div>
 <% end %>

вторник, 24 декабря 2013 г.

var_dump для redmine и rails


<% if User.current.logged? || !Setting.login_required? %>
 <%=User.current.to_json%>
<% end %>
или
<% if User.current.logged? || !Setting.login_required? %>
 <%=debug n%>
<% end %>
Еще одним полезным инструментом будет консоль. В случае если вы ставили редмайн как rails приложение. Ну тоесть не как написано у меня в блоге.
Нужно выполнять в папке с приложением (возможно предварительно придется сделать /bin/bash --login)
$rails console --sandbox
Можно получить всех пользователей выполнив u = User.find(:all)
u.each{ |user| puts user.id}
(Прокрутите консоль вверх чтобы увидеть результат.) выход ctrl + D все транзакции откатятся.

я нахожусь в начале пути по изучению rails (надеюсь и переходу) по этому попрошу гуру меня сильно не пинать.

поле быстрого перехода по задачам в redmine

создаем поле быстрого перехода по задачам в redmine в подходящее место в app/views/layouts/base.html.erb файле вставляем
 <% if User.current.logged? || !Setting.login_required? %>
    <div>
        <form id="go_issues" action="/issues/">
                <script>
                        $(function(){
                                $("#issues_go").click(function(){
                                        document.location.href = $("#issues_base_url").attr("value") + $("#issues_numer").attr("value");
                                        return false
                                });
                                $("#go_issues").submit(function(){
                                        document.location.href = $("#issues_base_url").attr("value") + $("#issues_numer").attr("value");
                                        return false
                                });

                        });
                </script>
                <input style="height: 10px;"  type="hidden" id="issues_base_url" name="issues_base_url" value="/issues/">
                <input style="height: 10px;" type="text" id="issues_numer" name="issues_numer" value="" />
                <!--
                <input style="height: 10px;" type="button" id="issues_go" value="Перейти" />
                -->
        </form>
    </div>
 <% end %>

понедельник, 9 декабря 2013 г.

ubuntu skype шипит


На Ubuntu 12.10 программа v4.1.0.20, тоже звук искажался, но помогло это:
Откройте файл '/etc/pulse/default.pa'
найдите строку 'load-module module-udev-detect'
и замените ее на 'load-module module-udev-detect tsched=0'
*везде без кавычек.
После чего перепустите pulse коммандой pulseaudio --k и скайп.

четверг, 21 ноября 2013 г.

создаем раскрывающиеся списки проектов в redmine

правим  файл
vim app/views/projects/index.html.erb

вставляем туда следующий javascript

<% content_for :header_tags do %>
    <%= auto_discovery_link_tag(:atom, {:action => 'index', :format => 'atom', :key => User.current.rss_key}) %>
<% end %>

<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %> <%= link_to(l(:label_issue_view_all), issues_path) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %> <%= link_to(l(:label_overall_spent_time), time_entries_path) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %> <%= link_to l(:label_overall_activity), { :controller => 'activities', :action => 'index', :id => nil } %>

<%= l(:label_project_plural) %>

<%= render_project_hierarchy(@projects) %>
<% if User.current.logged? %>

<%= l(:label_my_projects) %>

<% end %> <% other_formats_links do |f| %> <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> <% end %> <% content_for :sidebar do %> <%= form_tag({}, :method => :get) do %>

<%= l(:label_project_plural) %>

<%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %>

<% end %> <% end %> <% html_title(l(:label_project_plural)) -%>

четверг, 31 октября 2013 г.

создание конвертирование электронных книг в в ubuntu

для работы с читалкой не всегда можно подобрать подходящий формат. Иногда просто требуется сохранить несколько html страниц с картинками

я для себя нашел следующий выход во первых для чтения на компе и конвертации calibre

(установить sudo apt-get install calibre)
для преобразования веб страниц
сервис http://readlists.com/  (можно скачать например это http://readlists.com/1b39c067/)

пятница, 18 октября 2013 г.

сделать обязательным поле назначена в redmine

в файле
{redmine}/app/models/issue.rb
поправить  строчку (67)
 validates_presence_of :subject, :priority, :project, :tracker, :author, :status
на 
 validates_presence_of :subject, :priority, :project, :tracker, :author, :status, :assigned_to

и в 
redmine/app/views/issues/_attributes.html.erb
(18)
<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true, :required => @issue.required_attribute?('assigned_to_id') %></p>

на

<p><%= f.select :assigned_to_id, principals_options_for_select(@issue.assignable_users, @issue.assigned_to), :include_blank => true, :required => true %></p>

среда, 16 октября 2013 г.

четверг, 10 октября 2013 г.

Получение списка файлов на ruby

 
Dir.open('.').each do |file|
 puts file if file.split(".").pop == 'png'
end
Получение списка файлов на ruby с расширением png Элегантно правда

среда, 21 августа 2013 г.

изменить количество задач в redmine в виджетах на главной

переходим в папку /usr/share/redmine/app/views/my/blocks
в которой правим файлы
_issuesassignedtome.html.erb  _issuesreportedbyme.html.erb

<% reported_issues = Issue.visible.find(:all,
                                :conditions => { :author_id => User.current.id },
                                :limit => 10,
                                :include => [ :status, :project, :tracker ],
                                :order => "#{Issue.table_name}.updated_on DESC") %>

Заменяем limit с 10 на 25

среда, 31 июля 2013 г.

совершенный парсинг сайтов

подчас требования к парсингу сайтов переходит все приделы и просто получить html код
бывает не достаточно.
итак

  1. нужно чтобы код можно было выполнять на удаленном сервере (варианты с плагинами для браузеров отпадают)
  2. получать и хранить куки 
  3. необходимо выполнять js в полном объеме и получать DOM измененный js (речь идет о парсинге ajax сайтов)
  4. получать скриншоты страниц

и т.д. и т.п.
понятно что идеальным выбором будет браузер
поэтому внимательно смотрим на phantomjs(http://phantomjs.org/) и его документацию на github
(https://github.com/ariya/phantomjs/wiki)

запихиваем бинарник (на ubuntu) в /bin даем нужные права
создаем js файл с инструкциями для phantomjs а дальше можно расстраивать архитектуру как хочешь например использовать очереди для передачи асинхронных задач phantomjs


четверг, 25 июля 2013 г.

[alias] для git

[alias]
        hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
        co = checkout
        ci = commit
        st = status
        br = branch
        hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
        type = cat-file -t
        dump = cat-file -p

суббота, 20 июля 2013 г.

начинаем изучать и использовать HTML с нуля за полчаса (или язык разметки для оптимизаторов)

Изучение HTML это долгий и кропотливый процесс. Который потом плавно перетекает в изучение CSS, JS. Так о каких пол часа может итди речь. Но объем работы над изучением языка  прямопропорционально тому  какие результаты мы хотим от него получить. Так например оптимизаторам достаточно создать простой документ с одним h1 заголовком парой текстов и маркированным списком и путатся в открывающихся/закрывающихся тегах вовсе не хочется но  но кажется избежать этого нельзя. Но если поискать решение то можно Markdown и очень просто посмотрите на синтаксис этого языка разметки http://markable.in/file/aa191728-9dc7-11e1-91c7-984be164924a/  попробуйте что нибудь на нем сделать и сохранить http://markable.in/editor/

понедельник, 15 июля 2013 г.

ставим и прокачиваем zsh(супер консоль) в ubuntu

сначала ставим сам z шелл
sudo apt-get install zsh

затем я делаю клон репозитория oh-my-zsh (git должен стоять sudo apt-get install git)
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

хотя на гит хабе можете посмотреть и другие варианты 
https://github.com/robbyrussell/oh-my-zsh


cd ~/.oh-my-zsh/
chmod u+x ./oh-my-zsh.sh

cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

chsh -s /bin/zsh

стартуем zsh








указать apache права создаваемых файлов

для того чтобы apache создавал новые файлы 666 и каталоги 777
открываем
 vim /etc/apache2/envvars

и вставляем строчку
umask 000

рестартуем апач

все 

четверг, 27 июня 2013 г.

установка прав по умолчанию linux для файлов и директорий

для этого используем команду unmask

unmask #без параметров узнать текущее значение

unmask 000 #установить для вновь создаваемых каталогов права 777 а для файлов 666

(в восьмеричной системе отнимаем 777 - 000)


смена цвета подсказок placeholder css

Экспериментальным способом нашел такое решение для mozilla и webkit

   input::-webkit-input-placeholder {
      color: #222;
   }
   textarea::-webkit-input-placeholder {
      color: #222;
   } 
   
   input::-moz-placeholder {
      color: #222;
      opacity: 1;
   }
   textarea::-moz-placeholder {
      color: #222;
      opacity: 1;
   }

суббота, 15 июня 2013 г.

некоторые настройки django

некоторые настройки django
TIME_ZONE = 'Europe/Moscow'
LANGUAGE_CODE = 'ru-RU'
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

установка mongodb в ubuntu

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
затем добавляем репозиторий в /etc/apt/sources.list
sudo vim /etc/apt/sources.list
вносим эту строку в конец файла
deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen
sudo apt-get update
и устанавливаем mongo (да к слову рекомендуется использовать 64 разрядную архетектуру)
sudo apt-get install mongodb-10gen
пробуем запустить
mongo

суббота, 8 июня 2013 г.

ставим django на ubuntu


Забираем djngo отсюда
можно например так 
mkdir ~/python && cd ~/python

положим архив в папку ~/python
распакуем
tar xzvf Django-1.5.1.tar.gz
cd Django-1.5.1
и установим
sudo python setup.py install

проверяем запускаем python и пробуем импортировать django
python

>>> import django
>>> dir(django)
>>> django.get_version()
>>> exit()

пробуем создать проект
cd ..
django-admin.py startproject testproject
./testproject/manage.py runserver

и не закрывая консоль пробуем зайти по адресу 

среда, 5 июня 2013 г.

полный путь секций в битрекс

не может быть в битрикс наконец сделали то о чем их просили ну очень давно
да P.S.
кто не в курсе битрикс это
зомби написанный на мертвом языке и требующий для своего подъема много магии и процессорной маны (а часто и помощи шаманов) 

среда, 29 мая 2013 г.

стилизуем окна в ubuntu 12.x

Эта статья краткий перевод с незначительными дополнениями данной http://handytutorial.com/install-emerald-in-ubuntu-12-04-12-10/
перед началом работы ставим следующие пакеты

sudo apt-get install git autoconf libtool libwnck1.0-cil-dev libwnck-dev intltool libdecoration0-dev gawk compizconfig-settings-manager

скачиваем emerald:
 wget cgit.compiz.org/fusion/decorators/emerald/snapshot/emerald-0.9.5.tar.gz

распаковываем и переходим в папку
tar -zxvf emerald-0.9.5.tar.gz && cd emerald-0.9.5/

далее конфигурируем и устанавливаем из сырцов
./autogen.sh && make clean && make distclean && ./configure --prefix=/usr && make && sudo make install

нажимаем alt+f2 и запускаем на выполнение
emerald-theme-manager -i


далее переходим Настройка тем -> Изменить темы -> Движок окна
и устанавливаем legacy (0.1)
(с остальными у меня были проблемы)


скачиваем темы отсюда http://gnome-look.org/  файлы с расширением .emerald (да, не пытайтесь открыть их архиватором)

Возвращаемся
Настройка тем -> Темы
и импортируем наши .emerald файлы


проверяем работоспособность emerald из консоли командой
emerald --replace &


если все ок то оставляем emerald

затем запускаем ccsm (alt+f2)
находим оформление окна и заменяем
gtk-window-decorator --replace
на
emerald --replace


а если нет то либо перезагружаемся
либо вызываем консоль (ctrl+alt+t) и возвращаем один из менеджеров
metacity --replace
compiz --replace







понедельник, 27 мая 2013 г.

картинки в css


иногда возникает необходимость держать весь код в одном файле. например для плагина jquery чтобы при его подключении не приходилось возится с файлами стилей и картинками. в таких случаях удобно запихивать картинки прямо в css.

background-image: url("data:image/ТИП;base64,код картинки в base64 ");

четверг, 23 мая 2013 г.

передать данные из result_modifier.php в component_epilog.php

вставить в result_modifier.php
 
     //для передачи в component_epilog 
     $cp = $this->__component;
     if (is_object($cp))
     {
       $cp->arResult["SUB_ELEMENTS"] = $arResult["SUB_ELEMENTS"];
       //$cp->arResult = $arResult;
       $cp->SetResultCacheKeys(array("SUB_ELEMENTS"));//указать ключи изменение которых окажет влияние на кеш
     }

капча для битрикс

генерация
 
if ($arParams["USE_CAPTCHA"] == "Y"){
 include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php");
 $cpt = new CCaptcha();
 $captchaPass = COption::GetOptionString("main", "captcha_password", "");
 if (strLen($captchaPass) <= 0){
  $captchaPass = randString(10);
  COption::SetOptionString("main", "captcha_password", $captchaPass);
 }
 $cpt->SetCodeCrypt($captchaPass);
 $arResult["CAPTCHA_CODE"] = htmlspecialchars($cpt->GetCodeCrypt());
}
вывод на странице
 
   <img id="capcha_block" align="left" alt="Введите эти символы в поле ввода" src="/bitrix/tools/captcha.php?captcha_code=<?=$arResult["CAPTCHA_CODE"]?>" /> <input id="captcha_word" type="text" name="captcha_word" /><br />
   <input id="capcha_block_hidden" type="hidden" name="captcha_code" value="Сменить картинку</button>
   <script type="text/javascript">
     $(function(){
      $(function(){
        $("#capcha_block_reload").bind("click",function(){
       $.ajax({
         type: "GET",
         url: "?activ=new_code_get",
         <?if ("new_code_get"==$_GET["activ"]){$GLOBALS['APPLICATION']->RestartBuffer(); echo md5(rand(0, 10000)); die();}?>
         dataType: "text",
         success: function(new_code){
            $('#capcha_block').attr("src","/bitrix/tools/captcha.php?captcha_code="+new_code);
            $('#capcha_block_hidden').val(new_code);
         }
       });
          return false;
          });
      });
     });
   </script>
и проверка
  include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php");
  $cpt = new CCaptcha();
  if (strlen($_POST["captcha_code"]) > 0)
  {
   $captchaPass = COption::GetOptionString("main", "captcha_password", "");
   if (!$cpt->CheckCodeCrypt($_POST["captcha_word"], $_POST["captcha_code"], $captchaPass)){
    $arResult["ERROR"]["CAPTCHA"]="Неправильно введена капча";
    $arResult["ERROR"]["CRITICAL_ERROR"]=true;
   }
  }
 }

к слову "об определение cms"

в исходниках многих проектах валяется файл .gitignore зачастую не как не закрытый из веба его можно использовать как один из способов определения cms под которой работает сайт

среда, 15 мая 2013 г.

foreach без входной переменной

почему то раньше мне не приходила идея использовать foreach без входной переменной, а ведь удобно
<?foreach(array(8,16,32) as $value):?>
   <a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?><?=$arParams["DISPLAY_NAME_VAR_COUNT_PAGE"]?>=<?=$value?>" rel="nofollow"><?=$value?></a>
<?endforeach?>

воскресенье, 12 мая 2013 г.

Установка subline на ubuntu

http://www.sublimetext.com/ скачиваем отсюда Sublime Text 2.0.1.tar.bz2

распаковываем складываем в папку /opt если такой нет то создаем
на рабочем столе создаем файл subline.desktop
следующего содержания

[Desktop Entry]
Name=subline
Name[ru_RU]=subline
Encoding=UTF-8
Type=Application
Exec=/opt/subline/sublime_text %U
GenericName=Subline
Icon=/opt/subline/Icon/48x48/sublime_text.png
Terminal=false
Categories=Application;Development;Java;IDE
Version=1.0
Type=Application
Terminal=0

вторник, 30 апреля 2013 г.

перекодировать кучу файлов из cp-1251 в utf-8

sudo apt-get install recode
find . -name "*.php" -print0|xargs -0 recode windows1251..utf8

виртуальный хост для битрикса в utf-8

самая мерзкая легаси в битриксе это то что для его установки в utf-8 требуется внести изменения в php.ini после чего у вас на остальных виртуальных хостах могут перестать работать сайты особенное если в базе хранятся сериализованные строки для того чтобы этого избежать создайте для битрикса виртуальный хост примерно следующего содержания

 
<VirtualHost *:80>
 ServerName biznes.loc
 DocumentRoot /home/user/www/bitrix_biznes
 <Directory /home/user/www/bitrix_biznes> 
  Options FollowSymLinks
  AllowOverride ALL
 </Directory>
 <IfModule mod_php5.c>
     php_value default_charset utf-8
     php_admin_value mbstring.func_overload 2
     php_value mbstring.internal_encoding utf-8
     php_admin_value realpath_cache_size "4096k"
 </IfModule>
</VirtualHost>

вторник, 16 апреля 2013 г.

создание дополнительных параметров для темы компонета

в папку с конкретной темой положить файл ./.parameters.php и и файлы ./lang/ru/.parameters.php ./lang/en/.parameters.php

./.parameters.php

 
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$properties = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"]));
while ($prop_fields = $properties->GetNext()){
  $elements[$prop_fields["ID"]]=$prop_fields["NAME"];
}
$arTemplateParameters = array(
 "PROPERTY_ADRESS" => Array(
  "NAME" => GetMessage("T_PROPERTY_ADRESS"),
  "TYPE" => "LIST",
  "VALUES" => $elements,
  "REFRESH" => "Y",
 ),
 "PROPERTY_PHONE" => Array(
  "NAME" => GetMessage("T_PROPERTY_PHONE"),
  "TYPE" => "LIST",
  "VALUES" => $elements,
  "REFRESH" => "Y",
 ),
 "PROPERTY_FAX" => Array(
  "NAME" => GetMessage("T_PROPERTY_FAX"),
  "TYPE" => "LIST",
  "VALUES" => $elements,
  "REFRESH" => "Y",
 ),
 "PROPERTY_EMAIL" => Array(
  "NAME" => GetMessage("T_PROPERTY_EMAIL"),
  "TYPE" => "LIST",
  "VALUES" => $elements,
  "REFRESH" => "Y",
 ),
);
?>
./lang/ru/.parameters.php

 
<?
$MESS["T_PROPERTY_ADRESS"] = "Свойства адреса";
$MESS["T_PROPERTY_PHONE"] = "Свойства телефон";
$MESS["T_PROPERTY_FAX"] = "Свойства факса";
$MESS["T_PROPERTY_EMAIL"] = "Свойства Email";
?>
./lang/en/.parameters.php

 
<?
$MESS["T_PROPERTY_ADRESS"] = "property adress";
$MESS["T_PROPERTY_PHONE"] = "proropery phone";
$MESS["T_PROPERTY_FAX"] = "property fax";
$MESS["T_PROPERTY_EMAIL"] = "property Email";
?>

понедельник, 15 апреля 2013 г.

Устанавливаем redmine на ubuntu

устанавливаем и конфигурируем redmine через aptitude 
sudo aptitude install redmine-mysql

sudo aptitude install redmine

установливаем модуль для апача
sudo apt-get install libapache2-mod-passenger

включаем мод rewrite если не включен
sudo a2enmod passenger rewrite

создаем виртуальную секцию
<VirtualHost *:80>
    ServerName redmine.loc
    DocumentRoot "/usr/share/redmine/public"
    PassengerResolveSymlinksInDocumentRoot on
    Options Indexes ExecCGI FollowSymLinks
</VirtualHost>
правим hosts файл если надо sudo vim /etc/hosts
127.0.0.1 redmine.loc

пятница, 12 апреля 2013 г.

паттерн одиночка

паттерн одиночка
 
 class Singleton {

    protected static $instance;  
    private function __construct() {  }
    private function __clone() {  }
    private function __wakeup() {  }
    public static function getInstance() {
        if ( is_null(self::$instance) ) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function method() {
       //вумный код;
    }

}

Singleton::getInstance()->method();


pattern

четверг, 11 апреля 2013 г.

создаем ajax в битрикс

первое и основное ajax должен всегда быть не навязчевым. а теперь как это реализовать
создадим пустую тему в битрекс у меня вот здесь
/bitrix/templates/AJAX_HTML
в данной теме создадим папку sub_themes (/bitrix/templates/AJAX_HTML/sub_themes)
делаем следующий header.php

 
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
IncludeTemplateLangFile(__FILE__);


/**
 * благодоря данному подходу можно создавать не только пустой шаблон но и обертывать код например наример различным кодом окон
 * Class get_sub_themes_singleton
 */
class get_sub_themes_singleton {
    protected static $instance;  // object instance

    private $list_theme;
    private $sub_theme;
    private $dir_sub_theme;
    private $params;

    private function __construct(){}
    private function __clone(){}
    private function __wakeup(){}

    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new get_sub_themes_singleton;
        }
        return self::$instance;
    }

    public function set_sub_theme($sub_theme){
        //поставить при повышенных требованиях к безопасности
        if (!empty($this->list_theme) && !empty($this->list_theme[$sub_theme])){
            $this->sub_theme = $this->list_theme[$sub_theme];
        }
        return self::$instance;
    }
    public function set_dir_sub_theme($dir_sub_theme){
        if (is_dir($dir_sub_theme)){
            $this->dir_sub_theme = $dir_sub_theme;
        }else{
            die("not found sub themes");
        }
        return self::$instance;
    }

    public function set_list_theme($list_theme){
        $this->list_theme = $list_theme;
        return self::$instance;
    }
    public function get_header(){
        //include("");
        //echo $this->sub_theme;
        if (file_exists($this->dir_sub_theme.$this->sub_theme."/header.php")){
            include_once($this->dir_sub_theme.$this->sub_theme."/header.php");
        }
    }
    public function get_footer(){
        if (file_exists($this->dir_sub_theme.$this->sub_theme."/footer.php")){
            include($this->dir_sub_theme.$this->sub_theme."/footer.php");
        }
    }


    public function set_params($key, $value){
        $this->params[$key]=$value;
        return self::$instance;
    }
    public function get_params($key){
        return $this->params[$key];
    }
    public function theme_exists($theme){
        if (!empty($this->list_theme[$theme])){
            return true;
        }else{
            return false;
        }
    }


}

///////////////////////////////////////////////////////////////////////////

get_sub_themes_singleton::getInstance()
    ->set_dir_sub_theme(dirname(__FILE__)."/sub_themes/")
    ->set_list_theme(array(
                    "full_html"     =>"full_html",
                    "work_arena"    =>"work_arena",
                    "simple_windows"=>"simple_windows",
                    ))->set_sub_theme("full_html");

//подключаем тему из url
//хотя можно поставить и в куках
if (!empty($_REQUEST['theme']) &&  get_sub_themes_singleton::getInstance()->theme_exists($_REQUEST['theme'])){
     get_sub_themes_singleton::getInstance()->set_sub_theme($_REQUEST['theme']);
}

get_sub_themes_singleton::getInstance()->get_header();

И такой footer,php
 
get_sub_themes_singleton::getInstance()->get_footer();

в папке /bitrix/templates/AJAX_HTML/sub_themes создаем подтемы с оформлением окон и не забываем указывать темы в через метод set_list_theme (сами темы состоят из header.php и footer.php)
данную тему настраиваем в настройках сайта и указываем что она должна применяться при наличии параметра ajax=Y в url
в футере основной темы создаем базовую парковочную зону (хотя не обязательно так как вы сами будете определять куда загружать контент)
 
<div class="parking_zone"
     closeajax=".parking_zone"
     closebind="click"
    >
</div>
</body>

в header основной темы вставляем следующий jquery скрипт
 
       <script type="text/javascript">
            /**
             * превращаем обычные ссылки в ajax
             */
            $(function(){
                $(".ajax_link").live("click",function(){
                    var parking_zone=$(this).attr("parking_zone");
                    var close_element_control=$(parking_zone).attr("closeajax");
                    var action_close=$(parking_zone).attr("closebind");
                    $(close_element_control).bind(action_close, function(){
                        $(parking_zone).hide();
                    });
                    $(parking_zone).load($(".ajax_link").attr("ajaxhref"), function() {
                        $(parking_zone).show();//настройка анимации окон
                    });
                    return false;
                });

            });
        </script>
и на конец создаем обработчик например на странице
 
 <span class="region-select-a">
<a id = "testid"
      class="ajax_link"
      href="/vibor_regiona/"
      ajaxhref="/vibor_regiona/?ajax=Y&theme=simple_windows&<?=(empty($_REQUEST['параметр'])?"":'region_geo_location='.$_REQUEST['параметр']);?>"
      parking_zone=".parking_zone"
      >blabla</a></span>
вот вроде все

вторник, 9 апреля 2013 г.

раздача прав в консоли

раньше я раздовал права в консоли так
для файлов
find . -type f -exec chmod 666 {} \;
для директорий
find . -type d -exec chmod 777 {} \;

но теперь нашел более оптимальный и быстрый
для файлов

find . -type а -print0|xargs -0 chmod 666
для директорий
find . -type d -print0|xargs -0 chmod 777

в результате создается меньше процессов chmod скорость бьет все рекорды
ps:
иногда необходимо раздавать права от root тогда при попытке использования
find . -type d -print0|xargs -0 sudo chmod 777
chmod выдает sudo: unable to execute /bin/chmod: Argument list too long
мы фактически исчерпываем лимит на длину командной строки (спасибо xargs) 
выход один сначала сделать sudo su; а затем find . -type d -print0|xargs -0 chmod 777




понедельник, 4 марта 2013 г.

администрируем свой сервер через веб или как поставить webmin


webmin очень удобная система администрирования через веб интерфейс(хорошо руссифицированая)

устанавливаем необходимые библеотек
sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl


sudo nano /etc/apt/sources.list
добавляем в файл /etc/apt/sources.list репозитарий webminа
deb http://download.webmin.com/download/repository sarge contrib

скачиваем и ставим ключ репозитария
wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc

обновляем и ставим
sudo apt-get update
sudo apt-get install webmin

https://<ваш ip>:10000

или прокидываем порт и аминим свой сервак хоть с телефона

з.ы.
входим пользователем имеющим доступ в sudo или rootом

меняем язык на русский
Webmin -> Change Language and Theme






установка KDE на ubuntu

из стандартного репозитария
sudo apt-get install kde-full

самая новая версия

добавляем репозитарий
sudo add-apt-repository ppa:kubuntu-ppa/backports

обновляем

sudo apt-get update

ставим

sudo apt-get install kubuntu-desktop

русифицируем

sudo apt-get install kde-l10n-ru

воскресенье, 3 марта 2013 г.

начал писать программу кубика рубика

начал писать программу кубика рубика. Сначала решил сверстать "карту кубика рубика" чтобы потом было понятно какие элементы брать за конечные оъекты. Для чего каждый неизменяемый элемет (по сути фрагмент который физически вытащить из кубика) я решил обозначить буквой английского алфавита. Я к середине нумерации я стал сомневаться что букв хватит и о чудо элементов оказалась ровно 26. Ни одной лишней буквы.

A B C
D E F
G H I
A D G
J K L
Q R S
G H I
L M N
S T U
I F C
N O P
U V W
S T U
R X V
Q Y W
Q Y W
J Z P
A B C

установка xdebug на ubuntu

sudo apt-get install php5-dev php-pear
sudo pecl install xdebug

затем ищем xdebug.so
find / -name 'xdebug.so'

у меня нащелся здесь

/usr/lib/php5/20090626+lfs/xdebug.so

открываем с правами root (для редактирования)
sudo gedit /etc/php5/apache2/php.ini
или
sudo vim /etc/php5/apache2/php.ini (подразумевается что вы знаете vim это не простой редактор)
или
sudo nano /etc/php5/apache2/php.ini

добавляем в конец

zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000


рестарт уем апач
sudo /etc/init.d/apache2 restart

смотрим наличие xdebug в phpinfo();

в качестве бонуса xdebug.ini с более удобными настройками

zend_extension=/usr/lib/php5/<ваша версия>+lfs/xdebug.so
xdebug.default_enable = On
xdebug.auto_trace=On
xdebug.trace_output_dir=/home/user/
xdebug.var_display_max_depth=6
xdebug.remote_enable=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.idekey=netbeans-xdebug
xdebug.remote_autostart=1
xdebug.remote_log=/tmp/xdebug.log
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir=/tmp/profiler
xdebug.show_local_vars=1

а подключать его так
создаем его здесь

/etc/php5/mods-available/xdebug.ini

и
делаем символьную ссылку так
sudo ln -s /etc/php5/mods-available/xdebug.ini /etc/php5/apache2/conf.d/

рестартуем апач





календарь на php(продолжение)

сегодня я переделал код и отделил отображение от логики 
 
interface Show{
    function show();
}


class Calendar{
    private $date; //сдесь храним дату на которую делаем календарь
    private $arr_calendar; //массив из всех дат(DateTime) месяца 
    function __construct(DateTime $date) { //принимаем только формат DateTime
        $this->date=$date;
    }

     /**
     * функция возвращает массив обектов состоящих из дат текущего месяца
     * @return array
     */
    function get_calendar(){ 
        // идем от 1 числа по всем числам месяца
        for ($i=1;$this->date->format('t')>=$i;$i++){
            $tmp_date = new DateTime($i.".".$this->date->format('m').".".$this->date->format('Y'));
            $this->arr_calendar[] = array(
                    "oject_data"     => $tmp_date,  //дата объектом
                    "active_data"    => $this->test_curret_date($tmp_date), //проверку на текущию дату
                    );
        }
        return $this->arr_calendar;
    }
    
    /**
     * если переданная дата будет равна дате $this->date то вернем true
     * @param DateTime $current_date проверяемая дата 
     * @return boolean
     */
    private function test_curret_date(DateTime $current_date){
        if ($current_date->format('d.m.Y')==$this->date->format('d.m.Y')){
            return true;
        }else{
            return false;
        }
    }
}


class ShowCalendar implements Show{
    private $calendar;
    private $calendar_format;//формат в днях недели 1=>"Понедельник", ...  7=>"Воскресение",
    
    private $list_property=array("show_dat", "dat_format", "show_mount");
    
    private $show_dat=true;
    private $dat_format=self::DAY_SHORT_FORMAT;
    
    private $show_mount=true;
    private $mount_format=self::MOUNT_FULL_FORMAT;
    
    
    const DAY_SHORT_FORMAT = "d.m";
    const MOUNT_FULL_FORMAT = "m.Y";
    
    function set_params($key, $value){
       if (in_array($key, $this->list_property)){
           $this->$key=$value;
       } 
    }

    function __construct(Calendar $calendar,array $calendar_format =  array(
                                                                            1=>"Понедельник",
                                                                            2=>"Вторник",
                                                                            3=>"Среда",
                                                                            4=>"Четверг",
                                                                            5=>"Пятница",
                                                                            6=>"Суббота",
                                                                            7=>"Воскресение",
                                                                        ) ) {
        $this->calendar=$calendar->get_calendar();
        $this->calendar_format=$calendar_format;
    }
    /**
     * функция получения отображения 
     * @return string
     */
    function show() {
        //отдельно получаем и собираем вместе элементы (имитация темплейта)
       $template = $this->show_get_style().
                   $this->show_get_header().
                   $this->show_get_body().
                   $this->show_get_footer();
       return $template;
    }
    /**
     * функция получения header
     * @return string
     */
    private function show_get_header(){
        $template="<table>".
                        "<tr>";
        if ($this->show_mount){
            $mount_tmp=current($this->calendar);
                        $template .="<tr>".
                        '<td colspan=7>'.
                        $mount_tmp["oject_data"]->format($this->mount_format).
                        "</td>".
                        "</tr>";
        }
        
                foreach ($this->calendar_format as $day_name){
                    $template .="<td>".
                                    $day_name.
                                "</td>";
                }
        $template .="</tr>";
        
        return $template;
    }
    /**
     * функция возвращает footer таблицы
     * @return string
     */
    private function show_get_footer(){
        $template ="</table>";
        
        return $template;
    }
    /**
     * функция возращает основное тело таблицы
     * @return string
     */
    private function show_get_body(){
        //получаем календарь в виде массива
        $arr_calendar=array();
        foreach ($this->calendar as $day_element){
            if (!isset($arr_calendar[$day_element["oject_data"]->format("W")])){
                $arr_calendar[$day_element["oject_data"]->format("W")]=array();
            }
            $arr_calendar[$day_element["oject_data"]->format("W")][$day_element["oject_data"]->format("N")]=array(
                                            "data"  =>$day_element["oject_data"]->format($this->dat_format),
                                            "active"=>$day_element["active_data"],
                                        );
        }
        //собираем календарь в таблицу
        $template="";
        foreach($arr_calendar as $row){
            $template .="<tr>";
            for($i=1;7>=$i;$i++){
              
                if (isset($row[$i])){
                    //ячейка определена
                    $template .="<td ".($row[$i]["active"]&&$this->show_dat?'class="active"':'').">";
                        
                        $template .=$row[$i]["data"];
                    
                    $template .="</td>";
                }else{
                    //ячейка пустая
                    $template .="<td></td>";
                }
            }
            $template .="</tr>";
        }

        return $template;
    }
    /**
     * функция возвращает стили для календаря
     * @return string
     */
    private function show_get_style(){
        $template='<style type="text/css">'
        .'.active{'
        ." color: red;"
        ." background: #ccc;"
        .'}'
        .'table tr td{'
        ." text-align: center;"
        ." border: 1px solid black; "
        ." padding: 5px; "
        .'}'
        .'</style>';
        return $template;
    }
}

$n=new DateTime("now");

$n1=$n->sub(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n1));
$calendar->set_params("show_dat", false);
echo $calendar->show();

$n2=$n->add(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n2));
echo $calendar->show();

$n3=$n->add(new DateInterval('P1M'));
$calendar = new ShowCalendar(new Calendar($n3));
$calendar->set_params("show_dat", false);
echo $calendar->show();

суббота, 2 марта 2013 г.

календарь на php

сегодня впервые мне удалось написать ООП код от которого я почти не испытываю тошнотворного ощущения как обычно бывало раньше
class Calendar{
    private $date; //сдесь храним дату на которую делаем календарь
    private $arr_calendar; //массив из всех дат(DateTime) месяца 
    function __construct(DateTime $date) { //принимаем только формат DateTime
        $this->date=$date;
    }
    /**
     * функция возвращает массив обектов состоящих из дат текущего месяца
     * @return array
     */
    function get_calendar(){ 
        // идем от 1 числа по всем числам месяца
        for ($i=1;$this->date->format('t')>=$i;$i++){
            $this->arr_calendar[] = new DateTime($i.".".$this->date->format('m').".".$this->date->format('Y'));
        }
        return $this->arr_calendar;
    }
    /**
     * отображает календарь
     * @param array $calendar_format 
     * example 
     * array(
                1=>"понедельник",
                2=>"вторник",
                3=>"среда",
                4=>"четверг",
                5=>"пятница",
                6=>"суббота",
                7=>"воскресение",
            )
     */
    function show_calendar($calendar_format){
        // пока сделано без MVC
        $this->get_calendar(); //получаем календарь в массив
        $run=true;
        echo "<table>";
           echo "<tr>";
                    echo "<td colspan=7>";
                        echo $this->date->format('d.m.Y');
                    echo "</td>";

            echo "</tr>";

            echo "<tr>";
                foreach($calendar_format as $day_name){
                    echo "<td>";
                        echo "<b>".$day_name."</b>";//выводим название недели в загаловке таблицы
                    echo "</td>";
                }
            echo "</tr>";
            while ($run){
                echo "<tr>";
                foreach($calendar_format as $key_dat=>$day_name){
                    if (current($this->arr_calendar)->format('N')==$key_dat){
                        echo "<td>";
                            
                            //проверяем на текущею дату если текущая то выделяем красным
                            if ($this->test_curret_date(current($this->arr_calendar))){
                                echo '<b style="color: red;">';
                            }
                                
                                echo current($this->arr_calendar)->format('d');//выводим активный элемент массива
                                
                            //проверяем на текущею дату 
                            if ($this->test_curret_date(current($this->arr_calendar))){
                                echo "</b>";
                            }
                             
                        echo "</td>";
                        next($this->arr_calendar);//переходим на следущий элемент массива
                        //
                        //проверка конца массива если конец выходим из цикла 
                        if (current($this->arr_calendar)->format('d')==$this->date->format('t')){
                            $run=false;
                        }
                    }else{
                        echo "<td></td>";
                    }
                }
            }
            echo "</tr>";
        echo "</table>";
    }
    /**
     * если переданная дата будет равна дате $this->date то вернем true
     * @param DateTime $current_date проверяемая дата 
     * @return boolean
     */
    private function test_curret_date(DateTime $current_date){
        if ($current_date->format('d.m.Y')==$this->date->format('d.m.Y')){
            return true;
        }else{
            return false;
        }
    }
}

$calendar = new Calendar(new DateTime("11.05.2010"));

$calendar->show_calendar(
            array(
                1=>"понедельник",
                2=>"вторник",
                3=>"среда",
                4=>"четверг",
                5=>"пятница",
                6=>"суббота",
                7=>"воскресение",
            )
        );


php отладка ООП кода при помощи Reflection API

однажды один опытный программист на мой вопрос можно ли узнать какие методы у объекта не видя его кода сказал что это не возможно. Сейчас я зная что это не так.
 
<?php
$date = new DateTime("now");
//$date2 = new DateTime("02/03/2013");
$class_info = new ReflectionClass($date);
?>
<pre>
    <?
    Reflection::export($class_info);
    ?>
</pre>
но оказалась что это возможно и данный код дает довольно много инфы
    Class [  class DateTime ] {

  - Constants [11] {
    Constant [ string ATOM ] { Y-m-d\TH:i:sP }
    Constant [ string COOKIE ] { l, d-M-y H:i:s T }
    Constant [ string ISO8601 ] { Y-m-d\TH:i:sO }
    Constant [ string RFC822 ] { D, d M y H:i:s O }
    Constant [ string RFC850 ] { l, d-M-y H:i:s T }
    Constant [ string RFC1036 ] { D, d M y H:i:s O }
    Constant [ string RFC1123 ] { D, d M Y H:i:s O }
    Constant [ string RFC2822 ] { D, d M Y H:i:s O }
    Constant [ string RFC3339 ] { Y-m-d\TH:i:sP }
    Constant [ string RSS ] { D, d M Y H:i:s O }
    Constant [ string W3C ] { Y-m-d\TH:i:sP }
  }

  - Static properties [0] {
  }

  - Static methods [3] {
    Method [  static public method __set_state ] {
    }

    Method [  static public method createFromFormat ] {

      - Parameters [3] {
        Parameter #0 [  $format ]
        Parameter #1 [  $time ]
        Parameter #2 [  $object ]
      }
    }

    Method [  static public method getLastErrors ] {

      - Parameters [0] {
      }
    }
  }

  - Properties [0] {
  }

  - Methods [15] {
    Method [  public method __construct ] {

      - Parameters [2] {
        Parameter #0 [  $time ]
        Parameter #1 [  $object ]
      }
    }

    Method [  public method __wakeup ] {
    }

    Method [  public method format ] {

      - Parameters [1] {
        Parameter #0 [  $format ]
      }
    }

    Method [  public method modify ] {

      - Parameters [1] {
        Parameter #0 [  $modify ]
      }
    }

    Method [  public method add ] {

      - Parameters [1] {
        Parameter #0 [  $interval ]
      }
    }

    Method [  public method sub ] {

      - Parameters [1] {
        Parameter #0 [  $interval ]
      }
    }

    Method [  public method getTimezone ] {

      - Parameters [0] {
      }
    }

    Method [  public method setTimezone ] {

      - Parameters [1] {
        Parameter #0 [  $timezone ]
      }
    }

    Method [  public method getOffset ] {

      - Parameters [0] {
      }
    }

    Method [  public method setTime ] {

      - Parameters [3] {
        Parameter #0 [  $hour ]
        Parameter #1 [  $minute ]
        Parameter #2 [  $second ]
      }
    }

    Method [  public method setDate ] {

      - Parameters [3] {
        Parameter #0 [  $year ]
        Parameter #1 [  $month ]
        Parameter #2 [  $day ]
      }
    }

    Method [  public method setISODate ] {

      - Parameters [3] {
        Parameter #0 [  $year ]
        Parameter #1 [  $week ]
        Parameter #2 [  $day ]
      }
    }

    Method [  public method setTimestamp ] {

      - Parameters [1] {
        Parameter #0 [  $unixtimestamp ]
      }
    }

    Method [  public method getTimestamp ] {

      - Parameters [0] {
      }
    }

    Method [  public method diff ] {

      - Parameters [2] {
        Parameter #0 [  $object ]
        Parameter #1 [  $absolute ]
      }
    }
  }
}

среда, 13 февраля 2013 г.

хак для firefox или как применить стиль только для firefox

/* Target all Firefox */
#selector[id=selector] { color: red; }
 
/* Target all Firefox */
@-moz-document url-prefix() { .selector { color: red; } } 
 
/* Target all Gecko (includes Firefox) */
*&gt;.selector { color: red; }

создание многоуровневых раскрывающихся списков на jquery




	
	
	 
      ‹script type="text/javascript">
      $(function(){
        $('li:has(ul.li-slider)')
          .click(function(event){
            if (this == event.target) {
              if ($(this).children().is(':hidden')) {
                $(this)
                  .css('list-style-image','url(minus.gif)')
                  .children().slideDown();
              }
              else {
                $(this)
                  .css('list-style-image','url(plus.gif)')
                  .children().slideUp();
              }
            }
            return false;
          })
          .css({cursor:'pointer',
                'list-style-image':'url(plus.gif)'})
          .children().hide();
        $('li:not(:has(ul.li-slider))').css({
          cursor: 'default',
          'list-style-image':'none'
        });
      });
    ‹/script>



	
  • Авто
    • 1
    • 2
    • 3
    • 4
    • ul ниже не будет раскрываться для того чтобы он мог раскрываться добавьте ему class="li-slider"
      • 1
      • 2
      • 3
      • 4
      • 5
пример
  • Авто
    • 2
      • 1
        • 1
        • 2
        • 3
        • 4
        • 5
      • 2
        • 1
        • 2
        • 3
        • 4
        • 5
      • 3
        • 1
        • 2
        • 3
        • 4
        • 5
      • 4
        • 1
        • 2
        • 3
        • 4
        • 5
      • 5
        • 1
        • 2
        • 3
        • 4
        • 5

будни веб разработки



пятница, 8 февраля 2013 г.

сделать подсветку синтаксиса на вашем сайте

часто возникает необходимость встроить полсветку сетаксиса на ваш блок вставте с ваш блог следующие скрипты

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
а затем вставте в нужном месте ваш код следующим способом
<pre class="brush:php"> 
//ваш код
<pre>

четверг, 7 февраля 2013 г.

jquery на гугле

очень удобно грузить jquery не с локала а из исходников google как миниум по тому что она может скрипт может быть закеширован как следствие снижение времени на загрузку
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"> < /script> 
проверяем доступность jquery если не доступно то грузим с локала
<script type="text/javascript">window.jQuery || document.write('<script src="js/jquery-1.8.1.min.js"><\/script>') </script> 

понедельник, 4 февраля 2013 г.

RewriteEngine

содержимое .htaccess


Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

воскресенье, 3 февраля 2013 г.

виртуальная секция


<VirtualHost *:80>
ServerAdmin mail@mail.mail
ServerName oop
DocumentRoot /home/user/www/oop
<Directory /home/user/www/oop>
        Options FollowSymLinks
        AllowOverride ALL
</Directory>
</VirtualHost>

паттерн command php

паттерн command php

реализация



";
//////////////////////////////////////////////

abstract class Command {
	abstract function execute( CommandContext $context );
}

class LoginCommand extends Command{
	function execute( CommandContext $context ){
		$user = $context->get('username');
		$pass = $context->get('pass');
                Loger::write("enter user: ".$user);
		return true;
	}
}

class CommandContext {
	private $params=array();
	private $error="";
	
	function __construct() {
		$this->params = $_REQUEST;
	}
	function addParam($key, $val){
		$this->params[$key] = $val;
	}
	function get($key){
		return $this->params[$key];
	}
	function setError($error){
		$this->$error = $error;
	}
	function getError(){
		return $this->error;
	}
}

class CommandNotFoundException extends Exception {}

class CommandFactory {
	private static $dir = "commands";
	static function getCommand($action = 'default'){
		if (preg_match('/\W/', $action )){
			throw new CommandNotFoundExceptioin('Недопустимые символы в комманде'); 
		}
		$class=$action."Command";
		/*//времено
		//возможен иклюдинг предусмотреть
		$class = $action.".ph
		$file = self::$dir.DIRECTORY_SEPARATOR
		if (!file_exists($file)){
			throw new CommandNotFoundExceptioin('не найден файл '.$file); 
		}
		require_once( $file );
		*/
		if(!class_exists($class)){
			throw new CommandNotFoundExceptioin('не найден класс '.$class); 
		}
		$cmd = new $class();
		return $cmd;
	}
}

class Controller {
	private $context;
	function __construct(){
		$this->context = new CommandContext();
	}
	function getContext(){
		return $this->context;
	}
	function process(){
                //var_dump( $this->context->get('action') );
		$cmd = CommandFactory::getCommand( $this->context->get('action') );
		if ( !$cmd->execute($this->context) ){
			//обработка ошибок
		}else{
			//все прошло успешно
			//Теперь отобразим результаты
		}
	}	
}


$controler = new Controller();
//эмулируем действия пользователя
$context = $controler->getContext();
$context->addParam('action', 'Login');
$context->addParam('username', 'jo');
$context->addParam('pass', '1');
$controler->process();


?>

суббота, 26 января 2013 г.

GIT попытка сделать push в текущею ветку удаленном сервере

Пытаюсь по SSH вытолкнуть изменения на удаленный сервер, в результате чего получаю вот такую ошибку: REJECTED_OTHER_REASON

Для решения данной проблемы вы можете либо сделать из удаленного репозитария либо сделать bare (без исходных кодов) репозитарей
git config --bool core.bare true

либо создать ветку продакшен и сделать ее текущей а пушатся в master а затем мержится в продакшен

git checkout -b production
а затем после пуша мержимся
git merge --ff-only master

суббота, 12 января 2013 г.

GIMP 2.8 из исходников

как бы я не ненавидел gimp все равно приходится им пользоваться время от времени. Здесь краткая инструкция по установке на основе данной заметки(http://pingvinus.ru/note/gimp-install-from-sources)

сначала ставим gimp из репозитария (sudo apt-get install gimp)

если же старая версия вас не устраивает как меня то можно собрать новую из исходников

собирать будем gimp 2.8 для начала нам следует установить следующие библиотеки и пакеты

sudo apt-get build-dep gimp
sudo apt-get remove libgegl-0.0-dev libbabl-0.0-0-dev
sudo apt-get install libavformat-dev libavcodec-dev valac-0.16 graphviz
sudo apt-get install ruby1.9.1-dev liblua5.1-0-dev libopenexr-dev libopenraw-dev
sudo apt-get install libexiv2-dev libsdl1.2-dev libgs-dev libjasper-dev
sudo apt-get install git-core
sudo apt-get install checkinstall

сделаем директорию для хранения всех наших исходников
mkdir ~/build_gimp
cd ~/build_gimp

устанавливаем глобальные переменные (ВНИМАНИЕ если в процессе сборки вы будете закрывать консоль то их нужно выставлять но новой)

export PATH=/opt/gimp-2.8/bin:$PATH
export PKG_CONFIG_PATH=/opt/gimp-2.8/lib/pkgconfig
export LD_LIBRARY_PATH=/opt/gimp-2.8/lib

для оптимизации под конкретное железо можно сделать
export CFLAGS="-march=native -O3"

далее получаем через git исходники babl и собираем

git clone git://git.gnome.org/babl
cd babl
./autogen.sh --prefix=/opt/gimp-2.8
make
sudo make install
cd ..
аналогично собираем gegl
git clone git://git.gnome.org/gegl
cd gegl
./autogen.sh --prefix=/opt/gimp-2.8
make
sudo make install
cd ..

скачиваем исходники gimp
wget ftp://ftp.gimp.org/pub/gimp/v2.8/gimp-2.8.0.tar.bz2

распаковываем
tar -xjf gimp-2.8.0.tar.bz2

переходим в папку с исходниками gimp
cd gimp-2.8.0

конфигурируем
./configure --prefix=/opt/gimp-2.8

компилируем
make

устанавливаем
make install

запустить из консоли можно
/opt/gimp-2.8/bin/gimp-2.8

в директории ~/.local/share/applications создать файл gimp28.desktop
[Desktop Entry]
Name=GIMP 2.8
Name[ru_RU]=GIMP 2.8
Encoding=UTF-8
Type=Application
Exec=/opt/gimp-2.8/bin/gimp-2.8 %U
GenericName=Image Editor GIMP 2.8
Icon=/opt/gimp-2.8/share/icons/hicolor/48x48/apps/gimp.png
Terminal=false
Categories=Graphics;2DGraphics;RasterGraphics;GTK;
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=GIMP
X-GNOME-Bugzilla-Component=General
X-GNOME-Bugzilla-Version=2.8.0
X-GNOME-Bugzilla-OtherBinaries=gimp-2.8
StartupNotify=true
MimeType=application/postscript;application/pdf;image/bmp;image/g3fax;image/gif;image/x-fits;image/pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/x-gimp-gbr;image/x-gimp-pat;image/x-gimp-gih;image/tiff;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/svg+xml;application/pdf;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;


Настройка микрофона вебкамеры для ubuntu

дело в том что по умолчанию включен со микрофон звуковой карты.
для включения микрофона с камеры установите pavucontrol (sudo apt-get install pavucontrol.)после чего запустите pavucontrol 
осталось установить галочку на против микрофона закрываем программу(кнопки сохранить здесь нет) все
PHP: The Right Way блог програмышки
Яндекс.Метрика