<% 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 %>
четверг, 26 декабря 2013 г.
redmine контакты сотрудников на домашней странице
вторник, 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
<% 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 шипит
найдите строку 'load-module module-udev-detect'
и замените ее на 'load-module module-udev-detect tsched=0'
*везде без кавычек.
четверг, 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)) -%>
понедельник, 18 ноября 2013 г.
Определение главной страницы битрикс
<?if($APPLICATION->GetCurPage()==SITE_DIR):?> главная <?else:?> не главная <?endif?>
четверг, 31 октября 2013 г.
создание конвертирование электронных книг в в ubuntu
я для себя нашел следующий выход во первых для чтения на компе и конвертации 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 г.
icq в ubuntu
четверг, 10 октября 2013 г.
Получение списка файлов на ruby
Dir.open('.').each do |file|
puts file if file.split(".").pop == 'png'
end
среда, 25 сентября 2013 г.
среда, 21 августа 2013 г.
изменить количество задач в redmine в виджетах на главной
в которой правим файлы
_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 г.
совершенный парсинг сайтов
бывает не достаточно.
итак
- нужно чтобы код можно было выполнять на удаленном сервере (варианты с плагинами для браузеров отпадают)
- получать и хранить куки
- необходимо выполнять js в полном объеме и получать DOM измененный js (речь идет о парсинге ajax сайтов)
- получать скриншоты страниц
и т.д. и т.п.
понятно что идеальным выбором будет браузер
поэтому внимательно смотрим на 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 с нуля за полчаса (или язык разметки для оптимизаторов)
понедельник, 15 июля 2013 г.
ставим и прокачиваем zsh(супер консоль) в ubuntu
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
хотя на гит хабе можете посмотреть и другие варианты
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 права создаваемых файлов
открываем
vim /etc/apache2/envvars
и вставляем строчку
umask 000
четверг, 27 июня 2013 г.
установка прав по умолчанию linux для файлов и директорий
unmask #без параметров узнать текущее значение
unmask 000 #установить для вновь создаваемых каталогов права 777 а для файлов 666
(в восьмеричной системе отнимаем 777 - 000)
смена цвета подсказок placeholder css
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
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 отсюда
положим архив в папку ~/python
распакуем
tar xzvf Django-1.5.1.tar.gz
cd Django-1.5.1
и установим
sudo python setup.py install
python
>>> import django
>>> dir(django)
среда, 5 июня 2013 г.
среда, 29 мая 2013 г.
стилизуем окна в ubuntu 12.x
перед началом работы ставим следующие пакеты
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 ");
пятница, 24 мая 2013 г.
переместить кнопки управления окном на ubuntu 12.x в право
четверг, 23 мая 2013 г.
передать данные из result_modifier.php в component_epilog.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"
среда, 15 мая 2013 г.
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
распаковываем складываем в папку /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
find . -name "*.php" -print0|xargs -0 recode windows1251..utf8
виртуальный хост для битрикса в utf-8
<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
<?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
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/hosts127.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();
четверг, 11 апреля 2013 г.
создаем ajax в битрикс
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
ps:
иногда необходимо раздавать права от root тогда при попытке использования
find . -type d -print0|xargs -0 sudo chmod 777
chmod выдает sudo: unable to execute /bin/chmod: Argument list too long
пятница, 8 марта 2013 г.
понедельник, 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 г.
начал писать программу кубика рубика
|
|||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
|
установка xdebug на ubuntu
sudo pecl install xdebug
затем ищем xdebug.so
find / -name 'xdebug.so'
у меня нащелся здесь
/usr/lib/php5/20090626+lfs/xdebug.so
или
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) */ *>.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
- 1
- 2
пятница, 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 на гугле
<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
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
воскресенье, 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
реализация
";
//////////////////////////////////////////////
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 .. |
| 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; |








