Покрокова інструкція по додаванню багатьох зображень до моделі

Якщо вам потрібно додати зображення до існуючої моделі у власному проекті,почніть з кроку 2 і замість нашої моделі Gallery підставте свою модель.

1. Створення навчального проекту

1.1 Створіть новий проект(ми використовуємо базу даних Postgres) і перейдіть в директорію проекту

rails new multiple_images_uploader -d postgresql
cd multiple_images_uploader

1.2 Створіть базу даних

rails db:create

1.3 Згенеруйте скафолд Gallery і запустіть міграцію

rails g scaffold Gallery title:string  
rails db:migrate

2. Підключення джему CarrierWave

2.1 Додайте джем CarrierWave в Gemfile файл свого проекту

gem 'carrierwave', '~> 1.0'

виконайте команду:

bundle install

3. Згенеруйте завантажувач(ми назвали наш завантажувач Image):

rails generate uploader Image

ця команда створить файл: app/uploaders/image_uploader.rb

4. Додайте колонку images до таблиці galleries

згенеруйте міграцію:

rails g migration add_images_to_galleries images:json
rails db:migrate

5. Встановіть завантажувач

В модель Gallery додайте метод mount_uploaders, в якості аргументів передайте символ з назвою колонки, в яку зберігатимуться зображення і завантажувач, який ми згенерували в кроці 3

app/models/gallery.rb

class Gallery < ApplicationRecord
  mount_uploaders :images, ImageUploader
end

6. В контролері Galleries в метод gallery_params додайте параметр з масивом зображень:
app/controllers/galleries_controller.rb

def gallery_params
  params.require(:gallery).permit(:title, {images: []})
end

7. Додайте наступний блок до паршалу для створення галерії

app/views/galleries/_form.html.erb

<div class="field">
   <%= form.label :images, "Images:" %>
   <%= form.file_field :images, multiple: true %>  
</div>

8. У файл show.html.erb додайте наступний параграф

app/views/galleries/show.html.erb

<p>
  <% @gallery.images.each do |image| %>
    <%= image_tag image.url %>
  <% end %>
</p>

9. Задайте кореневий маршрут

config/routes.rb

Rails.application.routes.draw do
  resources :galleries
  root to: 'galleries#index'
end

10. Запустіть сервер

в терміналі,в корневій папці проекту введіть команду:

rails server

в браузері введіть:

localhost:3000

Тепер при створенні нової галереї у вас буде можливість додавати декілька зображень(використовуйте SHIFT+SELECT щоб вибрати декілька зображень).

Автори: Олег Павлюк та Марія Кулакова.

Логін через Facebook, Google та Email в Rails (частина 2)

Продовження. Першу частину дивіться за посиланням: http://rubyforce.io/rails-devise-part-1/

Ми одразу ж розділимо дані користувача та способи автентифікації. Для цього створимо нову модель Authentication:

rails g model authentication provider:string uid:string user_id:integer

app/models/authentication.rb

class Authentication < AplicationRecord
  belongs_to :user
end

Згенеруємо контролер:

rails g controller authentications

app/controllers/authentication_controller.rb

class AuthenticationsController < ApplicationController
  def destroy
    @authentication = current_user.authentications.find(params[:id])
    @authentication.destroy
    flash[:notice] = "Successfully destroyed authentication."
    redirect_to root_path
  end
end

Єдина дія яку ми будемо виконувати безпосередньо над автентифікацією – це видалення. Створення буде відбуватися у іншому контролері відповідальному за callback’и.

В модель User додаємо зв’язок з authentications. А також додаткові модуль omniauthable та провайдерів. Метод apply_omniauth будує відповідні authentications для користувача. А метод класу set_user повертає існуючого або створює нового користувача. Обидва методи ми використаємо у callbacks_controllers.rb.

app/models/user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  has_many :authentications, dependent: :destroy

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, omniauth_providers: [:facebook, :google_oauth2]

  def apply_omniauth(omniauth)
    authentications.build(provider: omniauth['provider'], uid: omniauth['uid'])
  end

  def self.set_user(omniauth)
    User.find_by(email: omniauth.info.email) || User.new(email: omniauth.info.email, password: Devise.friendly_token[0,20]) 
  end
end

Створюємо таблицю authentications:


rake db:migrate

Наступний крок – створити аплікації на Facebook та Google

Для цього реєструємось на developers.facebook.com та console.developers.google.com. Кожна аплікація надає нам ID та SECRET. Також важливо вказати Valid OAuth redirect URIs – це адреса нашого сайту http://localhost:3000/.

Зауваження: якщо ви плануєте розгортати свою аплікацію локально (так як в даному прикладі) то деактивуйте Use Strict Mode for Redirect URIs для Facebook.

Додаємо ID та SECRET:

config/initializers/devise.rb


...
# Facebook
config.omniauth :facebook, ENV['FACEBOOK_ID'], ENV['FACEBOOK_SECRET']

# Google
config.omniauth :google_oauth2, ENV['GOOGLE_ID'], ENV['GOOGLE_SECRET']
...

Ключі зберігаємо за допомого dotenv:

.env


...
FACEBOOK_ID=ХХХХХХХХХХХХХХХХ
FACEBOOK_SECRET=ХХХХХХХХХХХХХХХХ
GOOGLE_ID=ХХХХХХХХХХХХХХХХ
GOOGLE_SECRET=ХХХХХХХХХХХХХХХХ
...

Тепер потрібно створити контролер, який буде обробляти callback’и після авторизації. Для кожного провайдера потрібен окремий метод. Важлива саме назва. А так як функціонал методів однаковий, то можна використати alias_method:

app/controllers/callbacks_controller.rb

class CallbacksController < Devise::OmniauthCallbacksController
  def all
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])

    if authentication
      flash[:notice] = "Signed in successfully."
      sign_in_and_redirect(:user, authentication.user)
    elsif current_user || User.exists?(email: omniauth.info.email)
      user = current_user || User.find_by_email(omniauth.info.email)
      user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
      flash[:notice] = "Authentication successful."

      if current_user
        redirect_to root_path
      else
        sign_in_and_redirect(:user, user)
      end
    else
      user = User.set_user(omniauth)
      user.apply_omniauth(omniauth)

      if user.save
        flash[:notice] = "Signed in successfully."
        send_set_password_email(user)
        sign_in_and_redirect(:user, user)
      else
        cookies[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
      end
    end
  end

  alias_method :facebook, :all
  alias_method :google_oauth2, :all

  private

  def send_set_password_email(user)
    user.send_reset_password_instructions
  end
end

Фактично, у цьому контролері міститься вся логіка нашої аплікації. Ми переверіяємо наявність автентифікацій та користувача і виконуємо відповідні дії по їх створенню та логінізації. Важливий момент – це надсилання листа новоствореному користувачу за допомогою send_set_password_email. В даному випадку ми використовуємо вже існуючий mailer Devise’у reset_password_instructions. Але можна також створити та налаштувати власний mailer.

І додаємо шляхи для даного контролера, а також для users та authentications:

config/routes.rb

Rails.application.routes.draw do
  root to: 'home#index'

  devise_for :users, controllers: { omniauth_callbacks: 'callbacks' }
  resources :users
  resources :authentications, only: [:destroy]
end

Налаштування для роботи mailer‘а:

config/environment/development.rb


...
config.action_mailer.perform_caching = false
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_options = { from: ENV['EMAIL_USERNME'] }
config.action_mailer.default_url_options = { host: "localhost:3000" }

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
		address:              'smtp.gmail.com',
		port:                 587,
		domain:               'localhost',
		user_name:            ENV['EMAIL_USERNAME'],
		password:             ENV['EMAIL_PSWD'],
		authentication:       'plain',
		enable_starttls_auto: true  }
...

Тут доволі стандартні налаштування для Gmail. Знову ж таки ми використовуємо змінні оточення (ENV) для вразливих даних (адреса пошти та пароль).

.env


EMAIL_USERNAME=ХХХХХХХХХХХХХХХХ
EMAIL_PSWD=ХХХХХХХХХХХХХХХХ

На даний момент є одна проблема. Коли користувач перейде за посиланням в листі, то відбудеться редірект на головну сторінку. Це відбувається тому що користувач залогінений. Для того щоб пропустити перевірку, потрібно модифікувати passwords_controller.rb. Це один із контролерів Devise’у, в якому міститься відповідна логіка. Створюємо контролер:

app/controllers/passwords_controller.rb

class PasswordsController < Devise::PasswordsController
  skip_before_action :require_no_authentication, :only => [:edit, :update]

  def update
    super
    if resource.errors.empty?
      sign_out(resource_name)
      sign_in(resource_name, resource)
    end
  end
end

Тепер при реєстрації за допомогою аккаунту соціальних мереж, користувач отримає лист із можливістю встановити новий пароль, який можна буде використовувати для логіну.

P.S.

На головній сторінці відображається повідомлення про те, що користувач з певним email залогінився у певний спосіб:

app/views/home/index.html.erb


<p id="notice"><%= notice %></p>

<h1>Authentication with multiple social network accounts</h1>
<% if current_user %>
  <p>You are logged in as <mark><%= current_user.email %></mark> with <mark><%= @provider %></mark></p>
<% else %>
  <p>Please Log In</p>
<% end %>

У контролері визначена змінна @provider, яка може містити назву провайдера (facebook, google_oauth2) або email. Значення зберігається у cookies: app/controllers/home_controller.rb

class HomeController < ApplicationController
  def index
    @provider = cookies[:provider]
  end
end

Для того щоб мати коректне значення cookies[:provider] створюємо ініціалізатор, який буде спрацьовувати після логінізації та після logout’у користувача:

config/initializers/warden_hooks.rb

Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
  if auth.request.env['omniauth.auth']
    auth.cookies[:provider] = auth.request.env['omniauth.auth'][:provider]
  else
    auth.cookies[:provider] = 'email'
  end
end

Warden::Manager.before_logout do |user,auth,opts|
  auth.cookies.delete :provider
end

Автор: Ілля Кузьма

Логін через Facebook, Google та Email в Rails (частина 1)

 

Велика кількість аплікацій потребує систему реєстрації та автентифікації користувачів. Це складне завдання. Так як йдеться про безпеку персональних даних. На щастя існує декілька хороших рішень для Rails фреймворку. Мабуть, найпоширенішим є Devise. Devise є досить простим у встановленні. Складність полягає у великій кількості можливих сценаріїв.

В залежності від потреб бізнесу можна організувати різні способи реєстрації. Якщо достаньо отримати пошту користувача, яка буде також виконувати роль логіну, і запитувати пару логін / пароль для входу, то стандартні налаштування Devise – це те що потрібно.

У цій статті ми розглянемо більш складний flow:

    1. Відвідувач має можливість обрати спосіб реєстрації: за допомогою аккаунтів facebook чи google, або через пошту.
    1. Після реєстрації через пошту користувач може під’єднати аккаунти соціальних мереж (facebook та/чи google)
    1. Після входу через один із аккаунтів соціальних мереж користувач отримує лист де має змогу перейти на сторінку встановлення паролю для входу.
    1. В подальшому користувач може від’єднати акаунти соціальних мереж та повністю видалити акаунт на сайті.

У статті ми крок за кроком пройдемо весь шлях реалізації даного завдання.

Посилання на репозиторій https://github.com/RubyForceTeam/authentication_solution_illia108.git

Створюємо нову rails аплікацію з базою даних PostgreSQL (у разі розгортання на heroku це полегшить роботу):

rails new auth --database=postgresql
cd auth

Додаємо необхідні бібліотеки:

Gemfile

gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth-google-oauth2'
gem 'dotenv-rails', groups: [:development, :test]

Перші три gem’и потрібні безпосередньо для реєстрації та авторизації користувачів. Останній dotenv-rails – для збереження конфіденційної інформації. Ми повернемось до нього пізніше.

bundle

Створюємо базу даних:

rails db:create

Налаштовуємо Devise:

rails generate devise:install
rails generate devise User
rake db:migrate

В результаті отримуємо модель User, відповідну міграцію та шлях.

Devise потребує визначеної головної сторінки:

rails g controller home index

Згенерували новий контроллер із методом index. Та встановлюємо цей метод на root_path:

config/routes.rb

Rails.application.routes.draw do
  root to: 'home#index'
  devise_for :users
end

Для зручності додамо мінімальну навігацію:

app/views/layouts/application.html.erb

Auth
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  

  
    <%= link_to 'Home', root_path %>
    <%= link_to 'Users', users_path %>
    <% if current_user %>
      <%= link_to('Logout', destroy_user_session_path, method: :delete) %>
    <% else %>
      <%= link_to('Login', new_user_session_path) %>
    <% end %>
    <%= yield %>
  

Стартуємо сервер та перевіряємо результат:

rails s

Першу частину завершено. У нас є реєстрація користувачів за допомогою логіну та паролю.

Продовження дивіться за посиланням: http://rubyforce.io/rails-devise-part-2/

Автор: Ілля Кузьма

Підготовка робочого середовища для роботи з Ruby on Rails

Сьогоднішня стаття відкриває серію більш практичних дописів, які допоможуть початківцям спробувати втілити якийсь конкретний функціонал. Починаємо, звісно ж, з основ: Як встановити Ruby on Rails. Автор статті: Віталій Накопало

Незалежно від мови програмування чи фреймворку, яким користується розробник, запорукою його ефективності у повсякденній роботі – є зручне, та правильно налаштоване робоче середовище. І Ruby on Rails тут не є винятком.

Перед тим як сказати “rails new my_awesome_app -d postgresql” і почати захоплюючий, складний та цікавий шлях знайомства і роботи з фреймворком потрібно зробити декілька речей.

Отже давайте розберемо що нам для цього потрібно.

Перш за все нам потрібно визначитись з операційною системою у якій ми будемо працювати. Найпоширеніші варіанти – це Linux-дистрибутиви, MacOS та Windows. Моїм вибором є Ubuntu – дистрибутив Linux, який побудований на основі Debian GNU/Linux. В ньому є все, що потрібно для того, щоб почувати себе конфортно підчас роботи. Одним словом – консоль 🙂

Оскільки Ruby on Rails написаний на мові програмування Ruby, то наступним кроком є встановлення Ruby (як би це не було очевидно 🙂
В Ubuntu для цього нам потрібно виконати декілька консольних команд (зрештою весь процес налаштування нашого средовища буде відбуватись у консолі):

sudo apt-get update – синхронізуємо файли-описів пакетів з їх джерелом і отримуємо оновлений список пакетів.

Далі встановлюємо необхідні пакети для роботи ruby:

sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev nodejs

Після цього в нас є декілька варіантів дій. Ми можемо відразу встановити ruby, виконавши команду sudo apt-get install ruby-full, або скористатись якоюсь із систем управління версіями Ruby.

Cистема управління версіями ruby? Невже в нас буде потреба використовувати декілька різних версій ruby? Насправді так – декілька різних проектів можуть бути написані на різних версіях ruby. І, власне, для зручного переходу між версіями використовуються системи управління версіями – зокрема rvm та rbenv.

Встановимо ruby за допомогою rbenv:

cd
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL

rbenv install 2.4.2
rbenv global 2.4.2
ruby -v

Якщо все пройшло успішно, то після виконання останньої команди ми побачимо версію ruby. У моєму випадку таке повідомлення:
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

Вітаю! Ruby за допомогою rbenv успішно встановлено 🙂
Йдемо далі.

Підчас розробки на ruby не завжди є необхідність писати все самому. За час існування мови, для неї була написана надзвичайно велика кількість корисних пакетів – gem’ів (серед яких rails), які розширюють можливості мови і дозволяють швидко розробляти, використовуючи готові рішення. Для Ruby on Rails також існують такі розширення. Для зручного встановлення gem’ів існує Bundler – менеджер управління gem’ами.

gem install bundler
rbenv rehash

це все що потрібно зробити для його встановлення.

Отже, на даний момент ми встановили дві системи управління:

rbenv – cистема управління версіями ruby
bundler – менеджер управління gem’ами (та їх версіями)

Але це ще не все 🙂
Далі нам потрібно встановити ще одну систему контролю версій – Git.

Git – це система контролю версій, яка дозволяє відстежувати зміни у файлах проекту, при необхідності проводити їх відкат, визначати, хто і коли вносив зміни.

Для того щоб проект хостився на віддаленому репозиторії (що дозволяє нам отримати доступ до нього з будь якого місця де є інтернет), нам потрібно разеєструватись на одному з таких сервісів як GitHub, Bitbucket, GitLab.

До прикладу GitHub. Після реєстрації у консолі пишемо наступні команди:

git config --global color.ui true
git config --global user.name "ім’я користувача"
git config --global user.email "email користувача"
ssh-keygen -t rsa -b 4096 -C "email користувача"

GitHub використовує аутентифікацію за відкритими SSH-ключами. Для того щоб отримати такий ключ, потрібно його згенерувати:

cat ~/.ssh/id_rsa.pub

після чого розмістити у відповідному розділі на GitHub.

Якщо все було зроблено правильно, то після виконання команди:
ssh -T git@github.com

ми отримаємо таке повідомлення:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

Далі встановимо nodejs – середовище виконання JS – що, зокрема, дозволяє використовувати Coffeescript у Rails:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

Нам залишилось встановити рельси та систеу управління базами данних.

Оскільки RoR, як ми вже раніше згадували, є ruby-джемом, тому встановлюємо ruby gem:

gem install rails -v 5.1.4
rbenv rehash

і команда rails -v поверне версію рельсів:

Rails 5.1.4

Встановлюємо СУБД
Завдяки Active Record DB Adapters в rails можна підключати різні бази даних, такі як MySQL, PostgreSQL, SQLite3, Oracle, Microsoft SQL Server.
Розглянемо встановлення PostgreSQL:

sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-common
sudo apt-get install postgresql-9.5 libpq-dev

встановлюємо користувача:

sudo -u postgres createuser username -s

і останні штрихи:

створюємо нашу веб-аплікацію:
rails new my_awesome_app -d postgresql

переходимо у директорію проекту:
cd my_awesome_app

створюємо базу даних:
rails db:create

запускаємо сервер:
rails server

наш сайт тут:
http://localhost:3000

Ми описали основні кроки, які потрібно зробити, для того, щоб почати розробляти на rails. Цього, звичайно, не досить. Але такі речі як конфігурування Vagrant та протистояння Atom vs Vim напевне збільшать цю статтю, як мінімум, у двічі 🙂

Як отримати максимальний ефект від код рев’ю?

Після невеликої паузи (минулого тижня в курсантів була внутрішня “сесія”), продовжуємо публікацію статтей курсантів RubyForce. Сьогодні знову стаття від Іллі Кузьми:

На мою думку, code review (CR) – це дуже крута річ, користь від якої отримують всі. Автор коду – свіжий погляд на вирішення проблеми над якою працював. Рев’ювер – розуміння частини проекту, спосіб та підхід до вирішення певного завдання. Загалом, проект стає чистішим та зрозумілішим.

Існує думка, що немає сенсу залучати початківців до CR. Я так не вважаю. Звичайно, добре мати досвідченого розробника, який вкаже на проблеми в коді. Але, навіть, коли новачок рев’ювить чийсь код – це приносить велику користь. Особисто для мене, було дуже складно читати чужий код. CR дозволяє зосередитись на певній частині програми. Розібрати її детально. Зрозуміти підхід іншого розробника. Навчитись. З іншої сторони, коли я сам пишу код і створюю Pull Request, то переглядаю написане перед тим як його побачать інші.

Так, це не легко. Складно вникати в суть написаного кимось коду. CR вимагає багато часу. Інколи хочеться швидше закінчити CR, або відкласти на потім, або просто погодити без перегляду і повернутись до своєї feature. Для того щоб побороти це, потрібно дотримуватись певних принципів.

По-перше, CR – це дуже важлива чатина workflow. Не менш важлива ніж написання коду.

По-друге, гарне CR – це прояв поваги до свого колеги. В такий спосіб ми цінуємо працю іншої людини.

По-третє, всі учасники проекту повинні домовитись як часто вони робитимуть CR. Цей пункт поясню детальніше. Я почув цю ідею у відео MPJ на його YouTube каналі. Така домовленість називається Working Contract. Це неформальна згода усіх членів команди слідувати певному workflow. Автор PR природньо хоче швидкого RAM(review and merge). В той же час інші програмісти не хочуть відволікатись від того над чим працюють вони. Адже CR вимагає занурення в зовсім іншу задачу. Working Contract вирішує цю проблему. Ми домовляємось про CR раз на день. Автор знає, що його PR буде переглянутий колегами до завтрашнього дня і може спокійно переходити до ішого завдання. Рев’ювер може приступити до, власне, CR тоді коли йому буде зручно.

По-четверте, супер важливо коректно писати коментарі. Текст не передає всього змісту повідомлення. Наша мета – кращий код. І CR не місце переходу на особистості.

І останнє, з власного досвіду. Не варто безапеляційно погоджуватись зі всіма зауваженнями більш досвідчених колег. Ви працювали над завданням. Ви глибоко розібрали його. Інколи, яким би досвідченим не був рев’ювер, він просто не встані осягнути всі аспекти рішення. Якщо ви впевнені, що ваш код є кращим, поясніть детальніше чому так. Або якщо не розумієте попросіть пояснити зауваження, щоб в майбутньому писати краще!

Чи важливе грунтовне освоєння теорії у навчанні програмуванню?

Ми продовжуємо публікувати статті курсантів RubyForce. Сьогодні стаття від Іллі Кузьми:

***********************************************************

def method_name
     puts “Can you get what’s going on here?”
end

***********************************************************

PS:
TL;DR
Так – це важливо знати теорію і ні – не потрібно її освоювати

***********************************************************

Спробую розкрити свою думку на прикладі вивчення англійської.

Десять років вивчення мови у школі + 5 у ВУЗі + курси == “Я досі не можу розмовляти”. Це приклад грунтовного освоєння теорії. Думаю, багатьом це знайомо. В якийсь момент я усвідомив скільки часу було невідворотно змарновано. Це був шок.

І я розпочав шукати альтернативні методи вивчення.

В одному з відео я побачив просту таблицю всіх, так званих, “часів”. За півгодини я отримав landscape view всієї мови. Це був ще один шок. Далі я взнав, що немає сенсу вчити окремі слова. Потрібно вчити блоки. Немає сенсу вчити граматичні правила, натомість треба вчити граматичні конструкції (або фрази).

Процес пішов. Не гладко. Але набагато краще ніж до цього. Я не знав яке правило потрібно застосувати, але на слух міг зрозуміти коли говорив неправильно.

Якось я познайомився із Джоном. Він американець та викладав англійську у нас у Львові. Одного разу я запитав Джона: “Що ти думаєш про граматику? Варто її вчити?”. Він сказав: “Так. Звичайно”. Я був, м’яко кажучи, здивований. Як же так?

Кажу: “Поясни”. І він пояснив, що вивчення граматики має відбуватись тоді, коли ти хочеш зрозуміти чому ти говориш так як говориш. Тобто, вивчення стає усвідомленим. Ти відкриваєш правило і “Aha! Makes sense”.

У мене схожа історія також із програмуванням. Я розпочав вивчення JS із фундаментальної книги на 900+ сторінок. Який результат, думаю, ви здогадуєтесь. Коли ж мені знадобився React я пішов на офіційний сайт і за допомогою кількох статей реалізував те що мені було потрібно. В перший же день я почав писати компоненти. Теорія і практика йшли паралельно.

Моя особиста думка, не обов’язково бути філологом щоб розмовляти. Так само, не обов’язково знати всі нюанси мови програмування для того щоб писати код. В якийсь момент захочеться повернутись до === і зрозуміти як же там все влаштовано 🙂

Як проектувати архітектуру на етапі старту проекту?

Рубіфорс продовжує набирати оберти і сьогодні ми публікуємо наступну статтю, Марія Кулакова пише про проектування архітектури на старті проекту.

Однією з найвидатніших пам’яток Італії є Пізанська вежа. Можна багато говорити про її велич і красу. У цій статті я не буду проводити огляд місць, де протягом життя повинен побувати кожен, але, як не дивно, мова йтиме про архітектуру і як правильно її проектувати.

Так от, ціль створення такого дива була в тому, щоб вежа слугувала дзвіницею в місті Піза (це унікальний випадок того, що вежа прославилась саме завдяки своєму нахилу). Але тут питання інакше – коли вона впаде? Отже, як би сумно не було і якою б величною вона не була, рано чи пізно це станеться. Звичайно, влада країни тратить величезні кошти на те, щоб споруда стояла довше. І це дасть свій результат, але на деякий час. А все зводиться до питання: ”Чи достатньо подумав архітектор, перед тим як закладати перші камені в її фундамент?” Напевно, легко провести аналогію зі світом IT. І, мабуть, не один проект є цією вежею. Тому дана стаття про наболіле і про те, як уникнути грабель:)

Дуже часто програміст, на початку створення якогось нового проекту, намагається відразу писати код. В когось, навіть, це виходить, створюється клас за класом і…..приходить усвідомлення: “Що ж це я роблю? Та програма не працює так, як би мала”. Тоді вже написана велика кількість рядків, а найстрашніше попереду – вночі починаються снитися сни, що ти забрів в такі дебрі, що вибратись звідти можна тільки стрибнувши в розпечену лаву. І посеред ночі ти прокидаєшся в холодному поту та приймаєш рішення: “ТРЕБА ВСЕ ПОМІНЯТИ!” Звичайно, можна продовжувати варити макарони, і їх, навіть, можна буде їсти. Але, може, краще було б продумати все наперед?

Як не дивно, але першим і основним правилом для тих, хто починає створювати проект – це сісти, взяти ручку і листочок і почати малювати. Так, саме малювати. Ну якщо говорити більш детально, то ось алгоритм створення проекту:

  • Постановка задачі.
  • Мінімальний функціонал.
  • Інтерфейси.
  • Проектування.
  • Код.

Давайте пройдемося по цьому детальніше.

Чи не найголовніше завдання, яке стоїть перед програмістом – це розуміння цілі виконання даного завдання, для яких потреб воно створюється і які проблеми буде вирішувати. Тільки після чіткого усвідомлення цілей можна приступати до наступного – детально прописати всі функції, які виконуватиме програма. Можливо на даному етапі ви не знаєте, як реалізувати функцію, але то нормально. Це робиться для того, щоб було зрозуміло, які функцї є зайвими, а які потрібно додати. Інтерфейси… ні, це не ті інтерфейси, які програмісти використовують разом з класами. До написання коду ще далеко. Це користувацькі інтерфейси. Точніше те, як користувач буде взаємодіяти з програмою. Якщо це, до прикладу, сайт чи десктопна аплікація, то промалювати віконечка, текстові поля і т.д. І після того, як ви зрозуміли, як буде працювати програма з точки зору користувача, можна переходити до вияснення того, як це все буде виглядати з точки зору програміста. Отже, проектування.

Є дуже багато підходів до проектування, про які написано безліч книжок. В їхній основі лежить правило декомпозиції або “розділяй і володарюй”. Суть полягає в тому, що потрібно нашу програму розбити на такі модулі, щоб при потребі щось змінити в одній частині програми, це майже не повпливало на решту коду. Так, це звучить як суха теорія. Ну якшо говорити про практичну сторону, то це можна реалізувати з допомогою діаграм і звязків. Промалювати які будуть класи і як вони мають взаємодіяти між собою. Насправді,немає чіткого рецепту як правильніше спроектувати архітектуру, але в даному питанні більшу роль відіграє досвід проектування і чим свіжіша голова над цим працює, тим краще.

Аж тут можна починати писати код. Ну нарешті!

Не знаю, в якому стані були архітектори, які проектували Пізанську вежу, але краще буду схилятись до думки, що це сталося через брак часу. Тому завдяки їм, ми маємо чудову ілюстрацію того, як не потрібно проектувати архітектуру. А для простих смертних це є ще однією локацією в списку запланованих подорожей:)

Особливості мови Рубі для тих, хто починає її вчити

Сьогодні починається другий тиждень навчання.  Підсумовуючи перший тиждень, публікуємо допис від Олександра Ткачика, який описав свої перші враження від роботи з Ruby.

Гайд по Рубі для Newbie, очима Newbie

Рубі. Рубі це мова. Це мова програмування. Та ще й об’єктно-орієнтована. Настільки об’єктно-орієнтована, що там все є об’єктом. Навіть число 5 — і те є об’єктом. Константи в Рубі не є константними. Їх спокійно можна змінити і програма не впаде (хоча і виведе повідомлення, а-ля “дядя, ты шо тугой?”). В Рубі є блоки і вони є дуже поширені, тому роботу із ними необхідно добре опанувати, або застрелитись, щоби відчути зручність написання програм. Приватні методи в класах є приватними, але не зовсім. Їх можна неявно викликати. (run, Forrest, RUN!!!).

Такі факти можуть викликати певний дисонанс. Ще би — як можна змінювати константи?! Але те, що їх можна змінювати — не означає що це треба робити, чи не так? 😉 Тому, деякі, здавалось би, недоліки можна перетворити на переваги. Просто необхідно трішки попрацювати на Рубі та вивчити її особливості.

Тепер поговоримо про комфорт.

Отже, Рубі. Це проста для розуміння, але потужна мова програмування, створена японцем Юкіхіро Мацумото. Він хотів сумістити простоту і швидкість написання коду із читабельністю. І йому це вдалось, адже на Рубі програміст може писати дуже короткий, при цьому неймовірно функціональний код, який можна би було легко читати (навіть тим, хто раніше не бачив цієї мови програмування).

Незважаючи на те, що це є об’єткно-орієнтована мова програмування — є можливість використовувати різні підходи — функціональний чи процедурний.

Сильним козирем Рубі є простота та швидкість розробки проектів. Недарма величезна кількість стартапів реалізується саме на Рубі. Той самий Twitter був розроблений за допомогою Рубі.

В Рубі відсутнє множинне наслідування, натомість придумані модулі, які є дуже хорошим інструментом для доповнення відсутньої функціональності класу чи об’єкта.

Ще одним плюсом є наявність gem`ів — готових бібліотек, які дуже полегшують життя розробникам. Наприклад, замість того, щоби створювати власний клас конвертації валюти — можна підключити відповідну бібліотеку money, коротко прочитати документацію і все, конвертація валюти відбувається одним простим рухом!

Фреймворки у Рубі також добре розвинені. Найпотужнішим є Ruby On Rails, який реалізує шаблон MVC. Розібравшись із ним, можна за день написати та запустити невеликий блог, власну сторінку чи інші прості аплікації. Окрім Ruby On Rails існує багато інших фреймворків — Sinatra, Hanami, NYNY, Cuba та інші.

Окремої уваги заслуговує інтерактивна консоль irb — програма, яка дозволяє виконувати команди Рубі в режимі реального часу. З її допомогою можна швидко протестувати частину реалізації. Існує цілий сайт, який дозволяє пройти основи Рубі, використовуючи irb.

Отже… Незважаючи на дивакуватість, ця мова має потужні козирі — простоту та швидкість розробки проектів завдяки чудовим фреймворкам, зручні, якісні та готові бібліотеки, легкий синтаксис та можливість “адаптувати” мову під себе.

P.S. return в Рубі теж необов’язковий 😀

 

P.S. Картинку (з невеликими модифікаціями) взяли тут: https://www.sketchport.com/drawing/5684872177778688/doge

RubyForce Марафон

Пропонуємо пройти навчання по нашій програмі паралельно з групою в офісі.

Ми запускаємо навчальну платформу у вигляді форуму, щоб допомогти учасникам марафону пройти курс разом з студентами в групі.

Як взяти участь в RubyForce марафоні і як це працює:

Ви зареєструєтесь на сайті https://teamtreehouse.com/. Потрібно буде оплатити підписку в сумі $25/міс протягом, як мінімум, трьох місяців. В сумі $75.

Необхідно роздобути книжку the well grounded rubyist 2nd edition.

Потрібно зареєструватись на платформі http://marathon.rubyforce.io і представитись у відповідіній темі – так ми будемо знати що ви з нами.

Далі будемо проходити курси і обговорювати їх на форумі.

Всі бажаючі зможуть задавати і відповідати на питання.

На форумі будуть присутні студенти очного курсу і ментори з компанії Верталаб. Разом ми будемо допомагати один одному в освоєнні матеріалів.

Протягом навчання ми можемо відрахувати студентів з очного курсу (за пропуски, неуспішність чи систематичні порушення дисципліни) і запросити активних учасників марафону заняти їх місце.

Протягом навчання будуть проводитись трансляції лекцій у вигляді вебінарів. Приєднуйтесь!

Часті питання

У цьому дописі ми публікуємо відповіді на найбільш поширені запитання.  Якщо відповіді на твоє питання тут ще немає, напиши нам на rubyforce@vertalab.com.

 

Скільки часу треба буде присвятити навчанню?

По 8 годин кожного робочого дня, протягом 12 тижнів. Нам треба засвоїти дуже багато матеріалу. Опис навчального плану – тут.

За якою схемою відбуватиметься навчання?

Навчання базується на таких принципах:

  • самостійне освоєння навчальних матеріалів
  • закріплення теорії на практиці – під час навчання ми створимо сайт-каталог кулінарних рецептів
  • робота з ментором для закріплення вивченого матеріалу

Що таке навчальні матеріали?

Вибрані курси з Treehouse та Upcase, книга The Well-Grounded Rubyist

За навчальні матеріали учасникам програми доведеться платити самостійно, але ми одразу ж відшкодуємо їх вартість, книгу ти отримаєш в подарунок на першому занятті.

Крім того, навчальні матеріали будуть доповнені лекціями менторів.

Як буде виглядати навчальний день?

Приблизно так:

  • до 11:00 збираємось у класі і проходимо матеріали відповідно до денного плану
  • в 11:00 – зустріч з ментором для обговорення незрозумілих моментів попереднього дня
  • після зустрічі з ментором – продовження вивчення матеріалу або практика (комбінація практики і теорії може відрізнятись кожного дня – спочатку буде більше теорії і дуже мало практики, наприкінці теорії буде дуже мало, і майже вся робота буде практичною).

Скільки коштує навчання?

Навчання безкоштовне. Більше того, ми також пропонуємо невелику стипендію.

Чому навчання безкоштовне?

Після успішного завершення курсу, швидше за все, ми запропонуємо тобі роботу. Загалом, ми вважаємо, що курс коштуватиме менше ніж послуги рекрутера, а результат може бути набагато кращим.

Тобто мені доведеться відпрацювати у вас якийсь час, щоб покрити вартість навчання, так?

Ні. Ми не покладаємо на тебе жодних зобов’язань.

Скільки учасників буде в навчальній групі?

4-6, залежно від кількості і рівня кандидатів.

Хто буде вести програму?

Олександр Бондар (https://medium.com/@kiosan). Більше 10 років успішного досвіду в підготовці молодих спеціалістів.

Де саме будуть відбуватися заняття?

Заняття будуть проходити за адресою вул. Героїв УПА 77, у Львові.

Чи забезпечуєте ви студентів комп’ютерами?

Ні. Ми забезпечуємо навчальними матеріалами, але тобі треба мати свій ноутбук.

Відео з відповідями на питання

Відповіді на питання про курс RubyForce

Опубліковано RubyForce 7 вересня 2017 р.