<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-447397810890053070</id><updated>2012-01-27T15:23:26.762-08:00</updated><category term='jtable'/><category term='postgresql'/><category term='html5'/><category term='encoding'/><category term='swing'/><category term='virsh'/><category term='require'/><category term='api'/><category term='cobbler'/><category term='летающий фонарик'/><category term='redhat'/><category term='without x'/><category term='tftp'/><category term='extention'/><category term='dhcpd'/><category term='recaptcha'/><category term='rails'/><category term='utf8'/><category term='performance'/><category term='javascript_include_tag'/><category term='exchange'/><category term='bind'/><category term='webui'/><category term='xen'/><category term='banner'/><category term='multiple'/><category term='facebook'/><category term='spree'/><category term='firstdata'/><category term='java'/><category term='mysql'/><category term='rails3'/><category term='changer'/><category term='статистика'/><category term='capybara'/><category term='cucumber'/><category term='callback'/><category term='slots'/><category term='bluehost'/><category term='cannot remove Object::ClassMethods'/><category term='mysql-proxy'/><category term='html'/><category term='nokogiri'/><category term='snmp'/><category term='dhcp'/><category term='middleware'/><category term='watir'/><category term='ruby'/><category term='node.js'/><category term='couchdb'/><category term='activerecord'/><category term='selinux'/><category term='qtruby'/><category term='domains'/><category term='comment'/><category term='list'/><category term='cache'/><category term='платежные системы'/><category term='PGError'/><category term='jenkins'/><category term='country_select_tag'/><category term='permission'/><category term='amazon.бюрократия'/><category term='status'/><category term='signal'/><category term='lua'/><category term='mplayer'/><category term='openx'/><category term='switch'/><category term='node'/><category term='amazon'/><category term='sproutcore'/><category term='kvm'/><category term='host.hrStorage.hrStorageTable'/><category term='subtitle'/><category term='libvirt'/><category term='repository'/><category term='named'/><category term='network install'/><category term='webmoney'/><category term='standby'/><category term='skip validation'/><category term='random'/><category term='hudson'/><category term='book'/><category term='vim surround rails'/><category term='tranz'/><category term='jquery'/><category term='failover'/><category term='disk space'/><category term='piwik'/><category term='paypal'/><category term='yandex.market'/><category term='no such file to load'/><category term='skip callback'/><category term='HTML5_Designing_Rich_Internet_Applications'/><category term='tablespace'/><category term='jruby'/><category term='qt'/><category term='slot'/><category term='defer'/><title type='text'>зарубки</title><subtitle type='html'>Зарубки оставляю на своем пути
что б потом не искать</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1765383711230500028</id><published>2011-08-14T02:12:00.000-07:00</published><updated>2011-08-14T02:12:19.938-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='domains'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><title type='text'>Кеширование в мультидоменном веб приложении</title><content type='html'>добавляем в контроллер&lt;br /&gt;&lt;code&gt;&lt;br /&gt; before_filter { |c|&lt;br /&gt;&amp;nbsp&amp;nbsp   c.class.page_cache_directory = "#{RAILS_ROOT}/public/#{c.request.host}" &lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;в логах сразу видим как пишется &lt;br /&gt;&lt;code&gt;&lt;br /&gt;Write fragment views/sub.domain.com/s/test (2.6ms)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;и при повторном запросе&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Read fragment views/sub.domain.com/s/test (0.9ms)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Итого: с 300мс до 10 мс рендеринг страницы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1765383711230500028?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1765383711230500028/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1765383711230500028' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1765383711230500028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1765383711230500028'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/08/blog-post_14.html' title='Кеширование в мультидоменном веб приложении'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3265241031897185547</id><published>2011-08-03T00:25:00.000-07:00</published><updated>2011-08-03T00:25:48.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sproutcore'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Получение в SproutCore нескольких массивов данных одним запросом к бакэнду.</title><content type='html'>﻿Получение нескольких массивов данных одним запросом к бакэнду.&lt;br /&gt;&lt;br /&gt;Допустим, у нас есть приложение Blog, в котором есть модели Blog.Post и Blog.Quote. Пусть они выводятся сервером по адресу '/records.json' и в json выглядят вот так:&lt;br /&gt;&lt;code&gt;{posts: [{post1}, {post2}, {post3}], quotes: [{quote1}, {quote2}, {quote3}]}&lt;/code&gt;&lt;br /&gt;Что бы уменьшить количество запросов к серверу и тем самым увеличить скорость получения данных, нам нужно немного изменить datasource приложения.&lt;br /&gt;&lt;b&gt;Шаг 1. Создать запрос:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;Blog.QUERY_POSTS_AND_QUOTES = SC.Query.local([Blog.Post, Blog.Quote]);&lt;/code&gt;&lt;br /&gt;В SC.Query.local можно передавать не только один тип записи, но и массив типов.&lt;br /&gt;&lt;b&gt;Шаг 2. Создать хэш-таблицу с ссылками на данные и типами записей:&lt;/b&gt;&lt;br /&gt;Это шаг нужен что бы избежать огромного количества if в функции fetch()&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Blog.Datasource = SC.DataSource.extend({&lt;br /&gt;&amp;nbsp&amp;nbsp urls: { &lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        posts_and_quotes: { url: '/records.json', records: ['posts', 'quotes'] }&lt;br /&gt;&amp;nbsp&amp;nbsp },&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Так же нам нужно поправить шан запрос, установив ему атрибум id, соответствующий имени одного из элементов urls, в данном случае posts_and_quotes:&lt;br /&gt;&lt;code&gt;Blog.QUERY_POSTS_AND_QUOTES = SC.Query.local([Blog.Post,Blog.Quote]).set('id','posts_and_quotes');&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Шаг 3. Пишем fetch():&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;fetch: function(store, query) {&lt;br /&gt;&amp;nbsp&amp;nbsp    &lt;b&gt;//Получаем id запроса и берём из urls ссылку для запроса в соответствии с этим id&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp    var id = query.get('id');&lt;br /&gt;&amp;nbsp&amp;nbsp    &lt;b&gt;//Если id не задан, значит запрос не должен обращаться к серверу&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp    if(!id) return NO;&lt;br /&gt;&amp;nbsp&amp;nbsp    var  url = this.urls[id]['url'],&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      funcs = this.get('fetchDidComplete'),&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      &lt;b&gt;//Если нужна особая обработка какого нибудь запроса то в fetchDidComplete&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      //нужно добавить функцию, имя которой совпадает с id (ещё одна хэш-таблица).&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      //Если имя не указано, то по завершении запроса будет вызвана default функция&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      func = funcs[id] || funcs['default'];&lt;br /&gt;&amp;nbsp&amp;nbsp    SC.Request.getUrl(url).json().notify(this, func, store, query).send();&lt;br /&gt;&amp;nbsp&amp;nbsp    return YES;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Шаг 4. Обрабатываем полученные данные:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;fetchDidComplete:  {&lt;br /&gt;&amp;nbsp&amp;nbsp    'default': function(response, store, query) {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      if (SC.ok(response)) {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//В зависимости от id берём нужные записи из полученного json&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        var body = this.urls[query.get('id')]['records'];&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//Получаем тип записи&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        var recordType = query.get('recordType');&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//Если тип не задан, значит их несколько и они хранятся в recordsTypes&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        if (!recordType) { &lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp          var recordTypes = query.get('recordTypes'); //Получаем типы записей&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp          jQuery.each(body, function(i) {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            &lt;b&gt;//Загружаем в store записи разных типов. Порядок выдачи записей разных типов сервером&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            //и порядок этих типов в запросе должны совпадать. Т.е.: &lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            //SC.Query.local[Scm.Product, Scm.Taxon] и {products: [{product1}, {product2}], taxons: [{taxon1}, {taxon2}]}&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            store.loadRecords(recordTypes[i], response.get('body')[body[i]]);           });&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        }&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        else {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            store.loadRecords(recordType, response.get('body'));&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        }&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        store.dataSourceDidFetchQuery(query);&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      } else store.dataSourceDidErrorQuery(query, response);&lt;br /&gt;&amp;nbsp&amp;nbsp    }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Шаг 5. Используем новый запрос в приложении:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;var data = Blog.store.find(Blog.QUERY_POSTS_AND_QUOTES);&lt;/code&gt;&lt;br /&gt;Теперь, что бы получить отдельно posts, а отдельно quotes используем scoped queries:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var posts = data.find(SC.Query.local(Blog.Post);&lt;br /&gt;var quotes = data.find(SC.Query.local(Blog.Quote);&lt;/code&gt;&lt;br /&gt;Ну и теперь можно заполнить ArrayController'ы приложения полученными данными:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Blog.postsController.set('content', posts);&lt;br /&gt;Blog.quotesController.set('content', quotes);&lt;/code&gt;&lt;br /&gt;Полностью datasource будет выглядеть так:&lt;br /&gt;&lt;code&gt;Blog.Datasource = SC.DataSource.extend({&lt;br /&gt;urls: {&lt;br /&gt;&amp;nbsp&amp;nbsp        posts_and_quotes: { url: '/records.json', records: ['posts', 'quotes'] }&lt;br /&gt;},&lt;br /&gt;fetch: function(store, query) {&lt;br /&gt;&amp;nbsp&amp;nbsp    &lt;b&gt;//Получаем id запроса и берём из urls ссылку для запроса в соответствии с этим id&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp    var id = query.get('id');&lt;br /&gt;&amp;nbsp&amp;nbsp    &lt;b&gt;//Если id не задан, значит запрос не должен обращаться к серверу&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp    if(!id) return NO;&lt;br /&gt;&amp;nbsp&amp;nbsp    var  url = this.urls[id]['url'],&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      funcs = this.get('fetchDidComplete'),&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      &lt;b&gt;//Если нужна особая обработка какого нибудь запроса то в fetchDidComplete&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      &lt;b&gt;//нужно добавить функцию, имя которой совпадает с id (ещё одна хэш-таблица).&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      &lt;b&gt;//Если имя не указано, то по завершении запроса будет вызвана default функция&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      func = funcs[id] || funcs['default'];  &lt;br /&gt;&amp;nbsp&amp;nbsp    SC.Request.getUrl(url).json().notify(this, func, store, query).send();    &lt;br /&gt;&amp;nbsp&amp;nbsp    return YES;&lt;br /&gt;},&lt;br /&gt;fetchDidComplete:  {&lt;br /&gt;&amp;nbsp&amp;nbsp    'default': function(response, store, query) {&lt;br /&gt;&amp;nbsp&amp;nbsp      if (SC.ok(response)) {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//В зависимости от id берём нужные записи из полученного json&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        var body = this.urls[query.get('id')]['records'];&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//Получаем тип записи&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        var recordType = query.get('recordType');&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        &lt;b&gt;//Если тип не задан, значит их несколько и они хранятся в recordsTypes&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        if (!recordType) { &lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp          var recordTypes = query.get('recordTypes'); &lt;b&gt;//Получаем типы записей&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp          jQuery.each(body, function(i) {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            &lt;b&gt;//Загружаем в store записи разных типов. Порядок выдачи записей разных типов сервером&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            &lt;b&gt;//и порядок этих типов в запросе должны совпадать. Т.е.: &lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            &lt;b&gt;//SC.Query.local[Scm.Product, Scm.Taxon] и {products: [{product1}, {product2}], taxons: [{taxon1}, {taxon2}]}&lt;/b&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            store.loadRecords(recordTypes[i], response.get('body')[body[i]]);           });&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        }&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        else {&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp            store.loadRecords(recordType, response.get('body'));&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp       }&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        store.dataSourceDidFetchQuery(query);&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp      } else store.dataSourceDidErrorQuery(query, response);&lt;br /&gt;&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp    }&lt;br /&gt;&amp;nbsp&amp;nbsp  },&lt;br /&gt;});&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3265241031897185547?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3265241031897185547/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3265241031897185547' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3265241031897185547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3265241031897185547'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/08/blog-post.html' title='Получение в SproutCore нескольких массивов данных одним запросом к бакэнду.'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4206066160883984636</id><published>2011-08-02T23:58:00.000-07:00</published><updated>2011-08-02T23:58:06.504-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sproutcore'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Tradefast &amp; Sproutcore 1.6: Создание и использование тем</title><content type='html'>Tradefast &amp; Sproutcore 1.6: Создание и использование тем&lt;br /&gt;В этом небольшом руководстве описывается процесс создания и последующего использования  своей темы для sproutcore-приложения, импользующего handlebars в качестве шаблонизатора.&lt;br /&gt;&lt;br /&gt;В самом простом (и наиболее часто используемом) случае, тема - это набор css-стилей. Помимо этого темы могут заменять DOM, сгенерированный через views приложения.&lt;br /&gt;&lt;br /&gt;Создадим новую тему командой sc-gen theme и назовём её tradefast-red:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sc-gen theme tradefast-red&lt;br /&gt;~ Created directory at themes/tradefast_red&lt;br /&gt;~ Created directory at themes/tradefast_red/resources&lt;br /&gt;~ Created file at themes/tradefast_red/resources/theme_styles.css&lt;br /&gt;~ Created file at themes/tradefast_red/theme.js&lt;br /&gt;~ Created file at themes/tradefast_red/Buildfile&lt;br /&gt;Your theme is now ready to use!&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sproutcore добавил в /themes (если этой папки нет, то она так же будет сгенерирована) папку /tradefast_red, в которой хранятся все необходимые для темы файлы. В main.js определяется новая тема и добавляется в приложение:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TradefastRed = SC.AceTheme.create({&lt;br /&gt; name: 'tradefast-red'&lt;br /&gt;});&lt;br /&gt;SC.Theme.addTheme(TradefastRed);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;По-умолчанию новая тема создаётся как под-тема темы Ace, которая не нужна, если приложение использует handlebars. Поэтому лучше удалить ‘Ace’ из определения темы:&lt;br /&gt;&lt;code&gt;TradefastRed = SC.Theme.create&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Так же стоит убрать ace из tradefast_red/Buildfile:&lt;br /&gt;Было:  &lt;code&gt;config :tradefast_red, :css_theme =&gt; 'ace.tradefast-red'&lt;/code&gt;&lt;br /&gt;Стало: &lt;code&gt;config :tradefast_red, :css_theme =&gt; 'tradefast-red'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В папке /resources находятся стили вашей темы, по-умолчанию это файл theme_style.css, но вы можете добавлять сколько угодно css-файлов. В этой же папке стоит хранить все изображения, связанные с темой.&lt;br /&gt;&lt;br /&gt;Что бы использовать тему в приложении, нужно указать её в Buildfile самого приложения, который лежит на одном уровне с папками /themes и /apps:&lt;br /&gt;&lt;code&gt;config :all, :required =&gt; :sproutcore', :theme =&gt; "tradefast_red"&lt;/code&gt;&lt;br /&gt;Обратите внимание, что имя темы совпадает с именем папки с темой в /themes/. Не перепутайте с именем, указанном в main.js. :theme =&gt; “tradefast-red” не сработает.&lt;br /&gt;&lt;br /&gt;Остаётся только перезапустить сервер sc-server и посмотреть на новую тему в действии. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Внимание&lt;/b&gt;: не рекомендуется при использовании тем создавать css внутри самого приложения, так как эти стили определяются до темы и переписывают все правила, заданные в вашей теме. Вместо того что бы портить css кучей !important, лучше хранить полный css в каждой теме отдельно. Такой подход так же позволит переопределять макет приложения без лишних телодвижений.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4206066160883984636?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4206066160883984636/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4206066160883984636' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4206066160883984636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4206066160883984636'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/08/tradefast-sproutcore-16.html' title='Tradefast &amp; Sproutcore 1.6: Создание и использование тем'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4670270063373844639</id><published>2011-07-14T09:15:00.000-07:00</published><updated>2011-07-15T04:56:08.107-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libvirt'/><category scheme='http://www.blogger.com/atom/ns#' term='list'/><category scheme='http://www.blogger.com/atom/ns#' term='xen'/><category scheme='http://www.blogger.com/atom/ns#' term='kvm'/><category scheme='http://www.blogger.com/atom/ns#' term='virsh'/><title type='text'>latest xen 4 and libvirt.</title><content type='html'>For connect libvirt to xen4 on fedora15 require install latest version of libvirt.&lt;br /&gt;Today it is &lt;br /&gt;&lt;code&gt;rpm -Uvh http://kojipkgs.fedoraproject.org/packages/libvirt/0.9.3/2.fc16/x86_64/libvirt-0.9.3-2.fc16.x86_64.rpm http://kojipkgs.fedoraproject.org/packages/libvirt/0.9.3/2.fc16/x86_64/libvirt-python-0.9.3-2.fc16.x86_64.rpm http://kojipkgs.fedoraproject.org/packages/libvirt/0.9.3/2.fc16/x86_64/libvirt-client-0.9.3-2.fc16.x86_64.rpm http://kojipkgs.fedoraproject.org/packages/parted/3.0/2.fc16/x86_64/parted-3.0-2.fc16.x86_64.rpm  http://kojipkgs.fedoraproject.org/packages/netcf/0.1.8/1.fc16/x86_64/netcf-libs-0.1.8-1.fc16.x86_64.rpm &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But after tests: kvm is faster simpler and better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4670270063373844639?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4670270063373844639/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4670270063373844639' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4670270063373844639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4670270063373844639'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/07/latest-xen-4-and-libvirt.html' title='latest xen 4 and libvirt.'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-285966462096507060</id><published>2011-07-10T01:26:00.000-07:00</published><updated>2011-07-10T01:26:07.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nokogiri'/><category scheme='http://www.blogger.com/atom/ns#' term='capybara'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>capybara get html</title><content type='html'>For get html&lt;br /&gt;&lt;code&gt;find("ul.random_quotes").native.to_html&lt;/code&gt;&lt;br /&gt;for get elements count &lt;br /&gt;&lt;code&gt;find("ul.random_quotes").native.search("li").size&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-285966462096507060?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/285966462096507060/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=285966462096507060' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/285966462096507060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/285966462096507060'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/07/capybara-get-html.html' title='capybara get html'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7113107252331243394</id><published>2011-07-07T11:25:00.000-07:00</published><updated>2011-07-07T11:25:14.965-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='without x'/><category scheme='http://www.blogger.com/atom/ns#' term='cucumber'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>запускаем тесты на jenkins</title><content type='html'>Приложение без иксов может работать в фреймбуфере.&lt;br /&gt;Для рельсы есть готовый гем headless, добавляем его в Gemfile&lt;br /&gt;&lt;code&gt;gem "headless"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В features/support/env.rb добавляем проверку на то как запускать тесты - в иксах или Xvfb:&lt;br /&gt;&lt;code&gt;if ENV['HEADLESS'] == 'true'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;  require 'headless'&lt;/code&gt;&lt;br /&gt;&lt;code&gt;  headless = Headless.new&lt;/code&gt;&lt;br /&gt;&lt;code&gt;  headless.start&lt;/code&gt;&lt;br /&gt;&lt;code&gt;  at_exit do&lt;/code&gt;&lt;br /&gt;&lt;code&gt;    headless.destroy&lt;/code&gt;&lt;br /&gt;&lt;code&gt;  end&lt;/code&gt;&lt;br /&gt;&lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ну а фреймбуфер ставим в зависимости от дистрибутива.Для федоры &lt;br /&gt;&lt;code&gt; yum install xorg-x11-server-Xvfb &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;теперь перед запуском в окружение стоит добавить &lt;code&gt;export HEADLESS='true'&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7113107252331243394?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7113107252331243394/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7113107252331243394' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7113107252331243394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7113107252331243394'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/07/jenkins.html' title='запускаем тесты на jenkins'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7852759200908053055</id><published>2011-07-01T03:15:00.001-07:00</published><updated>2011-07-01T03:15:42.197-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><title type='text'>spree amazon api</title><content type='html'>Hello&lt;br /&gt;released new spree ext. for export products from amazon.&lt;br /&gt;https://github.com/pronix/spree_amazon_api&lt;br /&gt;&lt;br /&gt;Spree &lt;-&gt; Amazon&lt;br /&gt;Requirements&lt;br /&gt;&lt;br /&gt;Spree &gt;= 0.60.0&lt;br /&gt;Installation&lt;br /&gt;&lt;br /&gt;Add to Gemfile:&lt;br /&gt;&lt;br /&gt;gem "spree_amazon_api", :git =&gt; "git@github.com:pronix/spree_amazon_api.git"&lt;br /&gt;&lt;br /&gt;run task:&lt;br /&gt;&lt;br /&gt;rake spree_amazon_api:install&lt;br /&gt;&lt;br /&gt;run migrate: (add amazon_id to product table)&lt;br /&gt;&lt;br /&gt;rake db:migrate&lt;br /&gt;&lt;br /&gt;Root taxons define in file: db/amazon_categories.yml&lt;br /&gt;Configure Amazon access:&lt;br /&gt;&lt;br /&gt;Setting amazon options in amazon.yml file( Rails.root/config).&lt;br /&gt;Configure example:&lt;br /&gt;&lt;br /&gt;development:&lt;br /&gt;  :configure:                                                   # acces options&lt;br /&gt;    :aWS_access_key_id: 0XQXXC6YV2C85DX1BF02&lt;br /&gt;    :aWS_secret_key: fwLOn0Y/IUXEM8Hk49o7QJV+ryOscbhXRb6CmA5l&lt;br /&gt;    :response_group: 'Large'&lt;br /&gt;    :country: 'us'                                                  # region&lt;br /&gt;   :query:                                                      # search options&lt;br /&gt;     :q: "%{q}"                                                 # %{q} replace on user keywords&lt;br /&gt;     :options:&lt;br /&gt;        :search_index: 'Books'&lt;br /&gt;        :response_group: 'Large, Accessories'&lt;br /&gt;        :sort: "salesrank"                                       # default sort&lt;br /&gt;&lt;br /&gt;production:&lt;br /&gt;  :configure:&lt;br /&gt;    :aWS_access_key_id: 0XQXXC6YV2C85DX1BF02&lt;br /&gt;    :aWS_secret_key: fwLOn0Y/IUXEM8Hk49o7QJV+ryOscbhXRb6CmA5l&lt;br /&gt;    :response_group: 'Large'&lt;br /&gt;    :country: 'us'&lt;br /&gt;  :query:&lt;br /&gt;    :q: "%{q}"&lt;br /&gt;    :options:&lt;br /&gt;      :search_index: 'Books'&lt;br /&gt;      :response_group: 'Large, Accessories'&lt;br /&gt;      :sort: "salesrank"&lt;br /&gt;&lt;br /&gt;Search options&lt;br /&gt;&lt;br /&gt;To customize the search, set search format in param :q(Rails.root/config/amazon.yml)&lt;br /&gt;&lt;br /&gt;For instance: if you set :q with "%{q} made in Vermont" then user query "tools" will be replaced with "tools made in Vermont"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7852759200908053055?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7852759200908053055/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7852759200908053055' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7852759200908053055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7852759200908053055'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/07/spree-amazon-api.html' title='spree amazon api'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4776448146316916731</id><published>2011-04-07T06:38:00.000-07:00</published><updated>2011-04-07T06:38:00.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><category scheme='http://www.blogger.com/atom/ns#' term='middleware'/><title type='text'>spree+middleware</title><content type='html'>Enable middleware from ext. for spree&lt;br /&gt;in class Engine insert that&lt;br /&gt;&lt;code&gt; &lt;br /&gt;initializer "sc_middleware" do |app|&lt;br /&gt;  app.middleware.use ScMiddleware&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4776448146316916731?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4776448146316916731/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4776448146316916731' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4776448146316916731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4776448146316916731'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/04/spreemiddleware.html' title='spree+middleware'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1956947553074518560</id><published>2011-03-27T17:57:00.000-07:00</published><updated>2011-03-27T17:57:50.883-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='switch'/><category scheme='http://www.blogger.com/atom/ns#' term='standby'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>switch postgresql from standby to normal mode.</title><content type='html'>After configure hot standby on postgresql 9.0, i configure heartbeat for switch slave server to master.&lt;br /&gt;require add to recovery.conf this line&lt;br /&gt;&lt;code&gt;trigger_file = '/var/lib/pgsql/9.0/data/MASTER'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And after &lt;br /&gt;&lt;code&gt;touch /var/lib/pgsql/9.0/data/MASTER &lt;/code&gt;&lt;br /&gt;and &lt;code&gt; service postgresql-9.0 restart &lt;/code&gt;&lt;br /&gt;server work as read/write server.&lt;br /&gt;&lt;br /&gt;for return to standby require sync db files between master and slave&lt;br /&gt;and&lt;br /&gt;&lt;code&gt; mv /var/lib/pgsql/9.0/data/recovery.done  /var/lib/pgsql/9.0/data/recovery.conf&lt;/code&gt;&lt;br /&gt;and again restart postgresql server&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1956947553074518560?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1956947553074518560/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1956947553074518560' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1956947553074518560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1956947553074518560'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/03/switch-postgresql-from-standby-to.html' title='switch postgresql from standby to normal mode.'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1750771121507801142</id><published>2011-03-03T15:33:00.000-08:00</published><updated>2011-03-03T15:33:48.481-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='selinux'/><category scheme='http://www.blogger.com/atom/ns#' term='permission'/><category scheme='http://www.blogger.com/atom/ns#' term='tablespace'/><title type='text'>postgresql tablespace selinux</title><content type='html'>I need store separate databases in different path.&lt;br /&gt;require define this space - it is called tablespace in postgresql.&lt;br /&gt;For create tablespace require set selinux context to path.&lt;br /&gt;example: i create new path /ooo/target&lt;br /&gt;&lt;code&gt;chcon -u system_u -r object_r -t var_lib_t /ooo&lt;/code&gt;&lt;br /&gt;&lt;code&gt;chcon -u system_u -r object_r -t postgresql_db_t /ooo/target&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Complete for create table space:&lt;br /&gt;&lt;code&gt;CREATE TABLESPACE new_target_space LOCATION '/ooo/target';&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1750771121507801142?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1750771121507801142/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1750771121507801142' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1750771121507801142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1750771121507801142'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/03/postgresql-tablespace-selinux.html' title='postgresql tablespace selinux'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4256494481480382548</id><published>2011-01-06T03:18:00.000-08:00</published><updated>2011-01-06T03:18:25.126-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utf8'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>hudson utf8 encoding</title><content type='html'>For test we use hudson, but it show russian letters not correct.&lt;br /&gt;Require set java option&lt;br /&gt;&lt;code&gt;-Dfile.encoding=UTF8&lt;/code&gt;&lt;br /&gt;and restart hudson&lt;br /&gt;for fedora and centos &lt;br /&gt;&lt;code&gt; HUDSON_JAVA_OPTIONS="-Djava.awt.headless=true -Dfile.encoding=UTF8" &lt;/code&gt;&lt;br /&gt;in /etc/sysconfig/hudson&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4256494481480382548?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4256494481480382548/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4256494481480382548' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4256494481480382548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4256494481480382548'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2011/01/hudson-utf8-encoding.html' title='hudson utf8 encoding'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1095684114428514877</id><published>2010-12-18T11:49:00.000-08:00</published><updated>2010-12-18T15:53:18.376-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><category scheme='http://www.blogger.com/atom/ns#' term='webmoney'/><title type='text'>Spree + webmoney</title><content type='html'>Сприи в россии не хватало приема вебманей.&lt;br /&gt;Теперь все просто.&lt;br /&gt;Ставим плагин &lt;a href="https://github.com/pronix/spree_webmoney"&gt;https://github.com/pronix/spree_webmoney&lt;/a&gt;&lt;br /&gt;В Gemfile прописываем &lt;br /&gt;&lt;code&gt;gem "spree_webmoney",   :git =&gt; "git://github.com/pronix/spree_webmoney.git"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Запускаем:&lt;br /&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;br /&gt;&lt;code&gt;rake spree_webmoney:install&lt;/code&gt;&lt;br /&gt;И готово. Регистрируйтесь мерчантом в вебмани и принимайте платежи.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1095684114428514877?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1095684114428514877/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1095684114428514877' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1095684114428514877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1095684114428514877'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/12/spree-webmoney.html' title='Spree + webmoney'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4186792240227665992</id><published>2010-12-08T18:40:00.000-08:00</published><updated>2011-07-15T05:02:43.042-07:00</updated><title type='text'>Debugging Rails Applications With ruby-debug</title><content type='html'>&lt;a href="http://intridea.com/2010/12/7/debug_rails_application_with_ruby-debug?blog=company"&gt;Debugging Rails Applications With ruby-debug&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4186792240227665992?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://intridea.com/2010/12/7/debug_rails_application_with_ruby-debug?blog=company' title='Debugging Rails Applications With ruby-debug'/><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4186792240227665992/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4186792240227665992' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4186792240227665992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4186792240227665992'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/12/debugging-rails-applications-with-ruby.html' title='Debugging Rails Applications With ruby-debug'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3750329087398211685</id><published>2010-11-11T07:03:00.000-08:00</published><updated>2011-07-15T05:02:43.042-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'></title><content type='html'>Random ActiveRecord row:&lt;br /&gt;&lt;br /&gt;Model.first(:offset =&gt; rand(Model.count))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3750329087398211685?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3750329087398211685/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3750329087398211685' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3750329087398211685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3750329087398211685'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/11/random-activerecord-row-randmodel.html' title=''/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8535639152133019025</id><published>2010-11-06T04:33:00.000-07:00</published><updated>2010-12-18T15:53:36.187-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tranz'/><category scheme='http://www.blogger.com/atom/ns#' term='paypal'/><category scheme='http://www.blogger.com/atom/ns#' term='платежные системы'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='webmoney'/><title type='text'>tranz</title><content type='html'>Быстро добавляем платежные системы и транзакции в проект&lt;br /&gt;https://github.com/pronix/tranz&lt;br /&gt;&lt;br /&gt;Ставим плагин&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rails plugin install git://github.com/pronix/tranz.git&lt;/code&gt;&lt;br /&gt;&lt;code&gt;rails g tranz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Если все получилось удачно - то удаляем плагин&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rails plugin remove tranz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8535639152133019025?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8535639152133019025/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8535639152133019025' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8535639152133019025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8535639152133019025'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/11/tranz.html' title='tranz'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-5144482503185023023</id><published>2010-10-31T14:36:00.000-07:00</published><updated>2010-12-18T15:53:50.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon.бюрократия'/><title type='text'>Подтверждение карточки на амазоне</title><content type='html'>Решил бекапы на амазон положить.&lt;br /&gt;Зарегистрировался и карточку кредитную добавил.&lt;br /&gt;Как и всякий забугорный сервис - русских перепроверяет.&lt;br /&gt;Просят факс отправить , либо написать ,что факса нет тогда они придумают другой способ.&lt;br /&gt;Три раза спросили отправить факс.&lt;br /&gt;Три раза я написал , что факса нет.&lt;br /&gt;В итоге - написал "are you stupid ? i haven't fax."&lt;br /&gt;И все - аккаунт активировали :)&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-5144482503185023023?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/5144482503185023023/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=5144482503185023023' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5144482503185023023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5144482503185023023'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/blog-post_31.html' title='Подтверждение карточки на амазоне'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8324150190699520099</id><published>2010-10-22T11:57:00.000-07:00</published><updated>2010-12-18T15:54:01.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='статистика'/><category scheme='http://www.blogger.com/atom/ns#' term='piwik'/><title type='text'>piwik vs analytics</title><content type='html'>Сбор аналитики на всех новых, и по мере сил на старых проектах будет собираться с помощью piwik.&lt;br /&gt;Гугловский ананлитикс тормозной и бестолковый.&lt;br /&gt;А с пивиком я получаю статистику в реальном времени, о каждом действии пользователя.&lt;br /&gt;Возможность сторонним программам использовать его апи и писать свой скрипт сбора статистики.&lt;br /&gt;Короче гугланалитикс - отстой&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8324150190699520099?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8324150190699520099/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8324150190699520099' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8324150190699520099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8324150190699520099'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/piwik-vs-analytics.html' title='piwik vs analytics'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3877484153543872134</id><published>2010-10-20T06:53:00.000-07:00</published><updated>2010-12-18T15:54:13.857-08:00</updated><title type='text'>простенький автообзвон</title><content type='html'>&lt;code&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'erubis'&lt;br /&gt;AST_SOUND_PATH='/var/spool/asterisk/outgoing/'&lt;br /&gt;&lt;br /&gt;%w( 0965970142 ).each do |phone|&lt;br /&gt;template = Erubis::Eruby.new &lt;&lt;-EOFChannel: SIP/sipnet/38&lt;%=p%&gt;&lt;br /&gt;Callerid: 7645060&lt;br /&gt;MaxRetries: 2&lt;br /&gt;RetryTime: 20&lt;br /&gt;WaitTime: 60&lt;br /&gt;Context: play_file&lt;br /&gt;Extension: s&lt;br /&gt;Priority: 1&lt;br /&gt;EOF&lt;br /&gt;File.open("#{AST_SOUND_PATH}#{phone}.call", 'w').chown(498,496)&lt;br /&gt;File.open("#{AST_SOUND_PATH}#{phone}.call",'w') {|f|&lt;br /&gt;f.puts template.result( :p =&gt; phone)&lt;br /&gt;}&lt;br /&gt;end&lt;br /&gt;# end loop&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3877484153543872134?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3877484153543872134/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3877484153543872134' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3877484153543872134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3877484153543872134'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/blog-post_20.html' title='простенький автообзвон'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4998476690394592033</id><published>2010-10-12T01:19:00.000-07:00</published><updated>2011-07-15T05:02:43.042-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5_Designing_Rich_Internet_Applications'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Книги для приятного досуга</title><content type='html'>&lt;a href="http://www.mediavalise.com/file/57c4tks5/HTML5_up_and_running.pdf.html"&gt;http://www.mediavalise.com/file/57c4tks5/HTML5_up_and_running.pdf.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediavalise.com/file/5k3zx7fn/Manning.jQuery.in.Action.2nd.Edition.Jun.2010.pdf.html"&gt;http://www.mediavalise.com/file/5k3zx7fn/Manning.jQuery.in.Action.2nd.Edition.Jun.2010.pdf.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mediavalise.com/file/q54fpgxe/HTML5_Designing_Rich_Internet_Applications.pdf.html"&gt;http://www.mediavalise.com/file/q54fpgxe/HTML5_Designing_Rich_Internet_Applications.pdf.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4998476690394592033?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4998476690394592033/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4998476690394592033' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4998476690394592033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4998476690394592033'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/blog-post_12.html' title='Книги для приятного досуга'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1726966878188095531</id><published>2010-10-09T10:30:00.000-07:00</published><updated>2010-12-18T15:55:48.671-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='defer'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript_include_tag'/><title type='text'>defer for javascript_include_tag</title><content type='html'>Причин не использовать defer (отрисовку страницы не дожидаясь загрузки элементов src  с данным тегом).&lt;br /&gt;Первый порыв писать патчик был высмеян после изучения кода contant_tag.&lt;br /&gt;Уже все есть.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;= javascript_include_tag %w(application.js  jquery.min.js  jquery.progressbar.min.js  rails.js) , :defer =&gt; true&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1726966878188095531?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1726966878188095531/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1726966878188095531' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1726966878188095531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1726966878188095531'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/defer-for-javascriptincludetag.html' title='defer for javascript_include_tag'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-5818687829836614496</id><published>2010-10-09T08:15:00.000-07:00</published><updated>2010-12-18T15:56:01.604-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='летающий фонарик'/><title type='text'>летающий фонарик</title><content type='html'>C братом Григорием(6 лет) решили сделать летающий фонарик.&lt;br /&gt;Взлетел ,как сказал Гринька , летающий мусорный бак.&lt;br /&gt;Делали фонарик из 120л мешка для мусора, проволки и пропарафиненой газеты.&lt;br /&gt;Взлетел хорошо, но газету надо парафинить больше и распорки из проволки делать длиннее - а то мешок чуть-чуть поплавился.&lt;br /&gt;В планах летающий "мусорный бак" ночью - вдруг светится будет.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-5818687829836614496?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/5818687829836614496/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=5818687829836614496' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5818687829836614496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5818687829836614496'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/blog-post.html' title='летающий фонарик'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3042421486631758114</id><published>2010-10-03T05:34:00.001-07:00</published><updated>2010-12-18T15:56:09.706-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='require'/><category scheme='http://www.blogger.com/atom/ns#' term='no such file to load'/><title type='text'>require</title><content type='html'>Ищется файл тут $LOAD_PATH&lt;br /&gt;Добавить директорию $LOAD_PATH &lt;&lt; "/path"&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3042421486631758114?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3042421486631758114/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3042421486631758114' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3042421486631758114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3042421486631758114'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/10/require.html' title='require'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-2727233360675416618</id><published>2010-09-28T03:16:00.001-07:00</published><updated>2010-12-18T15:56:14.169-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='subtitle'/><category scheme='http://www.blogger.com/atom/ns#' term='mplayer'/><title type='text'>Кодировка субтитров в mplayer</title><content type='html'>Явно указываем mplayer -subcp cp1251&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-2727233360675416618?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/2727233360675416618/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=2727233360675416618' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/2727233360675416618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/2727233360675416618'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/mplayer.html' title='Кодировка субтитров в mplayer'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3022328438801038768</id><published>2010-09-25T02:29:00.000-07:00</published><updated>2011-07-15T05:02:43.042-07:00</updated><title type='text'>authlogic create user without session</title><content type='html'>Понадобилось создавать пользователя без создания сессии.&lt;br /&gt;&lt;br /&gt;В authlogic за это отвечает библиотека acts_as_authentic&lt;br /&gt;&lt;br /&gt;И метод save_without_session_maintenance &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Save the record and skip session maintenance all together.&lt;br /&gt;&lt;br /&gt;        def save_without_session_maintenance(*args)&lt;br /&gt;&lt;br /&gt;          self.skip_session_maintenance = true&lt;br /&gt;&lt;br /&gt;          result = save(*args)&lt;br /&gt;&lt;br /&gt;          self.skip_session_maintenance = false&lt;br /&gt;&lt;br /&gt;          result&lt;br /&gt;&lt;br /&gt;        end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3022328438801038768?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3022328438801038768/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3022328438801038768' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3022328438801038768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3022328438801038768'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/authlogic-create-user-without-session.html' title='authlogic create user without session'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3080400529052178983</id><published>2010-09-25T02:28:00.000-07:00</published><updated>2011-07-15T05:02:43.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='node'/><category scheme='http://www.blogger.com/atom/ns#' term='node.js'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><title type='text'>node.js + couchdb</title><content type='html'>Использование CouchDB с узлом.js&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Apache CouchDB это документ-ориентировочная база данных, которая может делать запросы&lt;br /&gt;&lt;br /&gt;и индексироваться в стиле MapReduce, используя JavaScript. CouchDB также предлагает пошаговую репликацию&lt;br /&gt;&lt;br /&gt;с двусторонним обнаружением конфликта и его разрешением.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  Для начала установите CouchDB.Вы можете скачать CouchDB здесь.&lt;br /&gt;&lt;br /&gt;  Следующи шаг - установите npm, потому что все клевые пакеты node - в npm:)&lt;br /&gt;&lt;br /&gt;  Node имеет поддержку в HTTP лучше, чем любой язык, с которым я когда-либо работал и по совпадению интерфейс CouchDB &lt;br /&gt;&lt;br /&gt;доступен исключительно через HTTP. Для начала, давайте просто познакомимся с CouchDB, используя HTTP библиотеку и позже &lt;br /&gt;&lt;br /&gt;мы посмотрим на некоторые высшие абстракции.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Знакомство с CouchDB, используя запрос&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;npm install request&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Это упрощенный клиент HTTP, который находится в довольно широком использовании среди разработчиков node.Давайте получим&lt;br /&gt;&lt;br /&gt;список всех баз данных в вашем CouchDB.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var sys = require('sys')&lt;br /&gt;&lt;br /&gt;  , request = require('request')&lt;br /&gt;&lt;br /&gt;    , h = {accept:'application/json', 'content-type':'application/json'}&lt;br /&gt;&lt;br /&gt;      ;&lt;br /&gt;&lt;br /&gt;       request({uri:'http://myname.couchone.com:5984/_all_dbs', headers:h}, function (err, response, body) {&lt;br /&gt;&lt;br /&gt;           console.log(sys.inspect(JSON.parse(body)));&lt;br /&gt;&lt;br /&gt;       })&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если ваш CouchDB - только что установленный, вы увидете что-нибудь подобное этому.&lt;br /&gt;&lt;br /&gt;[ '_users' ]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Сейчас давайте создадим базу данных. Вы можете легко зделать это в Futon, веб интерфейсе для CouchDB, но веселей будет зделать&lt;br /&gt;&lt;br /&gt;это в node.&lt;br /&gt;&lt;br /&gt;request({uri:'http://myname.couchone.com:5984/dbname', method:'PUT', headers:h}, function (err, response, body) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (response.statusCode !== 201) throw new Error("Could not create database. "+body);&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Код ошибки фактически является ошибоками из HTTP клиента. Ни один правильный HTTP ответ не будет иметь&lt;br /&gt;&lt;br /&gt;кода ошибки, поэтому если вы хотите проверить правильность созданной базы данных, нам нужно проверить код ответа.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если вы вышли из режима Админ  и создали админскую учетную запись (что вы должны сделать)&lt;br /&gt;&lt;br /&gt;вы получите ошибку в которой говориться о том что вам нужно быть админом для того чтобы создавать новые базы данных&lt;br /&gt;&lt;br /&gt;Авторизация типа basic поддерживаеться в CouchDB и в запросе, так что мы только добавим их к url.&lt;br /&gt;&lt;br /&gt;request({uri:'http://myaccount:password@myname.couchone.com:5984/dbname', method:'PUT', headers:h}, function (err, response, body) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (response.statusCode !== 201) throw "Could not create database. "+body;&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;все просто.&lt;br /&gt;&lt;br /&gt;Сейчас давайте создадим и получим несколько документов&lt;br /&gt;&lt;br /&gt;var dburi = 'http://myaccount:password@myname.couchone.com:5984/dbname'&lt;br /&gt;&lt;br /&gt;request({uri:dburi, method:'POST', body:JSON.stringify({data:'somedata'})}, function (err, resp, b) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (resp.statusCode !== 201) throw new Error("Could not create document. "+b);&lt;br /&gt;&lt;br /&gt;        console.log(b);&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вы увидете в console print что-нибудь подобное этому.&lt;br /&gt;&lt;br /&gt;{"id":"8s7dhf8s7dah8f7sdf8dh", "rev":"1-7sdfy87s", seq:1}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Поскольку мы не имели id для этого документа, мы сделали POST к dburi и это создало новое id для нас. Если мы имеем &lt;br /&gt;&lt;br /&gt;что-нибудь, что уже имеет определенный id, подобно тому мы имеем JSON тело твита от твитера  API, мы&lt;br /&gt;&lt;br /&gt;должны использовать id и использовать вызов PUT.&lt;br /&gt;&lt;br /&gt;tweet._id = 'twitter-'+tweet.id&lt;br /&gt;&lt;br /&gt;request({uri:dburi+'/'+tweet._id, method:'PUT', body:JSON.stringify(tweet)}, function (err, resp, b) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (resp.statusCode !== 201) throw new Error("Could not create document. "+b);&lt;br /&gt;&lt;br /&gt;        console.log(b);&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;И мы должны увидеть чтото вроде етого&lt;br /&gt;&lt;br /&gt;{"id":"twitter-192837218", "rev":"1-3dfy87s", seq:2}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Мы можем получить етот документ запросом GET&lt;br /&gt;&lt;br /&gt;request({uri:dburi+'/twitter-192837218'}, function (err, resp, b) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (resp.statusCode !== 200) throw new Error("Could not get document. "+b);&lt;br /&gt;&lt;br /&gt;        console.log(sys.inspect(JSON.parse(b)));&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Или мы можем получить множество документов используя all_docs api.&lt;br /&gt;&lt;br /&gt;request({uri:dburi+'/_all_docs?startkey="twitter-"&amp;endkey="twitter-ZZZ"&amp;include_docs=true'}, function (err, resp, b) {&lt;br /&gt;&lt;br /&gt;    if (err) throw err;&lt;br /&gt;&lt;br /&gt;      if (resp.statusCode !== 200) throw new Error("Could not get document. "+b);&lt;br /&gt;&lt;br /&gt;        console.log(sys.inspect(JSON.parse(b)));&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;all_docs API также позволяет фильтрацию startkey и endkey параметров на id, так что запрос подобно этому только даст нам &lt;br /&gt;&lt;br /&gt;обратно документы твитера.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для создания индексов и запрашивания их, я рекомендую вам почитать O'Reilly's CouchDB The Definitive Guide где всё доступно &lt;br /&gt;&lt;br /&gt;изложено.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Знакомство с CouchDB, используя node-couchdb&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для некоторых людей прямое использование HTTP API может быть немного долговатым.существует 4 или 5 node библиотек которые &lt;br /&gt;&lt;br /&gt;предоставляют высшие абстракции, но только у меня есть время говорить про node-couchdb.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;создавать db просто&lt;br /&gt;&lt;br /&gt;var couchdb = require('node-couchdb/lib/couchdb')&lt;br /&gt;&lt;br /&gt;client = couchdb.createClient(5984, 'myname.couchone.com'),&lt;br /&gt;&lt;br /&gt;db = client.db('my-db');&lt;br /&gt;&lt;br /&gt;db.exists(function (err, exists) {&lt;br /&gt;&lt;br /&gt;    if (!exists) db.create();&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;создавать документ так же просто&lt;br /&gt;&lt;br /&gt;db.saveDoc('my-doc', {awesome: 'couch fun'}, function(er, ok) {&lt;br /&gt;&lt;br /&gt;    if (er) throw new Error(JSON.stringify(er));&lt;br /&gt;&lt;br /&gt;      console.log('Saved my first doc to the couch!');&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;получить документ еще проще&lt;br /&gt;&lt;br /&gt;db.getDoc('my-doc', function(er, doc) {&lt;br /&gt;&lt;br /&gt;    if (er) throw new Error(JSON.stringify(er));&lt;br /&gt;&lt;br /&gt;      console.log('Fetched my new doc from couch:');&lt;br /&gt;&lt;br /&gt;        console.log(doc);&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Получить все документы - еще про... паждите паждите ... ще!&lt;br /&gt;&lt;br /&gt;db.allDocs(function (err, resp) {&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;db.allDocs({startkey:'twitter-', endkey:'twitter-ZZZ'}, function (err, resp) {&lt;br /&gt;&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Знакомство с couch используя creationix's couch-client&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tim Caswell только что запустил свой собственный клиент CouchDB и начал выполнять инструкции приведенные ниже.&lt;br /&gt;&lt;br /&gt;модуль couch-client ето гибрид между http помощником запросов и полностью абстрактным драйвером базы данных.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;подключение к базе данных простое&lt;br /&gt;&lt;br /&gt;var CouchClient = require('couch-client');&lt;br /&gt;&lt;br /&gt;var Users = CouchClient("http://username:password@yourhost:5984/users");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если база данных не существует вы получите ошибки, но это легко сделать с помощью выставленой функцией request&lt;br /&gt;&lt;br /&gt;Users.request("PUT", "/users", function (err, result) {&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;как  видите, вы можете зделать любой произвольный http запрос используя функцию request(). Она располагаеться между 2 и 4 аргументом&lt;br /&gt;&lt;br /&gt;CouchClient#request(method, path[, body][, callback])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если вы оставите повторный вызов, это вернет движение вместо этого. Повторный вызов, если указано получают два аргумента&lt;br /&gt;&lt;br /&gt;callback(err, result). err исключительный обьект если чтото пошло не так.&lt;br /&gt;&lt;br /&gt;result  ответ от couch уже JSON.parseed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;так же для лучшего представления,couch-client имеет несколько utility функций которые исполнят общие задачи со всеми красиво&lt;br /&gt;&lt;br /&gt;представлеными встроеными штуками.Это имеет соединение объединяющее, http keep-alive, и соединение запроса используя couch's bulk APIs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* CouchClient#save(doc, callback) -сохранить документ &lt;br /&gt;&lt;br /&gt;* CouchClient#get(key, callback) -получить документ&lt;br /&gt;&lt;br /&gt;* CouchClient#remove(key/doc, callback) -удалить документ &lt;br /&gt;&lt;br /&gt;* CouchClient@changes(since, callback) -наблюдения за изменениями во всей базе данных с since and вызовы callback один раз за именение (експерементально)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3080400529052178983?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3080400529052178983/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3080400529052178983' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3080400529052178983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3080400529052178983'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/nodejs-couchdb.html' title='node.js + couchdb'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-643489155556415927</id><published>2010-09-25T02:27:00.000-07:00</published><updated>2011-07-15T05:02:43.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='country_select_tag'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3 country_select_tag</title><content type='html'>В некоторых плагинах,хелперах оставшихся от второй рельсы надо отключать экранирование кода.&lt;br /&gt;&lt;br /&gt;content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &amp;block) &lt;br /&gt;&lt;br /&gt;вот значение escape по умолчанию стоит true - тогда как для вывода кода надо false&lt;br /&gt;&lt;br /&gt;например в country_select_tag я сделал так&lt;br /&gt;&lt;br /&gt;content_tag(:select, countries, options.merge(:id =&gt; "#{@object_name}_#{@method_name}", :name =&gt; "#{@object_name}[#{@method_name}]"),false)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-643489155556415927?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/643489155556415927/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=643489155556415927' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/643489155556415927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/643489155556415927'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/rails3-countryselecttag.html' title='rails3 country_select_tag'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8239369658980628984</id><published>2010-09-25T02:26:00.001-07:00</published><updated>2011-07-15T05:02:43.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluehost'/><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><title type='text'>spree+bluehost</title><content type='html'>То что в россии нормального хостинга нет все надеюсь знают.&lt;br /&gt;&lt;br /&gt;Потому ставим рельсовое приложение на хостинг bluehost &lt;br /&gt;&lt;br /&gt;Для начала надо активировать ssh на своем аккаунте - для этого создается тикет и прикладывается&lt;br /&gt; скан паспорта(у меня прокатил скан старого паспорта - они может и не смотрели на него)&lt;br /&gt;&lt;br /&gt;Затем ставим все необходимые гемы:&lt;br /&gt;&lt;br /&gt;качаем архив сприи http://github.com/railsdog/spree/tarball/v0.11.0&lt;br /&gt;&lt;br /&gt;распаковываем tar -xzvf ./имя_архива.tgz&lt;br /&gt;&lt;br /&gt;заходим в него и ставим гемы rake gems:install&lt;br /&gt;&lt;br /&gt;Запускаем gem env&lt;br /&gt;&lt;br /&gt;Находим GEM PATHS оно будет такое /home2/username/ruby/gems &lt;br /&gt;&lt;br /&gt;вписываем в "echo 'export  GEM_PATH=/home2/username/ruby/gems' &gt;&gt; ~/.bashrc "&lt;br /&gt;&lt;br /&gt;перелогиниваемся или вызываем export  GEM_PATH=/home2/username/ruby/gems &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ставим недоставющие гемы gem install rack -v '=1.1.0' --no-ri --no-rdoc &lt;br /&gt;&lt;br /&gt;добавляем в config/environment.rb гемы less treetop mutter и прописываем окружение production&lt;br /&gt;&lt;br /&gt;распаковываем все гемы rake gems:unpack &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;дальше создаем базу и забиваем необходимыми данными и по желанию тестовыми rake db:bootstrap RAILS_ENV=production &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;делаем симлинк ln -s ~/spree/public ~/public_html&lt;br /&gt;&lt;br /&gt;создаем файл .htaccess&lt;br /&gt;&lt;br /&gt;AddHandler fcgid-script .fcgi&lt;br /&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;RewriteRule ^$ index.html [QSA]&lt;br /&gt;&lt;br /&gt;RewriteRule ^([^.]+)/!$ $1.html [QSA]&lt;br /&gt;&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;&lt;br /&gt;RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]&lt;br /&gt;&lt;br /&gt;ErrorDocument 500 "Application error Application failed to start properly" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Дальше надо отключить редирект на https при входе в админку и при регистрации&lt;br /&gt;&lt;br /&gt;Spree::Config[:allow_ssl_in_production]&lt;br /&gt;&lt;br /&gt;&gt;&gt; true &lt;br /&gt;&lt;br /&gt;Spree::Config.set(:allow_ssl_in_production =&gt; false)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;проверяем Spree::Config[:allow_ssl_in_production]  должно показать false &lt;br /&gt;&lt;br /&gt;все - теперь должно работать&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8239369658980628984?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8239369658980628984/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8239369658980628984' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8239369658980628984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8239369658980628984'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/spreebluehost.html' title='spree+bluehost'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4099653011993784178</id><published>2010-09-25T02:26:00.000-07:00</published><updated>2011-07-15T05:02:43.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><category scheme='http://www.blogger.com/atom/ns#' term='recaptcha'/><title type='text'>recaptcha + rails3</title><content type='html'>Рекаптча перестала работать в третей рельсе.&lt;br/&gt;&lt;br /&gt;Выводится html и js как текст.&lt;br/&gt;&lt;br /&gt;А дело в том что секурность рельсы значительно возросла и что б из переменно вставить js в страницу надо это явно указать.&lt;br/&gt;&lt;br /&gt;&lt;%= raw recaptcha_tags %&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4099653011993784178?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4099653011993784178/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4099653011993784178' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4099653011993784178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4099653011993784178'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/recaptcha-rails3.html' title='recaptcha + rails3'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8369510402766283948</id><published>2010-09-25T02:25:00.000-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><title type='text'>spree-ebsin</title><content type='html'>Есть у индусов такая платежная система ebs.in&lt;br /&gt;И им хочется использовать ее вместе со сприи&lt;br /&gt;= EBS Gateway&lt;br /&gt;&lt;br /&gt;EBS Payment Gateway Extension (www.ebs.in)&lt;br /&gt;&lt;br /&gt;Install and configure extension preferences:&lt;br /&gt;&lt;br /&gt;    * preference account_id = Get from your account&lt;br /&gt;    * preference url = https://secure.ebs.in/pg/ma/sale/pay/&lt;br /&gt;    * preference secret_key = Get from your account&lt;br /&gt;    * preference mode = 'LIVE' or 'TEST'&lt;br /&gt;    * preference currency_code = 'INR'&lt;br /&gt;&lt;br /&gt;You can see messages plugin in the application log:&lt;br /&gt;&lt;br /&gt;EBS payment authorized on order R374461356&lt;br /&gt;&lt;br /&gt;             PaymentID       = 1190148                                    &lt;br /&gt;             Mode            = TEST                                       &lt;br /&gt;             DateCreated     = 2010-08-19 08:55:48                        &lt;br /&gt;             ResponseCode    = 0                                          &lt;br /&gt;             MerchantRefNo   = R374461356                                 &lt;br /&gt;             Amount          = 62.00                                      &lt;br /&gt;             TransactionID   = 2288126                                    &lt;br /&gt;             ResponseMessage = Transaction Successful  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/pronix/spree-ebsin"&gt;spree-ebsin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8369510402766283948?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8369510402766283948/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8369510402766283948' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8369510402766283948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8369510402766283948'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/spree-ebsin.html' title='spree-ebsin'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-194407386843343348</id><published>2010-09-25T02:24:00.001-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><title type='text'>spree-quick-auction</title><content type='html'>Для товаров задаем цены от х до у&lt;br /&gt;Тот кто первый покупает подешевле.&lt;br /&gt;Финт в том что самые дешевые можно ставить уже якобы проданными.&lt;br /&gt;&lt;a href="http://github.com/pronix/spree-quick-auction"&gt;http://github.com/pronix/spree-quick-auction&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-194407386843343348?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/194407386843343348/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=194407386843343348' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/194407386843343348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/194407386843343348'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/spree-quick-auction.html' title='spree-quick-auction'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7255560137096125807</id><published>2010-09-25T02:24:00.000-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><category scheme='http://www.blogger.com/atom/ns#' term='firstdata'/><title type='text'>spree-firstdata</title><content type='html'>Установка:&lt;br /&gt;&lt;br /&gt;Скопировать firstdata_payment_gateway в папку&lt;br /&gt;vendor/extensions и перезапустить spree.&lt;br /&gt;&lt;a href="http://github.com/pronix/spree-firstdata"&gt;spree-firstdata&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7255560137096125807?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7255560137096125807/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7255560137096125807' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7255560137096125807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7255560137096125807'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/spree-firstdata.html' title='spree-firstdata'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8237894887649001499</id><published>2010-09-25T02:23:00.000-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><title type='text'>Использование "and" и "or" в руби</title><content type='html'>Если вы достаточно долго используете ruby, вы откроете для себя and и or операторы.&lt;br /&gt;&lt;br /&gt;На первый взгляд это просто синонимы &amp;&amp; и ||.&lt;br /&gt;&lt;br /&gt;Есть любители использовать буквы, есть любители символов(надо ж показать что вы их знаете),HO надо понимать разницу между ними.&lt;br /&gt;&lt;br /&gt;В итоге "and" "or" не ведут себя, как и их символическое родственников. В частности, они имеют гораздо более низкий приоритет.&lt;br /&gt;&lt;br /&gt;На данный момент, вы можете матюгнуться если это покажется слишком запутанным.&lt;br /&gt;&lt;br /&gt;А если использовать оба варианта то код становится запутанным.&lt;br /&gt;&lt;br /&gt;Вообще поведение and и or (как и многое в руби) уходит корнями в перл.&lt;br /&gt;&lt;br /&gt;В перле они использовались как операторы if и unless.&lt;br /&gt;Например так:&lt;br /&gt;&lt;br /&gt;do_something() or die "It didn't work!";&lt;br /&gt;&lt;br /&gt;Эти же операторы в руби преследуют ту же цель.&lt;br /&gt;Для начала "and" и "or" не булёвые операторы, они переключают путь выполнения программы.&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;And используется для цепочек связанных операций когда одна из них может вернуть nil или false.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;br /&gt;   ` post = Post.find_by_name(name) and post.publish!  `&lt;br /&gt;&lt;br /&gt;Тут пост будет опубликован если он найден.&lt;br /&gt;&lt;br /&gt;Чем отличается &amp;&amp;? Давайте экспериментировать.&lt;br /&gt;   ` foo = 42 &amp;&amp; foo/2  `&lt;br /&gt;&lt;br /&gt;`NoMethodError: undefined method /' for nil:NilClass`&lt;br /&gt;`        from (irb):18`&lt;br /&gt;`        from :0`&lt;br /&gt;&lt;br /&gt;И что же тут случилось ?&lt;br /&gt; Скобочки помогут раскрыть тайну:&lt;br /&gt;&lt;br /&gt;   `foo = (42 &amp;&amp; foo)/2`&lt;br /&gt;&lt;br /&gt;Ожидали мы немного другое поведение(теперь-то уже понятно что ожидать такого больше не будем)&lt;br /&gt;&lt;br /&gt;   `foo = 42 and foo / 2 =&gt; 21  `&lt;br /&gt;&lt;br /&gt;…другое дело, все как надо выполнилось.&lt;br /&gt;&lt;br /&gt;Другой пример&lt;br /&gt;&lt;br /&gt;   1. next if widget = widgets.pop  &lt;br /&gt;&lt;br /&gt;Станет:&lt;br /&gt;&lt;br /&gt;   ` widget = widgets.pop and next  `&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OR&lt;br /&gt;&lt;br /&gt;or используется в тех же цепочках операций.&lt;br /&gt;Лучший способ понять эту конструкцию - серия неудачных операций: попробуй способ 1 -&gt; ошибка -&gt; тогда попробуй способ 2 и т.д.&lt;br /&gt;Пример:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   ` foo = get_foo() or raise "Could not find foo!"  `&lt;br /&gt;&lt;br /&gt;Пример рефакторинга.&lt;br /&gt;было:&lt;br /&gt;&lt;br /&gt;   ` raise "Not ready!" unless ready_to_rock?  `&lt;br /&gt;&lt;br /&gt;стало:&lt;br /&gt;&lt;br /&gt;   ` ready_to_rock? or raise "Not ready!"  `&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вывод: and и &amp;&amp; так же как or и || абсолютно разные инструменты. Использовать надо каждый в своем случае.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8237894887649001499?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8237894887649001499/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8237894887649001499' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8237894887649001499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8237894887649001499'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/blog-post.html' title='Использование &amp;quot;and&amp;quot; и &amp;quot;or&amp;quot; в руби'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1835734893096466181</id><published>2010-09-25T02:22:00.000-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><title type='text'>asset_host</title><content type='html'>Если ваше приложение и статические файлы находятся на одном домене,&lt;br/&gt;&lt;br /&gt;то броузер с сервером будут обмениваться печеньками(cookies),&lt;br /&gt;&lt;br /&gt;что вызовет лишнюю нагрузку на канал.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Яху советует нам всем использовать разные субдомены для статики и приложения.&lt;br /&gt;&lt;br /&gt;В итоге все будет работать быстро и потреблять ресурсов меньше.&lt;br /&gt;&lt;br /&gt;В рельсе для этого есть параметр asset_host (лучше его использовать только в production окружении).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;_&lt;code&gt;config.action_controller.asset_host = "http://assets.ipronix.ru"&lt;/code&gt;&lt;br /&gt;_&lt;br /&gt;&lt;br /&gt;И конечно надо настроить nginx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;_&lt;code&gt;server {&lt;/code&gt;&lt;br /&gt;_&lt;br /&gt;_&lt;code&gt;        listen 80;&lt;/code&gt;&lt;br /&gt;_&lt;br /&gt;_&lt;code&gt;        server_name assets.ipronix.com;&lt;/code&gt;&lt;br /&gt;_&lt;br /&gt;&lt;code&gt;        root /var/www/ipronix.com/production/current/public;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;_&lt;code&gt;}&lt;/code&gt;&lt;br /&gt;_&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;После рестарта приложения вы увидите что все стало грузиться с разных субдоменов,&lt;br /&gt;&lt;br /&gt; и если попробуете измерить скорость и объем то получите выигрыш в каждом запросе.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1835734893096466181?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1835734893096466181/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1835734893096466181' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1835734893096466181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1835734893096466181'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/09/assethost.html' title='asset_host'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-6446229504406642274</id><published>2010-08-26T05:30:00.000-07:00</published><updated>2010-12-18T15:56:23.008-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Оптимизация миграций(перевод)</title><content type='html'>Миграции, по моему мнению, одна из лучших вещей в рельсе.&lt;br /&gt;Но что пользоваться максимально эффективно следует придерживаться след правил.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Индексы базы данных&lt;br /&gt;В первую очередь определите индексы для всех внешних ключей и для всех колонок которые вы будете сортировать, по которым будете искать и группировать.&lt;br /&gt;&lt;div style="overflow: auto; white-space: nowrap; width: 300px;" class="codecolorer-container ruby vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line-numbers"&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="ruby codecolorer"&gt;&lt;code&gt;class CreateInvoices &lt;/code&gt; &lt;code&gt;ActiveRecord::Migration&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;def self.up&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; create_table &lt;code&gt;:invoices do&lt;/code&gt; &lt;span class="sy0"&gt;|&lt;/span&gt;t&lt;span class="sy0"&gt;|&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :number&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :year&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;decimal :total_amount&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;date :invoice_date&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :company_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :client_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;timestamps&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;def self.down&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; drop_table &lt;code&gt;:invoices&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&lt;code&gt;end&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Это обычная миграция генерируемая стандартной script/generate коммандой.&lt;br /&gt;Теперь добавим индексы для сортируемых полей и ключей.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow: auto; white-space: nowrap; width: 300px;" class="codecolorer-container ruby vibrant"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line-numbers"&gt;&lt;/td&gt;&lt;td&gt;&lt;div class="ruby codecolorer"&gt;&lt;code&gt;class CreateInvoices &lt;/code&gt; &lt;code&gt;ActiveRecord::Migration&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;def self.up&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; create_table &lt;code&gt;:invoices do&lt;/code&gt; &lt;span class="sy0"&gt;|&lt;/span&gt;t&lt;span class="sy0"&gt;|&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :number&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :year&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;decimal :total_amount&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;date :invoice_date&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :company_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;integer :client_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; t.&lt;code&gt;timestamps&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;add_index :invoices,:company_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;add_index :invoices,:client_id&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;add_index :invoices,:number&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;add_index :invoices,:year&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;def self.down&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; drop_table &lt;code&gt;:invoices&lt;/code&gt;&lt;br /&gt;&amp;nbsp; &lt;code&gt;end&lt;/code&gt;&lt;br /&gt;&lt;code&gt;end&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Индексы важны для производительности.&lt;br /&gt;База начинает летать по сравнению со стандартной миграцией.&lt;br /&gt;Есть несколько плагинов которые будут полезны для вашей базы.&lt;br /&gt;* &lt;a href="http://github.com/eladmeidar/rails_indexes"&gt;http://github.com/eladmeidar/rails_indexes&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://github.com/mlomnicki/automatic_foreign_key"&gt;http://github.com/mlomnicki/automatic_foreign_key&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://github.com/samdanavia/ambitious_query_indexer"&gt;http://github.com/samdanavia/ambitious_query_indexer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Пишите сиды.&lt;br /&gt;Начиная с рельсы 2.3.4 вместо того что б вписывать данные в миграции - пишите их в seed.rb&lt;br /&gt;Обращаю внимание - фикстуры для тестов,сиды для продакшена(содержит данные без которых нельзя стартануть- например список странн или список станций метро)&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-6446229504406642274?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/6446229504406642274/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=6446229504406642274' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6446229504406642274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6446229504406642274'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/08/blog-post_26.html' title='Оптимизация миграций(перевод)'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-6850587231183991770</id><published>2010-08-26T04:50:00.000-07:00</published><updated>2010-12-18T15:56:27.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='callback'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>обход callback в рельсе</title><content type='html'>1: не в курсе как обновить атрибуты и сохранить модельку без валидации?&lt;br /&gt;2: &lt;code&gt;u.attributes = {:tt =&gt; 12, :yu =&gt; 78} u.save(false)&lt;/code&gt;&lt;br /&gt;1: пасиба, а не в курсе как избежать before/after коллбеков?&lt;br /&gt;2: вроде как то отключать можно&lt;br /&gt;1: &lt;code&gt;@user_profile.send(:update_without_callbacks) &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-6850587231183991770?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/6850587231183991770/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=6850587231183991770' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6850587231183991770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6850587231183991770'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/08/callback.html' title='обход callback в рельсе'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8390525410370142907</id><published>2010-08-02T08:09:00.000-07:00</published><updated>2011-07-15T05:02:43.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='skip callback'/><category scheme='http://www.blogger.com/atom/ns#' term='skip validation'/><title type='text'>обход callback в рельсе</title><content type='html'>1: не в курсе как обновить атрибуты и сохранить модельку без валидации?&lt;br /&gt;2: u.attributes = {:tt =&gt; 12, :yu =&gt; 78} u.save(false)&lt;br /&gt;1: пасиба, а не в курсе как избежать before/after коллбеков?&lt;br /&gt;2: вроде как то отключать можно&lt;br /&gt;1:  @user_profile.send(:update_without_callbacks)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8390525410370142907?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8390525410370142907/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8390525410370142907' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8390525410370142907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8390525410370142907'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/08/callback_02.html' title='обход callback в рельсе'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1623630743813866135</id><published>2010-07-29T04:41:00.000-07:00</published><updated>2011-07-15T05:02:43.045-07:00</updated><title type='text'>Персер товаров из Amazon</title><content type='html'>Встала задача получить все товары с амазона (&lt;a href="http://amazon.com"&gt;http://amazon.com&lt;/a&gt;) у определенной фирмы - Firma Title.&lt;br /&gt;На сайте амазона есть возможность поиска товаров также и у определенной фирмы.&lt;br /&gt;Все бы ничего - бери парсер - парси результаты поиска товаров и в свою базу, но не тут то было...&lt;br /&gt;Оказывается у амазона жестко прописано ограничение на кол-во страниц результатов поиска - 400 страниц, даже если мы видим, что товаров более 27000 физически мы не можем просмотреть далее 400-ой страницы.&lt;br /&gt;сначала был написан небольшой парсер с помощью средств jruby и celerity - но тако решение оказалось слишком долгим в эксплуатации - 2000 товаров заливались примерно за 5 часов - очень долго. Было найдено более быстрое решение - использовать готовое решение для получения результатов поиска товаров - gem ruby-aws.&lt;br /&gt;Напрмер в этой вариации: &lt;a href="http://github.com/res0nat0r/ruby-aws"&gt;http://github.com/res0nat0r/ruby-aws&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Отрывок из кода:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;is = ItemSearch.new( 'Tools', { 'Title' =&gt; "Firma title #{keyword}" } )&lt;br /&gt;req = Request.new&lt;br /&gt;req.locale = 'us'&lt;br /&gt;resp = req.search(is, :ALL_PAGES)&lt;/blockquote&gt;&lt;br /&gt;Тут мы делаем запрос на получение товаров из категории Tools, содержащих в названии слова CRL и ключевое слово для сужение результатов поиска (помним про злополучные 400 страниц)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;items = resp.collect { |r| r.item_search_response[0].items[0].item }.flatten rescue resp.item_search_response[0].items[0].item&lt;br /&gt;puts "Найдено #{items.size} товаров"&lt;/blockquote&gt;И получаем массив товаров.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;items.each do |item|&lt;br /&gt;limit += 1&lt;br /&gt;#return "Загрузка окончена" if limit &gt; 5&lt;br /&gt;attribs = item.item_attributes[0]&lt;br /&gt;title = attribs.title.to_s&lt;br /&gt;asin = item.asin.to_s&lt;br /&gt;price = item.offer_summary[0].lowest_new_price.formatted_price.to_s.gsub('$', '') rescue "Не указано"&lt;br /&gt;url = item.detail_page_url.to_s&lt;br /&gt;description = item.editorial_reviews[0].editorial_review.content.to_s&lt;br /&gt;unless Product.find_by_catalogn(asin)&lt;br /&gt;Product.create!(:name =&gt; title,&lt;br /&gt;:description =&gt; description,&lt;br /&gt;:price_orig =&gt; price,&lt;br /&gt;:price =&gt; AmazonPrice.calculate(price),&lt;br /&gt;:url =&gt; url,&lt;br /&gt;:catalogn =&gt; asin,&lt;br /&gt;:status =&gt; 'new')&lt;br /&gt;puts "Новый товар: #{title}"&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;puts "После запроса CRL #{keyword} в базе #{Product.all.size} товар(ов)"&lt;/blockquote&gt;&lt;br /&gt;Для корректного сужение результатов поиска как варианнт можно составить список ключевых слов в виде массива и записать:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;keywords = ["rail", "door", "pack", "tool", "security", "bar", "push", "rod", "aluminium", "storm", "screen", "panel", "package", "automatic", "mirror", "pull", "indicator", "window", "glass", "display", "system", "sliding", "trailer", "box", "bronze", "nickel", "toyota", "mazda", "isuzu", "jeep"]&lt;br /&gt;&lt;br /&gt;keywords.each do |keyword|&lt;br /&gt;puts start = Time.now&lt;br /&gt;is = ItemSearch.new( 'Tools', { 'Title' =&gt; "CRL #{keyword}" } )&lt;/blockquote&gt;.......&lt;br /&gt;&lt;br /&gt;На моем слабом компе товары в кол-ве 3985 шт залились примерно за 25 минут - что ж - уже лучше.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1623630743813866135?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1623630743813866135/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1623630743813866135' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1623630743813866135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1623630743813866135'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/07/amazon.html' title='Персер товаров из Amazon'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-6280997348425747160</id><published>2010-07-04T10:28:00.000-07:00</published><updated>2011-07-15T05:02:43.045-07:00</updated><title type='text'>undefined method `each' Fixnum</title><content type='html'>Ошибка в passenger &lt;br /&gt;&lt;code&gt;&lt;br /&gt;Exception NoMethodError in application (undefined method `each' for 417322:Fixnum) (process 13490):&lt;br /&gt;from /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15/lib/phusion_passenger/rack/request_handler.rb:100:in `process_request'&lt;br /&gt; from /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15/lib/phusion_passenger/rack/request_handler.rb:96:in `each'&lt;br /&gt; from /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15/lib/phusion_passenger/rack/request_handler.rb:96:in `process_request'&lt;br /&gt; from /opt/ruby-enterprise-1.8.7-2010.02/lib/ruby/gems/1.8/gems/passenger-2.2.15/lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt; &lt;br /&gt;Оказывается число пассажир не может обработать&lt;br /&gt;решается таким патчем&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;diff --git a/lib/phusion_passenger/rack/request_handler.rb b/lib/phusion_passenger/rack/request_handler.rb&lt;br /&gt;index ad22dfa..2b6e60a 100644&lt;br /&gt;--- a/lib/phusion_passenger/rack/request_handler.rb&lt;br /&gt;+++ b/lib/phusion_passenger/rack/request_handler.rb&lt;br /&gt;@@ -96,6 +96,8 @@ protected&lt;br /&gt;                                headers.each do |key, values|&lt;br /&gt;                                        if values.is_a?(String)&lt;br /&gt;                                                values = values.split("\n")&lt;br /&gt;+          elsif values.is_a?(Fixnum)&lt;br /&gt;+                  values = values.to_a&lt;br /&gt;                                        end&lt;br /&gt;                                        values.each do |value|&lt;br /&gt;                                                output.write("#{key}: #{value}#{CRLF}")&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-6280997348425747160?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/6280997348425747160/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=6280997348425747160' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6280997348425747160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/6280997348425747160'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/07/undefined-method-each-fixnum.html' title='undefined method `each&amp;#39; Fixnum'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1842410525643099141</id><published>2010-06-03T04:14:00.000-07:00</published><updated>2011-07-15T05:02:43.045-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='banner'/><category scheme='http://www.blogger.com/atom/ns#' term='comment'/><category scheme='http://www.blogger.com/atom/ns#' term='openx'/><title type='text'>глобальное отключени комментов в openx</title><content type='html'>В openx по умолчанию в код баннера добавляется комментарий.&lt;br /&gt;При ручной генерации есть возможность его отключить, а вот используя апи такой возможности нет.&lt;br /&gt;Глобального отключения можно добиться изменив в файле&lt;br /&gt;&lt;pre&gt;lib/OX/Extension/invocationTags/InvocationTagsOptions.php&lt;/pre&gt;&lt;br /&gt;строку номер 63 с &lt;br /&gt;&lt;pre&gt;'comments' =&gt; 1&lt;/pre&gt; на &lt;pre&gt;'comments' =&gt; 0&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1842410525643099141?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1842410525643099141/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1842410525643099141' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1842410525643099141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1842410525643099141'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/06/openx.html' title='глобальное отключени комментов в openx'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-5649085024436231944</id><published>2010-06-01T02:48:00.000-07:00</published><updated>2011-07-15T05:02:43.045-07:00</updated><title type='text'>Цели и задачи блога</title><content type='html'>Блог предназначен для корпортивного общения и обмена опытом по разработке web-ориентированных приложений&lt;br /&gt;Для реализации поставленных задач команда pronix использует в свой работы самые передовые web-технологии:&lt;br /&gt;Языки: ruby, javascript&lt;br /&gt;Фреймворки: Ruby on Rails, JQuery&lt;br /&gt;... и многие другие&lt;br /&gt;Периодически появляются новые вакансии на должности web-разработчиков.&lt;br /&gt;Уверен, что тебе это по силам? Тут ссылка на полное описнаие инструментов и технологий&lt;br /&gt;Тогда Welcome to the Club!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-5649085024436231944?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/5649085024436231944/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=5649085024436231944' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5649085024436231944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5649085024436231944'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/06/blog-post.html' title='Цели и задачи блога'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7831936620809897991</id><published>2010-04-12T14:42:00.000-07:00</published><updated>2010-12-18T15:56:32.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PGError'/><title type='text'>duplicate key value violates unique constraint</title><content type='html'>PGError: ERROR: duplicate key value violates unique constraint "lastsearches_pkey" &lt;br /&gt;&lt;br /&gt;Фиксим выполнив&lt;br /&gt;select setval('lastsearches_id_seq', (select max(id) + 1 from lastsearches));&lt;br /&gt;И все - заработало.&lt;br /&gt;Еще один вариант &lt;code&gt;REINDEX INDEX lastsearches_pkey;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7831936620809897991?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7831936620809897991/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7831936620809897991' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7831936620809897991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7831936620809897991'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/04/duplicate-key-value-violates-unique.html' title='duplicate key value violates unique constraint'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1762203768795304135</id><published>2010-04-12T14:12:00.000-07:00</published><updated>2010-12-18T15:56:37.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cannot remove Object::ClassMethods'/><title type='text'>обезьяний патчик</title><content type='html'>начала валиться ошибка&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;blockquote style="font-family: arial;"&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;dima@~/project/mp3cms$ rake db:migrate --trace&lt;br /&gt;(in /home/dima/project/mp3cms)&lt;br /&gt;** Invoke db:migrate (first_time)&lt;br /&gt;** Invoke environment (first_time)&lt;br /&gt;** Execute environment&lt;br /&gt;rake aborted!&lt;br /&gt;cannot remove Object::ClassMethods&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:603:in `remove_const'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:603:in `remove_constant'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:603:in `instance_eval'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:603:in `remove_constant'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:549:in `new_constants_in'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_suppor/dependencies.rb:549:in `each'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:549:in `new_constants_in'&lt;br /&gt;/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:156:in `require'&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;все перепробовал&lt;br /&gt;&lt;br /&gt;В итоге тупо не делаем действие при Object::ClassMethods&lt;br /&gt;&lt;code&gt;unless names.last.to_s =~ /ClassMethods/&lt;br /&gt;parent।instance_eval { remove_const names।last }&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Оказывается вся проблема в delayed_job второй версии&lt;br /&gt;после сноса версии 2.0.2 и установке 1.8.5 все прекрасно заработало&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1762203768795304135?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1762203768795304135/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1762203768795304135' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1762203768795304135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1762203768795304135'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/04/blog-post.html' title='обезьяний патчик'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-4833915695167802003</id><published>2010-02-14T12:58:00.000-08:00</published><updated>2010-12-18T15:56:44.457-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='host.hrStorage.hrStorageTable'/><category scheme='http://www.blogger.com/atom/ns#' term='snmp'/><category scheme='http://www.blogger.com/atom/ns#' term='disk space'/><title type='text'>snmp - disk space</title><content type='html'>&lt;h3&gt;Получение описания диска&lt;/h3&gt;&lt;br /&gt;&lt;b&gt;пример1:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/usr/bin/snmpget -t 1 -r 5 -m ALL -v 1 -c строка_пароль monitored.com:161  host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageDescr.1&lt;/code&gt;&lt;br /&gt;результат&lt;br /&gt;&lt;code&gt;HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers&lt;/code&gt;&lt;br /&gt;&lt;b&gt;пример2:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/usr/bin/snmpget -t 1 -r 5 -m ALL -v 1 -c строка_пароль monitored.com:161  host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageDescr.4&lt;/code&gt;&lt;br /&gt;результат&lt;br /&gt;&lt;code&gt;HOST-RESOURCES-MIB::hrStorageDescr.4 = STRING: /&lt;/code&gt;&lt;br /&gt;Последняя цифра - номер устройства.&lt;br /&gt;&lt;h3&gt;Получение общее количества блоков на разделе:&lt;/h3&gt;&lt;br /&gt;&lt;b&gt;пример:&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/usr/bin/snmpget -t 1 -r 5 -m ALL -v 1 -c строка_пароль monitored.com:161  host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageSize.4&lt;/code&gt;&lt;br /&gt;результат&lt;br /&gt;&lt;code&gt;HOST-RESOURCES-MIB::hrStorageSize.4 = INTEGER: 176889164&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Получени размера блоков&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/usr/bin/snmpget -t 1 -r 5 -m ALL -v 1 -c строка_пароль monitored.com:161  host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageAllocationUnits.4&lt;/code&gt;&lt;br /&gt;результат&lt;br /&gt;&lt;code&gt;HOST-RESOURCES-MIB::hrStorageAllocationUnits.4 = INTEGER: 4096 Bytes&lt;/code&gt;&lt;br /&gt;В итоге можно посчитать размер в мегабайтах раздела&lt;br /&gt;&lt;code&gt;176889164*4096/1024**2=690973Mb&lt;/code&gt;&lt;br /&gt;&lt;b&gt;И последнее - сколько блоков занято информацией&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/usr/bin/snmpget -t 1 -r 5 -m ALL -v 1 -c строка_пароль monitored.com:161 host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageUsed.4 &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-4833915695167802003?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/4833915695167802003/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=4833915695167802003' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4833915695167802003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/4833915695167802003'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/02/snmp-disk-space.html' title='snmp - disk space'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-9006876088548226063</id><published>2010-02-14T05:52:00.000-08:00</published><updated>2011-02-03T02:11:10.976-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='watir'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>watir+facebook status</title><content type='html'>Как поменять статус в facebook используя watir&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt; @b.class # непосредственно броузер после входа в свой аккаунт&lt;br /&gt;=&gt; Celerity::Browser&lt;br /&gt;&gt;&gt; @b.text_field(:name,'status').value = 'мой новый статус'&lt;br /&gt;=&gt; "\320\260\321"&lt;br /&gt;&gt;&gt; @b.text_field(:name,'status').focus            &lt;br /&gt;=&gt; nil&lt;br /&gt;&gt;&gt; @b.button(:class,'UIButton_Text').click &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;и новый статус готов.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;We use &lt;a href="http://fbs.com/mt" target="_blank"&gt;metatrader4&lt;/a&gt; - the best forex trading platform and I enjoy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-9006876088548226063?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/9006876088548226063/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=9006876088548226063' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/9006876088548226063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/9006876088548226063'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2010/02/watirfacebook-status.html' title='watir+facebook status'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-789546548467278396</id><published>2009-12-29T12:16:00.000-08:00</published><updated>2010-12-18T15:56:55.266-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jtable'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><title type='text'>практика JRuby</title><content type='html'>Как вызвать ява класс из jruby&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;JString = java.lang.String&lt;br /&gt;JString.new&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Но если нужен ява Object ,то делаем так&lt;br /&gt;&lt;code&gt;&lt;br /&gt;['test'].to_java&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Создаем JTable используя swing из jruby&lt;br /&gt;&lt;br /&gt;# создание таблицы из 6 строк и 3 столбцов&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@table = JTable.new(6,3)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;# назначим в ячейке значение "значение"&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@table.getModel.setValueAt("значение",номер_строки,номер_столбца)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;#добавим строку&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@table.getModel.addRow(['a','b','c'].to_java)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;#удалим саму первую строку&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@table.getModel.removeRow(0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;# или удалим выделеную строку&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@table.getModel.removeRow(@table.getModel.getSelectedRow)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-789546548467278396?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/789546548467278396/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=789546548467278396' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/789546548467278396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/789546548467278396'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/12/jruby.html' title='практика JRuby'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-2710861550942601437</id><published>2009-12-11T06:10:00.000-08:00</published><updated>2010-12-18T15:57:00.181-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='paypal'/><category scheme='http://www.blogger.com/atom/ns#' term='webmoney'/><category scheme='http://www.blogger.com/atom/ns#' term='changer'/><title type='text'>Заведи себе обменник</title><content type='html'>Валют много.&lt;br /&gt;Обменников не меньше.&lt;br /&gt;Но конкуренция выгодна мне лично - будут снижать проценты.&lt;br /&gt;Потому кому нужен обменник - качайте.&lt;br /&gt;http://github.com/pronix/changer&lt;br /&gt;в стандартной поставке - все вебмани и paypal&lt;br /&gt;Надежный быстрый и можно посмотреть админку(typus)&lt;br /&gt;Реализация на ruby-on-rails&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-2710861550942601437?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/2710861550942601437/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=2710861550942601437' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/2710861550942601437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/2710861550942601437'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/12/blog-post.html' title='Заведи себе обменник'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-8392836591068338310</id><published>2009-12-04T02:45:00.000-08:00</published><updated>2010-12-18T15:57:06.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spree'/><category scheme='http://www.blogger.com/atom/ns#' term='yandex.market'/><category scheme='http://www.blogger.com/atom/ns#' term='extention'/><title type='text'>spree yandex.market</title><content type='html'>&lt;span style="font-style:italic;"&gt;У всех приличных торговых организаций есть интернет магазин.&lt;br /&gt;У которых нет - не приличные организации живущие в пещере.&lt;br /&gt;Лучший интернет магазин конечно &lt;a href="http://spreecommerce.com/"&gt;spree&lt;/a&gt;&lt;br /&gt;Но когда ищу товар в интернете, я иду на яндекс.маркет.&lt;br /&gt;Значит надо дать возможность с магазина выгружать товар в яндекс.маркет.&lt;br /&gt;Эту возможность дает плагин &lt;a href="http://github.com/pronix/spree-yandex-market"&gt;spree-yandex-market&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Расширение предназначено для выгрузки списка товара в Яндекс.Маркет.(http://partner.market.yandex.ru/legal/tt/) При экспорте передаеться следующая информация:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Название магазина и его url.&lt;br /&gt;2. Валюты используемые в магазине.&lt;br /&gt;3. Категории товара.&lt;br /&gt;В качестве категорий выгружаемых в файл используется один из 'Таксонов', который задается в админке Яндекс.Маркет.&lt;br /&gt;4. Список товара.&lt;br /&gt;При выгрузке Товар может быть описан несколькими типами:&lt;br /&gt;1. "vendor.model"      - Основной тип описания, рекомендуемый&lt;br /&gt;2. "book", "audiobook" - для книг и аудиокниг&lt;br /&gt;3. "music", "video"    - для музыки и видео&lt;br /&gt;4. "event_ticket"      - билеты на мероприятия&lt;br /&gt;Определение типа описания происходит следующим образом: если в  свойстве товара,которое определено &lt;br /&gt;в "Типе продукции" (Wares Type), одно из следующих значений  ["book", "audiobook", "music", "video", &lt;br /&gt;"event_ticket"] то товар выгружается в соответствии с типом продукции, если свойство "тип продукции" &lt;br /&gt;не определено или нет нужного значения ,то описыаеться по основному типу "vendor.model"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Формирование файла экспорта:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Файл формируется следующей командой: RAILS_ENV=#{RAILS_ENV} rake spree:extensions:yandex_market:generate_ym&lt;br /&gt;Сформированные файлы сохраняются в папку ROOT_RAILS/public/yandex_market с формируемым именем &lt;br /&gt;файла "yandex_market_%Y_%m_%d__%H_%M".&lt;br /&gt;Для Яндекс.Робота создаться линк на самый последний файл ROOT_RAILS/public/yandex_market/yandex_market.gz,&lt;br /&gt;который доступен по адресу http://[host]/yandex_market/yandex_market.gz&lt;br /&gt;Формирование файла можно делать через крон или запуском команды из блока администрирования.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Установка&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;script/extension install git://github.com/pronix/spree-yandex-market.git&lt;br /&gt;Для периодического формирования файла экспорта запишите в крон следущую команду:&lt;br /&gt;cd #{ RAILS_ROOT } &amp;&amp; RAILS_ENV=#{RAILS_ENV} rake spree:extensions:yandex_market:generate_ym&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Настройка&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Настройка осуществляется в панеле администрирования магазина в разделе Яндекс.Маркет.&lt;br /&gt;В основных настройках устанавливается название и адрес магазина, выгружаемая категория и отбор&lt;br /&gt;товара при выгрузке.&lt;br /&gt;В настройках валюты устанавливается список валют используемых в магазине.&lt;br /&gt;В настройке "Выгружаемые свойства товара" - сопоставляются выгружаемые данные со  свойствами товара.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-8392836591068338310?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/8392836591068338310/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=8392836591068338310' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8392836591068338310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/8392836591068338310'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/12/spree-yandexmarket.html' title='spree yandex.market'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7182908903747883657</id><published>2009-10-11T04:15:00.000-07:00</published><updated>2010-12-18T15:55:43.967-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='slot'/><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><category scheme='http://www.blogger.com/atom/ns#' term='slots'/><category scheme='http://www.blogger.com/atom/ns#' term='signal'/><category scheme='http://www.blogger.com/atom/ns#' term='qtruby'/><title type='text'>QtRuby: Slots</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Способы создания не стандартных слотов для обработки событий.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Очевидный&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class CustomWidget &lt; Qt::Widget&lt;br /&gt;slots 'customslot()'&lt;br /&gt;def customslot()&lt;br /&gt;# действие&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;Qt::Object.connect(signalobject,SIGNAL('signal()'),&lt;br /&gt;customwidget,SLOT('customslot()'))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;2. Задание блока&lt;/span&gt;&lt;pre&gt;Qt::Object.connect(signalobject,SIGNAL('signal()')) do&lt;br /&gt;# необходимое действие&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;3. Слотом делаем сразу определенный метод&lt;/span&gt;&lt;pre&gt;Qt::Object.connect(signalobject,SIGNAL('signal()'), &amp;method(:custommethod))&lt;br /&gt;&lt;br /&gt;def custommethod&lt;br /&gt;# необходимое действие&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like show_faces="true" width="450"&gt;&lt;/fb:like&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7182908903747883657?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7182908903747883657/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7182908903747883657' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7182908903747883657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7182908903747883657'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/10/qtruby-slots.html' title='QtRuby: Slots'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-3751273851012359474</id><published>2009-05-06T23:52:00.000-07:00</published><updated>2009-06-19T05:17:45.037-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim surround rails'/><title type='text'>vim IDE</title><content type='html'>Каждый современный программист использует IDE.&lt;br /&gt;Например &lt;a href="http://www.vim.org/scripts/script.php?script_id=1697"&gt;Eclipse&lt;/a&gt; или &lt;a href="http://www.kdevelop.org/index.html?filename=main.html&amp;amp;set_lang=ru"&gt;KDevelop&lt;/a&gt;.А есть самая лучшая IDE - &lt;a href="http://www.vim.org/"&gt;VIM &lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Программирую я на ruby и большей частью проекты связаны с rails.&lt;br /&gt;Расскажу какими плагинами к vim я пользуюсь&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a style="font-weight: bold;" href="http://www.vim.org/scripts/script.php?script_id=1567"&gt;rails.vim&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Любимая функция gf - по русски go_to_file.&lt;br /&gt;Например наводите курсор на &lt;code&gt;"render :file =&gt; 'app/views/test.test.html.erb'"&lt;/code&gt; - переходите в коммандный режим и жмете на gf. И вы переместились в файл &lt;code&gt;'app/views/test.test.html.erb'&lt;/code&gt;. Что б переместиться в исходный файл не закрывая текущий - жмем в коммандном режиме :bn. Переместитья закрыв :bd. Важно перед перемещением записать изменения.&lt;br /&gt;&lt;br /&gt;При редактировании контроллера хочется перейти во вьюшку - на имени контроллера размещаем курсор  и вводим :Rview .Редактируем код вьюшки и хочется часть кода вынести в отдельный файл - например со строки 10 до 25 - :10,25Rextract extracted_file. Автоматом строки уносятся в необходимый нам файл , а на их месте создается &lt;code&gt;&lt;%= render :partial =&gt; 'extracted_file'%&gt;&lt;/code&gt;&lt;br /&gt;Перемещение в определенную модель :Rmodel modelname&lt;br /&gt;Подобным образом :Rmigration , :Rcontroller, :Rview&lt;br /&gt;&lt;br /&gt;И еще отличная возможность автодописывания слов при нажатии на клавиши ctrl+p&lt;br /&gt;&lt;br /&gt;Это маленькая частичка функционала - но используемого повседневно.Почитать подробней можно в :help - документации идущей вместе с плагином. Экономятся годы Вашего времени.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;Следующий плагин настоящего лентяя &lt;a href="http://www.vim.org/scripts/script.php?script_id=1697"&gt;Surround.vim &lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Surround позволяет легко и удобно работать с тегами. Чем ужасен любой тег ? Тем что с двух сторон практически одно и тоже и набирать болго и cкучно.&lt;br /&gt;&lt;br /&gt;Например хочу написать &lt;code&gt;&lt;%= @book.name %&gt;&lt;/code&gt; пишем @book.name затем переходим в коммандный режим и жмем yss= .&lt;br /&gt;Все получили &lt;code&gt;&lt;%= @book.name %&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Так же создается &lt;% -%&gt;  yss-&lt;br /&gt;Или &lt;code&gt;&lt;%  -%&gt;\n&lt;% end -%&gt;&lt;/code&gt;  yss&lt;c-e&gt; что по русски   будет ctrl+shift+e (т.е. контрол плюс большая Е)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Это теги для рельсов , но есть и для HTML, например yss&amp;lt;b&amp;gt; создаст вокруг строки &amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;&lt;br /&gt;Что же делать если тег необходим не вокруг строки, а вокруг слова ?&lt;br /&gt;Меняем на ysw&amp;lt;b&amp;gt;&lt;br /&gt;Как можно догадаться s - string, w - word&lt;br /&gt;&lt;br /&gt;И последняя из простых операций - замена тега&lt;br /&gt;есть у нас &amp;lt;b&amp;gt;test&amp;lt;/b&amp;gt; хотим получить &amp;lt;a&amp;gt;test&amp;lt;/a&amp;gt;&lt;br /&gt;Набираем cst&amp;lt;a&amp;gt; и все готово.&lt;br /&gt;&lt;br /&gt;За подробностями отправляйтесь читать доки.&lt;br /&gt;&lt;br /&gt;Ну и на последок - всегда необходимо знать что за функция и где она определена.&lt;br /&gt;Это позволяем делать программка &lt;a href="http://ctags.sourceforge.net/"&gt;ctags&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Первым делом необходимо поставить эту программу.&lt;br /&gt;Затем создаем индексный файл&lt;br /&gt;Выполняем в папке проекта&lt;br /&gt;&lt;code&gt;ctags --recurse=yes --exclude=*.swp --exclude=*.js --exclude&lt;/code&gt;&lt;br /&gt;Рекурсивно создать индексный файл исключая своп файлы , яваскрипт и файлы git'а&lt;br /&gt;на выходе у нас файлик ./tags&lt;br /&gt;Ставим плагин для вима для работы с файлом тегов &lt;a href="http://www.vim.org/scripts/script.php?script_id=610"&gt;ctags.vim&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;в ~/.vimrc  вписываем найденные на &lt;a href="http://vkhandus.blogspot.com/2008/02/ctags-vim.html"&gt;просторах интернета&lt;/a&gt; строчки&lt;br /&gt;&lt;code&gt;&lt;br /&gt;let g:ctags_regenerate = 0&lt;br /&gt;let g:ctags_statusline=1&lt;br /&gt;let generate_tags=1&lt;br /&gt;set tags+=./tags&lt;br /&gt;map &lt;f4&gt; [I:let nr = input("Which one: ")&lt;bar&gt;exe "normal " . nr ."[\t"&lt;cr&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Теперь можно работать.&lt;br /&gt;Выбираем функцию , наводим на нее курсор и жмем g] - либо сразу  переходим к месту ее определения либо выскакивает список где определяются одноименные с нашей функции.&lt;br /&gt;&lt;br /&gt;И на последок  - феноменальная функция вима - :split и :vsplit :)&lt;br /&gt;&lt;br /&gt;Для начала вполне хватит.&lt;br /&gt;Получаем экономию ресурсов компьютера и отличную IDE.&lt;br /&gt;&lt;br /&gt;&lt;/cr&gt;&lt;/bar&gt;&lt;/f4&gt;&lt;/c-e&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-3751273851012359474?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/3751273851012359474/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=3751273851012359474' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3751273851012359474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/3751273851012359474'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/05/vim-ide.html' title='vim IDE'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-7223336932085531052</id><published>2009-01-26T06:51:00.000-08:00</published><updated>2009-05-06T23:52:10.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql-proxy'/><category scheme='http://www.blogger.com/atom/ns#' term='failover'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><title type='text'>mysql-failover</title><content type='html'>описание создание файловера mysql с фильтром запросов&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.строим мастер-мастер репликацию&lt;/span&gt;&lt;br /&gt;кроме стандартного mysql сервера ставим mysql-proxy и heartbeat&lt;br /&gt;в конфиге my.cnf обязательные параметры&lt;br /&gt;[mysqld]&lt;br /&gt;datadir=/var/lib/mysql&lt;br /&gt;socket=/var/lib/mysql/mysql.sock&lt;br /&gt;user=mysql&lt;br /&gt;old_passwords=1&lt;br /&gt;port=3307  # на стандартном 3306 будет слушать mysql-proxy&lt;br /&gt;log-bin         # писать обязательно бинарные логи&lt;br /&gt;server-id=2 #у каждой ноды свой номер&lt;br /&gt;[mysql.server]&lt;br /&gt;user=mysql&lt;br /&gt;basedir=/var/lib&lt;br /&gt;&lt;br /&gt;запускаем обе ноды и сервера баз на них&lt;br /&gt;пусть будет node1 192.168.50.151&lt;br /&gt;и  node2 192.168.50.152&lt;br /&gt;&lt;br /&gt;шаг первый&lt;br /&gt;сделаем node1 master  а node2 slave&lt;br /&gt;на каждой назначаем пользователя для репликаций&lt;br /&gt;grant replication slave on *.* to 'replication_user'@192.168.50.152 identified&lt;br /&gt;by 'replication_password';&lt;br /&gt;192.168.50.152 - нода которая будет slave относительно данной&lt;br /&gt;&lt;br /&gt;узнаем с какого файла и с какой операции реплицировать&lt;br /&gt;show master status;&lt;br /&gt;пример вывода:&lt;br /&gt;+-------------------+----------+--------------+------------------+&lt;br /&gt;| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |&lt;br /&gt;+-------------------+----------+--------------+------------------+&lt;br /&gt;| mysqld-bin.000009 |      411 |              |                  |&lt;br /&gt;+-------------------+----------+--------------+------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;на slave ноде назначаем мастер сервер&lt;br /&gt;change master to master_host='192.168.50.151', master_user&lt;br /&gt;= 'replication_user', master_password = 'replication_password', master_port =&lt;br /&gt;3307, master_log_file = 'mysqld-bin.000009', master_log_pos = 411 ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;запускаем репликацию на slave запускаем&lt;br /&gt;slave start;&lt;br /&gt;проверяем все лиработает&lt;br /&gt;show slave status\G;&lt;br /&gt;&lt;br /&gt;основные записи&lt;br /&gt;Slave_IO_Running: Yes&lt;br /&gt;Slave_SQL_Running: Yes&lt;br /&gt;если хоть одна No то ищем почему сервера не могут общаться (файрвол,пароли и&lt;br /&gt;пр.)&lt;br /&gt;&lt;br /&gt;На данный момент у нас одна нода ведущая, вторая читает бинарный лог операций и&lt;br /&gt;совершает их у себя.&lt;br /&gt;второй шаг - делаем так что б одновременно node1 была и master для node2 и&lt;br /&gt;slave для node2&lt;br /&gt;операции те же - данные немного меняются&lt;br /&gt;&lt;br /&gt;grant replication slave on *.* to 'replication_user'@192.168.50.151 identified&lt;br /&gt;by 'replication_password';&lt;br /&gt;&lt;br /&gt;change master to master_host='192.168.50.152', master_user&lt;br /&gt;= 'replication_user', master_password = 'replication_password', master_port =&lt;br /&gt;3307, master_log_file = 'mysqld-bin.000002', master_log_pos = 411 ;&lt;br /&gt;&lt;br /&gt;flush privileges;&lt;br /&gt;slave start;&lt;br /&gt;&lt;br /&gt;и обязательно проверяем&lt;br /&gt;show slave status/G;&lt;br /&gt;&lt;br /&gt;2.&lt;span style="font-weight: bold;"&gt; mysql-proxy&lt;/span&gt;&lt;br /&gt;тут все просто&lt;br /&gt;mysql-proxy --proxy-lua-script=/root/big_query_filter.lua\&lt;br /&gt;       --proxy-address=:3306\&lt;br /&gt;       --proxy-backend-addresses=/var/lib/mysql/mysql.sock\  #локальную базу через&lt;br /&gt;сокет потому как быстрее на 10% , в 0.6 версии не работало потому пришлось все гонять через lo&lt;br /&gt;       --proxy-read-only-backend-addresses=192.168.50.152:3307\ база на другой ноде&lt;br /&gt;только для чтения&lt;br /&gt;       --pid-file=/var/run/mysql-proxy.pid&lt;br /&gt;       --daemon&lt;br /&gt;&lt;br /&gt;скрипт big_query_filter.lua просто не пускает запросы с более чем 500&lt;br /&gt;символами возвращая ошибку с комментарием&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. heartbeat&lt;/span&gt;&lt;br /&gt;ставим heartbeat&lt;br /&gt;задаем метод аутентификации /etc/ha.d/authkeys&lt;br /&gt;auth 3&lt;br /&gt;3 md5 secret_password&lt;br /&gt;&lt;br /&gt;конфиг /etc/ha.d/ha.cf&lt;br /&gt;logfile /var/log/ha-log&lt;br /&gt;logfacility     local0&lt;br /&gt;keepalive 1 # интервал между проверками&lt;br /&gt;deadtime 10 # время через которое вторая нода подхватит ip первой&lt;br /&gt;warntime 4 # предупреждение чере 4 сек&lt;br /&gt;udpport 694&lt;br /&gt;bcast   eth1  &lt;br /&gt;auto_failback on&lt;br /&gt;node node1&lt;br /&gt;node node2&lt;br /&gt;&lt;br /&gt;описание ресурсов которые проверяются /etc/ha.d/haresources&lt;br /&gt;mysql1  IPaddr::192.168.50.151/24/eth1&lt;br /&gt;&lt;br /&gt;в случае отказа 192.168.50.151 ее адресс алиасом цепляется к второй ноде через&lt;br /&gt;10сек(можно и меньше)&lt;br /&gt;добивать отказавшую ноду не вижу смысла&lt;br /&gt;ввод в строй отказавшей ноды руками - что б данные не потерялись&lt;br /&gt;&lt;br /&gt;прикреплена файлы скриптов запуска mysql-proxy и скрипта big_query_filter.lua&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-7223336932085531052?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/7223336932085531052/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=7223336932085531052' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7223336932085531052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/7223336932085531052'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2009/01/mysql-failover.html' title='mysql-failover'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-1923328353437370191</id><published>2008-12-04T04:02:00.000-08:00</published><updated>2010-09-15T03:10:01.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='named'/><category scheme='http://www.blogger.com/atom/ns#' term='webui'/><category scheme='http://www.blogger.com/atom/ns#' term='cobbler'/><category scheme='http://www.blogger.com/atom/ns#' term='dhcpd'/><category scheme='http://www.blogger.com/atom/ns#' term='bind'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='dhcp'/><title type='text'>Cobbler продолжение</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;a style="font-family: times new roman;" href="https://fedorahosted.org/cobbler/"&gt;Cobbler&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; не ограничивается ролью загрузчика, можно настроить взаимодействие его с dhcp и dns. А также есть у него простенький веб интерфейс - который ,на мой взгляд, страшнее консольки. &lt;/span&gt;  &lt;/span&gt;&lt;div  style="text-align: center;font-family:times new roman;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Web интерфейс&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Настраиваем интерфейс после настройки всех служб и синхронизации с репозиторием. &lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;Смотри в /etc/cobbler/modules.conf&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;Аутентификация по файлу. (еще варианты запретить для всех:"authn_denyall", использовать &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://www.redhat.com/spacewalk/"&gt;spacewalk&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt;: "authn_spacewalk" - пользователь с правами администратора на RHN/spacewalk может залогиниться используя теже лоигн и пароль , но необходимо прописать в /etc/cobbler/settings строчку "spacewalk_url: "http://сервер_spacewalk/rpc/api" , &lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;аутентификацию проводит apache и kerberos : "&lt;a href="https://fedorahosted.org/cobbler/wiki/CobblerWithKerberos"&gt;authn_passthru&lt;/a&gt;",&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;использовать ldap: "&lt;a href="https://fedorahosted.org/cobbler/wiki/CobblerWithLdap"&gt;authn_ldap&lt;/a&gt;"&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt; ,&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;тестирование - логин и пароль "testing" :"authn_testing",&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;если все выше перечиленное не устраивает то можно и самому написать модель аутентификации)&lt;/span&gt; &lt;/span&gt;&lt;pre class="wiki"  style="font-family:times new roman;"&gt;&lt;span style="font-size:100%;"&gt;[authentication]&lt;br /&gt;module = authn_configfile&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Авторизацию разрешить всем (можно также использовать authz_configfile - т.е. только тем кто перечислен в файле, либо authz_ownership - пользователям перечисленным в users.conf и добавить пренадлежность объектов к определенному хозяину, либо опять написать свой модуль )&lt;/span&gt; &lt;/span&gt;&lt;pre class="wiki"  style="font-family:times new roman;"&gt;&lt;span style="font-size:100%;"&gt;[authorization]&lt;br /&gt;module = authz_allowall&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;   &lt;/span&gt;&lt;div  style="text-align: center;font-family:times new roman;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Взаимодействие cobbler с dhcpd&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Используем стандартный сервер &lt;/span&gt;&lt;a style="font-family: times new roman;" href="https://www.isc.org/sw/dhcp"&gt;isc-dhcp&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; .&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;В /etc/cobbler/settings разрешаем администрировать dhcpd   &lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;manage_dhcp: 1&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;В файл /etc/cobbler/dhcp.template вносим изменения  (если нужно)&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;Теперь вносим новую систему &lt;/span&gt; &lt;span style="font-style: italic;font-family:times new roman;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;cobbler system add --name=&lt;name_system&gt; --mac=&lt;mac_adress&gt; --profile=&lt;выбраный_profile&gt; --ip=&lt;ip_adress&gt;&lt;/ip_adress&gt;&lt;/mac_adress&gt;&lt;/name_system&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt; &lt;&gt; &lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;br /&gt;синхронизируем конфигурацию dhcpd c cobbler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;cobbler sync&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Если dhcpd находится на том же сервере что и cobbler то по умолчанию перезапустится. За это в конфиге отвечают строки restart_dhcp: 1&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;Все - теперь к определенным мак адресам привязаны ip которые мы назначили &lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;Редактировать можно так &lt;/span&gt; &lt;span style="font-style: italic;font-family:times new roman;" &gt;&lt;br /&gt;cobbler system edit --name=&lt;name_system&gt;&lt;name&gt; --mac=&lt;mac_adress&gt;&lt;mac_adress&gt; --profile=&lt;выбраный_profile&gt; --ip=&lt;новый_ip_adress&gt;&lt;br /&gt;&lt;/mac_adress&gt;&lt;/mac_adress&gt;&lt;/name&gt;&lt;/name_system&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-weight: bold;"&gt;Взаимодействие cobbler с bind&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;Включаем редактирование конфигов bind     manage_dns: 1&lt;br /&gt;Редактируем /etc/cobbler/named.template вписывая наши данные&lt;br /&gt;Открываем файл /etc/cobbler/settings , находим такие параметры manage_forward_zones и manage_reverse_zones - это соответственно прямая и обратная зона.&lt;br /&gt;Конфиг пишется на &lt;a href="http://www.yaml.org/"&gt;yaml&lt;/a&gt;, он и в rails используется.&lt;br /&gt;Вот что примерно должно получится&lt;br /&gt;manage_forward_zones:&lt;br /&gt;- 'adenin.ru'&lt;br /&gt;&lt;br /&gt;manage_reverse_zones:&lt;br /&gt;- '10.20.4'&lt;br /&gt;&lt;br /&gt;Для нашей зоны adenin.ru нужно в папке /etc/cobbler/zome_templates (если ее нет - создайте) создать файл adenin.ru , файл называется так же как и прямая зона , или зоны, в &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;manage_forward_zones.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;И самое важное, каждой системе в необходимо задать hostname вида node1.adenin.ru&lt;br /&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt;cobbler system edit --name=node1 --hostname=node1.adenin.ru&lt;/span&gt;&lt;br /&gt;и выполняем&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cobbler sync&lt;/span&gt;&lt;br /&gt;Bind перезапустится автоматом.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;" &gt; &lt;/span&gt; &lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;Подключение репозиториев с обновлениями&lt;/span&gt; &lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style=";font-family:times new roman;font-size:100%;"  &gt;Необходимо получить url резотирия для нашей архитектуры и дистрибутива&lt;br /&gt;Например для fedora9&lt;br /&gt;ftp://dispenser.yandex.net/fedora/linux/updates/9/x86_64.newkey/&lt;br /&gt;Подсмотел в /etc/yum.repos.d/fedora-updates-newkey.repo&lt;br /&gt;Включаем его&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cobbler repo add --mirror=ftp://dispenser.yandex.net/fedora/linux/updates/9/x86_64.newkey/ --name=f9_x86_64_update_newkeys&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И выполняем синхронизацию&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;cobbler reposync&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Теперь добавляем профиль который будет использовать список репозиториев включающий нужные нам&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;span style=";font-family:times new roman;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cobbler profile add --name=f9-x86_64_test --repos="список имен репозиториев" --distro=F9-x86_64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Что б после установки система использовала для обновления наш репозиторий вписыавем в файл /etc/cobbler/settings&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;yum_post_install_mirror: 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;В крон вписываем задание обновляться и наслаждаемся всегда свежим локальным репозиторием&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Кстати - так же можно создать репозиторий для debian-based дистрибутивов, только добавляем аргумент&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;--breed=apt&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="sape"&gt;He can try &lt;a href="http://www.fbs.com/" target="_blank"&gt;forex trading platform&lt;/a&gt; by a proffessional team, because it's perfect in use.&lt;br /&gt;&lt;br /&gt;SoftAge suggest &lt;a href="http://www.softage.ru/mac_programming/" target="_blank"&gt;macintosh programming&lt;/a&gt; for customers' wants&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tehnodoverie.ru/CARMANI-CB400.html" target="_blank"&gt;CARMANI CB400&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-1923328353437370191?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/1923328353437370191/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=1923328353437370191' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1923328353437370191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/1923328353437370191'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2008/12/cobbler_04.html' title='Cobbler продолжение'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-447397810890053070.post-5358383083836054047</id><published>2008-12-01T01:25:00.000-08:00</published><updated>2008-12-08T10:08:39.247-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='cobbler'/><category scheme='http://www.blogger.com/atom/ns#' term='tftp'/><category scheme='http://www.blogger.com/atom/ns#' term='network install'/><title type='text'>cobbler</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Cobbler&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Часть первая - о установке.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Рассмотрим вариант с сетевой установкой&lt;br /&gt;И так - у нас есть сеть и компьютер на который необходимо по сети установить ОС(называть его будем клиентом). Сервер с которого будет устанавливаться (просто сервер).&lt;br /&gt;Устанавливаем на машину с которой будет производиться установка cobbler и необходимые пакеты.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;yum install cobbler dhcp httpd syslinux tftp-server  -y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dhcp&lt;/span&gt;&lt;br /&gt;Первая служба к которой обратится клиент будет dhcp - потому настроим его.&lt;br /&gt;Вот простейший рабочий конфиг.&lt;br /&gt;&lt;pre class="wiki"&gt;ddns-update-style none;&lt;br /&gt;ignore client-updates;&lt;br /&gt;use-host-decl-names on;&lt;br /&gt;authoritative;&lt;br /&gt;&lt;br /&gt;set vendorclass = option vendor-class-identifier;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# указываем свою сеть&lt;/span&gt;&lt;br /&gt;subnet 10.20.4.0 netmask 255.255.255.0 {&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# задаем роутер по умолчанию&lt;/span&gt;&lt;br /&gt; option routers  10.20.4.1;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# маска подсети&lt;/span&gt;&lt;br /&gt; option subnet-mask   255.255.240.0;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# сервер днс&lt;/span&gt;&lt;br /&gt; option domain-name-servers   10.20.4.1;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# часовой пояс&lt;/span&gt;&lt;br /&gt; option time-offset   -18000; #EST&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# диапазон адресов которые будем раздавать по dhcp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;     # в нашем случае от 10.20.4.2 до 10.20.4.100&lt;/span&gt;&lt;br /&gt; pool {&lt;br /&gt;         range dynamic-bootp  10.20.4.2 10.20.4.100;&lt;br /&gt;          &lt;span style="font-weight: bold;"&gt;# время аренды адреса по умолчанию&lt;/span&gt;&lt;br /&gt;         default-lease-time 86400;&lt;br /&gt;         &lt;span style="font-weight: bold;"&gt;# максимальное время аренды адреса&lt;/span&gt;&lt;br /&gt;         max-lease-time 86400;&lt;br /&gt; }&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; # сервер с которого попытаться загрузиться&lt;/span&gt;&lt;br /&gt; next-server 10.20.4.1;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# файл который скачать по tftp протоколы с сервера загрузки&lt;/span&gt;&lt;br /&gt; filename "pxelinux.0";&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;# разрешаем загрузку&lt;/span&gt;&lt;br /&gt; allow bootp;&lt;br /&gt; allow booting;&lt;br /&gt; filename                "/pxelinux.0";&lt;br /&gt; default-lease-time      21600;&lt;br /&gt; max-lease-time          43200;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Если несколько сетевых интерфейсов то в файле /etc/sysconfig/dhcpd указываем&lt;br /&gt;какой из них слушать DHCPDARGS=eth1&lt;br /&gt;Запускаем dhcpd сервер &lt;span style="font-style: italic;font-family:arial;" &gt;&lt;br /&gt;service dhcpd start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;tftp&lt;/span&gt;&lt;br /&gt;Следом за dhcpd клиент воспользуется tftp сервером что б скачать файл pxe&lt;br /&gt;который в свою очередь уже будет скачивать ядро(функция его основная но не&lt;br /&gt;единственная)&lt;br /&gt;&lt;br /&gt;tftp-server будет запускаться через xinetd - для этого в файле /etc/xinetd.d/tftp&lt;br /&gt;в строке disable поставьте значение no.&lt;br /&gt;disable = no&lt;br /&gt;и перезапустите xinetd   &lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;service xinetd restart&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cobbler&lt;/span&gt;&lt;br /&gt;проверим все ли настройки выполнены необходимые для cobbler&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;cobbler check&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Скорее всего он попросит запустить httpd cobblerd и&lt;br /&gt;подредактировать шаблоны kickstart файлов заменив хеш пароля по умолчания на ваш хеш&lt;br /&gt;&lt;br /&gt;теперь необходима сама устанавливаемая операционная система&lt;br /&gt;Если она у нас на dvd диске&lt;br /&gt;монтируем диск в /home/os&lt;br /&gt;mount /dev/dvd-hdb /home/os&lt;br /&gt;и забираем все файлы  указывая название --name=F9 откуда&lt;br /&gt;берем файлы --mirror=/home/os&lt;br /&gt;и архитектуру процессора --arch=x86_64&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;cobbler import --name=F9 --mirror=/home/os --arch=x86_64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;Еще один вариант - синхронизировать с официальном сервером, например используем сервер яндекса&lt;br /&gt;cobbler import --name=F10 --mirror=rsync://mirror.yandex.ru/fedora/linux/releases/10&lt;br /&gt;/Fedora/x86_64/os  --arch=x86_64&lt;br /&gt;&lt;br /&gt;И еще один вариант - не использовать синхронизацию - мы просто укажем где есть весь набор пакетов&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;cobbler import --name=F9 --mirror=/home/os --arch=x86_64 --available-as=nfs://10.20.4.1:/home/os&lt;/span&gt;&lt;br /&gt;и настроить nfs&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Georgia,serif;"&gt;после того как синхронизация завершится&lt;br /&gt;нужно настроить в kickstart файле источник установки.&lt;br /&gt;в нашем случае это &lt;span style="font-style: italic;"&gt;http://10.20.4.1/cobbler/ks_mirror/F9-x86_64/&lt;/span&gt;&lt;br /&gt;Узнать можно вызвав синхронизацию снова и найти строку &lt;span style="font-style: italic;"&gt;&lt;br /&gt;http://@@http_server@@/cobbler/ks_mirror/config/F9-x86_64-0.repo&lt;/span&gt;&lt;br /&gt;где &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:Georgia,serif;"&gt;@@http_server@@&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Georgia,serif;"&gt; адресс сервера&lt;br /&gt;по ссылке расположен файл конфигурации репозитория - его можно прописать&lt;br /&gt;для использования локального репозитория предоставляемого cobbler&lt;br /&gt;там же указан адрес папки со всеми файлами - вот его и пишем как источник установки&lt;br /&gt;После того как написан kickstart файл (http://fedoraproject.org/wiki/Anaconda/Kickstart) добавим&lt;br /&gt;клиента&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;cobbler system add --name=system1 --profile=F9-x86_64  --mac=&lt;мак адрес машины&gt;&lt;br /&gt;--ip=&lt;ip&gt; --hostname=&lt;имя машины&gt; --kickstart=/root/ks.system1.cfg&lt;/ip&gt;&lt;/span&gt;&lt;br /&gt;Параметров на самом деле много - даже определенные поля kickstart файла можно задать&lt;br /&gt;персонально для каждого клиента&lt;br /&gt;Посмотреть список профилей можно с помощью команды &lt;span style="font-style: italic;font-family:arial;" &gt;koan --server=10.20.4.1 --list=profiles&lt;/span&gt;&lt;br /&gt;(подробней о koan в след.раз)&lt;br /&gt;&lt;br /&gt;Теперь указываем в биосе клиента,что загружаемся в первую очередь с сетевой карточки используя&lt;br /&gt;pxe.&lt;br /&gt;Если kickstart файл написан правильно то все загрузится и установится самостоятельно.&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/447397810890053070-5358383083836054047?l=vasilec.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vasilec.blogspot.com/feeds/5358383083836054047/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=447397810890053070&amp;postID=5358383083836054047' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5358383083836054047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/447397810890053070/posts/default/5358383083836054047'/><link rel='alternate' type='text/html' href='http://vasilec.blogspot.com/2008/12/cobbler.html' title='cobbler'/><author><name>Dyoma</name><uri>http://www.blogger.com/profile/03593960926697367595</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='16' src='http://1.bp.blogspot.com/_At_98nMmNEY/SOtXO2Doc0I/AAAAAAAAAGQ/oZygyufH7D8/S220/d51e5543e08c.jpg'/></author><thr:total>0</thr:total></entry></feed>
