суббота, 29 марта 2014 г.

Array&Ruby

В данной статье описаны некоторые интересные трюки как можно эффективно использовать и работать с массивами в Ruby. Конечно же, есть РубиДок и множество других ресурсов, где подробно описаны все доступные методы, но здесь я хочу поделиться именно способами использования.







1. Как проверить содержит ли массив все элементы другого массива


Например, вы хотите проверить или все импортированные е-мейлы уже есть в списке контактов:
imported_emails = [ 'john@doe.com', 'janet@doe.com' ]
existing_emails = [ 'john@doe.com', 'janet@doe.com' , 'fred@mercury.com' ]
 
puts 'already imported' if (imported_emails - existing_emails).empty?

Запуск в IRB:
already imported
=> nil

2. Как найти общие элементы в двух массивах


Например, если вам нужно найти общие теги в двух разных постах:
tags_post1 = [ 'ruby', 'rails', 'test' ]
tags_post2 = [ 'test', 'rspec' ]
 
common_tags = tags_post1 & tags_post2

Запуск в IRB:
=> [«test»]

3. Как соединить два массива, не дублируя повторяющиеся элементы


followeds1 = [ 1, 2, 3 ]
followeds2 = [ 2, 4, 5 ]
 
all_followeds =  followeds1 | followeds2

Запуск в IRB:
=> [1, 2, 3, 4, 5]

4. Как сортировать массив хешей


Например, вы получаете данные от какого-то API, в виде масива хешей:
data = [
 {
    name: 'Christophe',
    location: 'Belgium'
 },
 {
    name: 'John',
    location: 'United States of America'
 },
 {
    name: 'Piet',
    location: 'Belgium'
 },
 {
    name: 'François',
    location: 'France'
 }
]

При отображении, вы хотите сортировать по полю location, тогда делаем так:
data.sort_by { |hsh| hsh[:location] }

Запуск в IRB:
=> [
{:name=>«Christophe», :location=>«Belgium»},
{:name=>«Piet», :location=>«Belgium»},
{:name=>«François», :location=>«France»},
{:name=>«John», :location=>«United States of America»}
]

5. Как получить уникальные элементы массива по определенному признаку


Например, вы хотите показывать случайные продукты на главной странице, но чтобы каждый продукт брался только из одной категории:
Product = Struct.new(:id, :category_id)
 
products = [
 Product.new(1, 1),
 Product.new(2, 2),
 Product.new(3, 3),
 Product.new(4, 1),
 Product.new(5, 3),
 Product.new(6, 5),
]
 
products = products.uniq &:category_id

Запуск в IRB:
=> [
#<struct Product id=1, category_id=1>,
#<struct Product id=2, category_id=2>,
#<struct Product id=3, category_id=3>,
#<struct Product id=6, category_id=5>
]

6. Как фильтровать строковые элементы массива


Например, у вас может быть массив с названиями книг, которые вы хотите фильтровать по какому-то ключевому слову:
books = [
 'The Ruby Programming Language',
 'Programming Ruby 1.9 & 2.0: The Pragmatic Programmers\' Guide (The Facets of Ruby)',
 'Practical Object-Oriented Design in Ruby: An Agile Primer',
 'Eloquent Ruby',
 'Ruby on Rails Tutorial: Learn Web Development with Rails'
]
 
books = books.grep(/[Rr]ails/)

Запуск в IRB:
=> [«Ruby on Rails Tutorial: Learn Web Development with Rails»]

7. Как всегда возвращать массив


Например, у вас есть метод, который может возвращать список продуктов либо один продукт. Чтобы обеспечить чтобы возвращаемое значение всегда было массивом, вы можете использовать Array() или [*]:
def method
 # …
 
 [*products]
end

Habrahabr.ru

вторник, 11 февраля 2014 г.

Удалённая работа

Linux > Linux


1. Server

  • Установить ssh клиент(в центре приложений оболочка и сервер)

2. Client

  • В терминале: ssh -x -y ip

IP:
  • username@ip
  • ip

Samba. Example

[global]
workgroup = workgroup
printing = cups
wins support = yes
netbios name = Tortuga
security = share
guest account = tortuga
cups options = raw
show add printer wizard = yes
printer admin = root, tortuga, admin

[printers]
comment = All printers
printable = yes
path = /var/spool/samba
guest only = yes
guest ok = yes
read only = no

[print$]
comment = Drivers for printers
path = /var/lib/samba/drivers
guest only = yes
guest ok = yes
browsable = no
read only = yes
create mask = 0777
directory mask = 0777
force user = tortuga
force group = tortuga
write list = root, tortuga, admin

[PDrivers]
path = /home/tortuga/PrintDrivers
browsable = yes
writable = no
guest ok = yes
read only = yes

понедельник, 27 января 2014 г.

четверг, 5 декабря 2013 г.

Redmine. How to make a plugin

The Quest

set RAILS_ENV=production //Выбор окружения

ruby script/rails generate redmine_plugin <name> //Создание плагина

init.rb//Редактируем init.rb
Redmine::Plugin.register :quest do
  name 'Quest plugin'
  author 'Vladislav R.'
  description 'This is a plugin for Redmine'
  version '0.0.1'
  menu :application_menu, :questions, { :controller => 'questions', :action => 'index' }, :caption => 'Questions'//Ярлык на плагин в главном меню
end

ruby script/rails generate redmine_plugin_model quest questions question:string answer:boolean other:string
//Создание модели.
//quest - название плагина
//questions - название модели
//question:string - набор полей( имя поля:тип)

1001_create_questions.rb (Если ошибка, возможно у вас более 1 плагина и номер миграции совпадает => сменить номер миграции (101, 1001, 1000001...))
class CreatePolls < ActiveRecord::Migration //Описание структуры таблицы
  def change
    create_table :polls do |t|
      t.string :question
      t.integer :yes, :default => 0
      t.integer :no, :default => 0
    end
  end
end

rake redmine:plugins:migrate //Миграция в базу. Сам добавил вопросы в базу

questions.rb
class Questions < ActiveRecord::Base
  def ans(answer)
answer == 'true' ? :true : 'false' ? :false : :answer //Редактирование модели
  end
end

ruby script/rails generate redmine_plugin_controller Quest questions index vote
//Создание контроллера.
//Quest - название плагина
//questions - название контроллера
//index vote - созданные по умолчанию методы

questions_controller.rb
class QuestionsController < ApplicationController //Редактирование контроллера
  unloadable

  def index
@ques = Questions.all //Показать все записи
  end
  
  def ans 
flash[:notice] = 'Work' //Сообщение
redirect_to :action => 'index' //Возврат на функцию index
  end
end

index.html
<% @radio = 0 %> //Переменная для нумирации
<% @n = 'answerYesNo' %> //Переменная для изменения имени группы кнопок
<% @ques.each do |q| %> //Проход по всем элементак коллекции
<p>
<%= @radio = @radio + 1 %>)
<%= q.question %>? //Первое поле таблицы и др.
<br>
<%= radio_button_tag name = @n, 'true', false, { :answer => 'true' } %> Да
<br>
<%= radio_button_tag name = @n, 'false', false, { :answer => 'false' } %> Нет
<br>
<%= radio_button_tag name = @n, 'false', false %>
<%= text_field_tag 'answerText', '', { :answer => 'text' } %>
<% @n+='1' %>
</p>
<% end %>
<%= button_to 'Save', { :action => 'ans', :controller => 'questions'}, :method => :post %>
//Кнопка сохранения. Перенаправляет в функцию сохранения

routes.rb
get 'questions', :to => 'questions#index' //Вызов функции index
post 'ans', :to => 'questions#ans' //Перенаправление на функцию ans из контроллера question


Удаление плагина
rake redmine:plugins:migrate NAME=<plugin_name> VERSION=0

Откат миграции
rake db:rollback