23 декабря 2010 г.

Геттеры и сеттеры в Ruby

Пример работы сеттеров и геттеров в Ruby.
attr_reader  - реализует только геттер для заданного поля
attr_accessor - реализует геттер и сеттер
В примере приведу только на чтение/ запись и чтение (на запись можно сделать по аналогии):
#Пример работы Геттеров и Сеттеров в Ruby
class Setter_and_getter
# Объявляю геттеры и сеттеры
 attr_reader :var_readOnly #Доступ только для чтения
 attr_accessor :var_readWrite #Доступ чтение/записи
 def setData
  @var_readOnly="set" # Устанавливаю значение
  @var_readWrite="r/w";
  puts self.var_readOnly, self.var_readWrite #Проверяю
 end
end
testObj=Setter_and_getter.new
testObj.setData
puts "_________"
#testObj.var_readOnly="fff"; # Получаю ошибку при попытке записи
testObj.var_readWrite="read and write"
puts "I have: #{testObj.var_readOnly}, #{testObj.var_readWrite}" # "Считываю значение"

19 декабря 2010 г.

Добавляем свое меню в Microsoft Bing Maps Silverlight Control

Задача очень проста, создать меню которое будет отображаться на карте.

Меню добавляется в отдельный слой на карте, xaml код:

<m:Map NavigationVisibility="Visible">
  <m:Map.CredentialsProvider>
    <m:ApplicationIdCredentialsProvider ApplicationId="{StaticResource bmk}"/>
  </m:Map.CredentialsProvider>
  <m:Map.Children>
    <m:MapLayer x:Name="ControlLayer"><!-- Собственно меню, вот оно -->
      <Border CornerRadius="5" Width="100" HorizontalAlignment="Right" VerticalAlignment="Top" Background="Black" Opacity="0.8">
        <StackPanel Orientation="Vertical" Margin="5" Height="95">
        <RadioButton Content="Стандарт" GroupName="modeSelection" Foreground="White" IsChecked="True" Name="mode0" Checked="RadioButton_Checked"/>
        <RadioButton Content="Метки" GroupName="modeSelection" Foreground="White" Checked="RadioButton_Checked" Name="mode1"/>
        <RadioButton Content="Редактор" GroupName="modeSelection" Foreground="White" Checked="RadioButton_Checked" Name="mode2"/>
        <RadioButton Content="Навигация" GroupName="modeSelection" Foreground="White" Checked="RadioButton_Checked" Name="mode3"/>
        <StackPanel Orientation="Vertical" x:Name="AnotherControls" Visibility="Collapsed">
          <Button Content="Color" x:Name="colorChange" Click="currentPoint_Click" />
          <Button Content="Delete" x:Name="delComponent" Click="redoLineButton_Click"/>
        </StackPanel>
        <Button Content=">" x:Name="mapMenu"/><!-- Кнопка с помощью которой мы будем "раздвигать" меню -->
        </StackPanel>
      </Border>
    </m:MapLayer>
  </m:Map.Children>
</m:Map>

* This source code was highlighted with Source Code Highlighter.

Код на C#, который может пригодится:

//Обрабатываем расширения меню, которое расположенно в слое на карте
this.mapMenu.Click+=(sen,ev)=>{
  Button currentButton = sen as Button;
  //Если дополнительные пункты меню скрыты => открываем
  if (this.AnotherControls.Visibility == Visibility.Collapsed)
  {
    (currentButton.Parent as Panel).Height += 40;
    this.AnotherControls.Visibility = Visibility.Visible;
    currentButton.Content = "<";
  }
  else//Иначе скрываем
  {
    this.AnotherControls.Visibility = Visibility.Collapsed;
    (currentButton.Parent as Panel).Height -= 40;
    currentButton.Content = ">";
  }
};


* This source code was highlighted with Source Code Highlighter.

27 ноября 2010 г.

WebMatrix. Используем Яндекс в качестве поиска по сайту

Построим поиск по сайту при помощи WebMatrix и поисковика Яндекс. Данную задачу можно было реализовать и на любом языке, но я решил примерить синтаксис Razor к интересной задаче.Суть программки в том, что получив запрос пользователя и его пожелания относительно того что он хочет получить (документ или какой-нибудь материал с сайта), мы делаем запрос к поисковику Yandex. В запросе к серверу мы указываем необходимый сайт и пользовательский запрос. Пользователь получает страницу с поисковой выдачей.
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" type="text/css" href="main.css"/>
  </head>
  <body>
@using System.Linq;
@using System.Collections.Generic;
        @{
            // У нас есть данные введенные в поле ввода, на основание этого нам нужно сформировать запрос к яндексу
      if(IsPost){
        string text=Request["query"];
        //Проверяем введеную строку, если она не пустая, продолжаем
        if(!String.IsNullOrEmpty(text))
        {
          /*В веденной строке необходимо заменить все пробелы "+"ми.
          Для этих целей используем LINQ */
          IEnumerable<char> textAsChar = text.Select(x=>(x==' ')?'+':x);
          text=new String(textAsChar.ToArray());
          string searchType;метром
          //Определяемся с предпочтениями пользователя, поиск по всему или только по документам
          if (Request["searchtype"]=="all") {searchType="";}
          else {searchType="&mime=pdf&mime=doc&mime=xls";}
          //tetrapolis.ru - сайт на котором производим поиск
          string query=String.Format("http://yandex.ru/yandsearch?date=&text={0}"+
          "&site=tetrapolis.ru&rstr=&zone=all&wordforms=all&lang=ru&mime=all&numdoc=10&lr=2{1}",text,searchType);
          //Делаем переход
          Response.Redirect(query);
        }
      }
    }
  <form method="post" action="">
    <input type="text" name="query" />
    <label for="ContactName"></label>
    <button type="submit">Search</button>
    <br/>
    <input type="radio" name="searchtype" value="all" checked/><label>Общий поиск</label>
    <input type="radio" name="searchtype" value="doc" /><label>По документам</label>
  </form>
  </body>
</html>

main.css:
input[name="query"] {
padding:6px 6px 6px 25px;/* Делаем отступы, самый большой - слева */
font-size: 16px;
color: black;
border: 1px solid #b8b8b8;
/*Делаем круглую рамку (html5) */
-webkit-border-radius:10px;
-moz-border-radius:10px;
/*Добавляем лупу */
background: url('lypa2.jpg') no-repeat;
background-position: left center;
}
button[type="submit"]{
padding:6px;
-moz-border-radius:10px;
-webkit-border-radius:10px;
background-color:#d53e07;
color:white;
font-weight:bold;
}


* This source code was highlighted with Source Code Highlighter.

26 ноября 2010 г.

Относительно недавно познакомился с Silverlight компонентом Bing Map Silverlight Control. Контрол этот полезный и интересный. Поэтому я сразу же попытался сотворить с его участием такое приложенице, что то вроде блокнотика на картах, чтобы можно было делать свои пометки и сохранять их в локальном хранилище. Описывать основы работы с контролом не буду, а сразу перейду к реализации. Основная проблема с которойя столкнулся - навигация по карте осуществляется курсором мышки. Как эту опцию отключить, не переопределяя в наследуемом классе обработчик OnMouseLeftButtonDown, я не нашел.
Привожу код нового класса унаследованного от Microsoft.Maps.MapControl.Map.

Рис. Пример работы
Код класса:
public class NonDragableMap : Microsoft.Maps.MapControl.Map
  {
    private Color _strokeColor;//Цвет линии
    //По умолчанию режим редактирования будет отключен и можно будет как
    //и прежде перемещаться по карте курсором мыши
    public bool allowMapMove
    {
      get;
      set;
    }
    public Color strokeColor
    {
      set{
        this._strokeColor = value;
      }
    }
    private double _strokeThickness;
    public double strokeThickness//Толщина линии
    {
      get{
        return this._strokeThickness;
      }
      set{
        this._strokeThickness = value;
      }
    }
    public NonDragableMap()
    {
      strokeColor = Colors.White;//По умолчанию цвет белый
      strokeThickness = 5;
      allowMapMove = true;
    }
    //Объект линии которую рисуем
    private MapPolyline _mapLine;
    //В коллекции координат храним координаты текущей линии:
    private LocationCollection coordinateCollection;
    //Обрабатываем событие нажатие левой клавиши мыши
    //1) Этим методом убирается перемещение карты курсором мыши
    //2) Создаем объекты отвечающие за прорисовку линии
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
      if (this.allowMapMove)
      {
        base.OnMouseLeftButtonDown(e);//Разрешаем работу стандартного обработчика
        return;
      }
      this._mapLine = new MapPolyline();
      this._mapLine.Stroke = new System.Windows.Media.SolidColorBrush(this._strokeColor);//Цвет
      this._mapLine.StrokeThickness = this._strokeThickness;
      this._mapLine.StrokeLineJoin = PenLineJoin.Round;//Скругливаем пересечения - устраняет проблему артефактов при пересечении линий
      this.coordinateCollection = new LocationCollection();
      //Записываем собранные курсором координаты в координаты линии
      this._mapLine.Locations = this.coordinateCollection;
      //Добавляем линию на карту
      this.Children.Add(this._mapLine);
      
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
      if (this.allowMapMove) base.OnMouseMove(e);
      if (this.coordinateCollection != null)
      {
        var d = e.StylusDevice.GetStylusPoints(this);
        foreach (StylusPoint s in d)
        {
          this.coordinateCollection.Add(this.ViewportPointToLocation(new Point(s.X, s.Y)));

        }
        this.coordinateCollection.Distinct();
      }
    }
    //Обрабатываем события отпускания левой кнопки заершаем рисование
    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
      //Завершаем рисование
      this.coordinateCollection = null;
      this._mapLine = null;
      e.Handled=true;
    }
    
  }


* This source code was highlighted with Source Code Highlighter.

21 ноября 2010 г.

Псевдокласс :target и меню на CSS

Работая над редизайном раздела своего сайта, мне в голову пришла идея сделать меню и весь раздел на css. Сейчас поясню подробнее. Одним из нововведений css 3.0, является псевдокласс :target, который применяется к целевому элементу (к идентификатору, указанному в адресной строке браузера) (см. рис. 1).

Рис. 1 Целевой элемент #bk. 
Следовательно, мы можем на страницы разместить якоря, которые будут ссылаться на определенные элементы страницы. Тем самым при переходе по этим ссылкам мы будем применять к ним псевдокласс :target.
Теперь следует сказать, что псевдокласс :target поддерживается почти всеми ныне ходовыми браузерами (Chrome, Safari, FireFox, Opera), кроме Internet Explorerа младше 9.0. Поэтому метод реализации меню средствами css пока лучше заменять JQuery или верстать по старинке с переходом на отдельные страницы, пока не «отомрут» все браузеры не поддерживающие css 3.0.

Представляю Вам отверстанную страницу html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>
<link rel="stylesheet" type="text/css" href="corp.css"/>
</head>
<body>
<--С права меню, а слева контент -->
<div class="part_left">
<ul>
  <li><a href="#bk">Бизнес кредиты</a></li>
  <li><a href="#rko">Расчетно кассовое обслуживание</a></li>
  <li><a href="#dbo">ДБО</a></li>
  <li><a href="">Конверсионные операции</a></li>
  <li><a href="">Корпоративные карты</a></li>
  <li><a href="">Зарплатный проект</a></li>
  <li><a href="">Депозиты</a></li>
  <li><a href="">Векселя</a></li>
</ul>
</div>
<div class="part_right">
  <ul>
    <li id="default">это IE</li>
    <li id="bk">Бизнес кредиты... </li>
    <li id="rko">Расчетно кассовое обслуживание...</li>
    <li id="dbo">Дистанционное банковское обслуживание...</li>
  </ul>
</div>
</body>

<html>

* This source code was highlighted with Source Code Highlighter.
 и сопутствующий corp.CSS файл:
a{
  font-family:Arial, Helvetica, sans-serif;
  font-size:12pt;
  color:black;
  font-weight:bold;
}
a:link{text-decoration:none;}
a:hover{text-decoration:underline;}
a:active{color:#0000CC;}
ul{
  margin:0;
  -webkit-padding-start:0;
  -moz-padding-start:0;
}
li {list-style:none;}
.part_left{
  position:absolute;
  left:0;
  top:0;
  width:300px;
}
.part_right{
  position:absolute;
  left:305px;
  top:0;
  width:auto;
}
/* Задаем параметры для фрагмента #bk, и остальных пунктов меню*/
/* Значения по умолчанию */
li#bk, li#rko, li#dbo{
display:none;
}
/* Когда ссылка активирована */
li#bk:target, li#rko:target, li#dbo:target{
  display:block;
}
/*Возврат к визуализации по умолчанию */
li#bk:not(:target),li#rko:not(:target), li#dbo:not(:target){
  display:none;
}
/* ------- */
/* Дефолтный случай для IE <9.0*/
li#default{
  display:block;
}
/*li#default:target{
  display:block;
}*/
li#default:not(:target){
  display:none;
}


* This source code was highlighted with Source Code Highlighter.

15 сентября 2010 г.

Матричное произведение с помощью LINQ

Бороздя просторы рунета матраска наткнулся на примечательную статью «Поиск декартового произведения с помощью LINQ» на Хабре. А оно не единственное на этом глобусе! Надо вспомнить еще и матричное произведение.  ( эта тема долго не отпускала автора) => Необходимо найти произведение строки на вектор. Практически это означает что надо перемножить элементы двух массивов|списков с одинаковыми порядковыми номерами.
умножение строки на вектор, получаем скаляр
Такая задача может понадобится для перемножения матриц. Поэтому ниже представлен пример LINQ запроса возвращающий список перемноженных элементов. Не буду изголятся воспользуюсь функцией join :
double[] s1 = { 1, 2 };
double[] s2 = { 7, 8 };

var t1 = s1.Select((e, i) => new { element = e, index = i });
var t2 = s2.Select((e, i) => new { element = e, index = i });

var t3 = from o1 in t1 join o2 in t2 on o1.index equals o2.index select (double)o1.element*(double)o2.element;

foreach(double t in t3) Console.WriteLine("T: {0}", t);


* This source code was highlighted with Source Code Highlighter.

5 сентября 2010 г.

Грибы убийцы

Matraska много бродил в интернете, но токого еще не читал. Грипы манипуляторы|паразиты (Ophiocordyceps unilateralis). Опять грибы и опять сводят с ума, но нет не matraskу - муравьишек-древоточцев...

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

Финальная сцена удивительна. Фантастика отдыхает. Гриб заставляет муравья забраться на нижнюю сторону листа, повелевает вцепиться в него челюстями и замереть. Затем убивает. А потом прорастает сквозь голову. Отращивает коробочку со спорами, высыпает их, заражая других муравьев.


Муравей, погибший за власть грибов. Гриб пророс сквозь голову насекомого. Утолщение - коробочка со спорами. Снимок сделан в Таиланде. 


Matraska знает, муравьи не одиноки - в людях тоже растут грибы!


31 августа 2010 г.

Как подключить нетбук к мобильному интрнету при помощи одного мобильника

Острая потребность в мобильном интернете во время работы на нетбуке вынудила меня приспособить свой SonyEricsson w350 в качестве модема.
SonyEricsson W350 достался мне не только со скидкой и альбомом Дженифер Лопез, но и Usb кабельком и диском с програмным обеспечением. Вот это програмное обеспечение и кабилек и позволило Windows XP распазнать мобильник в системе в качестве модема (а без диска толька как внешний диск).
Теперь, Подключение нетбука к интернету через SonyEricsson w350 отделяет всего пара шагов.
Сразу скажу, в мобильнике симка ТЕЛЕ2, для других операторов надо будет поменять запрашиваемый телефонный номер.
Шаг 1. Переходим в "Сетевые подключения" и выбираем опцию создать новое подключение.
Шаг 2. В открывшемся модальном окне выбираем "Далее" и последовательно выбираем "Подключить к интернету",  "установить подключение вручную", "через обычный модем".
Шаг 3. Вводим имя поставщика услуг, можно любое.
Шаг 4. Вводим номер телефона, для ТЕЛЕ2 в Санкт-Петербурге  это будет *99***6#
Шаг 5. Имя пользователя и пароль можно не вводить, нажимаем "Готово" и радуемся интернету!

Очистка корзины в Ubuntu LXDE

Пародоксально, но факт после установки пакетов Lubuntu поверх Ubuntu 10.4 я не смог найти в среде LXDE корзину. В системе есть функция удалить в корзину, а возможности чтоб ее очистить нету...
Единственный метод, который я смог найти, чтобы поправить данный недуг это почистить корзину принудительно из консоли.
Чистим корзину в Ubuntu LXDE следующим образом:
#: sudo rm -rf ~/.Trash/*
или
#: sudo rm -R ~/.local/share/Trash/files/*

6 августа 2010 г.

Как я делал ЧПУ в Битриксе

Сегодня по долгу работу мне понадобилось на сайте сделать ЧПУ для статей на сайте под CMS Bitrix. Причина - это предоставить "прямую" ссылку на статью поисковику, а не параметрическую , как по умолчанию в Битриксе.
Рис. 1 Диалог задания символьного кода 
Такая возможность появляется если для каждой статьи задавать свой уникальный символьный код (Рис. 1) .

Введение
На сайте отображение списка статей/новостей  (любых других вариантов данных из инфоблоков) делается в виде группы сочетаний текст + картинка + ссылка "подробнее".
Картинка связана с содержанием. А ссылка ведет на другую страницу. Правильнее сказать, извлекается из базы и подается под "правильным" URL. В Битриксе хранение данных в БД и последующее извлечение с помощью компонентов организуется в Инфоблоках. Для реализации такой модели на сайте понадобятся:
  • стандартные компоненты Битрикса "Новость детально" и "список новостей";
  • данные в Инфоблоках.
Хоть ЧПУ и задается в отдельном разделе Админки. Подстановка адреса в необходимом формате происходит непосредственно в компонентах отвечающих за отображение данных. А необходимый для этого символьный код задается в самом элементе инфоблока.

Настройка Инфоблока
Первым делом необходимо настроить информационный блок который будет использоваться для статей: Панель управления=> настроки=> информационный блоки=> необходимый инфоблок (Рис. 2).
Во вкладке "Инфоблок в поле" в поле "URL страницы детального просмотра:"
указываем путь ЧПУ до страницы с инфоблоком детального описания:
#SITE_DIR#/kredit_v_banke/#ELEMENT_CODE#/
Т.е. адрес статьи будет выглядеть, как www.site.ru/kredit_v_banke/code_elementa/ где /kredit_v_banke/ - под каталог, будет описан при настройке ЧПУ
Рис. 2
Настройка списка новостей
Вторым шагом будет настройка компонента "список новостей". После размещения на странице этого компонента Битрикса:
1) переходим в параметры компонента и указываем следующие настройки:
"Тип информационного блока" и "Код информационного блока" выбираем созданный на предыдущем шаге инфоблок.
2) в поле "URL страницы детального просмотра (по умолчанию - из настроек инфоблока):" дублируем значение:
/kredit_v_banke/#ELEMENT_CODE#/

Настройка страницы отображения
Третий шаг - настройка компонента "новость детально". На заранее созданной странице размещаем компонент Битрикса "новость детально". В параметрах компонента
"Тип информационного блока" => указываем тип созданного инфоблока
"Код новости" => вводим: ={$_REQUEST["code"]} где code - это параметр, который будет использоваться при настройки ЧПУ, а все значение  выражения будет содержать символьный код элемента инфоблока.

Настройка ЧПУ в Админке
Четвертым шагом настраиваем ЧПУ. Переходим Панель управления=> настройки=>обработка адресов => новая запись (Рис. 3)


Рис. 3
В поле "условие" указываем регулярное выражение для url:
#^/kredit_v_banke/([\w\d]+)(/)?#
где ([\w\d]+)(/)? означает что
\w - можно использовать символы A-Z, a-z, _
\d - числа,
[...]+ - всего знаков должно быть >=1
(/)? - в конце должен быть слэш, но не обязательно
Фрагмент заключенный в круглые скобки, потом предстанет в поле "Правило" под значением  параметра $1.

В поле "Файл:" указываем путь до страницы с компонентом детального описания:
/content/article_detail_1.php

Поле "Компонент" оставляем пустым

В поле "Правило:" прописываем: code=$1 где:  
code - GET параметр URL запроса ,
$1  - первый параметр из регулярного выражения url.

По умолчанию путь до статьи должен быть
/content/article_detail_1.php?code=element_code
где code это заданный в настройках параметр, а element_code символьный код эл-та в этой последовательности символьный код 1-й параметр по этому $1. Благодаря ЧПУ путь до статьи будет:
/kredit_v_banke/element_code/
Теперь "применяем" и сохраняем. теперь все должно работать.

10 июля 2010 г.

Mail Agent для Linux

Не секрет, что компания mail.ru выпускает свой mail агент почти для всех мобильных платформ, но так и не выпустила mail agent для Linux.
И вот разные дельцы и умельцы с просторов нашей Родины предлагают юзерам различные пути решения этой напасти: от Яббера до эмуляции Windows.
И похоже самое пригодное решение это myagent-im (url не указываю, ибо всегда можно на Гуглить).

Установка обычно происходит в три этапа:
Шаг #1: sudo dpkg -i myagent-im_02.02_i386.deb
Итог: Выдаст ошибку так как не найдет необходимые пакеты для Mail агента

Шаг #2: sudo apt-get install -f
Итог: Докачаются необходимые пакеты

Шаг #3: Повторить Шаг #1
Итог: Mail agent установлен

7 июля 2010 г.

Национальный поисковик???

Создание национального поисковика - очередная бредовая идея!Чем он будет лучше остальных? Зачем он нужен?
Вроде бы и говорится что не будет Гос।финансирование, но и не исключается। Видимо все же кому-то хочится фильтровать трафик в рунете или подзаработать на распиле финансирования...
P.S.: А может он будет просто фильтровать выдачу Яндекса...
http://www.lenta.ru/news/2010/07/07/engine/

2 июля 2010 г.

Что-то для первого сообщения

Eeny, meeny, miny, moe,
Catch a tiger by the toe.
If he hollers let him go,
Eeny, meeny, miny, moe.

Эники, бэники, ели вареники,
Эники, бэники, съели вареники,
Эники, бэники, хоп!
Вышел зелёный сироп.