Илья Кригоузов Привет, меня зовут Илья Кригоузов и я занимаюсь информационными технологиями с 2005 года. Под такими технологиями я понимаю довольно широкий круг вещей: сайты любой сложности, базы данных и клиент-серверные приложения.
Закончил МИРЭА по специальности «инженер-математик», практику проходил на концерне радиостроения ОАО «Вега».Работаю в Информационных системах для бизнеса, так же сотрудничал с АйТи-агенством.
В свободное время увлекаюсь фотографией. Найти меня вы можете:
Показаны сообщения с ярлыком код. Показать все сообщения
Показаны сообщения с ярлыком код. Показать все сообщения

16 сентября 2011 г.

Разрешения друпала

Все время хочу использовать стандартные права доступа друпала в хуке hook_menu() и все время забываю. Поэтому сделаю запись сюда. Данные права необходимо указывать в качестве элемента массива аргумента access arguments:

  • access content — допуск к контенту будет у тех групп пользователей, у которых есть доступ ко всему контенту сайта;
  • access administration pages — доступ будет у тех пользователей, у которых есть доступ в раздел администрирования.

Пример реализации хука меню:

function analadvanced_menu()
{  
    $item['analadvanced'] = array(
        'title'   => 'Продвинутая аналитика',
        'page callback' => 'analadvanced_cookie_value',
        'access arguments' => array('access content'),
    );
    return $item;
}

1 мая 2011 г.

Умное обрезание строк в php

Для вывода осмысленного текста ссылки вместо стандартного «Далее» или «Подробнее» в тизере нужно было реализовать функцию, которая сможет урезать строку по словам. В необъятных просторах нашел готовое решение, но оно мне не понравилось, поэтому сделал свое. Чтобы не томить торопящихся сразу приведу реализацию:

function smart_cut($text, $words = 3, $separator = ' ')
{
    $current_pos = 0;
    for($i = 0; $i < $words; $i++)
    {
        $current_pos = strpos($text, $separator, ($current_pos + 1));
    }
    return substr($text, 0, $current_pos);
}
Принимает три параметра, обязательный только первый:
  1. Текст, над которым будет производиться манипуляция;
  2. Количество слов, после которого строка будет обрезана;
  3. Разделитель слов в исходном тексте.
Вернет функция строку. Кому интересны подробности и сравнения, прошу под кат.

30 апреля 2011 г.

Как узнать ip пользователя

В php глобальная переменная $_SERVER хранит реальный ip-адрес пользователя. Чтобы попытаться справиться с подменой использую такое решение:
function get_ip()
{
     $ip = $_SERVER["REMOTE_ADDR"];
     if(isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
     {
          if(isset($_SERVER["HTTP_X_REAL_IP"]))
               $ip = $_SERVER["HTTP_X_REAL_IP"];
          else
               $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
     }

     return $ip;
}

29 апреля 2011 г.

Очистить в Drupal кэш для одной ноды

У друпала всегда включен кэш. Даже если в настройках отключено кэширование, сайт все равно будет кэшировать данные, хоть и в меньшем объеме. По большому счету это правильно, но иногда возникают моменты, когда нам это неудобно.

Например у наст есть тип материала «профиль» (не важно, сами мы его сделали с помощью CCK или использовали модуль Content profile) и в профиле есть какое-то поле, которое мы изменяем программно, с помощью модуля. Результат нашего изменения мы не увидим, пока не очистим кэш. Согласитесь, не очень удобно.

Для того чтобы видеть изменения моментально, мы будем очищать кэш при каждом изменении значения поля профиля. Я не буду пользоваться стандартным API, поскольку он может очистить больше, чем нам нужно, а при большом объеме данных это отрицательно скажется на производительности.

14 декабря 2010 г.

C++ решение СЛАУ методом Крамера

Срочно понадобилось решение систм линейхных уравнений методом Крамера, реализованное на C++, но в рунете ничего толкового не нашлось. Зато в буржуазном нашлось отличное решение на нативном C++, написанное Остином Семерад (Austin Semerad).
На вход программа принимает размерность матрицы коэффициентов A, непосредственно саму матрицу A и вектор-стобец свободных членов b. В результате выполнения операций возвращается вектор-столбец результатов x и определители.

Исходники или скачать отсюда.

28 июня 2010 г.

htaccess: изменить адрес вебмастера

Иногда на сайте возникают ошибки, которые передаются серверу для выдачи пользователю описание происшествия. Чтобы пользователь мог сообщить о происшедшем хорошо бы заменить адрес вебмастера, который устанавливается по умолчанию, на действительный.
Взять к примеру ошибку 500 или Internal Server Error. Вот стандартный ответ Апача:
«The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@oniksfly.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.»
Поменять адрес вебмастера, не изменяя конфигурацию сервера (из-за отсутствия доступа), можно прописав в файле .htaccess следующее:
SetEnv SERVER_ADMIN yourname@example.com

12 июня 2009 г.

Web-интерфейс: переключение между элементами

Во время работы с приложениями, если есть такая возможность, практически не использую мышку. Т.е. для переключения между элементами форм (полями, кнопками) использую клавишу Tab. В Web’е это практически не удается, потому что как правило, по нажатию клавиши табуляции выделение улетает черт знает куда.

Как Web-разработчикам быть? Очень просто — использовать свойство tabindex для следующих html-тегов: input, select, button, textarea.

<form>
<input type="text" name="login" tabindex="1">
<a href="#">восстановить пароль</a>
<input type="password" name="pswd" tabindex="2">
<input type="submit">
</form>

23 мая 2009 г.

Подбор шрифта для сайта

До недавнего времени выбор подходящего шрифта для сайта был для меня проблемой.
Нужно было каждый раз правильно в CSS изменить свойства, что бы потом улавливать изменения в готовом документе.

Но вот буквально пару дней назад я открыл для себя крайне любопытный интернет-сервис: texster.ru.
Основная его задача — подбор шрифтов и создание CSS стилей для текста. Умеет на лету с помощью ползунков изменять размер шрифта, интерльяж (расстояние между строками), кернинг (расстояние между буквами), расстояние между словами и отступы. Так же можно менять начертания шрифтов.

Все изменения тут же отображаются для 19 шрифтов и сразу генерируется CSS-код. Очень удобно.

4 мая 2009 г.

Табы на jQery


Очень удобно, без всяких попыток изобретения велосипеда табы на фреймворке (или вкладки).

Взять можно с офсайта.

7 марта 2009 г.

Заставляем работать IE6 как надо

Если вы немного разбираетесь в web-разработках, то вам не по наслышке знакомы чудеса, которые выделывает старый, но все еще использующийся браузер Internet Explorer 6.

Если говорить мягко и политкорретно — отображает он страницы несколько иначе, чем другие браузеры и тем более, чем хотелось бы нам.

Приведу некоторые CSS-правила, которые помогут исправить этот недостаток.


1. Использование DOCTYPE
Обязательно указывайте в начале страницы запись, обозначающую тип HTML-документа:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

2. display: inline
Если на странице имеются DIV-блоки с float: left и указанным правилом margin, то в IE6 это значение margin будет удваиваться. Использование для этого DIV-блока правила display: inline поможет решить проблему.

3. Процентам нет
Если вы не уверены, или не можете задать размер каждого блока в процентах, то откажитесь от этой затеи — Осел может легко запутаться в цифрах.

Материал на основе блога Свобода слова вебастерского.

Файловые загрузчики

Все более и более популярны становятся красивые загрузчики с прогресс-барами, которые не используют Flash-технологию.

На то есть свои причины, одна из которых, на мой взгляд основная, — забота о незафлэшенных пользователях. К тому же, такие загрузчики поддерживают кроссбраузерность - IE6/7, FF2/3, Safari, Chrome, Opera.

1. Ajax Upload
Название говорит само за себя. С помощью этой штуки сможете сделать практически все, что угодно вашей душе, и в плане стилизации в том числе. Кто мешает править CSSки?)

Стоит заметить, что есть версия как под jQuery, так и под Prototype.

2. jQuery Multiple File Upload Plugin (текущая версия 3.1)
При загрузке показывает иконку, соответствующую MIME-типу файла. Так же нет практически никаких ограничений в стилизации этого плагина.

3. Ext.ux.FileTreePanel Extension
Клиент-серверное расширение для Ext JS с богатыми возможностями.

25 января 2008 г.

IPB: удалить копирайты и title

Очень часто у владельцев форумов IPB возникает вполне естественный вопрос: "Как удалить в названии форума 'Powered by Invision Power Board'?"
Действительно неприятная штука, которая находится в тегах title. Замечу, что удаление этой надписи в тайтле не нарушает условий лицензии. Как это сделать:
1) открываем файл sources/action_public/boards.php
2) ищем переменную $cp и удаляем ее значение.

22 января 2008 г.

Интернет-решебник по физике (Чертов - Воробьев)

Вступление


Как типичный студент технического ВУЗа, для которого такой предмет как физика был и остается страшной загадкой, я все время искал способы "решения" задач при полном отсутствии знаний. По статистике, большинство задач попадаются из нелюбимого "Задачника по физике" Чертова и Воробьева. Конечно, о существовании такого сайта как irodov.nm.ru я знал давно, но списывать оттуда не очень удобно: необходимо знать номер задачи (а для этого приходится иметь при себе сам задачник), да и решений многих задач там попросту нет.

Решение


Найдя в сети интересный сайтик с решениями практически всех задач из вышеукзанного задачника (хотя многие сетуют, что там есть ошибки), а самое главное - с условием в текстовом формате.
И тут у меня родилась интересная мысль. Сделав по-быстрому бэкап этого сайта себе на хард я принялся ковыряться в HTML-тегах этих страниц. И честно говоря был очень огорчен. Страницы видимо создавались html-редактором а-ля MS Front Page и имели дикое количество ненужных тегов, соответственно и весили много. Но это уже мои заморочки, автору и на том спасибо, что условия в текст перегнал.

Реализация


Закинув задачи к себе на хост, принялся оптимизировать интерфейс. Главную страницу сделал максимально легкой и удобной для использования мобильными браузерами (IE, Opera Mobile, Net Front). Только текст и ничего более. На мой взгляд получилось очень оптимально.

Поиск


Но все же это дело не решало основной проблемы - поиска задач по условию. Поэтому, пришлось применить кое-какие знания php. Написал индексируемый поиск. Ищет он в своем индексном файле (что происходит раз в 40 быстрее, нежели бы он искал постранично), а результаты сортируются по релеватности.
В строке поиска настоятельно рекомендуется указывать ключевые слова без знаков препинания (в индексе знаки удаляются), и слова указывать наиболее уникальные на ваш взгляд.

Так что добро пожаловать: oniksfly.md8.ru/chertov.

12 января 2008 г.

как выровнять DIV по центру

Очень часто возникает необходимость выровнять DIV-блок по центру по ширине или одновременно по ширине и высоте. Можно найти много разных вариантов, но почти все они не кроссбраузерные. Я предлагаю вам действительно кроссбраузерный способ выравнивания DIV-блока по ширине и по высоте, который будет работать под IE6+, Firfex 2+, Safari 3+ и Chrome. Наверняка будет работать где-нибудь еще, но мне нечем проверить.

Итак, берем пример, который покажет нам, как выровнять DIV-блок по центру по высоте и по ширине:
#ID_NAME {
   position: absolute;
   top: 50%;
   left: 50%;
   width: Xpx;
   height: Ypx;
   margin-left: -(X/2)px;
   margin-top: -(Y/2)px;
}

где X и Y - ширина и высота DIV-блока. Т.е. если у вас width 600px, то в margin-left вы должны написать -300px.

Единственный и весьма существенный недостаток — необходимо заранее знать размеры блока.

Посмотреть как это работает можно, например, здесь.

26 декабря 2007 г.

Передача двумерного массива функции

В c++ передавать параметр какой-либо функции вовсе необязательно, если этот параметр можно рассмотреть как глобальный. Но вот что касается каких либо локальных переменных, тут дело обстоит иначе: нужно передавать.
С одномерным массивом все просто. Рассмотрим случай передачи локального одномерного массива mass, который мы инициализируем в функции main() и передаем функции print(), которая нам выведет содержимое массива:

int print(int massive[]) {
for (int i=0; i<5; i++) printf(" %d", massive[i]);
return 0;
}

int main(){
int mass[5]={0, 5, 9, 12, 8};
print(mass);
return 0;
}
обратите внимание, что в функции print мы задаем имя формального параметра как massive, хотя никто не запрещает нам использовать и mass. Я обращаю внимание, что хоть и называем параметр по другому, но если бы наша функция и меняла что-то в массиве, то эти изменения совершались не над копией массива, а над ним самим.

Бывают случаи, когда приходится работать с двумерными массивами. Допустим, вам необходимо передать двумерный массив какой-то хитрой функции. При этом учтем, что наш массив не глобальный, иначе его можно и не указывать в формальных параметрах.
Пусть у нас в функции определяется какой-то локальный массив m2d[3][5]. В таком представлении, грубо говоря, мы можем видеть этот массив в нашем богатом воображении как таблицу, у которой 3 строки и 5 столбцов. Итак вот каким образом мы передаем этот массив функции:

int foo( int (*mass)[5]) {
//some code
....
}

int main(){
//определяем и сразу инициализируем массив
int m2d[3][5] = {
(0, 1, 5, 7, 4),
(5, 12, 8, 0, 7),
(1, 1, 1, 59, 7)
};
foo(m2d);
return 0;
}
вот собственно и все. однако не злоупотребляйте многомерными массивами - это может привести к сжиранию памяти, т.к. в таких случаях ее очень сложно отслеживать.

23 декабря 2007 г.

C++ : как-то связано с треугольным массивом

Засовываем треугольный массив (в данном случае верхнетреугольный) в одномерный массив. и доказываем, что сделали то что нужно, выводя адреса первых элементов всех строк (функция out_adr)

#include <stream.h>
#include <iomanip.h>
int out_adr(int m[])
{
int i,j;
int *p; //указатель на элемент массива
printf("\nHere adreses for first line element's :\n");
for(i=0,j=0;i<4;i++)
{
j+=i;
p=&m[j];
printf("Line number %d: %p\n", i+1, p);
}
return 0;
}


int main()
{
int i;
int a[10]; // сам массив
for(int i=0;i<10;i++)
{
printf("Enter element %d please: ",i+1);
scanf("%d", &a[i]);
}
//выводим матрицу красиво по строкам
for(int d=0;d<10;d++)
{
cout<<setw(6)<<a[d];
//ставим '\n' в конце каждой строки
for(int j=0, i=0;i<5; i++)
{
j+=i;
(j==d+1) ? printf("\n") : printf("");
}
}
out_adr(a);
return 0;
}

16 декабря 2007 г.

С++ аналог функции strcpy

Вот собственно полностью готовый аналог функции strcpy, поддерживает даже параметр "количество символов для копирования", проверяет его валидность. Так же оптимизирована рекурсия и нет пустых вызовов функций. Радуйтесь наздоровье :)

#include <iostream>
#include <stream.h>
#include <stdio.h>
#include <strings.h>
char start[20];
int k; //бу-бу) йа камент )
int n =0; //счетчег сцуко хитрый ^_^
int obrez=0; //покудова копируем строчко

void show_array(char array[], int numb) {
printf("\noutput >> ");
for (int i=0; i<numb; i++) cout<<array[i];
printf(" <<output\n");
}

void copy(char array[], char ready[], int numb, int obrezko) {

if (obrez!=0 or obrez!=k) {numb=obrezko; k=obrezko; }
if(n != numb) {
ready[n] = array[n];
n++;
copy(array,ready,numb,obrezko);
}
}

char enter() {
printf("enter string (20 symbols max): ");
scanf("%s", start);
printf("\nenter number of symbols, would you like to copy or print '0', if you want to copy string till the end : ");
cin>>obrez;
}

int check_size(char for_check[]) {
k = strlen(for_check);
return k;
}

int main() {enter();{
check_size(start);
show_array(start,k);// пишем массивко исходный в консолько
if (obrez>k) {printf("you try copy more, then you have, sorry :(\n"); return 0;}
else {
char finish[k];
copy(start,finish,k,obrez);
show_array(finish,k);// пишем копированный массив в консолько
}
}


13 декабря 2007 г.

C++: рекурсивное копирование строки (без цикла)

Что делает программа: читает строку из 4х символов, введенную с клавиатуры. Выводит ее с помощью функции show_array и затем рекурсивно копирует, используя функцию copy
#include <stream.h>

char tocopy[5];
char start[5];

void show_array(char array[], int numb) {
printf("\noutput >> ");
for (int i=0; i<numb; i++) cout<<array[i];
printf(" <<output\n");
}

void copy(char array[], int numb) {
if(numb != 0) {
tocopy[numb-1] = array[numb];
numb--;
copy(array,numb);
}
else show_array(array,5);
}

char enter() {
printf("enter string (4 symbols): ");
scanf("%s", start);
}

int main() {
enter();
show_array(start,5);
copy(start,5);
}

Код проверен, работает с gcc отлично, а если вы пользуете Борланд, то меняете #include <stream.h> на #include <iostream.h>
рапида, слил