пятница, 3 апреля 2009 г.

Гуглу посвящается


Есть ли жизнь после апа?


За недельку с тройки в нолик
Улетел PR на морде,
И внутряк весь провалился,
Я и апу уж не рад

Водолазы ищут клады,
Только кладов мне не надо,
Я хочу, чтобы вернули
Мне PR на ФотоСтарт!

За недельку-у-у
С тройки в нолик,
Я тепе-е-е-рь,
Как параноик,
Пусть вернётся
Пузомерка,
Без неё мне
Жизни нет!

вторник, 10 марта 2009 г.

САПОЗАВРЫ

Пока муж ставил мне один плагинчик для ФФ, родилась вот такая ода. Читать с чувством:

САПОЗАВРЫ

Они живут среди людей,
За аватарой пряча лица,
Охотятся уж много дней
Они за синей птицей ТИЦа.

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

В труде бегут за днями дни -
Ничто не достаётся даром,
И в Гугл веруют они,
Им Яндекс видится в кошмарах...


Не закончено, так как плагинчик уже поставился :).

среда, 25 февраля 2009 г.

Блиноеды всех стран - объединяйтесь!

Вот и продолжается самая вкусная неделя в году - Масленица. Сегодня в моей семье актуальны манные блины, которые я сделаа по рецепту одной знакомой форумчанки.

пятница, 30 января 2009 г.

Куроед.ру

На "Куроеда" смело заходи
И выбирай всё, что душа желает!
Все ужасы диеты позади,
Куриный бог тебя оберегает!

Рецепты фрикаделек, консоме
Воображенье просто поражают,
Котлеты, отбивные и суфле
Душе гурмана праздник обещают!

Нежность

Приготовила сегодня потрясающе вкусный рулет. Муж съел 2/3 прям сходу, чем вызвал мою озабоченность и опасение за его здоровье. Он только усмехнулся и пришёл в хорошее расположение духа. Итак, рулет "Нежность":


суббота, 17 января 2009 г.

О сладком и не только

Прекрасный сайт ещё один созрел,
О Сладком.ру его мы окрестили,
Труды, старанья мы в него вложили -
Поставь же ссылку, тот, кто лицезрел!

суббота, 3 января 2009 г.

Атака клонов

Мой оригинальный сайт "Готовим вместе" безжалостно склонирован. Теперь он красный и содержит блюда украинской кухни. Итак, встречайте! Подкрепись.com...

пятница, 2 января 2009 г.

Лучший мой подарочек - это...

На Новый Год получила в подарок сайт. Его можно посмотреть здесь: Готовим вместе. Он посвящен моим кулинарным рецептам и является по сути даже блогом. Только комментарии пока не готовы.

вторник, 23 сентября 2008 г.

Спящий котик

Сегодня в папке с фотографиями нарылся вот такой котик. Как же он сладко СПИТ!




Фото сделано мобильным телефоном с примитивной камерой, объектив котрой к тому же покрылся пылью и мусором.

пятница, 12 сентября 2008 г.

Проект Термодом

Термодом - проект, посвященный местному производителю пенопластовых плит и термоблоков. Компания "Термодом" - первый в Крыму и Севастополе производитель термоблоков и листового пенопласта, использующихся в строительстве по технологии "Теплый дом".

понедельник, 25 августа 2008 г.

Блог моего друга

Мой друг devaka открыл блог, посвященный SEO. Приглашаю всех познакомиться с его авторскими статьями и переводами англоязычных ресурсов. Очень много полезной и интересной информации :).

Ситуация с ADSense выправилась!

Муж написал письмо с апелляцией. Сначала пришел ответ, в котром было всё то же самое: аккаунт мой причиняет страшный вред рекламодателям и он будет закрыт навеки.

Через пару дней пришло второе письмо. В нём говорилось, что пройдя повторную проверку, мой аккаунт разблокировали. Восстановить рекламу на сайте я смогу через 48 часов. И вот, адсенс снова со мной, снова на Фотостартике!!! Приятно, что реабилитировали, что оказалось всё по-честному. Тем более, что на самом деле мой аккаунт никак рекламодателям не угрожал.

пятница, 8 августа 2008 г.

Рыбный ужас нашего городка

Ужасная ситуация разворачивается вокруг любимой гимназии и её директора, Виктора Альбертовича. Оганесяна обвиняют во всех смертных грехах. В противовес делаем, что можем - http://www.gymnasium1.org/

вторник, 5 августа 2008 г.

Гугл АдСенс

Очень расстроил меня один сегодняшний факт. На моём сайте висел AdSense. Где-то с апреля. Приносил 20-50 центов с таргет-аудиторией порядка 200 человек в день. Мне, конечно, эти деньги вообще погоды не делали. Но было приятно думать, что когда-нибудь, через годы, с этих денег я сделаю апгрейд на зеркалку.

Так вот, сегодня я обнаружила, что вместо рекламных блоков висит "Невозможно отобразить страницу". Пожаловалсь мужу, который этот AdSense и прикручивал. Он зашел в аккаунт, а там письмо. Своими словами: ваш аккаунт заблокированв связи с тем, что мой сайт "представляет опасность для рекламодателей".

Мне так стало обидно. Со своей параноидальной честностью, доставшейся мне от мамы-коммунистки, я никогда ничего противоправного не делала. Фотостарт - это всё равно что мой ребенок. Только холила и лелеяла. Не накликивала, не накручивала просмотры. А тут письмо и с такой формулировкой.

Одного знакомого отлучили из-за порнокартинок. Это понятно. Другому прислали предупреждение, чтоб не скликивал. Это тоже понятно...Но за что же меня? Это всё равно, что я работала на них несколько месяцев, а теперь выгнали и денег не заплатили. И главное, вообще без обоснования. Ну что это за "опасность для рекламодателей"??? Мне всегда казалось, что Гугл - образец честности. А теперь на собственной шкуре... Обидно. Нет, не из-за 30 центов в день! Обидно, что как-то не по-человески, за мечту о зеркалке...

суббота, 19 июля 2008 г.

Фотоэкскурсии

Сегодня появилась на свет первая моя фотоэкскурсия по Главной улице северо-восточной части херсонесского городища. Расчитываю, что со временем материала прибавится. Планов много, времени нет :).

вторник, 1 июля 2008 г.

DataGrid html CellRenderer

На днях возникла необходимость в одной из задач заставить табличный компонент Flex-а (DataGrid) заставить отображать html-форматированный текст.
Табличка имела заранее неизвестное число столбцов, которое определялось из подгружаемого XML.

Соответственно, для каждой требуемой колонки назначался CellRenderer (в моем случае, для всех):


for (var i:Number=0;i<colxml.children().length();i++)
{
var newcol:DataGridColumn=new DataGridColumn(colxml.children()[i].@title);
newcol.width=colxml.children()[i].@width;
newcol.resizable=false;
newcol.dataField=colxml.children()[i].@attr;
if (colxml.children()[i].@sortby!=null)
{
newcol.sortCompareFunction=mySort;
}
newcol.wordWrap=true;
newcol.itemRenderer=new MultilineHTMLRenderer();
if (colArr[i]!=null) colArr[i]=newcol
else
colArr.push(newcol);
}
DG.columns=colArr;

Вот так формировался мой DataGrid. При этом каждой колонке можно назначить свой рендерер. Но этот рендерер необходимо предварительно создать.
Представляет собой он отдельный as-файл MultilineHTMLRenderer.as, в котором введен следующий код:
package
{
import mx.controls.DataGrid;
import mx.controls.dataGridClasses.DataGridItemRenderer;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.*
import mx.styles.StyleManager;
import mx.core.IFactory;

public class MultilineHTMLRenderer extends DataGridItemRenderer implements IFactory
{

public function MultilineHTMLRenderer()
{
super();
}
public function newInstance():*
{
return new MultilineHTMLRenderer();
}

override public function validateProperties():void
{
super.validateProperties();
if (listData)
{
var dg:DataGrid = DataGrid(listData.owner);
var column:DataGridColumn = dg.columns[listData.columnIndex];
styleSheet=InterfaceManager.myStyleSheet;
multiline=true;
htmlText = data[column.dataField];

}
}

}

}

Переопределяется метод validateProperties(), в котором задаются:

  • styleSheet - заранее сформированный в проекте набор стилей (каким шрифтом, какого цвета выводятся ссылки и пр.). Его можно не указывать, если нет требований. Можно управлять внешним видом через html-тэги, а стили игнорировать.
  • multiline - нужно обязательно указать в true, иначе тэги переноса строки не будут работать. Например,
    .
  • htmlText - свойство, в которое записывается сам текст, содержащий разметку. Он берется из data[column.dataField].

воскресенье, 25 мая 2008 г.

Photoglade.com

Сегодня запустили в интернет еще один проект с фотографиями цветов. Он называется PhotoGlade. Переводится как фотолужайка. Название придумала я :). Информации пока что немного, все на стадии наполнения и развития.

воскресенье, 18 мая 2008 г.

Изменение угла поворота камеры в Papervision

Рассмотрим пример изменения угла поворота камеры вслед за курсором мыши. За основу берем все тот же пример, с текстурой кошки, натянутой на примитив плоскости.

Первре отличие будет состоять уже в том, что пользоваться мы будем не Camera3D, а FreeCamera3D, котоая обладает нужными свойствами: rotationY и rotationX. Судя по названию, именно их изменение позволит реализовать поворот.

package
{
import flash.display.Sprite;
import flash.events.*;
import flash.filters.*;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.MovieScene3D;
import org.papervision3d.core.*;
import org.papervision3d.core.geom.*;

[SWF(width='400',height='400',backgroundColor='0x000000',frameRate='30')]

public class ExampleCamera extends Sprite
{
private var container: Sprite;
private var scene: MovieScene3D;
private var camera: FreeCamera3D;
private var plane:Plane;

private var mouseDown:Boolean;
private var mousePosition:Vertex3D;


public function ExampleCamera()
{
container = new Sprite;
container.x = 200;
container.y = 200;
addChild( container );

scene = new MovieScene3D( container );

camera = new FreeCamera3D();
camera.z = -500;
camera.zoom = 5;

var material:BitmapFileMaterial = new BitmapFileMaterial("texture.jpg");
plane = new Plane( material, 300, 300, 1, 1 );
scene.addChild( plane );
mouseDown = false;
mousePosition = new Vertex3D(0,0,0);
stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
stage.addEventListener( MouseEvent.MOUSE_MOVE, mouseMoveHandler );
stage.addEventListener( Event.ENTER_FRAME, enterFrameHandler );

}

private function enterFrameHandler(event:Event):void
{
scene.renderCamera( camera );
}

private function mouseDownHandler(event:MouseEvent):void
{

mousePosition.x = event.stageX;
mousePosition.y = event.stageY;
mouseDown = true;
}

private function mouseUpHandler(event:MouseEvent):void
{
mouseDown = false;
}

private function mouseMoveHandler(event:MouseEvent):void
{
if( mouseDown )
{
camera.rotationY -= (mousePosition.x - event.stageX)*0.20;
camera.rotationX += (mousePosition.y - event.stageY)*0.20;
mousePosition.x = event.stageX;
mousePosition.y = event.stageY;
}
}


}

}

Принцип действия программы таков: по нажатию левой клавиши мыши засекается флаг mouseDown - сигнал начала поворота камеры. Если при нажатой клавише мыши происходит ее перемещение, то угол поворота камеры (rotationY и rotationX) меняется пропорционально тому, насколько был подвинут курсор.

вторник, 13 мая 2008 г.

Поиграемся с камерой

Для последующих опытов нам понадобится один из предыдущих примеров. А именно, пример с текстурой. Напомню, что в файле texture.jpg хранится изображение кота. И этот файл режит рядом с флешкой.
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.utils.Timer;
import flash.filters.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.MovieScene3D;
import org.papervision3d.core.*;

[SWF(width='400',height='400',backgroundColor='0x000000',frameRate='30')]

public class ExampleTransformationRotate extends Sprite
{
private var container: Sprite;
private var scene: MovieScene3D;
private var camera: Camera3D;
private var plane:Plane;
private var myTimer:Timer = new Timer(10);

public function ExampleTransformationRotate()
{
container = new Sprite;
container.x = 200;
container.y = 200;
addChild( container );
scene = new MovieScene3D( container );
camera = new Camera3D();
camera.z = -500;
camera.zoom = 5;

var material:BitmapFileMaterial = new BitmapFileMaterial("texture.jpg");
plane = new Plane( material, 300, 300, 1, 1 );
container.filters = filter;
scene.addChild( plane );
myTimer.start();
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);

}

private function timerHandler( ev:TimerEvent ): void
{
scene.renderCamera( camera );
}
}

}

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

Чтобы заставить камеру реагировать на перемещение мыши в последнюю функцию следует добавить метод hover, который и заменит нам приближение и повороты предмета вручную, как мы делали до этого.

private function timerHandler( ev:TimerEvent ): void
{
camera.hover(0, (200-mouseX)*.1, (200-mouseY)*.1);

scene.renderCamera( camera );
}
Попробуем разобраться, какие параметры принимает этот новый метод и как он работает. Начнем со второго, более простого вопроса. Метод hover перемещает камеру вокруг объекта, изменяя угол зрения. Перемещение может происходить (на сегодняшний день) двумя способами. Насколько я могу судить, в зависимости от первого параметра, переданного в метод. В частности, если передать 0, то камера будет совершать перемещение и по OZ тоже, тогда как в случае переданной 1 - только по OX и OY.
Два следующих параметра передают координаты точки обзора. В данном примере они находятся в зависимости от координат курсора.

Рекомендую попробовать изменить примитив на сферу или куб и посмотреть эффект.

Пока что из-за отутствия опыта я не могу судить, но мне кажется, что все же чаще придется изменять координаты камеры вручную (camera.y, camera.z, camera.x), нежели пользоваться рассмотренным методом. И тем не менее, о его существовании стоит знать.
Как быстро пролетели праздники! Но не всё коту Масленница, пора возвращаться к обычному жизненному ритму.

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

Fringed tulip

Black tulip

Ludmila tulip